Andreas Bruns

Softwareentwicklung für Oldenburg und Bremen

Wetterdaten auf dem Raspberry Pi anzeigen

In vorherigen Artikeln habe ich ja bereits meinen kleinen Einplatinencomputer Raspberry Pi (Modell B) und das zugehörige Kamera-Modul vorgestellt. Das Unternehmen PiFace bietet weitere spannende Module an:

Ich habe mir das „PiFace Control and Display (CAD)“ gegönnt und einige der netten PiFace-Beispiele ausprobiert. Mit Hilfe eines kleinen selbst entwicklten Python-Skripts und den Wetterdaten von Openweathermap ist der Raspberry Pi jetzt eine Wetterstation, der die aktuellen Wetterdaten aus dem Internet abfragt und anzeigt: Temperatur, Luftdruck, Luftfeuchtigkeit, Wind, Wetterlage

PiFaceCAD für den Raspberry Pi

PiFaceCAD für den Raspberry Pi


Zunächst einmal sollte man die Installationsschritte der Anleitung Setting up PiFace Control And Display befolgen. Die ausführliche Dokumentation ist auf GitHub erhältlich. Falls alles korrekt installiert ist, dann sollte man das folgende Skript ausführen können. Es erscheint dann im beleuchteten Display „Hello World“ und im Terminal wird für jeden Schalter der aktuelle Zustand als 0 (nicht gedrückt) oder 1 (gedrückt) ausgegeben.

 
import pifacecad as p
cad = p.PiFaceCAD()
cad.lcd.clear()
cad.lcd.backlight_on()
cad.lcd.write("Hello World")
print("Taster 1: {}".format(cad.switches[0].value))
print("Taster 2: {}".format(cad.switches[1].value))
print("Taster 3: {}".format(cad.switches[2].value))
print("Taster 4: {}".format(cad.switches[3].value))
print("Taster 5: {}".format(cad.switches[4].value))
print("Rocker Taste:  {}".format(cad.switches[5].value))
print("Rocker Links:  {}".format(cad.switches[6].value))
print("Rocker Rechts: {}".format(cad.switches[7].value))

Das Programm kann man bei installiertem Python (Version 3) auf folgende Weise starten:

  1. interaktiv:
    indem man mit "python3" in einem Terminal die interaktive Python-Shell öffnet und jede Zeile eintippt und ausführt
  2. als Python-Skript:
    indem man die Zeilen in eine Datei speichert und mit "python3 mein-skript.py" ausführt
  3. als Shell-Skript:
    indem man in der Datei (der 2. Variante) die Zeile "#! /usr/bin/python3" vorranstellt, die Datei mit "chmod a+x mein-skript.py" ausführbar macht und anschließend das Skript mit "./mein-skript.py" ausführt

Leider funktionieren einige von den mitgelieferten Beispiele (Verzeichnis: /usr/share/doc/python3-pifacecad/examples) bei mir nicht. Die Zustände der Schalter lassen sich zwar per Polling abfragen, allerdings lösen registrierte Interrupt-Handler nicht aus. Der Fehler ist bekannt und wahrscheinlich durch ein Update für den Pi 2 entstanden. Die Lösungsmöglichkeiten habe ich nicht weiter verfolgt, da ich mit der Polling-Variante zufrieden bin.

Mit einem kostenlosen API-Key von Openweathermap können wir einige (auch zukünftige) Wetterdaten abfragen. Beispielsweise die aktuellen Wetterdaten für die Lat/Lng-Koordinaten (8.81, 53.08) mit deutscher Ausgabe:

Anfrage:
http://api.openweathermap.org/data/2.5/weather?lat=53.08&lon=8.81&appid=ABC&lang=de
Antwort:
{"coord":{"lon":8.81,"lat":53.08},"weather":[{"id":800,"main":"Clear","description":"klarer Himmel","icon":"01n"}],"base":"cmc stations","main":{"temp":271.037,"pressure":1037.38,"humidity":89,"temp_min":271.037,"temp_max":271.037,"sea_level":1038.16,"grnd_level":1037.38},"wind":{"speed":1.31,"deg":25.0061},"clouds":{"all":0},"dt":1456699111,"sys":{"message":0.0095,"country":"DE","sunrise":1456640015,"sunset":1456678905},"id":2944388,"name":"Bremen","cod":200}

Mit den beiden Programmcode-Schnipseln und ein bischen zusätzlichem Python-Code kann das folgende Skript entstehen. Jede Sekunde werden die Schalter abgefragt, ob ein anderer Schalter als zuvor gedrückt wird. Falls das der Fall ist, erfolgt eine Abfrage der aktuellen Wetterdaten und abhängig von dem gedrückten Schalter wird Temperatur, Luftdruck, Luftfeuchtigkeit, Wind oder Wetterlage angezeigt.

 
#! /usr/bin/python3

