UserReading wird mehrfach getriggert mit DOIF

Begonnen von blue, 22 Oktober 2023, 19:54:50

Vorheriges Thema - Nächstes Thema

blue

Hallo,

ich möchte in einem DOIF ein userreading setzen, um damit den gleiten Mittelwert einer Wirkleistung zu berechnen (DOIF wird alle 5s mit der Berechnung der Wirkleistung aufgerufen). Die Funktion für den gleitenden Mittelwert habe ich von https://wiki.fhem.de/wiki/Gleitende_Mittelwerte_berechnen_und_loggen übernommen und das funktioniert auch grundsätzlich.

Ich habe festgestellt, dass die Mittelwertberechnung im DOIF nicht sauber läuft, da die Funktion movingAverage bzw. das userReading 3x getriggert wird. Damit klappt natürlich die Mittelwertberechnung nicht. Wenn ich das userReading mit MovingAverage-Funktion in einem ReadingProxy mit dem gleichgen Reading "übersetze", klappt es einwandfrei. Insofern gehe ich davon aus, dass das Event grundsätzlich nur einmal ausgelöst wird. Allerdings suche ich noch meinen Fehler in der Definition des DOIF, zumal mir damit das unschöne ReadingProxy sparen könnte.

Über Hilfe wäre ich dankbar, zumal ich gerade leider den Fehler einfach nicht finde.

Hier meine Definition (die wirkleistungOld + wirkleistungNew waren Test - aktuell nicht relevant):

