EFWS 2900 / W830

Begonnen von Dieter2016, 13 Mai 2018, 16:41:15

Vorheriges Thema - Nächstes Thema

Dieter2016

Hallo,

welche Möglichkeiten gibt es diese Baugleichen Wetterstationen W830 / EFWS 2900 in FHEM einzubinden?
am liebsten würde ich die Daten direkt mit der CUL abgreifen.
Perfekt wäre noch ein schönes Inderface für die Tablett UI.

Ich finde aber hier im Forum nichts zu diesen Geräten.

Sonnige Grüsse Dieter

Per

Ein fertiges Modul gibt es hier.
Aber nur über die Basisstation und WLAN.
CUL wie bei der W266/W136 wäre interessant. Aber dazu müsste jemand (du?) den Funkverkehr mitschneiden und entschlüsseln. Und dazu ist einmalig die Basisstation notwendig. Das Modul selbst ist easy, dafür kann man ein vorhandenes (W136) anpassen oder den Autor mit Lieferung der Daten um ein Update bitten.

pejonp

LaCrossGW 868MHz:WT470+TFA+TX37-IT+EMT7110+W136+WH25A HP1003+WH2621
SignalD(CC1101):Bresser+WS-0101(868MHz WH1080)+Velux KLF200+MAX!+HM-MOD-UART:Smoke HM-SEC-SD+VITOSOLIC 200 RESOL VBUS-LAN+SolarEdge SE5K(Modbus)+Sonnen!eco8(10kWh)+TD3511+DRT710M(Modbus)+ZigBee+Z-Wave+MQTT+vitoconnect

HessGe

#3
Hallo zusammen,

Da dies mein erster Beitrag ist, erst mal vielen Dank an alle Mitschreibenden hier im Forum. Ich betreibe jetzt schon einige Zeit einen Raspi mit FHEM und habe dank der hilfreichen Beiträge hier mir bislang alles selbst aneignen können, was ich benötige. Die Notwendigkeit, hier etwas zu fragen bestand bislang nicht, für alles mögliche gab es schon eine Lösung. Teilweise erst nach längerem Suchen und Ausprobieren, aber das war auf jeden Fall "didaktisch wertvoll" (wie einer meiner Lehrer damals immer zu sagen pflegte).

Noch kurz etwas zu mir: Ich bin Geisteswissenschaftler, also nicht unbedingt extrem versiert im Programmieren etc. Alles was ich kann, habe ich mir selbst angeeignet. Auf der Arbeit ein bisschen VBA, von früher noch minimale HTML-Kenntnisse, sehr wenig SQL und so. Also viel Learning by doing und manchmal klappt auch einfach etwas, ohne dass ich verstehe wie es wirklich funktioniert :-)

Jetzt aber zurück zum Thread-Thema. Ich habe den Thread ausgegraben, weil ich vor kurzem selbst eine Wetterstation in Betrieb genommen habe, konkret die Eurochron EFWS 2900 (baugleich zu Ventus W380, Froggit WH3000 SE, Ambient Weather Osprey 2902 und hergestellt von Foshk). Voller Tatendrang habe ich auch versucht, anhand des im vorherigen Beitrag verlinkten Threads und diverser anderer, Daten von dieser Wetterstation über einen JeeLink abzugreifen. Hat aber ums Verrecken net hingehauen, entweder weil mir irgendwo die Kenntnisse fehlen, um Dinge korrekt anzupassen, oder aus irgendwelchen anderen, sich mir nicht erschliessenden Gründen.

Ich habe aber eine andere Lösung gefunden, an die Daten zu kommen und möchte diese hier vorstellen, damit es vielleicht anderen weiterhilft. Bitte dabei beachten: Ich bin Laie, vermutlich geht es besser, einfacher, eleganter, dann gerne verbessern.

