Auswertung Niederschlagsmengen bei Bresser 5in1

Begonnen von sigi0601, 08 Juni 2020, 17:25:24

Vorheriges Thema - Nächstes Thema

sigi0601

Hallo liebes Forum,

ich habe seit einiger Zeit FHEM auf einem Raspberry Pi mit mehreren Komponenten aus FHT-, FS20, Homematic und IT laufen.

Seit längerem habe ich versucht, mittels CUL, Signalduino usw. meine Bresser 5in1 Wetterstation einzubinden. Mittels einem DVB-T-Stick und rtl_433 ist mir das nun gelungen - worauf ich mangels tieferen Linux-Kenntnissen mächtig stolz bin  :)

Temperatur, Luftfeuchtigkeit und Wind-Werte sind kein Problem. Die Niederschlagsmenge beschäftigt mich aber nun schon mehrere Tage, ohne dass ich das gewünschte Ergebnis erreichen konnte.
Die Station übermittelt hier einen Wert zwischen 0 und 99,9 mm. Bei Regen erhöht sich dieser Wert entsprechend. Bei Erreichen von 99,9 wird der Wert auf 0 zurückgesetzt und zählt wieder von vorne.
Aufgefallen ist mir das beim Betrachten meines Plots, als die Regenmenge/Tag (delta-d) auf einmal nicht mehr vorhanden war. Jetzt versuche ich verzweifelt, mittels userReading einen fortlaufenden Zähler zu erzeugen, der beim Rücksetzen dann nicht mehr "genullt" wird. Leider komme ich nicht mehr weiter.
Könnt ihr mir bitte weiterhelfen?

Grüße, Sigi

Christoph Morrison

Hallo Sigi,

Zitat von: sigi0601 am 08 Juni 2020, 17:25:24
Die Station übermittelt hier einen Wert zwischen 0 und 99,9 mm. Bei Regen erhöht sich dieser Wert entsprechend. Bei Erreichen von 99,9 wird der Wert auf 0 zurückgesetzt und zählt wieder von vorne.
Aufgefallen ist mir das beim Betrachten meines Plots, als die Regenmenge/Tag (delta-d) auf einmal nicht mehr vorhanden war. Jetzt versuche ich verzweifelt, mittels userReading einen fortlaufenden Zähler zu erzeugen, der beim Rücksetzen dann nicht mehr "genullt" wird. Leider komme ich nicht mehr weiter.
Könnt ihr mir bitte weiterhelfen?

Erstmal super, dass du das mit dem DVB-T-Stick hinbekommen hast. Was hast du denn bzgl. des userRedings schon versucht? Poste mal deine Konfiguration (# oben in der Leiste macht dir Code-Tags, dann wird der kopierte Text als Quellcode formatiert).

sigi0601

Hallo,

so sieht meine aktuelle Konfiguration aus:

Internals:
   CID        rtl_433_8195ffff
   DEF        rtl_433_8195ffff
   DEVICETOPIC Wetterstation
   FUUID      5edbdeff-f33f-fcc8-f1e1-d291a9c7a759c8d6
   IODev      mqtt2
   LASTInputDev mqtt2
   MSGCNT     35741
   NAME       Wetterstation
   NR         114
   STATE      14.9 °C | 60 % | 0.0 km/h
   TYPE       MQTT2_DEVICE
   mqtt2_MSGCNT 35741
   mqtt2_TIME 2020-06-08 19:43:32
   OLDREADINGS:
   READINGS:
     2020-06-08 19:43:31   Bresser-5in1_125_battery_ok 1
     2020-06-08 19:43:31   Bresser-5in1_125_humidity 60
     2020-06-08 19:43:31   Bresser-5in1_125_id 125
     2020-06-08 19:43:32   Bresser-5in1_125_mic CHECKSUM
     2020-06-08 19:43:32   Bresser-5in1_125_rain_mm 2.0
     2020-06-08 19:43:31   Bresser-5in1_125_temperature_C 14.9
     2020-06-08 19:43:31   Bresser-5in1_125_time 2020-06-08 19:43:31
     2020-06-08 19:43:32   Bresser-5in1_125_wind_avg_m_s 0
     2020-06-08 19:43:32   Bresser-5in1_125_wind_dir_deg 67.5
     2020-06-08 19:43:32   Bresser-5in1_125_wind_max_m_s 0
     2020-06-08 19:43:31   battery_ok      1
     2020-06-08 19:43:31   humidity        60
     2020-06-08 19:43:31   id              125
     2020-06-08 19:43:31   mic             CHECKSUM
     2020-06-08 19:43:31   model           Bresser-5in1
     2020-06-08 19:43:31   rain_mm         2.0
     2020-06-08 19:43:31   temperature_C   14.9
     2020-06-08 19:43:31   time            2020-06-08 19:43:31
     2020-06-08 19:43:32   wind_avg_km_h   0.0
     2020-06-08 19:43:31   wind_avg_m_s    0
     2020-06-08 19:43:31   wind_dir_deg    67.5
     2020-06-08 19:43:32   wind_max_km_h   0.0
     2020-06-08 19:43:31   wind_max_m_s    0
Attributes:
   IODev      mqtt2
   autocreate 0
   readingList rtl_433_8195ffff:rtl_433/fhem/events:.* { json2nameValue($EVENT) }
rtl_433_8195ffff:rtl_433/fhem/devices/Bresser-5in1/125/time:.* Bresser-5in1_125_time
rtl_433_8195ffff:rtl_433/fhem/devices/Bresser-5in1/125/id:.* Bresser-5in1_125_id
rtl_433_8195ffff:rtl_433/fhem/devices/Bresser-5in1/125/battery_ok:.* Bresser-5in1_125_battery_ok
rtl_433_8195ffff:rtl_433/fhem/devices/Bresser-5in1/125/temperature_C:.* Bresser-5in1_125_temperature_C
rtl_433_8195ffff:rtl_433/fhem/devices/Bresser-5in1/125/humidity:.* Bresser-5in1_125_humidity
rtl_433_8195ffff:rtl_433/fhem/devices/Bresser-5in1/125/wind_max_m_s:.* Bresser-5in1_125_wind_max_m_s
rtl_433_8195ffff:rtl_433/fhem/devices/Bresser-5in1/125/wind_avg_m_s:.* Bresser-5in1_125_wind_avg_m_s
rtl_433_8195ffff:rtl_433/fhem/devices/Bresser-5in1/125/wind_dir_deg:.* Bresser-5in1_125_wind_dir_deg
rtl_433_8195ffff:rtl_433/fhem/devices/Bresser-5in1/125/rain_mm:.* Bresser-5in1_125_rain_mm
rtl_433_8195ffff:rtl_433/fhem/devices/Bresser-5in1/125/mic:.* Bresser-5in1_125_mic

   room       4 Außenbereich
   stateFormat temperature_C °C | humidity % | wind_avg_km_h km/h
   userReadings wind_avg_km_h {sprintf("%.1f",ReadingsVal("$name","wind_avg_m_s","???")*3.6)},
wind_max_km_h {sprintf("%.1f",ReadingsVal("$name","wind_max_m_s","???")*3.6)},


Ich habe versucht, ein userReading "rain_total" anzulegen, welches den aktuellen Wert von "rain_mm" hinzu addiert. Allerdings macht er das mit dem aktuellen Wert dann bei jedem Event. Ich weiß nicht, wie ich das anpacken könnte, um nur eine Änderung von "rain_mm" zu addieren.

Christoph Morrison

Zitat von: sigi0601 am 08 Juni 2020, 19:52:22
Ich habe versucht, ein userReading "rain_total" anzulegen, welches den aktuellen Wert von "rain_mm" hinzu addiert. Allerdings macht er das mit dem aktuellen Wert dann bei jedem Event. Ich weiß nicht, wie ich das anpacken könnte, um nur eine Änderung von "rain_mm" zu addieren.

Du kannst ein Reading auslesen und es direkt neu schreiben. Schau dir mal folgende Beispieldefinition an:

defmod general.test.dummy dummy
attr general.test.dummy userReadings rainTotal:rainNow:.+ { ReadingsVal($name, 'rainTotal', 0) + ReadingsVal($name, 'rainNow', 0);; },\
rainMono:rainNow:.+ monotonic {ReadingsVal($name, 'rainNow', 0);;},


Ich habe zwei Methoden eingebaut um dir zu zeigen, dass a) man ein Reading lesen und wieder schreiben kann und b) in diesem Fall ein monoton ansteigender Zähler nicht funktioniert. Am besten kopierst du dir diese Definition in dein FHEM und führst dann folgende Befehle aus (jeweils einzeln oben in die Zeile kopieren und abschicken):


setreading general.test.dummy rainNow 4


Ergebnis:

rainMono = 4
rainTotal = 4



setreading general.test.dummy rainNow 3


Ergebnis:

rainMono = 4 # montonic funktioniert hier nicht, da 3 kleiner als 4 ist → kein Update auf das Reading
rainTotal = 7



Wzut

Zitat von: sigi0601 am 08 Juni 2020, 19:52:22
Allerdings macht er das mit dem aktuellen Wert dann bei jedem Event. Ich weiß nicht, wie ich das anpacken könnte
Leider ist dein list unvollständig, aber man sieht schon das du deine userReadings ohne Trigger anlegest und vermutlich gibt es auch kein event-on-change-reading .*
, oder ? IMHO würde das dein Problem aus dem Stand lösen.
Maintainer der Module: MAX, MPD, UbiquitiMP, UbiquitiOut, SIP, BEOK, readingsWatcher

sigi0601

Hallo,

dank eurer Hilfe habe ich es nun geschafft. Das Attribut mit "monotonic" ist die Lösung. Getriggert durch eine Änderung in "rain_mm" wird die Differenz zum alten Wert in mein userReading "rain_mm_total" aufaddiert. Hab´s dafür gerade nochmals künstlich regnen lassen  ;)

rain_mm_total:rain_mm:.* monotonic {ReadingsVal($name, 'rain_mm', 0);},

Grüße, Sigi

Christoph Morrison

Zitat von: sigi0601 am 09 Juni 2020, 20:30:20
Hallo,

dank eurer Hilfe habe ich es nun geschafft. Das Attribut mit "monotonic" ist die Lösung. Getriggert durch eine Änderung in "rain_mm" wird die Differenz zum alten Wert in mein userReading "rain_mm_total" aufaddiert. Hab´s dafür gerade nochmals künstlich regnen lassen  ;)

rain_mm_total:rain_mm:.* monotonic {ReadingsVal($name, 'rain_mm', 0);},

Nein, lies mein Posting noch mal. In deinem Fall funktioniert monotonic nur so lange, bis rain_mm_total größer als rain_mm wird und dann wir nichts mehr addiert.

sigi0601

Hmm - ich hatte das getestet und "rain_mm_total" auf 50 gesetzt, während "rain_mm" den Wert 8.4 hatte.
Nachdem ich es regnen lies, stieg "rain:mm" auf 8.8 und "rain_mm_total" auf 50.4.

Also so würde es passen - oder verstehe ich jetzt was falsch?

Wzut

ich habe zwar noch nie monotonic benutzt aber laut command.ref
Zitatmonotonic: wenn die Differenz zw. dem aktuellen und dem vorherigen Wert positiv ist wird diese Differenz zum Reading addiert. Damit lässt sich von einem Zähler der bei Stromverlust zurückgesetzt wird ein monoton wachsender Zähler ableiten.
sollte es doch keinen Unterschied machen ob der Zähler nun wegen eines Stromausfalls wieder bei 0 beginnt oder wegen internen Überlauf.
D.h. das Zauberwort ist hier wohl "dem vorherigen Wert positiv" , alt =50 , neu =0 -> keine Zählung. Neu = 2 alt = 0 -> es wird weiter gezählt.
Maintainer der Module: MAX, MPD, UbiquitiMP, UbiquitiOut, SIP, BEOK, readingsWatcher

Christoph Morrison

Zitat von: sigi0601 am 09 Juni 2020, 20:46:51
Hmm - ich hatte das getestet und "rain_mm_total" auf 50 gesetzt, während "rain_mm" den Wert 8.4 hatte.
Nachdem ich es regnen lies, stieg "rain:mm" auf 8.8 und "rain_mm_total" auf 50.4.

Also so würde es passen - oder verstehe ich jetzt was falsch?

Ich muss mir dazu mal eine Testsuite schreiben um das zu verifizieren. Wenn ich deine Methode benutze, sollte monotonic eigentlich nicht weiterzählen denn die Differenz ist ja nicht positiv. Ich würde an deiner Stelle erstmal mit meiner rainTotal-Version weitergehen, die ist ja transparent in dem was sie tut.