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.
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.
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
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/upohne Region-Präfix. Daseu868/-Präfix betrifft die Gateway-seitigen Topics, nicht diese Application-Events. Setzt du in der MQTT-Integration ein eigenesevent_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
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.
Ihr Ansprechpartner
Timo Wevelsiep
Gründer, merkaio
15 Minuten, unverbindlich, direkt mit Timo.
merkaio ist unabhängiger Integrator und nicht mit Milesight affiliiert.