Im Rahmen meiner Artikelserie Mein Weg in das IoT habe ich unter anderem das ESP32 Pico Kit verwendet, um Sensordaten an verschiedene Cloud-Plattformen zu senden. Dort lassen sich auf personalisierten Webseiten, die die Nutzer selbst anpassen können, die Daten der eigenen Sensoren visualisieren. Es ist durchaus möglich, Millionen Sensoren zu registrieren, wie zum Beispiel bei der Cloud-Plattform Amazon Web Services (siehe Folge 25), die auch Industriekunden anspricht. Es liegt auf der Hand, dass hier eine zuverlässige Verschlüsselung Pflicht ist. In Folge 25 haben wir gezeigt, wie ein ESP32 über TLS und das darauf aufsetzende Secure MQTT Sensorwerte zu den AWS senden kann.

Sensordaten open source

Die Cloudplattform, die ich in diesem Artikel ausprobiere, verfolgt einen ganz anderen Zweck. Die Sensordaten, die gesammelt und visualisiert werden, sollen ausdrücklich öffentlich zugänglich sein. Um Schüler für Umweltmesstechnik (oder auch ganz allgemein für Forschung und Technik) zu begeistern, hat das Institut für Geoinformatik der Uni Münster vor einigen Jahren ein Hardwarekit zusammengestellt, das ein Arduino-Board und verschiedene Sensoren enthält. Von der SenseBox gibt es mittlerweile sogar eine allgemein erhältliche Variante, mit der jeder Interessierte Sensordaten erfassen kann. Als Cloudplattform wurde openSenseMap entwickelt. Nach einer einfachen Anmeldung können User hier Daten hochladen und allgemein zugänglich veröffentlichen; alle SenseBoxen werden auf einer Karte angezeigt, die auf OpenStreetMap basiert. Doch benötigt man nicht unbedingt die dezidierte SenseBox-Hardware, es lassen sich auch Daten, die mit einem anderen Board erfasst wurden, ins Internet versenden. openSenseMap stellt eine sogenannte REST-Schnittstelle bereit, über die sich Daten hochladen und auch abrufen lassen. Zum Veröffentlichen von Sensordaten schickt man die Messwerte mit dem HTTP-Protokoll zum Server. Prima für Einsteiger: Bei der Registrierung einer SenseBox bekommt man einen Sketch zugeschickt, der Daten nach dieser Methode versenden kann. Man muss diesen nur noch um das Auslesen der eigenen Sensoren ergänzen. Eine gute Anleitung für Anfänger findet man unter https://edu.books.sensebox.de.

Doch HTTP ist nur eine Möglichkeit, Messwerte auf openSenseMap zu veröffentlichen. Es geht auch via MQTT, und Sie ahnen vielleicht schon, dass ich mich für diesen Weg entschieden habe. Im Unterschied zu den bisher von mir getesteten Cloud-Plattformen bringt openSenseMap allerdings keinen eigenen MQTT-Broker mit, sondern nur einen MQTT-Client. Dieser abonniert die Sensornachrichten unter einem vom Nutzer zu bestimmenden Topic bei einem öffentlich zugänglichen Broker, den der User ebenfalls selbst wählen muss.

Nach der Registrierung unter https://opensensemap.org und dem Anlegen eines ersten Geräts (das auch in meinem Fall „senseBox“ genannt wird), musste ich die entsprechenden Angaben unter dem Menüpunkt Edit -> MQTT eintragen.

Wie der Screenshot zeigt, habe ich mich für den schon öfter genutzten Mosquitto-Testbroker (test.mosquitto.org) und das Topic „/ElektorMyJourneyIoT/SenseBox/light“ entschieden.



Meine SenseBox habe ich „LIGHT_ESP32“ genannt, als Messgröße (des einzigen enthaltenen Sensors) „Light“ und als Einheit „RAW“ gewählt. Letzteres deswegen, da ich keinen kalibrierten Lichtsensor nutze, sondern nur Rohdaten eines ADCs ins Internet sende.

Demoprojekt