Was habe ich gemacht?
Über den Hinweis in einem anderen Thread zu einem DNS-Trick, der die von der Basisstation gesendeten Daten umlenkt auf den Router, wollte ich einen solchen Weg probieren. Zur Umsetzung des DNS-Trick selbst fehlten mir die Kenntnisse, wie ich das mit einer Fritzbox hinbekommen sollte. Also habe ich experimentiert und den Raspberry als Bridge genutzt, in dessen WLAN sich die Wetterstation einloggt und der über LAN an der Fritzbox hängt. Dann auf dem Raspi mal per Wireshark den Datenverkehr mitgeschnüffelt und tadaa: Die Basisstation sendet HTTP-Reuquests mit den benötigten Daten im Klartext.
Nach ein bisschen rumprobieren hab ich dann diese Daten auch herauspicken und in FHEM einbinden können.

Wie ging das im Detail?

1.

Zuerst habe ich den Raspi gemäß dieser Anleitung hier als WLAN-Bridge eingerichtet: https://www.elektronik-kompendium.de/sites/raspberry-pi/2002161.htm. Als WLAN-Name habe ich "WetterWLAN" gewählt, damit ich nicht mit dem normalen Haus-WLAN durcheinander komme.


2.

Die Basisstation übermittelt die Daten an Weather Underground. Vielleicht braucht man nicht mal einen Account dort (die HTTP Requests müsste sie ja auch mit Fake-Accountdaten senden), ich nutze aber einen. Auf jeden Fall basiert die Lösung darauf, dass ein Account eingetragen ist


3.

Nun braucht man natürlich das Paket tshark: sudo apt-get install tshark
Wer mag, kann auch über sudo apt-get install wireshark Wireshark installieren, da ist tshark mit dabei und die GUI von Wireshark kann durchaus hilfreich sein ;-)


4.

Über folgenden Befehl lassen sich die benötigten HTTP-Requests abgreifen:
tshark -a duration:16 -T fields -e http.request.uri.query.parameter -f "host rtupdate.wunderground.com" -i br0 -t ud -E separator=, -w /media/fritznas/wetter/wetter > /media/fritznas/wetter/wetter.txt
Die duration habe ich gewählt, weil die Wetterstation alle 16 Sekunden Daten hochladen will. Wie man sieht, werden die Daten in meinem Fall auf dem NAS gespeichert, das an der Fritzbox hängt. Hier kann natürlich wahlweise auch ein anderes Verzeichnis direkt auf dem Raspi oder sonstwo gewählt werden. Da ich mit dem pcap Format von tshark nicht arbeiten kann, wird das Ergebnis auch im txt-Format gespeichert. Ein fortlaufender Log ist an der Stelle aber nicht möglich, da die Text-Datei erst dann zur Verfügung steht, wenn der Mitschnitt beendet wird (Daher auch nur 16 Sekunden, um mindestens einen HTTP Request zu erwischen)

Exemplarisch hier mal ein Ergebnis:ID=Meine_WU_Station-ID,PASSWORD=Mein_Passwort,indoortempf=73.8,tempf=57.6,dewptf=33.4,windchillf=57.6,indoorhumidity=35,humidity=40,windspeedmph=0.0,windgustmph=0.0,winddir=78,absbaromin=28.94,baromin=30.24,rainin=0.00,dailyrainin=0.00,weeklyrainin=0.18,monthlyrainin=3.34,solarradiation=163.44,UV=1,dateutc=2019-03-22%2009:54:09,softwaretype=EasyWeatherV1.3.1,action=updateraw,realtime=1,rtfreq=5


5.

Was jetzt kommt, ist vermutlich zu kompliziert, aber ich hab es nicht anders hinbekommen. Mittels der Nutzung mehrerer temporärer Text-Dateien und sed habe ich mir den Inhalt, der in wetter.txt gespeichert wird, zurecht formatiert. Ich habe zunächst versucht, über den Parameter "-i" die Änderungen direkt in wetter.txt vorzunehmen, das hat dann aber zu Abbrüchen geführt beim Versuch, das Ganze dauerhaft laufen zu lassen. Ich vermute, es liegt daran dass sed nicht wirklich in der Datei etwas ändert, sondern zuerst eine neue temporäre Datei anlegt, die alte wetter.txt dann löscht und die temporäre Datei umbenennt (so habe ich es verstanden). Das war wohl irgendwann zuviel. Also mache ich das in mehreren Schritten:

5a)
perl -pe 's/\n//' '/media/fritznas/wetter/wetter.txt' > '/media/fritznas/wetter/wetter2.txt'
Falls das Paket perl nicht installiert ist, muss das über sudo apt-get install perl nachgeholt werden.
In diesem Schritt werden unnötige Zeilenumbrüche entfernt. Leider habe ich es nicht hinbekommen, dass tshark nur den HTTP-Request in die Datei schreibt, es sind immer eine Anzahl Leerzeilen davor und dahinter und dummerweise nicht immer gleich viele.

5b)
perl -pe 's/,dateutc.*//' '/media/fritznas/wetter/wetter2.txt' > '/media/fritznas/wetter/wetter3.txt'
In jedem HTTP-Request stehen am Ende Informationen, die nicht gebraucht werden. Zunächst Datum/Uhrzeit in einem Format, das für ein FHEM-Logfile später nicht passt, sowie Software-Version etc. Ich brauche es nicht, daher wird es abgeschnitten

5c)
Datums-Variablen erzeugen einmal für den Zeitstempel im Log und dann für den Zeitstempel im Dateinamen des Log (geht sicher eleganter):
d1=$(date +%Y-%m-%d_%H:%M:%S)
d2=$(date +%Y-%m)

Achtung! Soweit ich das verstanden habe, benötigt FHEM das Datum zumindest im Logfile vierstellig, also großes Y. Im Dateinamen vom Plot ginge es auch zweistellig, aber damit man nicht durcheinander kommt, immer großes Y :-)

5d)
(nur exemplarisch)
In das zukünftige Logfile die Einträge für die einzelnen Werte einfügen:
sed -e "s/,/&\n/g;s/.*tempf=/$d1 Aussentemperatur: /;s/,.*//" /media/fritznas/wetter/wetter3.txt | tr -d '\n' >> /media/fritznas/wetter/wetter_log-$d2.txt
echo "" >> /media/fritznas/wetter/wetter_log-$d2.txt

Im http-Request wird die Aussentemperatur in Grad Fahrenheit wie folgt übermittelt "tempf=40.8". Die einzelnen Datenfelder sind mit Komma getrennt ("tempf=40.8,dewptf=32.4,..."). Der Befehl schneidet alles vor dem "tempf" ab, ersetzt das "tempf=" durch "Aussentemperatur: ", übernimmt dann den Zahlenwert und schneidet alles ab dem nächsten Komma wieder ab. Analog wird es für alle weiteren Datenfelder gemacht. Nach jedem Datenfeld wird dann über den echo-Befehl in die nächste Zeile gesprungen.

Mit diesen Befehlen habe ich z.B. eine Datei wetter_log-2019-03.text mit Einträgen à la 2019-03-22_07:06:02 Aussentemperatur: 40.8
2019-03-22_07:06:02 Taupunkt: 32.4

Zur Umrechnung der Werte in Grad Celsius komme ich später.


6.

Als nächstes muss das Skript natürlich regelmäßig ausgeführt werden. Dafür habe ich alle Befehle in eine Skript-Datei gepackt:
#!/bin/sh
d1=$(date +%Y-%m-%d_%H:%M:%S)
d2=$(date +%Y-%m)

tshark -a duration:16 -T fields -e http.request.uri.query.parameter -f "host rtupdate.wunderground.com" -i br0 -t ud -E separator=, -w /media/fritznas/wetter/wetter > /media/fritznas/wetter/wetter.txt

perl -pe 's/\n//' '/media/fritznas/wetter/wetter.txt' > '/media/fritznas/wetter/wetter2.txt'
perl -pe 's/,dateutc.*//' '/media/fritznas/wetter/wetter2.txt' > '/media/fritznas/wetter/wetter3.txt'

sed -e "s/,/&\n/g;s/.*indoortempf=/$d1 Innentemperatur: /;s/,.*//" /media/fritznas/wetter/wetter3.txt | tr -d '\n' >> /media/fritznas/wetter/wetter_log-$d2.txt
echo "" >> /media/fritznas/wetter/wetter_log-$d2.txt

sed -e "s/,/&\n/g;s/.*tempf=/$d1 Aussentemperatur: /;s/,.*//" /media/fritznas/wetter/wetter3.txt | tr -d '\n' >> /media/fritznas/wetter/wetter_log-$d2.txt
echo "" >> /media/fritznas/wetter/wetter_log-$d2.txt

sed -e "s/,/&\n/g;s/.*dewptf=/$d1 Taupunkt: /;s/,.*//" /media/fritznas/wetter/wetter3.txt | tr -d '\n' >> /media/fritznas/wetter/wetter_log-$d2.txt
echo "" >> /media/fritznas/wetter/wetter_log-$d2.txt

sed -e "s/,/&\n/g;s/.*windchillf=/$d1 Windchill: /;s/,.*//" /media/fritznas/wetter/wetter3.txt | tr -d '\n' >> /media/fritznas/wetter/wetter_log-$d2.txt
echo "" >> /media/fritznas/wetter/wetter_log-$d2.txt

sed -e "s/,/&\n/g;s/.*indoorhumidity=/$d1 Luftfeuchtigkeit_innen: /;s/,.*//" /media/fritznas/wetter/wetter3.txt | tr -d '\n' >> /media/fritznas/wetter/wetter_log-$d2.txt
echo "" >> /media/fritznas/wetter/wetter_log-$d2.txt

sed -e "s/,/&\n/g;s/.*humidity=/$d1 Luftfeuchtigkeit_aussen: /;s/,.*//" /media/fritznas/wetter/wetter3.txt | tr -d '\n' >> /media/fritznas/wetter/wetter_log-$d2.txt
echo "" >> /media/fritznas/wetter/wetter_log-$d2.txt

sed -e "s/,/&\n/g;s/.*windspeedmph=/$d1 Windgeschwindigkeit: /;s/,.*//" /media/fritznas/wetter/wetter3.txt | tr -d '\n' >> /media/fritznas/wetter/wetter_log-$d2.txt
echo "" >> /media/fritznas/wetter/wetter_log-$d2.txt

sed -e "s/,/&\n/g;s/.*windgustmph=/$d1 Windboen: /;s/,.*//" /media/fritznas/wetter/wetter3.txt | tr -d '\n' >> /media/fritznas/wetter/wetter_log-$d2.txt
echo "" >> /media/fritznas/wetter/wetter_log-$d2.txt

sed -e "s/,/&\n/g;s/.*winddir=/$d1 Windrichtung: /;s/,.*//" /media/fritznas/wetter/wetter3.txt | tr -d '\n' >> /media/fritznas/wetter/wetter_log-$d2.txt
echo "" >> /media/fritznas/wetter/wetter_log-$d2.txt

sed -e "s/,/&\n/g;s/.*absbaromin=/$d1 Luftdruck1: /;s/,.*//" /media/fritznas/wetter/wetter3.txt | tr -d '\n' >> /media/fritznas/wetter/wetter_log-$d2.txt
echo "" >> /media/fritznas/wetter/wetter_log-$d2.txt

sed -e "s/,/&\n/g;s/.*baromin=/$d1 Luftdruck2: /;s/,.*//" /media/fritznas/wetter/wetter3.txt | tr -d '\n' >> /media/fritznas/wetter/wetter_log-$d2.txt
echo "" >> /media/fritznas/wetter/wetter_log-$d2.txt

sed -e "s/,/&\n/g;s/.*rainin=/$d1 Regen: /;s/,.*//" /media/fritznas/wetter/wetter3.txt | tr -d '\n' >> /media/fritznas/wetter/wetter_log-$d2.txt
echo "" >> /media/fritznas/wetter/wetter_log-$d2.txt

sed -e "s/,/&\n/g;s/.*dailyrainin=/$d1 Regen_Tag: /;s/,.*//" /media/fritznas/wetter/wetter3.txt | tr -d '\n' >> /media/fritznas/wetter/wetter_log-$d2.txt
echo "" >> /media/fritznas/wetter/wetter_log-$d2.txt

sed -e "s/,/&\n/g;s/.*weeklyrainin=/$d1 Regen_Woche: /;s/,.*//" /media/fritznas/wetter/wetter3.txt | tr -d '\n' >> /media/fritznas/wetter/wetter_log-$d2.txt
echo "" >> /media/fritznas/wetter/wetter_log-$d2.txt

sed -e "s/,/&\n/g;s/.*monthlyrainin=/$d1 Regen_Monat: /;s/,.*//" /media/fritznas/wetter/wetter3.txt | tr -d '\n' >> /media/fritznas/wetter/wetter_log-$d2.txt
echo "" >> /media/fritznas/wetter/wetter_log-$d2.txt

sed -e "s/,/&\n/g;s/.*solarradiation=/$d1 Sonnenstrahlung: /;s/,.*//" /media/fritznas/wetter/wetter3.txt | tr -d '\n' >> /media/fritznas/wetter/wetter_log-$d2.txt
echo "" >> /media/fritznas/wetter/wetter_log-$d2.txt

sed -e "s/,/&\n/g;s/.*UV=/$d1 UV-Index: /;s/,.*//" /media/fritznas/wetter/wetter3.txt | tr -d '\n' >> /media/fritznas/wetter/wetter_log-$d2.txt
echo "" >> /media/fritznas/wetter/wetter_log-$d2.txt


Diese Datei habe ich "auslesen" genannt, im Verzeichnis /usr/local/bin/ gespeichert und per chmod -x /usr/local/bin/auslesen ausführbar gemacht.


7.

Als nächstes soll das Skript natürlich regelmäßig ausgeführt werden. Ich habe an der Stelle rum-experimentiert, mit Aufruf des Skripts über die rc.local und einer While-Schleife im Skript selber, aber das ist immer nach einer Weile abgebrochen. Fand ich nicht so gut. Ich lasse das Skript jetzt über einen Eintrag in der /etc/crontab jede Minute ausführen:
52 6 1 * * root test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.monthly )
* * * * * root /usr/local/bin/auslesen
(die erste Zeile ist standardmäßig vorhanden, nur damit man weiß, wo es steht).

Mir persönlich reicht einmal in der Minute. Bestimmt gibt es auch Wege, die Requests laufend aufzuzeichnen und somit alle 16 Sekunden ein Update zu bekommen, aber das übersteigt meine Fähigkeiten. Vielleicht hatja ein versierterer Nutzer/Programmierer eine Lösung ;-)


8.

Über die vorangegangenen Schritte haben wir nun also eine Log-Datei im Text-Format und zwar eine pro Monat (für Backups sicher hilfreich und so werden die Dateien auch nicht ewig groß). Die muss jetzt irgendwie in FHEM rein. Hier habe ich wiederum in einigen Beiträgen hier im Forum und anderswo Hilfe gefunden, ganz explizit sei folgender Thread benannt: https://forum.fhem.de/index.php?topic=38948.0
Das einbinden des Logfiles in FHEM ist letztlich recht einfach, wenn er in dem hier beschriebenen Format vorhanden ist. Ich habe das oben genutzte Verzeichnis vom Fritznas in das Home-Verzeichnis des Nutzers pi eingebunden, dann lässt sich über
define Wetterstation FileLog /home/pi/fritznas/wetter/wetter_log-%Y-%m.txt Wetterstation.* der entsprechende Log in FHEM erzeugen


9.

Jetzt kommt die Kür, ich will natürlich auch entsprechende Plots in FHEM anzeigen. Dafür muss ich unter anderem die Werte von Grad Fahrenheit in Grad Celsius umrechnen. Dazu legen wir über define SVG_Temp_Humid SVG Wetterstation:SVG_Temp_Humid:CURRENT erst mal einen SVG-Plot an. Alternativ auch möglich, indem man in FHEM das Logfile aufruft und oben unter Regexp parts auf den Link "Create SVG plot" klickt.
Mein Plot enthält Temperatur und Luftfeuchtigkeit für innen und außen, siehe Bild im Anhang. Für die Umrechnung von Grad Fahrenheit in Celsius muss im Feld "Function" des entsprechenden Regexp-Ausdrucks ($fld[2]-32)*5/9 eingetragen werden.
Der Luftdruck wird in inhg (Zoll Quecksilbersäule) übermittelt, hier ist für die Umrechnung auf hPa folgende Formel notwendig: $fld[2]*33.8638815789

Zusätzlich habe ich noch über attr SVG_Temp_Humid fixedrange qday
attr SVG_Temp_Humid plotmode SVG
attr SVG_Temp_Humid plotsize 800,360

eingestellt, dass nicht immer der ganze Tag angezeigt wird und den Plot etwas größer gemacht.

Hier auch noch mal die .gplot-Files für Temperatur/Luftfeuchte und

Temp_Humid:
set terminal png transparent size <SIZE> crop
set output '<OUT>.png'
set xdata time
set timefmt "%Y-%m-%d_%H:%M:%S"
set xlabel " "
set title 'Temperatur und Luftfeuchte'
set ytics
set y2tics
set grid ytics
set ylabel "Temperatur"
set y2label "Luftfeuchtigkeit"
set yrange [-15:40]
set y2range [0:100]

#Wetterstation 3:Aussentemperatur\x3a.*::($fld[2]-32)*5/9
#Wetterstation 3:Innentemperatur\x3a.*::($fld[2]-32)*5/9
#Wetterstation 3:Luftfeuchtigkeit_aussen\x3a.*::
#Wetterstation 3:Luftfeuchtigkeit_innen\x3a.*::

plot "<IN>" using 1:2 axes x1y1 title 'Außentemperatur' ls l0 lw 3 with lines,\
     "<IN>" using 1:2 axes x1y1 title 'Innentemperatur' ls l6 lw 3 with lines,\
     "<IN>" using 1:2 axes x1y2 title 'Luftfeuchte außen' ls l2 lw 1 with lines,\
     "<IN>" using 1:2 axes x1y2 title 'Luftfeuchte innen' ls l3 lw 1 with lines


Luftdruck und Sonnenstrahlung:
set terminal png transparent size <SIZE> crop
set output '<OUT>.png'
set xdata time
set timefmt "%Y-%m-%d_%H:%M:%S"
set xlabel " "
set title 'Luftdruck und Sonneneinstrahlung'
set ytics
set y2tics
set grid
set ylabel "Luftdruck"
set y2label "Sonneneinstrahlung"
set yrange [900:1100]

#Wetterstation 3:Luftdruck1\x3a.*::$fld[2]*33.8638815789
#Wetterstation 3:Sonnenstrahlung\x3a.*::

plot "<IN>" using 1:2 axes x1y1 title 'Luftdruck' ls l0 lw 0.5 with points,\
     "<IN>" using 1:2 axes x1y2 title 'Licht' ls l2 lw 1 with fsteps



Ich hoffe, das hilft dem ein oder anderen weiter.