Wetterwebsite mit Raspberry Pi

Schon lange läuft bei uns ein Raspberry Pi unterbrechungsfrei als kleiner Hausserver. Da dient er unter anderem als Webserver und Storage. Die Hausautomation auf Basis FHEM fragt auch Sensoren im Außenbereich ab und besitzt schon Wind- und Regenmesser. Warum also nicht die bestehende Installation für eine kleine Wetterwebsite nutzen, wo diverse Werte auch öffentlich gemacht werden.

Eine Wetterstation im Web also, wo sich jeder Besucher aus nah und fern über die aktuelle Wetterlage in unserer Gegend informieren kann. Ohne sich ein fertiges Paket anzuschaffen, natürlich auch ohne Gewähr für die ganz akkurate Messung und Verfügbarkeit der Ergebnisse. Als Schaltzentrale bekommt der Raspberry Pi nun extra Aufgaben zugewiesen, wie die Beschickung der Website mit den passend aufbereiteten Wetterdaten.

Nach dem Vorbild vergleichbarer Seiten aus dem Hobbybereich, sollte es Informationen über den lokalen Standort aus den hauseigenen Sensoren geben, mit Statistiken und sonstigen Quellen angereichert werden, nebst einer Wettervorhersage für das Gebiet. Auch Aufnahmen unserer Webcam sollten mit dabei sein.

Schnell war für die Website eine Subdomain reserviert, die ist aktuell unter wetter.smartewelt.de online und zeigt schon alles an.

Die lokalen Daten wie Temperatur, Niederschlag, Helligkeit, Luftfeuchte, Luftdruck und Wind speisen sich aus unserer Hausautomationssoftware, welche auf unserem Pi-Server mittlerweile schon ein paar Jahre und ganz zufriedenstellend läuft. Neben der gewohnten Aquisition der Daten muss der Pi nun auch alle Berechnungen machen, die für die Darstellung auf der neuen Wetterwebsite gebraucht werden, wie das Update von Round-Robin-Datenbanken und die Erzeugung der Diagramme daraus.

Und er ist auch für das Management der Wetterdaten eingespannt, wie das Rücksetzen der pro Stunde, Tag oder Monat kumulierten Summenwerte. Dazu nutzen wir die Crontab des Kleinrechners, die kommt auch bei der Übertragung zur Website zum Einsatz.

Alle anzuzeigenden Messwerte werden in Grafiken umgewandelt, und in diversen Zeitabständen wird ein Verzeichnis der Webpräsenz per SFTP damit beschickt. Von da aus sind alle Zahlengrafiken und Diagramme in die Website statisch eingebunden. Damit braucht unsere Wetterwebsite keinen eigenen Zugriff auf den Pi und es muss kein extra Port ins lokale Netzwerk geöffnet werden.

Für die Wettervorhersage haben wir uns für das API von „daswetter.com“ entschieden. Nach Anmeldung gibt es freien Zugriff auf das konfigurierbare Interface. Auf das kann man nun per User-ID direkt im Code der Website zugreifen und alle Vorschaudaten einlesen, um sie anschließend, nach eigenen Belangen formatiert, wieder auszugeben.

Wie sind wir nun für die konkrete Umsetzung vorgegangen? Bis auf den Luftdrucksensor, welcher per I2C-Bus direkt am Pi verkabelt ist, nutzen wir FHEM rund ums Haus. Der unter Technikinteressierten bekannte Automationsserver läuft gut auf einem Raspberry Pi3. Bislang war der Umzug auf die 4er-Version nicht angesagt, wo wir doch auch von SSD booten wollen.

Ein Vorteil von FHEM besteht in seiner Plattformunabhängigkeit in Bezug auf die anzubindende Hardware. So können eine Vielzahl von Geräten verschiedener Hersteller angebunden werden, wenn man die passenden Funkempfänger am Raspi angeschlossen hat. Für die Zwecke unserer Wetterwebsite fragen wir nur einen kleinen Teil unserer FHEM-Geräte ab.

Unserer Website liefern zu:
– Luftdrucksensor GY68-BMP180 (über I2C-Bus verbunden)
– Wind- und Regenmesser über TX-DTH-Empfänger an WS1600-IT Wetterstation
– Temperatur- und Luftfeuchte-Sensor TX29DTH-IT (LaCrosse-Protokoll)
– Helligkeitssensor HmIP-SLO (Homematic-IP)

Dazu hängen Jeelink- und CUL-Stick über USB, wie ein TRXC2-Empfänger am Raspberry Pi, die auch alle anderen Empfänger bedienen.
Da wir manche Dinge separat brauchen, besteht unsere Softwarebasis für die Wetterwebsite nicht nur aus einem einzigen Skript. Aber das Meiste ist in einem zusammengefasst, dort werden alle benötigten Werte aus FHEM gezogen und wir greifen dazu auf Python und Telnet zurück, wo eine typische Abfrage so aussieht:

import telnetlib
def FHEM_Value(fcmd):
tn= telnetlib.Telnet(“yourserver”,7072,20)
tn.write(fcmd)
res= tn.read_until(„\n“,3)
tn.close()
rain_str = FHEM_Value(„{ReadingsVal(‚Wetterstation‘,’rain‘,“)}\r\n“)
temp_str = FHEM_Value(„{ReadingsVal(‚Temp_Aussen‘,’temperature‘,“)}\r\n“)

Im ersten Beispiel wird der Wert des Regensensors des Geräts „Wetterstation“ als String abgefragt. Im zweiten Beispiel ist es der Temperatursensor namens „Temp_Aussen“. Im Anschluss kann man noch in float wandeln und auf eine Kommastelle runden.

Einen größeren Auszug möchte ich an dieser Stelle gar nicht geben, wo doch eure Implementierung ganz anders aussehen kann und ihr vielleicht einen Hausserver mittels homematic oder ioBroker am Laufen habt. Derlei Plattformen gibt es mittlerweile viele, und es soll ja auf das Bestehende aufgestockt werden.

Wer sich für unsere aktuelle Wahl interessiert, informiert sich am besten zuerst unter fhem.de. Erfahrene Nutzer wissen um die Arbeit, welche in einer hausumspannenden Installation mit vielen angebundenen Aktoren und Sensoren steckt. Es geht aber auch eine Nummer kleiner und auf die Wetterbeobachtung angepasst.

Unmittelbar nach den „lokalen Werten“ schließt sich auf unserer Website der Block „Statistiken“ an. In der Regel erhält man beim Messen nur kontinuierlich Werte für den Augenblick. Möchte man den Besuchern seiner Website einen Überblick über Tag und Monat geben, wird das Sammeln von Werten und etwas Rechenarbeit notwendig.

Für ein Tages-Maximum oder Minimum merkt man sich die Spitzenwerte, für die Regensumme pro Tag addiert man kontinuierlich auf. Wie später beschrieben, leistet hier die Crontab des Pi gute Dienste, um beispielsweise am Tages- oder Monatsende diverse Summen wieder auf Null zu setzen.

Für die Ausgestaltung eines solchen Statistik-Blocks kann man der eigenen Kreativität freien Lauf lassen. Diverse Anhaltspunkte, was für meine Besucher interessant sein könnte, kann ich mir von professionellen Seiten im Web holen.

Etwas stolz bin ich auf unsere Ermittlung des Luftdrucktrends, der aus den eigenen Messwerten abgeleitet wird. Dort extrahieren wir einige letzte Messpunkte und eliminieren Spitzen, um einen mittelfristigen Trend für die „Schön- oder Schlecht“-Wetterentwicklung zu ermitteln, wie er auch bei diversen Wetterstationen zur Anzeige gebracht wird.

Die Wetterbeobachtung lebt nicht zuletzt von Diagrammen, so lassen sich Verläufe besonders gut visualisieren. Um unseren Besuchern nicht nur schnöde Zahlen zu präsentieren, gibt es die auf unserer Website auch. Für unsere Betrachtung brauchen wir immer nur einen zeitlich begrenzten Ausschnitt. Da bieten sich Round-Robin-Datenbanken an.

Den Umgang damit können wir nur streifen, wo es doch ein weites Feld ist. Auch hier spielt der Pi als Plattform eine wesentliche Rolle. Für Python gibt es eine gute Integration der rrdtools, damit uns solcherlei Datenbanken als FIFO-Speicher für die zu merkenden Datenpunkte dienen können.
Im folgenden Auszug wird der vorher für den Luftdruck ermittelte Wert in die Datenbank „air.rrd“ mit dem Zeitstempel „N“ für „now“ unmittelbar geschrieben:

from rrdtool import update as rrd_update
ret = rrd_update(‚/mnt/…/air.rrd‘, ‚N:%s‘ %(str(luftdruck)));

Die Pfadangabe haben wir mit drei Punkten versehen, wo sie doch auch variabel sein kann und bei uns auf einer am Pi angebundenen SSD endet. Die häufig beschriebenen Datenbanken befinden sich bei uns also nicht auf der SD-Karte des Pi, sondern sind auf dessen Platte an USB ausgelagert.

Die rrdtools halten außerdem eine gelungene grafische Aufbereitung bereit, mit der man sich schicke Graphen ausgeben lassen kann. Die gibt es bei uns für Temperatur, Luftdruck und stündlicher Niederschlagsmenge.