Als Hardware kam das ESP32 Pico Kit samt roter Test-LED, einer RGB-LED zur Anzeige der Verbindungszustände sowie einem Fotowiderstand an Pin 36 zum Einsatz; die Hardware und die Hauptfunktion der Software werden in Folge 23 beschrieben. Als Grundlage für meinen ESP32-Arduino-Sketch habe ich die Software aus Folge 25 (Amazon Web Services) meiner Artikelserie verwendet. Ich musste allerdings folgende Veränderungen vornehmen:
  1. Statt TLS und Secure MQTT kommt jetzt wieder einfaches TCP und MQTT zum Einsatz, es werden deshalb die Klassen TCPClient und MQTTClient statt TCPClientSecure und MQTTClientSecure benutzt.
  2. Beim Verbinden mit dem MQTT-Broker wird aus demselben Grund nun der Port 1883 statt 8883 benutzt. Die Broker-Adresse ist wie gehabt vom User über das Webformular einzugeben (ausführlich ist der ESP32-Webserver und das von ihm ausgelieferte Konfigurationsformular in den Folgen 19 bis 22 beschrieben). Als Client-ID wird die Device-ID aus dem Webformular genutzt. Die Client-ID hat bei openSenseMap nur eine untergeordnete Bedeutung, ich habe hier „ElektorMyJourneyIoT“ gewählt. Hinweis: Diese Device-ID sollte nicht mit der ID der ganzen SenseBox verwechselt werden (letztere habe ich in meiner Software nicht genutzt).
  3. Die Funktion void SendSensorDateToxxx(String SensorName, byte SensorDate)
    heißt jetzt void PublishSensorDate(String SensorName, byte SensorDate).
    Hier werden das Topic und die Payload der MQTT-Nachricht zusammengesetzt, mit der der Sensorwert veröffentlicht wird. Da jede Cloudplattform ein spezifisches Format für beide Angaben verlangt, waren hier die meisten Änderungen nötig.
Bei openSenseMap ist das Topic ja wahlfrei, ich habe hier wie schon oben gezeigt „/ElektorMyJourneyIoT/SenseBox/light“ benutzt. Als Payload muss allerdings ein JSON-Ausdruck nach einem bestimmten Muster verwendet werden. Hier ist (als einziges kleines Geheimnis, das zur Sicherheit beiträgt) die Sensor-ID mitzugeben, die man von openSenseMap nach der Registrierung der SenseBox und des Sensors zugeteilt bekommen hat. Die Payload wird nach folgendem Muster zusammengebaut:
 
{“SENSORID“:“VALUE“}

VALUE ist der Messwert. Bei reinen Zahlen kann man die Anführungszeichen auch weglassen, eine gültige Payload würde zum Beispiel lauten:
 
{“5bf000000000000000341“:30}

Die von meinem ADC gesammelten Digitalwerte (Spannung am Fotowiderstand) bewegen sich zwischen 0 und 4095, was ich durch Bitshift auf 0…63 reduziert habe.



Im Screenshot sieht man das Ergebnis meiner Bemühungen. Aus Datenschutzgründen habe ich den Standort meiner Sensorbox etwas von meinem Homeoffice zum Bahnhof Köln-Ehrenfeld hin verlegt. In der Nähe ist übrigens die SenseBox einer Schule zu erkennen, mit der Wetterdaten gesammelt werden. Das ganze Konzept von openSenseMap gefällt mir: Hier erfassen Bürger Umweltdaten für Bürger. Doch auch die Kartendarstellung ist gelungen. Messwerte werden in einem Diagramm dargestellt. Die Zoomfunktion erlaubt es, sich besonders interessante Abschnitte der Messwertkurve näher anzusehen (hier die Lichtverhältnisse bei wechselnder Bewölkung am frühen Nachmittag).

Übrigens: Falls Sie selbst eine kleine Wetterstation betreiben wollen, die Messwerte auf openSenseMap veröffentlicht, kann Elektor helfen. In Ausgabe 1-2/2019 unserer Zeitschrift ElektorLabs findet man das Projekt „Wetterstation mit ESP32“. In unserem Shop werden dann alle Teile einer Wetterstation (nebst Wind- und Regenmesser) sowie ein Bausatz für ein ESP32-basiertes Controllerboard angeboten. Das Ganze ist bereits dafür vorbereitet, Daten auf openSenseMap zu veröffentlichen.

