Für die ersten Schritte im Internet der Dinge genügen ein Raspberry Pi und ein Sensor. Die passende Open-Source-Software von der Eclipse Foundation überwacht dann das Klima im Gewächshaus, lauscht dem Lärm der benachbarten Autobahn oder meldet den fallenden Wasserstand im Aquarium.
Damit die zarten Tomatenpflanzen den heißen Sommer unbeschadet überstehen, sollten Hobbygärtner das Klima in ihrem Gewächshaus überwachen. Den Gang zum Thermometer erspart sich, wer Sensoren ins lokale Netz integriert.
Aber nicht nur im Garten, sondern auch bei der Gerätesteuerung im Haus, in der Industrie und im Handel tauschen zunehmend Sensoren, Aktoren und andere eher schlichte Geräte Informationen aus. So optimieren etwa Hersteller ihre Produktionsabläufe, während die Heizung im Winter nur anspringt, wenn die Temperatur unter 10 Grad fällt.
Bausteine
Ein solches Internet of Things zu bauen möchte die Eclipse Foundation vereinfachen und vorantreiben. Dazu entstehen im Rahmen des Eclipse-IoT-Projekts [1] zahlreiche Frameworks und Softwarekomponenten. Wie Sensoren und andere IoT-Geräte tatsächlich praktische Anwendungen ins Internet bringen, will der Artikel anhand einer Gewächshausüberwachung testen. Autobahnlärm und Wasserstand im Aquarium lassen sich auf gleiche Weise prüfen – es erfordert lediglich andere Sensoren.
Die Grundlage bildet ein Raspberry Pi [2], an dessen GPIO-Schnittstelle die Sensoren andocken. Der Pi stellt genügend Rechenleistung für Experimente bereit, bietet eine Entwicklungsumgebung und ist weit verbreitet. Zudem steht die benötigte Software in Form fertiger Pakete parat, was wiederum die Installation drastisch vereinfacht.
Wer das Beispiel nachvollziehen möchte, tut dies Sensmit einem beliebigen Raspberry-Pi-Modell – vielleicht wartet noch ein älteres Exemplar in einer Schublade. An den Minirechner schließt der Anwender einen Temperatursensor an, den es für kleines Geld in Elektronikmärkten und im Versandhandel gibt.
Wer wie die Redaktion mit mehreren Sensoren experimentiert, sollte die Anschaffung eines Grove Pi erwägen [3]. An diese Zusatzplatine (Hat) lassen sich zahlreiche Sensoren ohne Lötarbeiten andocken (Abbildung 1). Eine Open-Source-Bibliothek des Herstellers Dexter Industries [4] liest die Sensoren zudem mit wenigen Codezeilen aus.

Abbildung 1: Das Grove-Pi-Board stülpt sich wie hier über den Anfang der GPIO-Port-Leiste. Das Beispiel erwartet zudem den (blauen) Temperatur- und Luftfeuchtigkeitssensor am Port D4 (hier links oben).
Für das Gewächshaus genügt der blaue Temperature & Humidity Sensor [5], der gleichzeitig Temperatur und Luftfeuchtigkeit misst. Die Bequemlichkeit hat aber ihren Preis. So kostet der Grove Pi im deutschen Versandhandel rund 45 Euro, der Temperatur- und Luftfeuchtigkeitsmesser schlägt noch einmal mit 9 Euro zu Buche (Abbildung 2).

