pywws – Wettersoftware für USB Wireless Wetterstationen

Cookies ermöglichen eine bestmögliche Bereitstellung dieser Webseite. Mit der Nutzung von test-wetterstation.de erklären Sie sich damit einverstanden, dass wir Cookies verwenden.

In unserer Testreihe unterschiedlicher Software für Wetterstationen schauen wir uns in diesem Artikel die Software „pywws“ (Python software for USB Wireless WeatherStations) einmal genauer an. Bei pywws handelt es sich um eine freie Software, die in Python von Jim Easterbrook geschrieben wurde. Die Wettersoftware unterstützt die Wetterstationen WH1080, WH1081, WH-1080PC, WH3080, Elecsa AstroTouch 6975 und Watson W-8681. Auch weitere Stationen, die mittels USB-Kabel an den PC angeschlossen werden, könnten eventuell mit dieser Software ausgelesen werden. Dies kann jedoch nicht garantiert werden.

Um es gleich vorweg zu nehmen: pywws ist keine Wetterstations-Software für Anfänger. Wobei hier nicht die Kenntnisse in der Wetterforschung gemeint sind, sondern in der Installation und Konfiguration einer Software unter Linux bzw. einem Raspberry Pi. Denn genau auf diesem Mini-Rechner möchten wir heute pywws zum Laufen bringen. Und dies ist umfangreicher, als wir zunächst angenommen haben. Wir haben uns extra für diesen Test wieder eine WH1080-Wetterstation zugelegt. Wieder bedeutet, wir hatten in der Vergangenheit eine Nextrend WH1080, die aber nach rund zwei Jahren ihren Dienst eingestellt hat. Als günstigstes Modell der WH1080 haben wir uns eine „ForeverSpeed WH1080“ zugelegt, die seither neben der Davis VUE am gleichen Mast ihre Daten sammelt.

wh1080 und davis vantage vue
Vor unserer Redaktion befinden sich aktuell zwei Außeneinheiten: Die Davis Vantage VUE (links) und die Außeneinheit eines WH-1080-Klones (rechts).

Die Installation von pywws auf dem Raspberry Pi

Wir installieren pywws auf einem Raspberry Pi mit einer 16GB-SD-Karte. 8GB und auch geringere Kartenkapazitäten sollten möglich sein, wurden von mir jedoch nicht getestet.

Basis-Image auf SD-Karte schreiben (unter Windows)

Die folgende Beschreibung richtet sich an Windows-User. Unter Linux ist das Schreiben des Basis-Image ebenfalls möglich.
Ich werde den Punkt nur schematisch erklären. Eine deutsche Anleitung ist hier erhältlich. Der Ablauf ist wie folgt: Zuerst wird das fertige Image heruntergeladen. Wir haben für dieses Projekt das Image „2017-11-29-raspbian-stretch-lite.img“ genutzt. Mit einem ImageWriter Programm wie win32diskimager wird das Image auf die SD-Karte für den Raspberry geschrieben.
Wenn das Image geschrieben wurde, wird die SD-Karte aus dem Windows-Rechner entfernt und in den Raspberry eingelegt. Dann können das Netzwerkkabel und das Netzteil verbunden werden. Der Raspberry sollte booten.

Erste Kontaktaufnahme mit pywws

Mittels Putty verbinden wir uns auf den Raspberry. Dieser sollte über den lokalen DHCP-Server eine IP zugewiesen bekommen haben. Dies ist über den lokalen DHCP-Server (bei einer FritzBox zu finden über HEIMNETZ / NETZWERK / NETZWERKVERBINDUNGEN).
Der Raspberry verlangt eine Authentifikation („login as:“). Der Benutzername ist beim ersten Start „pi“, das Passwort „raspberry“).

Mittels Putty wird auf den Raspberry zugegriffen und mit dem Benutzer „pi“ eingeloggt. Zuerst sollte man das verwendete Image auf den neuesten Stand bringen.

Zuerst wird das Betriebssystem aktualisiert. Dies erfolgt mit den nachfolgenden Befehlen:

sudo apt-get update
sudo apt-get upgrade

Danach sollte man auch gleich die korrekte Zeitzone dem Raspberry mitteilen:
sudo timedatectl set-timezone Europe/Berlin

Phyton und weitere Bibliotheken installieren

