Quelle: http://www.eskofier.de/projekte/modellbau/13-wetterstation-am-modellflugplatz-mit-pywws
Wetterstation am Modellflugplatz mit Raspberry Pi und pywws
In diesem Artikel geht es um den Aufbau einer Wetterstation am Modellflugplatz. Die Station besteht aus einer handelsüblichen Wetterstation vom Typ WH 1080, welche unter verschiedene Markennahmen und Typbezeichnungen im Handel zu bekommen ist. Diese bietet die Erfassung von Temperatur (aussen und innen), Luftdruck (absolut und relativ), Luftfeuchte (relativ), Windrichtung, Windgeschwindigkeit und Regenmenge. Über eine USB Schnittstelle an der Zentraleinheit lassen sich die gemessenen Werte auslesen und weiter verarbeiten.
Das Auslesen, Verarbeiten und Darstellung der gemessenen Werte übernimmt ein Raspberry Pi zusammen mit pywws. Mit Apache auf dem Raspberry werden die Daten für den Webrowser abrufbar dargestellt. Dazu werden noch die Java Script Bibliotheken "SteelSeries Gauges" und "Highcharts" eingesetzt. Mit den "Steel Series Gauges" werden die aktuellen Werte dargestellt. Für die Stunden- und Tagesverläufe eignet sich "Highcharts" am Besten. Über einen UMTS-Router lassen sich die Daten der Wetterstation dann im Internet abrufen.
Grundinstallation Raspberry Pi
Als nächstes wird das Betriebssystem NOOBS von der Raspberry Pi Support Seite heruntergeladen. Die ZIP-Datei ist unter folgender Adresse zu finden:
http://www.raspberrypi.org/downloads
Für meine Installation nutze ich die zu diesem Zeitpunkt (2014-07-07) aktuelle Version NOOBS_V1.3.8.zip
NOOBS INSTALLATION INSTRUCTIONS
1. Insert an SD card that is 4GB or greater in size into your computer.
2. Format the SD card using the platform-specific instructions below:
a. Windows
i. Download the SD Association's Formatting Tool from https://www.sdcard.org/downloads/formatter_4/eula_windows/
ii. Install and run the Formatting Tool on your machine
iii. Set "FORMAT SIZE ADJUSTMENT" option to "ON" in the "Options" menu
iv. Check that the SD card you inserted matches the one selected by the Tool
v. Click the "Format" button
b. Mac
i. Download the SD Association's Formatting Tool from https://www.sdcard.org/downloads/formatter_4/eula_mac/
ii. Install and run the Formatting Tool on your machine
iii. Select "Overwrite Format"
iv. Check that the SD card you inserted matches the one selected by the Tool
v. Click the "Format" button
c. Linux
i. We recommend using gparted (or the command line version parted)
ii. Format the entire disk as FAT
3. Extract the files contained in this NOOBS zip file.
4. Copy the extracted files onto the SD card that you just formatted so that this file is at the root directory of the SD card. Please note that in some cases it may extract the files into a folder, if this is the case then please copy across the files from inside the folder rather than the folder itself.
5. Insert the SD card into your Pi and connect the power supply.
Your Pi will now boot into NOOBS and should display a list of operating systems that you can choose to install.
If your display remains blank, you should select the correct output mode for your display by pressing one of the following number keys on your keyboard:
1. HDMI mode - this is the default display mode.
2. HDMI safe mode - select this mode if you are using the HDMI connector and cannot see anything on screen when the Pi has booted.
3. Composite PAL mode - select either this mode or composite NTSC mode if you are using the composite RCA video connector.
4. Composite NTSC mode
If you are still having difficulties after following these instructions, then please visit the Raspberry Pi Forum ( http://www.raspberrypi.org/phpBB3/ ) for support.
Zuerst wird die SD Karte noch einmal formatiert. Dazu wird das kostenlose Tool SD Formatter V4.0 eingesetzt. Dieses lässt sich von folgender Quelle herunterladen:
https://www.sdcard.org/downloads/formatter_4/
Der entpackte Inhalt wird in das Hauptverzeichnis der SD-Karte kopiert.
Jetzt ist es Zeit die mit dem Raspberry Betriebssystem versehene SD-Karte in den Raspberry einzusetzen. Als nächstes werden noch ein Monitor (bzw. auch LCD Fernseher) per HDMI und eine Tastatur/Maus über USB sowie das Netzwerk an die RJ45-Buchse angeschlossen. Die Stromversorgung erfolgt dann mittels eines Smartphone Netzteils und Smartphone Ladekabel (Micro USB).
Nachdem die Stromversorgung angeschlossen ist, sollte sich der Raspberry langsam melden und sich für die initiale Installation vorbereiten.
Danach den Raspberry ausschalten:
sudo shutdown -r now
Jetzt die WLAN-Adapter in den USB-Steckplatz einstecken und das Netzwerkkabel vom Raspberry trennen.
Nach dem Neustart die GUI öffnen:
startx
Mit "WiFi Config" das Netzwerk einrichten. Der WLAN-Adapter sollte als wlan0 erkannt worden sein, andernfalls siehe unten oder https://learn.adafruit.com/adafruits-raspberry-pi-lesson-3-network-setup/setting-up-wifi-with-raspbian . Danach den Raspberry wieder ausschalten und das Netzwerkkabel wieder anstecken und den Raspberry starten. Die stabilere Datenverbindung ist sinnvoll, da viele Pakete installiert werden müssen.
Alle folgenden Arbeiten erfolgen über die Konsole. Diese habe ich von der GUI aus gestartet:
startx
Doppel-Klick auf "LXTerminal".
Bevor pywws installiert werden kann, müssen einige Pakete auf dem Raspberry Pi installiert werden. Dazu einfach folgende Kommandos ausführen:
sudo apt-get update
sudo apt-get upgrade
sudo apt-get install git
sudo apt-get install python-dev
sudo apt-get install libudev-dev
gnu-plot (kommandozeilengesteuertes Plot-Programm für Diagramme)
sudo apt-get install gnuplot
Nun muss der Source Code für libusb (http://sourceforge.net/projects/libusb/files/libusb-1.0/libusb-1.0.19/) heruntergeladen, kompiliert und installiert werden:
mkdir ~/src
cd ~/src
wget http://sourceforge.net/projects/libusb/files/libusb-1.0/libusb-1.0.19/libusb-1.0.19.tar.bz2
tar xvjf libusb-1.0.19.tar.bz2
cd ~/src/libusb-1.0.19
./configure
make
sudo make install
Im nächsten Schritt wird Cyton (https://pypi.python.org/packages/source/C/Cython/) installiert:
cd ~/src
wget http://pypi.python.org/packages/source/C/Cython/Cython-0.20.2.tar.gz
tar xvzf Cython-0.20.2.tar.gz
cd ~/src/Cython-0.20.2
sudo python setup.py install
Achtung: Die Ausführung dauert über eine Stunde.
Als nächstes wird die cython-hidapi installiert (hid = human interface device):
cd ~/src
git clone https://github.com/gbishop/cython-hidapi.git
Im Setup-Skript muss jetzt allerdings noch der Pfad zu "libusb" berichtigt werden:
cd ~/src/cython-hidapi
nano setup.py
In der Datei muss folgende Zeile geändert werden von
os.environ['CFLAGS'] = "-I/usr/include/libusb-1.0"
os.environ['LDFLAGS'] = "-L/usr/lib/i386-linux-gnu -lusb-1.0 -ludev -lrt"
zu:
os.environ['CFLAGS'] = "-I/usr/local/include/libusb-1.0"
os.environ['LDFLAGS'] = "-L/usr/lib/arm-linux-gnueabihf -lusb-1.0 -ludev -lrt"
sudo cp /lib/arm-linux-gnueabihf/libudev.so.0 /usr/lib/arm-linux-gnueabihf/libudev.so
Jetzt noch die Library installieren:
sudo python setup.py install
Jetzt kommen wir zur Installation des eigentlichen Programmes zur Kopplung des RaspberryPi mit der Wetterstation und zur Verarbeitung der Daten.
Die aktuelle Version von pywws findet man unter http://jim-easterbrook.github.com/pywws/.
Als nächstes wird pip installiert. Damit lässt sich ähnlich wie mit apt-get das aktuelle Package von pywws installieren:
sudo apt-get install python-pip
Easy installation
The easiest way to install pywws is with the pip command:
sudo pip install pywws
Upgrading pywws is also a one line command:
sudo pip install -U pywws
Now you are ready to Test the weather station connection.
Nachdem das Paket pywws erfolgreich installiert wurde und die Zentraleinheit über USB angeschlossen ist, kann mit folgendem Befehl geprüft werden, ob die Verbindung funktioniert:
sudo python -m pywws.TestWeatherStation
There are several reasons why this might not work. Most likely is a ‘permissions’ problem. This can be tested by running the command as root:
sudo pywws-testweatherstation
Now you are ready to Test the weather station connection.
Es sollte dann eine Ausgabe erscheinen, die in etwa so aussieht:
0000 55 aa ff ff 3f 1d ff ff ff 82 2d 00 40 ff ff ff 01 20 02 21 09 00 00 00 00 7f 00 f0 0f 00 80 bf
0020 97 27 42 1d 00 00 00 00 00 00 00 13 09 12 22 45 41 23 c8 00 00 00 46 2d 2c 01 65 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 0a 00 f4 01 12 00 00 00 00 00 00 00 00
0060 00 00 40 1f 5e 12 13 01 aa 00 7d 01 72 00 7d 01 72 00 ad 00 35 00 ab 1d f2 1c 2c 28 5b 27 55 00
0080 c0 02 f4 ff fd ff fd ff fd ff ba 03 00 13 09 08 10 17 13 08 22 16 25 13 09 04 06 17 13 08 22 15
00a0 07 13 08 22 18 09 13 09 11 08 41 13 09 07 10 43 13 08 22 06 31 13 09 07 10 43 13 08 22 06 31 13
00c0 09 07 10 22 13 08 22 15 07 13 08 20 22 03 13 08 25 14 52 13 08 21 00 13 13 09 12 05 10 13 08 27
00e0 15 36 13 09 07 10 15 13 09 07 10 22 13 09 07 10 22 13 09 07 10 22 13 09 07 10 22 13 08 28 09 40
Damit nicht alle Skripts zum Zugriff auf das USB-Gerät als Administrator, also mit vorangestellten sudo, ausgeführt werden müssen, müssen wir noch die Rechte entsprechend anpassen. Im ersten Schritt legen wir eine Systemgruppe mit der Bezeichnung weather an, dem der Benutzer pi angehören soll.
sudo addgroup --system weather
sudo adduser pi weather
Dieser Gruppe soll der Zugriff auf das USB-Gerät der Wetterstation erlaubt werden. Wir benötigen dazu Product- und Vendor-ID, die wir mit dem Befehl dmesg oder lsusb ermitteln (siehe oben).
lsusb
Ergebnis:
...
Bus 001 Device 008: ID1941:8021 Dream Link WH1080 Weather Station / USB Missile Launcher
...
Bei meiner Wetterstation lautet die Vendor-ID 1941 und die Product-ID 8021. Damit können wir eine neue Regel anlegen, die als Textdatei im Ordner /etc/udev/rules.d liegt:
sudo nano /etc/udev/rules.d/39-weather-station.rules
Dort wird folgendes eingetragen, wobei eben Product- und Vendor-ID eventuell anzupassen sind:
ACTION!="add|change", GOTO="rpi_end"
SUBSYSTEM=="usb", ATTRS{idVendor}=="1941", ATTRS{idProduct}=="8021", GROUP="weather"
LABEL="rpi_end"
Zur Erinnerung: mit Strg-X speichern und das Speichern bestätigen.
Nun ist es einmal Zeit für einen Reboot:
sudo reboot
Danach sollten sich die Skripte als “normaler” Benutzer pi aufrufen lassen, z.B.:
pywws-testweatherstation
Damit ist die grundsätzliche Installation der Wetterstation und der Software pywws abgeschlossen. Jetzt gehen wir daran, diese noch einzurichten und an unsere Anforderungen anzupassen.
Die Wetterstation zeichnet in der Voreinstellung alle 30 Minuten die Wetterdaten im internen Speicher auf, damit lassen sich die Daten über 11 Wochen halten. Dieses Intervall lässt sich mit dem folgenden Befehl auf 5 Minuten verkürzen, womit immer noch die Daten für 2 Wochen im internen Speicher verbleiben.
pywws-setweatherstation -r 5
Zuerst benötigen wir noch ein paar Verzeichnisse, die anzulegen sind, falls noch nicht vorhanden:
mkdir weather
cd ~/weather
mkdir templates
mkdir graph_templates
mkdir data
mkdir temp
mkdir results
Als nächstes werden die Templates aus dem Verzeichnis /usr/local/share/pywws/examples in das Datenverzeichnis kopiert:
sudo cp -r /usr/local/share/pywws/examples/* /home/pi/weather/templates
Make sure your computer has the right date & time, and time zone, as these are used to label the weather station data. If you haven’t already done so, it’s worth setting up NTP to synchronise your computer to a ‘time server’.
The first time you run pywws.LogData it will create a configuration file in your data directory called ‘weather.ini’ and then stop. You need to edit the configuration file and change the line ws type = Unknown to wstype = 1080 or ws type = 3080. (If your weather station console displays solar illuminance you have a 3080 type, all others are 1080.) Then run pywws.LogData again. This may take several minutes, as it will copy all the data stored in your station’s memory. The pywws.LogData program has a ‘verbose’ option that increases the amount of messages it displays while running. This is useful when running it manually, for example:
python -m pywws.LogData -vvv ~/weather/data
(Replace ~/weather/data with your data directory, if it’s different.)
Jetzt werden die Pfade in der Datei weather.ini angepasst:
cd data
nano weather.ini
[config]
ws type = 1080
python -m pywws.LogData -vvv ~/weather/data
Danach kann man den Inhalt des Verzeichnisses ~/weather/data/raw begutachten, in den die Daten aus der Wetterstation kopiert wurden.
cd ~/weather/data/raw
ls
You should now have some data files you can look at. For example:
more ~/weather/data/raw/2012/2012-12/2012-12-16.txt
(Replace the year, month and day with ones that you have data for.)
Jetzt werden die Pfade in der Datei weather.ini angepasst:
nano weather.ini
Im ersten Abschnitt [config] lassen wir das meiste unverändert, wir ergänzen nur eine Zeile mit day end hour = 0, damit die Werte immer im Tagesintervall von 00:00 bis 00:00 berechnet werden, und nicht wie in UK üblich von 09:00 bis 09:00. Die ersten Zeilen dieses Blockes in der Datei weather.ini sollten dann so aussehen:
Im Abschnitt [paths] müssen wir die Pfadangaben an unserer Installation anpassen:
[config]
ws type = 1080
logdata sync = 1
day end hour = 0
[paths]
work = /home/$USER/weather/temp/
templates = /home/$USER/weather/templates/
graph_templates = /home/$USER/weather/graph_templates/
local_files = /home/$USER/weather/results/
pywws.LogData just copies the raw data from the weather station. To do something useful with that data you probably need hourly, daily and monthly summaries. These are created by pywws.Process. For example:
python -m pywws.Process ~/weather/data
You should now have some processed files to look at:
more ~/weather/data/daily/2012/2012-12-16.txt
If you ever change your day end hour configuration setting, you will need to reprocess all your weather data. You can do this by running pywws.Reprocess:
python -m pywws.Reprocess ~/weather/data
Ordner in /home/pi/weather/data:
calib
daily
hourly
monthly
raw
Grundsätzlich gibt es zwei verschiedene Methoden, wie pywws die Daten auf eine Website schickt. Bei der Methode “hourly”, die ich gewählt habe, wird über einen cron job regelmäßig das Script pywws-hourly.py aufgerufen, entweder stündlich, wie der Name besagt, oder in einem anderen kürzeren Intervall, wobei diese mindestens doppelt so lange sein muss, wie das Logging-Intervall der Wetterstation (bei mir also 10 min). Das Skript holt die aktuellen Daten von der Wetterstation, verarbeitet diese Daten, generiert HTML-Seiten und Diagramm und lädt diese anschließend per FTP hoch.
Eine zweite Methode names “live” wäre ein nach dem Systemstart gestartetes und dann ständig laufendes Skript pywws-livelog.py, das alle 48 Sekunden Daten aus der Wetterstation ausliest und diese verarbeitet.
Für das Skript pywws-hourly.py muss man in der Datei weather.ini die folgenden Sektionen für Aufgaben nach unterschiedlichen Zeitintervalle befüllen:
[logged] … bei jedem Skriptaufruf durchzuführen
[hourly] … stündlich auszuführende Aufgaben
[12 hourly] … alle 12 Stunden
[daily] … alle 24 Stunden
In jeder dieser Sektionen gibt es drei Einträge, die in diesen Intervallen verarbeitet werden:
services = [ ] … Upload zu Wetterdiensten per http, diese Dienste müssen zuerst konfiguriert und registriert sein (ich habe diese Services nicht in Verwendung.)
plot = [ ] … Erstellen von Diagrammen auf Basis und XML-Vorlagen für gnuplot, die im Ordner ~/weather/graph_templates zu finden sind.
text = [ ] … Erstellen von HTML- oder anderen Textdateien auf Basis von Vorlagen, die im Ordner ~/weather/templates zu finden sin.
Im Normalfall möchte man die Ergebnisse dieser Einträge in plot und text auf einen Webspace hochladen, was mit der Sektion [ftp] konfiguriert wird:
[ftp]
local site = False
secure = False
site = ftp.server.name.at
user = benutzername
password = passwort
directory = pfad/auf/dem/webserver
Am besten bearbeitet man diese Konfigurationsdatei mit dem Editor nano
cd ~/weather/data
nano weather.ini
Wichtig ist, dass es zu dem Eintrag unter plot auch eine entsprechende Vorlagendatei im Ordner ~/weather/graph_templates geben muss, und zu jedem Eintrag in text eine Vorlagendatei im Ordner ~/weather/templates.
Jetzt müssen wir dieses Skript pywws-hourly.py nur noch aufrufen, das bei der Installation im Verzeichnis /usr/local/bin abgelegt wurde, und daher von jedem Ordner aus gestartet werden kann. Es benötigt nur mehr die Pfadangabe zu den Wetterdaten und optional einen Parameter -v, -vv oder -vvv, der den Umfang der Rückmeldungen steuert.
pywws-hourly -v ~/weather/data
Zu Testzwecken sollte man dieses Skript zuerst händisch auf der Kommandozeile aufrufen, um eventuelle Fehlermeldung zu erhalten.
[config]
ws type = 1080
usb activity margin = 3.0
pressure offset = 35
logdata sync = 1
day end hour = 0
rain day threshold = 0.2
frequent writes = False
template encoding = iso-8859-1
gnuplot version = 4.2
gnuplot encoding = iso_8859_1
[paths]
work = /home/pi/weather/temp/
templates = /home/pi/weather/templates/
graph_templates = /home/pi/weather/graph_templates/
local_files = /home/pi/weather/results/
[ftp]
local site = False
secure = False
site = xyz
user = xyz
password = xyz
directory = x/y/z
port = 21
[live]
services = []
[logged]
services = []
text = ['7days.txt', '24hrs.txt', 'forecast_week.txt']
plot = ['7days.png.xml', '24hrs.png.xml', 'rose_24hrs.png.xml']
[hourly]
services = []
text = ['7days.txt', '24hrs.txt', 'forecast_week.txt']
plot = ['7days.png.xml', '24hrs.png.xml', 'rose_24hrs.png.xml']
[12 hourly]
services = []
text = []
plot = []
[daily]
services = []
text = []
plot = []
[Zambretti]
north = True
baro upper = 1050.0
baro lower = 950.0
Datei erstellen
cd /usr/local/bin
sudo nano weatherupload
Skript
#!/bin/bash
LOGFILE='/home/pi/weather/skript.log'
function logg () {
echo -n `date +%Y%m%d%H%M%S` >>$LOGFILE
echo " `basename $0` $1" >>$LOGFILE
}
logg "gestartet"
cd /usr/local/bin
python pywws-hourly -vvv /home/pi/weather/data
chown pi:pi /home/pi/weather/data/* -R
logg "beendet"
Während man die Vorlagendateien anpasst sollte man das folgende Skript zu Testzwecken händisch auf der Kommandozeile aufrufen, um eventuelle Fehlermeldung zu erhalten.pywws-hourly.py -vvv ~/weather/data
crontab -e
Erst wenn alles klappt, können wir dieses Skript in regelmäßigen Abstände mit Hilfe descron-Daemons aufrufen. Dazu müssen wir einen entsprechenden cron job als Zeile in der Datei crontab (zu finden im Ordner /etc) eintragen:
*/10 * * * * /usr/local/bin/weatherupload > home/pi/weather/cron.log 2>&1
Damit wird alle 10 min dieses Skript aufgerufen, die Daten zu Grafiken und HTML-Dateien verarbeitet und hochgeladen.
crontab -l
Prüfen ob cron läuft
/etc/init.d/cron status
oder
service cron status
Vorlage einrichten
sudo -i
mkdir -p /var/www/weather
cd /var/www/weather
cp /home/pi/downloads/pywws_Weather_Nature_Template.zip /var/www/weather
unzip pywws_Weather_Nature_Template.zip
Apache-Webserver installieren
apt-get update
apt-get install apache2 php5
http:\\<IP-Adresse-Raspberry-Pi>\weather\