LoRaWAN zu BACnet: Funksensoren in ein BMS einbinden

LoRaWAN-Sensoren in ein BACnet/IP-BMS einbinden: eine Middleware liest den ChirpStack-MQTT-Stream und stellt decodierte Werte als BACnet-Objekte bereit.

LoRaWAN
Architektur

Der Datenfluss

Ein Gebäudemanagementsystem spricht BACnet/IP, ein LoRaWAN-Sensor nicht. Eine Middleware-Bridge sitzt dazwischen: Sie liest den ChirpStack-MQTT-Stream, nimmt die decodierten Werte und stellt sie als BACnet-Objekte bereit, die das BMS pollen kann. Diese Anleitung zeigt den ehrlichen Weg und eine funktionierende Node-RED-Bridge.

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.

Warum eine Bridge unvermeidbar ist

LoRaWAN und BACnet lösen unterschiedliche Probleme. LoRaWAN ist ein stromsparendes Funkprotokoll: Ein Sensor wacht auf, sendet ein paar kompakte Bytes und schläft. BACnet/IP ist ein kabelgebundenes Gebäudeautomations-Protokoll über Ethernet, das Geräte erwartet, die es finden und dauerhaft pollen kann. Zwischen beiden gibt es keine direkte Abbildung, also muss etwas dazwischensitzen, die LoRaWAN-Seite abonnieren und dem BMS ein BACnet-Gesicht zeigen. Dieses Etwas ist die Bridge, und das ehrlich vorwegzunehmen erspart die verbreitete Erwartung, ein Sensor "tauche einfach" im Gebäudemanagementsystem auf.

Der Datenfluss

Die Kette hat vier Stufen: Der Sensor sendet ein Uplink, ein Gateway leitet es an ChirpStack weiter, ChirpStack decodiert das Payload und veröffentlicht es über MQTT, und die Bridge verwandelt die decodierten Werte in BACnet-Objekte. Voraussetzung, damit die Bridge überhaupt etwas Nützliches tun kann, ist ein funktionierender ChirpStack-Payload-Decoder auf dem Device Profile, denn die Bridge liest das saubere object-Feld, nicht das rohe Hex.

Schritt 1: ChirpStack-MQTT-Stream

In der ChirpStack-Application unter Integrations die MQTT-Integration mit Marshaler auf JSON aktivieren. Jedes decodierte Uplink wird dann auf application/{ApplicationID}/device/{DevEUI}/event/up veröffentlicht, mit den decodierten Werten im object-Feld:

{
  "deviceInfo": {
    "deviceProfileName": "AM103",
    "deviceName": "office-201",
    "devEui": "24e124710c123456"
  },
  "object": { "temperature": 21.4, "humidity": 48, "co2": 720 }
}

Schritt 2: die Node-RED-Bridge

Die transparenteste Bridge ist Node-RED. Sie abonniert das ChirpStack-MQTT-Topic, liest msg.payload.object und schreibt jeden Wert in ein BACnet-Objekt. Ein kleiner Flow sieht so aus:

[ mqtt in: application/+/device/+/event/up ]
        │
        ▼
[ json ]  →  ChirpStack-Event parsen
        │
        ▼
[ function: map to BACnet points ]
        │
        ▼
[ bacnet out ]  →  Analog-/Binary-/Multi-state-Werte schreiben

Der Function-Node verwandelt das decodierte Objekt in die Datenpunkte, die das BMS liest. Die Instanznummer wird aus dem Gerät abgeleitet, damit jeder Sensor einen stabilen, nicht überlappenden Block von Objektinstanzen belegt:

// msg.payload ist das decodierte ChirpStack-Event
var obj = msg.payload.object;
var devEui = msg.payload.deviceInfo.devEui;

// stabiler Offset je Gerät (z. B. aus einer Lookup-Tabelle)
var base = deviceInstance[devEui] || 0;   // z. B. 100, 200, 300...

var points = [
  { type: "analogValue", instance: base + 0, value: obj.temperature, name: "temperature" },
  { type: "analogValue", instance: base + 1, value: obj.humidity,    name: "humidity" },
  { type: "analogValue", instance: base + 2, value: obj.co2,         name: "co2" }
];

// undefinierte Werte verwerfen, damit das BMS nie einen veralteten Datenpunkt liest
msg.payload = points.filter(function (p) { return p.value !== undefined; });
return msg;

Der quelloffene LoRaBAC-Flow folgt derselben Idee, nur mit einer JSON-Konfiguration, die jedes Payload-Feld einem BACnet-Objekt zuordnet und die Instanznummer je Gerät ableitet. Er arbeitet als BACnet-Client und schreibt bei jedem Uplink in einen bestehenden Controller, was den BACnet-Verkehr gering hält. Eine Gateway-residente Bridge (etwa Node-RED auf einem Milesight UG65) macht meist das Gegenteil: Sie betreibt einen kleinen BACnet-Server, sodass das BMS sie als natives Gerät findet und über BACnet/IP pollt.

Schritt 3: ein Objekt-Mapping, das das BMS versteht

