Guten Morgen zusammen,
zum Testen habe ich folgende Definition erstellt:
def Aussensensor_test ([$SELF:max] > 250) (setreading $SELF 1.$DEVICE $EVENT)
DOELSEIF ([$SELF:max] > 220) (setreading $SELF 2.$DEVICE $EVENT)
DOELSEIF ([$SELF:max] > 200) (setreading $SELF 3.$DEVICE $EVENT)
DOELSEIF ([$SELF:max] > 100) (setreading $SELF 4.$DEVICE $EVENT)
DOELSEIF ([$SELF:average] <= 50) (setreading $SELF 5.$DEVICE $EVENT)
attr Aussensensor_test DOIF_Readings max:[#max:d0:"((?!test).)*_BW_aussen($|_Terrasse$):brightness":brightness],
min:[#min:d0:"((?!test).)*_BW_aussen($|_Terrasse$):brightness":brightness],
average:[#average:d0:"((?!test).)*_BW_aussen($|_Terrasse$):brightness":brightness]
Damit möchte ich - zunächst zum Testen und Verstehen - von allen Außen-Bewegungssensoren mit Lichtmessung die Werte einfangen und in min, max und avarage des DOIF-Devices speichern. Um auch zu sehen, welches Device was geliefert hat, lasse ich das DOIF-Device selbst noch die auslösenden Devices mit ihren Werten in Readings des DOIF-Devices speichern.
Interessanterweise wird auch jeweils ein Reading mit dem DOIF-Device (hier: "4.Aussensensor_test" mit dem Wert "min: 130") selbst angelegt, obwohl dies nach meinem Verständnis eigentlich nicht passieren dürfte.
READINGS:
2018-12-29 09:30:17 4.Aussensensor_test min: 130
2018-12-29 09:36:17 Device Aussensensor_test
2018-12-29 09:36:17 average 149
2018-12-29 09:30:17 cmd 4
2018-12-29 09:30:17 cmd_event Aussensensor_test
2018-12-29 09:30:17 cmd_nr 4
2018-12-29 09:36:17 e_Aussensensor_test_average 149
2018-12-29 09:32:17 e_Aussensensor_test_max 171
2018-12-29 09:30:17 error max: 167: Unknown command max:, try help. average: 146: Unknown command average:, try help.
2018-12-29 09:32:17 max 171
2018-12-29 09:36:17 min 134
2018-12-29 09:30:17 state cmd_4
Warum wird das DOIF-Device selbst hier mit aus Trigger ausgewertet? Wieso kommt es zu den Fehlermeldungen (error)? Wie gesagt, hier geht es nicht um Sinn und Unsinn sondern um das Verstehen :D .
Der Vollständig halber noch das komplette List:
Internals:
DEF ([$SELF:max] > 250) (setreading $SELF 1.$DEVICE $EVENT)
DOELSEIF ([$SELF:max] > 220) (setreading $SELF 2.$DEVICE $EVENT)
DOELSEIF ([$SELF:max] > 200) (setreading $SELF 3.$DEVICE $EVENT)
DOELSEIF ([$SELF:max] > 100) (setreading $SELF 4.$DEVICE $EVENT)
DOELSEIF ([$SELF:average] <= 50) (setreading $SELF 5.$DEVICE $EVENT)
MODEL FHEM
NAME Aussensensor_test
NR 304
NTFY_ORDER 50-Aussensensor_test
STATE cmd_4
TYPE DOIF
DOIF_Readings:
average ::AggregateDoIf($hash,'#average:d0:','((?!test).)*_BW_aussen($|_Terrasse$)','brightness')
max ::AggregateDoIf($hash,'#max:d0:','((?!test).)*_BW_aussen($|_Terrasse$)','brightness')
min ::AggregateDoIf($hash,'#min:d0:','((?!test).)*_BW_aussen($|_Terrasse$)','brightness')
Helper:
DBLOG:
4.Aussensensor_test:
Eventlog:
TIME 1546072217.50559
VALUE min
5.Aussensensor_test:
Eventlog:
TIME 1546014737.54041
VALUE min
cmd:
Eventlog:
TIME 1546072217.77761
VALUE 4
cmd_event:
Eventlog:
TIME 1546072217.77761
VALUE Aussensensor_test
cmd_nr:
Eventlog:
TIME 1546072217.77761
VALUE 4
error:
Eventlog:
TIME 1546072217.77761
VALUE max: 167: Unknown command max:, try help. average: 146: Unknown command average:, try help.
state:
Eventlog:
TIME 1546072217.77761
VALUE cmd_4
OLDREADINGS:
READINGS:
2018-12-29 09:30:17 4.Aussensensor_test min: 130
2018-12-29 09:36:17 Device Aussensensor_test
2018-12-29 09:36:17 average 149
2018-12-29 09:30:17 cmd 4
2018-12-29 09:30:17 cmd_event Aussensensor_test
2018-12-29 09:30:17 cmd_nr 4
2018-12-29 09:36:17 e_Aussensensor_test_average 149
2018-12-29 09:32:17 e_Aussensensor_test_max 171
2018-12-29 09:30:17 error max: 167: Unknown command max:, try help. average: 146: Unknown command average:, try help.
2018-12-29 09:32:17 max 171
2018-12-29 09:36:17 min 134
2018-12-29 09:30:17 state cmd_4
Regex:
DOIF_Readings:
:
average:
"((?!test).)*_BW_aussen($|_Terrasse$):brightness" ((?!test).)*_BW_aussen($|_Terrasse$):brightness
max:
"((?!test).)*_BW_aussen($|_Terrasse$):brightness" ((?!test).)*_BW_aussen($|_Terrasse$):brightness
min:
"((?!test).)*_BW_aussen($|_Terrasse$):brightness" ((?!test).)*_BW_aussen($|_Terrasse$):brightness
Aussensensor_test:
average:
max:
min:
attr:
cmdState:
wait:
waitdel:
condition:
0 ::ReadingValDoIf($hash,'Aussensensor_test','max') > 250
1 ::ReadingValDoIf($hash,'Aussensensor_test','max') > 220
2 ::ReadingValDoIf($hash,'Aussensensor_test','max') > 200
3 ::ReadingValDoIf($hash,'Aussensensor_test','max') > 100
4 ::ReadingValDoIf($hash,'Aussensensor_test','average') <= 50
devices:
0 Aussensensor_test
1 Aussensensor_test
2 Aussensensor_test
3 Aussensensor_test
4 Aussensensor_test
all Aussensensor_test
do:
0:
0 setreading Aussensensor_test 1.$DEVICE $EVENT
1:
0 setreading Aussensensor_test 2.$DEVICE $EVENT
2:
0 setreading Aussensensor_test 3.$DEVICE $EVENT
3:
0 setreading Aussensensor_test 4.$DEVICE $EVENT
4:
0 setreading Aussensensor_test 5.$DEVICE $EVENT
5:
helper:
DOIF_Readings_events
event min: 134,average: 149
globalinit 1
last_timer 0
sleeptimer -1
timerdev Aussensensor_test
timerevent max: 171,average: 148
triggerDev Aussensensor_test
DOIF_eventas:
cmd_nr: 4
cmd: 4
cmd_event: Aussensensor_test
error: max: 167: Unknown command max:, try help. average: 146: Unknown command average:, try help.
state: cmd_4
timerevents:
max: 171
average: 148
e_Aussensensor_test_max: 171
timereventsState:
max: 171
average: 148
triggerEvents:
min: 134
average: 149
e_Aussensensor_test_average: 149
triggerEventsState:
min: 134
average: 149
internals:
itimer:
perlblock:
readings:
0 Aussensensor_test:max
1 Aussensensor_test:max
2 Aussensensor_test:max
3 Aussensensor_test:max
4 Aussensensor_test:average
all Aussensensor_test:max Aussensensor_test:average
trigger:
uiState:
uiTable:
Attributes:
DOIF_Readings max:[#max:d0:"((?!test).)*_BW_aussen($|_Terrasse$):brightness":brightness],
min:[#min:d0:"((?!test).)*_BW_aussen($|_Terrasse$):brightness":brightness],
average:[#average:d0:"((?!test).)*_BW_aussen($|_Terrasse$):brightness":brightness]
Hab zwar selber nicht den Plan, mein aber im Wiki gelesen zu haben, das doif einen Schutz eingebaut hat und sich nicht selbst triggern kann um loops zu vermeiden
Offenbar stimmt deine DOIF_Readings-Definition nicht (ggf. falsche Regex). Das max-Reading z. B. wird erst gar nicht angelegt.
Auch die Abfrage von $DEVICE und $EVENT bei der Nutzung von DOIF_Readings ist nicht sinnvoll, weil sich das Modul (ohne Events nach außen) selbst triggert.
Die Regex stimmt leider. Max wird auch angelegt - ist ja auch bereits zu sehen.
Zitat
2018-12-29 09:32:17 max 171
Auch ich war der Meinung, dass sich das DOIF nicht selbst triggert, es sei denn, es ist über das Attribut selftrigger etwas anderes definiert.
In der aktuellen Ref steht drin:
Zitat
Standardmäßig unterbindet das DOIF-Modul Selbsttriggerung.
Zitat von: Ralli am 29 Dezember 2018, 10:24:58
Die Regex stimmt leider. Max wird auch angelegt - ist ja auch bereits zu sehen.
Auch ich war der Meinung, dass sich das DOIF nicht selbst triggert, es sei denn, es ist über das Attribut selftrigger etwas anderes definiert.
In der aktuellen Ref steht drin:
ok.
Selbsttriggerung bezieht sich hier auf Events, die DOIF selbst nach außen produziert z. B. "set bla on". DOIF_Readings zählt hier nicht dazu, es ist ja gerade dazu da ein eigenes Reading zu setzen, welches man unmittelbar in der DOIF-Bedingung abfragt. Dafür ist eine interne "Selbsttriggerung" ja notwendig. Dabei wird das eigene $DEVICE und $EVENT gesetzt, um bei der internen Abarbeitung im DOIF mit den "echten" Events von außen kompatibel zu sein.