#17 NINA: Schweregradstufen-Konfiguration (Intervall, Kanal, Mesh-Versand je Stufe) #17

Closed
opened 2026-02-22 14:19:32 +01:00 by ppfeiffer · 0 comments
Owner

Ziel

Jeder der vier NINA-Schweregrade (Minor, Moderate, Severe, Extreme) erhält eine eigene Konfiguration für Poll-Intervall, Wiederholungs-Intervall, Kanal und Mesh-Versand-Freigabe. Zusätzlich: Wiederholung abschaltbar (nur Änderungen senden) und vollständiges Versandlog einsehbar im Dashboard.


Neue Config-Struktur (config/nina.yaml)

enabled: false
ags_codes: []
sources:
  katwarn: true
  biwapp:  true
  mowas:   true
  dwd:     true
  lhp:     true
  police:  false

severities:
  Minor:
    send_to_mesh:    false
    channel:         0
    poll_interval:   600
    resend_interval: 0      # 0 = kein Wiederholungsversand
  Moderate:
    send_to_mesh:    false
    channel:         0
    poll_interval:   300
    resend_interval: 0
  Severe:
    send_to_mesh:    true
    channel:         0
    poll_interval:   300
    resend_interval: 1800
  Extreme:
    send_to_mesh:    true
    channel:         0
    poll_interval:   60
    resend_interval: 600

resend_interval: 0 = kein periodischer Wiederholungsversand – es werden ausschliesslich neue oder geaenderte Meldungen gesendet.

Wegfallende Felder: send_to_mesh, poll_interval, resend_interval, channel, min_severity.


Logik-Aenderungen in meshbot/nina.py

Polling

Vier separate Poll-Tasks, je einer pro Schweregrad. Jeder Task filtert beim Verarbeiten nur Meldungen seines Schweregrads. De-Duplikation ueber gemeinsames _known / _active bleibt erhalten.

Resend

Vier separate Resend-Tasks. resend_interval: 0 => kein Task gestartet => nur Aenderungen werden gesendet.


Versandlog

Datenbank

Neue Tabelle nina_log in database.py:

CREATE TABLE IF NOT EXISTS nina_log (
    id        INTEGER PRIMARY KEY AUTOINCREMENT,
    timestamp REAL    NOT NULL,
    channel   INTEGER NOT NULL,
    severity  TEXT    NOT NULL,
    headline  TEXT    NOT NULL,
    message   TEXT    NOT NULL,
    resend    INTEGER NOT NULL DEFAULT 0
);

Jede Aussendung (neu, geaendert, Wiederholung, Monitor-Only) wird eingetragen.

API-Endpunkt

GET /api/nina/log?limit=100 - Liste der letzten Eintraege, neueste zuerst. Zugang: Staff.

Frontend: Log-Fenster in /nina

Neues Panel Versandlog unterhalb der Alerts-Tabelle:

  • Spalten: Zeit / Kanal / Schweregrad / Nachricht
  • Wiederholungsversand mit Pfeil-Symbol markiert
  • Filter: Alle / nur Neu / nur Wiederholungen
  • Live-Update per WebSocket-Event nina_log
  • Max. 200 Eintraege im DOM

Migrationsverhalten

Beim Start mit alter nina.yaml (ohne severities:):

  • min_severity bestimmt welche Stufen send_to_mesh: true bekommen
  • Globale Werte als Default uebernommen
  • Neue nina.yaml geschrieben, alte Felder entfernt

Aufgaben

Backend

  • database.py: Tabelle nina_log + insert_nina_log() + get_nina_log(limit)
  • nina.py: DEFAULT_CONFIG auf severities:-Struktur umstellen
  • nina.py: _load() / _save() + Migrations-Logik
  • nina.py: 4x _poll_loop(severity) + 4x _resend_loop(severity)
  • nina.py: start() / stop() alle Tasks verwalten
  • nina.py: _send() schreibt jeden Versand in nina_log + WS-Broadcast nina_log
  • webserver.py: GET /api/nina/log (Staff)

