FHEM Forum

FHEM => Anfängerfragen => Thema gestartet von: MichaelO am 30 Oktober 2019, 11:23:04

Titel: Trigger: DOIF immer nur 1x, nachdem Modbus-Device alle Register gelesen hat?
Beitrag von: MichaelO am 30 Oktober 2019, 11:23:04
Moin,

ich hab aktuell ein kleines "Trigger-Problem". Mein Modbus-Device liest alle 10s eine Anzahl Holding-Register und schreibt die Ergebnisse in entsprechende Readings. Ich versuche nun, mithilfe eines DOIF die neuen Werte in eine InfluxDB zu schreiben.

Allerdings triggert das DOIF auf jedes einzelne Reading, so dass beim Update des Modbus-Devices innerhalb von 2s gut 10x in die DB geschrieben wird. Wie schaffe ich es, dass nur dann getriggert wird, wenn alle Readings fertig gelesen sind? Die Zeitstempel im Modbus-Device zeigen an, dass der gesamte Vorgang wohl gut 2 Sekunden dauert.

Danke
Michael
Titel: Antw:Trigger: DOIF immer nur 1x, nachdem Modbus-Device alle Register gelesen hat?
Beitrag von: rabehd am 30 Oktober 2019, 12:54:40
ZitatAllerdings triggert das DOIF auf jedes einzelne Reading, so dass beim Update des Modbus-Devices innerhalb von 2s gut 10x in die DB geschrieben wird. Wie schaffe ich es, dass nur dann getriggert wird, wenn alle Readings fertig gelesen sind?

ZitatAllerdings triggert das DOIF auf jedes einzelne Reading
Dann hast Du das wahrscheinlich auch so definiert. Nein, dann zeige mal deine Definition.

ZitatWie schaffe ich es, dass nur dann getriggert wird, wenn alle Readings fertig gelesen sind?
Indem Du nur dieses Reading als Trigger zulässt.

Hast Du Dich mal mit event-on-update-reading und event-on-change-reading beschäftigt?
Titel: Antw:Trigger: DOIF immer nur 1x, nachdem Modbus-Device alle Register gelesen hat?
Beitrag von: Frank_Huber am 30 Oktober 2019, 13:10:14
Hi,

Ich habe mit meinem ETA Heizkessel über Modbus das gleiche Thema.

Ich habe es so gelöst dass ich auf das Reading mit dem höchsten Modbus Register triggere.
Dies ist idR das letzte das aktualisiert wird.

Anfangs habe ich auch auf jedes einzelne Reading getriggert.
Ich muss sagen, auch dies lief über Monate stabil und problemlos. Auch wenn dieses DOIF dann 20mal in einer Sekunde getriggert wurde.

Ich denke mit der triggerung auf das letzte Register habe ich FHEM etwas "Last" genommen, wenn auch nicht spürbar.
Titel: Antw:Trigger: DOIF immer nur 1x, nachdem Modbus-Device alle Register gelesen hat?
Beitrag von: MichaelO am 30 Oktober 2019, 15:23:44
Also das mit den "event-on..." funktioniert nicht, da das Modbus-Modul in einem festen Intervall mehrere Readings aktualisiert, die alle relevant sind. Leider gibt es kein "pull-finished-Flag", worauf nach Abschluss des Vorgangs getriggert werden kann.

Ich habe aus Zufall gesehen, dass es möglich ist, über das Attribut "sortUpdate" dafür zu sorgen, dass die Register in aufsteigender Reihenfolge abgefragt werden. Ein Trigger auf das letzte Register könnte demnach die Lösung sein, das werde ich testen.

Danke für den Hinweis,
Michael
Titel: Antw:Trigger: DOIF immer nur 1x, nachdem Modbus-Device alle Register gelesen hat?
Beitrag von: amenomade am 30 Oktober 2019, 20:50:10
Zitat von: rabehd am 30 Oktober 2019, 12:54:40
dann zeige mal deine Definition.
"list" vom DOIF bitte
Titel: Antw:Trigger: DOIF immer nur 1x, nachdem Modbus-Device alle Register gelesen hat?
Beitrag von: MichaelO am 31 Oktober 2019, 11:24:09
Hier ist das Listing... nachdem ich im Modbus-Device auf SortUpdate gestellt habe, funktioniert es jetzt. Ich triggere das DOIF auf das Register mit der höchsten Nummer, damit scheint sichergestellt, dass der Lesevorgang aller Register beendet ist und man valide Werte nutzt. Ist ersteinmal nur ein Test, ob die Berechnung und das Schreiben in die InfluxDB klappt (was es jetzt anscheinend tut).

