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/