Frontend

  • nina.html: Log-Panel unterhalb der Alerts-Tabelle
  • nina.js: loadLog(), Log-Tabelle rendern, WS-Event nina_log verarbeiten
  • nina.js: Konfig-UI als 4-zeilige Tabelle (Stufe / Mesh / Kanal / Poll / Resend)
  • Read-only fuer Nicht-Admins bleibt erhalten

Akzeptanzkriterium

  • Extreme: 60s Poll, 10min Resend, eigener Kanal konfigurierbar
  • Minor: wird abgerufen, kein Mesh-Versand, erscheint aber im Log
  • resend_interval: 0 => kein Wiederholungsversand, nur Aenderungen
  • Jede Aussendung erscheint im Log mit Zeit, Kanal, Schweregrad, Text und Resend-Markierung
  • Log live per WebSocket aktualisiert

Schalter: Bot-Kommandos deaktivieren

Config (config/config.yaml)

bot:
  commands_enabled: true   # false = Bot beantwortet keine Mesh-Anfragen mehr

Verhalten bei commands_enabled: false

  • Eingehende Textpakete mit Command-Prefix (?ping, ?nodes, …) werden still ignoriert
  • Scheduler-Nachrichten werden weiterhin gesendet
  • NINA-Warnungen werden weiterhin gesendet (sofern konfiguriert)
  • Der Bot empfaengt und speichert weiterhin alle Pakete und Nodes (kein Einfluss auf Datenerfassung)

Aufgaben

  • bot.py: In _handle_command() pruefen ob config.get("bot.commands_enabled", True) – wenn False, fruehzeitig abbrechen
  • config/config.example.yaml: Feld commands_enabled: true mit Kommentar ergaenzen
  • /config-Seite: Toggle in der Bot-Sektion (webserver.py _api_config_get/update nimmt das Feld bereits mit durch die bot:-Gruppe)
