Neue Abschnitte für v0.08.10–v0.08.15:
- Nachrichten-Seite (/messages), öffentlich ab v0.08.14
- Dashboard: RSSI/GPS-Spalten, Links-Card
- Scheduler: {nodes_online} + {version}, theme-aware Badges
- Konfiguration: web.online_threshold
- Bugfixes: Dashboard-Charts, Kartenlegende, Telemetrie-Filter, wantAck=False
- /api/links in API-Endpunkte-Tabelle ergänzt
- Versionshistorie bis v0.08.15 vervollständigt
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
319 lines
11 KiB
Markdown
319 lines
11 KiB
Markdown
# 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) |
|