Daten als MQTT-Server verarbeiten

Das connect-Gateway unterstützt die Kommunikation via MQTT. Dabei kann das connect-Gateway als Client oder Server agieren. In diesem Beitrag zeigen wir, wie man Daten per MQTT in das connect-Gateway lädt. Hier fungiert das connect-Gateway als MQTT-Server.
Das MQTT-Protokoll ist ein sehr verbreitetes Internet-of-Things (IoT) Protokoll. Daher nutzen alle großen IoT-Plattformen diese Technologie und viele Komponenten und Sensoren können es sprechen. Auch im Industrial-IoT (IIoT) findet es Anwendung.
Inhaltsverzeichnis
Verbindung aufbauen
Für unser Beispiel haben wir eine Reihe von ZigBee-Temperatur-Seonsoren, die über Zigbee2MQTT Daten an einen MQTT-Server übermitteln können. Also richten wir das connect-Gateway so ein, dass die Daten dorthin gesendet werden.
Wir haben die ZigBee-Bridge auf einem alten Raspberry PI im Heizungskeller installiert. Um die Konfiguration leicht zuordnen zu können, richten wird einen neuen Endpoint
“Heizung_ZigBee” ein.
<endpoint> <name>Heizung_ZigBee</name>
Als Protokoll-Plugin richten wir einen MQTT-Server ein, der auf Port 1886 auf Verbindungen lauschen soll.
<protocol plugin="MQTT_SERVER"> <name>ZigBee_MQTT</name> <parameters> <param key="port">1886</param> </parameters>
Dieser Endpoint verwendet einen passiven Trigger
, da hier darauf reagiert wird, dass Daten vom MQTT-Client zu unserem Server als Publish gesendet werden. Also verhält sich der MQTT-Server in diesem Sinne passiv.
<trigger> <passive /> </trigger>
Daten empfangen
Dieser Endpoint ist ein Producer
, da hier Daten für das connect-Gateway erzeugt und im Dataspace
abgelegt werden. Der Producer ist ein Aqara Temperature and Humidity Sensor, der auf dem MQTT-Topic heizung/aqara-1
seine Daten übermittelt.
<producer> <name>heizung_aqara-1</name> <parameters> <param key="topic">heizung/aqara-1</param> </parameters>
Die Daten werden im JSON-Format über das Topic gesendet. Also definieren wir einen JSON-Decoder
, um die entsprechenden Datenpunkte aus dem JSON-Dokument zu extrahieren.
<decoder plugin="JSON_DECODER">
Aus den hier gezeigten Rohdaten im JSON-Format wollen wir den Temperatur-Wert extrahieren.
{ "battery": 100, "voltage": 3005, "temperature": 25.22, "humidity": 69.37, "pressure": 1006, "linkquality": 94 }
Um die Temperaturangabe aus den Rohdaten zu extrahieren definieren wir ein Mapping
innerhalb des JSON-Decoders. Das Mapping extrahiert ein Attribut und speichert den Wert in einen Datapoint
.
Im Mapping geben wir den Datapoint /home/heizungskeller/temperatur
an, den wir im Vorfeld definiert haben. Zusätzlich legen wir mit Hilfe des path
den JSON-Pfad innerhalb des JSON-Dokuments fest. So selektieren wir das gewünschte Attribut innerhalb der JSON-Struktur.
<mapping> <datapoint>/home/heizungskeller/temperatur</datapoint> <parameters> <param key="path">temperature</param> </parameters> </mapping>
Die Konfiguration weiterer Datenpunkte erfolgt nun analog. Für unterschiedliche Sensoren, werden eigene Topics verwendet. Mit Hilfe des JSON-Decoders können dann die interessanten Attribute extrahiert und einen Datapoint abgelegt werden.
Der Datapoint wird hierbei nun jedesmal aktualisiert, wenn der MQTT-Client über das Topic neue Daten sendet.
Zusammenfassung
Mit dieser einfachen Konfiguration kann man mit dem connect-Gateway Daten von MQTT-Clients einsammeln. Die extrem flexiblen Möglichkeiten als MQTT-Server zu agieren und auf beliebige Topics zu lauschen macht die Stärken des connect-Gateways aus.