From a6988fbb1fb333ec1e61138d3e3345123aaa9657 Mon Sep 17 00:00:00 2001 From: ppfeiffer Date: Fri, 20 Feb 2026 06:31:07 +0100 Subject: [PATCH] =?UTF-8?q?fix(stats):=20eigene=20Telemetrie=20aus=20Paket?= =?UTF-8?q?typen-Diagramm=20ausschlie=C3=9Fen?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit get_stats() filtert TELEMETRY_APP-Pakete des eigenen Nodes wenn my_node_id übergeben wird – konsistent mit isSuppressed() im Paket-Log-Frontend. Co-Authored-By: Claude Sonnet 4.6 --- CHANGELOG.md | 9 +++++++++ config.yaml | 2 +- meshbot/bot.py | 4 ++-- meshbot/database.py | 20 +++++++++++++++----- meshbot/webserver.py | 6 ++++-- 5 files changed, 31 insertions(+), 10 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 3730f26..b7d8f06 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,14 @@ # Changelog +## [0.8.11] - 2026-02-20 + +### Fixed +- **Pakettypen-Diagramm: eigene Telemetrie ausgeschlossen**: `get_stats()` akzeptiert + jetzt optionalen Parameter `my_node_id`. Ist er gesetzt, werden `TELEMETRY_APP`-Pakete + des eigenen Nodes aus `packet_type_breakdown` herausgefiltert (konsistent mit der + `isSuppressed()`-Logik im Paket-Log-Frontend). Alle Aufrufer (`bot.py`, `webserver.py`) + übergeben `get_my_node_id()`. + ## [0.8.10] - 2026-02-19 ### Added diff --git a/config.yaml b/config.yaml index 1340601..98fda72 100644 --- a/config.yaml +++ b/config.yaml @@ -1,4 +1,4 @@ -version: "0.8.10" +version: "0.8.11" bot: name: "MeshDD-Bot" diff --git a/meshbot/bot.py b/meshbot/bot.py index f450d92..42392d6 100644 --- a/meshbot/bot.py +++ b/meshbot/bot.py @@ -192,7 +192,7 @@ class MeshBot: async def _broadcast_stats(self): if self.ws_manager: - stats = await self.db.get_stats() + stats = await self.db.get_stats(my_node_id=self.get_my_node_id()) stats["uptime"] = self._format_uptime() stats["bot_connected"] = self._connected await self.ws_manager.broadcast("stats_update", stats) @@ -417,7 +417,7 @@ class MeshBot: response = await self._get_weather(from_id, plz=plz) elif cmd == f"{prefix}stats": - stats = await self.db.get_stats() + stats = await self.db.get_stats(my_node_id=self.get_my_node_id()) response = ( f"📊 Statistiken:\n" f"Nodes: {stats['total_nodes']}\n" diff --git a/meshbot/database.py b/meshbot/database.py index 1c26fa9..ff3b48f 100644 --- a/meshbot/database.py +++ b/meshbot/database.py @@ -197,7 +197,7 @@ class Database: ) await self.db.commit() - async def get_stats(self) -> dict: + async def get_stats(self, my_node_id: str | None = None) -> dict: stats = {} async with self.db.execute("SELECT COUNT(*) FROM nodes") as c: stats["total_nodes"] = (await c.fetchone())[0] @@ -216,10 +216,20 @@ class Database: (day_ago,), ) as cursor: stats["channel_breakdown"] = {row[0]: row[1] async for row in cursor} - async with self.db.execute( - "SELECT portnum, COUNT(*) as cnt FROM packets WHERE timestamp >= ? GROUP BY portnum ORDER BY cnt DESC", - (day_ago,), - ) as cursor: + if my_node_id: + pkt_query = ( + "SELECT portnum, COUNT(*) as cnt FROM packets " + "WHERE timestamp >= ? AND NOT (portnum = 'TELEMETRY_APP' AND from_id = ?) " + "GROUP BY portnum ORDER BY cnt DESC" + ) + pkt_params = (day_ago, my_node_id) + else: + pkt_query = ( + "SELECT portnum, COUNT(*) as cnt FROM packets " + "WHERE timestamp >= ? GROUP BY portnum ORDER BY cnt DESC" + ) + pkt_params = (day_ago,) + async with self.db.execute(pkt_query, pkt_params) as cursor: stats["packet_type_breakdown"] = {(row[0] or "?"): row[1] async for row in cursor} return stats diff --git a/meshbot/webserver.py b/meshbot/webserver.py index f2f5fd7..bbc007c 100644 --- a/meshbot/webserver.py +++ b/meshbot/webserver.py @@ -106,7 +106,8 @@ class WebServer: nodes = await self.db.get_all_nodes() await ws.send_str(json.dumps({"type": "initial", "data": nodes})) - stats = await self.db.get_stats() + my_id = self.bot.get_my_node_id() if self.bot else None + stats = await self.db.get_stats(my_node_id=my_id) stats["version"] = config.get("version", "0.0.0") if self.bot: stats["uptime"] = self.bot.get_uptime() @@ -155,7 +156,8 @@ class WebServer: return web.json_response(packets) async def _api_stats(self, request: web.Request) -> web.Response: - stats = await self.db.get_stats() + my_id = self.bot.get_my_node_id() if self.bot else None + stats = await self.db.get_stats(my_node_id=my_id) stats["version"] = config.get("version", "0.0.0") if self.bot: stats["uptime"] = self.bot.get_uptime()