wiki:Projekte/muninlite-Wetterstation

WS0101

Wetterstation WS-0101 am OpenWRT-Router in munin integrieren

Die Wetterstation WS-0101 ist eine bei Pollin erhältliche preiswerte Wetterstation, die neben anderen features eine USB-Schnittstelle enthält. Damit ist sie zum Datenloggen prädestiniert. Ziel der hier gezeigten Lösung war, die Meßwerte (zunächst außer Windrichtung und -Geschwindigkeit) zuerst in munin bzw. muninlite einzubinden und zu visualisieren.

  • Sensoren:
    • Luftfeuchte, Lufttemperatur, beide jeweils innen und außen
    • Luftdruck - außen
    • Windrichtung und -geschwindigkeit - außen
  • Außensensoren per 868MHz-Kurzstreckenfunk mit der Basisstation verbunden

Die Station wird von FineOffset Electronics hergestellt, der Typ WS-2080 (und WH-2080) ist offenbar das OEM-Modell. Von dieser Firma werden recht viele verschiedene Modell angeboten, die alle auch als OEM-Modellen von anderen Firmen genutzt werden. Somit war die Suche nach Software eher eine Suche nach den Namen der OEMs...

Gedacht hatten wir, die USB als serielle Schnittstelle auf der Wetterstation vorzufinden, offenbar war es aber für die mitgelieferte Windows-Software EasyWeather (ebenfalls von FineOffset) unter Windows einfacher, ein HID-Device ohne weiteren HW-Treiber zu etablieren:

1941:8021.0005: hiddev96,hidraw0: USB HID v1.00 Device [HID 1941:8021] on usb ....

das sich unter Ubuntu lucid auch noch als etwas anderes ausgibt:

Bus 002 Device 005: ID 1941:8021 Dream Link USB Missile Launcher

Die Protokoll-Beschreibung bzw. memory map findet sich hier. Auf Jim Easterbrooks Recherche-Arbeit zu den Stationen beruht einige Software.


jede Menge Software

Durch die große Verbreitung der Wetterstationen dieser Firma, der Existenz von anderen BS als Windows und nicht zuletzt auch einer gewissen 'Wurstigkeit' von EasyWeather gibt es eine Anzahl von Versuchen, andere Software zum Auslesen und Auswerten der Daten zu verwenden. Die meiste geht jedoch davon aus, daß die SW auf dem Host läuft und ist daher ohne Bedenken in Perl oder Python implementiert - für einen kleinen OpenWRT-Router meist undiskutabel, spätestens, wenn das Gerät auch noch etwas anderes machen soll.

Auswahl:

  • meteolinger / wwsr läuft in der 3.3 sofort, logfile-Anlegen geht irgendwie gerade nicht mehr, aber klein genug für nen openWRT mit muninlite. Die Erkenntnisse von wwsr sind ebenfalls in viele ähnliche Projekte geflossen. Könnte auch pywws-Format-log ausgeben, wenn's denn gerade gehen würde... Das meteolinger-perl-tool interessierte uns hier nicht, sondern nur dessen 'Treiber' wwsr.
  • pywws funktioniert gut, zuende programmiert, gut modularisiert, kann wunderground beschicken sowie Wetterdaten twittern, spitzen Doku, ernsthaftes Vorhersagemodul (Algo: Zambretti), nimmt zum Visualisieren allerdings unschickes gnuplot, dafür mit echter Windrose --> wäre eine gute Grundlage, den Grafikoutput per pylab/matplotlib mal hübscher zu machen. Der Autor sagt, daß es auf einem Asus WL500gP läuft, allerdings als dediziertes Gerät ohne weitere Aufgaben
  • wfrog läuft auch auf kleinen Systemen, nervt wegen g**gle chart api
  • wview - nunja, uns etwas zu groß, der server-daemon lief aus unbekannten Gründen nicht zuverlässig
  • FreWe - ein anderer Ansatz (Zusatz für die alternative Fritzbox-FW Freetz), beruht letztlich auch auf wwsr / meteolinger


Sources auschecken

Unsere Wahl fiel auf wwsr:

svn co http://meteolinger.lowlevel.cz/anonsvn


compile

Neben einem USB-Port braucht die Zielplattform generelle USB-Unterstützung sowie die libusb.

gcc /usr/lib/libusb.so wwsr3.3.c -o wwsr3.3

