- 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>
714 lines
31 KiB
Markdown
714 lines
31 KiB
Markdown
# Changelog
|
||
|
||
## [0.08.21] - 2026-02-20
|
||
|
||
### Changed
|
||
- **Dashboard**: `channelBreakdown`-Card entfernt (closes #1 Aufgabe 1).
|
||
- **Nachrichten-Seite**: Trenner zwischen Nachrichten stärker –
|
||
Padding `.6rem` → `.75rem`, Border `1px` → `2px` (closes #1 Aufgabe 2).
|
||
|
||
## [0.08.20] - 2026-02-20
|
||
|
||
### Fixed
|
||
- **`upsert_node` Race-Condition** (`UNIQUE constraint failed: nodes.node_id`):
|
||
Statt SELECT → INSERT nutzt die Methode jetzt `INSERT OR IGNORE` + `UPDATE`,
|
||
wodurch konkurrierende Aufrufe keinen Constraint-Fehler mehr auslösen.
|
||
|
||
## [0.08.19] - 2026-02-20
|
||
|
||
### Added
|
||
- **Initialer Admin-User**: Existiert beim Start keine Datenbank, wird automatisch ein
|
||
verifizierter Admin-Account angelegt (`admin@localhost` / `changeme`).
|
||
Passwort-Änderung nach dem ersten Login empfohlen.
|
||
|
||
## [0.08.18] - 2026-02-20
|
||
|
||
### Changed
|
||
- **Datenbankdatei nach `data/` verschoben**: `database.path` in `config.yaml` ist jetzt
|
||
`data/meshdd.db`; WAL/SHM-Dateien in `data/` sind gitignored.
|
||
- **Sauberes DB-Close**: `database.py` führt vor dem Schließen `PRAGMA wal_checkpoint(FULL)`
|
||
durch, damit keine Daten im WAL-Journal verbleiben.
|
||
- **Robusterer Shutdown** in `main.py`: Jeder Shutdown-Schritt (NINA, Bot, WebSocket, Web)
|
||
ist einzeln mit try/except gekapselt – `db.close()` wird jetzt immer ausgeführt.
|
||
|
||
## [0.08.17] - 2026-02-20
|
||
|
||
### Changed
|
||
- **`.env`-Datei abgeschafft**: Alle Konfigurationswerte (`auth.secret_key`, `smtp.*`)
|
||
sind jetzt direkt in `config/config.yaml` enthalten – keine separate `.env`-Datei mehr nötig.
|
||
- **`meshbot/auth.py`**: `config.env()` durch `config.get()` ersetzt (liest jetzt aus YAML).
|
||
- **`meshbot/config.py`**: `ENV_PATH`, `_load_env()` und `env()` entfernt.
|
||
- **`config/env.example`** entfernt.
|
||
|
||
## [0.08.16] - 2026-02-20
|
||
|
||
### Changed
|
||
- **Konfigurationsdateien in `config/` verschoben** (closes #3):
|
||
`config.yaml`, `nina.yaml`, `scheduler.yaml` und `env.example` liegen jetzt im
|
||
Unterverzeichnis `config/` statt im Root-Verzeichnis bzw. `conf/`.
|
||
- **`conf/` entfernt**: Das alte Verzeichnis `conf/` wurde vollständig gelöscht.
|
||
- **Python-Pfade aktualisiert**: `meshbot/config.py`, `meshbot/nina.py` und
|
||
`meshbot/scheduler.py` referenzieren jetzt das neue `config/`-Verzeichnis.
|
||
|
||
## [0.08.15] - 2026-02-20
|
||
|
||
### Added
|
||
- **`web.online_threshold`** in `config.yaml` (Default: 900 s): Online-Schwellwert zentral
|
||
konfigurierbar; Änderung in der Config wirkt sofort auf alle Stellen (closes #12).
|
||
- **`/api/stats`** liefert `online_threshold` – Frontend liest Wert vom Backend.
|
||
|
||
### Changed
|
||
- `meshbot/bot.py`: `?mesh`-Kommando nutzt `config.get("web.online_threshold", 900)`.
|
||
- `meshbot/database.py`: `nodes_online`-Abfrage nutzt konfigurierten Schwellwert.
|
||
- `static/js/dashboard.js`: `isOnline()` nutzt `onlineThreshold` aus Stats-API statt hardcodierter 900.
|
||
|
||
## [0.08.14] - 2026-02-20
|
||
|
||
### Added
|
||
- **Dashboard Links-Card**: Neue Card mit frei konfigurierbaren Links aus `config.yaml`
|
||
(`links:` Liste mit `url` + `label`). Ersetzt die Nachrichten-Card im Dashboard (closes #11).
|
||
- **`GET /api/links`**: Neuer Endpunkt gibt konfigurierte Links zurück.
|
||
|
||
### Changed
|
||
- **Nachrichten-Seite öffentlich** (closes #11): Kein Login mehr erforderlich für `/messages`.
|
||
`initial_messages` und `new_message` werden an alle WebSocket-Clients gesendet.
|
||
- **Dashboard**: Nachrichten-Card entfernt; Nodes-Card auf `col-lg-8` verbreitert.
|
||
- **Nachrichtenliste Trenner**: `border-bottom` von `translucent` auf `var(--bs-border-color)` –
|
||
deutlich sichtbarer Trenner zwischen Nachrichten.
|
||
- **`msgCount`-Badge theme-aware**: `bg-secondary` → `bg-secondary-subtle text-secondary-emphasis`
|
||
– Text in Hell- und Dunkel-Theme lesbar.
|
||
|
||
## [0.08.13] - 2026-02-20
|
||
|
||
### Added
|
||
- **Scheduler: neue Template-Variablen** (closes #15):
|
||
- `{nodes_online}` – Nodes mit `last_seen < 15 Min` (Live-Status, analog Dashboard-Schwellwert)
|
||
- `{version}` – aktuelle Bot-Version aus `config.yaml`
|
||
- **Scheduler Variablen-Badges theme-aware**: Badge-Klasse von `bg-secondary` auf
|
||
`bg-secondary-subtle text-secondary-emphasis border-secondary-subtle` umgestellt –
|
||
korrekte Lesbarkeit in Hell- und Dunkel-Theme.
|
||
|
||
## [0.08.12] - 2026-02-20
|
||
|
||
### Changed
|
||
- **Bot-Nachrichtenversand ohne ACK**: `sendText()` verwendet jetzt `wantAck=False` –
|
||
Nachrichten werden einmal gesendet ohne auf Bestätigung zu warten und ohne Retry-Logik.
|
||
Sinnvoll für Broadcasts und periodische Status-Meldungen; reduziert ACK-Pakete im Netz (closes #14).
|
||
|
||
## [0.08.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.08.10] - 2026-02-19
|
||
|
||
### Added
|
||
- **Neue Nachrichten-Seite** (`/messages`, User-only): Komplett eigenständige Seite für
|
||
den Nachrichtenverlauf mit Kanal-Farbcodierung und Richtungs-Kennzeichnung:
|
||
- Empfangene Nachrichten: links, Absenderbild (Initialen-Avatar) mit Kanalfarbe,
|
||
Bubble mit farbigem linkem Rand
|
||
- Gesendete Nachrichten (Bot): rechts, grüne Bubble mit rechtem Rand
|
||
- Kanalfilter-Buttons oben (farblich je Kanal), Löschen-Button
|
||
- Node-ID des Absenders als zweite Zeile unterhalb des Namens
|
||
- Sidebar-Eintrag „Nachrichten" nur für eingeloggte Benutzer sichtbar (`sidebar-user`)
|
||
- **Dashboard Nodes-Tabelle erweitert**: Neue Spalten RSSI (dBm) und GPS-Positions-Indikator
|
||
(grünes Stecknadel-Icon wenn Position bekannt, graues sonst)
|
||
- **`packet_type_breakdown` in Stats-API**: `GET /api/stats` und `stats_update`-WebSocket
|
||
liefern jetzt Pakettypen-Verteilung der letzten 24h aus der `packets`-Tabelle
|
||
|
||
### Fixed
|
||
- **Dashboard Charts initial leer** (fixes #10): `updateChannelChart` wurde aufgerufen
|
||
bevor der `channels`-WS-Event ankam → Chart blieb leer. Fix: `lastStats` speichern,
|
||
Chart neu zeichnen wenn Channels eintreffen.
|
||
- **Dashboard Pakettypen-Chart immer leer** (fixes #10): `packet_type_breakdown` fehlte
|
||
komplett in `get_stats()` – jetzt per SQL-Abfrage über `packets`-Tabelle befüllt.
|
||
- **Kartenlegende transparent** (fixes #10): CSS-Variablen in Leaflet-Control-Container
|
||
wurden nicht zuverlässig aufgelöst. Fix: explizite Hintergrundfarben für Light- und
|
||
Dark-Mode per `[data-bs-theme]`-Selektor statt CSS-Variablen.
|
||
|
||
## [0.08.09] - 2026-02-19
|
||
|
||
### Added
|
||
- **NINA aktive Warnmeldungen beim Seitenaufruf laden**: Neuer Endpunkt
|
||
`GET /api/nina/alerts` gibt alle aktuell aktiven Warnungen aus `_active` zurück.
|
||
Die NINA-Seite lädt diese beim Init und zeigt sie in der Tabelle an — auch
|
||
Warnungen die bereits vor dem Seitenaufruf ins Mesh gesendet wurden.
|
||
Neu eintreffende WS-Events (`nina_alert`) werden per ID dedupliziert.
|
||
|
||
## [0.08.08] - 2026-02-19
|
||
|
||
### Changed
|
||
- **Kartenlegende neu gestaltet**: Theme-aware (CSS-Variablen für Light/Dark-Mode),
|
||
kompaktes Design mit kleinen Uppercase-Abschnittsköpfen statt `<strong>` + `<hr>`,
|
||
weicherer Schatten, angepasste Altersdots für beide Themes.
|
||
|
||
## [0.08.07] - 2026-02-19
|
||
|
||
### Fixed
|
||
- **Startup-Warning "connection.established missed"** (fixes #2): Der Fallback-Check
|
||
nach `TCPInterface()`-Konstruktor prüfte `_connected` sofort, obwohl das Event
|
||
`connection.established` erst kurz danach aus dem Bibliotheks-Thread feuert.
|
||
Fix: `threading.Event` wartet jetzt bis zu 10 Sekunden auf das Event; der Fallback
|
||
greift nur noch bei echtem Ausbleiben des Events.
|
||
|
||
## [0.08.06] - 2026-02-19
|
||
|
||
### Added
|
||
- **Paket-Log informativer Payload** (fixes #3): `bot.py` speichert nun vollständige
|
||
Paketdaten je Typ:
|
||
- `POSITION_APP`: lat/lon + Höhe, Geschwindigkeit, Satelliten
|
||
- `TELEMETRY_APP`: Akku, Spannung, Kanalauslastung, TX-Auslastung, Temperatur,
|
||
Luftfeuchtigkeit, Luftdruck (Environment Metrics)
|
||
- `NODEINFO_APP`: long_name, short_name + Hardware-Modell
|
||
- `ROUTING_APP`: Fehlercode (errorReason)
|
||
- `TRACEROUTE_APP`: Hop-Anzahl
|
||
- `NEIGHBORINFO_APP`: Anzahl Nachbarn
|
||
- **Telemetrie-Unterdrückung eigener Node** (fixes #3): Telemetriepakete vom eigenen
|
||
Node (per `my_node_id` oder short_name `FTLW`) werden im Paket-Log nicht angezeigt
|
||
und gehen nicht in die Zählung ein.
|
||
|
||
## [0.08.05] - 2026-02-19
|
||
|
||
### Fixed
|
||
- **Kartenlegende Position**: Legende von `bottomright` nach `topleft` verschoben,
|
||
neben die Zoom-Steuerung (fixes Issue #5).
|
||
|
||
## [0.08.04] - 2026-02-19
|
||
|
||
### Added
|
||
- **NINA Sofortabfrage nach Speichern**: Nach dem Speichern der Konfiguration wird
|
||
unmittelbar eine Warnmeldungsabfrage gestartet (kein Warten auf den nächsten
|
||
Intervall-Zyklus). Das Frontend lädt die Konfiguration 5 Sekunden nach dem Speichern
|
||
automatisch neu, um den Zeitstempel der letzten Abfrage zu aktualisieren.
|
||
- **Letzte Abfrage anzeigen**: Unterhalb des Abfrageintervall-Felds wird Datum und Uhrzeit
|
||
der letzten erfolgreichen NINA-Abfrage angezeigt (`last_poll`-Feld im Config-Response).
|
||
|
||
## [0.08.03] - 2026-02-19
|
||
|
||
### Added
|
||
- **NINA Gebietsanzeige**: Warnmeldungen zeigen jetzt das Herkunftsgebiet (AGS-Regionsname)
|
||
sowohl in der Weboberfläche (neue Spalte "Gebiet" in der Alerts-Tabelle) als auch im
|
||
Mesh-Nachrichtentext (z.B. `[NINA] Schwerwiegend: Sturmböen (Dresden, Stadt)`).
|
||
- **AGS-Ortsname in der Konfigurationstabelle**: Die AGS-Code-Tabelle zeigt jetzt den
|
||
lesbaren Ortsnamen je Code als zweite Spalte an.
|
||
- **Sächsische AGS-Combobox**: Bei der Eingabe neuer AGS-Codes schlägt eine Datalist
|
||
alle sächsischen Landkreise und kreisfreien Städte vor (Name + Code).
|
||
|
||
### Fixed
|
||
- **colspan**: Leere Zeile in der Alerts-Tabelle auf 6 Spalten aktualisiert.
|
||
|
||
## [0.08.02] - 2026-02-19
|
||
|
||
### Fixed
|
||
- **NINA mapData geografische Filterung**: mapData-Endpunkte werden nur noch abgefragt,
|
||
wenn **keine** AGS-Codes konfiguriert sind. Sind AGS-Codes gesetzt, filtert der
|
||
Dashboard-Endpunkt bereits serverseitig regional (deckt alle Quellen inkl. DWD ab).
|
||
Vorher wurden bundesweite Meldungen außerhalb der konfigurierten Regionen angezeigt.
|
||
|
||
## [0.08.01] - 2026-02-19
|
||
|
||
### Added
|
||
- **NINA Wiederholungsintervall** (`resend_interval`): Zweiter konfigurierbarer Intervall,
|
||
der aktive Warnmeldungen in regelmäßigen Abständen erneut ins Mesh sendet
|
||
(nur wenn `send_to_mesh=true`). Standard: 3600 Sekunden (1 Stunde).
|
||
- **NINA AGS-Code-Tabelle**: AGS-Codes werden jetzt in einer Tabelle mit Lösch-Button
|
||
je Zeile angezeigt – übersichtlicher als die bisherigen Badge-Einträge.
|
||
|
||
### Fixed
|
||
- **Badge-Lesbarkeit**: Severity-Badges in der Alerts-Tabelle haben jetzt explizite
|
||
Textfarben (`text-white` / `text-dark`) ohne `bg-opacity`, damit der Text auf allen
|
||
Hintergründen und in beiden Themes lesbar bleibt.
|
||
- **colspan**: Leere Zeile in der Alerts-Tabelle korrekt auf 5 Spalten gesetzt.
|
||
|
||
## [0.08.00] - 2026-02-19
|
||
|
||
### Added
|
||
- **NINA-Integration**: Anbindung an die NINA Warn-App des BBK (Bundesamt für Bevölkerungsschutz
|
||
und Katastrophenhilfe). Warnmeldungen werden per HTTP-Polling von `warnung.bund.de/api31`
|
||
abgerufen und bei neuen Meldungen automatisch ins Meshtastic-Netz gesendet.
|
||
- **Duales Polling**: Zwei parallele Abfragestrategien pro Zyklus:
|
||
- **Dashboard** (`/dashboard/{AGS}.json`): Regionale Filterung durch den BBK-Server,
|
||
deckt alle Quellen für konfigurierte AGS-Codes ab.
|
||
- **mapData** (`/{quelle}/mapData.json`): Nationale Abfrage je aktivierter Quelle
|
||
(Katwarn, BIWAPP, MoWaS, DWD, LHP, Polizei) mit Schweregrad-Filterung.
|
||
Schließt Lücken, die der Dashboard-Endpunkt nicht abdeckt.
|
||
- Intelligente quellenübergreifende De-Duplikation via ID-Normalisierung
|
||
(z.B. `dwdmap.` ↔ `dwd.`, `mow.` ↔ `mowas.`).
|
||
- **NINA-Konfigurationsseite** (`/nina`, Admin-only): Separate Webseite zur Verwaltung der
|
||
NINA-Einstellungen – analog zur Scheduler-Seite. Konfigurierbar:
|
||
- Aktivierung / Deaktivierung
|
||
- Abfrageintervall (Sekunden, min. 60)
|
||
- Meshtastic-Kanal für Warnmeldungen
|
||
- Mindest-Schweregrad (Gering / Mäßig / Schwerwiegend / Extrem)
|
||
- AGS-Codes (Amtliche Gemeindeschlüssel) der zu überwachenden Landkreise/Städte
|
||
- Quellen-Auswahl (Katwarn, BIWAPP, MoWaS, DWD, LHP, Polizei)
|
||
- **„Ins Mesh senden"**-Schalter: aus = Monitor-Modus (nur Weboberfläche, kein Mesh-Versand)
|
||
- **Voreinstellung Raum Dresden**: `nina.yaml` enthält 5 AGS-Codes als Standard:
|
||
Stadt Dresden, LK Meißen, LK Sächsische Schweiz-Osterzgebirge, LK Bautzen, LK Görlitz
|
||
- **Live-Anzeige** empfangener NINA-Warnmeldungen in der Weboberfläche via WebSocket
|
||
(`nina_alert`-Event).
|
||
- **NINA-Sidebar-Eintrag** in allen Seiten (Admin-only, Icon: `bi-shield-exclamation`).
|
||
- **`nina.yaml`** als Hot-reload-fähige Konfigurationsdatei (analog zu `scheduler.yaml`).
|
||
|
||
## [0.07.01] - 2026-02-18
|
||
|
||
### Changed
|
||
- **Standard-Theme**: Hell-Theme (Light) ist jetzt der Default für neue Besucher
|
||
(bisher: Dark). Gespeicherte Benutzereinstellung bleibt erhalten.
|
||
|
||
## [0.07.00] - 2026-02-18
|
||
|
||
### Changed
|
||
- **Dockerfile**: `EXPOSE` von 8080 auf 8081 korrigiert (entspricht Web-Port in config.yaml).
|
||
- **Dockerfile**: `HEALTHCHECK` hinzugefügt – prüft `/api/stats` alle 30s,
|
||
Timeout 5s, Start-Wartezeit 20s, max. 3 Versuche.
|
||
- **docker-compose.yml**: `healthcheck` und `logging` (json-file, 10 MB / 3 Dateien) ergänzt.
|
||
- **conf/config.yaml**: Version auf 0.07.00 und Verbindungsdaten aktualisiert.
|
||
|
||
## [0.06.15] - 2026-02-18
|
||
|
||
### Added
|
||
- **Scheduler Template-Variablen**: Nachrichten-Jobs können Platzhalter nutzen:
|
||
`{time}`, `{date}`, `{datetime}`, `{weekday}`, `{nodes}`, `{nodes_24h}`.
|
||
Werden beim Ausführen serverseitig aufgelöst.
|
||
- **Scheduler UI**: Bei Typ „Nachricht" werden klickbare Variablen-Badges
|
||
unter dem Eingabefeld angezeigt – Klick fügt Variable an Cursorposition ein.
|
||
- **Footer**: Auf allen Seiten fixer Footer mit Copyright „MeshDD / PPfeiffer",
|
||
Versionsnummer und Monat/Jahr (MM/YYYY).
|
||
|
||
### Fixed
|
||
- **Sauberer Shutdown**: WebSocket-Verbindungen werden vor `runner.cleanup()`
|
||
explizit geschlossen (`ws_manager.close_all()`), so dass der Prozess nicht
|
||
mehr auf hängende WS-Loops wartet.
|
||
|
||
## [0.06.14] - 2026-02-18
|
||
|
||
### Added
|
||
- **Dashboard**: Viertes Diagramm "Pakettypen (24h)" – Doughnut-Chart mit Pakettyp-Verteilung
|
||
der letzten 24h aus der `packets`-Tabelle, farblich nach Typ kodiert.
|
||
|
||
## [0.06.13] - 2026-02-18
|
||
|
||
### Added
|
||
- **Version in Navbar** aller Seiten sichtbar (via `app.js initPage()` + `/api/stats`).
|
||
- **Karte Alter-Transparenz**: Nodes < 24h voll sichtbar (0.9), 24–48h halb transparent (0.45),
|
||
48–72h stark transparent (0.2), älter als 72h werden nicht mehr angezeigt.
|
||
Legende um Alter-Sektion erweitert.
|
||
|
||
### Changed
|
||
- **Statistiken Rolling Window**: Anfragen-Zähler und Kanal-Breakdown nutzen jetzt
|
||
rollendes 24h-Fenster (jetzt minus 24h) statt Mitternacht-Reset.
|
||
|
||
## [0.06.12] - 2026-02-18
|
||
|
||
### Fixed
|
||
- **Paket-Log**: Typ-Badges nutzen jetzt solide `bg-{color}`-Hintergründe mit `text-white`
|
||
(bei Warning: `text-dark`) statt `bg-opacity-20 text-{color}` – garantiert lesbaren
|
||
Typ-Label-Text in jedem Theme.
|
||
|
||
## [0.06.11] - 2026-02-18
|
||
|
||
### Changed
|
||
- **Paket-Log**: Badges gleich breit (CSS `min-width:5.5rem`, zentriert), Typ-Filter-Pills in
|
||
Typ-Farbe eingefärbt (aktiv: gefüllt, inaktiv: Outline), unbekannte/undekodierbare Pakete
|
||
(leerer Portnum) als Typ „?" im Filter sichtbar, Kanal-Spalte zeigt Kanalname wenn verfügbar.
|
||
|
||
## [0.06.10] - 2026-02-18
|
||
|
||
### Added
|
||
- **Paket-Log** (`/packets`): neue öffentliche Seite zeigt alle empfangenen Meshtastic-Pakete
|
||
in Echtzeit via WebSocket – mit Tabelle (Zeit, Von, An, Typ, Kanal, SNR, RSSI, Hops, Info),
|
||
Typ-Filterleiste, Pause- und Löschen-Funktion, max. 300 Einträge im Browser.
|
||
- **DB**: `packets`-Tabelle + `insert_packet()` / `get_recent_packets()` in `database.py`.
|
||
- **bot.py**: `_handle_packet()` loggt alle empfangenen Pakete mit Payload-Zusammenfassung
|
||
(Text, Position, Telemetrie, NodeInfo) und broadcasted sie über WebSocket an alle Clients.
|
||
- **webserver.py**: Route `/packets` + API `/api/packets` + `initial_packets` im WS-Initial-Payload.
|
||
- **Sidebar**: Eintrag „Pakete" (öffentlich) zwischen Karte und Einstellungen.
|
||
|
||
### Changed
|
||
- **Node-Modal**: von `modal-lg` auf `modal-xl` + `modal-dialog-scrollable` vergrößert,
|
||
Karten-Höhe von 250 px auf 300 px erhöht.
|
||
|
||
## [0.06.09] - 2026-02-18
|
||
|
||
### Fixed
|
||
- **bot.py**: `_on_node_updated` Signatur um `interface=None` ergänzt –
|
||
`meshtastic.node.updated` sendet `(node, interface)`, fehlender Parameter
|
||
führte zu `SenderUnknownMsgDataError` und Absturz des Node-Handlers.
|
||
|
||
## [0.06.08] - 2026-02-18
|
||
|
||
### Fixed
|
||
- **bot.py**: `pub.subscribe()` wurde nach `TCPInterface()` aufgerufen → `connection.established`
|
||
und `node.updated`-Events beim Start wurden verpasst; Nodes nicht geladen, Status blieb
|
||
"Getrennt". Subscriptions werden jetzt VOR dem Konstruktor registriert + Fallback danach.
|
||
- **HTML**: `tabler.min.js` exportiert `bootstrap` nicht global → `new bootstrap.Modal()` schlug
|
||
fehl, Seiten brachen ab. Zurück zu `bootstrap.bundle.min.js` (Tabler CSS bleibt).
|
||
- **dashboard.js**: Bootstrap-4-Klasse `badge-pill` durch `rounded-pill` (Bootstrap 5) ersetzt.
|
||
- **style.css**: CSS-Variablen-Typo `--tblr-bg-body` → `--tblr-body-bg`.
|
||
|
||
## [0.06.07] - 2026-02-17
|
||
|
||
### Changed
|
||
- **Tabler 1.4.0** als Admin-Theme eingebunden: ersetzt Bootstrap CSS/JS in allen 6 HTML-Seiten
|
||
- `style.css` komplett überarbeitet mit Tabler-Variablen: Inter-Font, subtile Karten-Schatten, verfeinerte Sidebar (Rounded Active-Links), Hover-Animation auf Info-Boxen, pulsierender Status-Dot
|
||
- Navbar-Höhe 46px → 48px, Sidebar-Breite auf 210px, Karten-Header-Schrift verfeinert
|
||
|
||
## [0.06.06] - 2026-02-17
|
||
|
||
### Added
|
||
- Nachrichten-Kanalfilter: Filter-Buttons im Nachrichten-Card-Header ("Alle" + ein Button pro Kanal)
|
||
- Neue Nachrichten werden sofort gefiltert; `data-channel`-Attribut auf jedem `.msg-item`
|
||
- `renderMsgFilterBar()` und `applyMsgFilter()` in `dashboard.js`
|
||
|
||
## [0.06.05] - 2026-02-17
|
||
|
||
### Added
|
||
- Dark Mode Kartentiles: CartoDB Dark Matter bei dunklem Theme, OpenStreetMap bei hellem (Karte + Node-Modal)
|
||
- `themechange` Custom-Event in `app.js` – alle Karten reagieren live auf Theme-Wechsel
|
||
- 3 Charts im Dashboard: Kanal-Anfragen (Doughnut), Hop-Verteilung (Bar), Hardware Top 5 (Bar)
|
||
- Charts passen sich automatisch dem Dark/Light Mode an
|
||
- Nodes-Tabelle: Suchfeld + Online-Filter + Sortierung per Klick auf Spaltenköpfe
|
||
## [0.06.04] - 2026-02-17
|
||
|
||
### Added
|
||
- Bot-Uptime als 4. Info-Box im Dashboard (live via WebSocket)
|
||
- Meshtastic-Verbindungsstatus als zweiter Status-Dot in der Navbar
|
||
- `bot_status` WebSocket-Event bei Connect/Disconnect des Meshtastic-Nodes
|
||
- `uptime` und `bot_connected` in `stats_update` und `/api/stats`
|
||
## [0.06.03] - 2026-02-17
|
||
|
||
### Fixed
|
||
- WebSocket sendet `initial_messages` und `new_message` nur noch an authentifizierte Clients
|
||
- `WebSocketManager` unterscheidet jetzt `clients` (alle) und `auth_clients` (eingeloggt)
|
||
## [0.06.02] - 2026-02-17
|
||
|
||
### Changed
|
||
- Refactor: Gemeinsames `static/js/app.js` Modul extrahiert
|
||
- Eliminiert ~360 Zeilen doppelten Code aus allen 5 Seiten (Navbar, Sidebar, Theme, escapeHtml)
|
||
- Sidebar-HTML wird jetzt dynamisch per `initPage()` injiziert mit automatischer Active-Link-Erkennung
|
||
## [0.06.01] - 2026-02-17
|
||
### Added
|
||
- Dockerfile fuer Container-Betrieb (python:3.12-slim)
|
||
- docker-compose.yml mit Host-Netzwerk und Named Volume fuer SQLite
|
||
- conf/ Verzeichnis mit Beispiel-Konfigurationsdateien fuer Docker
|
||
- .dockerignore fuer saubere Docker-Builds
|
||
|
||
## [0.06.00] - 2026-02-17
|
||
### Summary
|
||
- Node-Detail-Modal mit Minikarte im Dashboard
|
||
- Anfragen-Tracking pro Kanal mit taeglichem Reset
|
||
- Kanal-Badges fuer alle Kanaele im Dashboard
|
||
|
||
### Added
|
||
- Node-Detail-Modal: Klick auf Node-Zeile oeffnet Modal mit allen Node-Daten und Leaflet-Minikarte
|
||
- Anfragen-Aufschluesselung pro Kanal mit Kanalnamen im Dashboard
|
||
- Channel-Spalte in der commands-Tabelle (mit automatischer DB-Migration)
|
||
|
||
### Changed
|
||
- Anfragen-Zaehler zeigt nur Anfragen von heute (Reset um Mitternacht)
|
||
- Kanal-Badges zeigen immer alle Kanaele aufsteigend sortiert (auch bei 0 Anfragen)
|
||
- Kanal-Badge in Nachrichten im Light-Mode besser lesbar
|
||
|
||
## [0.05.10] - 2026-02-17
|
||
### Fixed
|
||
- Kanal-Badge in Nachrichten im hellen Modus besser lesbar (bg-secondary statt bg-body-secondary)
|
||
|
||
## [0.05.09] - 2026-02-17
|
||
### Changed
|
||
- Kanal-Badges zeigen immer alle Kanaele aufsteigend sortiert mit Kanalnamen (auch bei 0 Anfragen)
|
||
- Label-Zeile "Anfragen/Kanal" entfernt
|
||
|
||
## [0.05.08] - 2026-02-17
|
||
### Changed
|
||
- Anfragen-Zaehler zeigt nur noch Anfragen von heute (Reset um Mitternacht)
|
||
- Kommando-Badges entfernt, nur noch Kanal-Aufschluesselung angezeigt
|
||
|
||
## [0.05.07] - 2026-02-17
|
||
### Added
|
||
- Anfragen-Aufschluesselung pro Kanal mit Kanalnamen im Dashboard
|
||
- Channel-Spalte in der commands-Tabelle (mit DB-Migration fuer bestehende DBs)
|
||
|
||
## [0.05.06] - 2026-02-17
|
||
### Added
|
||
- Node-Detail-Modal im Dashboard: Klick auf Node-Zeile oeffnet Modal mit allen Node-Daten
|
||
- Leaflet-Minikarte im Modal zeigt Node-Position (oder "Keine Position" Hinweis)
|
||
- Zwei-Spalten-Layout: Datentabelle links, Karte rechts (responsive)
|
||
|
||
## [0.05.05] - 2026-02-17
|
||
### Changed
|
||
- SMTP-Versand auf EmailMessage + aiosmtplib.SMTP (async context manager) umgestellt
|
||
- Plaintext-Fallback fuer nicht-HTML-faehige E-Mail-Clients
|
||
- SMTP-Host zurueck auf ssl0.ovh.net
|
||
|
||
## [0.05.04] - 2026-02-16
|
||
### Added
|
||
- Admin: Benutzer direkt anlegen mit Passwort und Rollenwahl
|
||
- Admin: Benutzer bearbeiten (Name, E-Mail, Rolle) per Modal
|
||
- Admin: Passwort zuruecksetzen mit optionalem E-Mail-Versand
|
||
- Admin: Info-Mail mit Zugangsdaten an Benutzer senden
|
||
- Passwort-Generator (crypto.getRandomValues) in Admin-UI
|
||
- Verifikationslink wird immer im Log ausgegeben (nicht nur ohne SMTP)
|
||
|
||
### Changed
|
||
- Admin-Seite komplett ueberarbeitet mit Modals fuer alle Aktionen
|
||
- E-Mail-Funktionen um `send_user_info_email` erweitert
|
||
|
||
## [0.05.03] - 2026-02-16
|
||
### Changed
|
||
- Zugangsdaten (AUTH_SECRET_KEY, SMTP-*) aus config.yaml in .env-Datei ausgelagert
|
||
- Neuer `config.env()` Helper fuer Umgebungsvariablen
|
||
- `.env.example` als Vorlage hinzugefuegt
|
||
- E-Mail-Versand in gemeinsame `_send_email()` Hilfsfunktion refaktoriert
|
||
|
||
## [0.05.02] - 2026-02-16
|
||
### Fixed
|
||
- SMTP-Versand: TLS (Port 465) und STARTTLS (Port 587) automatisch anhand des Ports
|
||
|
||
## [0.05.01] - 2026-02-16
|
||
### Fixed
|
||
- Fernet key setup fuer EncryptedCookieStorage korrigiert (doppelte Base64-Kodierung)
|
||
|
||
## [0.05.00] - 2026-02-16
|
||
### Added
|
||
- Benutzerverwaltung mit Session-basierter Authentifizierung
|
||
- Registrierung mit E-Mail-Verifikation (OTP-Token via aiosmtplib)
|
||
- Passwort-Hashing mit bcrypt (12 Rounds, min. 8 Zeichen)
|
||
- Benutzerrollen: public (nicht eingeloggt), user, admin
|
||
- Login/Register/Passwort-vergessen Seite (`/login`, `/register`)
|
||
- Admin-Benutzerverwaltung (`/admin`) mit Rolle aendern, verifizieren, loeschen
|
||
- Session-Management via aiohttp-session mit EncryptedCookieStorage
|
||
- Auth-Middleware setzt `request['user']` auf allen Routen
|
||
- API-Endpoint `GET /api/auth/me` fuer Frontend-Rollenabfrage
|
||
- Auth-Routen: login, register, logout, verify, set-password, forgot-password, reset-password
|
||
- Admin-API: users CRUD, Rolle aendern, manuell verifizieren
|
||
- Navbar zeigt User-Name + Logout oder Login-Button auf allen Seiten
|
||
- Sidebar zeigt Scheduler/Settings/Admin nur fuer Admins (JS-gesteuert)
|
||
|
||
### Changed
|
||
- Dashboard: Nachrichten-Card und Sende-Card nur fuer eingeloggte User sichtbar
|
||
- API `/api/send` erfordert User-Login
|
||
- API `/api/node/config`, `/api/scheduler/*` erfordern Admin-Rolle
|
||
- Neue DB-Tabellen: users, tokens, email_logs
|
||
- config.yaml: auth + smtp Sektionen hinzugefuegt
|
||
- requirements.txt: bcrypt, aiohttp-session, cryptography, aiosmtplib
|
||
|
||
## [0.04.00] - 2026-02-16
|
||
### Summary
|
||
- Node-Einstellungen Seite, Karte im Sidebar-Layout
|
||
- Wetter mit Ortsnamen, PLZ-Support, Luftdruck und Taupunkt
|
||
- /me Befehl, Ping mit Hop-Anzahl
|
||
- Gesendete Nachrichten im Dashboard mit gruener Bubble
|
||
- Sende-Card als eigene Komponente, Command-Prefix "?"
|
||
|
||
## [0.03.15] - 2026-02-16
|
||
### Changed
|
||
- Debug-Logging aus _send_text entfernt
|
||
|
||
## [0.03.14] - 2026-02-16
|
||
### Changed
|
||
- Command-Prefix von "/" auf "?" geaendert
|
||
- Channel-Combobox in Sende-Card breiter (180px) fuer vollstaendige Channelnamen
|
||
- Debug-Logging in _send_text fuer Diagnose der Nachrichtenspeicherung
|
||
|
||
## [0.03.13] - 2026-02-16
|
||
### Fixed
|
||
- Gesendete Nachrichten werden jetzt vor dem Radio-Send gespeichert und broadcastet
|
||
- Getrenntes Exception-Handling fuer DB-Store und Radio-Send
|
||
|
||
## [0.03.12] - 2026-02-16
|
||
### Fixed
|
||
- Eigene Nachrichten-Echos werden in _handle_packet gefiltert (keine Doppelspeicherung)
|
||
- Bot-Nachrichten erscheinen korrekt im Dashboard-Nachrichtenfenster
|
||
|
||
## [0.03.11] - 2026-02-16
|
||
### Changed
|
||
- Sende-Zeile als eigene Card mit gruener Oberkante oberhalb der Nodes/Nachrichten-Cards
|
||
- Nachrichten-Card ohne Footer (schlanker)
|
||
|
||
## [0.03.10] - 2026-02-16
|
||
### Added
|
||
- Gesendete Bot-Nachrichten werden im Nachrichtenfenster angezeigt
|
||
- Eigene Nachrichten mit gruener Bubble und rechtsbuendiger Ausrichtung
|
||
- Bot-Nachrichten werden in DB gespeichert und via WebSocket broadcastet
|
||
|
||
## [0.03.09] - 2026-02-16
|
||
### Added
|
||
- Neuer Befehl `/me` zeigt eigene Node-Infos (Name, HW, Hops, SNR, RSSI, Batterie, Position)
|
||
- Wetter zeigt Luftdruck NN (hPa) und Taupunkt (°C)
|
||
|
||
## [0.03.08] - 2026-02-16
|
||
### Changed
|
||
- Ping-Antwort zeigt Hop-Anzahl des anfragenden Nodes (z.B. "Pong ueber 2 Hops!")
|
||
|
||
## [0.03.07] - 2026-02-16
|
||
### Added
|
||
- Weather-Befehl zeigt Ortsnamen via Reverse-Geocoding (Nominatim)
|
||
- Optionales Argument `plz:XXXXX` fuer Wetter nach deutscher Postleitzahl
|
||
- Geocoding-Methoden `_geocode_plz()` und `_reverse_geocode()` im Bot
|
||
|
||
### Changed
|
||
- Help-Text zeigt `plz:XXXXX` Option beim Weather-Befehl
|
||
|
||
## [0.03.06] - 2026-02-15
|
||
### Added
|
||
- Node-Einstellungen Seite (`/settings`) zeigt Geraet, LoRa, Channels, Position, Power, Bluetooth/Netzwerk
|
||
- Neuer API-Endpoint `GET /api/node/config` liest Config vom lokalen Meshtastic-Node
|
||
- `get_node_config()` Methode im Bot (liest localConfig, myInfo, metadata via Protobuf)
|
||
- Sidebar-Eintrag "Einstellungen" mit Gear-Icon auf allen Seiten
|
||
|
||
### Changed
|
||
- Karte (`/map`) im Sidebar-Layout statt Vollbild (Top-Navbar, Sidebar, Content-Wrapper)
|
||
- Karte oeffnet im selben Tab statt `target="_blank"`
|
||
- Status-Info und Node-Count in Karten-Navbar integriert
|
||
- Map-Styles (Tooltip, Legende) in zentrale `style.css` verschoben
|
||
- Sidebar-Navigation auf allen 4 Seiten konsistent (Dashboard, Scheduler, Karte, Einstellungen)
|
||
|
||
## [0.03.05] - 2026-02-15
|
||
### Changed
|
||
- Dashboard und Scheduler auf AdminLTE-Style umgestellt
|
||
- Feste Sidebar-Navigation (Dashboard, Scheduler, Karte) mit Active-State
|
||
- Fixed Top-Navbar mit Branding, Status-Dot und Theme-Toggle
|
||
- Content-Wrapper mit leicht abgesetztem Hintergrund
|
||
- Info-Boxes im AdminLTE-Stil (Icon-Spalte + Inhalt) statt Cards
|
||
- Card-Outline mit farbiger Oberkante (info/warning) statt Borders
|
||
- Table-Striped fuer bessere Lesbarkeit
|
||
- Sidebar responsive: auf Mobile als Overlay mit Backdrop
|
||
- Einheitliches Layout auf Dashboard und Scheduler
|
||
|
||
## [0.03.04] - 2026-02-15
|
||
### Fixed
|
||
- Kanalnamen in Nachrichten fehlten beim Laden (Channels werden jetzt vor Messages gesendet)
|
||
|
||
### Changed
|
||
- Dashboard deutlich kompakter: weniger Padding, kleinere Schriftgroessen
|
||
- Stat-Cards, Navbar, Panels und Nachrichten platzsparender
|
||
- Hover-Animationen und Pulse-Effekt entfernt (schlichter)
|
||
|
||
## [0.03.03] - 2026-02-15
|
||
### Changed
|
||
- Dashboard-Layout modernisiert: Glassmorphism-Navbar (sticky, blur-Effekt)
|
||
- Stat-Cards mit Gradient-Akzentlinie, dezenten Hintergrund-Icons und Hover-Lift
|
||
- Nachrichten als Chat-Bubbles statt flache Listeneintraege
|
||
- Buttons und Badges als Rounded-Pills fuer moderneren Look
|
||
- Sende-Leiste mit eigenem abgesetztem Styling
|
||
- Panel-Cards borderless mit Soft-Shadow
|
||
- Node-Count-Badge als Pill mit halbtransparentem Hintergrund
|
||
- Status-Dot mit sanfter Pulse-Animation bei Verbindung
|
||
- Breakdowns-Leiste mit subtilerem Hintergrund
|
||
|
||
## [0.03.02] - 2026-02-15
|
||
### Added
|
||
- Nachrichten senden direkt aus dem Dashboard (Channel-Dropdown + Textfeld)
|
||
- Neuer API-Endpoint `POST /api/send` zum Senden von Textnachrichten
|
||
- `send_message()` Methode im Bot fuer freie Textnachrichten
|
||
- Scheduler unterstuetzt neuen Typ "Nachricht" neben "Kommando"
|
||
- Typ-Auswahl (Kommando/Nachricht) im Scheduler-Modal mit dynamischem Label
|
||
- Typ-Spalte in der Scheduler-Tabelle
|
||
|
||
## [0.03.01] - 2026-02-15
|
||
### Added
|
||
- Scheduler-Feature: zeitgesteuerte Bot-Kommandos via Cron-Ausdruecke
|
||
- Neue Datei `scheduler.yaml` fuer Job-Konfiguration mit File-Watcher (Live-Reload)
|
||
- Eigener minimaler Cron-Parser (Minute, Stunde, Tag, Monat, Wochentag)
|
||
- Scheduler-Webseite unter `/scheduler` zum Verwalten der Jobs (CRUD)
|
||
- REST API: GET/POST/PUT/DELETE `/api/scheduler/jobs`
|
||
- Live-Updates der Scheduler-Seite via WebSocket
|
||
- `execute_command()` Methode im Bot fuer programmatische Kommando-Ausfuehrung
|
||
- Scheduler-Link in der Dashboard-Navbar
|
||
|
||
## [0.03.00] - 2026-02-15
|
||
### Added
|
||
- Produktiver Betrieb als Systemd-Service
|
||
|
||
## [0.02.06] - 2026-02-15
|
||
### Added
|
||
- WordPress-Beitrag unter docs/wordpress-beitrag.html
|
||
- Systemd Service-File meshdd-bot.service
|
||
- Nachrichten-Splitting mit [x/y] Nummerierung
|
||
|
||
### Changed
|
||
- Pause zwischen gesplitteten Nachrichten auf 3 Sekunden erhöht
|
||
|
||
## [0.02.05] - 2026-02-15
|
||
### Added
|
||
- Automatisches Aufteilen langer Nachrichten (max 170 Zeichen) mit 1,5s Pause
|
||
|
||
### Changed
|
||
- /mesh Befehl: bessere Lesbarkeit mit Absätzen und Einrückungen
|
||
- Hop-Verteilung: "Direkt", "1 Hop", "2 Hops" statt "0h", "1h", "2h"
|
||
|
||
## [0.02.04] - 2026-02-15
|
||
### Added
|
||
- Neuer Befehl /mesh - zeigt Mesh-Netzwerk-Infos (Nodes online/gesamt, aktiv 24h, Positionen, Hop-Verteilung, Top-Hardware)
|
||
|
||
## [0.02.03] - 2026-02-15
|
||
### Added
|
||
- Kommando-Tracking in der Datenbank (neue Tabelle `commands`)
|
||
- Stats Card "Aktiv (24h)" zeigt Nodes der letzten 24 Stunden
|
||
- Stats Card "Anfragen" zeigt beantwortete Bot-Kommandos
|
||
- Kommando-Aufschlüsselung als Badges in voller Breite (z.B. /help 5, /ping 3)
|
||
|
||
### Changed
|
||
- Stats Cards von 4er auf 3er Grid umgestellt plus Breakdown-Zeile
|
||
- Bot /stats Kommando zeigt aktualisierte Statistiken
|
||
|
||
## [0.02.02] - 2026-02-15
|
||
### Changed
|
||
- SNR-Spalte rechtsbündig, Batterie-Spalte linksbündig
|
||
- Spaltenabstände in der Nodesliste reduziert (kompakteres Layout)
|
||
- Spaltenüberschrift "Zuletzt gesehen" zu "Zuletzt" gekürzt
|
||
|
||
## [0.02.01] - 2026-02-15
|
||
### Changed
|
||
- Stats Cards kompakter (kleinerer Padding und Schrift)
|
||
- Batteriestatus mit Bootstrap Icons und Farbcodierung (grün/gelb/rot)
|
||
- Version wird in der Navbar angezeigt
|
||
- Karte fittet beim Öffnen auf alle Nodes
|
||
|
||
## [0.02.00] - 2026-02-15
|
||
### Added
|
||
- Zentrale config.yaml mit Live-Reload (File-Watcher)
|
||
- Konfigurierbarer Command-Prefix (Standard: /)
|
||
- Kanalnamen in der Nachrichtenliste
|
||
- Hops-Spalte in der Nodes-Tabelle
|
||
- Karte: Farbcodierung der Nodes nach Hop-Anzahl mit Legende
|
||
- Karte: Tooltip mit Node-Infos beim Hover
|
||
- Hell/Dunkel Theme-Umschalter im Dashboard
|
||
- Node-Namen (LongName/ShortName) werden korrekt angezeigt
|
||
- Nachrichten werden beim Connect aus der DB geladen
|
||
- Wetter-Fallback auf Dresden Zentrum bei fehlender Position
|
||
|
||
### Changed
|
||
- Konfiguration von Environment-Variablen auf config.yaml umgestellt
|
||
- Version wird in config.yaml statt version.py verwaltet
|
||
|
||
### Removed
|
||
- Git pre-commit Hook (manuelle Versionierung)
|
||
- version.py (ersetzt durch config.yaml)
|
||
|
||
## [0.01.02] - 2026-02-15
|
||
### Changed
|
||
- Auto-commit update
|
||
|
||
## [0.01.01] - 2026-02-15
|
||
### Changed
|
||
- Dashboard auf Bootstrap 5.3 Dark Theme umgestellt
|
||
- Bootstrap Icons hinzugefügt
|
||
- Responsive Stat-Cards, verbessertes Node-Table-Layout
|
||
- Online-Nodes werden grün hervorgehoben
|
||
|
||
## [0.01.00] - 2026-02-15
|
||
### Added
|
||
- Initial release
|
||
- Meshtastic Bot mit TCP-Verbindung
|
||
- Bot-Kommandos: !ping, !nodes, !info, !help, !weather, !stats, !uptime
|
||
- SQLite-Datenbank für Nodes und Nachrichten
|
||
- Web-Dashboard mit Live-Updates via WebSocket
|
||
- Leaflet-Karte mit Node-Positionen
|
||
- Automatische Versionierung via Git pre-commit Hook
|