MeshDD-Bot/CHANGELOG.md
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

537 lines
23 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# Changelog
## [0.8.4] - 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.8.3] - 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.8.2] - 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.8.1] - 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.8.0] - 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.7.1] - 2026-02-18
### Changed
- **Standard-Theme**: Hell-Theme (Light) ist jetzt der Default für neue Besucher
(bisher: Dark). Gespeicherte Benutzereinstellung bleibt erhalten.
## [0.7.0] - 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.7.0 und Verbindungsdaten aktualisiert.
## [0.6.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.6.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.6.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), 2448h halb transparent (0.45),
4872h 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.6.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.6.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.6.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.6.9] - 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.6.8] - 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.6.7] - 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.6.6] - 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.6.5] - 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.6.4] - 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.6.3] - 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.6.2] - 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.6.1] - 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.6.0] - 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.5.10] - 2026-02-17
### Fixed
- Kanal-Badge in Nachrichten im hellen Modus besser lesbar (bg-secondary statt bg-body-secondary)
## [0.5.9] - 2026-02-17
### Changed
- Kanal-Badges zeigen immer alle Kanaele aufsteigend sortiert mit Kanalnamen (auch bei 0 Anfragen)
- Label-Zeile "Anfragen/Kanal" entfernt
## [0.5.8] - 2026-02-17
### Changed
- Anfragen-Zaehler zeigt nur noch Anfragen von heute (Reset um Mitternacht)
- Kommando-Badges entfernt, nur noch Kanal-Aufschluesselung angezeigt
## [0.5.7] - 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.5.6] - 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.5.5] - 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.5.4] - 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.5.3] - 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.5.2] - 2026-02-16
### Fixed
- SMTP-Versand: TLS (Port 465) und STARTTLS (Port 587) automatisch anhand des Ports
## [0.5.1] - 2026-02-16
### Fixed
- Fernet key setup fuer EncryptedCookieStorage korrigiert (doppelte Base64-Kodierung)
## [0.5.0] - 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.4.0] - 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.3.15] - 2026-02-16
### Changed
- Debug-Logging aus _send_text entfernt
## [0.3.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.3.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.3.12] - 2026-02-16
### Fixed
- Eigene Nachrichten-Echos werden in _handle_packet gefiltert (keine Doppelspeicherung)
- Bot-Nachrichten erscheinen korrekt im Dashboard-Nachrichtenfenster
## [0.3.11] - 2026-02-16
### Changed
- Sende-Zeile als eigene Card mit gruener Oberkante oberhalb der Nodes/Nachrichten-Cards
- Nachrichten-Card ohne Footer (schlanker)
## [0.3.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.3.9] - 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.3.8] - 2026-02-16
### Changed
- Ping-Antwort zeigt Hop-Anzahl des anfragenden Nodes (z.B. "Pong ueber 2 Hops!")
## [0.3.7] - 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.3.6] - 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.3.5] - 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.3.4] - 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.3.3] - 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.3.2] - 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.3.1] - 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.3.0] - 2026-02-15
### Added
- Produktiver Betrieb als Systemd-Service
## [0.2.6] - 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.2.5] - 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.2.4] - 2026-02-15
### Added
- Neuer Befehl /mesh - zeigt Mesh-Netzwerk-Infos (Nodes online/gesamt, aktiv 24h, Positionen, Hop-Verteilung, Top-Hardware)
## [0.2.3] - 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.2.2] - 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.2.1] - 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.2.0] - 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.1.2] - 2026-02-15
### Changed
- Auto-commit update
## [0.1.1] - 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.1.0] - 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