Hi zusammen,
ich vermute zwar stark, dass es schon irgendwo eine passende Antwort gibt, aber ich habe sie leider nicht gefunden - und zwar auf die Frage:
Gibt es eine im DOIF integrierte Möglichkeit, an das aktuell triggernde Device Reading heranzukommen?
Ich habe im Bedingungsteil mehrere Abfragen in der Art
([Inverter:Temp1] > 70 or [Inverter:Temp2] > 70 or [Inverter:Temp3] > 70 or [Inverter:HEALTH_ID] !~ "51|311")
und möchte nun wissen, welches Reading zur Ausführung geführt hat. Also quasi das letzte e_DEVICE_READING. Das Device alleine ist mir zu wenig.
Ist das möglich?
$EVENT bzw. $EVENTS liefert mir anscheinend immer nur alle Readings.
Alles, was in einem Eventblock an das DOIF-Modul geliefert wird, wird in den $EVENTS-Variablen abgelegt, die muss man dann selbst nach passenden Readings durchsuchen.
Einen Filter für User gibt es im DOIF nicht.
Also bliebe mir eigentlich nur, jeweils eine Bedingung pro Device-Reading zu erstellen? Oder an der Stelle einfach ein Notify zu verwenden und dort dann ganz old-school das EVENT auszuwerten.
Vielleicht passt aber an meinem DOIF auch irgendetwas anderes noch nicht, denn der Ausführungsteil wird ständig getriggert, obwohl der Bedingungsteil nicht true sein dürfte. Quelldevice ist ein HTTPMOD-Device:
Internals:
CFGFN
DEF ([SMASTPX15:INV_TEMP1] > 73 or [SMASTPX15:INV_TEMP2] > 73 or [SMASTPX15:INV_TEMP3] > 73 or [SMASTPX15:SPOT_FEHLERSTROM] > 0.02 or [SMASTPX15:SPOT_ISOLATION] > 1250 or
[SMASTPX15:INV_HEALTH] ne "307")({
## or [SMASTPX15:INV_EVENT] !~ "51|311"
SendMessage("SMA STPX15 ", "$DEVICE", "Pushover", "silent")
})
FUUID 647cf067-f33f-6078-3d5c-4969ed50e2f48d6e
MODEL FHEM
NAME doif.Inverter.Health
NOTIFYDEV global,SMASTPX15
NR 34631
NTFY_ORDER 50-doif.Inverter.Health
STATE cmd_1
TYPE DOIF
VERSION 27616 2023-05-25 17:55:36
eventCount 100
READINGS:
2023-06-05 16:50:58 Device SMASTPX15
2023-06-05 16:50:58 cmd 1
2023-06-05 16:50:58 cmd_event SMASTPX15
2023-06-05 16:50:58 cmd_nr 1
2023-06-05 16:50:58 e_SMASTPX15_INV_TEMP1 62
2023-06-05 16:50:58 e_SMASTPX15_INV_TEMP2 60
2023-06-05 16:47:58 e_SMASTPX15_INV_TEMP3 58
2023-06-05 16:50:58 e_SMASTPX15_SPOT_FEHLERSTROM 0.014
2023-06-05 14:50:32 mode enabled
2023-06-05 16:50:58 state cmd_1
Regex:
accu:
bar:
barAvg:
collect:
cond:
SMASTPX15:
0:
INV_HEALTH ^SMASTPX15$:^INV_HEALTH:
INV_TEMP1 ^SMASTPX15$:^INV_TEMP1:
INV_TEMP2 ^SMASTPX15$:^INV_TEMP2:
INV_TEMP3 ^SMASTPX15$:^INV_TEMP3:
SPOT_FEHLERSTROM ^SMASTPX15$:^SPOT_FEHLERSTROM:
SPOT_ISOLATION ^SMASTPX15$:^SPOT_ISOLATION:
attr:
cmdState:
wait:
waitdel:
condition:
0 ::ReadingValDoIf($hash,'SMASTPX15','INV_TEMP1') > 73 or ::ReadingValDoIf($hash,'SMASTPX15','INV_TEMP2') > 73 or ::ReadingValDoIf($hash,'SMASTPX15','INV_TEMP3') > 73 or ::ReadingValDoIf($hash,'SMASTPX15','SPOT_FEHLERSTROM') > 0.02 or ::ReadingValDoIf($hash,'SMASTPX15','SPOT_ISOLATION') > 1250 or ::ReadingValDoIf($hash,'SMASTPX15','INV_HEALTH') ne "307"
do:
0:
0 { SendMessage("SMA STPX15 ", "$DEVICE", "Pushover", "silent") }
1:
helper:
NOTIFYDEV global,SMASTPX15
event SPOT_UDC1: 481,SPOT_UDC2: 365,SPOT_UDC3: 448,SPOT_IDC1: 8.039,SPOT_IDC2: 7.324,SPOT_IDC3: 3.934,INV_TEMP1: 62,INV_TEMP2: 60,SPOT_FREQ: 49.99,SPOT_FEHLERSTROM: 0.014,SPOT_PAC: 8303,SPOT_PACTOT: 4314,SPOT_PDC1: 3864,SPOT_PDC2: 2674,SPOT_PDC3: 1763,SPOT_PDC1_TODAY: 62810.0762474723,SPOT_PDC2_TODAY: 17753.7757915573,SPOT_PDC3_TODAY: 21334.5799232438
globalinit 1
last_timer 0
sleeptimer -1
timerdev SMASTPX15
timerevent SPOT_UDC1: 481,SPOT_UDC2: 365,SPOT_UDC3: 448,SPOT_IDC1: 8.039,SPOT_IDC2: 7.324,SPOT_IDC3: 3.934,INV_TEMP1: 62,INV_TEMP2: 60,SPOT_FREQ: 49.99,SPOT_FEHLERSTROM: 0.014,SPOT_PAC: 8303,SPOT_PACTOT: 4314,SPOT_PDC1: 3864,SPOT_PDC2: 2674,SPOT_PDC3: 1763,SPOT_PDC1_TODAY: 62810.0762474723,SPOT_PDC2_TODAY: 17753.7757915573,SPOT_PDC3_TODAY: 21334.5799232438
triggerDev SMASTPX15
DOIF_eventa:
cmd_nr: 1
cmd: 1
cmd_event: SMASTPX15
cmd_1
DOIF_eventas:
cmd_nr: 1
cmd: 1
cmd_event: SMASTPX15
state: cmd_1
timerevents:
SPOT_UDC1: 481
SPOT_UDC2: 365
SPOT_UDC3: 448
SPOT_IDC1: 8.039
SPOT_IDC2: 7.324
SPOT_IDC3: 3.934
INV_TEMP1: 62
INV_TEMP2: 60
SPOT_FREQ: 49.99
SPOT_FEHLERSTROM: 0.014
SPOT_PAC: 8303
SPOT_PACTOT: 4314
SPOT_PDC1: 3864
SPOT_PDC2: 2674
SPOT_PDC3: 1763
SPOT_PDC1_TODAY: 62810.0762474723
SPOT_PDC2_TODAY: 17753.7757915573
SPOT_PDC3_TODAY: 21334.5799232438
timereventsState:
SPOT_UDC1: 481
SPOT_UDC2: 365
SPOT_UDC3: 448
SPOT_IDC1: 8.039
SPOT_IDC2: 7.324
SPOT_IDC3: 3.934
INV_TEMP1: 62
INV_TEMP2: 60
SPOT_FREQ: 49.99
SPOT_FEHLERSTROM: 0.014
SPOT_PAC: 8303
SPOT_PACTOT: 4314
SPOT_PDC1: 3864
SPOT_PDC2: 2674
SPOT_PDC3: 1763
SPOT_PDC1_TODAY: 62810.0762474723
SPOT_PDC2_TODAY: 17753.7757915573
SPOT_PDC3_TODAY: 21334.5799232438
triggerEvents:
SPOT_UDC1: 481
SPOT_UDC2: 365
SPOT_UDC3: 448
SPOT_IDC1: 8.039
SPOT_IDC2: 7.324
SPOT_IDC3: 3.934
INV_TEMP1: 62
INV_TEMP2: 60
SPOT_FREQ: 49.99
SPOT_FEHLERSTROM: 0.014
SPOT_PAC: 8303
SPOT_PACTOT: 4314
SPOT_PDC1: 3864
SPOT_PDC2: 2674
SPOT_PDC3: 1763
SPOT_PDC1_TODAY: 62810.0762474723
SPOT_PDC2_TODAY: 17753.7757915573
SPOT_PDC3_TODAY: 21334.5799232438
triggerEventsState:
SPOT_UDC1: 481
SPOT_UDC2: 365
SPOT_UDC3: 448
SPOT_IDC1: 8.039
SPOT_IDC2: 7.324
SPOT_IDC3: 3.934
INV_TEMP1: 62
INV_TEMP2: 60
SPOT_FREQ: 49.99
SPOT_FEHLERSTROM: 0.014
SPOT_PAC: 8303
SPOT_PACTOT: 4314
SPOT_PDC1: 3864
SPOT_PDC2: 2674
SPOT_PDC3: 1763
SPOT_PDC1_TODAY: 62810.0762474723
SPOT_PDC2_TODAY: 17753.7757915573
SPOT_PDC3_TODAY: 21334.5799232438
internals:
readings:
all SMASTPX15:INV_TEMP1 SMASTPX15:INV_TEMP2 SMASTPX15:INV_TEMP3 SMASTPX15:SPOT_FEHLERSTROM SMASTPX15:SPOT_ISOLATION SMASTPX15:INV_HEALTH
trigger:
uiState:
uiTable:
Attributes:
do always
Wenn es zur Ausführung kommt, dann muss sie wahr sein, das so sicher, wie das Amen in der Kirche.
Du sieht nur die Werte der triggernden Event-Readings unter e_.... Abgefragt werden mit or aber auch Werte die gerade nicht getriggert haben. Eine dieser Abfragen ist dann eben wahr - musst einfach bei dir nachschauen.
Muss wohl so sein, da will ich dir lieber nicht widersprechen ;)
Aber dass das Verhalten bei OR anders ist und dass Werte true sein können, die dann nicht als Reading mit e-Präfix auftauchen, außer man nutzt den "?"-Präfix, war mir neu. Wieder was dazu gelernt.
Es geht hier nur um eine Bedingung, die komplett von Perl ausgewertet wird, egal von wem der Trigger kam.
Du kannst ja auch die Events abfragen. Dran denken, wenn du vergleichen willst (>70), musst du einen Vorgabewert mit übergeben. Da es immer nur ein Event gleichzeitig gibt, kann auch nur einer triggern.