Flexibel einzusetzende Software

Der Artikel könnte hier an dieser Stelle enden. Allerdings fand ich es nicht schön, Ihnen wieder mitteilen zu müssen, dass Sie den Sketch zwar herunterladen können, aber dann manuell anpassen müssen, indem Sie Ihre Sensor-ID eintragen. Außerdem wollte ich nicht beim Programmieren eines neuen Sketches jedes Mal die Funktion, in der das Topic und die Payload für die Nachricht zusammengestellt werden, spezifisch für jede Cloudplattform anpassen (ich bin ja neugierig, weitere kennenzulernen).

Ich habe das Konfigurationsformular deshalb auf insgesamt 7 Einträge erweitert (zuzüglich zum ersten Eintrag, mit dem man die rote LED zu Testzwecken steuern kann). Neben den bereits bekannten Parametern SSID, PASSWORD, BROKER ADDRESS und DEVICE ID findet man nun auch einen weiteren Parameter SENSOR ID/TOKEN sowie die Einträge TOPIC und PAYLOAD. Bei DEVICE ID geben Sie ein, welche Client-ID beim Verbindungsaufbau mit dem MQTT-Broker verwendet werden soll, in unserem Fall ist das einfach „ElektorMyJourneyIoT“. Bei SENSOR ID geben Sie die Sensor-ID ein, die Sie von openSenseMap erhalten haben.

Das Topic und die Payload jeder Nachricht werden bei jeder Cloud-Plattform aus den obengenannten Parametern und dem Sensorwert zusammengesetzt. Um dies allgemein formulieren zu können, habe ich mir eine kleine Codierung überlegt. Der Ausdruck $D$ wird durch die eingegebene Device/Client-ID, der Ausdruck $S$ durch die Sensor-ID ersetzt. $V$ wird hingegen durch den Messwert und $N$ durch den einfachen Sensornamen (in meinem Fall „light“) ersetzt, den wir der Funktion void PublishSensorDate(String SensorName, byte SensorDate) mitgeben. Darüber hinaus werden #-Zeichen durch Anführungszeichen ersetzt.

In unserem Fall ist als PAYLOAD im Webformular einzugeben:
{#$S$#:$V$}

Die Funktion PublishSensorDate macht daraus dann einen Ausdruck wie zum Beispiel:
{“5bf…341“:30}

Für TOPIC konnte ich nun im Webformular angeben:
/$D$/SenseBox/$N$
um „/ElektorMyJourneyIoT/SenseBox/light“ zu erhalten.

Falls Sie meine Versuche nachvollziehen möchten, gehen Sie wie folgt vor:
  1. Bauen Sie die Hardware wie in Folge 23 beschrieben nach, das ESP32 Pico Kit gibt es bei uns im Shop.
  2. Laden Sie die Software unten auf der Seite herunter, kompilieren Sie den Sketch und laden ihn auf das Board.
  3. Verbinden Sie sich mit dem vom ESP32 aufgespannten Webserver und rufen Sie 192.168.4.1 im Browser auf (etwa auf dem Smartphone). Geben Sie die SSID und das Passwort Ihres Routernetzwerks ein, dazu die Brokeradresse test.mosquitto.org und als Topic den obengenannten Ausdruck. Nach dem Abschicken müsste sich der ESP32 mit dem Testserver verbinden und bereits Nachrichten verschicken, was Sie am grünen Blinken der RGB-LED erkennen.
  4. Registrieren Sie sich bei openSenseMap und erhalten Sie die Sensor-ID. Konfigurieren Sie MQTT bei Ihrer „SenseBox“ wie im Screenshot ganz oben gezeigt. Nun verbinden Sie sich wieder mit dem ESP32-Webformular und geben die Sensor-ID sowie als Payload den oben genannten Ausdruck ein.
  5. Der ESP32 schickt nun Sensordaten ins Netz, die von openSenseMap.org abgerufen und visualisiert werden.

Viel Spaß beim Experimentieren mit openSenseMap!