feat: Deutsche Meshtastic Channel-Datenbank mit Unterseite /channels #19

Open
opened 2026-02-22 20:46:33 +01:00 by ppfeiffer · 0 comments
Owner

Ziel

Eine öffentlich einsehbare Datenbank bekannter deutscher Meshtastic-Kanäle mit Name, PSK, Modem-Preset, Region und Beschreibung. Admins können Einträge verwalten, alle können lesen.

Datenbankschema

Neue Tabelle channels:

Feld Typ Beschreibung
id INTEGER PK
name TEXT Kanalname (max. 11 Zeichen, Meshtastic-Limit)
psk TEXT PSK als Base64-String oder default
modem_preset TEXT z.B. LONG_FAST, LONG_SLOW, MEDIUM_FAST
region TEXT z.B. Deutschland, Sachsen, Dresden
description TEXT Zweck / Beschreibung
url TEXT meshtastic:// URL (optional)
website TEXT Zugehörige Website (optional)
is_verified INTEGER Admin-verifizierter Eintrag
created_at REAL Unix-Timestamp

API-Routen

Endpunkt Methode Auth Funktion
/api/channels GET Public Alle Einträge
/api/channels POST Admin Neuen Eintrag anlegen
/api/channels/{id} PUT Admin Eintrag bearbeiten
/api/channels/{id} DELETE Admin Eintrag löschen

Unterseite /channels

Öffentlich zugänglich (kein Login nötig)

  • Tabelle mit Spalten: Name · Modem-Preset · Region · Beschreibung · PSK (maskiert, mit Anzeige-Toggle + Kopieren-Button) · Verified-Badge
  • Suchfeld (filtert Name, Region, Beschreibung)
  • Regions-Filter-Dropdown
  • Berechnete Frequenz je Eintrag (aus Name + BW, abhängig von Regions-Einstellung) mit Hinweistext (siehe unten)
  • Admin-Ansicht: Bearbeiten/Löschen-Buttons pro Zeile + "Neuer Eintrag"-Modal

Frequenzberechnung (djb2-Hash)

Meshtastic berechnet den Frequenz-Slot deterministisch:

numChannels = floor((freq_end - freq_start) * 1000 / bw_kHz)
slot        = djb2(kanalname) % numChannels
frequenz    = freq_start + (bw_kHz/1000) * slot + (bw_kHz/1000) / 2

Berechnete Slots für EU_868 breit (863–870 MHz, 28 Slots)

Kanalname Preset Slot Frequenz
LongFast LONG_FAST 19 867.875 MHz
LongSlow LONG_SLOW 26 866.313 MHz
MedFast MEDIUM_FAST 17 867.375 MHz
MeshD LONG_FAST 10 865.625 MHz
MeshDresden LONG_FAST 3 863.875 MHz
MeshBerlin LONG_FAST 18 867.625 MHz
MeshHH LONG_FAST 26 869.625 MHz ⚠
MeshMUC LONG_FAST 7 864.875 MHz
MeshRuhr LONG_FAST 11 865.875 MHz
MeshSaxony LONG_FAST 12 866.125 MHz
Emergency LONG_FAST 0 863.125 MHz
TAC SHORT_FAST 9 867.750 MHz

Kollision: LongSlow und MeshHH landen beide auf Slot 26 → gleiche Frequenz, nur PSK trennt sie.

Wichtiger Hinweis für EU_868 schmal (Standard DE, 869.4–869.65 MHz)

Im offiziellen deutschen ISM-Band ist nur ein einziger 250-kHz-Slot erlaubt → numChannels = 1.

Alle Kanäle senden auf 869.525 MHz – unabhängig vom Namen.
Die Kanalname-Trennung erfolgt in EU_868 ausschließlich über den PSK (Verschlüsselung).

Dieser Hinweis wird in der UI prominent über der Frequenzspalte angezeigt:

In EU_868 (Standard Deutschland) teilen sich alle LONG_FAST-Kanäle dieselbe Frequenz (869.525 MHz). Die Trennung erfolgt ausschließlich über den PSK.

Seed-Daten (config/channels_seed.yaml)

Die Datei liegt bereits im Repository. Beim ersten Start werden bekannte Kanäle automatisch eingespielt:

Standardkanäle (verifiziert, PSK AQ==): LongFast, LongSlow, MedFast
Community-Kanäle (PSK zu ergänzen): MeshD, MeshDresden, MeshBerlin, MeshHH, MeshMUC, MeshRuhr, MeshSaxony
Sonderkanäle: Emergency (Slot 0), TAC (SHORT_FAST)

Implementierung

  • database.py: Tabelle channels, CRUD-Methoden, Seed-Import aus channels_seed.yaml
  • webserver.py: API-Routen, Seiten-Route /channels
  • static/channels.html + static/js/channels.js (inkl. djb2-Hash-Berechnung im Browser für Live-Frequenzanzeige)
  • app.js: Sidebar-Eintrag (Public)

Datenschutz-Hinweis

PSKs sind technisch öffentlich (wer den Kanal kennt, kennt den PSK), aber trotzdem standardmäßig maskiert dargestellt – bewusste Anzeige per Klick.

