Trigger: DOIF immer nur 1x, nachdem Modbus-Device alle Register gelesen hat?

Begonnen von MichaelO, 30 Oktober 2019, 11:23:04

Vorheriges Thema - Nächstes Thema

MichaelO

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

rabehd

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?
Auch funktionierende Lösungen kann man hinterfragen.

Frank_Huber

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.

MichaelO

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

amenomade

Pi 3B, Alexa, CUL868+Selbstbau 1/2λ-Dipol-Antenne, USB Optolink / Vitotronic, Debmatic und HM / HmIP Komponenten, Rademacher Duofern Jalousien, Fritz!Dect Thermostaten, Proteus

MichaelO

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