Die sourcen müssen natürlich für die jeweilige Zielprozessor-Architektur compiliert werden, wenn die Wetterstation z.B. auf einem Router laufen soll. Für OpenWRT ist das hier beschrieben, etwas volkstümlicher im Elekt*r-Sonderheft "Mikrocontroller 3" vom November 2008 für einen Asus WL500gP unter Pimp my Router.

Eine vorkompilierte Version für einen WL500gP V1-Router (o.ä. mit BCM947xx/953xx MIPSEL-32 target) liegt im Anhang.

$ file wwsr3.3 
wwsr3.3: ELF 32-bit LSB executable, MIPS, MIPS32 version 1, dynamically linked (uses shared libs), with unknown capability 0xf41 = 0x756e6700, not stripped
$ 

Der User muß die Rechte für die USB-Nutzung haben, oder man nutzt ohnehin den root am OpenWRT. Aufruf ohne Parameter:

# wwsr3.3 
time:                  1970-01-12 11:33:59
in humidity:           52 %
out humidity:          73 %
in temperature:        26.3 C
out temperature:       21.1 C
out dew temperature:   16.1 C
windchill temperature: 21.1 C
wind speed:            0.0 m/s
wind gust:             0.0 m/s
wind direction:        N
pressure:              1008.5 hPa
rel. pressure:         1008.5 hPa
rain last hour:        0.0 mm
rain last 24h:         0.0 mm
rain total:            150.9 mm

helppage:

$ wwsr3.3 -h
Wireless Weather Station Reader v0.1
(C) 2007 Michael Pendec

options
 -? -h            Display this help
 -a <v>:<p>       Change the vendor:product address of the usb device from the default
 -A <alt in m>    Change altitude
 -p <pos>         Alter position in weather station log from current position (can be +- value)
 -v               Verbose output, enable debug and warning messages
 -d [addr]:[len]  Dump length bytes from address
 -x               XML output
 -e <errstr>      Write this errstr if measured value is out of range (e.g. outdoor unit is disconnected)
 -f <string>      Format output to user defined string
    %h - inside humidity
    %H - outside humidity
    %t - inside temperature
    %T - outside temperature
    %C - outside dew temperature
    %c - outside wind chill temperature
    %W - wind speed
    %G - wind gust
    %D - wind direction - named
    %S - wind direction - slovak names
    %d - wind direction - degrees
    %P - pressure
    %p - relative pressure
    %r - rain 1h in mm/h
    %f - rain 24h in mm/h
    %F - rain last 24h in mm
    %R - rain total from meteostation start in mm
    %N - now - date/time string
$

Besonders interessant ist die Möglichkeit des Formatstrings: daraus läßt sich ein munin-plugin bauen. Beispiel für die Temperatur (ohne Anemometer ist die windchill- gleich der Außentemperatur):

$ wwsr3.3 -f "temp_in.value %t\ntemp_out.value %T\ntemp_dew.value %C\ntemp_windchill.value %c\n"
temp_in.value 26.3
temp_out.value 20.8
temp_dew.value 16.2
temp_windchill.value 20.8
$ 


munilite-Konfiguration

muninlite ist ein shell-script, das sich wie ein munin-node verhält und und somit auf Systemen mit kleinen Ressourcen und ohne perl laufen kann. Es wird mittels (x)inetd durch einen remote munin-Aufruf gestartet.

Das script wird um diese vier Plugins erweitert (hier am Ende der Zeile; 'wind' noch nicht enabled):

# Remove unwanted plugins from this list
PLUGINS="cpu if_ if_err_ load memory processes netstat uptime interrupts irqstats baro temp humid rain"

und weiter unten werden die Plugins eingefügt:

config_baro() {
  echo "graph_category Wetterstation"
  echo "graph_title absoluter Luftdruck - DeinOrt"
  echo "graph_args --base 1000 --lower-limit 980 --upper-limit 1040 --vertical-label hPa -r"
  echo "graph_scale no"
  echo "pressure_abs.label absoluter Luftdruck"
  echo "pressure_abs.draw LINE2"
}
     
fetch_baro() {
  wwsr3.3 -f "pressure_abs.value %P\n"
}