define DF_ez_Haus_AktVerbrauch DOIF ##\
([+5]) (\
  set DF_ez_Haus_AktVerbrauch wirkleistung {([SMA_SunnyBoy_Total:strings_pdc:d] - [ez_SW_Zweirichtung_Z1:wirkleistung_lieferung-Wh:d] + [ez_SW_Zweirichtung_Z1:wirkleistung_bezug-Wh:d] + [BYDBox:BatteryPower:d])}\
)
attr DF_ez_Haus_AktVerbrauch alias Wirkleistung Haus
attr DF_ez_Haus_AktVerbrauch devStateStyle style="text-align:left"
attr DF_ez_Haus_AktVerbrauch do always
attr DF_ez_Haus_AktVerbrauch event-on-change-reading wirkleistung,wirkleistung.av
attr DF_ez_Haus_AktVerbrauch group Energiebilanz
attr DF_ez_Haus_AktVerbrauch readingList wirkleistung wirkleistungOld wirkleistungNew
attr DF_ez_Haus_AktVerbrauch room Energie
attr DF_ez_Haus_AktVerbrauch setList wirkleistung wirkleistungOld wirkleistungNew
attr DF_ez_Haus_AktVerbrauch sortby 014
attr DF_ez_Haus_AktVerbrauch userReadings wirkleistung.av {sprintf("%.1f",movingAverage("DF_ez_Haus_AktVerbrauch","wirkleistung",120))}
attr DF_ez_Haus_AktVerbrauch verbose 4
#   DEF        ##
#([+5]) (
#  set DF_ez_Haus_AktVerbrauch wirkleistung {([SMA_SunnyBoy_Total:strings_pdc:d] - [ez_SW_Zweirichtung_Z1:wirkleistung_lieferung-Wh:d] + [ez_SW_Zweirichtung_Z1:wirkleistung_bezug-Wh:d] + [BYDBox:BatteryPower:d])}
#)
#   FUUID      652d9498-f33f-aa87-f1dc-7ba3a2bc736a2b0e
#   MODEL      FHEM
#   NAME       DF_ez_Haus_AktVerbrauch
#   NOTIFYDEV  global
#   NR         565
#   NTFY_ORDER 50-DF_ez_Haus_AktVerbrauch
#   STATE      cmd_1
#   TYPE       DOIF
#   VERSION    27487 2023-04-26 08:04:04
#   eventCount 687
#   Helper:
#     DBLOG:
#       wirkleistung.av:
#         logdb:
#           TIME       1697996960.15225
#           VALUE      663.7
#   READINGS:
#     2023-10-22 19:49:52   cmd             1
#     2023-10-22 19:49:52   cmd_event       timer_1
#     2023-10-22 19:49:52   cmd_nr          1
#     2023-10-22 19:23:52   mode            enabled
#     2023-10-22 19:49:52   state           cmd_1
#     2023-10-22 19:49:52   timer_01_c01    22.10.2023 19:49:57
#     2023-10-22 19:49:52   wirkleistung    633.8
#     2023-10-22 19:49:52   wirkleistung.av 650.7
#     2023-10-22 19:23:50   wirkleistungNew 571.86
#     2023-10-22 19:23:50   wirkleistungOld 571.86
#     2023-10-22 19:21:08   wirkleistungmovingAverage 0
#   Regex:
#     accu:
#     bar:
#     barAvg:
#     collect:
#   attr:
#     cmdState:
#     waitdel:
#   condition:
#     0          ::DOIF_time_once($hash,0,$wday)
#   days:
#   do:
#     0:
#       0             set DF_ez_Haus_AktVerbrauch wirkleistung {([SMA_SunnyBoy_Total:strings_pdc:d] - [ez_SW_Zweirichtung_Z1:wirkleistung_lieferung-Wh:d] + [ez_SW_Zweirichtung_Z1:wirkleistung_bezug-Wh:d] + [BYDBox:BatteryPower:d])}
#     1:
#   helper:
#     NOTIFYDEV  global
#     event      timer_1
#     globalinit 1
#     last_timer 1
#     sleeptimer -1
#     timerdev   
#     timerevent timer_1
#     triggerDev
#     DOIF_eventa:
#       cmd_nr: 1
#       cmd: 1
#       cmd_event: timer_1
#       cmd_1
#     DOIF_eventas:
#       cmd_nr: 1
#       cmd: 1
#       cmd_event: timer_1
#       state: cmd_1
#     timerevents:
#       timer_1
#     timereventsState:
#       timer_1
#     triggerEvents:
#       timer_1
#     triggerEventsState:
#       timer_1
#   hmccu:
#   interval:
#   intervalfunc:
#   localtime:
#     0          1697996997
#   realtime:
#     0          19:49:57
#   time:
#     0          +5
#   timeCond:
#     0          0
#   timer:
#     0          0
#   timers:
#     0           0
#   triggertime:
#     1697996997:
#       localtime  1697996997
#       hash:
#   uiState:
#   uiTable:
#
setstate DF_ez_Haus_AktVerbrauch cmd_1
setstate DF_ez_Haus_AktVerbrauch 2023-10-22 19:49:52 cmd 1
setstate DF_ez_Haus_AktVerbrauch 2023-10-22 19:49:52 cmd_event timer_1
setstate DF_ez_Haus_AktVerbrauch 2023-10-22 19:49:52 cmd_nr 1
setstate DF_ez_Haus_AktVerbrauch 2023-10-22 19:23:52 mode enabled
setstate DF_ez_Haus_AktVerbrauch 2023-10-22 19:49:52 state cmd_1
setstate DF_ez_Haus_AktVerbrauch 2023-10-22 19:49:52 timer_01_c01 22.10.2023 19:49:57
setstate DF_ez_Haus_AktVerbrauch 2023-10-22 19:49:52 wirkleistung 633.8
setstate DF_ez_Haus_AktVerbrauch 2023-10-22 19:49:52 wirkleistung.av 650.7
setstate DF_ez_Haus_AktVerbrauch 2023-10-22 19:23:50 wirkleistungNew 571.86
setstate DF_ez_Haus_AktVerbrauch 2023-10-22 19:23:50 wirkleistungOld 571.86
setstate DF_ez_Haus_AktVerbrauch 2023-10-22 19:21:08 wirkleistungmovingAverage 0


Hier die Log-Ausgabe 3x zum identischen Zeitpunkt getriggert (gleicher Zeitstempel; 3 Durchläufe erkennt man gut an der Zeile mit "calculated over 25 values"):