Internals:
   CFGFN     
   DEF        ([Plenticore_Garage:Actual_batt_ch_disch_power] or [Plenticore_Wohnhaus:Inverter_Generation_power_actual])
## Trigger auf zuletzt gelesenes Register des jeweiligen WR

(setreading di_Photovoltaik_gesamt PV_power_total {([Plenticore_Garage:PV_power]+[Plenticore_Wohnhaus:PV_power])})
({system ("curl -XPOST 'http://192.168.0.19:8086/write?db=testDB' --data-binary 'pv_power,converter=1 value='".ReadingsVal("Plenticore_Garage", "PV_power", "")); return 0;})
   FUUID      5db99efb-f33f-497e-b2fa-05f1271fce026c03
   MODEL      FHEM
   NAME       di_Photovoltaik_gesamt
   NOTIFYDEV  global,Plenticore_Wohnhaus,Plenticore_Garage
   NR         301
   NTFY_ORDER 50-di_Photovoltaik_gesamt
   STATE      cmd_1
   TYPE       DOIF
   VERSION    20423 2019-10-29 18:50:08
   READINGS:
     2019-10-31 11:49:34   Device          Plenticore_Wohnhaus
     2019-10-31 11:49:34   PV_power_total  11451.46
     2019-10-31 11:49:35   cmd             1.2
     2019-10-31 11:49:35   cmd_event       Plenticore_Wohnhaus
     2019-10-31 11:49:35   cmd_nr          1
     2019-10-31 11:49:35   cmd_seqnr       2
     2019-10-31 11:49:33   e_Plenticore_Garage_Actual_batt_ch_disch_power -1394
     2019-10-31 11:49:34   e_Plenticore_Wohnhaus_Inverter_Generation_power_actual 5977
     2019-10-31 11:44:54   mode            enabled
     2019-10-31 11:49:35   state           cmd_1
   Regex:
     accu:
     cond:
       Plenticore_Garage:
         0:
           Actual_batt_ch_disch_power ^Plenticore_Garage$:^Actual_batt_ch_disch_power:
       Plenticore_Wohnhaus:
         0:
           Inverter_Generation_power_actual ^Plenticore_Wohnhaus$:^Inverter_Generation_power_actual:
   attr:
     cmdState:
     cmdpause:
       0
       3
     wait:
     waitdel:
   condition:
     0          ::ReadingValDoIf($hash,'Plenticore_Garage','Actual_batt_ch_disch_power') or ::ReadingValDoIf($hash,'Plenticore_Wohnhaus','Inverter_Generation_power_actual')
   do:
     0:
       0          setreading di_Photovoltaik_gesamt PV_power_total {([Plenticore_Garage:PV_power]+[Plenticore_Wohnhaus:PV_power])}
       1          {system ("curl -XPOST 'http://192.168.0.19:8086/write?db=testDB' --data-binary 'pv_power,converter=1 value='".ReadingsVal("Plenticore_Garage", "PV_power", "")); return 0;}
     1:
   helper:
     DEVFILTER  ^global$|^Plenticore_Wohnhaus$|^Plenticore_Garage$
     NOTIFYDEV  global|Plenticore_Wohnhaus|Plenticore_Garage
     event      Inverter_Generation_power_actual: 5977,PV_power: 6076.37,Inverter_State_natural: FeedIn
     globalinit 1
     last_timer 0
     sleeptimer -1
     timerdev   Plenticore_Wohnhaus
     timerevent Inverter_Generation_power_actual: 5977,PV_power: 6076.37,Inverter_State_natural: FeedIn
     triggerDev Plenticore_Wohnhaus
     DOIF_eventa:
       cmd_nr: 1
       cmd_seqnr: 2
       cmd_event: Plenticore_Wohnhaus
       cmd_1
     DOIF_eventas:
       cmd_nr: 1
       cmd_seqnr: 2
       cmd_event: Plenticore_Wohnhaus
       state: cmd_1
     timerevents:
       Inverter_Generation_power_actual: 5977
       PV_power: 6076.37
       Inverter_State_natural: FeedIn
     timereventsState:
       Inverter_Generation_power_actual: 5977
       PV_power: 6076.37
       Inverter_State_natural: FeedIn
     triggerEvents:
       Inverter_Generation_power_actual: 5977
       PV_power: 6076.37
       Inverter_State_natural: FeedIn
     triggerEventsState:
       Inverter_Generation_power_actual: 5977
       PV_power: 6076.37
       Inverter_State_natural: FeedIn
   internals:
   readings:
     all         Plenticore_Garage:Actual_batt_ch_disch_power Plenticore_Wohnhaus:Inverter_Generation_power_actual
   trigger:
   uiState:
   uiTable:
Attributes:
   cmdpause   0:3
   do         always