import sys
if sys.version[0] != '3':
        print ('You must run piface-weather with python3')
        sys.exit(0)

import json
from pprint import pprint
import datetime
import pifacecad
import codecs
from urllib.request import urlopen
from time import sleep

def formatTimestamp(timestampString):
    return datetime.datetime.fromtimestamp(int(timestampString)).strftime('%Y-%m-%d %H:%M:%S')

lat = "52.9"
lon = "8.58"
appId = "xyz"
weatherUrl = 'http://api.openweathermap.org/data/2.5/weather?lat=' + lat + '&lon=' + lon + '&lang=de&units=metric&appid=' + appId

cad = pifacecad.PiFaceCAD()
cad.lcd.backlight_on()
cad.lcd.cursor_off()
cad.lcd.blink_off()

valueChanged = True
currentSelection = 0

# Abbruch wenn Rocker gedrückt wird
while cad.switches[5].value != 1:
	if valueChanged:

		jsonFile = urlopen(weatherUrl)
		jsonFileContent = jsonFile.read().decode('utf-8')
		jsonObject = json.loads(jsonFileContent)

		temperature = jsonObject['main']['temp']
		humidity = jsonObject['main']['humidity']
		pressure = jsonObject['main']['pressure']
		weather = jsonObject['weather'][0]['description'].encode('ascii', 'ignore').decode('ascii')
		windDirection = jsonObject['wind']['deg']
		windSpeed = jsonObject['wind']['speed']
		sunRise = jsonObject['sys']['sunrise']
		sunSet= jsonObject['sys']['sunset']

		print
		print("{}: {} {}".format("Temperatur", temperature, "Grad"))
		print("{}: {} {}".format("Luftfeuchtigkeit", humidity, "%"))
		print("{}: {} {}".format("Luftdruck", pressure, "hPa"))
		print("{}: {}".format("Wetterlage", weather))
		print("{}: {} {}".format("Wind-Richtung", windDirection, "Grad"))
		print("{}: {} {}".format("Wind-Geschwindigkeit", windSpeed, "km/h"))
		print("{}: {} {}".format("Sonnenaufgang", formatTimestamp(sunRise), "Uhr"))
		print("{}: {} {}".format("Sonnenuntergang", formatTimestamp(sunSet), "Uhr"))
		print

		cad.lcd.clear()
		if currentSelection == 0 :
			cad.lcd.write("{}\n{} {}".format("Temperatur", temperature, "Grad"))
		if currentSelection == 1 :
			cad.lcd.write("{}\n{} {}".format("Luftdruck", pressure, "hPa"))
		if currentSelection == 2 :
			cad.lcd.write("{}\n{} {}".format("Luftfeuchtigkeit", humidity, "%"))
		if currentSelection == 3 :
			cad.lcd.write("{}\n{} {}".format("Wind",windSpeed, "km/h"))
		if currentSelection == 4 :
			cad.lcd.write("{}\n{}".format("Wetterlage", weather))

	oldSelection = currentSelection
	if cad.switches[0].value == 1 :
		currentSelection = 0
	if cad.switches[1].value == 1 :
		currentSelection = 1
	if cad.switches[2].value == 1 :
		currentSelection = 2
	if cad.switches[3].value == 1 :
		currentSelection = 3
	if cad.switches[4].value == 1 :
		currentSelection = 4
	valueChanged = oldSelection != currentSelection	

	sleep(1)

cad.lcd.clear() 
cad.lcd.backlight_off()

Das Skript der kleinen Wetterstation möchte ich natürlich nicht manuell starten, sondern es soll automatisch im Hintergrund ausgeführt werden, sobald der Raspberry Pi hochfährt. Dazu muss man lediglich in der Datei /etc/rc.local vor der letzten Exit-Zeile unser Skript eintragen:

 
#!/bin/bash -e
#
# rc.local for raspimjpeg
#
# This script is executed at the end of each multiuser runlevel.
# Make sure that the script will "exit 0" on success or any other
# value on error.
#
_IP=$(hostname -I) || true
if [ "$_IP" ]; then
  printf "My IP address is %s\n" "$_IP"
fi

/home/pi/piface/piface-weather.py &

exit 0

PiFaceCAD zeigt Wetterdaten an

PiFaceCAD zeigt Wetterdaten an


Die Openweathermap-API bietet noch viele weitere Abfragen, beispielsweise zu UV-Werten und Wettervorhersagen. Es gibt also immer weitere kleine Aufgaben zu erledigen, wenn man einen Raspberry Pi hat.

Kommentare sind geschlossen.