Raspberry Pi Sensordaten mit ThingSpeak loggen und auswerten

Häufig fallen in Projekten, die rund um die Uhr laufen, eine Menge Daten an. Um diese dauerhaft zu speichern ist ein Weg, die Daten in einer lokalen Datenbank zu speichern. Jedoch gibt es auch einige Gründe, die dagegen sprechen. Um die gemessenen Daten (z.B. aus einer Wetterstation) auch in Zukunft verfügbar zu halten, kann man auch verschiedene Online Dienste ausweichen.

Einer dieser Anbieter ist ThingSpeak. Hier kann man für kleinere Anwendungen einen kostenlosen Account erstellen und seine Daten sehr einfach übertragen. Und genau darum geht es in diesem Tutorial: Wie man Sensordaten zu ThingSpeak überträgt und diese später auswertet.

 

Zubehör

Alles was du benötigst ist einen Raspberry Pi mit Internetanschluss und einen Sensor, dessen Daten du misst. Aber selbst die CPU Aktivität kann protokolliert werden. In diesem Tutorial nutze ich einen DHT22, mit Hilfe dessen ich die Temperatur und Luftfeuchtigkeit messe und logge.

Für eine Wetterstation wären folgende Sensoren und Module sinnvoll:

Eine Auflistung von weiteren Komponenten findest du in diesem Artikel: 50 der wichtigsten Raspberry Pi Sensoren und Module

 

ThingSpeak Account einrichten

Bevor wir loslegen, wird ein Account bei ThingSpeak benötigt. Erstelle dir dazu hier einen Account, sofern du noch keinen hast. Anschließend erstellst du unter https://thingspeak.com/channels einen neuen Channel.

Hier vergibst du einen Namen für den Channel sowie welche Felder du nutzen willst. Insgesamt können bis zu 8 Felder genutzt werden. Die vergebenen Namen haben keinen Einfluss auf die Übertragung der Daten, da wir nur „field1“, „field2“, usw. angeben. Alle diese vergebenen Namen sind auch später noch veränderbar.

thingspeak_neuer_channel

Nachdem du den Channel unten gespeichert hast, wirst du automatisch in den Reiter „Private View“ weitergeleitet. Hier werden die vergebenen Felder als Diagram angezeigt. Etwas weiter oben findest du die „Channel ID„. Diese werden wir gleich noch brauchen.

Anschließend wechseln wir noch in den Reiter „API Keys“. Die beiden Werte von „Write API Key„, sowie „Read API Key“ werden ebenso gleich benötigt, damit wir Daten schreiben bzw. abrufen können.

 

Temperatursensor anschließen und einrichten

Falls du den DHT11 bzw. DHT22 nicht nutzen willst, kannst du dieses Kapitel überspringen.

Auf die beiden Sensoren bin ich im Detail bereits hier eingegangen, daher nur noch einmal die Verbindung als Erinnerung (10kΩ Widerstand):

luftfeuchtigkeit_DHT11_Steckplatine

Sofern du den Sensor vorher nie benutzt hast und auch die entsprechende Bibliothek noch nicht installiert ist, müssen wir erst einmal diese installieren. Dafür sind einige Pakete vonnöten:

sudo apt-get update
sudo apt-get install build-essential python-dev python-openssl git

Nun installieren wir noch die Bibliothek zum Auslesen des DHT11/22 Sensors:

git clone https://github.com/adafruit/Adafruit_Python_DHT.git && cd Adafruit_Python_DHT
sudo python setup.py install

Ist alles ohne Fehler durchgelaufen, können wir bereits fortfahren.

 

Raspberry Pi ThingSpreak Bibliothek nutzen

Um den Service nutzen zu können ist ein einfaches Senden der Daten per „POST“ bzw. abrufen per „GET“ möglich. Funktionen dazu sind in so gut wie jeder Programmiersprache vorhanden und mit ein wenig Kenntnis sollte die Datenübertragung schnell gebaut sein. Die Antworten sind prinzipiell in JSON.

Wer (noch) nicht über genug Erfahrung dazu besitzt oder einfach keine Lust hat es selbst zu schreiben kann auch die ThingSpeak Bibliothek nutzen. Dazu installieren wir sie einfach per pip:

