Based on Pflichtenheft v2.2, documents the full system design including daemon, API, frontend, and infrastructure with agreed deviations (Axum 0.8, SQLx 0.8, Vite 6, Tailwind 4). Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
5.3 KiB
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:
- Öffne ChirpStack
- Gehe zu Device Profiles
- Wähle dein Profil:
LILYGO_1_HC-SR04 - Klicke auf Codec Tab
- Wähle Codec:
JavaScript - Lösche alles im "Uplink decoder" Feld
- Kopiere folgenden Code ein:
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
}
};
}
- Speichere das Device Profile
- 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:
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":
-
ChirpStack fügt zusätzliche Bytes hinzu
- Manche ChirpStack-Konfigurationen fügen MAC-Commands zur Payload hinzu
-
Falsche fPort-Konfiguration
- Stelle sicher, dass fPort = 1 ist
-
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):
function decodeUplink(input) {
// ... Code wie oben
}
Für ChirpStack v3 (alt):
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:
- Gehe zu Device Profile → Codec
- Scrolle nach unten zu "Test decoder" (falls vorhanden)
- Gib ein:
- fPort:
1 - Payload (hex):
008b
- fPort:
- Klicke auf "Test"
Erwartetes Ergebnis:
{
"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):
{
"level": "ERROR",
"code": "UPLINK_CODEC",
"description": "decodeUplink returned errors: Invalid payload length"
}
Nachher (Erfolg):
{
"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:
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:
-
ChirpStack Version:
- Gehe zu ChirpStack → Klicke auf dein Logo/Avatar → "About"
- Notiere die Version (z.B. "ChirpStack v4.8.0")
-
Fehlermeldung:
- Kopiere die komplette Fehlermeldung aus den Events
-
Device Profile Codec:
- Screenshot von Device Profile → Codec Einstellungen
-
Payload:
- Notiere die
frm_payloadaus den Events (z.B. "008b")
- Notiere die
-
Serial Monitor:
- Kopiere die Ausgabe vom Arduino Serial Monitor
Mit diesen Informationen kann das Problem eingegrenzt werden.