Raspberry Pi schickt Temperaturmesswerte in das Internet of Things

Raspberry Pi mit 1-wire Sensor und Android App ThingView

Der Raspberry Pi mit einem Linux Betriebssystem eignet sich hervorragend zur kontinuierlichen Erfassung von Messwerten, die verschiedene Sensoren für Wetterdaten oder zur Verbrauchsmessung liefern. Möchte man diese Werte einem größeren Benutzerkreis zur Verfügung stellen, dann bietet sich die Zuhilfenahme des Internet of Things (IoT) an. Hier sind in letzter Zeit eine Reihe von IoT Diensten, wie zum Beispiel ThingSpeak.com entstanden, die neben der Datenspeicherung auch grafische und mathematische Auswertungen erlauben.

Temperaturmessung mit dem Raspberry Pi und dem 1-wire Temperatursensor DS1820

Ausgangspunkt ist das Projekt Temperaturmessung mit dem Raspberry Pi und dem 1-wire Temperatursensor DS1820 (USB-seriell). Durch den Anschluss eines gebräuchlichen USB zu Seriell Wandlers und dem Selbstbau eines passiven Seriell zu 1-wire Adapters ist der Raspberry Pi dann in der Lage, mittels des Programms digitemp_DS9097 Temperaturmesswerte von 1-wire Sensoren vom Typ DS18S20, DS18B20 oder DS1822 auszulesen. Der Aufruf von:

digitemp_DS9097 -a -q -o%C

liefert eine Ausgabe mit einem Messwert pro Zeile. In meinem Musteraufbau mit zwei Sensoren für Außen- und Innentemperatur ist das zum Beispiel:

20.750000
24.687500

Lass Dinge sprechen!

Ein großer Teil des ursprünglichen Projekts befasst sich dann mit der Speicherung der Messwerte n einer Round Robin Datenbank sowie der Erzeugung und Publikation von Grafiken im Web. Dazu muss unter anderem ein Webserver auf dem Raspberry Pi laufen und die Beschäftigung mit Webtechnologien wie HTML, CGI und CSS ist notwendig. Das Projekt ist bereits einige Jahre alt und inzwischen sind eine Reihe von Webdiensten entstanden, die das Thema Datenspeicherung und Visualisierung im Web übernehmen können. Für diesen Artikel fiel die Wahl auf ThingSpeak.com. Hier gefallen mir vor allem die umfangreichen Möglichkeiten zur Erstellung individueller Grafiken sowie das Vorhandensein mehrerer Android Apps, die die Auswertung der Messungen direkt auf dem Smartphone oder Tablet erlauben - dazu später mehr.

Basis der Datenspeicherung auf ThingSpeak.com sind Channels. Ein Channel hat maximal acht Fields, das heißt er kann acht verschiedene Messwerte pro Zeitpunkt speichern. Es spielt dabei keine Rolle, um was für Werte es sich handelt - ThingSpeak speichert grundsätzlich nur den Zahlenwert und keine Einheiten. Die zu einem Channel gehörenden Werte sollten allerdings im engen zeitlichen Bezug zueinander stehen. Für unser Beispiel - Aufzeichnung von Außen- und Innentemperatur - bietet sich daher die Erstellung eines Channels mit zwei Feldern an.

Nach der kurzen und schmerzlosen Registrierung bei ThingSpeak.com lässt sich sofort über das Menü Channels - My Channels und Klick auf New Channel ein neuer Kanal definieren. Sinnvoll ist die Vergabe aussagekräftiger Namen für den Channel und die beiden Felder. Die Eingabe von Tags vereinfacht später die Suche nach Kanälen. Ein Haken bei Make Public macht den Kanal öffentlich, damit kann jeder die hinterlegten Werte lesen und die Grafiken anzeigen.

Per Klick auf Save Channel ist der Kanal dann auch schon angelegt und man gelangt direkt in seinen Private View, der schon eine - jetzt noch leere - Grafik für jedes Feld anzeigt. Über den Tab API Keys gelangt man zur Anzeige des Write API Key, den wir gleich zum Schreiben der Messwerte in den Channel benötigen.

Anlegen eines Channels bei ThingSpeak
Anlegen eines public Channels mit zwei Fields bei ThingSpeak

Post mit Requests

Nach dem erfolgreichen Anlegen des Kanals ist es an der Zeit, sich mit dem Senden der Temperaturmessdaten an den ThingSpeak Channel zu befassen. Ausgangspunkt ist die Ausgabe der Messdaten durch digitemp_DS9097 wie oben gezeigt. Damit ThingSpeak mit diesen Daten etwas anfangen kann, müssen sie in einen HTTP POST Request verpackt sein, der zusätzlich noch den Write API Key zu Identifikation enthalten muss. Als Bindemittel zwischen beidem dient das Pythonscript post_ths_temp.py:

#!/usr/bin/env python

import os
import requests

THINGSPEAKAPIKEY = os.environ['THINGSPEAKAPIKEY']

payload = {'api_key' : THINGSPEAKAPIKEY}
i = 1
with os.popen("/usr/bin/digitemp_DS9097 -a -q -o%C") as handle:
    for line in handle:
        temp = float(line)
        field = "field{0}".format(i)
        payload[field] = temp
        i += 1

r = requests.post('https://api.thingspeak.com/update.json', data=payload)
if r.status_code != 200:
    print(r.text)

Voraussetzung für das Script ist die Python Requests Library, die man eventuell noch installieren muss:

sudo apt-get install python-requests

Das Script ruft mittels os.popen das Programm digitemp_DS9097 so auf, dass es jeden Temperaturmesswert auf eine neue Zeile schreibt. Diese Zeilen liest die for Schleife ein und packt sie als Werte in das Dictionary payload. Schlüssel für die einzelnen Werte ist jeweils die Zeichenkette field1, field2 und so weiter. Die Nummerierung korrespondiert dabei mit der Angabe des Field bei der Definition des Channels auf der ThingSpeak Seite.

