# ChirpStack Decoder Fehler beheben ## Problem ``` ERROR: UPLINK_CODEC description: "decodeUplink returned errors: Invalid payload length" ``` ## Lösung 1: Minimaler Decoder verwenden Der einfachste Weg ist, einen Decoder **ohne Validierung** zu verwenden: ### Schritt-für-Schritt: 1. **Öffne ChirpStack** 2. Gehe zu **Device Profiles** 3. Wähle dein Profil: `LILYGO_1_HC-SR04` 4. Klicke auf **Codec** Tab 5. Wähle **Codec:** `JavaScript` 6. **Lösche** alles im "Uplink decoder" Feld 7. **Kopiere** folgenden Code ein: ```javascript function decodeUplink(input) { var bytes = input.bytes; var distanceMm = (bytes[0] << 8) | bytes[1]; return { data: { distance_mm: distanceMm, distance_cm: distanceMm / 10.0, distance_m: distanceMm / 1000.0 } }; } ``` 8. **Speichere** das Device Profile 9. **Warte** auf die nächste Uplink-Nachricht (alle 30 Sekunden) ## Lösung 2: Decoder mit Debug-Informationen Falls Lösung 1 nicht funktioniert, verwende diesen Decoder mit Debug-Ausgabe: ```javascript function decodeUplink(input) { var bytes = input.bytes; var fPort = input.fPort; // Debug var hex = ""; for (var i = 0; i < bytes.length; i++) { hex += bytes[i].toString(16).padStart(2, '0'); } // Längenprüfung if (bytes.length !== 2) { return { errors: ["Expected 2 bytes, got " + bytes.length + ". Hex: " + hex + ", fPort: " + fPort] }; } // Dekodierung var distanceMm = (bytes[0] << 8) | bytes[1]; return { data: { distance_mm: distanceMm, distance_cm: distanceMm / 10.0, distance_m: distanceMm / 1000.0, raw_hex: hex, bytes_count: bytes.length, fPort: fPort } }; } ``` Dieser Decoder gibt dir zusätzliche Informationen, wenn ein Fehler auftritt. ## Lösung 3: Prüfe die Payload-Länge ### Mögliche Ursachen für "Invalid payload length": 1. **ChirpStack fügt zusätzliche Bytes hinzu** - Manche ChirpStack-Konfigurationen fügen MAC-Commands zur Payload hinzu 2. **Falsche fPort-Konfiguration** - Stelle sicher, dass fPort = 1 ist 3. **Alte Decoder-Version** - Lösche den alten Decoder komplett und füge den neuen ein ### Überprüfung im Serial Monitor: Schau im Serial Monitor nach, was tatsächlich gesendet wird: ``` Distanz gesendet: Distanz: 13.9 cm Distanz: 139.0 mm Nachricht übertragen. ``` Die Payload sollte genau 2 Bytes sein. ## Lösung 4: ChirpStack v3 vs v4 ### Für ChirpStack v4 (aktuell): ```javascript function decodeUplink(input) { // ... Code wie oben } ``` ### Für ChirpStack v3 (alt): ```javascript function Decode(fPort, bytes) { if (bytes.length !== 2) { return { error: "Invalid length" }; } var distanceMm = (bytes[0] << 8) | bytes[1]; return { distance_mm: distanceMm, distance_cm: distanceMm / 10.0, distance_m: distanceMm / 1000.0 }; } ``` **Wichtig:** ChirpStack v3 nutzt `Decode()`, v4 nutzt `decodeUplink()`! ## Testen des Decoders ### Im ChirpStack Web-Interface: 1. Gehe zu **Device Profile** → **Codec** 2. Scrolle nach unten zu **"Test decoder"** (falls vorhanden) 3. Gib ein: - **fPort:** `1` - **Payload (hex):** `008b` 4. Klicke auf **"Test"** **Erwartetes Ergebnis:** ```json { "data": { "distance_mm": 139, "distance_cm": 13.9, "distance_m": 0.139 } } ``` ## Was du in den Events sehen solltest Nach erfolgreicher Konfiguration siehst du unter **Device → Events**: ### Vorher (Fehler): ```json { "level": "ERROR", "code": "UPLINK_CODEC", "description": "decodeUplink returned errors: Invalid payload length" } ``` ### Nachher (Erfolg): ```json { "deviceName": "00000 - HC-SR04-1", "devEui": "70b3d57ed005a1b2", "fPort": 1, "data": "008b", "object": { "distance_mm": 139, "distance_cm": 13.9, "distance_m": 0.139 } } ``` ## Häufige Fehler ### 1. Decoder nicht gespeichert - ❌ Decoder eingefügt, aber nicht auf "Submit" geklickt - ✅ Immer auf "Submit" oder "Save" klicken! ### 2. Falsches Device Profile - ❌ Decoder im falschen Device Profile eingetragen - ✅ Prüfe, welches Profile dein Device nutzt ### 3. ChirpStack-Version verwechselt - ❌ `Decode()` in ChirpStack v4 verwendet - ✅ ChirpStack v4 braucht `decodeUplink()` ### 4. JavaScript-Fehler - ❌ Syntaxfehler im Decoder-Code - ✅ Code exakt wie oben kopieren ### 5. Alte Events angeschaut - ❌ Alte Uplink-Messages werden nicht neu dekodiert - ✅ Warte auf neue Uplink (alle 30 Sek) ## Schnelltest Kopiere diesen **Ultra-Minimal-Decoder** zum Testen: ```javascript function decodeUplink(input) { return { data: { distance_cm: ((input.bytes[0] << 8) | input.bytes[1]) / 10.0 } }; } ``` Wenn dieser funktioniert, kannst du ihn später durch einen ausführlicheren ersetzen. ## Support-Informationen sammeln Falls es immer noch nicht funktioniert, sammle diese Informationen: 1. **ChirpStack Version:** - Gehe zu ChirpStack → Klicke auf dein Logo/Avatar → "About" - Notiere die Version (z.B. "ChirpStack v4.8.0") 2. **Fehlermeldung:** - Kopiere die komplette Fehlermeldung aus den Events 3. **Device Profile Codec:** - Screenshot von Device Profile → Codec Einstellungen 4. **Payload:** - Notiere die `frm_payload` aus den Events (z.B. "008b") 5. **Serial Monitor:** - Kopiere die Ausgabe vom Arduino Serial Monitor Mit diesen Informationen kann das Problem eingegrenzt werden.