Simon Szustkowski

Ein Blog über alles, was mir gerade so durch den Kopf geht

Sep 4, 2017

Luftdaten: MQTT-Gateway für den Feinstaubsensor

Seit dem Chaos BBQ Geekend besitze ich einen Feinstaubsensor, der Teil des Luftdaten-Netzwerks ist. Dieser Sensor misst kontinuierlich die Feinstaubbelastung am Aufstellort und schickt sie an den API-Server des Projektes, sodass am Ende eine möglichst flächendeckende Abdeckung mit Sensoren eine möglichst genaue Belastungskarte generieren kann.

Die Sensoren kosten nicht viel, sind einfach selbst zusammengebaut, und sind, nach Auffassung einiger Masterarbeiten fast so genau wie die geeichten Sensoren, die ab und an in den Containern am Straßenrand stehen. Baut euch einen, sie sind sehr gut.

Neben dem API-Export zu Luftdaten und zu openSenseMap hat der Sensor, der übrigens einen ESP8266, bzw. eine nodeMCU als Zentraleinheit hat, die Möglichkeit, die Daten in eine eigene InfluxDB zu schmeißen, um die Daten dann entsprechend auszuwerten, ich habe mir hierzu beispielsweise ein nettes Grafana-Dashboard gebaut.

Grafana-Graph

Nun bin ich aber der Meinung, dass IoT-Geräte eigentlich auch MQTT sprechen sollten, weil es zum einen ein sehr einfaches Protokoll ist, und ich es zum anderen auch mit meinem Home Assistant würde auswerten können. Vorstellbar wäre z.B. rudimentär eine Benachrichtigung a la “Feinstaubbelastung gerade sehr hoch, bitte Fenster schließen!” - oder sogar, mit den passenden Aktoren, ein automatischer Schließvorgang.

Leider kann die Firmware des Feinstaubsensors von Haus aus kein MQTT. Die Entwickler finden es, aus welchen Gründen auch immer, zu kompliziert. Was aber möglich ist: Die Angabe eines eigenen HTTP-API-Endpoints, zu dem der Sensor dann die Daten, in JSON codiert, hinschaufelt.

Für jeden angeschlossenen physischen Sensor (in meinem Fall das Feinstaub-Messrohr und ein DHT22 Temperatur/Luftfeuchtigkeitssensor) werden 2 Daten an die API geschickt: Zum einen value_type, was die Art des Messwertes spezifiziert, und zum anderen value, was dann den eigentlichen Messwert übermittelt.

Was liegt also näher, als ein Gateway zu bauen, was diese Daten über HTTP annimmt, das JSON parsed, und dann MQTT-Nachrichten abschickt, mit value_type als Topic, und value als Payload? Ich hätte jetzt ein eigenes Script, komplett from scratch entwickeln können, aber wozu gibt es denn das mächtige Node Red, mit dem man Nachrichten mit Payloads durch diverse Aktionen durchlaufen lassen kann, die dann die Payload modifizieren und formatieren?

Ich habe mich also hingesetzt, und einen Flow gebaut. Er ist relativ simpel, aber aufgrund meines noch relativ großen Unwissens bezüglich Node Red und der Tatsache, dass der Sensor nur alls 150 Sekunden einen Messwert aufnimmt, und die API dann called, hat es sich alles etwas hingezogen.

Vielleicht landet ja der ein oder andere via Google hier, der auch gerne seine Feinstaubdaten über MQTT weiterverbreiten möchte, dem sei hier geholfen.

Node Red-Workflow

Man sieht, ein API-Hit spawned zum einen eine HTTP Response an den Client, und arbeitet dann die Daten auf, die übermittelt wurden. Für Extract sensordatavalues habe ich den JSON Path-Node nachinstalliert, der einen einfachen Zugriff auf JSON-Daten ermöglicht.

Im vorletzten Node, Modify topic habe ich das MQTT Topic angepasst, sodass alle Sensor-Topics als Subtopic von feinstaub/ auf dem MQTT Broker auftauchen. Wollt ihr einen anderes Superthema haben, müsst ihr den Node entsprechend anpassen.

Den Export-Code für den Flow habe ich hier für euch: