Intro In diesem Artikel geht es um den Aufbau einer Wetterstation am

Werbung
http://www.eskofier.de/projekte/modellbau/13-wetterstation-am-modellflugplatz-mit-pywws
Intro
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
Nachdem der Raspberry Pi angekommen und ausgepackt ist, muss erst einmal das Betriebssystem
auf eine SD-Karte gespielt werden. Diese muss mindestens 4 GB groß sein. Sollen möglichst viele
Wetterdaten auf der Karte vorgehalten werden, ist es natürlich ratsam, eine größere Karte zu
nehmen. Da der Preisunterschied zwischen 4 GB und 8 GB nicht wesentlich ist, verwende ich eine 8
GB Karte.
Grundinstallation Schritt 1:
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/
Grundinstallation Schritt 2:
Als nächstes wird das Betriebssstem 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 aktuelle Version NOOBS_V1.2.1.zip. Diese
wird nach dem Herunterladen entpackt. Danach wird dann der entpackte Inhalt in das
Hauptverzeichnis der SD-Karte kopiert.
Grundinstallation Schritt 3:
Jetzt ist es Zeit die mit dem Raspberry Betriebssystem versehene SD-Karte in den Raspberry
einzusetzten. Als nächstes werden noch ein Monitor (bzw. auch LCD Fernseher) per HDMI und eine
Tastatur/Maus über USB 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.
Einrichtung neuer User:
Falls die Wetterstation aus dem Internet erreichbar sein soll, empfielt es sich vor den weiteren
Arbeiten 2 neue Nutzer anzulegen. Der erste soll ein administrativer Account sein, so wie es der
Standard User "pi" darstellt. Der zweite wird als einfacher Nutzer erstellt, unter dessem Account
nachher die pywws Anwendung läuft.
Zuerst kommt der neue Admin (Ersatz für den allseits bekannten 'pi'). Hier sollte natürlich jeder
etwas Phantasie walten lassen und einen eigenen Namen dafür wählen. Der hier genutzte
"myadmin" ist also stellvertretend für einen eigenen User zu sehen.
?
1
sudo adduser -shell /bin/bash -home /home/myadmin myadmin
Jetzt kommen die Ausgaben von adduser. Es wird auch gleich nach einem Passwort für den neuen
Nutzer gefragt.
Adding user `myadmin' ...
Adding new group `myadmin' (1002) ...
Adding new user `myadmin' (1001) with group `myadmin' ...
Creating home directory `/home/myadmin' ...
Copying files from `/etc/skel' ...
Enter new UNIX password:
Retype new UNIX password:
passwd: password updated successfully
Changing the user information for myadmin
Enter the new value, or press ENTER for the default
Full Name []:
Room Number []:
Work Phone []:
Home Phone []:
Other []:
Is the information correct? [Y/n] Y
Nachdem der User angelegt ist, müssen ihm die gleichen Gruppen zugeordnet werden, wie sie auf
dem Nutzer 'pi' zugeordnet sind:
?
1
sudo addgroup myadmin adm
2
sudo addgroup myadmin sudo
3
sudo addgroup myadmin audio
4
sudo addgroup myadmin video
5
sudo addgroup myadmin plugdev
6
sudo addgroup myadmin games
7
sudo addgroup myadmin users
8
sudo addgroup myadmin netdev
9
sudo addgroup myadmin input
Als nächstes wird der Account angelegt, unter welchem später pywws automatisch laufen soll.
Ebenso wie für "myadmin" ist der hier verwendete "mypywws" als Platzhalter zu sehen.
?
1
sudo adduser -shell /bin/bash -home /home/mypywws mypywws
Jetzt kommen wieder die Ausgaben und Abfragen, wie für den User 'myadmin'.
Anschließend noch dem "normalen" Nutzer die Gruppen zuordnen.
?
1
sudo addgroup mypywws plugdev
2
sudo addgroup mypywws users
3
sudo addgroup mypywws input
Als nächstes wird eine eigene Gruppe für die Wetteranwendung erstellt:
?
1
sudo groupadd weather
Jetzt werden noch die beiden neuen Nutzer auch dieser Gruppe zugeordnet:
?
1
sudo adduser myadmin weather
2
sudo adduser mypywws weather
Jetzt wird dem myadmin noch beigebogen, dass er sudo ohne Passworteingabe nutzen kann:
?
1
sudo vi /etc/sudoers
Am einfachsten ist es, den letzten Eintrag für den Standarduser 'pi' auf den neuen User 'myadmin'
umzubiegen:
Von:
?
1
# See sudoers(5) for more information on "#include" directives:
2
#includedir /etc/sudoers.d
3
pi ALL=(ALL) NOPASSWD: ALL
Nach:
?
1
# See sudoers(5) for more information on "#include" directives:
2
#includedir /etc/sudoers.d
3
myadmin ALL=(ALL) NOPASSWD: ALL
Jetzt sollte geprüft werden, ob beide User richtig eingerichtet sind. Dementsprechend ist es an der
Zeit sich einmal mit beiden Usern anzumelden. Falls dies geht und auch "sudo" für den User
"myadmin" funktioniert, kann der User "pi" erst einmal gesperrt werden. Dazu erst einmal als User
"myadmin" anmelden und dann folgenden Befehl eingeben:
?
1
sudo passwd -l pi
ACHTUNG: Diesen Schritt nur ausführen, wenn auch sicher ist, dass "myadmin" über "sudo" RootRechte bekommen kann!
Ansonsten geht es wieder zurück auf Los! und die SD Karte muss noch einmal neu eingerichtet
werden.
Installation von pywws:
Installation der benötigten Libraries:
Bevor pywws installiert werden kann, müssen einige Pakete auf dem Raspberry Pi installiert werden.
Dazu einfach folgende Kommandos ausführen:
?
1
sudo apt-get update
2
sudo apt-get upgrade
3
sudo apt-get install git
4
sudo apt-get install python-dev
5
sudo apt-get install libudev-dev
Nun muss der Source Code für libusb heruntergeladen, kompiliert und installiert werden:
?
1
mkdir ~/src
2
cd ~/src
3
wget http://sourceforge.net/projects/libusb/files/libusb-1.0/libusb-1.0.9/libusb-1.0.9.tar.bz2
4
tar xvjf libusb-1.0.9.tar.bz2
5
cd ~/src/libusb-1.0.9
6
./configure
7
make
8
sudo make install
Im nächsten Schritt wird Cyton installiert:
?
1
cd ~/src
2
wget http://pypi.python.org/packages/source/C/Cython/Cython-0.19.1.tar.gz
3
tar xvzf Cython-0.19.1.tar.gz
4
cd ~/src/Cython-0.19.1
5
sudo python setup.py install
Während das letzte Kommando läuft, ist genügend Zeit gemütlich zum Abendessen zu gehen, da die
Ausführung über eine Stunde dauert.
Als nächstes wird die cython-hidapi installiert (hid = human interface device):
?
1
cd ~/src
2
git clone https://github.com/gbishop/cython-hidapi.git
Im Setupscript muss jetzt allerdings noch der Pfad zu libusb berichtigt werden:
?
1
cd ~/src/cython-hidapi
2
vi setup.py
In der Datei muss folgende Zeile geändert werden von
?
1
os.environ['CFLAGS'] = "-I/usr/include/libusb-1.0"
zu:
?
1
os.environ['CFLAGS'] = "-I/usr/local/include/libusb-1.0"
Jetzt noch die Library installieren:
?
1
sudo python setup.py install
Als nächstes wird pip installiert. Damit lässt sich ähnlich wie mit apt-get das aktuelle Package von
pywws installieren:
?
1
sudo apt-get install python-pip
Installation von pywws und erster Funktionstest
?
1
sudo pip install pywws
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:
?
1
sudo python -m pywws.TestWeatherStation
Es sollte dann eine Ausgabe erscheinen, die in etwa so aussieht:
?
1
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
2
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
3
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
4
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
5
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
6
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
7
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
8
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
Weitere Konfigurationsschritte
Sollen die Wetterdaten möglichst zeitnah in der Zentraleinheit gelogged werden (Minimum ist 1
Minute) und dementsprechend auch von pywws ausgelesen werden, dann lässt sich das
Speicherintervall mit folgendem Befehl auf 1 Minute einstellen:
?
1
sudo python -m pywws.SetWeatherStation -r 1
Nachdem die Verbindung zur Wetterstation erfolgreich getestet wurde und das Speicherintervall in
der Station eingestellt wurde, können die nächsten Schritte für das automatische Auslesen und
Verarbeiten der Daten durchgeführt werden.
Zuerst wird im Home Verzeichnis des Users unter dessen Account später pywws (hier "mypywws")
laufen soll ein Unterverzeichnis erstellt.
Damit später für eine eventuelle Datensicherung alles kompakt beianander liegt sollen in dem
Unterverzeichnis folgende Dine landen:

die Konfigurationsdatei für die Verarbeitung der Daten

die aus der Wetterstation ausgelesenen Daten

die von pywws verarbeiteten Daten (stündlich, täglich, monatilche Summen)

die Templates für die Ausgabe der Daten
Dazu zuerst in den Benutzer wechseln unter welchem später pywws laufen soll (hier "mypywws"):
?
1
su - mypywws
2
cd ~
3
mkdir weather_data
4
cd weather_data/
5
mkdir templates
6
mkdir log
7
mkdir tmp
8
mkdir results
9
exit
Jetzt sind wir wieder im Userkontext von "myadmin". Mit dem folgenden Befehl wird pywws das
erste mal gestartet. Dabei legt pywws im Datenverzeichnis die Konfigurationsdateien an:
?
1
sudo python -m pywws.LiveLog -vvv /home/mypywws/weather_data
Nachdem pywws kurz gelaufen ist (nur ca. 10 - 20 Sekunden) wird es mit CTRL-C wieder gestoppt.
Im Verzeichnis /home/mypywws/weather_data sollten jetzt die Dateien status.ini und weather.ini
liegen. Da pywws mit sudo gestartet wurde, gehören die beiden Dateien dem User root. Für's Erste
ist das in Ordnung, das muss jedoch später noch korrigiert werden. Dies kann aber erst gemacht
werden, wenn auch der User "mypywws" auf den USB Port zugreifen darf. Dies wird weiter unten
noch beschrieben, Stichwort "UDEV".
Als nächstes werden die Templates aus dem Verzeichnis /usr/local/share/pywws/examples in das
Datenverzeichnis kopiert:
?
1
sudo cp -r /usr/local/share/pywws/examples/* /home/mypywws/weather_data/templates
Jetzt werden die Pfade in der Datei weather.ini angepasst:
?
1
cd ~/weather_data/
2
sudo vi weather.ini
Konfiguration der Startumgebung
Nach der Installation hat nur der Root User zugriff auf das USB-Device für die Wetterstation. Damit
aber "normale" Nutzer auch das Device ansprechen können, muss noch eine Regel für UDEV erstellt
werden. Dazu wird im Verzeichnis /etc/udev/rules.d/ eine neue Datei angelegt. In der Datei wird der
Gruppe "weather" der Zugriff auf das Device erlaubt.
?
1
sudo vi /etc/udev/rules.d/38-weather-station.rules
Diese bekommt folgenden Inhalt:
?
1
# WH-1080 Weather Station
2
ACTION!="add|change", GOTO="weather_station_end"
3
SUBSYSTEM=="usb", ATTRS{idVendor}=="1941", ATTRS{idProduct}=="8021", GROUP="weather"
4
LABEL="weather_station_end"
Nach dem Neustart des Raspberry Pi darf der User mypywws die pywws Software auch ohne
vorangestelltes "sudo" starten (was er sowieso nicht könnte, da er nicht in der Gruppe sudo ist).
Jetzt muss der Raspberry erst mal neue gestartet werden:
?
1
sudo reboot
Bevor geprüft werden kann, ob der User "mypywws" jetzt auch Zugriff auf die Wetterstation hat,
muss noch der Owner für die Daten im seinem Home-Verzeichnis geändert werden:
?
1
sudo chown -R mypywws:weather /home/mypywws/weather_data/
Nun erst mal wieder in den Kontext des User "mypywws" wechseln:
?
1
su - mypywws
Jetzt sollte sich pywws vom User "mypywws" auch ohne "sudo" starten lassen:
?
1
python -m pywws.LiveLog -vvv ~/weather_data/
Nachdem dies erfolgreich getestet wurde, kann auch der automatische Start von pywws eingerichtet
werden. Dazu geht es erst einmal zurück in den Kontext von "myadmin" und dann wird das
Start/Stop-Skript angelegt.
?
1
exit
2
sudo vi /etc/init.d/pywws
Dann wird folgender Inhalt in die Datei geschrieben:
?
1
#! /bin/sh
2
### BEGIN INIT INFO
3
# Provides:
4
# Required-Start: $remote_fs $syslog
5
# Required-Stop:
6
# Default-Start: 2 3 4 5
7
# Default-Stop:
8
# Short-Description: start/stop pywws weather logging
9
# Description:
pywws
$remote_fs $syslog
016
Start/stop the python tool pywws to read an process weather station data
10
#
11
### END INIT INFO
12
PATH=/sbin:/usr/sbin:/bin:/usr/bin:/usr/local/bin
13
DESC="pywws LiveLog"
14
NAME=pywws-livelog.py
15
DAEMON=/usr/local/bin/$NAME
16
DAEMON_ARGS="-vv -l /home/mypywws/weather_data/log/livelog.txt /home/mypywws/weather_data/"
17
case "$1" in
18
start)
19
echo -n "Starting $DESC: "
20
start-stop-daemon --start --chuid mypywws:weather --pidfile /var/run/$NAME.pid \
21
--make-pidfile --background --startas $DAEMON -- $DAEMON_ARGS
22
echo "$NAME."
23
;;
24
stop)
25
echo -n "Stopping $DESC: "
26
start-stop-daemon --stop --quiet --oknodo \
27
--pidfile /var/run/$NAME.pid
28
rm -f /var/run/$NAME.pid
29
echo "$NAME."
30
;;
31
esac
32
:
Das Skript muss jetzt noch das Execute Flag bekommen, damit es auch ausgeführt werden kann.
Weiterhin wird es noch in die Start/Stop-Sequenz des Raspberry aufgenommen werden.
?
1
sudo chmod a+x /etc/init.d/pywws
2
sudo update-rc.d pywws defaults
Installation von Apache 2 und PHP 5
Für die Darstellung der Wetterdaten wird jetzt Apache 2 und PHP 5 installiert:
?
1
sudo apt-get install apache2
2
sudo apt-get install php5
Wird im Browser die Adresse des Raspberry aufgerufen sollte folgender Text erscheinen:
?
1
It works!
2
This is the default web page for this server.
3
The web server software is running but no content has been added, yet.
Um zu prüfen, ob auch PHP funktioniert, wird im Verzeichnis /var/www wird die Datei phpinfo.php
erstellt:
?
1
sudo vi /var/www/phpinfo.php
?
1
<?php
2
phpinfo();
3
?>
Wenn im Browser http://<raspberry-ip-adresse>/phpinfo.php aufgerufen wird, sollte eine Info Seite
mit den PHP Einstellungen im Browser angezeigt werden.
Nach dem Test sollte die Datei gleich wieder gelöscht werden:
?
1
sudo rm /var/www/phpinfo.php
Jetzt kann das Webverzeichnis für die Darstellung der Wetterdaten vorbereitet werden.
?
1
sudo su
2
cd /var/www
3
mkdir wdata
4
mkdir js
5
mkdir phpscript
6
mkdir css
7
chown -R mypywws:weather *
Falls der Raspberry die Wetterdaten im Internet direkt anzeigen soll, müssen noch ein paar
Änderungen an der Konfiguration von Apache und PHP vorgenommen werden. Da die
Konfigurationsdateien dem root User gehören, bleiben wir einfach im root Kontext (also kein "exit"
nach den vorausgegangenen Kommandos).
?
1
cd /etc/apache2/
2
vi apache2.conf
Fast am Ende der Datei wird die Zeile "Include conf.d/security" eingefügt. Die Datei sollte dann wie
folgt aussehen (hier nur der letzte Ausschnitt):
?
1
# Include generic snippets of statements
2
Include conf.d/
3
Include conf.d/security
4
# Include the virtual host configurations:
5
Include sites-enabled/
6
# Security
Nach dem Speichern der apache2.conf Datei wird die Security Datei angepasst (diese befindet sich im
Verzeichnis "/etc/apache2/conf.d/"):
?
1
cd conf.d
2
vi security
Zuerst wird die Zeile "Servertokens OS" durch voranstellen eines "#" auskommentiert und dann die
Zeile "ServerTokens Prod" eingefügt:
?
1
#
2
# ServerTokens
3
# This directive configures what you return as the Server HTTP response
4
# Header. The default is 'Full' which sends information about the OS-Type
5
# and compiled in modules.
6
# Set to one of: Full | OS | Minimal | Minor | Major | Prod
7
# where Full conveys the most information, and Prod the least.
8
#
9
ServerTokens Prod
10
#ServerTokens OS
11
#ServerTokens Full
Weiterhin wird "ServerSignature" auf "Off" umgestellt:
?
1
#
2
# Optionally add a line containing the server version and virtual host
3
# name to server-generated pages (internal error documents, FTP directory
4
# listings, mod_status and mod_info output etc., but not CGI generated
5
# documents or custom error documents).
6
# Set to "EMail" to also include a mailto: link to the ServerAdmin.
7
# Set to one of: On | Off | EMail
8
#
9
ServerSignature Off
10
#ServerSignature On
Durch diese Einstellungen wird Apache angeweisen, keine Informationen zum Betriebssystem und
der Apache Version im HTTP Header preiszugeben.
Vor der Änderung sieht der Header so aus:
?
1
HTTP/1.1 200 OK
2
Date: Sun, 15 Sep 2013 09:36:45 GMT
3
Server: Apache/2.2.22 (Debian)
4
X-Powered-By: PHP/5.4.4-14+deb7u4
5
Content-Length: 2146
6
Keep-Alive: timeout=5, max=100
7
Connection: Keep-Alive
8
Content-Type: image/gif
Wie zu sehen ist, verrät PHP auch noch etwas über seine Umgebung. Dazu muss jedoch die Datei
php.ini geändert werden:
?
1
cd /etc/php5/apache2/
2
vi php.ini
Jetzt muss in der php.ini die Zeile "expose_php = On" gesucht werden und der Wert auf
"expose_php = Off" umgestellt werden:
?
1
; Decides whether PHP may expose the fact that it is installed on the server
2
; (e.g. by adding its signature to the Web server header). It is no security
3
; threat in any way, but it makes it possible to determine whether you use PHP
4
; on your server or not.
5
; http://php.net/expose-php
6
expose_php = Off
Damit die geänderten Konfigurationsdaten angezogen werden, muss der Apache Server
durchgestartet werden:
?
1
/etc/init.d/apache2 restart
Jetzt sollte der HTTP-Header so aussehen:
?
1
HTTP/1.1 200 OK
2
Date: Sun, 15 Sep 2013 09:48:02 GMT
3
Server: Apache
4
Vary: Accept-Encoding
5
Content-Encoding: gzip
6
Content-Length: 8367
7
Keep-Alive: timeout=5, max=100
8
Connection: Keep-Alive
9
Content-Type: text/html
Im Standard würde Apache den Inhalt eines Directories anzeigen, falls keine index.html Datei
vorhanden ist. Das muss natürlich unterbunden werden, wenn der Raspberry aus dem Internet
erreichbar sein soll. Daher wird im nächsten Schritt die Konfigurationsdatei für das default virtuelle
Verzeichnis von Apache verändert.
?
1
cd /etc/apache2/sites-enabled/
2
vi 000-default
Der Inhalt der Datei sollte dann nach allen Änderungen so aussehen:
?
1
<VirtualHost *:80>
2
ServerAdmin webmaster@localhost
3
DirectoryIndex index.php index.html
4
DocumentRoot /var/www
5
<Directory />
6
Options FollowSymLinks
7
AllowOverride None
8
</Directory>
9
<Directory /var/www/>
10
Options -Indexes FollowSymLinks MultiViews
11
AllowOverride All
12
Order allow,deny
13
allow from all
14
</Directory>
15
ScriptAlias /cgi-bin/ /usr/lib/cgi-bin/
16
<Directory "/usr/lib/cgi-bin">
17
AllowOverride None
18
Options +ExecCGI -MultiViews +SymLinksIfOwnerMatch
19
Order allow,deny
20
Allow from all
21
</Directory>
22
ErrorLog ${APACHE_LOG_DIR}/error.log
23
# Possible values include: debug, info, notice, warn, error, crit,
24
# alert, emerg.
25
LogLevel warn
26
CustomLog ${APACHE_LOG_DIR}/access.log combined
27
</VirtualHost>
Eine gute Idee ist noch das Apache Module mod_rewrite zu aktivieren. Erst dann ist es möglich über
.htaccess Dateien z. B. den Zugriff auf Dateien auf dem Server einzuschränken. Damit kann z. B.
sichergestellt werden, dass die Rohdaten von pywws für die Darstellung nur über ein PHP-Script
geliefert werden. Da PHP-Script läuft ja lokal auf dem Raspberry. Wenn dann z. B. nur für das
Verzeichnis "wdata" der Zugriff auf "localhost" eingeschränkt wird, kann niemand die Daten direkt
mit dem Browser aufrufen.
?
1
a2enmod rewrite
2
service apache2 restart
Bereitstellen der Daten aus pywws
Nach den vorausgegangen Schritten sollten die Voraussetzungen geschaffen sein, das
o
ein eigener Benutzer für pywws eingerichtet wurde
o
pywws die Verbindung mit der Wetterstation herstellen kann und die Daten ausliest
o
pywws unter dem eigens erstellen Nutzer (hier "mypywws") laufen kann
o
die Software automatisch gestartet wird, sobald der Raspberry Pi gestartet wird
o
ein Apache 2 Server mit PHP 5 läuft
Jetzt geht es daran, ein Template für pywws zu erstellen, welches die Daten zusammenstellt und
anschließend als ASCII Datei im Verzeichnis "/var/www/wdata" ablegt.
Dazu ist es jetzt an der Zeit sich wieder als Benutzer "mypywws" anzumelden und dann wird geht es
in das Verzeichnis für Templates.
?
1
exit
2
su - mypywws
3
cd weather_data/templates/templates/
4
vi 2hrs.log
?
#timezone local#
1
2
3
4
#roundtime True#
#raw#
#jump -119#
#loop 120#
7
#idx "%m.%d.%Y %H:%M"# #abs_pressure "%.1f" "1013"# #rel_pressure "%.1f" "1013"# #temp_out "%.1f" "0.0"
#calc "apparent_temp(data['temp_out'], data['hum_out'], data['wind_ave'])" "%.1f" "0.0"# #calc "wind_chill(dat
data['wind_ave'])" "%.1f" "0.0"# #calc "dew_point(data['temp_out'], data['hum_out'])" "%.1f" "0.0"# #wind_ave
"wind_kmph(x)"# #wind_gust "%.1f" "0.0" "wind_kmph(x)"# #wind_dir "%.0f" "0.0" "winddir_degrees(x)"# #win
"winddir_text(x)"# #calc "data['rain']-prevdata['rain']" "%0.1f" "0.0"#
8
#jump 1#
5
6
#endloop#
Hmm, was macht pywws anhand dieses Templates jetzt eigentlich?
#timezone local#
pywws speichert alle Zeiten in UTC. Mit diesem Komman
Zeitzone umgerechnet.
#roundtime True#
#raw#
Hiermit wird pywws angewiesen, die Rohdaten auszulese
Werte.
#jump -119#
#loop 120#
Hiermit wird eine Schleife über 120 Datensätze ausgefüh
#jump 1#
#endloop#
#idx "%m.%d.%Y %H:%M"#
Hiermit wird der Zeitstempel des Datensatzes im Format
#abs_pressure "%.1f" "1013"#
Hiermit wird der absolute Luftdruck ausgeben. Genauigk
Falls kein Messwert vorliegt, wird der Wert 1013 ausgebe
#rel_pressure "%.1f" "1013"#
Hiermit wird der relative Luftdruck ausgeben. Genauigke
Falls kein Messwert vorliegt, wird der Wert 1013 ausgebe
#temp_out "%.1f" "0.0"#
Hiermit wird die Außentemperatur ausgegeben. Genauig
Falls kein Messwert vorliegt, wird der Wert 0.0 ausgeben
#hum_out "%.0f" "0.0"#
Hiermit wird die relative Luftfeuchtigkeit (außen) ausgeg
Nachkommastelle. Falls kein Messwert vorliegt, wird der
#calc "apparent_temp(data['temp_out'], data['hum_out'],
data['wind_ave'])" "%.1f" "0.0"#
Hiermit wird die gefühlte Temperatur ausgegeben. Gena
Nachkommastelle. Falls kein Messwert vorliegt, wird der
#calc "wind_chill(data['temp_out'], data['wind_ave'])"
"%.1f" "0.0"#
Hiermit wird die Windchill Temperatur ausgeben. Genau
Nachkommastelle. Falls kein Messwert vorliegt, wird der
#calc "dew_point(data['temp_out'], data['hum_out'])"
"%.1f" "0.0"#
Hiermit wird der Taupunkt ausgeben. Genauigkeit auf ein
Messwert vorliegt, wird der Wert 0.0 ausgeben.
#wind_ave "%.1f" "0.0" "wind_kmph(x)"#
Hiermit wird die mittlere Windgeschwindigkeit in km/h a
Nachkommastelle. Falls kein Messwert vorliegt, wird der
#wind_gust "%.1f" "0.0" "wind_kmph(x)"#
Hiermit wird die Geschwindigkeit der Böen in km/h ausge
Nachkommastelle. Falls kein Messwert vorliegt, wird der
#wind_dir "%.0f" "0.0" "winddir_degrees(x)"#
Hiermit wird die Windrichtung in Grad ausgeben. Keine N
Messwert vorliegt, wird der Wert 0.0 ausgeben.
#wind_dir "%s" "-" "winddir_text(x)"#
Hiermit wird die Windrichtung als Text ausgeben.
#calc "data['rain']-prevdata['rain']" "%0.1f" "0.0"#
Hiermit wird die aktuelle Wert für Regen ausgeben. Da in
den Tag summiert werden, wird hier immer der vorherge
Damit ist jetzt schon einmal das erste eigene Template erstellt. Damit es auch von pywws verwendet
wird, muss es noch in der "weather.ini" eingetragen werden.
?
1
cd ~/weather_data/
2
vi weather.ini
Die Datei sollte dann nach allen Änderungen so aussehen:
?
1
[config]
2
ws type = 1080
3
template encoding = iso-8859-1
4
gnuplot encoding = iso_8859_1
5
day end hour = 0
6
rain day threshold = 0.2
7
[paths]
8
work = /home/mypywws/weather_data/tmp
9
templates = /home/mypywws/weather_data/templates/templates/
10
graph_templates = /home/mypywws/weather_data/templates/graph_templates/
11
local_files = /home/mypywws/weather_data/results/
12
[live]
13
services = []
14
yowindow =
15
twitter = []
16
plot = []
17
text = []
18
[logged]
19
services = []
20
yowindow =
21
twitter = []
22
text = ['2hrs.log']
23
plot = []
24
[hourly]
25
services = []
26
yowindow =
27
twitter = []
28
text = []
29
plot = []
30
[12 hourly]
31
services = []
32
yowindow =
33
twitter = []
34
text = []
35
plot = []
36
[daily]
37
services = []
38
yowindow =
39
twitter = []
40
text = []
41
[ftp]
42
local site = True
43
secure = False
44
site = ftp.username.your_isp.co.uk
45
user = username
46
password = secret
47
directory = /var/www/wdata/
Worüber ich anfangs gestolpert bin, dann aber beim Nachlesen by Jim Easterbrook draufgekommen
bin, ist die Konfiguration des lokalen Kopierens der Ausgabe in der Sektion [ftp]. Hier wird einfach mit
"local site = True" angegeben, dass die Ausgabe lokal auf dem Host kopiert wird. Mit "directory = "
wird noch das Zielverzeichnis angeben.
Wenn alles richtig eingetragen wurde, kann pywws gestartet werden ("python -m pywws.LiveLog vvv /home/mypywws/weather_data/"). Nachdem einmal das Template "2hrs.log" ausgeführt wurde,
sollte im Verzeichnis "/var/www/wdata/" eine Datei "2hrs.log" liegen, welche in etwa so aussieht:
?
1
09.15.2013 13:22 741.6 1011.0 20.3 69 21.7 20.3 14.4 0.0 0.0 45 NE 0.0
2
09.15.2013 13:23 741.6 1011.0 20.3 69 21.7 20.3 14.4 0.0 0.0 45 NE 0.0
3
09.15.2013 13:24 741.7 1011.1 20.3 69 21.7 20.3 14.4 0.0 0.0 45 NE 0.0
4
09.15.2013 13:25 741.6 1011.0 20.2 69 21.6 20.2 14.3 0.0 0.0 45 NE 0.0
5
09.15.2013 13:26 741.6 1011.0 20.1 70 21.5 20.1 14.5 0.0 0.0 45 NE 0.0
6
09.15.2013 13:27 741.6 1011.0 20.1 70 21.5 20.1 14.5 0.0 0.0 45 NE 0.0
7
09.15.2013 13:28 741.6 1011.0 20.0 70 21.4 20.0 14.4 0.0 0.0 45 NE 0.0
8
09.15.2013 13:29 741.6 1011.0 19.9 70 21.3 19.9 14.3 0.0 0.0 45 NE 0.0
9
09.15.2013 13:30 741.6 1011.0 19.9 70 21.3 19.9 14.3 0.0 0.0 45 NE 0.0
Mit der "2hrs.log" kommt man jetzt den Verlauf der Daten über die letzten zwei Stunden, falls in der
Zentraleinheit das Loginterfall auf 1 Minute eingestellt ist. Die Anzeige soll später als Linien Chart
erfolgen.
Für die nächsten Schritte brauchen wir aber noch ein weiteres Template. Dieses soll die aktuellen
Werte und einige stündliche Werte ausgeben. Die Anzeige soll später mit Messuhren erfolgen.
?
1
cd /home/mypywws/weather_data/templates/templates/
2
vi livedata.log
Hier der Inhalt:
?
1
#timezone local#
2
[
3
4
{
#raw#
5
"DATE": "#idx "%d.%m.%Y %H:%M"#",
6
"TIME": "#idx "%H:%M %Z"#",
7
"HUMID_OUT": #hum_out "%.1f" "0.0"#,
8
"WIND_AVG": #wind_ave "%.1f" "0.0" "wind_kmph(x)"#,
9
"WIND_GUST": #wind_gust "%.1f" "0.0" "wind_kmph(x)"#,
10
"WIND_DIR": #wind_dir "%.0f" "0.0" "winddir_degrees(x)"#,
11
"ABS_PRESSURE": #abs_pressure "%.1f" "0.0"#,
12
"REL_PRESSURE": #rel_pressure "%.1f" "0.0"#,
13
"TEMP_OUT": #temp_out "%.1f" "0.0"#,
14
"TEMP_FEEL": #calc "apparent_temp(data['temp_out'], data['hum_out'], data['wind_ave'])" "%.1f" "0.0"#,
15
"DEW_POINT": #calc "dew_point(data['temp_out'], data['hum_out'])" "%.1f" "0.0"#,
16
"WIND_CHILL": #calc "wind_chill(data['temp_out'], data['wind_ave'])" "%.1f" "0.0"#,
17
#hourly#
18
#jump -1#
19
#loop 1#
20
"RAIN": #calc "data['rain']-prevdata['rain']" "%0.1f"#,
21
#jump 1#
22
#endloop#
23
"WIND_DIR_HOUR": #wind_dir "%.0f" "0.0" "winddir_degrees(x)"#,
24
"WIND_GUST_HOUR": #wind_gust "%.1f" "0.0" "wind_kmph(x)"#,
25
"WIND_AVG_HOUR": #wind_ave "%.1f" "0.0" "wind_kmph(x)"#,
26
"PRESSURE_TREND": #pressure_trend "%s" "0.0" "x"#,
27
"RAIN_HOUR": #rain "%0.1f" "0.0"#,
28
#daily#
29
"TEMP_OUT_MIN_DAY": #temp_out_min "%.1f" "0.0"#,
30
"TEMP_OUT_MAX_DAY": #temp_out_max "%.1f" "0.0"#
31
32
}
]
Damit das Template angezogen wird, muss wieder die Datei "weather.ini" angepasst werden:
?
1
cd /home/mypywws/weather_data/
2
vi weather.ini
Das neue Template wird in der Sektion [logged] aufgenommen:
?
1
[logged]
2
services = []
3
yowindow =
4
twitter = []
5
text = ['livedata.log', '2hrs.log']
6
plot = []
Das Ergebnis sollte dann in etwa so aussehen:
?
1
[
2
{
3
"DATE": "15.09.2013 15:42",
4
"TIME": "15:42 CEST",
5
"HUMID_OUT": 71.0,
6
"WIND_AVG": 0.0,
7
"WIND_GUST": 0.0,
8
"WIND_DIR": 45,
9
"ABS_PRESSURE": 740.5,
10
"REL_PRESSURE": 1009.9,
11
"TEMP_OUT": 20.1,
12
"TEMP_FEEL": 21.6,
13
"DEW_POINT": 14.7,
14
"WIND_CHILL": 20.1,
15
"RAIN": 0.0,
16
"WIND_DIR_HOUR": 180,
17
"WIND_GUST_HOUR": 0.0,
18
"WIND_AVG_HOUR": 0.0,
19
"PRESSURE_TREND": -1.3,
20
"RAIN_HOUR": 0.0,
21
"TEMP_OUT_MIN_DAY": 0.0,
22
"TEMP_OUT_MAX_DAY": 21.5 }
23
]
Darstellung der Daten
Für die Darstellung der Daten werden folgende Bibliotheken verwendet:

Steelseries Gauges (Messuhren für aktuelle Daten)

Highcharts (Charts für Darstellung über mehrere Stunden)
Update 16.08.2014, für alle die wissen wollen wie das geht, siehe hier: Anleitung für Steelseries
Gauges und Highcharts
Quellen
Für die Umsetzung wurden von mir folgende Quellen in Anspruch genommen:
http://www.raspberrypi.org/
https://www.sdcard.org/downloads/formatter_4/
http://jim-easterbrook.github.io/pywws/doc/en/html/index.html
http://code.google.com/p/pywws/
http://blog.schwabl.net/
http://wiki.sandaysoft.com/a/Main_Page
http://wiki.sandaysoft.com/a/SteelSeries_Gauges
http://www.highcharts.com/
Herunterladen