Inhaltsverzeichnis
2012-04-10 // Weather.chrisge.org – Die Software III/III: Munin & Fazit
Nachdem ich das Projekt Weather.chrisge.org bereits in Grundzügen erläutert habe und die verwendete Hardware ebenfalls vorgestellt habe, werde ich in diesem Beitrag auf die Softwarekonfiguration eingehen. Da der gesamte Entwicklungsprozess mehrere Monate in Anspruch nahm, werde ich nur auf die wichtigsten Dinge eingehen. Zu einem späteren Zeitpunkt werde ich gegebenenfalls eine Dokumentation im mein.homelinux.com Wiki erstellt. Falls Fragen auftauchen sollten: melden!
Dieser Beitrag ist Teil der Serie Weather.chrisge.org:
- Teil 3: Die Software
- I: Motion → Webcam
- II: OWFS → 1-Wire
- III: Munin & Fazit → Graphen → dieser Teil
Diese Anleitung dürfte mit Debian-basierende Linux-Distributionen (z.B. Ubuntu) kompatibel sein. Die Munin Plugins müssten aber auf jeder Linux Plattform funktionsfähig sein. Ich habe sie bis jetzt aber nur mit Debian Squeeze getestet.
Graphen: Munin
Die Graphen erzeuge ich mit Munin. Der Vorteil ist, dass ich die Graphen auf einem anderen System rendern kann, also die Wetterstation ein sehr leistungsschwaches System (nur Munin-Node) sein kann, während das andere System (Munin) die Daten graphed und präsentiert, wofür mehr Leistung erforderlich ist. Zu Munin habe ich bereits eine Anleitung geschrieben:
Darin wird die Architektur von Munin (Munin u. Munin-Node) sowie die Installation und die Einrichtung näher erläutert. Diese Anleitung ist absolute Basis für diese Anleitung. Munin muss bereits voll einsatzfähig und konfiguriert sein.
Plugins
Da kein Plugin finden konnte, dass meinen erwünschten Zweck erfüllt, musste ich selbst drei Munin-Plugins schreiben. Wie dies geht, wird im Munin Wiki beschrieben.
Die Plugins werden in /usr/share/munin/plugins/
gespeichert und anschließend nach /etc/munin/plugins verlinkt:
$ sudo ln -s /usr/share/munin/plugins/PLUGIN /etc/munin/plugins/ $ sudo /etc/munin/munin-node restart #Munin-Node neustarten
Meine Plugins holen jew. noch die Daten von YAHOO! Weather und legen eine Statusdatei an, die immer den zuletzt ausgelesenen Wert anzeigen. Der Code ist nicht wirklich gesäubert und muss, wenn die Plugins verwendet werden sollen noch angepasst werden! Sie sollen nur Beispiele sein!
Folgendes muss angepasst werden:
- Der Pfad zum Sensor
- Das Statfile
- Die URL zum YAHOO! Weather Wetterbericht
Hinweis: Die YAHOO! Weather Methode funktioniert nicht mehr! In diesem Post findest du eine funktionierende Lösung mit der Wunderground Weather API. Diese Plugins müssen noch angepasst werden! Wenn du Fragen hast, kannst du gerne einen Kommentar hinterlassen.
Luftfeuchtigkeit
- humidity
#!/bin/sh # Simple OWFS Humidity Munin Plugin # Copyright: (C) 2012 Christoph Winkler <cw[at]chrisge[dot]org> # Web: http://www.chrisge.org / http://weather.chrisge.org # License: GPL-3 <http://www.gnu.org/licenses/gpl-3.0.txt> if [ "$1" = "config" ]; then echo 'graph_title Humidity (Luftfeuchtigkeit)' echo 'graph_args --rigid' echo 'graph_vlabel Relative Humidity in %' echo 'graph_scale no' echo 'graph_category Weather' echo 'screen0.label Local Relative Humidity' echo 'real0.label Adapted from YAHOO! Weather' echo 'real0.draw LINE1' exit 0 fi TWC_TMP="/tmp/weather_twc_tmp" wget "http://de.weather.com/weather/local/77746?x=0&y=0" -O $TWC_TMP > /dev/null 2>&1 REAL=$(cat $TWC_TMP | grep -A2 Luftfeuchtigkeit | tail -n 1 | cut -d '>' -f 2 | cut -d'%' -f1) STATE_R="/tmp/humidity_r" echo $REAL > $STATE_R BASE="/media/owfs" SENSOR_0="26.E67023010000" STATE_0="/tmp/humidity_0" if test -d ${BASE}/$SENSOR_0 then SCREEN_0=$(cat ${BASE}/$SENSOR_0/humidity ; echo) echo $SCREEN_0 > $STATE_0 echo screen0.value $SCREEN_0 fi echo real0.value $REAL
Temperatur
- temperature
#!/bin/sh # Simple OWFS Temperature Munin Plugin # Copyright: (C) 2012 Christoph Winkler <cw[at]chrisge[dot]org> # Web: http://www.chrisge.org / http://weather.chrisge.org # License: GPL-3 <http://www.gnu.org/licenses/gpl-3.0.txt> if [ "$1" = "config" ]; then echo 'graph_title Temperatures (Temperaturen)' echo 'graph_args --base 1000' echo 'graph_vlabel Temperature in Celsius' echo 'graph_category Weather' echo 'graph_scale no' echo "screen0.label Outdoor Sensor one" echo "screen1.label Outdoor Sensor two" echo "case0.label Outdoor in Sun" echo "real0.label Adapted from YAHOO! Weather" echo 'real0.draw LINE1' exit 0 fi BASE="/media/owfs" SENSOR_0="26.E67023010000" SENSOR_1="28.75798C020000" SENSOR_2="28.4F523C020000" STATE_0="/tmp/temperature_scr_0" STATE_1="/tmp/temperature_scr_1" STATE_2="/tmp/temperature_cas_0" TWC_TMP="/tmp/weather_twc_tmp" wget "http://de.weather.com/weather/local/77746?x=0&y=0" -O $TWC_TMP > /dev/null 2>&1 REAL=$(cat $TWC_TMP | grep '<TD COLSPAN="2"' | head -n 1 | cut -d ';' -f 2 | cut -d '&' -f 1) STATE_R="/tmp/temperature_r" echo $REAL > $STATE_R if test -d ${BASE}/$SENSOR_0 then SCREEN_0=$(cat ${BASE}/$SENSOR_0/temperature ; echo) echo $SCREEN_0 > $STATE_0 echo screen0.value $SCREEN_0 fi if test -d ${BASE}/$SENSOR_1 then SCREEN_1=$(cat ${BASE}/$SENSOR_1/temperature ; echo) echo $SCREEN_1 > $STATE_1 echo screen1.value $SCREEN_1 fi if test -d ${BASE}/$SENSOR_2 then CASE_0=$(cat ${BASE}/$SENSOR_2/temperature ; echo) echo $CASE_0 > $STATE_2 echo case0.value $CASE_0 fi echo real0.value $REAL
Dewpoint
Der Dewpoint → Taupunkt kann aus der relativen Luftfeuchtigkeit sowie der Temperatur errechnet werden. Mein Plugin bassiert auf diesem Skript und benötigt unbedingt das Paket bc
.
- dewpoint
#!/bin/sh # Simple OWFS Humidity Munin Plugin # Copyright: (C) 2012 Christoph Winkler <cw[at]chrisge[dot]org> # Web: http://www.chrisge.org / http://weather.chrisge.org # License: GPL-3 <http://www.gnu.org/licenses/gpl-3.0.txt> # Based On: http://www.lawbiz.ch/d/spahni/programs/relhumidity.html if [ "$1" = "config" ]; then echo 'graph_title Dewpoint (Taupunkt)' echo 'graph_args --base 1000' echo 'graph_vlabel Dewpoint in Celsius' echo 'graph_category Weather' echo 'graph_scale no' echo "screen0.label Local Dewpoint" echo "real0.label Adapted from YAHOO! Weather" echo 'real0.draw LINE1' exit 0 fi BASE="/media/owfs" SENSOR_0="26.E67023010000" STATE_0="/tmp/dewpoint_0" TEMPERATURE="$(cat ${BASE}/$SENSOR_0/temperature ; echo)" HUMIDITY="$(cat ${BASE}/$SENSOR_0/humidity ; echo)" TWC_TMP="/tmp/weather_twc_tmp" wget "http://de.weather.com/weather/local/77746?x=0&y=0" -O $TWC_TMP > /dev/null 2>&1 REAL=$(cat $TWC_TMP | grep -A2 Taupunkt | tail -n 1 | cut -d '>' -f 2 | cut -d'&' -f1) STATE_R="/tmp/dewpoint_r" echo $REAL > $STATE_R if test -d ${BASE}/$SENSOR_0 then SCREEN_0=$(echo "define pa (n) { if (n >= 0.0) { return (7.5); } else { return (7.6); } } define pb (n) { if (n >= 0.0) { return (237.3); } else { return (240.7); } } define sdd (t) { return (6.1078 * e( l(10) * ((pa(t) * t) / (pb(t) + t)) ) ); } define dd (r,t) { return (r / 100.0 * sdd(t)); } /* factor 2.302585093 converts ln() to log() */ v = l(dd($HUMIDITY,$TEMPERATURE) / 6.1078) / 2.302585093; tp = ((pb($TEMPERATURE) * v) / (pa($TEMPERATURE) - v)); if ( tp >= 0.0 ) { tp = (tp + 0.05); } else { tp = (tp - 0.05); } scale = 4; (tp / 1.0); " | bc -l) if [ "$(echo $SCREEN_0 | head -c 1)" = "." ] ; then SCREEN_0=0${SCREEN_0} elif [ "$(echo $SCREEN_0 | head -c 2)" = "-." ] ; then SCREEN_0=-0${SCREEN_0#-} fi echo $SCREEN_0 > $STATE_0 echo screen0.value $SCREEN_0 fi echo real0.value $REAL
Fazit & Ausblick
Inspiriert wurde ich durch Dave's & Max's Weather-Station/Cam von der ich damals in Doozan's Forum erfahren habe. Das ganze Projekt war eine einzige große Bastelei. Ich hatte zu keinem einzigen Baustein eine vollständige Dokumentation. Letzten Endes habe ich nach einigem Herumprobieren dann doch immer eine Lösung gefunden. Unter anderem deshalb habe ich das Grundgerüst für andere Bastler dokumentiert. Wenn dir Angaben fehlen oder etwas unklar erscheint, stehe ich dir gerne zur Verfügung.
Es ist immer wieder erstaunlich zu sehen, was man mit kleiner Embedded ARM-Hardware so alles hin bekommt. Als nächstes werde ich den 1-Wire Bus durch weitere Sensoren erweitern und ggf. das System in ein wetterfestes Gehäuse draußen platzieren - im Moment steht es noch drinnen. In diesem Zusammenhang warte ich auf den Raspberry Pi, der für eine Wetterstation wirklich genial ist.
Probleme
Das größte Problem ist, dass der USB-Hub in unregelmäßigen Abständen resetet wird und der 1-Wire Adapter dann nicht mehr als ttyUSB0 sondern ttyUSB1 angemeldet wird. OWFS verliert dann den Bus, bis der Adapter abgesteckt und erneut angeschlossen wird (erscheint wieder las ttyUSB0).
Manchmal verliert Motion bei diesem Vorfall die Webcam, beendet sich und muss anschließend wieder gestartet werden.
Comments
Hallo Christoph,
ich betreibe seit ein paar Jahren eine Heizung Temperatur Messung mit Web Server (NSLU2) auf Wiki MoinMoin Basis. Siehe Beschreibung: http://www.rudiswiki.de/wiki9/CategoryHeizung
Zu dem Problem USB umbenennen meine Lösung:
# Get a temporary file (webcam). Do not use -q option - it takes too much RAM! # test for active port if [ -e /dev/video1 ] ; then /opt/bin/uvccapture -d/dev/video1 -o$tempfile -x352 -y288 2>&1 | logger else /opt/bin/uvccapture -d/dev/video0 -o$tempfile -x352 -y288 2>&1 | logger fi
Grüße, Rudolf
@Rudolf Reuter: Hallo Rudolf,
dein Setup hab ich schon vor fast zwei Jahren bewundert, als das damals mit dem „Dockstar-Boom“ anfing – tolle Seite
Das Problem bezieht sich in meinem Setup eher auf OWFS, also den 1-Wire Adapter, als auf die Webcam. Auch verwende ich für die Webcam kein uvccapture sondern motion.
Es wäre aber denkbar OWFS über ein Skript zu starten, welches wenn sich der Port wechselt und OWFS beendet wird eine neue Instanz auf /dev/ttyUSB1 startet. Das Problem dabei ist nur, dass sich der Port nach einer gewissen Zeit wieder ändert und ich dann wieder ttyUSB0 wechseln müsste.
Das ist aber alles nicht so einfach, da der automatische Start von OWFS mit dem verwendeten Adapter extreme Probleme bereitet (siehe hier). Da das Ganze im Dauerbetrieb auch höchstens einmal in 2 Monaten vorkommt, bin ich mit einer SMS Benachrichtigung und einem kurzen Ziehen und anschließendem wieder Einstecken des Adapters wahrscheinlich besser beraten.
Ich denke das Hauptproblem liegt an dem verwendeten Hub. Wenn demnächst Verstärkung für das eine System kommt (ist im Moment auch noch Musikplayer), bekommt der 1-Wire Adapter dann direkt an das System angeschlossen.
mfg
Christoph
@Christoph Winkler: Hallo Christoph, ich habe lange an einer Lösung für die fehlerhafte Descriptor Umschaltung gesucht. Der vorgeschlagene Script ist zwar nur ein work around, hat aber innerhalb 2 Monaten bisher gut funktioniert. Vorher war die Fehlerrate ungefähr einmal je Woche, und musste durch neu stecken des USB-Steckers behoben werden.
Wenn man komfortabel per SMS benachrichtigt wird, ist das auch eine schöne Lösung. Grüße, Rudolf
@Rudolf Reuter: Einmal die Woche? Bei mir tritt dies zum Glück nur vergleichsweise selten ein. SMS-Benachrichtigung ist zwar praktisch. Leider kommt die Benachrichtigung immer erst dann, wenn es wieder zu spät ist und bis ich dann wieder daheim bin und den Stecker neugesteckt habe….
Ich hoffe, dass sich das Problem demnächst erledigt. Ansonsten muss ich noch ein Skript basteln, dass OWFS dauerhaft auf Fuktion checkt – da kommt mir dein Ansatz gelegen.

Hallo Christoph, welche 1wire Feuchtesensoren verwendest Du denn?
Ich hatte auch Probleme mit USB-Hubs an der Dockstar. Ich verwende nun mehrfach den Reichelt „DELOCK 87445“. Mit diesem habe ich keine Problem mehr. Zudem kannst Du bei diesem Hub die Stromversorgung der einzelnen USB Anschlüsse per Software an- und ausschalten (siehe Link: http://www.vdr-portal.de/board19-verschiedenes/board52-andere-hardware/p966299-stromversorgung-schalten-mit-usb-hub-für-3-70-eur/#post966299 ).
Zu Deinem Zuweisungsproblem: warum verwendest Du nicht udev? Damit kannst Du einen Symlink auf das Device setzen und mit dem Symlink arbeiten. In folgenden Beispiel also „/dev/tellstick“ Die passenden Attribute musst Du natürlich noch abhängig von Deiner Hardware ermitteln (hier gibts zu Hauf Anleitungen im Netz).
cat /etc/udev/rules.d/99-tellstick.rules KERNEL==„ttyUSB*“, SUBSYSTEMS==„usb-serial“, SYMLINK+=„tellstick“, GROUP=„audio“, MODE=„0660“, ATTRS{idVendor}==„1781“, ATTRS{idProduct}==„0c30“,
@Markus: Hallo Markus, ich verwende einen MS-TH (Luftfeuchtigkeit und Temperatur Multisensor).
Ich muss sagen, dass das Problem mit den Bezeichnungen schon seid längerem nicht mehr auftritt. Ich glaube aber nicht, dass es am Hub liegt, da daran eine Webcam, ein Soundstick und ein Keypad ohne Probleme werkeln. Aber der von dir erwähne Hub ist echt genial
Das mit Udev ist echt lustig, da ich schon die ganze Zeit eine Udev Regel für die Zugriffsrechte auf den Adapter eingerichtet hatte
Nun ja, auf die Idee mit dem Symlink bin ich natürlich nicht gekommen (ich habe gar nicht mehr nach einer Lösung gesucht, weil es keine Probleme mehr gab). Ich habe die vorhandene Regel nun durch ein SYMLINK erweitern - funktioniert perfekt.
Vielen Dank für die einfache Lösung!

@Christoph Winkler: Hallo Christoph, hier noch ein alternativer Sensor: http://shop.wiregate.de/sensoren-fuhler/multisensor/1-wire-adv-multisensor-ams-ths-2io-a10-211-brk.html
Grüße Markus
@Markus: Hallo Markus,
preislich ist der Sensor auf jeden Fall eine spitzen Alternative. Wird der von digitemp oder OWFS unterstützt? Ich fand diesen Sensor auch noch ganz interessant – vor allem für Inneninstallation (wird von OWFS vollständig unterstützt).
Im Moment suche ich noch nach einem preiswerten Luftdrucksensor sowie einem UV Sensor (oder ähnlichem). Der Lightning Detector von HobbyBoards hat es mir ehrlich gesagt auch angetan. Mal schauen was als nächstes dazu kommt
Kennst du noch Shops/Seiten, wo man billig an 1-Wire Zeugs kommt?

@Christoph Winkler: Hallo Christoph, ich habe bis jetzt nur mehrere Temperatursensoren ds18s20 an meinem Server hängen. Feuchtesensoren waren mir auch immer zu teuer. Der verlinkte Multisensor wurde vor kurzem um 15€ im Preis gesenkt, hab ich auch erst heute gesehen. Vielleicht hol ich mir zwei für draussen und dem Keller. Hobbyboards Seite kenn ich auch, hab aber dort noch nie was bestellt. Da ist halt auch noch immer Zoll fällig, aber interessante Produkte!

Ansonsten hab ich auch keine günstige Quelle mehr. Der Sensor sollte von beiden Programmen unterstützt werden, sind ja schließlich Standard 1wire Sensoren.
Feuchtesensoren sind im Vergleich zu Barometern ja noch relativ billig. 1-Wire rentiert sich halt vor allem, wenn es um Temperaturmessung geht. Leider benötigt man für eine komplette Wetteraufzeichnung auch den ein oder anderen teuren Sensor
Bei Homechip bekommt man Temperatursensoren sowie einfache Multisensoren (also ohne Feuchte und Luftdruck) extrem billig, da rentiert sich das Selbstbauen kaum noch
[…] Munin & Fazit […]