Christian Mueller e706b22f31 Add design specification for LoRaWAN Web Portal
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>
2026-03-19 22:27:49 +01:00

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:

  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:
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
    }
  };
}
  1. Speichere das Device Profile
  2. 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":

  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):

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:

  1. Gehe zu Device ProfileCodec
  2. Scrolle nach unten zu "Test decoder" (falls vorhanden)
  3. Gib ein:
    • fPort: 1
    • Payload (hex): 008b
  4. 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:

  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.