sudo pip install thingspeak

Hierbei wird einerseits eine Python Bibliothek erstellt und zusätzlich eine Terminal-Anwendung. Du kannst thingspeak also auch über die Konsole aufrufen (bzw. aus einem anderen C++/Java Programm).

 

Fangen wir also an. Unser kleines Python Skript soll alle 15 Sekunden die Temperatur und Luftfeuchtigkeit des DHT22 auslesen und diese an unseren Channel senden. Außerdem sollen die Daten danach nochmal abgefragt werden (dies wird in Anwendungen, die nur Daten senden, nicht nötig sein; daher ist es nur ein Demonstrationsbeispiel).
Wir erstellen eine neue Datei,

sudo nano thingspeak_example.py

welche folgenden Inhalt bekommt (Speichern und Beenden mit STRG+O, STRG+X):

Die Zeilen 5 bis 7 musst du entsprechend anpassen. Zeile 8 muss lediglich verändert werden, sofern du einen anderen GPIO für den Sensor nutzt.

Falls du den DHT22 Sensor nicht nutzt, so muss der Code natürlich ein wenig angepasst werden.

 

Daten im Webpanel und per API abrufen

thingspeak_view

Die Daten des Panels werden mit wenigen Sekunden Verzögerung „quasi live“ angezeigt. Du kannst die Panels individualisieren (Aussehen und Datenanzeige) und sogar eigene Ansichten für die Daten schreiben. Für diese sogenannten Apps musst du lediglich ein wenig HTML, CSS und Javascript beherrschen. Alternativ kannst du dir auch Plugins aus dem Forum laden.

 

Falls du die Daten per API aufrufen möchtest, kannst du dies auch einfach per JSON. Dabei musst du deine Channel ID (bei mir: 206897) sowie deinen „Read API Key“ (bei mir: 9EZ7E0918UVVAGAY) in folgendem Link ersetzen:

https://api.thingspeak.com/channels/206897/feeds.json?api_key=9EZ7E0918UVVAGAY

Darüber hinaus gibt es noch eine Menge weiterer Parameter, die du zur Eingrenzung, Summierung oder Filterung der Daten angeben kannst. Du findest sie im MathWorks Wiki.

 

Als Schlusswort möchte ich dennoch darauf hinweisen, dass man sich immer bewusst sein sollte, was genau man überträgt. Auch wenn es sich bei ThingSpeak um einen seriösen Anbieter handelt, sollte man besonders sensible Daten u.U. selbst speichern, auch wenn dies etwas umständlicher und weniger ausfallsicher ist. Für unkritische Projekte wie Wetterstationen oder bspw. die Überwachung eines Aquariums sehe ich jedoch keine Gefahr.

