|
| 1 | += ADR-006: JSON Output Schema Refinement |
| 2 | +:toc: macro |
| 3 | +:toc-title: Inhaltsverzeichnis |
| 4 | + |
| 5 | +== Status |
| 6 | +* **Status:** Proposed |
| 7 | +* **Datum:** 2026-01-11 |
| 8 | +* **Architecture Owner:** Roo (Architect) |
| 9 | + |
| 10 | +== Kontext |
| 11 | +Das bestehende JSON-Output-Schema für decodierte Funksignale (von `DecodedMessage` abgeleitet) enthält die Protokoll-Preamble (z.B. `W125#`) als Präfix im Feld `payload`. Dies erschwert die automatische Verarbeitung durch Downstream-Systeme (wie MQTT-Clients oder andere FHEM-Module), da diese die Preamble manuell entfernen müssen, um an die reinen Nutzdaten zu gelangen. Des Weiteren fehlt eine standardisierte Möglichkeit, protokollspezifische Metadaten (wie Protokollname, Format, Taktfrequenz) im Output bereitzustellen, ohne diese in der allgemeinen `metadata`-Struktur zu verstecken. |
| 12 | + |
| 13 | +== Entscheidung |
| 14 | +Wir werden das JSON-Output-Schema von `DecodedMessage` wie folgt anpassen: |
| 15 | +1. **Nutzdaten-Bereinigung:** Die Protokoll-Preamble wird aus dem Nutzdatenfeld entfernt. Dieses Feld enthält nur noch die vom Protokolldecoder erzeugten reinen Daten (Hex- oder Bit-String). |
| 16 | +2. **Hinzufügen des `protocol` Feldes:** Ein neues Feld `protocol` vom Typ `dict` wird zur `DecodedMessage` hinzugefügt, um strukturierte, protokollspezifische Informationen zu enthalten. |
| 17 | + |
| 18 | +Die Umbenennung des Nutzdatenfeldes von `payload` zu `data` sowie die Einführung des Feldes `raw` (für die ursprüngliche Nachricht) sind in link:ADR-007-data-and-raw-fields.adoc[ADR-007] dokumentiert, das dieses Schema ergänzt und präzisiert. Dieses ADR dient als Grundlage für die Einführung des `protocol`-Feldes und die Bereinigung des Nutzdateninhalts. |
| 19 | + |
| 20 | +=== Details zur neuen Struktur (Präzisiert durch ADR-007) |
| 21 | + |
| 22 | +| Feld | Typ | Beschreibung | |
| 23 | +|---|---|---| |
| 24 | +| `protocol_id` | `str` | Die numerische oder alphanumerische ID des erkannten Protokolls. | |
| 25 | +| `data` | `str` | Die bereinigten Nutzdaten **ohne** Preamble und Postamble (ersetzt `payload`). | |
| 26 | +| `raw` | `str` | Die ursprüngliche, unveränderte Nachricht vom Signalduino (z.B. `MU;...`). | |
| 27 | +| `protocol` | `dict` | Strukturierte Metadaten des Protokolls. | |
| 28 | +| `protocol.id` | `str` | Die ID des Protokolls (Redundanz zur einfachen Konsumierbarkeit). | |
| 29 | +| `protocol.name` | `str` | Der menschenlesbare Name des Protokolls (aus `protocols.json`). | |
| 30 | +| `protocol.preamble` | `str` | Die Preamble des Protokolls (z.B. `W125#`). | |
| 31 | +| `protocol.format` | `str` | Das Format des Signals (z.B. `manchester`, `twostate`, `2-FSK`) (aus `protocols.json`). | |
| 32 | +| `protocol.clock` | `int`/`float` | Der Clock-Wert, der für die Demodulation verwendet wurde (entweder `clockabs` oder `clockrange` Mittelwert/demodulierter Takt). | |
| 33 | +| `protocol.modulation` | `str` | (Optional) Modulationsart (z.B. `2-FSK`, `GFSK`) für FSK-Protokolle. | |
| 34 | + |
| 35 | +=== Beispiel für die Datenstruktur (Präzisiert durch ADR-007) |
| 36 | + |
| 37 | +[source,json] |
| 38 | +---- |
| 39 | +{ |
| 40 | + "data": "30E0A1AA4241DE6C000200000BC5", |
| 41 | + "raw": "MC;LL=-1017;LH=932;...", |
| 42 | + "protocol_id": "125", |
| 43 | + "metadata": { |
| 44 | + "rssi": -74, |
| 45 | + "freq_afc": 123 |
| 46 | + }, |
| 47 | + "protocol": { |
| 48 | + "name": "WH31", |
| 49 | + "id": "125", |
| 50 | + "preamble": "W125#", |
| 51 | + "format": "2-FSK", |
| 52 | + "clock": 17257 |
| 53 | + } |
| 54 | +} |
| 55 | +---- |
| 56 | + |
| 57 | +== Konsequenzen |
| 58 | +**Positiv:** |
| 59 | +* Das `data`-Feld ist jetzt "sauber" und enthält nur die Nutzdaten. |
| 60 | +* Protocolspezifische Metadaten sind standardisiert im `protocol`-Feld abrufbar. |
| 61 | +* Vereinfacht die Integration mit Systemen, die strukturierte Daten erwarten. |
| 62 | +* Das neue `raw`-Feld (siehe link:ADR-007-data-and-raw-fields.adoc[ADR-007]) ermöglicht besseres Debugging und vollständige Nachvollziehbarkeit. |
| 63 | + |
| 64 | +**Negativ:** |
| 65 | +* Dies ist ein **Breaking Change** für alle existierenden Konsumenten des `DecodedMessage`-Outputs, die darauf angewiesen sind, dass die Preamble im `payload` enthalten ist. |
| 66 | +* Alle Demodulations- und Parser-Logik muss angepasst werden, um die Preamble separat zu behandeln und das `protocol`-Feld sowie das neue `raw`-Feld zu befüllen. |
| 67 | + |
| 68 | +== Alternativen |
| 69 | +1. **Preamble in `metadata` verschieben:** Hätte den Nutzdatenfeld gereinigt, aber die Protokolldetails weiterhin unstrukturiert gelassen. Abgelehnt, da ein dediziertes `protocol`-Feld die semantische Klarheit verbessert. |
| 70 | +2. **Beibehaltung der alten Struktur:** Hätte Abwärtskompatibilität gewährleistet, aber die Notwendigkeit für eine Nutzdatenreinigung durch jeden Konsumenten beibehalten. Abgelehnt, da die verbesserte Struktur die Wartbarkeit und zukünftige Erweiterbarkeit deutlich erhöht. |
0 commit comments