config_temp() {
  echo "graph_category Wetterstation"
  echo "graph_title Temperatur - DeineWetterstation"
  echo "graph_args --base 1000 --vertical-label degC"
  echo "temp_in.label Temperatur DeineWetterstation"
  echo "temp_in.draw LINE2"
  echo "temp_out.label Temperatur DeineWetterstation"
  echo "temp_out.draw LINE2"
  echo "temp_dew.label Taupunkt"
  echo "temp_dew.draw LINE2"
  echo "temp_windchill.label windchill-Temp"
  echo "temp_windchill.draw LINE2"
}

fetch_temp() {
  wwsr3.3 -f "temp_in.value %t\ntemp_out.value %T\ntemp_dew.value %C\ntemp_windchill.value %c\n"
}

config_humid() {
  echo "graph_category Wetterstation"
  echo "graph_title rel.Luftfeuchtigkeit - DeineWetterstation"
  echo "graph_args --base 1000 --vertical-label %"
  echo "humid_in.label rel. Luftfeuchte in"
  echo "humid_in.draw LINE2"
  echo "humid_out.label rel. Luftfeuchte out"
  echo "humid_out.draw LINE2"
}

fetch_humid() {
  wwsr3.3 -f "humid_in.value %h\nhumid_out.value %H\n"
}

config_wind() {
  echo "graph_category Wetterstation"
  echo "graph_title Wind - DeineWetterstation"
  echo "graph_args --base 1000"
  echo "graph_vlabel m/s / deg"
  echo "wind_speed.label windgeschwindigkeit"
  echo "wind_speed.draw LINE2"
  echo "wind_gust.label windboen"
  echo "wind_gust.draw LINE2"
  echo "wind_dir.label windrichtung"
  echo "wind_dir.draw LINE2" 
}

fetch_wind() {
  wwsr3.3 -f "wind_speed.value %W\nwind_gust.value %G\nwind_dir.value %d\n"
}

config_rain() {
  echo "graph_category Wetterstation"
  echo "graph_title Regen - DeineWetterstation"
  echo "graph_args --base 1000"
  echo "graph_vlabel mm (l/m^2)"
  echo "rain_total.label rain"
  echo "rain_total.type DERIVE"
  echo "rain_total.min 0" 
  echo "rain_total.draw LINE2"
  echo "rain_total.cdef rain_total,100,*"
  echo "rain_24h.label last 24h in mm"
  echo "rain_24h.type DERIVE"
  echo "rain_24h.min 0"
  echo "rain_24h.draw LINE2"
  echo "rain_24h.cdef rain_24h,100,*"
  echo "rain_1h_ph.label last h in mm/h"
  echo "rain_1h_ph.draw LINE2"
  echo "rain_24h_ph.label last 24h in mm/h"
  echo "rain_24h_ph.draw LINE2"
}

fetch_rain() {
  wwsr3.3 -f "%R %F %r %f" | awk '{print "rain_total.value "$1*10"\nrain_24h.value "$2*10"\nrain_1h_ph.value "$3"\nrain_24h_ph.value "$4}'
}


Bemerkungen zu den plugins:

  • Die Uhrzeit wird bei diesem Modell der Station wird zwar per DCF77 empfangen, aber häufig falsch ausgelesen. Das macht aber nichts - sie wird ohnehin nicht verwendet, denn der fünfminütliche munin-Aufruf setzt den timestamp.
  • Das awk-Geraffel bei fetch_rain() ist nötig, da sich herausstellte, daß
    • DERIVE nur integer verträgt (bei einer Nachkommastelle also *10) und
    • aus unbekannten Gründen für die Graphen die Werte mal 100 genommen werden müssen (im config_rain() die cdef-rule), damit sie stimmen.
  • Windmessung ist bisher nicht in Betrieb genommen. Die Windrichtung als Band und ohne Windrose darzustellen (wie z.B. hier, beruht auch auf rrdtool), ist nicht die erste Wahl.



Beispielgraphen der Tageswerte


munin-Output Temperatur (temp-day.png)
munin-Output Luftfeuchte (humid-day.png)
munin-Output Regen (rain-day.png)
munin-Output Luftdruck (baro-day.png)


Die Regensensorwerte stimmen sehr gut mit der Vorhersage überein:

Teil einer Wettervoraussage, nahe Wetterstation ((c) by meteomedia)


Wettersituation (Regenradar, Satellitenbild):

Regenradarecho ((c) by wetter.info)
Satellitenbild ((c) by wetter.info)

Last modified 3 years ago Last modified on Jul 12, 2019, 10:46:15 PM

Attachments (9)

Download all attachments as: .zip