Neues Modul für die WS980WiFi Wetterstation

Begonnen von choenig, 15 Februar 2019, 19:16:29

Vorheriges Thema - Nächstes Thema

choenig

Hallo zusammen,

Das Modul ist seit dem 07.04.2019 ins svn eingecheckt.

mit Unterstützung aus dem ELV-Forum(https://www.elv.de/topic/protokolldefinition-zum-datenaustausch-ws980-zum-pc.html) ist es mir gelungen, die o.a. Wetterstation direkt auszulesen, ohne über wunderground oder ähnliche Services zu gehen.

Unterstützt werden zur Zeit folgende Daten:

       
  • Aktuelles Wetter
  • heutiges Maxium
  • heutiges Minimum
  • absolutes Maximum
  • absolutes Minimum
  • Firmware-Version

Ich freue mich auch über Verbesserungsvorschläge, insbesondere über die Namen der Readings, falls es fhem-weit etwas standardisierteres gibt.

Hier der Ausschnitt aus der commandref:


WS980 - Requests weather data locally from WS980WiFi weather stations

Define

define <name> WS980 [IP] [INTERVAL]

[IP] Optional: The IP of the WS980WiFi. If no IP is given, the station is auto-discovered.
[INTERVAL] Optional: The interval in seconds to request updates, default: 30 seconds.

Example:

define ws980wifi WS980 192.168.2.177 60

This statement creates an WS980 instance with the name ws980wifi with the IP 192.168.2.177.
With an interval of 60 seconds the weather information are requested.

Readings
temperatureInside [°C]
The IN-temperature at the display.
temperature [°C]
The temperature measured by the outdoor probe.
dewPoint [°C]
The dew-point calculated by the weather station.
windChill [°C]
The wind-chill calculated by the weather station.
heatIndex [°C]
The heat-index calculated by the weather station.
humidityInside [%]
The IN-humidity at the display.
humidity [%]
The humidity measured by the outdoor probe.
pressureAbs [hPa]
The absolute pressure measured by the outdoor probe.
pressureRel [hPa]
The relative pressure measured by the outdoor probe. This only differs from pressureAbs if you have an offset configured in your WS980.
pressureRel_calculated [hPa]
The relative pressure calculated using the QFF forumula based on temperature, pressureAbs, altitude and humidity.
windDirection [°]
The wind-direction measured by the outdoor probe.
wind [m/s]
The wind-seed measured by the outdoor probe.
windGusts [m/s]
The speed of wind-gusts measured by the outdoor probe.
rainRate [mm]
The current rain-rate measured by the outdoor probe.
rainPerDay [mm]
The rain-rate per day measured by the outdoor probe.
rainPerWeek [mm]
The rain-rate per week measured by the outdoor probe.
rainPerMonth [mm]
The rain-rate per month measured by the outdoor probe.
rainPerYear [mm]
The rain-rate per year measured by the outdoor probe.
rainTotal [mm]
The total rain-rate measured by the outdoor probe.
rain24h [mm]
The amount of rain in the last 24h. This value is calculated from rainTotal and is updated once per hour. In the first 24h, the amunt is displayed in "()" and shows the count of hours recorded already.
brightness [lux]
The brightness measured by the outdoor probe.
uv [uW/m²]
The raw UV-values measured by the outdoor probe.
uvIndex [0-15]
The UV-Index calculated by the weather station.

Set
update
manually update current weather data

Attributes
attr <name> altitude <height>
Specifies the mean sea level in meters. Default is 0. Used to calculate the pressureRel_calculated-reading. If unset, the altitude from global is used.
attr <name> connection <Keep-Alive|Close>
Keep-Alive: The connection to the WS980 is kept open as long as possible. Reconnect is only done if necessary. Keep-Alive is default and a good setting in most cases.
Close: The connection is opened on-the-fly and closed directly after doing requests. Close should only be used if you have multiple clients connection to your WS980 which might cause frequent read-timeouts. ConnectionState will display disconnected most of the time, this is OK!
attr <name> events <Configuration>|<Configuration>|...
Allows to configure custom events based on the readings of this instance.
<Configuration> must have the form: NAME:READING<LIMIT,HYSTERESIS or NAME:READING>LIMIT,HYSTERESIS.
NAME: The name used for the reading and the event. To reduce the possibility of collisions with existing readings, the Name of the reading will always be prefixed with 'is'.
READING:The name of the reading which will be compared to LIMIT to set the resulting event to 0 or 1.
< or >: For '<' the reading-value must be less than the LIMIT to result in 1, for '>' the reading-value must be above LIMIT to result in 1.
LIMIT: The value which will be compared to the READINGs current value.
HYSTERESIS: The hysteresis-value is used to reduce fast flipping of 0 and 1.
Configurations can be separated by either "|" or newline. All whitespace will be removed when parsing events.
Examples:
attr <name> events dusk:brightness<30,20
A new reading isDusk will be autogenerated with possible values 0 or 1. As soon as the brightness drops below 30lux, isDusk will switch to 1. The hystereses value of 20 means, that isDusk will switch back to 0 only after either the brightness has reached 50lux (30+20) or the brightness dropped below 10lux (30-20) and then rises above 30lux again.
attr <name> brightSunlight:brightness>80000,5000
A new reading isBrightSunlight will be autogenerated with possible values 0 or 1. As soon as the brightness rises above 80000lux, isBrightSunlight will switch to 1. The hystereses value of 5000 means, that isBrightSunlight will switch back to 0 only after either the brightness has dropped below 75000lux or the brightness was above 85000lux and then drops below 80000lux again.
You can concatenate as many Configurations with '|' as you like. For example:
attr <name> dusk:brightness<30,20|brightSunlight:brightness>80000,5000

attr <name> requests current todayMax ...
A comma or space separated list of values to requests. If empty, all known values are requested.
Valid values: firmware, current, todayMax, todayMin, historyMax, historyMin.
attr <name> showRawBuffer 1
used for development: show raw data received from the WS980WiFi
attr <name> unit_temperature <unit>
set the unit used for temperature-readings. Default: °C
attr <name> unit_pressure <unit>
set the unit used for pressure-readings. Default: hPa
attr <name> unit_wind <unit>
set the unit used for wind-readings. Default: m/s
attr <name> unit_rain <unit>
set the unit used for rain-readings. Default: mm
attr <name> unit_light <unit>
set the unit used for brightness-readings. Default: lux
attr <name> disable 1
disables this WS980-instance


Ausblick:
Vermutlich ist folgendes noch möglich:

  • Auto-discovery der Wetterstation, sodass beim Einrichten keine IP angegeben werden muss
  • Abrufen der historischen Wetterdaten. Die Station kann ca. 3500 Datenpunkte speichern
  • Berechnen der Niederschlagsmenge der letzen 24h

Updates:

  • 0.6.0: Fix coding error (its 'next' in perl, not 'continue' ;) )
  • 0.7.0: change to FHEM ReadFn and WriteFn to enhance blocking networks and some other internal changes
  • 0.8.0: keep connection alive, if possible
  • 0.9.0: make things more stable, calculate relative pressure (pressureRel_calculated)
  • 0.11.0:

    • use "altitude" from global if defined
    • fix nasty bug where each request was sent twice
    • don`t try to send msg if connect failed
    • reconnect if request did not receive reply
  • 0.12.0:

    • fix blocking calls to sysread() - set SO_RCVTIMEO on socket to fix blocking-problems
    • implement autodiscovery - you can now leave the IP out
    • change default interval to 30 secs
  • 0.13.0:

    • show ConnectionState as internal instead of using »state«
    • remove decimals from »humidity« and »uv«
    • show »T: 12.5°C H: 70% W: 2.0m/s P: 1011.3hPa« in »state«
    • new attribute: connection Keep-Alive|Close to be able to connect to WS980 on-the-fly
    • increase connect timeout to 250msecs and display connect error in lastError
    • commandref: document altitude, pressureRel_calculated and hide unsupported entries
    • implement unit conversion for temperature, pressure, wind, rain and light
  • 0.14.0:

    • calculate rain24h based on rainTotal (see "rain24h"-reading)
    • implement custom "events" (see "events"-attribute)
    • support attribute-specific help in FHEMWEB
    • internal changes regarding the use of const variables
    • internal changes to possibly support more than one WS980

  • 1.0.0:

    • No changes to 0.14.0.




LG
Christian

CoolTux

Hallo,

Hast Du mal geschaut wie lange FHEM blockiert wenn die Station nicht erreichbar ist? Ich kann mir vorstellen das auch im normalen Betrieb merkbar ein blockieren ist. Hier wäre empfehlenswert mit in FHEM vorhandenen Funktionen zu arbeiten.
Im Grunde arbeitet Dein Modul wie das Modul 82_LGTV_WebOS. Wenn Du magst kannst Du Dir da anschauen wie ein TCP Clientsocket aufgebaut wird und die File Descriptor Infos ins select geschickt werden. Es wird nun nicht blockierend geschaut ob Daten am Socket anliegen, wenn ja wird automatisch die ReadFn aufgerufen und die Daten können so abgeholt werden.
Kannst ja mal schauen und wenn Du fragen hast helfe ich sehr gerne.


Grüße
Du musst nicht wissen wie es geht! Du musst nur wissen wo es steht, wie es geht.
Support me to buy new test hardware for development: https://www.paypal.com/paypalme/MOldenburg
My FHEM Git: https://git.cooltux.net/FHEM/
Das TuxNet Wiki:
https://www.cooltux.net

choenig

Hi,

vielen Dank für Deine Aufmerksamkeit und die Hinweise.

Ich hatte ursprünglich vor, FHEM-Funktionalität für das Networking zu verwenden um das interne select zu nutzen, hab' aber dann nur die HTTP-Funktionen gefunden. 82_LGTV_WebOS werde ich mir angucken!

Seit ich den Read-Timeout auf 500msecs gestellt habe, habe ich keinerlei Probleme mehr gehabt, aber 500 msecs sind auch nicht optimal. Zum Glück antwortet die Station immer sehr schnell :)


$socket->setsockopt(SOL_SOCKET, SO_RCVTIMEO, pack('l!l!', 0, 500*1000)) or die "setsockopt: $!";


Und da fällt mir jetzt auf, dass das »or die "setsockopt: $!"« nicht optimal ist :).

LG
Christian

CoolTux


$socket->setsockopt(SOL_SOCKET, SO_RCVTIMEO, pack('l!l!', 0, 500*1000)) or die "setsockopt: $!";


Und da fällt mir jetzt auf, dass das »or die "setsockopt: $!"« nicht optimal ist :).

LG
Christian
[/quote]

Siehst so weit war ich noch gar nicht.
or die darf in der Tat nie in einem FHEM Modul vorhanden sein, da es ansonsten das ganze FHEM in den Tot reißt  :D

Wie gesagt wenn Du Fragen hast einfach fragen.


Grüße
Du musst nicht wissen wie es geht! Du musst nur wissen wo es steht, wie es geht.
Support me to buy new test hardware for development: https://www.paypal.com/paypalme/MOldenburg
My FHEM Git: https://git.cooltux.net/FHEM/
Das TuxNet Wiki:
https://www.cooltux.net

choenig

Hi,

ich habe gerade eine aktualisierte Version an den 1. Post gehängt.

Ich nutze jetzt, wie von Marko vorgeschlagen, die FHEM-Funktionen zum Lesen und Schreiben in Sockets. Ansonsten habe ich noch diverse Interna optimiert. Z.b. hab' ich auch das unsägliche 'die' entfernt, welches vom copy'n'paste übrig geblieben war ;).

@Marko: Ich würde mich über weiteres Feedback von Dir freuen!

Ansonsten gilt: Diese Version ist alpha, ich habe sie erst seit ein paar Minuten im Einsatz, aber ... freiwillige vor :)

LG
Christian

CoolTux

Hallo Christian,

Ich schaue es mir sehr gerne morgen Früh an.


Grüße
Du musst nicht wissen wie es geht! Du musst nur wissen wo es steht, wie es geht.
Support me to buy new test hardware for development: https://www.paypal.com/paypalme/MOldenburg
My FHEM Git: https://git.cooltux.net/FHEM/
Das TuxNet Wiki:
https://www.cooltux.net

choenig


Waldmensch

Aufgrund des Threads im ELV Forum und Deiner Arbeit, habe ich heute die Station bestellt. Danke für Deine Arbeit, spätestens ab nächstes WE kann ich mit testen. Bisher habe ich meine Gartenbewässerung über die WU Daten einer Station in der Nachbarschaft gesteuert. Das geht ja nicht mehr.

Ich habe auch gleich einen Feature Request: Kannst Du über die Readings den Regenwert der letzten 24h darstellen? Also nicht "gestern" sondern die letzten 24 Stundenwerte in einen Ringbuffer schreiben und dessen Gesamtsumme als Reading ausgeben.

Grüße

CoolTux

Sieht gut aus.
Habe jetzt nur kurz schauen können. Setzt Du irgendwo das Reading state? Habe nichts gefunden. Das solltest Du machen damit im Webfrontend auch was zu sehen ist ohne das die User stateFormat setzen.

Dann verstehe ich nicht ganz warum Du den Socket in WS980_updateValues schließt und dann gleich wieder öffnest? Das ist nicht shclimm, stört nicht aber wie ich finde unnötig.
Ich würde den Socket nur schließen wenn in WS980_ReadFn Daten der Länge Null ankommen. Was Du ja schon so ähnlich machst
Hier noch eine kleine Anpassung. Ist bei mir aktuell erst die letzten Tage aufgekommen, hatte ich vorher auch nicht.

if (!defined($len) or !$len or $len < 1 ) {
WS980_Close($hash);
return;
}


Eigentlich ist ja !$len das selbe wie $len==0  oder $len < 1, aber irgendwie hat das bei mir nie geklappt. Frag den Fuchs wieso.

Ansonsten sehr gute Arbeit für ein erstes Modul. Wünschte ich hätte damals so gute Arbeit gemacht bei meinen ersten Versuchen  ;D



Grüße
Du musst nicht wissen wie es geht! Du musst nur wissen wo es steht, wie es geht.
Support me to buy new test hardware for development: https://www.paypal.com/paypalme/MOldenburg
My FHEM Git: https://git.cooltux.net/FHEM/
Das TuxNet Wiki:
https://www.cooltux.net

doesel

@choenig
Hallo Christian,
habe immer brav die neuen Modul-Versionen getestet. Hatte bisher keinerlei Probleme oder Lögeinträge. Das einzige was mir auffiel, dass pressureRel und pressureAbs identisch sind, also keinen Bezug auf die Höhe über NN haben.
Gruß Doesel
(FHEM auf Cubietruck mit Igor-Image, 64GB SSD), seit März 19 FHEM auf NUC im Proxmox-Container, 240GB SSD, div. Homematic, Max Fensterkontakte, Onewire über Firmata und FHEM2FHEM auf Raspberrys, MySensors, Jeelink-Clone mit GSD-Modul, CUL, SDM220Modbus, Logo!8, WS980WiFi

Waldmensch

Ich habe meine Station noch nicht, aber hast Du in der Station Deine "Höhe über Meeresspiegel" konfiguriert? Aufgrund Dieser wird ja der relative Luftdruck berechnet. Wenn der relative Luftdruck von der Station abrufbar ist, sollte diese ihn auch berechnen.
Lass Dir mal die beiden Werte auf dem Display anzeigen.

choenig

Hallo zusammen,

keine Angst, ich bin nicht untergetaucht, hab' nur gerade keine Zeit.
Ich hoffe, dass ich heute Abend wieder was Zeit habe :)

LG
Christian

choenig

Hi,

Zitat von: Waldmensch am 18 Februar 2019, 10:23:32
Aufgrund des Threads im ELV Forum und Deiner Arbeit, habe ich heute die Station bestellt. Danke für Deine Arbeit, spätestens ab nächstes WE kann ich mit testen. Bisher habe ich meine Gartenbewässerung über die WU Daten einer Station in der Nachbarschaft gesteuert. Das geht ja nicht mehr.

Ich habe auch gleich einen Feature Request: Kannst Du über die Readings den Regenwert der letzten 24h darstellen? Also nicht "gestern" sondern die letzten 24 Stundenwerte in einen Ringbuffer schreiben und dessen Gesamtsumme als Reading ausgeben.

Ich habe noch keine Erfahrung mit den Regen-Messwerten der Station, da es noch so wenig geregnet hat während ich getestet hab'. Denke aber, das sollte kein großes Problem sein

Zitat von: CoolTux am 18 Februar 2019, 11:33:13
Sieht gut aus.

:D

Zitat von: CoolTux am 18 Februar 2019, 11:33:13
Habe jetzt nur kurz schauen können. Setzt Du irgendwo das Reading state? Habe nichts gefunden. Das solltest Du machen damit im Webfrontend auch was zu sehen ist ohne das die User stateFormat setzen.

Nein, mache ich noch nicht, ist aber auf der ToDo-Liste. Ich war bisher so auf die Kommunikation mit der Station fokusiert, dass das auf der Strecke blieb.

Zitat von: CoolTux am 18 Februar 2019, 11:33:13
Dann verstehe ich nicht ganz warum Du den Socket in WS980_updateValues schließt und dann gleich wieder öffnest? Das ist nicht schlimm, stört nicht aber wie ich finde unnötig.

Ich hab' ja die Kommunikation bislang immer on the fly aufgebaut, das wollte ich nach dem Umstieg auf ReadFN auch erstmal so lassen. Sobald ich sehe, dass es funktioniert, werde ich mal ausprobieren, die Verbindung aufrecht zu halten.

Zitat von: CoolTux am 18 Februar 2019, 11:33:13
Hier noch eine kleine Anpassung. Ist bei mir aktuell erst die letzten Tage aufgekommen, hatte ich vorher auch nicht.

if (!defined($len) or !$len or $len < 1 ) {
WS980_Close($hash);
return;
}


Eigentlich ist ja !$len das selbe wie $len==0  oder $len < 1, aber irgendwie hat das bei mir nie geklappt. Frag den Fuchs wieso.

Werde ich gerne übernehmen, über solche komischen Probleme muss ich nicht selber stolpern :)

Zitat von: CoolTux am 18 Februar 2019, 11:33:13
Ansonsten sehr gute Arbeit für ein erstes Modul. Wünschte ich hätte damals so gute Arbeit gemacht bei meinen ersten Versuchen  ;D

Hehe, vielen Dank!

Programmieren ist ja mein täglich Brot, allerdings nicht in Perl :-\, damit tu ich mich schon sehr schwer, teilweise.

Vielen Dank für Deine Unterstützung!

LG
Christian

Waldmensch

#13
Zitat von: doesel am 19 Februar 2019, 05:37:46
Das einzige was mir auffiel, dass pressureRel und pressureAbs identisch sind, also keinen Bezug auf die Höhe über NN haben.
Gruß Doesel

Meine Station ist da, montiert, im Netz und bei wunderground eingebucht.  :) Die Anleitung ist echt fürn Allerwertesten  ::)

Zum relativen Luftdruck - das muss über den Offset eingestellt werden. Hier kannst Du anhand des angezeigten absoluten Luftdruckes und Deiner Höhe den Relativen errechnen. Relativ - Absolut = Offset. https://rechneronline.de/barometer/  Einstellung wie folgt:
- SET für 3 Sekunden
- Pfeil links bis "CALIBRATION SETTING"
- Pfeil rechts bis "REL BARO OFFSET"
- Pfeil hoch/runter zum Einstellen des Wertes
- ca 30 Sekunden warten, Normalbildschirm kommt alleine zurück

Um den Relativen statt dem Absoluten im Standardbildschirm anzuzeigen:
- Pfeil links/rechts bis der Markierungspfeil im Luftdruck Feld ist
- Mit SET durchschalten bis REL aktiv ist

Wunderground nutzt den relativen Luftdruck zur Anzeige (macht ja auch Sinn)

Edit: Eventuell macht es Sinn, den relativen Luftdruck im Plugin auszurechnen, da die Temperatur ja noch mit reinspielt. Die Wetterstation kann es ja leider nicht ausrechnen und wird es durch den starren Offset nie so genau anzeigen. Andererseits ist der Unterschied bei +/- 5° nur 0,1hPa  ;)

doesel

Danke für die Info. Eine Berechnung hatte ich schon im Netz gefunden, lediglich die Einstellung über Offset war mir nicht klar. Leider unterscheidet sich der dort errechnete Wert zu meinem in der Nähe befindlichen BME280 um ca. 2 hPa. Die absoluten Werte vom BME280 und WS980 sind beinahe identisch. Werde mal beobachten, ob sich da im Laufe der Zeit was ändert.
(FHEM auf Cubietruck mit Igor-Image, 64GB SSD), seit März 19 FHEM auf NUC im Proxmox-Container, 240GB SSD, div. Homematic, Max Fensterkontakte, Onewire über Firmata und FHEM2FHEM auf Raspberrys, MySensors, Jeelink-Clone mit GSD-Modul, CUL, SDM220Modbus, Logo!8, WS980WiFi