Um solche Grafiken an die eigenen Bedürfnisse angepasst zu erzeugen, bietet die „graph“-Option der rrdtools viele Einstellungsmöglichkeiten. So sieht ein entsprechender Aufruf aus, den wir entsprechend angepasst für alle unsere Diagramme auf der Wetterwebsite genutzt haben:

rrdtool graph /…/aussen.png \
-w 1500 -h 570 \
-c BACK#cccccc -c SHADEA#cccccc -c SHADEB#cccccc \
–font TITLE:14 –font LEGEND:12 –font AXIS:10 \
–start -27h –title „Letzte 24 Stunden“ \
–vertical-label „Grad Celsius“ \
–alt-autoscale –x-grid HOUR:1:HOUR:2:HOUR:2:0:%R \
DEF:x2=/mnt/…/aussen.rrd:aussen:LAST \
VDEF:x2max=x2,MAXIMUM VDEF:x2min=x2,MINIMUM VDEF:x2last=x2,LAST \
HRULE:30#AAAAAA HRULE:5#AAAAAA HRULE:0#DD9999 \
VRULE:0#AAAAAA AREA:x2#f8f3f5: LINE3:x2#DF4466:Aussen \
GPRINT:x2max:“Max %5.1lf“ GPRINT:x2min:“Min %5.1lf“

RRD-Datenbanken brauchen ein kontinuierliches Update in bestimmten Intervallen. Da ist es gut, dass der Raspi als vollwertiger Linuxrechner eine Crontab bietet, wo man Herr über Minute, Stunde oder Tag ist und gezielt Prozesse starten kann.

Cron-Jobs nutzen wir also, um in regelmäßigen Abständen Sensordaten zu holen, in Auswertezeiträumen zusammenzufassen, die RRD-Archive zu füllen und der Wetterwebsite zur Verfügung zu stellen. Braucht man solches Scheduling häufiger, lohnt sich ein Blick in die Dokumentation von Cron.

Die anfallenden Aufgaben haben wir auf mehrere Skripte verteilt. So gibt es unter anderem:

# alle 6 Minuten rrd-Archiv “Luftdruck” füllen
*/6 * * * * /…/rrdgraph1.sh

# jede Stunde rrd-Archiv “Regen pro Stunde” füllen
0 * * * * /…/rrdgraph2.sh

# alle 10 Minuten Wetterdaten holen und uebertragen
*/10 * * * python /…/wetter.py

# kurz vor 0.00Uhr Regenwert des alten Tages merken
# wenn Regentag, Anzahl der Regentage hochzählen
# Min/Max-Werte des vergangenen Tages löschen
58 23 * * * python /…/rmem_d.py

# Regenwert des alten Monats merken, 0:05Uhr jeden ersten im Monat
5 0 1 * * python /…/rmem_m.py

Braucht man umfangreiches Scheduling häufiger, lohnt sich ein Blick in die Dokumentation von Cron. Werden die Werte der eigenen Sensoren nun zuverlässig ermittelt und auf der Website wie gewünscht angezeigt, kann man sich den weiteren Inhalten widmen.

Vorhersagen sind die Sache von Wetterdiensten. Aber eine von extern eingebundene Wetterkarte oder ein Wetterwidget zum eigenen Standort können die eigene Wetterseite positiv auflockern und gehören schließlich zum Thema. Da findet man im Web leicht etwas.

Möchte man umfangreichere Informationen abrufen, die sich auch noch flexibel formatieren lassen, bietet sich ein API an. Meist findet man hier Angebote für gewerbliche Kunden. Nach weniger umfangreichen und kostenfreien Schnittstellen für den Privatnutzer muss man mittlerweile suchen, wird aber bei daswetter.com von Meteored noch fündig.

Nach der Registrierung erhält man Zugang zum Bereich der Wetter-API mit Dokumentation, Icon-Sets und Beispielen für die Integration in die eigene Website. Zum Auslesen der Daten könnte man durchaus ein Skript auf einem Raspberry Pi verwenden.

Oft setzt ein kostenfreies Angebot jedoch die explizite Nutzung in Zusammenhang mit einer Website voraus, und wir benötigen die Hilfe vom Pi hier auch nicht wirklich. Mit ein paar Zeilen PHP im Code der Website liest man das Gewünschte aus der API. Wir starten die Abfrage mit

$file=’http://api.daswetter.com/index.php?api_lang=de&localidad=xxxxxx&affiliate_id=yyyyyyyyyyyy&v=2.0′;

und nutzen die Version 2 laut Dokumentation. Meteored stellt verschiedene Versionen mit unterschiedlich langer Beschreibung und unterschiedlicher Anzahl von Vorschautagen zur Verfügung.

Die hier mit „x“ und „y“ ausgefüllten Bereiche für die IDs erhält man nach der Konfiguration im persönlichen Bereich vom Anbieter.

