- Filterzeile mit Von, An, Kanal-Dropdown, Hops (≤) und Freitextsuche
- buildRow() befüllt data-from/to/channel/hops/search für performante Filterung
- rowVisible() prüft alle aktiven Filter (AND-Logik)
- Channel-Dropdown wird beim channels-WS-Event befüllt
- Reset-Button setzt alle Zusatzfilter zurück
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
INSERT OR IGNORE + UPDATE statt SELECT → INSERT eliminiert den
UNIQUE-constraint-Fehler bei konkurrierenden async-Aufrufen.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Wenn beim Start keine User in der Datenbank vorhanden sind, wird
automatisch ein verifizierter Admin angelegt:
E-Mail: admin@localhost
Passwort: changeme
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- database.path in config.yaml: meshdd.db → data/meshdd.db
- data/.gitkeep: Verzeichnis in Git verankert, *.db-wal/shm gitignored
- database.py: PRAGMA wal_checkpoint(FULL) vor db.close() für sauberes Schließen
- main.py: Shutdown-Schritte einzeln mit try/except gekapselt;
db.close() wird jetzt auch bei Fehlern in vorherigen Schritten ausgeführt
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- auth.secret_key und smtp.* direkt in config/config.yaml aufgenommen
- config/env.example entfernt, config/config.example.yaml als Vorlage hinzugefügt
- meshbot/auth.py: config.env() → config.get() für alle Auth/SMTP-Werte
- meshbot/config.py: ENV_PATH, _load_env(), env() entfernt
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- Badge-Styling: bg-secondary-subtle/text-secondary-emphasis statt bg-secondary
→ lesbar in Light- und Dark-Mode
- {nodes_online}: Nodes < 15 Min last_seen (DB-Abfrage in get_stats())
- {version}: Bot-Version aus config.yaml via config.get()
Closes#15.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
sendText() verwendet jetzt wantAck=False – keine Retry-Logik,
keine ACK-Pakete im Mesh. Sinnvoll für Broadcasts und periodische
Status-Meldungen. Closes#14.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Alle eigenen Projektversionsnummern wurden auf das neue Format umgeschrieben:
0.X.Y → 0.XX.YY (z.B. 0.8.11 → 0.08.11, 0.6.7 → 0.06.07)
Betrifft 130 Zeilen in 9 Dateien; externe Bibliotheksversionen unverändert.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
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 <noreply@anthropic.com>
_active speichert jetzt msgType/area/monitor_only. get_active_alerts() gibt
sortierte Liste zurück. nina.js lädt beim Init und dedupliziert per ID.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
CSS-Variablen für Light/Dark-Mode, Uppercase-Sektionsköpfe,
kein <strong>+<hr> mehr, weicherer Schatten.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
TCPInterface-Konstruktor kehrt zurück bevor das Event aus dem Bibliotheks-Thread
feuert. _conn_event.wait(timeout=10s) wartet sauber auf _on_connection statt
sofort den Fallback auszulösen.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- bot.py: vollständige Payload-Daten für Position, Telemetry (Device+Env),
NodeInfo (hw_model), Routing (error), Traceroute (hops), Neighborinfo (count)
- packets.js: fmtPayload() zeigt alle Felder; TELEMETRY_APP vom eigenen Node
(my_node_id / short_name FTLW) wird unterdrückt und nicht gezählt
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- Konfiguration speichern löst sofort eine NINA-Abfrage aus (trigger_poll)
- Frontend lädt Config 5s nach Save neu um last_poll-Zeitstempel zu zeigen
- Unterhalb Abfrageintervall-Feld: Datum/Uhrzeit der letzten Abfrage
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- Warnmeldungen zeigen jetzt das Herkunftsgebiet (AGS-Regionsname) in
der Weboberfläche (neue Spalte "Gebiet") und im Mesh-Nachrichtentext
(z.B. "[NINA] Schwerwiegend: Sturmböen (Dresden, Stadt)")
- AGS-Code-Tabelle zeigt lesbaren Ortsnamen als zweite Spalte
- Datalist mit allen sächsischen AGS-Codes bei der Eingabe
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
mapData liefert bundesweite Meldungen ohne geografische Filterung.
Mit konfigurierten AGS-Codes deckt der Dashboard-Endpunkt bereits
alle Quellen regional ab – mapData wird dann nicht mehr benötigt
und würde Meldungen außerhalb der konfigurierten Regionen zeigen.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- resend_interval: zweiter Intervall fuer erneutes Senden aktiver
Warnmeldungen ins Mesh (nur bei send_to_mesh=true). Standard 3600s.
NinaBot._resend_loop() laeuft als eigener asyncio-Task; _active-Dict
haelt aktive Warnungen vor (Cancel entfernt Eintraege).
- AGS-Code-Verwaltung als Tabelle mit Trash-Button je Zeile statt
Badges mit X-Button.
- Severity-Badges: explizite text-white/text-dark, kein bg-opacity-85
mehr - lesbar in beiden Themes.
- colspan-Fix: leere Alerts-Zeile auf 5 Spalten korrigiert.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Explizite Textfarben (text-dark/text-white) für Typ-Badges hinzugefügt,
damit die Beschriftung auf bg-warning/bg-info Hintergrund lesbar ist.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Viertes Chart-Panel zeigt Pakettyp-Verteilung der letzten 24h als
Doughnut-Diagramm, farblich nach portnum kodiert.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- Version in Navbar aller Seiten (app.js holt /api/stats beim Init)
- Statistiken: Anfragen-Zähler rolling 24h statt Mitternacht-Reset
- Karte: Nodes nach Alter transparent (<24h voll, 24-48h 45%, 48-72h 20%, >72h unsichtbar)
- Legende um Alter-Sektion erweitert
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
meshtastic.node.updated sendet (node, interface), _on_node_updated
akzeptierte nur (node) -> SenderUnknownMsgDataError beim Empfang
von Node-Updates.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>