Außerdem kommt noch der Write API Key mit in payload. Das Script liest den Key per os.environ aus der Umgebungsvariablen THINGSPEAKAPIKEY. Man kann ihn stattdessen natürlich auch direkt in das Script schreiben. Allerdings ist dann Vorsicht bei der Weitergabe des Scripts geboten, denn der Write API Key ist der einzige Schutz des Channels gegen unautorisiertes Schreiben! Wenn er versehentlich doch einmal in die falschen Händen gelangt, dann sollte man auf der ThingSpeak Seite sofort einen neuen Key erzeugen.

Als Finale sendet das Script dann die payload per HTTP POST an die ThingSpeak API. Führt man das Skript jetzt an der Kommandozeile aus (Setzen der Ausführungsrechte mittels chmod +x nicht vergessen!), dann sind nach kurzer Zeit die Messwerte in der Grafik auf der öffentlichen Ansicht des Kanals auf ThingSpeak zu sehen.

Für den Dauereinsatz empfiehlt es sich, das Script regelmäßig aller fünf Minuten durch den Zeitplandienst cron ausführen zu lassen. Per crontab -e fügt man dazu die beiden folgenden Zeilen in die crontab ein:

THINGSPEAKAPIKEY=Your_Write_Api_Key
*/5 * * * * $HOME/post_ths_temp.py >> $HOME/post_ths_temp.log 2>&1

Die Ausgabeumleitung bewirkt, dass eventuelle Fehlermeldungen in die Datei post_ths_temp.log gelangen, deren Inhalt man also regelmäßig kontrollieren sollte.

Grafik und mehr

Die Möglichkeiten von ThingSpeak erschöpfen sich nicht in der Anzeige einfacher Grafiken, sondern sind so vielfältig, dass ihre Beschreibung den Rahmen dieses Artikels sprengen würden. So kann man zum Beispiel die Grafiken durch Klick auf das Stiftsymbol weitgehend den eigenen Wünschen anpassen, was Farbe, Beschriftung Linienstil oder angezeigten Zeitraum betrifft. Ein Klick auf die Sprechblase gibt den Code eines HTML Snippets preis, welches die Einbettung der Grafik in eigene Webseiten erlaubt:

Weitere Hinweise dazu finden sich in der Dokumentation.

Über den Menüpunkt Apps eröffnen sich weitere Möglichkeiten: Analytics und Actions. Zum Beispiel erlauben die MATLAB Visualizations die Kombination mehrerer Messwerte in einer Grafik:

Hinter MATLAB Analysis verbirgt sich ein großer Teil der MATLAB® Funktionen zur Datenanalyse. Actions erlauben schließlich eine Interaktion zwischen Geräten und Internet. Zum Beispiel kann man täglich um 24:00 Uhr die Berechnung von Tagesmittel- und Höchstwerten aus den gemessenen Temperaturen vornehmen lassen. Oder eine Action setzt bei Überschreitung eines Grenzwertes automatisch einen HTTP Request oder einen Tweet ab.

Mobile Apps

Es gibt bereits eine Reihe von Apps für Android, die mit ThingSpeak zusammenarbeiten. Persönlich gefallen mir ThingView und das IoT ThingSpeak Monitor Widget am besten.

Screenshot ThingView (links) und IoT ThingSpeak Monitor Widget (rechts)
Android App ThingView (links) und IoT ThingSpeak Monitor Widget (rechts)

ThingView (Abb. links) zeigt die Messwertdiagramme beliebiger Channels auf dem Android Smartphone an. Die (geringfügige) Investition in die Vollversion lohnt sich, da man dann auch verschiedene Zeiträume konfigurieren kann.
Der IoT ThingSpeak Monitor arbeitet als Widget auf einem Startbildschirm (Abb. rechts). Auch hier lassen sich beliebige Kanäle auswählen, das Widget zeigt den aktuellen Messwert an - ideal um zum Beispiel mit einem kurzen Blick die Außentemperatur abzulesen. Bei Berührung des Diagrammsymbols unten rechts öffnet sich ein Diagramm mit den visualisierten Messwerten. Über das Menüsymbol erlaubt das Widget unter anderem die Definition von Grenzwerten, bei deren Über- oder Unterschreitung eine Benachrichtigung auf dem Smartphone erscheint.

Fazit

Mit dem vorgestellten Verfahren vertraut man die Messwerte einem Service im Internet an. Was dort mit ihnen passiert, ist für den einzelnen nicht mehr vollständig nachvollziehbar. Es ist klar, dass man sensitive Daten nicht in dieser Form aus der Hand geben sollte. Aber auch die Verfügbarkeit und Dauerhaftigkeit der Daten ist kritisch zu betrachten. Welche der vielen IoT Dienste es in fünf Jahren noch gibt, ist nicht garantiert. Insofern eignet sich das Verfahren derzeit nur für die kurz- und mittelfristige Speicherung unkritischer Daten.

Auf der anderen Seite lässt sich nun die komplette Datenspeicherung, Visualisierung und Analyse an ThingSpeak delegieren. Der Raspberry Pi reicht nur noch die Daten vom Sensor in das Internet durch. Deswegen wäre an seiner Stelle auch der Einsatz eines deutlich einfacheren, kleineren und billigeren Computers, wie eines Arduinos oder ESP8266 möglich. Man kommt relativ schnell zu ansprechenden Ergebnissen, die sich auch in eigene Webseiten integrieren lassen. Bei tiefergehender Beschäftigung mit der ThingSpeak- und MATLAB-API eröffnet sich ein gewaltiges Feld von Möglichkeiten.