Und der beschreibt in den Beispielen dann auch, wie man das Parsing der eben in $file eingelesenen XML-Daten macht, um ein Array mit Vorschaudaten zu füllen. Um auch schicke Wettersymbole anzeigen zu können, werden für die Symbole Zahlenwerte übertragen, die sich im Dateinamen der PNG-Files in den Iconsets wiederfinden. Damit kann man sich im Quelltext der eigenen Website seine Dateipfade zusammenbauen, und ein für die eigene Gestaltung passendes Iconset hinterlegen.

Geht man Schritt für Schritt vor, ist alles nicht so kompliziert. Damit auf unserer Wetterwebsite der Besucher nicht mit zuviel Information auf einmal konfrontiert wird, haben wir nach der Wochenübersicht, die Tagesübersichten ausklappbar gemacht. Die werden erst nach einem Buttonklick angezeigt.

Und was gibt es sonst noch? Im Block Tageszeiten zeigen wir Aufgangs- und Untergangs-Zeiten von Sonne und Mond an. Die sind nun gar nicht vom aktuellen Wetter beeinflusst, aber trotzdem eine beliebte Anzeige bei Wetterstationen.

Was da nicht über die Wetter-API kommt, kann man sich wieder mittels PHP-Funktionen holen. Bei uns das „Mondalter“ zum Beispiel. Oder man möchte sich die Sonnenaufgangs-Zeit für einen oder mehrere Tage im Voraus (vt) anzeigen lassen. Das klappt mittels

[?php echo date_sunset(mktime(0, 0, 0, date(„m“), date(„d“) + vt, date(„Y“)), SUNFUNCS_RET_STRING, 50.493307, 12.419366, ini_get(„date.sunset_zenith“), date(„O“) / 100);?]

erstaunlich einfach und braucht ansonsten nur die Koordinaten vom eigenen Standort.

Zum Schluss zeigen wir noch Webcam-Bilder und eine Standort-Karte an, damit der Besucher im Zweifelsfall auch weiß, wo unsere Beobachtungsstation liegt. Dass unsere Webcam auch mit dem Pi im Hintergrund arbeitet, kriegt er nicht mit.

Mitunter schaut er aber nicht vom heimischen PC oder Notebook rein, sondern auch von unterwegs. Da auf unserer Website viel eigener Code eingebracht werden sollte, aber kaum etwas verwaltet werden muss, kam nur eigene Programmierung und kein CMS wie etwa WordPress zum Einsatz.

Trotzdem haben wir auf ein „Responsive Design“ Wert gelegt, so dass sich alles gut auch auf mobilen Geräten skaliert und auf dem Smartphone von unterwegs gut „durchstöbern“ lässt.

Soviel zur Reise durch unsere Wetterwebsite. Mittlerweile nutze ich die Website gerne auch als eigene und schnelle Informationsquelle, wo doch viel an einem Ort zusammengefasst ist. Das nützt mir für eigene Zwecke und ich hoffe, dass das etwa anderen Besuchern, wie Freunden oder Bekannten, genauso geht. Außerdem ist sie in diversen Verzeichnissen als Wetterwebsite eingetragen, genauso wie die integrierte Webcam, welche man dadurch auch ganz gut im Web finden kann.

Wir wollten zeigen, wie man mit etwas zusätzlicher Programmierung zu einer eigenen Wetterwebsite kommen kann, in dem man nutzt, was etwa schon da ist. Ohne dass man sich gleich eine professionelle Wertewarte anschafft.
Ein Thema für den Pi ist es deshalb, weil er bei uns den nötigen Serverbetrieb macht. Wo er da noch andere Aufgaben hat, sollte man bei einem Neuaufbau gleich einen 3er-oder 4er-Pi vorsehen.

Abseits davon haben wir auf ein paar Regeln zur Werteermittlung geachtet. So ist der Temperatursensor auf der Nordseite vom Gebäude abgeschattet und belüftet.

Aber mit mehr oder weniger professionellen privaten Beobachtungsstationen, die auch den Wetterdiensten zuliefern, kann und soll unsere Lösung auch nicht konkurrieren. So stört es mich auch nicht, dass unser Regenmesser nur ein einfaches Wippenmodell mit 0.5mm Auflösung ist und bin mit unseren Ergebnissen recht zufrieden.

Aus eigener Erfahrung kann ich nun sagen, wenn man einmal eine solche Website aufgebaut hat, wird man sich immer häufiger ertappen, mal eben nebenbei die aktuelle Lage checken zu müssen. Sei es auf Grund der wechselnden Wetterverhältnisse in diesen Jahren oder weil es einfach ein interessantes Hobby ist, dem immer mehr Leute folgen…

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert