change reporing on Snapshot

This commit is contained in:
pablorevilla-meshtastic committed 2026-10-19 17:37:30 -07:00
1 parent fb3a0154dd
commit df7766e783
2 files changed
+27 -6

No files matched your search

+8 -3
View File
@@ -232,9 +232,14 @@ Response Example
Returns stored daily snapshots. For new snapshots, `packet_count` is the number of
packet records imported during `date` (00:00 UTC inclusive to the next midnight
exclusive). The scheduled capture records the previous complete UTC day. Repeated
observations of the same packet are not counted separately. Node and gateway counts
remain database totals at capture time. Older snapshots retain the cumulative packet
counts originally stored; they are not automatically converted.
observations of the same packet are not counted separately. `node_count` counts distinct
packet senders whose packets were imported or observed during that UTC day (including
observations of previously imported packets). `gateway_count` counts distinct MQTT
gateways with packet observations imported during that day. These are activity counts,
not database totals; recipients alone do not count as active nodes. Activity uses local
import timestamps, not device timestamps. Older snapshots retain their originally stored
counts and are not automatically converted. Counts depend on the packet and observation
history still retained at capture time.
### GET `/api/config`
Returns a safe subset of server configuration.
+19 -3
View File
@@ -110,7 +110,7 @@ async def ensure_node_exists(session, node_id: int | None, channel: str | None)
async def capture_daily_snapshot() -> None:
"""Record packet traffic for the previous complete UTC day."""
"""Record packet traffic and active nodes/gateways for the previous UTC day."""
day_end = datetime.now(UTC).replace(hour=0, minute=0, second=0, microsecond=0)
day_start = day_end - timedelta(days=1)
start_us = int(day_start.timestamp() * 1_000_000)
@@ -118,7 +118,21 @@ async def capture_daily_snapshot() -> None:
snapshot_date = day_start.date()
async with mqtt_database.async_session() as session:
node_count = (await session.execute(select(func.count()).select_from(Node))).scalar_one()
# Include repeated observations of older packets as activity, too. Node.last_seen_us
# cannot answer this after a node has already been seen on the following day.
active_nodes = (
select(Packet.from_node_id)
.where(Packet.import_time_us >= start_us, Packet.import_time_us < end_us)
.union(
select(Packet.from_node_id)
.join(PacketSeen, PacketSeen.packet_id == Packet.id)
.where(PacketSeen.import_time_us >= start_us, PacketSeen.import_time_us < end_us)
)
.subquery()
)
node_count = (
await session.execute(select(func.count(active_nodes.c.from_node_id)))
).scalar_one()
packet_count = (
await session.execute(
select(func.count())
@@ -128,7 +142,9 @@ async def capture_daily_snapshot() -> None:
).scalar_one()
gateway_count = (
await session.execute(
select(func.count()).select_from(Node).where(Node.is_mqtt_gateway.is_(True))
select(func.count(func.distinct(PacketSeen.node_id))).where(
PacketSeen.import_time_us >= start_us, PacketSeen.import_time_us < end_us
)
)
).scalar_one()
captured_at_us = int(time.time() * 1_000_000)