Abbildung 2: Für den Grove Pi gibt es viele Sensoren, darunter auch einen Sound- und einen Water-Sensor.
Prinzipiell lassen sich die Sensoren auch ohne den Grove Pi direkt an die GPIO-Pins anschließen. Dazu benötigt der Anwender jedoch ein Adapterkabel und Kenntnisse über die Programmierung der GPIO-Schnittstelle. Der Temperature & Humidity Sensor ist zudem nicht geeicht und lieferte im Test immer mal wieder kurzzeitig falsche Werte. Für ein Gewächshaus im Schrebergarten reicht die Genauigkeit aus, bei der Steuerung von Industrieanlagen sollten genauere Sensoren zum Einsatz kommen.
Schlangenöl
Die von den Sensoren gelieferten Daten holt ein kleines, selbst geschriebenes Programm ab und reicht sie an andere Softwarekomponenten weiter. Am schnellsten lässt sich das Programm in Python implementieren, weshalb die Sprache auch im Folgenden das Mittel der Wahl ist. Da der notwendige Quellcode äußerst simpel ausfällt, sind zum Verständnis jedoch kaum Python-Kenntnisse nötig. Die Sensoren des Grove Pi lassen sich alternativ auch in C++, Go, Java, Javascript und Ruby abfragen, die aus dem Eclipse-IoT-Projekt eingespannte Bibliothek spricht unter anderem C, C++, Java, Javascript, Go und Rust.
Fällt die Entscheidung gegen das Grove-Pi-Board, installiert der User zunächst die aktuelle Version von Raspbian auf dem Minicomputer, verbindet den Sensor mit dem Raspberry Pi und stellt sicher, dass dieser sich über ein Python-Skript in einer Schleife abfragen lässt. Anschließend geht es direkt im Abschnitt “Versandhandel” weiter.
Gehölz auf der Torte
Besitzer eines Grove Pi stecken das Board wie in Abbildung 1 auf den Raspberry Pi. Der hintere Teil des Grove Pi liegt dabei auf den USB-Buchsen auf. Anschließend stöpseln sie den Temperature & Humidity Sensor in die Buchse D4 und stellen sicher, dass eine Kabelverbindung ins Internet existiert.
Im nächsten Schritt spielen sie das aktuelle Raspbian auf eine SD-Karte, booten den Minirechner damit und öffnen ein Terminalfenster. Die folgenden drei Befehle aktualisieren das System und holen das unter einer MIT-Lizenz stehende Grove-Pi-Framework hinzu:
sudo apt update sudo apt upgrade sudo curl -kL dexterindustries.com/update_grovepi | bash
Anschließend muss der Nutzer den Raspberry Pi einmal neu starten.
Die Funktionstüchtigkeit des verwendeten Sensors prüft ein Beispielskript aus dem Framework. Es liest wiederholt die vom Sensor gelieferte Temperatur und Luftfeuchtigkeit aus:
python Dexter/GrovePi/Software/Python/grove_dht_pro.py
Drückt der Anwender zeitgleich [Strg]+ und [C], bricht das Skript ab.
Die in den ersten Sekunden gelieferten Werte können falsch sein. So misst der Sensor zum Beispiel 0 Grad in einem eigentlich gut geheizten Zimmer. Zudem taucht in den Ausgaben unter Umständen hin und wieder der Wert »-1« auf. Erscheint der Wert »-1« hingegen dauerhaft, ist sehr wahrscheinlich die Firmware des Grove Pi veraltet.
Um diese Firmware zu aktualisieren, schaltet der Besitzer den Raspberry Pi zunächst komplett aus und trennt ihn von der Stromversorgung. Anschließend zieht er alle Sensoren vom Grove Pi sowie nicht zwingend benötigte Geräte vom Raspberry Pi ab. Nach dem Neustart des Minirechners aktualisiert er die Firmware über folgende Befehle:
cd Dexter/GrovePi/Firmware sudo bash firmware_update.sh
Anschließend sollte das erneut aufgerufene Beispielskript die korrekte Temperatur und Luftfeuchtigkeit liefern.
Versandhandel
Den Datenaustausch zwischen den Geräten im Internet of Things regeln entsprechende Protokolle. Das derzeit beliebteste hört auf den Namen Message Queue Telementry Transport ((MQTT, [6], [7]).Seit 2016 hat es zudem den Segen der ISO. MQTT nutzt TCP/IP-Verbindungen, was den Einsatz im Internet und bestehenden Netzen vereinfacht.
Auch im Gewächshaus soll der Pi die vom Sensor gelieferten Daten per MQTT weiterleiten. Netterweise stellt die Eclipse Foundation eine Implementierung des MQTT-Protokolls unter der Eclipse Public License 1.0 bereit [8]. Mit dieser Paho getauften Bibliothek genügt eine Zeile Python-Code, um die Temperaturdaten durch das Netzwerk zu schicken. Der folgende Befehl holt Eclipse Paho für Python auf den Raspberry Pi:
sudo pip install paho-mqtt
Die Abfrage des Sensors und die Weiterleitung der Messwerte übernimmt im Gewächshaus das Python-Skript »garten.py« aus Listing 1. Es bindet zunächst die Paho-Bibliothek (»import paho.mqtt.publish as publish«) und das Grove-Pi-Framework (»import grovepi«) ein.
Listing 1
Beispiel für den Einsatz von Paho (garten.py)
01 #!/usr/bin/env python
02
03 import paho.mqtt.publish
04 import grovepi
05 import time
06
07 while True:
08 # Temperatur und Feuchtigkeit abfragen:
09 [temp,humidity] = grovepi.dht(4,0)
10 # Werte zur Kontrolle ausgeben:
11 print("temp = %.02f C humidity =%.02f%%"%(temp, humidity))
12 # Werte via MQTT publizieren:
13 paho.mqtt.publish.single(topic="garten/temperatur", payload=str(temp), port=1883, hostname="localhost")
14 paho.mqtt.publish.single(topic="garten/feuchtigkeit", payload=str(humidity), port=1883, hostname="localhost")
15 # Warte 5 Sekunden:
16 time.sleep(5)
Anschließend liest es in Zeile 9 den Sensor aus und speichert die zurückgelieferte Temperatur in der Variablen »temp«, die Feuchtigkeit in Prozent landet in der Variablen »humidity«. Wer nicht den Grove Pi verwendet, muss die Zeile durch einen passenden Befehl ersetzen. Zeile 11 gibt beide ausgelesenen Werte zur Kontrolle im Terminal aus.
Dann verschickt »paho.mqtt.publish.single()« einen Messwert mit dem MQTT-Protokoll. Damit der Empfänger weiß, um welche Daten es sich handelt, steht an erster Stelle eine Beschreibung. Diese heißt in der MQTT-Welt Topic. In Listing 1 heißt das Topic für die Temperatur schlicht »temperatur«.
Die gesendete Nachricht enthält an zweiter Stelle den eigentlichen Messwert, die so genannte Payload. Da es sich dabei um einen String handelt, wandelt Listing 1 die Temperatur mit »str()« in eine Zeichenkette um.
Spüren in einer Wohnung mehrere Fühler der Temperatur hinterher, wäre es auch ganz nützlich zu erfahren, welcher Sensor die Temperatur geschickt hat. Für genau solche Zwecke darf das Topic aus mehreren Begriffen bestehen, die ähnlich wie in einem Linux-Verzeichnispfad jeweils ein Schrägstrich »/« trennt. Das Topic »haus/erdgeschoss/wohnzimmer/sensoren/temperatur« könnte auf diese Weise einen Temperaturfühler im Wohnzimmer kennzeichnen.
Die Zusammensetzung des Topic bestimmt gewöhnlich der Hersteller beziehungsweise Betreiber des Sensors. Wer im eigenen Gewächshaus selbst Herr über den Sensor ist, hat also die freie Wahl. Listing 1 verwendet als Topic für die Temperatur »garten/temperatur«.
Paketzentrum
Die Sensoren sind in der Regel recht dumm und leistungsschwach und treten meist im Rudel auf. So gibt es etwa in einer Wohnung gleich mehrere Temperaturfühler. Damit die Sensoren nicht das Netzwerk mit ihren Nachrichten fluten, existiert ein zentraler Ansprechpartner. Dieser so genannte Broker läuft dauerhaft als Dienst auf einem Server und sammelt die Nachrichten aller Sensoren ein. Clientprogramme abonnieren dann beim Broker die Sensordaten. Liefert ein Sensor die entsprechenden Nachrichten, leitet der Broker diese an die jeweiligen Abonnenten weiter.
Der Broker lauscht standardmäßig am dafür reservierten Port 1883 auf Verbindungen. Dorthin schickt auch Listing 1 die Temperatur. Den zu verwendenden Port legt der dritte Parameter der Funktion »paho.mqtt.publish.single()« fest. Da es sich dabei um den Standardport handelt, könnte der Parameter auch entfallen. Im letzten Parameter erwartet die Funktion »paho.mqtt.publish.single()« noch die IP-Adresse oder den Hostnamen des Servers, auf dem der Broker läuft. Listing 1 geht davon aus, dass sich der Broker ebenfalls auf dem Raspberry Pi befindet (»localhost«).
In Zeile 14 schickt Listing 1 auf die gleiche Weise die gemessene Feuchtigkeit an den Broker, wartet dann 5 Sekunden und startet den kompletten Vorgang von vorn. Mehrere einzelne Aufrufe von »paho.mqtt.publish.single()« lassen sich auch zu einem zusammenfassen. In Python wandern dazu die Messwerte samt ihren Topics zunächst in eine Liste aus Dictionaries, die dann die Funktion »paho.mqtt.publish.multiple()« in MQTT-Nachrichten verwandelt:
msgs = [{'topic':"garten/temperatur", 'payload':str(temp)},{'topic':"garten/feuchtigkeit", 'payload':str(humidity)}]paho.mqtt.publish.multiple(msgs, port=1883, hostname="localhost")
Um Listing 1 übersichtlich zu halten, fängt es keine Fehler ab. Sollte die Verbindung zum Broker abreißen, würde sich das Skript einfach beenden. Schädliche Temperaturen im Gewächshaus blieben in der Folge unbemerkt. Wer also eigene Programme entwickelt, sollte diesen tunlichst eine Fehlerbehandlung spendieren und für alle erdenklichen Notfälle entsprechende Maßnahmen vorsehen.
Stechmücke
Listing 1 sendet alle 5 Sekunden die jeweils aktuellen Messwerte an einen Broker auf dem Raspberry Pi. Mit Eclipse Mosquitto [9] stellt die Eclipse Foundation einen kompletten und flinken Broker unter der Eclipse Public License 1.0 bereit. Ein fertiges Paket wartet sogar in den Repositories von Raspbian, das folgender Befehl einspielt:
sudo apt install mosquitto
Danach läuft im Hintergrund auf dem Raspberry Pi ein Broker, der begierig auf Daten der Sensoren wartet.
In der Praxis läuft der Broker gewöhnlich auf einem eigenen Server. Folglich wäre in Listing 1 »localhost« gegen die entsprechende IP-Adresse beziehungsweise den Hostnamen des Servers zu tauschen. Da es im Gewächshausbeispiel jedoch nur einen Sensor gibt, kann Mosquitto dort direkt auf dem Raspberry Pi seine Arbeit verrichten.
Um den Broker zu füttern, startet der Hobbygärtner Listing 1 via »python garten.py« (Abbildung 3). Auf der Kommandozeile erscheinen jetzt die vom Sensor gelieferten Daten zur Kontrolle.

Abbildung 3: Das Skript »garten.py« aus Listing 1 sendet die Messwerte an den Broker.
Was davon tatsächlich beim Broker ankommt, bleibt aber zunächst im Dunkeln. Das ändert sich mit einem Client (Abbildung 4), der die Temperatur und die Feuchtigkeit beim Broker abruft. Das Eclipse-Paho-Projekt bietet verschiedene Clienttools zum Download an [10]. Dazu zählen auch Plugins für die Entwicklungsumgebung Eclipse.

Abbildung 4: Der grafische Client empfängt die Messwerte vom Broker. In der Praxis laufen alle Bestandteile jeweils auf eigenen Rechnern.
Für den Raspberry Pi eignet sich die Java Swing Application. Sie ist zwar relativ einfach gestrickt, genügt aber zur Kontrolle der verschickten Nachrichten. Nach dem Download der Java Swing Application startet sie der Befehl »java -jar org.eclipse.paho.mqtt.utility-1.0.0.jar«.
Unter »Broker TCP/IP address« erwartet der Client die IP-Adresse des Brokers. Wenn wie im Beispiel Broker und Client auf dem Raspberry Pi laufen, handelt es sich bei der vorgegebenen Adresse »127.0.0.1« bereits um den korrekten Wert. Via »Connect« verbindet sich der Client mit dem Broker.
Billiges Abo
Als Nächstes muss der Anwender dem Client noch mitteilen, für welche Topics er sich interessiert. Soll der Client vom Broker die Temperaturen aus dem Gewächshaus abholen, gehört in das Eingabefeld »Subscribe Topic« das Topic »garten/temperatur«.
Ein Klick auf »Subscribe« startet das Abonnement. Im großen Eingabefeld erscheint spätestens nach 5 Sekunden der vom Temperatursensor verschickte Wert, den der Client dort auch fortlaufend aktualisiert. Bleibt die Temperatur konstant, scheint sich die Zahl im Eingabefeld folglich nicht zu verändern.
Einen Einblick in die Kommunikation mit dem Broker gewährt das Fenster hinter »History«. Es protokolliert penibel, welche MQTT-Nachrichten der Client empfangen hat beziehungsweise welche er gerade empfängt.
Im Beispiel interessiert neben der Temperatur auch die Feuchtigkeit im Gewächshaus. Der Client sollte folglich neben dem Topic »garten/temperatur« auch das Topic »garten/feuchtigkeit« abonnieren. Damit der Nutzer sich bei mehreren Topics nicht die Finger wund tippt, gibt es den Platzhalter »#«. Der steht für alle Topics mit dem gleichen Anfang. Also bezeichnet »garten/#« alle Topics, die mit »garten/« beginnen.
Hinterlegt der Nutzer im Eingabefeld »Subscribe Topic« den Begriff »garten/#« und klickt auf »Subscribe«, würde der Client ab sofort die Temperatur (»garten/temperatur«) und die Luftfeuchtigkeit abonnieren (»garten/feuchtigkeit«).
Analog steht das »+«-Symbol für ein beliebiges Topic in der Mitte. Im folgenden Beispiel würde der Client die Daten aller Temperatursensoren aus dem Erdgeschoss erhalten: »haus/erdgeschoss/+/sensoren/temperatur«.
Maßgeschneiderte Klienten
Das grafische Clientprogramm aus dem Paho-Projekt erlaubt zwar einen Einblick in die verschickten Nachrichten und Messwerte, kann diese aber nicht sinnvoll weiterverarbeiten. Sollen beispielsweise die aus dem Gewächshaus gelieferten Temperaturen in einer Textdatei landen, muss folglich ein maßgeschneiderter Client her.
Netterweise offeriert Eclipse Paho nicht nur Funktionen zum Versenden, sondern auch zum Empfangen von Nachrichten. Damit lässt sich schnell der kleine Client aus Listing 2 klöppeln. Er importiert zunächst wieder Paho und definiert dann die Callback-Funktion »on_message()«. Die ruft Paho später immer dann auf, wenn eine neue Nachricht vom Broker eingetroffen ist.
Listing 2
Beispiel-Client mit Paho (client.py)
01 #!/usr/bin/env python
02 import paho.mqtt.client as mqtt
03
04 def on_message(client, userdata, msg):
05 print(msg.topic+" "+str(msg.payload))
06
07 client = mqtt.Client()
08 client.on_message = on_message
09 client.connect("localhost", 1883)
10 client.subscribe("garten/#", 0)
11 client.loop_forever()
In Listing 2 gibt die Funktion einfach das Topic und den Nachrichteninhalt im Terminal aus. Ein vollständiger Client würde die Daten hier speichern oder anderweitig verarbeiten. Im Gewächshaus könnte dann etwa Graphviz die Temperaturen in ein Diagramm eintragen.
Die nachfolgenden Zeilen erstellen zunächst ein neues Clientobjekt, das alle notwendigen Funktionen kapselt. Diesem teilt Zeile 8 mit, dass es die Callback-Funktion »on_message()« nutzen soll. Anschließend baut der Client eine Verbindung zum Broker auf.
Der erste Parameter der »connect()«-Methode verrät den Hostnamen beziehungsweise die IP-Adresse, auf der der Broker läuft, der zweite Parameter liefert den zugehörigen Port. Die Funktion »subscribe()« abonniert alle »garten«-Topics. Mit der letzten Zeile wartet der Client in einer Schleife auf die Nachrichten des Brokers (Abbildung 5).

Abbildung 5: Links sendet das Skript »garten.py« aus Listing 1 die Messwerte an den Broker, rechts empfängt das Skript »client.py« aus Listing 2 die Werte und gibt sie hier der Einfachheit halber aus.
Ausbaufähig
Die Listings 1 und 2 demonstrieren eindrucksvoll, wie schnell sich ein Internet of Things mit Hilfe des Eclipse-Frameworks aufsetzen lässt. Sie besitzen allerdings auch noch deutlich Raum für Verbesserungen. So wandern beispielsweise alle Nachrichten noch im Klartext durch das Netzwerk, obendrein dürfen an den Broker beliebige Clientprogramme andocken.
Um Missbrauch zu verhindern, sieht das MQTT-Protokoll auch eine Verschlüsselung via TLS und eine Authentifizierung mit Nutzernamen und Passwort vor. Verschlüsselte MQTT-Nachrichten schlagen dabei am eigens dafür reservierten Port 8883 auf.
Alle zur Chiffrierung und Authentifizierung notwendigen Informationen übergibt der Anwender einfach beim Verbindungsaufbau über zusätzliche Parameter an die entsprechenden Paho-Funktionen. Die wiederum dokumentiert die Paho-Website hinter dem Menüpunkt »Components«.
Wem das noch nicht genügt, der findet zahlreiche Beispielskripte auf Github [11] beziehungsweise im Paho-Quellcode-Archiv im Ordner »examples«.
Über die Konfigurationsdatei »mosquitto.conf«, die auf dem Raspberry Pi im Verzeichnis »/etc/mosquitto« lagert, bringt der Nutzer Mosquitto zudem die Verschlüsselung und Anmeldung bei. Mosquitto bringt mehrere ausführliche Manpages mit, die auch auf der Homepage des Projekts unter »Documentation« zum Abruf bereitstehen.
Infos
-
Eclipse IoT: https://iot.eclipse.org
-
Raspberry Pi: https://www.raspberrypi.org
-
Dexter Industries: https://www.dexterindustries.com
-
Grove Temperature & Humidity Sensor: http://wiki.seeedstudio.com/Grove-TemperatureAndHumidity_Sensor/
-
MQTT: http://mqtt.org
-
Rainer Poisel, “Volks-Schalter”: Linux-Magazin 07/2017, S. 30
-
Eclipse Paho: http://www.eclipse.org/paho/
-
Mosquitto: http://mosquitto.org
-
Eclipse Paho Clienttools: https://www.eclipse.org/paho/components/tool/
-
Paho-Beispiele in Pyhton: https://github.com/eclipse/paho.mqtt.python/tree/master/examples






