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
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?
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.
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
Zitat von: rabehd am 30 Oktober 2019, 12:54:40
dann zeige mal deine Definition.
"list" vom DOIF bitte
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