ChirpStack zu ThingsBoard: Decodierte LoRaWAN-Uplinks weiterreichen

ChirpStack mit ThingsBoard verbinden: MQTT-Integration, Uplink-Converter, Geräte-Zuordnung per DevEUI und Downlink-Steuerung mit echtem v4-Event-JSON.

LoRaWAN
Architektur

Der Datenfluss

ChirpStack decodiert deine LoRaWAN-Payloads, ThingsBoard macht daraus Dashboards, Alarme und Steuerung. Dieser Guide zeigt den kompletten Weg: MQTT-Integration, Uplink-Converter, Geräte-Zuordnung per DevEUI und Downlink-Steuerung zurück ans Gerät, mit echtem v4-Event und einsatzfertigen Convertern.

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.

So sieht ein ChirpStack-v4-Uplink aus

ChirpStack hat das Payload bereits decodiert, die Werte stehen im Feld object. Genau dieses Feld mappt ThingsBoard auf Telemetrie. Voraussetzung ist ein funktionierender Payload-Codec im Device-Profile.

{
  "deviceInfo": {
    "applicationId": "00372e31-0620-4671-8270-237632a4e227",
    "applicationName": "cold-chain",
    "deviceProfileName": "EM300-TH",
    "deviceName": "kuehlhaus-01",
    "devEui": "24e124136b502217"
  },
  "fPort": 85,
  "fCnt": 128,
  "data": "AXVkA2etAARoSw==",
  "object": { "battery": 100, "temperature": 17.3, "humidity": 57.5 },
  "rxInfo": [{ "gatewayId": "24e124fffef54092", "rssi": -51, "snr": 13.8 }],
  "txInfo": { "frequency": 868100000 }
}

Schritt 1: ChirpStack-Integration

In der ChirpStack-Application unter Integrations die MQTT- (oder HTTP-) Integration aktivieren, Marshaler auf JSON. Jedes Uplink-Event wird dann auf application/{ApplicationID}/device/{DevEUI}/event/up publiziert.

Schritt 2: Uplink-Converter in ThingsBoard

Der schnellste Weg: beim Anlegen des Converters den Integrationstyp ChirpStack wählen, ThingsBoard liefert einen vorausgefüllten Decoder samt extrahierter Metadaten. Generisch und transparent geht es so:

// payload = ChirpStack-Event (JSON), metadata = auto-extrahierte Felder
var data = decodeToJson(payload);

var result = {
  deviceName: data.deviceInfo.devEui,             // stabiler, eindeutiger Schluessel
  deviceType: data.deviceInfo.deviceProfileName,  // z. B. "EM300-TH"
  attributes: {
    applicationName: data.deviceInfo.applicationName,
    fPort: data.fPort
  },
  telemetry: {
    ts: new Date(data.time).getTime(),
    values: data.object                           // decodierte Werte 1:1 durchreichen
  }
};

// Signalqualitaet als Telemetrie (optional, aber praxisnah)
if (data.rxInfo && data.rxInfo.length > 0) {
  result.telemetry.values.rssi = data.rxInfo[0].rssi;
  result.telemetry.values.snr  = data.rxInfo[0].snr;
}

return result;

ThingsBoard legt das Gerät bei der ersten Nachricht automatisch an und identifiziert es über die DevEUI, nicht über den Anzeigenamen. So bleibt die Zuordnung stabil, auch wenn du Geräte umbenennst.

Schritt 3: MQTT-Integration verbinden

Eine ThingsBoard-MQTT-Integration anlegen, die sich mit dem ChirpStack-Broker verbindet und application/+/device/+/event/up abonniert. Den Uplink-Converter aus Schritt 2 zuweisen, fertig fließen die Daten in Latest Telemetry.

Downlink: Steuerung zurück ans Gerät

Für steuerbare Geräte (UC300-Relais, WT102-Thermostat) baust du einen Downlink-Converter. Er übersetzt eine ThingsBoard-RPC oder eine Änderung an einem Shared-Attribute in einen ChirpStack-Downlink-Enqueue:

// Ausgeloest ueber die Rule Engine (Integration-Downlink-Node).
// metadata traegt die Ziel-DevEUI und ApplicationID.
var fPort = 85;
var payloadBase64 = msg.dataBase64;   // dein encodierter Befehl, Base64

var result = {
  contentType: "JSON",
  data: JSON.stringify({
    devEui: metadata.devEui,    // muss zur DevEUI im Topic passen
    confirmed: false,
    fPort: fPort,               // muss groesser 0 sein
    data: payloadBase64         // Base64; ChirpStack verschluesselt vor dem Senden
  }),
  metadata: {
    topic: "application/" + metadata.applicationId +
           "/device/" + metadata.devEui + "/command/down"
  }
};

return result;

Getriggert wird der Downlink in der Rule-Chain über einen Integration-Downlink-Node. Wichtig: Bei Class-A-Geräten wird der Downlink erst im RX-Fenster nach dem nächsten Uplink zugestellt, bei Class C (z. B. UC300) nahezu sofort.

ThingsBoard PE/Cloud vs. Community Edition

Integrations und Data-Converter sind ein Feature der Professional Edition und von ThingsBoard Cloud. In der Community Edition gibt es sie nicht: dort reichst du die Daten über ChirpStacks HTTP-Integration an die ThingsBoard-HTTP-Device-API weiter oder setzt eine kleine Bridge davor. Für steuerbare Multi-Tenant-Setups setzen wir auf PE und betreiben beides als ThingsBoard Managed Hosting neben dem ChirpStack Hosting; für reine Datenerfassung reicht oft CE.

Stolpersteine aus der Praxis

  • Region-Prefix: Die ChirpStack-v4-Default-Config stellt der Topic-Struktur die Region voran (z. B. eu868/application/...). Abonnierst du nur application/#, kommt nichts an. Entweder mit Prefix abonnieren oder den Prefix in der chirpstack.toml entfernen.
  • v3 zu v4: Decodierte Daten liegen in v4 im Objekt object, früher im String objectJSON. Alte Converter mit JSON.parse(data.objectJSON) brechen.
  • DevEUI als Schlüssel: Geräte über devEui zuordnen, nicht über den Namen.
  • fPort größer 0: Downlinks mit fPort 0 werden abgewiesen.

Häufige Fragen

v4 wird empfohlen, das Event-Format ist sauberer (die decodierten Werte stehen im Feld object statt im String objectJSON). v3-Converter migrieren wir im Zuge eines Upgrades.
MQTT, wenn ThingsBoard und ChirpStack denselben Broker erreichen, das ist stabiler und bidirektional. HTTP, wenn nur ein Push über Firewall-Grenzen möglich ist.
Über die DevEUI im Event. Der Uplink-Converter gibt sie als deviceName zurück, ThingsBoard legt neue Geräte beim ersten Kontakt automatisch an.
Ja, über einen Downlink-Converter und den Integration-Downlink-Node. Für Class-C-Geräte wie den UC300 gilt der Befehl nahezu sofort, für Class A nach dem nächsten Uplink.
Ja, beides als Managed Hosting auf europäischer Infrastruktur, inklusive Integration und Convertern. Die Datenhoheit bleibt bei dir.

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.