Skip to main content

Wetterstation + Raspberry Pi + wfrog

Screenshot von wfrog
Screenshot von http://wetter.cgiesel.de

Mein Vater besitzt die Wetterstation WH 1080. Diese misst die Temperatur, Luftfeuchtigkeit, Windstärke + Windrichtung sowie den Niederschlag. Per Solarmodul wird die Station mit Strom versorgt. Zudem gibt es eine Konsole mit Touchscreen (resistiv), welche die aktuellen Daten anzeigt. Außerdem können die Daten per USB ausgelesen werden - die Konsole besitzt einen Datenspeicher für über 4000 Datensätze.

Jede Woche liest mein Vater die Daten auf seinem Windowsrechner aus und kann dann mit dem Windowsprogramm den Verlauf der Werte darstellen. Mein Ziel war es, die Daten ständig auszulesen, grafisch darzustellen und zumindest im internen LAN für alle verfügbar zu machen. Und was liegt da näher als meinen Raspberry Pi zu verwenden.

Da ich auf meinen Laptops Arch Linux benutze, sollte auch auf dem Kleinen dies drauf. Hierfür gibt es eine spezielle ARM Version. Nachdem ich Arch Linux ARM auf die SD Karte gezogen und dann am Raspberry eingerichtet hatte, brauchte ich nur noch die passende Software. Nach einem bisschen googlen bin ich auf “wfrog” gestoßen. Die Software läuft mit python und benutzt für diese Wetterstation die “pywws” library. Leider waren beide Pakete weder in den offiziellen Arch Repositories, noch im Arch User Repository (AUR). Außerdem existierten keine systemd Startskripte für die mitgelieferten Programme. Bei beiden Problemen hatte ich mich einfach mal rangesetzt und fertige AUR-Pakate erstellt: pywws-git sowie wfrog-svn.

Also installiert einfach beide Pakete mit ihren Abhängigkeiten - ich habe dazu “yaourt” benutzt (pacman -S yaourt):

yaourt -S wfrog-svn pywws-git

Zum Testen der Verbindung zur Station kann man erst einmal folgenden Befehl eingeben (ggf als root):

python2 /usr/lib/python2.7/site-packages/pywws/TestWeatherStation.py

Wenn hier Hexadezimalzahlen und keine Fehler ausgegeben werden, dann sieht es schon einmal super aus.

Als nächstes lässt man die Config anlegen. Hier gibt man einfach folgendes eins (als root):

wfrog

Bei dem ersten Aufruf werden ein paar Daten abgefragt. Als “driver” musste ich “wh1080” eingeben. Außer bei der Angabe der Höhenmeter (schaut einfach auf der Wikipedia Seite eures Ortes nach) konnte ich alle Vorgaben so lassen. Nach der Abfrage bleibt der Befehl akiv. Jetzt kann schon unter der Adresse http://:7680 die Seite von wfrog aufgerufen werden. Bis man dort etwas sieht, dauert es ein wenig, da nur alle 10min Daten vom Gerät abgefragt werden. Leider wird der interne Speicher nicht verwendet.

Da wir ja den Befehl nicht immer von Hand ausführen und die Konsole immer offen haben wollen, benutzen wir einfach die erwähnten systemd Skripte. Kleine Anmerkung: Der Befehl “wfrog” umfasst zwei (theoretisch drei) Aufgaben, die gleichzeitig ausgeführt werden: Das Loggen der Daten inklusive Speichern (standardmäßig in eine CSV-Datei) sowie das Rendern der Webseite inklusive Bereitstellung über HTTP. Das Loggen übernimmt “wflogger” und das Rendern übernimmt “wfrender”. Die automatische Ausführung bei Systemstart erreichen wird durch folgende Befehle (beides als root):

systemctl enable wflogger
systemctl enable wfrender

Damit wir beides auch sofort mal starten, führen wir folgende Befehle ebenfalls als root aus:

systemctl start wflogger
systemctl start wfrender

Und schon müsste alles laufen. Im folgenden gebe ich noch ein paar Tipps:

Probleme beim Loggen

Falls beim Start des Loggers die USB-Verbindung noch nicht hergestellt ist, zwischendurch die Konsole vom USB abgezogen wird oder es anscheinend ohne Grund einfach so passiert, kriegt der Prozess keine Verbindung mehr zu der Konsole hin. Dies ist sehr ärgerlich, weil man das nicht immer sofort merkt und dann große Lücken entstehen. Hierzu muss man eigentlich nur den Prozess neustarten:

systemctl restart wflogger

Da man das aber nicht ständig manuell machen möchte, habe ich mir einfach ein python Skript erstellt (Achtung: pywws und wfrog benutzen Python 2 - ich benutze bei diesem Skript hingegen Python3. Also ggf per “pacman -S python” nachinstallieren):

#!/usr/bin/python
# -\*- coding: utf-8 -\*-

import os, stat
from time import time
import logging

logging.basicConfig(filename='/var/log/wfmonitor.log',level=logging.INFO,format='%(asctime)s %(levelname)s: %(message)s')

stats = os.stat("/var/lib/wfrog/wfrog.csv")
mindiff = (time() - stats\[stat.ST\_MTIME\]) / 60

if mindiff > 15:
  os.system('/usr/bin/systemctl restart wflogger')
  logging.warning('wflogger restarted')

Dieses Skript einfach abspeichern (ich habe es unter /usr/local/bin/wfmonitor) und dann per “crontab -e” einen Cronjob einrichten (Tipp: vor dem Befehl “EDITOR=nano " ohne Anführungszeichen angeben):

\# m h  dom mon dow   command
\*/20 \* \* \* \* /usr/bin/python /usr/local/bin/wfmonitor

Das Skript lasse ich also alle 20 Minuten starten und prüfe, ob in den letzten 15 Minuten in die CSV-Datei geschrieben wurde. Falls dies nicht getan wurde, wird der Service einfach restartet und dies geloggt. Bei den Zeiten muss man darauf achten, dass nur alle 10 Minuten vom Logger die Daten abgefragt werden. Beim Start des Services wird dies auch nicht sofort getan, sondern erst nach 10 Minuten. Daher habe ich solche komischen und langen Zeiten eingestellt. Bei meinen ersten Tests hatte ich dies nicht bedacht, wodurch das Skript ständig neugestartet hatte und der Logger überhaupt nicht zum loggen kam.

Weitere Einstellungen

Falls man ein bisschen mehr einstellen möchte, so sollte man sich mal die Dokumentation von wfrog anschauen. Mit folgenden Befehl kann man sich die ganzen Config-Dateien in “/etc/wfrog/” anlegen lassen (als root):

wfrog --customize

Unter “/etc/wfrog/wfrender/config/wfrender.yaml” kann man beispielsweise einstellen, dass periodisch statische HTML-Dateien erzeugt und per FTP hochgeladen werden. Das Ergebnis seht ihr bei mir unter http://wetter.cgiesel.de. Außerdem kann man die Wetterdaten auch an diverse Dienste senden lassen - ich bespiele beispielsweise die Open Weather Map (Station: zuhause).