Danach wird python, libusb, croniter und gnuplot installiert. Phyton ist in der Regel bereits vorhanden, jedoch nicht in der richtigen Version. Libusb wird als USB-Verbindung zur Wetterstation benötigt. Gnuplot benötigen wir zum Erstellen von Wettergrafiken.

sudo apt-get install python-pip python-dev python-usb python-daemon gnuplot libusb-1.0.0
sudo pip install croniter

Nun endlich: pywws installieren

pywws grafiken
pywws kann die Daten der WH1080 als Grafik, aber auch als HTML-Template ausliefern.

Nun kann pywws installiert werden:

cd ~
sudo pip install pywws

Dann testen wir, ob pywws läuft und die Wetterstation erkennt. Dazu muss jetzt die Basisstation der (WH1080) Wetterstation mit dem USB-Kabel an einen der vier USB-Ports des Raspberry verbunden werden. Wir setzen folgenden Befehl ab:

sudo pywws-testweatherstation

Die putty-Ausgabe sollte ungefähr so aussehen:

2018-03-21 17_45_36-pi@raspberrypi_ ~.png

Wenn hier Fehler auftreten, kann im Handbuch von pywws einige Ansätze zur Hilfe gefunden werden.

Weitere Rechte erteilen

sudo addgroup --system weather
sudo usermod --append -G weather pi

Abfrage der idVendor und idProduct

Um die Wetterstation eindeutig zu identifizieren, müssen diese beiden Parameter abgefragt und ggfls. in folgenden Anweisungen ersetzt werden. Die Abfrage erfolgt mit folgendem Befehl:
cat /var/log/kern.log | grep hid

Die beiden benötigten Werte sind im zweiten rot markieren Bereich zu finden.

In der Ausgabe finden wir bei unserer Wetterstation folgenden Wert „0003:1941:8021.0001“. Dies bedeutet folgende Zuweisung:

idVendor=1941
idProduct=8021

Udev-Rule zuweisen

Um die zuvor erstellten Gruppen auch dauerhaft der Wetterstation zuzuweisen, muss die nachfolgende Regel erstellt werden. Dazu bemühen wir den Editor nano (oder ein beliebigen anderen Editor). Der erstellt die Regel. Diese muss dann im Editor eingegeben (oder hineinkopiert) werden:

sudo nano /etc/udev/rules.d/38-weather-station.rules

EINGABE (evtl. Die Vendor ID “1941” und Product ID „8021“ anpassen, wenn zuvor andere Werte ermittelt wurden)

# Weather Station
ACTION=="add", SUBSYSTEM=="usb", ATTRS{idVendor}=="1941", ATTRS{idProduct}=="8021", GROUP="weather", MODE="0660"
ACTION=="change", SUBSYSTEM=="usb", ATTRS{idVendor}=="1941", ATTRS{idProduct}=="8021", GROUP="weather", MODE="0660"

Bei der Eingabe darauf achten, dass die Hochkommas nicht irgendwie “optimiert” oder “verändert” wurden. Ein leidiges Thema.

Es ist darauf zu achten, dass die Hochkommas korrekt sind. Hier wird die Eingabe über den nano-Editor getätigt. Natürlich können auch andere Editoren verwendet werden.

Raspberry rebooten

Nun wird der Raspberry neu gestartet. Wir loggen uns erneut mit “pi, raspberry ein”:

sudo shutdown -r now
Dann kann die Verbindung zur Wetterstation erneut getestet werden:
python -m pywws.TestWeatherStation

OUTPUT:
pi@raspberrypi:~ $ python -m pywws.TestWeatherStation
17:48:18:pywws.Logger:pywws version 17.11.0, build 1380 (b01d94a)
0000 55 aa 80 10 20 9f 3f 04 60 e1 0a fb 9f 1e f5 ff 1e 00 02 20 09 00 00 00 00 00 00 02 00 00 10 2d
0020 6c 27 68 26 00 00 00 00 00 00 00 18 03 17 18 41 41 23 c8 00 00 00 46 2d 2c 01 64 80 c8 00 00 00
0040 64 00 64 80 a0 28 80 25 a0 28 80 25 00 b4 00 00 68 01 00 00 00 f4 01 12 00 00 00 00 00 00 00 64
0060 04 60 33 1e 63 28 fb 00 8b 00 b2 00 00 00 b2 00 3f 80 74 00 30 80 f2 26 0a 26 33 28 2b 27 3d 00
0080 55 00 0f 00 2a 00 4b 00 4b 00 4b 00 00 18 03 05 18 13 18 03 05 20 46 18 03 07 06 17 18 03 14 15
00a0 26 18 03 05 20 46 18 03 05 06 56 18 03 16 16 29 18 03 06 06 48 18 03 16 16 29 18 03 17 11 44 18
00c0 03 10 17 48 18 03 17 18 39 18 03 14 08 12 18 03 06 16 10 18 03 09 10 23 18 03 15 15 43 18 03 17
00e0 11 44 18 03 17 10 31 18 03 08 18 09 18 03 14 01 18 18 03 17 11 43 18 03 17 11 43 18 03 17 11 43

