Daten als MQTT-Server verarbeiten

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.

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.