163 Kommentare

  1. Habe jetzt mal die Links zu den Modulen usw. angesehen.
    Muss man die von Amazon benutzen, oder gehen die Breadboards, Sensoren , Jumpwires usw.
    von diesem Shop auch?
    ramser-elektro.at/shop/

    Wenn nein: Was ist da der Unterschied?
    Irgendwie sehen die Teile gleich aus, wie bei Amazon.

    Antworten
  2. könntest du mal zeigen wie man dies ohne einen externen anbieter macht ? also sqlite db auf dem raspberry und dann einbindung auf eine onlineoberfläche.

    Antworten
    • Da ein Internetanschluss bei einem pi der außen am Haus oder gar im Garten als Wetterstation seinen Dienst tut, wohl eher selten vorkommt, ist dieses Tuturial wohl eher als Hilfe beim Speichern von Daten gedacht und weniger als Wetterstations-Tutorial.
      Lokal auf der Sd Karte des Pi haben solch Daten ja auch nichts verloren, die Karte wird schnell ihr Schreibzyklus-Limit erreicht habe und den Dienst verweigern. Deshalb der Ansatz mit dem externen Cloudspeicher. Als lokale Alternative bietet sich der Einsatz von rrdb oder ähnlichem auf einem usb stick an. Man kann beim Pi aber auch den ganzen Arbeitsbereich von der Sd Karte auf ein usb lauferk (Stick) auslagern, dann wird die Karte nur noch zum Boot benötigt.

      Antworten
      • Im eigenen Garten ist es nicht so unwahrscheinlich, dass man noch ein WLAN Signal empfängt. Und mit einem Pi 3 braucht man auch keinen Wifi Adapter mehr. Aber du hast dennoch Recht: Die Wetterstation dient nur als Beispiel zum loggen der Daten.

    • Ich empfehle influxdb als Datenbank für die lokale Speicherung der Messwerte, die ist speziell für die Speicherung von Zeitreihen ausgelegt und bietet einige Features, die für genau diesen Anwendungsfall besonders nützlich sind. So kann man z.B. einstellen, dass die Einzelmesswerte nach zwei Wochen zu z.B. Tagesmittelwerten aggregiert werden und nach einem halben Jahr dann ganz gelöscht werden, sodass der Speicherplatz nicht ausgeht.

      Antworten
  3. Vielen Dank für das Tutorial. Da ich ein ziemlicher Laie bin, habe ich folgende Fragen:
    Ich habe 3 Dallas-Sensoren (DS 18B20), die ich alle auf der Konsole einzeln auslesen kann.
    1.)Wie binde ich sie in die Datei „thingspeak_example.py“ ein ?
    2.)Was bedeutet „pin“ in dieser Datei (Pin-Ziffer od. GPIO-Ziffer)?
    vermutl. ja GPIO
    3.)In welches Verzeichnis wird diese Datei gelegt?

    Antworten
      • Hallo Felix,
        Danke erst einmal für das Tutorial. Ich habe ebenfalls wie Friedel den DS18B20 Sensor im Einsatz. Wie müsste jetzt die “ thingspeak_example.py“ dafür angepasst aussehen?
        Was müsste zum Beispiel hier stehen „import Adafruit_DHT“ oder hier “ sensor = Adafruit_DHT.DHT22″. Was müsste noch alles wie genau abgeändert werden? Der Verweiss auf dein Tutorial zum DS18B20 hilft da an der Stelle leider nicht weiter.
        Gruß Christian

      • Hi… Ich bin durch Zufall hierauf gestoßen und erst einmal großes Lob für diese Seite.
        Ich bin was „Python“ bzw. programmieren angeht ein absoluter Laie und bräuchte ebenfalls wie die beiden anderen hier kurze Unterstützung.
        Das Auslesen der Temperatur (DS18B20) funktioniert anhand deiner anderen Anleitung hervorragend. Nun war ich immer auf der Such nach einer Möglichkeit die Temperatur „auf dem Smartphone“ anzeigen zu lassen. (So das die Gattin keine Shell benutzen muss… 😉 )
        Thingspeak-Account ist da, nur benötige ich mal Unterstützung, was in deinem o.g. Script (zum DH22/11) für ein DS18B20 angepasst werden muss. Bekomme beide Scripte irgendwie nicht zusammen… Wäre top. Vielen Dank

  4. Hallo.

    Ich bekomme beim Aufruf von der thingspeak python Lib folgende Fehlermeldung:
    AttributeError: ‚module‘ object has no attribute ‚Channel‘

    Auch wenn ich direkt in der python commandozeile nur „import thingspeak“ eingebe kommt dieselbe Meldung

    Hast du eine Idee?
    Danke & LG
    Reinhard

    Antworten
  5. Habe fast dasselbe problem. Wenn ich das script in python 2.7.9 (rasp pi 3) laufen lasse bekomme ich auch die Fehlermeldung ´module` object has no attribute `Channel`

    Antworten
  6. @Felix: Vielleicht kannst du das nochmals mit einem neu aufgesetztem Raspberry versuchen?
    Vielleicht tritt dann der Fehler bei Dir auch auf?
    Danke & LG
    Reinhard

    Antworten
  7. Hallo.
    Ich habe das Problem gefunden: Ich testete zuerst mit einem python Script mit Namen „thingspeak.py“. Dieses wurde zu thingspeak.pyc kompiliert und das folgende Testscript
    importierte genau dieses file anstelle des regulären thingspeak Moduls
    Sprich: Man darf sein Script nicht(!) „thingspeak.py“ nennen!
    LG

    Antworten