2023.10.22 19:52:39 3: [DF_ez_Haus_AktVerbrauch moving average] Value = 629 Time = 2023-10-22 19:51:57
2023.10.22 19:52:39 3: [DF_ez_Haus_AktVerbrauch moving average] Value = 629 Time = 2023-10-22 19:51:57
2023.10.22 19:52:39 3: [DF_ez_Haus_AktVerbrauch moving average] Value = 629 Time = 2023-10-22 19:51:57
2023.10.22 19:52:39 3: [DF_ez_Haus_AktVerbrauch moving average] Value = 635 Time = 2023-10-22 19:52:02
2023.10.22 19:52:39 3: [DF_ez_Haus_AktVerbrauch moving average] Value = 635 Time = 2023-10-22 19:52:02
2023.10.22 19:52:39 3: [DF_ez_Haus_AktVerbrauch moving average] Value = 635 Time = 2023-10-22 19:52:02
2023.10.22 19:52:39 3: [DF_ez_Haus_AktVerbrauch moving average] Value = 645 Time = 2023-10-22 19:52:07
2023.10.22 19:52:39 3: [DF_ez_Haus_AktVerbrauch moving average] Value = 645 Time = 2023-10-22 19:52:07
2023.10.22 19:52:39 3: [DF_ez_Haus_AktVerbrauch moving average] Value = 645 Time = 2023-10-22 19:52:07
2023.10.22 19:52:39 3: [DF_ez_Haus_AktVerbrauch moving average] Value = 643 Time = 2023-10-22 19:52:12
2023.10.22 19:52:39 3: [DF_ez_Haus_AktVerbrauch moving average] Value = 643 Time = 2023-10-22 19:52:12
2023.10.22 19:52:39 3: [DF_ez_Haus_AktVerbrauch moving average] Value = 643 Time = 2023-10-22 19:52:12
2023.10.22 19:52:39 3: [DF_ez_Haus_AktVerbrauch moving average] Value = 631 Time = 2023-10-22 19:52:18
2023.10.22 19:52:39 3: [DF_ez_Haus_AktVerbrauch moving average] Value = 631 Time = 2023-10-22 19:52:18
2023.10.22 19:52:39 3: [DF_ez_Haus_AktVerbrauch moving average] Value = 631 Time = 2023-10-22 19:52:18
2023.10.22 19:52:39 3: [DF_ez_Haus_AktVerbrauch moving average] Value = 633 Time = 2023-10-22 19:52:24
2023.10.22 19:52:39 3: [DF_ez_Haus_AktVerbrauch moving average] Value = 633 Time = 2023-10-22 19:52:24
2023.10.22 19:52:39 3: [DF_ez_Haus_AktVerbrauch moving average] Value = 633 Time = 2023-10-22 19:52:24
2023.10.22 19:52:39 3: [DF_ez_Haus_AktVerbrauch moving average] Value = 633 Time = 2023-10-22 19:52:29
2023.10.22 19:52:39 3: [DF_ez_Haus_AktVerbrauch moving average] Value = 633 Time = 2023-10-22 19:52:29
2023.10.22 19:52:39 3: [DF_ez_Haus_AktVerbrauch moving average] Value = 633 Time = 2023-10-22 19:52:29
2023.10.22 19:52:39 3: [DF_ez_Haus_AktVerbrauch moving average] Value = 631 Time = 2023-10-22 19:52:34
2023.10.22 19:52:39 3: [DF_ez_Haus_AktVerbrauch moving average] Value = 631 Time = 2023-10-22 19:52:34
2023.10.22 19:52:39 3: [DF_ez_Haus_AktVerbrauch moving average] Value = 631 Time = 2023-10-22 19:52:34
2023.10.22 19:52:39 3: [DF_ez_Haus_AktVerbrauch moving average] Value = 631 Time = 2023-10-22 19:52:39
2023.10.22 19:52:39 3: [DF_ez_Haus_AktVerbrauch moving average] calculated over 25 values is 634.840
2023.10.22 19:52:39 3: [DF_ez_Haus_AktVerbrauch moving average] Value = 629 Time = 2023-10-22 19:51:57
2023.10.22 19:52:39 3: [DF_ez_Haus_AktVerbrauch moving average] Value = 629 Time = 2023-10-22 19:51:57
2023.10.22 19:52:39 3: [DF_ez_Haus_AktVerbrauch moving average] Value = 635 Time = 2023-10-22 19:52:02
2023.10.22 19:52:39 3: [DF_ez_Haus_AktVerbrauch moving average] Value = 635 Time = 2023-10-22 19:52:02
2023.10.22 19:52:39 3: [DF_ez_Haus_AktVerbrauch moving average] Value = 635 Time = 2023-10-22 19:52:02
2023.10.22 19:52:39 3: [DF_ez_Haus_AktVerbrauch moving average] Value = 645 Time = 2023-10-22 19:52:07
2023.10.22 19:52:39 3: [DF_ez_Haus_AktVerbrauch moving average] Value = 645 Time = 2023-10-22 19:52:07
2023.10.22 19:52:39 3: [DF_ez_Haus_AktVerbrauch moving average] Value = 645 Time = 2023-10-22 19:52:07
2023.10.22 19:52:39 3: [DF_ez_Haus_AktVerbrauch moving average] Value = 643 Time = 2023-10-22 19:52:12
2023.10.22 19:52:39 3: [DF_ez_Haus_AktVerbrauch moving average] Value = 643 Time = 2023-10-22 19:52:12
2023.10.22 19:52:39 3: [DF_ez_Haus_AktVerbrauch moving average] Value = 643 Time = 2023-10-22 19:52:12
2023.10.22 19:52:39 3: [DF_ez_Haus_AktVerbrauch moving average] Value = 631 Time = 2023-10-22 19:52:18
2023.10.22 19:52:39 3: [DF_ez_Haus_AktVerbrauch moving average] Value = 631 Time = 2023-10-22 19:52:18
2023.10.22 19:52:39 3: [DF_ez_Haus_AktVerbrauch moving average] Value = 631 Time = 2023-10-22 19:52:18
2023.10.22 19:52:39 3: [DF_ez_Haus_AktVerbrauch moving average] Value = 633 Time = 2023-10-22 19:52:24
2023.10.22 19:52:39 3: [DF_ez_Haus_AktVerbrauch moving average] Value = 633 Time = 2023-10-22 19:52:24
2023.10.22 19:52:39 3: [DF_ez_Haus_AktVerbrauch moving average] Value = 633 Time = 2023-10-22 19:52:24
2023.10.22 19:52:39 3: [DF_ez_Haus_AktVerbrauch moving average] Value = 633 Time = 2023-10-22 19:52:29
2023.10.22 19:52:39 3: [DF_ez_Haus_AktVerbrauch moving average] Value = 633 Time = 2023-10-22 19:52:29
2023.10.22 19:52:39 3: [DF_ez_Haus_AktVerbrauch moving average] Value = 633 Time = 2023-10-22 19:52:29
2023.10.22 19:52:39 3: [DF_ez_Haus_AktVerbrauch moving average] Value = 631 Time = 2023-10-22 19:52:34
2023.10.22 19:52:39 3: [DF_ez_Haus_AktVerbrauch moving average] Value = 631 Time = 2023-10-22 19:52:34
2023.10.22 19:52:39 3: [DF_ez_Haus_AktVerbrauch moving average] Value = 631 Time = 2023-10-22 19:52:34
2023.10.22 19:52:39 3: [DF_ez_Haus_AktVerbrauch moving average] Value = 631 Time = 2023-10-22 19:52:39
2023.10.22 19:52:39 3: [DF_ez_Haus_AktVerbrauch moving average] Value = 631 Time = 2023-10-22 19:52:39
2023.10.22 19:52:39 3: [DF_ez_Haus_AktVerbrauch moving average] calculated over 25 values is 634.920
2023.10.22 19:52:39 3: [DF_ez_Haus_AktVerbrauch moving average] Value = 629 Time = 2023-10-22 19:51:57
2023.10.22 19:52:39 3: [DF_ez_Haus_AktVerbrauch moving average] Value = 635 Time = 2023-10-22 19:52:02
2023.10.22 19:52:39 3: [DF_ez_Haus_AktVerbrauch moving average] Value = 635 Time = 2023-10-22 19:52:02
2023.10.22 19:52:39 3: [DF_ez_Haus_AktVerbrauch moving average] Value = 635 Time = 2023-10-22 19:52:02
2023.10.22 19:52:39 3: [DF_ez_Haus_AktVerbrauch moving average] Value = 645 Time = 2023-10-22 19:52:07
2023.10.22 19:52:39 3: [DF_ez_Haus_AktVerbrauch moving average] Value = 645 Time = 2023-10-22 19:52:07
2023.10.22 19:52:39 3: [DF_ez_Haus_AktVerbrauch moving average] Value = 645 Time = 2023-10-22 19:52:07
2023.10.22 19:52:39 3: [DF_ez_Haus_AktVerbrauch moving average] Value = 643 Time = 2023-10-22 19:52:12
2023.10.22 19:52:39 3: [DF_ez_Haus_AktVerbrauch moving average] Value = 643 Time = 2023-10-22 19:52:12
2023.10.22 19:52:39 3: [DF_ez_Haus_AktVerbrauch moving average] Value = 643 Time = 2023-10-22 19:52:12
2023.10.22 19:52:39 3: [DF_ez_Haus_AktVerbrauch moving average] Value = 631 Time = 2023-10-22 19:52:18
2023.10.22 19:52:39 3: [DF_ez_Haus_AktVerbrauch moving average] Value = 631 Time = 2023-10-22 19:52:18
2023.10.22 19:52:39 3: [DF_ez_Haus_AktVerbrauch moving average] Value = 631 Time = 2023-10-22 19:52:18
2023.10.22 19:52:39 3: [DF_ez_Haus_AktVerbrauch moving average] Value = 633 Time = 2023-10-22 19:52:24
2023.10.22 19:52:39 3: [DF_ez_Haus_AktVerbrauch moving average] Value = 633 Time = 2023-10-22 19:52:24
2023.10.22 19:52:39 3: [DF_ez_Haus_AktVerbrauch moving average] Value = 633 Time = 2023-10-22 19:52:24
2023.10.22 19:52:39 3: [DF_ez_Haus_AktVerbrauch moving average] Value = 633 Time = 2023-10-22 19:52:29
2023.10.22 19:52:39 3: [DF_ez_Haus_AktVerbrauch moving average] Value = 633 Time = 2023-10-22 19:52:29
2023.10.22 19:52:39 3: [DF_ez_Haus_AktVerbrauch moving average] Value = 633 Time = 2023-10-22 19:52:29
2023.10.22 19:52:39 3: [DF_ez_Haus_AktVerbrauch moving average] Value = 631 Time = 2023-10-22 19:52:34
2023.10.22 19:52:39 3: [DF_ez_Haus_AktVerbrauch moving average] Value = 631 Time = 2023-10-22 19:52:34
2023.10.22 19:52:39 3: [DF_ez_Haus_AktVerbrauch moving average] Value = 631 Time = 2023-10-22 19:52:34
2023.10.22 19:52:39 3: [DF_ez_Haus_AktVerbrauch moving average] Value = 631 Time = 2023-10-22 19:52:39
2023.10.22 19:52:39 3: [DF_ez_Haus_AktVerbrauch moving average] Value = 631 Time = 2023-10-22 19:52:39
2023.10.22 19:52:39 3: [DF_ez_Haus_AktVerbrauch moving average] Value = 631 Time = 2023-10-22 19:52:39
2023.10.22 19:52:39 3: [DF_ez_Haus_AktVerbrauch moving average] calculated over 25 values is 635.000