ODER

pywws-testweatherstation
15:47:33:pywws.Logger:pywws version 14.06.dev1238

pywws-testweatherstation
Nach der Eingabe des Befehles „pywws-testweatherstation“ sollte die Konsole viele Hex-Werte ausgeben.

pywws: Erste Anpassungen

Nun kommen wir zu den ersten Anpassungen, die wir nun vornehmen müssen. Zuerst legen wir ein Basis-Verzeichnis für die Daten an:

mkdir -p ~/weather/data

Dann setzen wir das Erfassungsintervall der WH1080. Dieses Intervall (in Minuten) ist jenes, das zwischen zwei Messungen der Wetterstation liegt. Im Standard-Modus ist dies auf 30 Minuten gestellt, wir möchten nun alle 10 Minuten eine Messung durchführen:

pywws-setweatherstation -r 10

Die ini-Datei von pywws anpassen

Die ini-Datei, also das Config-File, welches pywws zur Steuerung benutzt, kann im Pfad /home/pi/data/weather/data gefunden werden. Soviel zur Theorie. Bei meinen Tests habe ich das File manuell anlegen müssen:

cd ~/weather/data/
nano weather.ini

In das File schreiben wir mit dem Nano-Editor:

[config]
ws type = 1080
usb activity margin = 3.0
pressure offset = 48.6
day end hour = 0
logdata sync = 1
rain day threshold = 0.2
frequent writes = False
template encoding = iso-8859-1
gnuplot version = 4.2
gnuplot encoding = iso_8859_1
asynchronous = False

[paths]
templates = /home/pi/weather/templates/
graph_templates = /home/pi/weather/graph_templates/
work = /home/pi/weather/tmp
local_files = /home/pi/weather/results/


[ftp]
local site = True
secure = False
site = ftp_pfad
user = username
password = userpassword
directory = /var/www/weather/data
port = 21

[live]
services = []
plot = []
text = []

[logged]
services = []
text = []
plot = []

[hourly]
services = []
plot = ['7days.png.xml', '24hrs.png.xml', 'rose_24hrs.png.xml']
text = ['24hrs.txt', '6hrs.txt', '7days.txt']

[12 hourly]
services = []
plot = []
text = []

[daily]
services = []
plot = ['28days.png.xml']
text = ['allmonths.txt']

Dies ist das Standard-ini-File, welches wir im ersten Schritt einmal so verwenden können. Weitere Anpassungen werden wir später vornehmen. Wenn eine andere Wetterstation als die WH1080 verwendet wird, muss selbstverständlich der Punkt „ws type = 1080“ angepasst werden.

Pywws ist installiert – wie geht es weiter?

Wenn bis zu diesem Punkt alles korrekt läuft, kann pywws als Cron-Job eingerichtet werden. Jedoch sollte man dies nicht (mehr) machen, da es in der aktuelle Version bessere Wege gibt. Zur Verdeutlichung beschreibe ich dennoch diesen Weg:

Mit dem nachfolgenden Weg startet man den Datenabzug stündlich:
pywws-hourly -vvv ~/weather/data

Durch diesen Aufruf werden alle Wetterdaten aus der WH1080 ausgelesen. Im Verzeichnis „raw“ findet man die „Rohdaten“ aus der Wetterstation. Doch pywws macht mehr. Es generiert aus den von der Wetterstation zur Verfügung gestellten Rohdaten auch stündliche, tägliche und monatliche Statistikdaten. Diese findet man in den entsprechenden Ordnern:

In älteren Versionen wurde empfohlen, den stündlichen Aufruf wie folgt per Cron-Job zu implementieren:

0 * * * * pywws-hourly /home/pi/weather/data

Dies kann man testweise eine zeitlang so durchführen, doch mit aktuelleren Versionen von pywws gibt es elegantere Möglichkeiten.

