Commit graph

103 commits

Author SHA1 Message Date
ppfeiffer fa03bcaac2 release: v0.09.00 – Mitarbeiter-Rolle, /config-Seite, Paket-Log-Filter
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-02-20 23:01:46 +01:00
ppfeiffer eda9177b54 chore: Docker-Dateien und alle Docker-Referenzen entfernt
- Dockerfile, docker-compose.yml, .dockerignore gelöscht
- CHANGELOG.md: Einträge v0.06.01 (Docker-Support) und v0.07.00 entfernt
- docs/bot-beschreibung.md: Docker-Abschnitte und Tabellenzeilen bereinigt

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-02-20 22:56:36 +01:00
ppfeiffer c443a9f26d feat(auth): Rolle Mitarbeiter + Einladungs-Workflow (closes #7)
- Rollensystem: Public → Mitarbeiter → Admin (Rolle user entfällt)
- DB-Migration: must_change_password-Spalte, user→mitarbeiter
- require_staff_api(): erlaubt mitarbeiter + admin
- POST /api/admin/invite: Einladung mit auto-generiertem Passwort + E-Mail
- POST /auth/change-password: Pflicht-Passwortwechsel
- Login: force_password_change-Redirect
- Sidebar: sidebar-staff für Scheduler/NINA/Einstellungen
- Scheduler/NINA: read-only für Mitarbeiter

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-02-20 22:51:06 +01:00
ppfeiffer f608f513a8 feat(packets): Erweiterte Filterzeile + Freitextsuche (closes #6)
- 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>
2026-02-20 22:41:55 +01:00
ppfeiffer 511ff20842 feat(ui): Sidebar-Gruppe Konfigurationen, /config-Seite, MeshDD-Dashboard (closes #4)
- app.js: Sidebar um Gruppen-Support erweitert; Konfigurationen-Gruppe
  mit Scheduler, NINA, Einstellungen (/config) als Untereinträge
- style.css: .sidebar-group-label + .sidebar-link-sub
- config.py: save()-Funktion für persistentes Schreiben in config.yaml
- webserver.py: GET/PUT /api/config + GET /config Route (Admin)
- static/config.html + static/js/config.js: neue Konfigurationsseite
  (Bot, Meshtastic, Web, Links editierbar)
- Alle HTML-Dateien: MeshDD-Bot → MeshDD-Dashboard

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-02-20 22:33:18 +01:00
ppfeiffer cbe934ef6e fix(map): Kartenlegende theme-aware (closes #5)
- style.css: .legend nutzt CSS-Variablen (--tblr-bg-surface, --tblr-border-color,
  --tblr-body-color) statt hardcodierter Hex-Farben
- map.js: legendDiv-Referenz, updateLegendTheme() setzt Inline-Styles;
  wird beim onAdd (Init) und im themechange-Listener aufgerufen

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-02-20 22:26:53 +01:00
ppfeiffer 07676a8c96 feat(nina): Quellenkennung, Schalter nebeneinander, Min.-Intervalle, last_sent (closes #2)
- _format_alert: Präfix [SOURCE@NINA] je nach Quelle
- _send(): _last_sent bei Mesh-Versand setzen
- get_config(): last_sent zurückgeben
- nina.html: Toggles nebeneinander (d-flex gap-4), Intervall-Labels in Min.,
  lastSent-Element ergänzt
- nina.js: applyConfig ÷60 / Speichern ×60, lastSent befüllen

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-02-20 22:19:04 +01:00
ppfeiffer 76f04105b7 fix(ui): channelBreakdown entfernt + Nachrichten-Trenner stärker (closes #1)
- index.html: channelBreakdown-Card entfernt
- dashboard.js: chBreakdown-Befüllungsblock entfernt
- style.css: .msg-full-item padding .6→.75rem, border 1px→2px

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-02-20 22:13:24 +01:00
ppfeiffer b431797d32 fix(db): upsert_node Race-Condition behoben (UNIQUE constraint)
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>
2026-02-20 22:08:10 +01:00
ppfeiffer fd9eb99b6a feat(db): Initialen Admin-User beim ersten Start anlegen
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>
2026-02-20 22:03:19 +01:00
ppfeiffer 57182c5412 fix(db): Datenbank nach data/ verschoben, WAL-Checkpoint + robuster Shutdown
- 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>
2026-02-20 21:59:40 +01:00
ppfeiffer 261f0dac13 refactor(config): .env in config.yaml integriert
- 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>
2026-02-20 21:47:56 +01:00
ppfeiffer 4b9dd45f05 refactor(config): Konfigurationsdateien nach config/ verschoben (closes #3)
- config.yaml, nina.yaml, scheduler.yaml aus Root → config/ verschoben
- conf/ (env.example, nina.yaml, scheduler.yaml, config.yaml) gelöscht
- meshbot/config.py, nina.py, scheduler.py: Pfade auf config/ aktualisiert
- .gitignore: config/.env und .forgejo_token ergänzt

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-02-20 21:37:11 +01:00
ppfeiffer 3bcb44afe3 docs: Release Notes 0.8.x auf v0.08.15 vervollständigt
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>
2026-02-20 15:31:18 +01:00
ppfeiffer 644d2d00ba feat(config): Online-Schwellwert konfigurierbar (web.online_threshold)
- config.yaml: neuer Parameter web.online_threshold (Default: 900 s)
- /api/stats und WS stats_update liefern online_threshold
- dashboard.js: isOnline() nutzt onlineThreshold aus Stats-API
- bot.py (?mesh) und database.py (nodes_online) nutzen Config-Wert
Closes #12.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-02-20 15:17:05 +01:00
ppfeiffer a5ab4550f2 feat(messages/dashboard): Nachrichten öffentlich, Links-Card, Trenner, Badge-Fix
- Nachrichten-Seite /messages ohne Login zugänglich (closes #11)
- new_message/initial_messages an alle WS-Clients (broadcast statt broadcast_auth)
- Dashboard: Nachrichten-Card entfernt, Links-Card (config.yaml) eingefügt
- GET /api/links gibt konfigurierte Links aus config.yaml zurück
- Nachrichten-Trenner: var(--bs-border-color) statt translucent
- msgCount-Badge: bg-secondary-subtle/text-secondary-emphasis (theme-aware)

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-02-20 14:41:17 +01:00
ppfeiffer 33c05c0a32 feat(scheduler): Variablen-Badges theme-aware + neue Variablen nodes_online, version
- 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>
2026-02-20 14:31:38 +01:00
ppfeiffer 30960a194d fix(bot): Nachrichten ohne ACK-Anforderung senden (wantAck=False)
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>
2026-02-20 14:25:54 +01:00
ppfeiffer 087cccd35c refactor(version): Versionsformat auf 2-stellige Minor- und Patch-Level umgestellt
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>
2026-02-20 14:00:49 +01:00
ppfeiffer a6988fbb1f fix(stats): eigene Telemetrie aus Pakettypen-Diagramm ausschließen
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>
2026-02-20 06:31:07 +01:00
ppfeiffer d6631c1554 feat: Dashboard-Charts-Fix, Nachrichten-Seite, Legende-Hintergrund (fixes #10)
- Fix: Dashboard-Charts (Kanal-Anfragen + Pakettypen) erscheinen nun initial
  korrekt: lastStats gecacht, updateChannelChart nach channels-Event aufgerufen;
  packet_type_breakdown in get_stats() ergänzt (SQL über packets-Tabelle, 24h)
- Fix: Kartenlegende hat jetzt explizite Hintergrundfarben per [data-bs-theme]-
  Selektor (light=#fff, dark=#1e2128) – keine transparente Legende mehr
- Feat: Neue Nachrichten-Seite /messages (User-only) mit Kanal-Farbcodierung
  und Richtungs-Kennzeichnung (empfangen=links/kanalfarbe, gesendet=rechts/grün),
  Channel-Filter-Tabs, Absender-Node-ID, Löschen-Button
- Feat: Dashboard Nodes-Tabelle: neue Spalten RSSI und GPS-Positions-Indikator
- Feat: app.js sidebar-user Klasse für eingeloggte Benutzer (non-admin)

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-02-20 06:24:33 +01:00
ppfeiffer 79f80563c8 docs: vollständige Bot-Beschreibung und 0.8.x Release-Notes hinzugefügt
- docs/bot-beschreibung.md: umfassende Dokumentation mit Architektur,
  Komponenten, API-Referenz, Konfiguration, Datenbank-Schema, Deployment
  und chronologischer Erweiterungshistorie (v0.1.0–v0.8.9)
- docs/whats-new-0.8.md: Neuigkeiten der 0.8.x-Release-Serie (NINA,
  Paket-Log, Karte, Bugfixes, API-Endpunkte, Versionshistorie)

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-02-19 17:53:39 +01:00
ppfeiffer f36a126200 feat(nina): aktive Warnmeldungen beim Seitenaufruf laden (GET /api/nina/alerts)
_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>
2026-02-19 17:37:49 +01:00
ppfeiffer 6adc3cedcf style(map): Kartenlegende neu gestaltet (theme-aware, kompakt)
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>
2026-02-19 17:35:04 +01:00
ppfeiffer edfe73b8ca fix(bot): connection.established race condition mit threading.Event (fixes #2)
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>
2026-02-19 17:30:36 +01:00
ppfeiffer cc392a125a fix(packets): informativer Payload + eigene Telemetrie unterdrücken (fixes #3)
- 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>
2026-02-19 17:20:35 +01:00
ppfeiffer 407addc919 fix(map): Legende nach topleft verschoben (fixes #5)
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-02-19 17:11:41 +01:00
ppfeiffer 84e1354ce5 Merge pull request 'v0.8.4: NINA Sofortabfrage nach Speichern + Zeitstempel letzte Abfrage' (#9) from nina_test into main 2026-02-19 16:26:49 +01:00
ppfeiffer 2db03510c8 v0.8.4: NINA Sofortabfrage nach Speichern + Zeitstempel letzte Abfrage
- 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>
2026-02-19 16:18:15 +01:00
ppfeiffer f2ffe0fd9d Merge pull request 'v0.8.3: NINA Gebietsanzeige, AGS-Ortsname, Sachsen-Combobox' (#8) from nina_test into main 2026-02-19 16:10:32 +01:00
ppfeiffer 33928fca7b v0.8.3: NINA Gebietsanzeige + AGS-Ortsname + Sachsen-Combobox
- 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>
2026-02-19 16:09:55 +01:00
ppfeiffer ff9ecadd75 Merge pull request 'fix: NINA mapData nur ohne AGS-Codes abfragen (v0.8.2)' (#7) from nina_test into main 2026-02-19 13:29:32 +01:00
ppfeiffer e788fc7201 fix: NINA mapData nur ohne AGS-Codes abfragen (v0.8.2)
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>
2026-02-19 13:27:55 +01:00
ppfeiffer 77854fcfda Merge pull request 'feat: NINA v0.8.1 – Wiederholungsintervall, AGS-Tabelle, Badge-Fix' (#6) from nina_test into main 2026-02-19 12:47:57 +01:00
ppfeiffer 2feff2c2c7 feat: NINA Wiederholungsintervall, AGS-Tabelle, Badge-Fix (v0.8.1)
- 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>
2026-02-19 12:44:29 +01:00
ppfeiffer 4c465ed170 Merge pull request 'feat: NINA BBK Warn-App Integration (v0.8.0)' (#4) from nina_test into main 2026-02-19 11:57:07 +01:00
ppfeiffer ee3208769c feat: NINA send_to_mesh-Schalter + Dresden-AGS-Codes
- send_to_mesh: true/false – trennt Abfrage vom Mesh-Versand.
  false = Monitor-Modus: Warnmeldungen werden abgerufen und in der
  Weboberfläche angezeigt, aber NICHT ins Meshtastic-Netz gesendet.
  WebSocket-Event enthaelt monitor_only-Flag (Anzeige per Icon).
- nina.yaml/conf/nina.yaml: send_to_mesh=false als sichere Voreinstellung
  + 5 AGS-Codes fuer den Raum Dresden vorbelegt:
  Stadt Dresden (146120000000), LK Meissen (146270000000),
  LK Saechs. Schweiz-Osterzgebirge (146280000000),
  LK Bautzen (146250000000), LK Goerlitz (146260000000)
- nina.html: zweiter Toggle "Ins Mesh senden"
- nina.js: Schalter in load/save + Statusbadge (Mesh+Web / Nur Web)
  + Mesh-Spalte in Alerts-Tabelle mit broadcast/eye-Icon

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-02-19 11:41:42 +01:00
ppfeiffer 0ca0ffb0d1 feat: NINA BBK Warn-App Integration (v0.8.0)
Neue NINA-Integration: Automatisches Polling der BBK-Warn-API
(warnung.bund.de/api31) und Weiterleitung von Warnmeldungen ins
Meshtastic-Netz. Separate Admin-Konfigurationsseite (/nina) analog
zum Scheduler.

- meshbot/nina.py: NinaBot – Polling, De-Duplikation, Schweregrad-
  und Quellen-Filterung, WebSocket-Broadcast (nina_alert)
- nina.yaml + conf/nina.yaml: Hot-reload-faehige Konfiguration
- static/nina.html + static/js/nina.js: Konfigurationsseite mit
  AGS-Code-Verwaltung, Quellen-Auswahl und Live-Alerts-Tabelle
- webserver.py: GET/PUT /api/nina/config + GET /nina (Admin-only)
- main.py: NinaBot initialisieren, watch/start/stop im Lifecycle
- app.js: NINA-Sidebar-Eintrag (Admin-only, shield-exclamation)

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-02-19 11:21:01 +01:00
ppfeiffer dc4457d25e docs/SERVICE.md hinzugefügt 2026-02-19 07:40:28 +01:00
ppfeiffer debb138b00 docs/Service_install hinzugefügt 2026-02-19 07:39:23 +01:00
ppfeiffer 95fade502d fix: Badge-Beschriftung im Scheduler sichtbar machen (#1)
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>
2026-02-19 07:20:57 +01:00
ppfeiffer f2aa69333d feat: v0.7.1 - Hell-Theme als Standard
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-02-18 18:49:46 +01:00
ppfeiffer fad830f6d5 feat: v0.7.0 - Docker-Verbesserungen
- Dockerfile: EXPOSE 8080 → 8081 + HEALTHCHECK auf /api/stats
- docker-compose.yml: healthcheck + json-file logging (10MB/3 Dateien)
- conf/config.yaml: Version 0.7.0, Host/Port aktualisiert

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-02-18 18:23:27 +01:00
ppfeiffer 997a29842f feat: v0.6.15 - Scheduler-Variablen, Footer, sauberer WS-Shutdown
- Scheduler Nachrichten: Template-Variablen {time}, {date}, {datetime},
  {weekday}, {nodes}, {nodes_24h} serverseitig aufgelöst
- Scheduler UI: klickbare Variablen-Badges beim Nachrichtenfeld-Modus
- Footer auf allen Seiten: © MeshDD / PPfeiffer · vX.Y.Z · MM/YYYY
- Fix: WS-Verbindungen vor runner.cleanup() explizit geschlossen

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-02-18 18:13:15 +01:00
ppfeiffer 0fd401a395 feat: v0.6.14 - Pakettypen-Diagramm im Dashboard
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>
2026-02-18 18:02:15 +01:00
ppfeiffer 9306cce209 feat: v0.6.13 - Version in Navbar, Rolling 24h, Karten-Transparenz
- 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>
2026-02-18 17:54:39 +01:00
ppfeiffer ac98191143 fix: v0.6.12 - Paket-Log Typ-Badge Text immer lesbar
Badges nutzen solide bg-{color} mit text-white (warning: text-dark)
statt bg-opacity-20 text-{color} – Typ-Label dadurch in allen Themes
klar sichtbar.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-02-18 17:42:46 +01:00
ppfeiffer ed3757199e fix: v0.6.11 - Paket-Log Badge/Filter-Verbesserungen
- Badges gleich breit via CSS min-width:5.5rem
- Typ-Filter-Pills in Typ-Farbe (aktiv gefüllt, inaktiv Outline)
- Undekodierbare Pakete (leerer Portnum) als "?" im Filter
- Kanal-Spalte zeigt Kanalname statt Nummer wenn verfügbar
- Statusdot nutzt classList.add/remove('connected') konsistent

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-02-18 17:33:45 +01:00
ppfeiffer 6187bb4419 feat: v0.6.10 - Paket-Log-Seite und größeres Node-Modal
- Neue öffentliche Seite /packets: Echtzeit-Tabelle aller empfangenen
  Meshtastic-Pakete via WebSocket mit Typ-Filter, Pause und Clear
- DB: packets-Tabelle + insert_packet / get_recent_packets
- bot.py: alle Pakete loggen + WS-Broadcast (public)
- webserver.py: /packets Route + /api/packets + initial_packets im WS
- Sidebar: Eintrag 'Pakete' (öffentlich)
- Node-Modal: modal-xl + scrollable, Kartenhöhe 250→300px

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-02-18 17:17:14 +01:00
ppfeiffer 6bb04ec828 fix: v0.6.9 - _on_node_updated fehlende interface-Parameter
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>
2026-02-18 16:09:55 +01:00