raspberry-pi-borad

Mit Raspberry Pi und Python Json auslesen

Im Beitrag “NodeMCU ESP8266 mit DHT22 und JSON zum smarten Temperaturfühler” haben wir einen ESP8266 zum Json Server gemacht. Natürlich kann man schon jetzt die Werte des Fühlers sehen, wenn man die IP-Adresse im Browser aufruft, aber das ist mühsam und nicht gerade smart. Viel eleganter ist es, wenn wir den Job einem Raspberry Pi anvertrauen. Mit einem einfachen Python Script, wollen wir heute die Temperaturen auslesen.

In dieser Anleitung werde ich nicht drauf eingehen, wie man Python Scripte auf einem Raspberry Pi zum laufen bekommt, dazu werde ich aber auch noch einen Beitrag veröffentlichen. Ich greife mit Putty und Filezilla auf meinem Raspberry Pi 3 zu.

Wir benötigen:

  • Raspberry Pi egal welches Modell
  • Texteditor wie Notepad++
  • Putty mit SSH zugrifft auf den Pi
  • FTP Client wie Filezilla und FTP Server auf dem Pi

01. Bibliotheken

Als Erstes benötigen wir wieder ein paar Bibliotheken, diese installieren wir unter anderem mit dem Tool “pip”. Damit wir überhaupt “pip” nutzen können, müssen wir es zuerst über das Terminal installieren.

sudo apt install python-pip
sudo apt install python3-pip

Danach können wir ganz einfach die fehlende Bibliothek über das Terminal mit “pip” installieren. Mit dem Tool “urllib3” können Links geöffnet werden.

pip install urllib3

Damit wir mit “Json” Arbeit können, benötigen wir auch noch diese Bibliothek.

sudo apt install libpython2.7-stdlib

02. Json auslesen

Wir erstellen eine Text-Datei und benennen diese um in “temp.py”. Mit einem Texteditor wie “Notepad++” können wir unsere Python-Datei nun öffnen.

Als Erstes binden wir die benötigten Bibliothek mit “import” ein.

import urllib
import json

Wir erstellen eine neue Variable mit dem Namen “esp8266” und geben ihr den Wert unserer IP-Adresse des Temperaturfühlers. Wir schreiben die IP-Adresse in Anführungszeichen, damit Python es als String versteht und nicht als Zahl zum Rechnen.

esp8266 = "deine.ip.adresse"

Jetzt können wir schon Python anweisen, die URL zu unserem Fühler zu öffnen und die Daten auszulesen. Die Variable “data” wird dabei zum Array, hier sind alle informationen aus unserer Json Datei enthalten.

url = "http://" + str(esp8266) + "/json"
response = urllib.urlopen(url)
data = json.loads(response.read())

Damit wir die Werte unseres Fühlers auch angezeigt bekommen, müssen wir natürlich auch noch einen “print”-Befehl setzen. Würden wir das Array “data” ausgeben, hätten wir alle Informationen unsortiert mit sämtlichen Klammern – das wollen wir aber nicht. Deshalb ziehen wir uns aus dem Datenstrang nur die Informationen, die uns auch interessieren.

Ein Array muss man sich wie eine Tabelle vorstellen. Wir wollen aus der Spalte “temperature” den ersten Wert sehen, einen anderen Wert haben wir sowieso nicht bei unserem Temperaturfühler. Bei “Arrays” beginnt die erste Zeile aber nicht mit 1, sondern immer mit 0.

Mit dem Befehl “print” sagen wir Python nun was wir sehen wollen. Texte kennzeichnen wir wieder mit Anführungszeichen und als String lassen wir uns die Fühlerwerte anzeigen, das machen wir mit “str()”. In der str-Klammer lassen wir uns aus dem Array “data” die Spalte “temperature” anzeigen. Damit Python auch weiß, in welcher Zeile unser gesuchter Wert steht, fügen wir noch die 0 hinzu.

print ("Raum: " + str(data['room'][0]))
print ("Temp: " + str(data['temperature'][0]) + " C")
print ("Humi: " + str(data['humidity'][0]) + " %")

Das fertige Script sieht dann so aus:

import urllib
import json

esp8266 = "deine.ip.adresse"

url = "http://" + str(esp8266) + "/json"
response = urllib.urlopen(url)
data = json.loads(response.read())

print ("Raum: " + str(data['room'][0]))
print ("Temp: " + str(data['temperature'][0]) + " C")
print ("Humi: " + str(data['humidity'][0]) + " %")

Nun können wir unsere Datei “temp.py” speichern und via FTP in das Verzeichnis “/home/pi” unseres Raspberrys laden.

Mit dem Befehl “python /home/pi/temp.py” bekommen wir nun die aktuellen Werte unseres smarten Temperaturfühlers angezeigt.

03. Die Schleife

Jetzt könnte man natürlich für jeden Fühler eine Python-Datei anlegen in der die jeweilige IP-Adresse steht aber das geht auch viel leichter.

Wir nutzen dafür einfach die Python-Schleifenfunktion “for”, um uns alle Fühler anzeigen zu lassen. Dazu wandeln wir unsere Variable “esp8266” in ein Array um.

esp8266 = ["deine.1.ip.adresse", "deine.2.ip.adresse", "deine.3.ip.adresse"]

Nicht notwendig für die “for”-Schleifenfunktion, aber schöner für die Ausgabe später, lassen wir unsere Fühler auch zählen. Dafür erstellen wir eine weitere Variable mit dem Wert 0. In unserer Schleifen fügen wir dann jedes mal den Wert 1 hinzu und erhalten so eine Zählung.

i = 0

Jetzt geht es an die automatische Ausgabe der Fühlerwerte mit unserer “for”-Schleife. Wir sagen Python, es soll unser Array “esp8266” abarbeiten und mit jeder IP-Adresse das Gleiche machen. Die jeweilige IP-Adresse soll in die Variable “ip” umgewandelt werden. Sollten wir uns bei einer IP-Adresse mal vertippt haben, lassen wir uns das auch als Fehler anzeigen, dafür benutzen wir die Funktion “try”.

Unser fertiges Skript sieht dann so aus:

import urllib
import json


esp8266 = ["deine.1.ip.adresse", "deine.2.ip.adresse", "deine.3.ip.adresse"]

i = 0

for ip in esp8266:

     try:
         url = "http://" + str(ip) + "/json"
         response = urllib.urlopen(url)
         data = json.loads(response.read())

         room = data['room'][0]
         temp = data['temperature'][0]
         humi = data['humidity'][0]

	 
         i += 1
         print ("---- " + str(i) + ". Sensor ----")
         print ("Raum: " + str(room))
         print ("Temp: " + str(temp) + " C")
         print ("Humi: " + str(humi) + " %")
		 
     except:
	     print ("IP: " + str(ip) + " error")

Demnächst werden wir die Werte in eine SQL-Datenbank speichern und über eine Website anzeigen lassen, das würde aber den Rahmen für diesen Beitrag sprengen. Viel Freude beim Nachbauen und bis zum nächsten Mal.

Weiterlesen:

NodeMCU ESP8266 mit DHT22 und JSON zum smarten Temperaturfühler

Gehäuse für NodeMCU ESP8266 mit DHT22

Related Posts