# Was ist neu in MeshDD-Bot 0.8.x > Aktueller Stand: **v0.08.15** · Release-Datum: 2026-02-20 --- ## Übersicht Release 0.8 bringt die vollständige Integration des **NINA BBK Warnsystems** in den MeshDD-Bot, ergänzt um eine Reihe von Verbesserungen am Paket-Log, der Karte und der Verbindungsinitialisierung. --- ## Neue Funktionen ### NINA Warnmeldungs-Integration (`/nina`) Der Bot ist jetzt an die **NINA Warn-App des BBK** (Bundesamt für Bevölkerungsschutz und Katastrophenhilfe) angebunden. Warnmeldungen werden automatisch per HTTP-Polling von `warnung.bund.de/api31` abgerufen und ins Meshtastic-Netz gesendet. #### Konfigurationsseite Unter `/nina` (Admin-only) steht eine vollständige Verwaltungsseite bereit: | Einstellung | Beschreibung | |---|---| | **Aktiviert** | NINA-Abfragen ein-/ausschalten | | **Ins Mesh senden** | Aus = Monitor-Modus (nur Weboberfläche, kein Mesh-Versand) | | **Abfrageintervall** | Wie oft neue Warnmeldungen abgerufen werden (Sek., min. 60) | | **Wiederholungsintervall** | Aktive Warnungen werden in diesem Abstand erneut ins Mesh gesendet | | **Kanal** | Meshtastic-Kanal (0–7) für den Versand | | **Mindest-Schweregrad** | Gering / Mäßig / Schwerwiegend / Extrem | | **AGS-Codes** | Amtliche Gemeindeschlüssel der zu überwachenden Regionen | | **Quellen** | Katwarn, BIWAPP, MoWaS, DWD, LHP, Polizei | #### AGS-Code-Verwaltung - AGS-Codes werden in einer **Tabelle** mit Ortsname und Lösch-Button angezeigt - Bei der Eingabe schlägt eine **Combobox** alle sächsischen Landkreise und kreisfreien Städte vor (Name + 12-stelliger Code) - Voreingestellt: 5 Codes für den **Raum Dresden** (Stadt Dresden, LK Meißen, LK Sächsische Schweiz-Osterzgebirge, LK Bautzen, LK Görlitz) #### Polling-Strategie Zwei parallele Abfragestrategien pro Zyklus: 1. **Dashboard-Endpunkt** (`/dashboard/{AGS12}.json`) — regionale Filterung durch den BBK-Server; deckt alle Quellen für konfigurierte AGS-Codes ab. 2. **mapData-Endpunkt** (`/{quelle}/mapData.json`) — wird **nur verwendet, wenn keine AGS-Codes konfiguriert sind** (bundesweite Abfrage ohne Geo-Filterung). Quellenübergreifende **De-Duplikation** via ID-Normalisierung verhindert doppelte Meldungen (z. B. `dwdmap.` ↔ `dwd.`, `mow.` ↔ `mowas.`). #### Warnmeldungen im Mesh Nachrichten-Format im Meshtastic-Netz: ``` [NINA] Schwerwiegend: Sturmböen (Dresden, Stadt) Beschreibung des Ereignisses (max. 120 Zeichen)... [NINA] Aufgehoben: Sturmböen (Dresden, Stadt) ``` Das **Herkunftsgebiet** (AGS-Regionsname) wird automatisch an Meldung und Aufhebung angehängt. #### Live-Anzeige in der Weboberfläche Die Tabelle „Letzte Warnmeldungen" zeigt: | Spalte | Inhalt | |---|---| | **Schweregrad** | Farbiger Badge (Extrem / Schwerwiegend / Mäßig / Gering / Aufgehoben) | | **Meldung** | Headline der Warnung | | **Gebiet** | AGS-Regionsname (z. B. „Dresden, Stadt") | | **Typ** | Quell-Präfix (z. B. `dwd`, `katwarn`) | | **Mesh** | Broadcast-Icon (gesendet) oder Auge-Icon (Monitor-Only) | | **Zeitstempel** | Sendezeitpunkt der Warnung | Beim Seitenaufruf werden alle **aktuell aktiven Warnungen** sofort geladen (`GET /api/nina/alerts`). Neue Warnungen erscheinen live via WebSocket. #### Sofortabfrage nach dem Speichern Nach dem Klick auf „Speichern" wird unmittelbar eine NINA-Abfrage gestartet — kein Warten auf den nächsten Intervall-Zyklus. Unterhalb des Abfrageintervall-Felds wird Datum und Uhrzeit der **letzten erfolgreichen Abfrage** angezeigt. --- ## Verbesserungen am Paket-Log (`/packets`) ### Informativerer Payload Die Info-Spalte zeigt jetzt deutlich mehr Daten je Pakettyp: | Typ | Angezeigte Felder | |---|---| | `POSITION_APP` | Koordinaten + Höhe (m), Geschwindigkeit (km/h), Satelliten | | `TELEMETRY_APP` | Akku (%), Spannung (V), Kanalauslastung (%), TX-Auslastung (%), Temperatur (°C), Luftfeuchtigkeit (%), Luftdruck (hPa) | | `NODEINFO_APP` | long_name, short_name, Hardware-Modell | | `ROUTING_APP` | Fehlercode (wenn vorhanden) | | `TRACEROUTE_APP` | Anzahl Hops | | `NEIGHBORINFO_APP` | Anzahl Nachbarn | ### Unterdrückung eigener Telemetrie Telemetriepakete vom **eigenen Node** werden im Paket-Log weder angezeigt noch gezählt. Die Erkennung erfolgt automatisch per `my_node_id` (WebSocket-Initial-Payload) sowie als Fallback über den Short-Name `FTLW`. --- ## Verbesserungen an der Karte (`/map`) ### Neue Legendenposition Die Kartenlegende wurde von `bottomright` nach **`topleft`** verschoben — direkt unterhalb der Zoom-Schaltfläche, wo sie auf allen Bildschirmgrößen sicher sichtbar ist. ### Neues Legengendesign Die Legende wurde komplett neu gestaltet: - **Theme-aware**: passt sich automatisch Light- und Dark-Mode an (CSS-Variablen) - **Kompaktes Layout**: kleine Uppercase-Abschnittsköpfe (`HOPS` / `ALTER`) - **Weicherer Schatten** und dezentes Border --- ## Bugfixes ### Startup-Warning „connection.established missed" (fixes #2) Beim Start erschien regelmäßig eine Warnung im Log: ``` [WARNING] meshbot.bot: connection.established missed – applying fallback ``` **Ursache:** `bot.connect()` läuft in einem separaten Thread. Der `TCPInterface`-Konstruktor kehrte zurück, bevor das `connection.established`-Event aus dem Meshtastic-Bibliotheks-Thread gefeuert wurde. Der sofortige Check sah `_connected = False` und löste den Fallback aus. **Fix:** Ein `threading.Event` (`_conn_event`) wird in `_on_connection` gesetzt. Nach dem Konstruktor wartet der Code bis zu 10 Sekunden auf dieses Event. Der Fallback greift nur noch bei echtem Ausbleiben. --- ## Konfigurationsdateien ### `nina.yaml` Separate Hot-reload-fähige Konfigurationsdatei für NINA (analog zu `scheduler.yaml`). Wird automatisch angelegt wenn nicht vorhanden. ```yaml enabled: false send_to_mesh: true poll_interval: 300 # Sekunden, min. 60 resend_interval: 3600 # Sekunden, Wiederholung aktiver Warnungen channel: 0 # Meshtastic-Kanal 0–7 min_severity: Severe # Minor | Moderate | Severe | Extreme ags_codes: [] sources: katwarn: true biwapp: true mowas: true dwd: true lhp: true police: false ``` --- ## Neue API-Endpunkte | Methode | Pfad | Beschreibung | Auth | |---|---|---|---| | `GET` | `/api/nina/config` | NINA-Konfiguration lesen | Admin | | `PUT` | `/api/nina/config` | NINA-Konfiguration speichern + Poll auslösen | Admin | | `GET` | `/api/nina/alerts` | Aktuell aktive Warnmeldungen | Admin | | `GET` | `/api/links` | Konfigurierte Links aus `config.yaml` | — | --- ## Neue Seite: Nachrichtenverlauf (`/messages`) Eine eigenständige Seite für den vollständigen Nachrichtenverlauf: - **Kanal-Farbcodierung**: Jeder Kanal erhält eine eigene Farbe (Bubble-Rand + Avatar-Hintergrund) - **Richtungs-Kennzeichnung**: Empfangene Nachrichten links (Absender-Avatar), gesendete Bot-Nachrichten rechts (grüne Bubble) - **Kanalfilter**: Filterbuttons oben (farblich je Kanal) + Löschen-Button - **Absender-ID**: Node-ID unterhalb des Absendernamens - **Sidebar-Eintrag** nur für eingeloggte Benutzer sichtbar (`sidebar-user`) Ab v0.08.14 ist die Seite **öffentlich zugänglich** — kein Login mehr erforderlich. `initial_messages` und `new_message` werden an alle WebSocket-Clients gesendet. --- ## Dashboard-Erweiterungen ### Nodes-Tabelle (v0.08.10) Zwei neue Spalten in der Nodes-Tabelle: | Spalte | Inhalt | |---|---| | **RSSI** | Signalstärke in dBm | | **GPS** | Grünes Pin-Icon wenn Position bekannt, graues sonst | ### Links-Card (v0.08.14) Die bisherige Nachrichten-Card wurde durch eine frei konfigurierbare **Links-Card** ersetzt. Links werden in `config.yaml` unter `links:` eingetragen: ```yaml links: - url: "https://meshtastic.org" label: "Meshtastic" - url: "https://meshmap.net" label: "MeshMap" ``` --- ## Scheduler: neue Template-Variablen Zwei neue Variablen stehen in Scheduler-Nachrichten-Templates bereit (v0.08.13): | Variable | Beschreibung | |---|---| | `{nodes_online}` | Anzahl online gesehener Nodes (innerhalb des konfigurierten Schwellwerts) | | `{version}` | Aktuelle Bot-Version aus `config.yaml` | Die Variablen-Badges in der Scheduler-UI sind jetzt **theme-aware** (`bg-secondary-subtle text-secondary-emphasis border-secondary-subtle`). --- ## Konfiguration ### Online-Schwellwert (`web.online_threshold`, v0.08.15) Der Online-Schwellwert (bisher hardcodiert auf 900 s) ist jetzt zentral konfigurierbar: ```yaml web: online_threshold: 900 # Sekunden; Node gilt als online wenn last_seen < Schwellwert ``` Wirkt sofort auf: - Dashboard-Tabelle (Online-Status) - `?mesh`-Bot-Kommando (Anzahl Online-Nodes) - `nodes_online`-Zähler in Stats-API, WebSocket und Scheduler-Template --- ## Bugfixes (v0.08.10–v0.08.11) ### Dashboard Charts initial leer (fixes #10) `updateChannelChart` wurde aufgerufen bevor der `channels`-WebSocket-Event eintraf — Charts blieben bei Seitenaufruf leer. Fix: `lastStats` wird gespeichert und Charts werden neu gezeichnet sobald die Channel-Daten eintreffen. ### Dashboard Pakettypen-Chart immer leer (fixes #10) `packet_type_breakdown` fehlte komplett in `get_stats()`. Die Daten werden jetzt per SQL-Abfrage über die `packets`-Tabelle befüllt und über Stats-API sowie WebSocket geliefert. ### Kartenlegende transparenter Hintergrund (fixes #10) CSS-Variablen wurden im Leaflet-Control-Container nicht zuverlässig aufgelöst. Fix: explizite Hintergrundfarben für Light- und Dark-Mode per `[data-bs-theme]`-Selektor. ### Eigene Telemetrie aus Pakettypen-Diagramm ausgeschlossen (v0.08.11) `get_stats()` akzeptiert jetzt den optionalen Parameter `my_node_id`. Eigene `TELEMETRY_APP`- Pakete werden aus `packet_type_breakdown` herausgefiltert — konsistent mit der `isSuppressed()`-Logik im Paket-Log. ### Bot-Nachrichtenversand ohne ACK (v0.08.12, fixes #14) `sendText()` verwendet jetzt `wantAck=False` — Nachrichten werden einmal gesendet ohne auf Bestätigung zu warten. Reduziert unnötige ACK-Pakete im Netz; sinnvoll für Broadcasts und periodische Status-Meldungen. --- ## Versionshistorie 0.8.x | Version | Datum | Schwerpunkt | |---|---|---| | 0.08.00 | 2026-02-19 | NINA-Integration (Grundfunktion) | | 0.08.01 | 2026-02-19 | Wiederholungsintervall, AGS-Tabelle, Badge-Fixes | | 0.08.02 | 2026-02-19 | mapData nur ohne AGS-Codes (geografische Filterung) | | 0.08.03 | 2026-02-19 | Gebietsanzeige, AGS-Ortsname, Sachsen-Combobox | | 0.08.04 | 2026-02-19 | Sofortabfrage nach Speichern, Zeitstempel letzte Abfrage | | 0.08.05 | 2026-02-19 | Kartenlegende nach topleft verschoben (fixes #5) | | 0.08.06 | 2026-02-19 | Informativer Paket-Payload, FTLW-Telemetrie unterdrückt (fixes #3) | | 0.08.07 | 2026-02-19 | threading.Event-Fix für Startup-Warning (fixes #2) | | 0.08.08 | 2026-02-19 | Kartenlegende neu gestaltet (theme-aware) | | 0.08.09 | 2026-02-19 | Aktive NINA-Warnungen beim Seitenaufruf laden | | 0.08.10 | 2026-02-19 | Nachrichten-Seite, Dashboard-Charts-Fix, Pakettypen-API (fixes #10) | | 0.08.11 | 2026-02-20 | Eigene Telemetrie aus Pakettypen-Diagramm ausgeschlossen | | 0.08.12 | 2026-02-20 | Bot-Nachrichten ohne ACK/Retry (fixes #14) | | 0.08.13 | 2026-02-20 | Scheduler: {nodes_online} + {version}, theme-aware Badges (fixes #15) | | 0.08.14 | 2026-02-20 | Links-Card, öffentliche Nachrichten-Seite (fixes #11) | | 0.08.15 | 2026-02-20 | Konfigurierbarer Online-Schwellwert `web.online_threshold` (fixes #12) |