Ein BMS erwartet Standard-Objekttypen, daher zählt das Mapping mehr, als es aussieht:

  • Analog Value / Analog Input für numerische Messwerte: Temperatur, Feuchte, CO2, Füllstand, Leistung.
  • Binary Value / Binary Input für An/Aus- und Kontaktzustände: Tür offen, Belegung, Leck erkannt.
  • Multi-state Value für diskrete Modi: Lüfter niedrig/mittel/hoch, Ventil offen/geschlossen/auto.

Gib jedem Gerät einen festen Instanzblock, damit die Datenpunkte stabil bleiben, wenn du Sensoren hinzufügst oder umbenennst. Der Integrator bindet diese Instanzen im BMS an Grafiken, Trends und Alarme.

Downlink: Befehle vom BMS

Bridging ist nicht streng nur lesend. Ein BACnet-Write (ein neuer Sollwert an einem WT102-Heizkörperventil etwa) kann zu einem LoRaWAN-Downlink werden. Der Haken ist das LoRaWAN-Timing: Ein Class-A-Gerät empfängt nur im kurzen Fenster nach seinem nächsten Uplink, ein Class-C-Gerät nahezu in Echtzeit. Zeitpläne, Sollwerte und Belegungsmodi funktionieren gut, aber das BMS kann keine sofortige Aktorik über eine batteriebetriebene Flotte erwarten. Die Bridge stellt den Downlink auf application/{ApplicationID}/device/{DevEUI}/command/down in die Warteschlange.

Stolpersteine aus der Praxis

  • Decoder zuerst: Die Bridge liest das decodierte object-Feld. Ohne funktionierenden Codec auf dem Device Profile gibt es nichts zu mappen, der Decoder ist also harte Voraussetzung.
  • Instanz-Kollisionen: Dieselbe BACnet-Instanz für zwei Geräte zu nutzen lässt das BMS Datenpunkte überschreiben. Jedem Gerät einen festen Block geben.
  • Topic-Template: Das ChirpStack-v4-Application-Event-Topic ist application/{ApplicationID}/device/{DevEUI}/event/up ohne Region-Präfix. Das eu868/-Präfix betrifft die Gateway-seitigen Topics, nicht diese Application-Events. Setzt du in der MQTT-Integration ein eigenes event_topic-Template, muss das Bridge-Abonnement exakt dazu passen, sonst kommt nichts an.
  • Veraltete Datenpunkte: Ein Sensor, der Uplinks verpasst, sollte nicht stillschweigend einen alten Wert halten. Mit einem Reliability-Flag oder Timeout arbeiten, damit das BMS einen veralteten Datenpunkt erkennt.
  • Server vs. Client: Früh entscheiden, ob die Bridge ein BACnet-Server ist, den das BMS pollt, oder ein Client, der in einen bestehenden Controller schreibt. Beide brauchen unterschiedliche Netz- und Firewall-Setups.

So betreibt merkaio das für dich

Wir betreiben ChirpStack und die BACnet-Bridge als einen Managed Stack auf europäischer Infrastruktur: den Decoder auf dem Device Profile, die MQTT-Integration, die Bridge-Middleware und das Objekt-Mapping. Der BMS-Integrator bekommt ein sauberes BACnet-Gerät mit dokumentierten, stabilen Datenpunkten statt einem Haufen Funk-Payloads. Sprich uns auf ChirpStack Managed Hosting inklusive Bridge an.

Häufige Fragen

Nein. LoRaWAN-Geräte senden kompakte Funk-Payloads, BACnet/IP ist ein kabelgebundenes Gebäudeprotokoll über Ethernet. Eine Middleware-Bridge dazwischen ist immer nötig, eine direkte Protokollabbildung gibt es nicht.
Sie liest den ChirpStack-MQTT-Stream, nimmt die decodierten Uplink-Werte und schreibt sie in BACnet-Objekte (Analog Value, Binary Value, Multi-state Value). Das BMS pollt diese Objekte dann, als kämen sie von einem nativen BACnet-Controller.
Beide Muster gibt es. Eine Gateway-residente Bridge präsentiert sich meist als BACnet-Server (Gerät), das das BMS findet und pollt. Der quelloffene LoRaBAC-Flow arbeitet als BACnet-Client und schreibt die Werte bei jedem Uplink in einen bestehenden Controller. Wir wählen die Variante, die zu deiner BMS-Topologie passt.
Ja, aber innerhalb der LoRaWAN-Grenzen. Ein BACnet-Write wird zu einem LoRaWAN-Downlink, der ein Class-A-Gerät erst nach dessen nächstem Uplink erreicht, ein Class-C-Gerät nahezu in Echtzeit. Zeitpläne und Sollwerte funktionieren, sofortige Aktorik über eine Batterieflotte nicht.
Numerische Messwerte (Temperatur, Feuchte, CO2) bilden auf Analog Value oder Analog Input ab, An/Aus- und Kontaktzustände auf Binary Value oder Binary Input, diskrete Modi auf Multi-state Value. Die Instanznummerierung wird je Gerät abgeleitet, damit das BMS stabile Datenpunkte sieht.
Ja. Wir betreiben ChirpStack und die BACnet-Bridge als Managed Hosting auf europäischer Infrastruktur, konfigurieren das Objekt-Mapping und übergeben dem BMS-Integrator ein sauberes BACnet-Gerät. Die Daten bleiben in deinem Eigentum.

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.