// 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:

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

No. 1 @ 2012/04/10 21:17

[…] Munin &amp; Fazit […]

No. 2 @ 2012/04/23 08:47

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

No. 3 @ 2012/04/23 17:29

@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

No. 4 @ 2012/04/23 18:43

@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

No. 5 @ 2012/04/28 18:10

@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.

Markus
No. 6 @ 2012/07/11 13:17

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“,

No. 7 @ 2012/07/11 14:08

@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!

Markus
No. 8 @ 2012/07/11 15:01

@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

No. 9 @ 2012/07/11 20:05

@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?

Markus
No. 10 @ 2012/07/11 21:49

@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!

Markus
No. 11 @ 2012/07/11 21:51

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.

No. 12 @ 2012/07/13 01:45

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 :-)

Comments are closed

Hello World!

This is the personal website of Christoph Winkler.
Here you will find a sort of blog and some information about me and my projectshave fun!

Recent Comments
Latest Tweets
QR-Code: aktuelle Seiten-URL
Falls nicht anders bezeichnet, ist der Inhalt dieses Wikis unter der folgenden Lizenz veröffentlicht: CC Attribution-Noncommercial-Share Alike 3.0 Unported