Otto123

Dein userReadings wird bei jedem triggern des Device angestoßen. setze also bitte einen Trigger wie in der Commandref beschrieben. Ev. so:
attr DF_ez_Haus_AktVerbrauch userReadings wirkleistung.av:wirkleistung.* {sprintf("%.1f",movingAverage("DF_ez_Haus_AktVerbrauch","wirkleistung",120))}
Schau Dir im Eventmonitor an was mit deinem DOIF passiert.

Tipp: Device- und Readingnamen mit Punkten machen die Verwendung von regExp immer zu einer besonderen Herausforderung!
Viele Grüße aus Leipzig  ⇉  nächster Stammtisch an der Lindennaundorfer Mühle
RaspberryPi B B+ B2 B3 B3+ ZeroW,HMLAN,HMUART,Homematic,Fritz!Box 7590,WRT3200ACS-OpenWrt,Sonos,VU+,Arduino nano,ESP8266,MQTT,Zigbee,deconz

blue

Boah, bin begeistert - danke @Otto123! Es geht schon und mir ist die Logik dann jetzt auch wie Schuppen von den Augen gefallen.

Sorry, dann hatte ich auch das falsche Forum gewählt und es hat natürlich nichts mit DOIF zu tun.

Den Tipp mit den Punkt im ReadingName übernehme ich auch direkt, da hast du natürlich recht. Tatsächlich hatte ich die Syntax vom Wiki unter https://wiki.fhem.de/wiki/Gleitende_Mittelwerte_berechnen_und_loggen übernommen, dort sind die Beispiele mit einem Punkt in der Syntax...