Pywws-livelog: Der elegantere Weg

Der “elegantere Weg” lautet “Live-Log”. Der Aufruf für diesen Befehl lautet:
pywws-livelog -vvv ~/weather/data

Damit “Live-Log” funktioniert, müssen noch einige Anpassungen vorgenommen werden. Zuerst benötigt der Job einen „tmp“-Ordner, in dem Daten zwischengespeichert werden können:

Wenn der Job ohne Fehlermeldung startet, lassen wir den Job fünf bis zehn Minuten lang laufen. Abbrechen kann man den Job mittels ‘C’. Nun wäre es angebracht, die Logs zu prüfen und sich mit dem Dateisystem auseinanderzusetzen. Es wurden neue Ordner angelegt und mit Daten gefüllt.

Dann ist ein Blick in die weather.ini sinnvoll. Es gibt für den “Live-Log”-Job einen eigenen Bereich:

[live]
services = []
plot = []
text = []

Dann wird ein weiterer Fehler auftreten:

pywws-livelog -vvv ~/weather/data
No such file or directory: '/home/pi/weather/templates/24hrs.txt'

Pywws bringt in der Standardinstallation keine Templates mit. Diese werden aber bereits in der ini-Datei angesprochen (Bereich „hourly / daily“, „plot“ und „text“). Daher wird die Fehlermeldung ausgegeben. Die Templates können bei github heruntergeladen werden:

HTML-Templates: https://github.com/jim-easterbrook/pywws/tree/master/src/pywws/examples/templates

Grafik-Templates: https://github.com/jim-easterbrook/pywws/tree/master/src/pywws/examples/graph_templates

Diese werden dann in diese beiden Verzeichnisse kopiert:

Weitere Templates für pywws

http://weatherbyyou.com/dl.php
http://weatherbyyou.com/pywws/template/index.php

Fehler „ValueError: No closing quotation“

Sollte dieser Fehler auftreten, so wurden nicht die Templates bei github heruntergeladen, sondern die Webseite von github. Der Python-Interpreter wird mit der kompletten HTML-Seite nichts anfangen können. Daher einfach mal einen Blick auf die Templates werfen und diese entsprechend korrigieren.

File "/usr/lib/python2.7/shlex.py", line 172, in read_token
raise ValueError, "No closing quotation"
ValueError: No closing quotation

sFTP-Upload

Etwas problematischer war der sFTP-Upload. Diese hat uns einiges an Nerven gekostet, bis dies funktioniert hat. Prinzipiell sind die Daten in der weather.ini (inklusive dem Passwort im Klartext) zu hinterlegen.
Da wir jedoch einen sFTP-Upload angestrebt haben, musste hier nachinstalliert werden. Dazu sollten die zwei Module „paramiko“ und „pycrypto“ mittels „apt-get install python-paramiko“ installiert werden. Jedoch lies sich „paramiko“ bei uns nicht fehlerfrei installieren.
Nach längerem googeln brachte der nachfolgende Befehl die Pakete korrekt auf unseren Raspberry:
sudo pip install pycrypto paramiko

pywws automatisch starten

Man kann pywws auf einem Raspberry rund um die Uhr die Wetterdaten auslesen lassen. Wenn der Raspberry jedoch einmal neu gestartet werden muss, darf man nicht vergessen, pywws wieder zu starten. Um pywws automatisiert zu starten, kann ein Dämon eingerichtet werden. Einfacher ist jedoch, den Rat von Jim Easterbrook zu folgen, und sein SH-Startskript durch einen Cronjob aufrufen zu lassen. Aktuell haben wir unsere pywws-Instanz so administriert. Der genaue Ablauf und das Skript sind ausführlich in der Dokumentation beschrieben.

Referenzen

Pywws Dokumentation: http://pywws.readthedocs.org/
pywws auf GitHub: https://github.com/jim-easterbrook/pywws

Rainer Hoppe
Über den Autor: Rainer Hoppe ist ein kritischer und professioneller Produkttester. Er hat bereits über 300 aktuelle Produkte getestet und in Testberichte beschrieben. Aktuell leitet Rainer unsere Wetterstation Test Reihe. Rainer, Anfang 30, ist ein begeisteter Technik und Computer-Fan, Freizeit-Mountain-Biker sowie ein stolzer und rührender Vater einer kleinen Tochter.

Schreibe einen Kommentar

68 − 59 =