ChirpStack Payload Decoder: Von Hex zu sauberem JSON

ChirpStack-v4-Payload-Decoder schreiben: ein JS-Codec am Device-Profile, der LoRaWAN-Hex in sauberes JSON verwandelt, mit Milesight-Beispiel.

LoRaWAN
Architektur

Der Datenfluss

LoRaWAN-Geräte senden kompakte Binär-Payloads wie 0175640367AD00046873. Ein Payload-Codec macht aus diesem Hex strukturiertes JSON, das Dashboard, Regeln und Alarme wirklich nutzen können. So schreibst, hinterlegst und testest du einen in ChirpStack v4.

Sensor / Controller

Misst oder steuert vor Ort und sendet LoRaWAN-Uplinks.

LoRaWAN-Gateway

Empfängt die Funkpakete und reicht sie an den Server weiter.

ChirpStack

Network-Server: verwaltet Sessions und decodiert das Payload.

ThingsBoard / Grafana

Dashboards, Alarme, Regeln und Reports.

Was ein Payload-Codec macht

ChirpStack führt bei jedem Uplink eine kleine JavaScript-Funktion aus. Sie bekommt die rohen Bytes und gibt ein JSON-Objekt zurück. Die decodierten Werte stehen dann im Event-Stream (MQTT/HTTP) bereit und lassen sich an ThingsBoard, Grafana oder jede Anwendung weiterreichen. Dieselbe Codec-Datei enthält auch den Downlink-Encoder für steuerbare Geräte (Relais, Thermostate, Ventile).

Wo der Codec in ChirpStack v4 liegt

In ChirpStack v4 sitzt der Codec am Device-Profile, nicht am Gerät: Device Profiles, dein Profile, Codec, JavaScript-Funktionen. Jedes Gerät mit diesem Profile erbt den Decoder. Deshalb modellieren wir ein sauberes Profile pro Gerätetyp, statt Code pro Gerät einzufügen.

Die Decoder-Funktion

ChirpStack v4 erwartet eine decodeUplink(input)-Funktion. input.bytes ist ein Array von Byte-Werten; du gibst { data: { ... } } zurück. Milesight nutzt ein Channel-Format, wiederholt [Channel-ID][Channel-Type][Payload]:

function decodeUplink(input) {
  var bytes = input.bytes;
  var data = {};

  for (var i = 0; i < bytes.length; ) {
    var channel = bytes[i++];
    var type = bytes[i++];

    if (channel === 0x01 && type === 0x75) {          // Batterie (%)
      data.battery = bytes[i]; i += 1;
    } else if (channel === 0x03 && type === 0x67) {   // Temperatur, INT16 LE / 10
      data.temperature = readInt16LE(bytes, i) / 10; i += 2;
    } else if (channel === 0x04 && type === 0x68) {   // Feuchte, UINT8 / 2
      data.humidity = bytes[i] / 2; i += 1;
    } else {
      break;  // unbekannter Channel, abbrechen statt fehlzuparsen
    }
  }
  return { data: data };
}

function readInt16LE(b, i) {
  var v = (b[i + 1] << 8) | b[i];
  return v > 0x7fff ? v - 0x10000 : v;
}

Vor dem Vertrauen testen

Device Profiles, Codec, Test nutzen (oder den Events-Tab des Geräts bei einem Live-Uplink). Ein bekanntes Payload einfügen und das JSON prüfen:

Input  (hex): 0175640367AD00046873
Output (JSON): { "battery": 100, "temperature": 17.3, "humidity": 57.5 }

Sieht ein Wert falsch aus, liegt es fast immer an der Endianness (Milesight ist little-endian) oder einem Skalierungsfaktor (Temperatur durch 10, Feuchte durch 2).

Häufige Stolpersteine

  • Endianness: Milesight-Payloads sind little-endian. Mehrbyte-Werte in falscher Reihenfolge gelesen ergeben Unsinn.
  • Skalierungsfaktoren: Temperatur wird durch 10 geteilt, Feuchte durch 2. Ein fehlender Divisor ist der häufigste Decode-Bug.
  • Unbekannte Channels: Bei unbekanntem Channel abbrechen, statt den Rest des Payloads fehlzuparsen.
  • v3 zu v4: v3 nutzt eine andere Funktionssignatur und zeigte decodierte Daten als objectJSON. v4 zeigt sie direkt als object. Codecs und Converter zusammen migrieren.

Von Hex zum Dashboard

Sobald der Codec sauberes JSON zurückgibt, publiziert ChirpStack es über seine Integration. Von dort fließt es in dein Dashboard, siehe ChirpStack zu ThingsBoard. Wir schreiben, hinterlegen und betreiben den Codec für jedes Gerät als Teil des ChirpStack Managed Hosting.

Häufige Fragen

Die Logik ist identisch, aber v3 nutzt eine andere Funktionssignatur. Wir migrieren v3-Codecs im Rahmen eines Upgrades auf das v4-decodeUplink-Format.
Ja, für jedes LoRaWAN-Gerät mit dokumentierter Payload-Struktur. Wir bauen den Codec aus dem dokumentierten Payload-Format und bestätigen ihn in deinem Deployment.
Jede Geräteseite in unserer Milesight-Bibliothek liefert einen ChirpStack- und ThingsBoard-Decoder plus ein decodiertes Beispiel.
Ja. Die Codec-Datei enthält decodeUplink und eine encodeDownlink-Funktion, steuerbare Geräte (Relais, Ventile, Thermostate) nutzen denselben Codec für Befehle.
Ja. Der Codec liegt am Device-Profile, also erbt jedes Gerät mit diesem Profile denselben Decoder. Wir modellieren ein sauberes Profile pro Gerätetyp statt Code pro Gerät zu kopieren.

Sprechen wir über Ihre Infrastruktur. Digital und vor Ort.

Ob IoT-Plattformentwicklung, Hardwareauswahl, Managed Hosting für ChirpStack, ThingsBoard, Grafana oder NetBird VPN, oder Migration von einem Self-Hosted-Setup - wir finden die passende Lösung für Ihren Anwendungsfall. Buchen Sie ein kostenloses 30-Minuten-Gespräch, unverbindlich.

Timo Wevelsiep

Ihr Ansprechpartner

Timo Wevelsiep

Gründer, merkaio

15 Minuten, unverbindlich, direkt mit Timo.

Mit dem Absenden stimmen Sie unserer Datenschutzerklärung zu.

merkaio ist unabhängiger Integrator und nicht mit Milesight affiliiert.