## Ziel Eine öffentlich einsehbare Datenbank bekannter deutscher Meshtastic-Kanäle mit Name, PSK, Modem-Preset, Region und Beschreibung. Admins können Einträge verwalten, alle können lesen. ## Datenbankschema Neue Tabelle `channels`: | Feld | Typ | Beschreibung | |---|---|---| | `id` | INTEGER PK | | | `name` | TEXT | Kanalname (max. 11 Zeichen, Meshtastic-Limit) | | `psk` | TEXT | PSK als Base64-String oder `default` | | `modem_preset` | TEXT | z.B. `LONG_FAST`, `LONG_SLOW`, `MEDIUM_FAST` | | `region` | TEXT | z.B. `Deutschland`, `Sachsen`, `Dresden` | | `description` | TEXT | Zweck / Beschreibung | | `url` | TEXT | `meshtastic://` URL (optional) | | `website` | TEXT | Zugehörige Website (optional) | | `is_verified` | INTEGER | Admin-verifizierter Eintrag | | `created_at` | REAL | Unix-Timestamp | ## API-Routen | Endpunkt | Methode | Auth | Funktion | |---|---|---|---| | `/api/channels` | GET | Public | Alle Einträge | | `/api/channels` | POST | Admin | Neuen Eintrag anlegen | | `/api/channels/{id}` | PUT | Admin | Eintrag bearbeiten | | `/api/channels/{id}` | DELETE | Admin | Eintrag löschen | ## Unterseite `/channels` **Öffentlich zugänglich** (kein Login nötig) - Tabelle mit Spalten: Name · Modem-Preset · Region · Beschreibung · PSK (maskiert, mit Anzeige-Toggle + Kopieren-Button) · Verified-Badge - Suchfeld (filtert Name, Region, Beschreibung) - Regions-Filter-Dropdown - **Berechnete Frequenz** je Eintrag (aus Name + BW, abhängig von Regions-Einstellung) mit Hinweistext (siehe unten) - Admin-Ansicht: Bearbeiten/Löschen-Buttons pro Zeile + "Neuer Eintrag"-Modal ## Frequenzberechnung (djb2-Hash) Meshtastic berechnet den Frequenz-Slot deterministisch: ``` numChannels = floor((freq_end - freq_start) * 1000 / bw_kHz) slot = djb2(kanalname) % numChannels frequenz = freq_start + (bw_kHz/1000) * slot + (bw_kHz/1000) / 2 ``` ### Berechnete Slots für EU_868 breit (863–870 MHz, 28 Slots) | Kanalname | Preset | Slot | Frequenz | |---|---|---|---| | LongFast | LONG_FAST | 19 | 867.875 MHz | | LongSlow | LONG_SLOW | 26 | 866.313 MHz | | MedFast | MEDIUM_FAST | 17 | 867.375 MHz | | MeshD | LONG_FAST | 10 | 865.625 MHz | | MeshDresden | LONG_FAST | 3 | 863.875 MHz | | MeshBerlin | LONG_FAST | 18 | 867.625 MHz | | MeshHH | LONG_FAST | **26** | 869.625 MHz ⚠ | | MeshMUC | LONG_FAST | 7 | 864.875 MHz | | MeshRuhr | LONG_FAST | 11 | 865.875 MHz | | MeshSaxony | LONG_FAST | 12 | 866.125 MHz | | Emergency | LONG_FAST | 0 | 863.125 MHz | | TAC | SHORT_FAST | 9 | 867.750 MHz | ⚠ **Kollision**: `LongSlow` und `MeshHH` landen beide auf Slot 26 → gleiche Frequenz, nur PSK trennt sie. ### Wichtiger Hinweis für EU_868 schmal (Standard DE, 869.4–869.65 MHz) Im offiziellen deutschen ISM-Band ist nur **ein einziger 250-kHz-Slot** erlaubt → `numChannels = 1`. **Alle Kanäle senden auf 869.525 MHz** – unabhängig vom Namen. Die Kanalname-Trennung erfolgt in EU_868 ausschließlich über den **PSK (Verschlüsselung)**. Dieser Hinweis wird in der UI prominent über der Frequenzspalte angezeigt: > *In EU_868 (Standard Deutschland) teilen sich alle LONG_FAST-Kanäle dieselbe Frequenz (869.525 MHz). Die Trennung erfolgt ausschließlich über den PSK.* ## Seed-Daten (`config/channels_seed.yaml`) Die Datei liegt bereits im Repository. Beim ersten Start werden bekannte Kanäle automatisch eingespielt: **Standardkanäle (verifiziert, PSK `AQ==`):** LongFast, LongSlow, MedFast **Community-Kanäle (PSK zu ergänzen):** MeshD, MeshDresden, MeshBerlin, MeshHH, MeshMUC, MeshRuhr, MeshSaxony **Sonderkanäle:** Emergency (Slot 0), TAC (SHORT_FAST) ## Implementierung - `database.py`: Tabelle `channels`, CRUD-Methoden, Seed-Import aus `channels_seed.yaml` - `webserver.py`: API-Routen, Seiten-Route `/channels` - `static/channels.html` + `static/js/channels.js` (inkl. djb2-Hash-Berechnung im Browser für Live-Frequenzanzeige) - `app.js`: Sidebar-Eintrag (Public) ## Datenschutz-Hinweis PSKs sind technisch öffentlich (wer den Kanal kennt, kennt den PSK), aber trotzdem standardmäßig maskiert dargestellt – bewusste Anzeige per Klick.
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#19
No description provided.