## Ziel Jeder der vier NINA-Schweregrade (Minor, Moderate, Severe, Extreme) erhält eine eigene Konfiguration für Poll-Intervall, Wiederholungs-Intervall, Kanal und Mesh-Versand-Freigabe. Zusätzlich: Wiederholung abschaltbar (nur Änderungen senden) und vollständiges Versandlog einsehbar im Dashboard. --- ## Neue Config-Struktur (`config/nina.yaml`) ```yaml enabled: false ags_codes: [] sources: katwarn: true biwapp: true mowas: true dwd: true lhp: true police: false severities: Minor: send_to_mesh: false channel: 0 poll_interval: 600 resend_interval: 0 # 0 = kein Wiederholungsversand Moderate: send_to_mesh: false channel: 0 poll_interval: 300 resend_interval: 0 Severe: send_to_mesh: true channel: 0 poll_interval: 300 resend_interval: 1800 Extreme: send_to_mesh: true channel: 0 poll_interval: 60 resend_interval: 600 ``` **`resend_interval: 0`** = kein periodischer Wiederholungsversand – es werden ausschliesslich neue oder geaenderte Meldungen gesendet. **Wegfallende Felder:** `send_to_mesh`, `poll_interval`, `resend_interval`, `channel`, `min_severity`. --- ## Logik-Aenderungen in `meshbot/nina.py` ### Polling Vier separate Poll-Tasks, je einer pro Schweregrad. Jeder Task filtert beim Verarbeiten nur Meldungen seines Schweregrads. De-Duplikation ueber gemeinsames `_known` / `_active` bleibt erhalten. ### Resend Vier separate Resend-Tasks. `resend_interval: 0` => kein Task gestartet => **nur Aenderungen** werden gesendet. --- ## Versandlog ### Datenbank Neue Tabelle `nina_log` in `database.py`: ```sql CREATE TABLE IF NOT EXISTS nina_log ( id INTEGER PRIMARY KEY AUTOINCREMENT, timestamp REAL NOT NULL, channel INTEGER NOT NULL, severity TEXT NOT NULL, headline TEXT NOT NULL, message TEXT NOT NULL, resend INTEGER NOT NULL DEFAULT 0 ); ``` Jede Aussendung (neu, geaendert, Wiederholung, Monitor-Only) wird eingetragen. ### API-Endpunkt `GET /api/nina/log?limit=100` - Liste der letzten Eintraege, neueste zuerst. Zugang: Staff. ### Frontend: Log-Fenster in `/nina` Neues Panel **Versandlog** unterhalb der Alerts-Tabelle: - Spalten: Zeit / Kanal / Schweregrad / Nachricht - Wiederholungsversand mit Pfeil-Symbol markiert - Filter: Alle / nur Neu / nur Wiederholungen - Live-Update per WebSocket-Event `nina_log` - Max. 200 Eintraege im DOM --- ## Migrationsverhalten Beim Start mit alter `nina.yaml` (ohne `severities:`): - `min_severity` bestimmt welche Stufen `send_to_mesh: true` bekommen - Globale Werte als Default uebernommen - Neue `nina.yaml` geschrieben, alte Felder entfernt --- ## Aufgaben ### Backend - [ ] `database.py`: Tabelle `nina_log` + `insert_nina_log()` + `get_nina_log(limit)` - [ ] `nina.py`: `DEFAULT_CONFIG` auf `severities:`-Struktur umstellen - [ ] `nina.py`: `_load()` / `_save()` + Migrations-Logik - [ ] `nina.py`: 4x `_poll_loop(severity)` + 4x `_resend_loop(severity)` - [ ] `nina.py`: `start()` / `stop()` alle Tasks verwalten - [ ] `nina.py`: `_send()` schreibt jeden Versand in `nina_log` + WS-Broadcast `nina_log` - [ ] `webserver.py`: `GET /api/nina/log` (Staff) ### Frontend - [ ] `nina.html`: Log-Panel unterhalb der Alerts-Tabelle - [ ] `nina.js`: `loadLog()`, Log-Tabelle rendern, WS-Event `nina_log` verarbeiten - [ ] `nina.js`: Konfig-UI als 4-zeilige Tabelle (Stufe / Mesh / Kanal / Poll / Resend) - [ ] Read-only fuer Nicht-Admins bleibt erhalten --- ## Akzeptanzkriterium - Extreme: 60s Poll, 10min Resend, eigener Kanal konfigurierbar - Minor: wird abgerufen, kein Mesh-Versand, erscheint aber im Log - `resend_interval: 0` => kein Wiederholungsversand, nur Aenderungen - Jede Aussendung erscheint im Log mit Zeit, Kanal, Schweregrad, Text und Resend-Markierung - Log live per WebSocket aktualisiert --- ## Schalter: Bot-Kommandos deaktivieren ### Config (`config/config.yaml`) ```yaml bot: commands_enabled: true # false = Bot beantwortet keine Mesh-Anfragen mehr ``` ### Verhalten bei `commands_enabled: false` - Eingehende Textpakete mit Command-Prefix (`?ping`, `?nodes`, …) werden still ignoriert - Scheduler-Nachrichten werden weiterhin gesendet - NINA-Warnungen werden weiterhin gesendet (sofern konfiguriert) - Der Bot empfaengt und speichert weiterhin alle Pakete und Nodes (kein Einfluss auf Datenerfassung) ### Aufgaben - [ ] `bot.py`: In `_handle_command()` pruefen ob `config.get("bot.commands_enabled", True)` – wenn False, fruehzeitig abbrechen - [ ] `config/config.example.yaml`: Feld `commands_enabled: true` mit Kommentar ergaenzen - [ ] `/config`-Seite: Toggle in der Bot-Sektion (`webserver.py` `_api_config_get/update` nimmt das Feld bereits mit durch die `bot:`-Gruppe)
Sign in to join this conversation.
No labels
No milestone
No project
No assignees
1 participant
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set.

Reference
ppfeiffer/MeshDD-Bot#17
No description provided.