Guten Abend!
Seit ca. einer Woche habe ich Probleme mit DOIFs, die immer zuverlässig funktioniert haben. Das letzte Update habe ich gerade ausgeführt.
Eines der problematischen DOIFs:
defmod D_L_AU.GR.Fensteroeffner DOIF ([?$SELF:P_Locked, "locked"] eq "unlocked" and [$SELF:"(open|close)"])\
(set AU.GR.Fensteroeffner $EVENT)\
(set $SELF cmd_2_1)\
\
DOELSEIF ([$SELF:P_Locked, "locked"] eq "unlocked")\
()\
(set $SELF P_Locked locked)\
attr D_L_AU.GR.Fensteroeffner cmdIcon open:fts_window_1w_tilt close:fts_window_1w stop:time_manual_mode
attr D_L_AU.GR.Fensteroeffner cmdState command sent,command sent|unlocked,locked
attr D_L_AU.GR.Fensteroeffner do resetwait
attr D_L_AU.GR.Fensteroeffner event-on-change-reading .*
attr D_L_AU.GR.Fensteroeffner readingList P_Locked
attr D_L_AU.GR.Fensteroeffner setList P_Locked:locked,unlocked open close stop
attr D_L_AU.GR.Fensteroeffner wait 0,0:0,10
attr D_L_AU.GR.Fensteroeffner webCmd P_Locked:open:close:stop
Hintergrund: Das DOIF soll Fehlauslösungen verhindern und wird daher dem eigentlichen Device vorgeschaltet. Ein sich selbst zurücksetzendes Reading (P_Locked) schaltet die Bedienung temporär frei.
Setzt man zunächst P_Locked auf unlocked und sendet dann open passiert Folgendes:
2019-09-22 00:39:34.780 DOIF D_L_AU.GR.Fensteroeffner P_Locked: unlocked
2019-09-22 00:39:34.780 DOIF D_L_AU.GR.Fensteroeffner cmd_seqnr: 1
2019-09-22 00:39:34.780 DOIF D_L_AU.GR.Fensteroeffner cmd: 2.1
2019-09-22 00:39:34.780 DOIF D_L_AU.GR.Fensteroeffner unlocked
2019-09-22 00:39:34.780 DOIF D_L_AU.GR.Fensteroeffner wait_timer: 22.09.2019 00:39:44 cmd_2_2 D_L_AU.GR.Fensteroeffner
2019-09-22 00:39:36.486 DOIF D_L_AU.GR.Fensteroeffner open
2019-09-22 00:39:38.829 DOIF D_L_AU.GR.Fensteroeffner open
2019-09-22 00:39:39.502 DOIF D_L_AU.GR.Fensteroeffner open
2019-09-22 00:39:44.775 DOIF D_L_AU.GR.Fensteroeffner wait_timer: no timer
2019-09-22 00:39:44.781 DOIF D_L_AU.GR.Fensteroeffner P_Locked: locked
2019-09-22 00:39:44.788 DOIF D_L_AU.GR.Fensteroeffner cmd_seqnr: 2
2019-09-22 00:39:44.788 DOIF D_L_AU.GR.Fensteroeffner cmd: 2.2
2019-09-22 00:39:44.788 DOIF D_L_AU.GR.Fensteroeffner locked
Wie man sieht wird beim Senden von open weder der wait_timer zurückgesetzt noch das Event an AU.GR.Fensteroeffner durchgereicht.
Der Vollständigkeit halber noch ein list des DOIF:
Internals:
DEF ([?$SELF:P_Locked, "locked"] eq "unlocked" and [$SELF:"(up|down|stop|ventilate)"])
(set AU.GR.Torantrieb $EVENT)
(set $SELF cmd_2_1)
DOELSEIF ([$SELF:P_Locked, "locked"] eq "unlocked")
()
(set $SELF P_Locked locked)
FUUID 5c5c7df6-f33f-5676-f8c3-c46863491684471c
MODEL FHEM
NAME D_L_AU.GR.Torantrieb
NOTIFYDEV global,D_L_AU.GR.Torantrieb
NR 175
NTFY_ORDER 50-D_L_AU.GR.Torantrieb
STATE locked
TYPE DOIF
VERSION 20210 2019-09-20 21:37:33
READINGS:
2019-09-22 00:36:01 P_Locked locked
2019-09-22 00:36:01 cmd 2.2
2019-09-22 00:36:01 cmd_event set_cmd_2_1
2019-09-22 00:36:01 cmd_nr 2
2019-09-22 00:36:01 cmd_seqnr 2
2019-09-22 00:35:44 e_D_L_AU.GR.Torantrieb_P_Locked unlocked
2019-09-22 00:35:51 e_D_L_AU.GR.Torantrieb_events down
2019-09-21 23:52:53 mode enabled
2019-09-22 00:36:01 state locked
2019-09-22 00:36:01 wait_timer no timer
Regex:
accu:
cond:
D_L_AU.GR.Torantrieb:
0:
&STATE ^D_L_AU.GR.Torantrieb$
1:
P_Locked ^D_L_AU.GR.Torantrieb$:^P_Locked:
attr:
cmdState:
0:
command sent
command sent
1:
unlocked
locked
wait:
0:
0
0
1:
0
10
waitdel:
condition:
0 ::ReadingValDoIf($hash,'D_L_AU.GR.Torantrieb','P_Locked',' "locked"') eq "unlocked" and ::EventDoIf('D_L_AU.GR.Torantrieb',$hash,'(up|down|stop|ventilate)',1)
1 ::ReadingValDoIf($hash,'D_L_AU.GR.Torantrieb','P_Locked',' "locked"') eq "unlocked"
do:
0:
0 set AU.GR.Torantrieb $EVENT
1 set D_L_AU.GR.Torantrieb cmd_2_1
1:
0
1 set D_L_AU.GR.Torantrieb P_Locked locked
2:
helper:
event down
globalinit 1
last_timer 0
sleepdevice set_cmd_2_1
sleepsubtimer -1
sleeptimer -1
timerdev D_L_AU.GR.Torantrieb
timerevent down
triggerDev D_L_AU.GR.Torantrieb
DOIF_eventa:
cmd_nr: 2
cmd_seqnr: 2
cmd_event: set_cmd_2_1
locked
bm:
DOIF_Get:
cnt 3
dmx -1000
dtot 0
dtotcnt 0
mTS 22.09. 00:35:15
max 9.05990600585938e-06
tot 2.21729278564453e-05
mAr:
HASH(0x55f5dd0ef228)
D_L_AU.GR.Torantrieb
?
DOIF_Notify:
cnt 52
dmx -1000
dtot 0
dtotcnt 0
mTS 22.09. 00:22:51
max 0.0108180046081543
tot 0.0390419960021973
mAr:
HASH(0x55f5dd0ef228)
HASH(0x55f5dd0ef228)
DOIF_Set:
cnt 128
dmx -1000
dtot 0
dtotcnt 0
mTS 22.09. 00:22:17
max 0.0267770290374756
tot 0.150165796279907
mAr:
HASH(0x55f5dd0ef228)
D_L_AU.GR.Torantrieb
P_Locked
unlocked
timerevents:
down
wait_timer: no timer
cmd_seqnr: 1
cmd: 1.1
cmd_nr: 2
cmd: 2.1
cmd_event: set_cmd_2_1
unlocked
wait_timer: 22.09.2019 00:36:01 cmd_2_2 set_cmd_2_1
cmd_nr: 1
cmd_seqnr: 2
cmd: 1.2
cmd_event: D_L_AU.GR.Torantrieb
command sent
timereventsState:
down
wait_timer: no timer
cmd_seqnr: 1
cmd: 1.1
cmd_nr: 2
cmd: 2.1
cmd_event: set_cmd_2_1
unlocked
wait_timer: 22.09.2019 00:36:01 cmd_2_2 set_cmd_2_1
cmd_nr: 1
cmd_seqnr: 2
cmd: 1.2
cmd_event: D_L_AU.GR.Torantrieb
command sent
triggerEvents:
down
wait_timer: no timer
cmd_seqnr: 1
cmd: 1.1
cmd_nr: 2
cmd: 2.1
cmd_event: set_cmd_2_1
unlocked
wait_timer: 22.09.2019 00:36:01 cmd_2_2 set_cmd_2_1
cmd_nr: 1
cmd_seqnr: 2
cmd: 1.2
cmd_event: D_L_AU.GR.Torantrieb
command sent
triggerEventsState:
down
wait_timer: no timer
cmd_seqnr: 1
cmd: 1.1
cmd_nr: 2
cmd: 2.1
cmd_event: set_cmd_2_1
unlocked
wait_timer: 22.09.2019 00:36:01 cmd_2_2 set_cmd_2_1
cmd_nr: 1
cmd_seqnr: 2
cmd: 1.2
cmd_event: D_L_AU.GR.Torantrieb
command sent
internals:
readings:
all D_L_AU.GR.Torantrieb:P_Locked
trigger:
all D_L_AU.GR.Torantrieb
uiState:
uiTable:
Attributes:
cmdIcon down:fts_garage_door_100 up:fts_garage_door_10 stop:time_manual_mode ventilate:fts_garage_door_70
cmdState command sent,command sent|unlocked,locked
do resetwait
event-on-change-reading .*
group Locks
icon secur_locked
readingList P_Locked
room Auto
setList P_Locked:locked,unlocked up down stop ventilate
wait 0,0:0,10
webCmd P_Locked:up:down:ventilate:stop
Patrick
Update:
Wenn ich
set D_L_AU.GR.Fensteroeffner checkall
sende, funktioniert ab diesem Zeitpunkt das DOIF einwandfrei, d. h.:
- Ein neu definiertes DOIF funktioniert nicht.
- Nach dem senden von checkall funktioniert das DOIF dauerhaft.
- Ändert man die Definition des DOIF funktioniert es wieder nicht mehr.
Hier ein list des Devices im reparierten Zustand zum Vergleich:
Internals:
CFGFN
DEF ([?$SELF:P_Locked, "locked"] eq "unlocked" and [$SELF:"(open|close)"])
(set AU.GR.Fensteroeffner $EVENT)
(set $SELF cmd_2_1)
DOELSEIF ([$SELF:P_Locked, "locked"] eq "unlocked")
()
(set $SELF P_Locked locked)
FUUID 5d86a467-f33f-5676-d013-39d90828392282df
MODEL FHEM
NAME D_L_AU.GR.Fensteroeffner
NOTIFYDEV global,D_L_AU.GR.Fensteroeffner
NR 1110
NTFY_ORDER 50-D_L_AU.GR.Fensteroeffner
STATE locked
TYPE DOIF
VERSION 20210 2019-09-20 21:37:33
READINGS:
2019-09-22 01:05:36 P_Locked locked
2019-09-22 01:05:36 cmd 2.2
2019-09-22 01:05:36 cmd_event set_cmd_2_1
2019-09-22 01:05:36 cmd_nr 2
2019-09-22 01:05:36 cmd_seqnr 2
2019-09-22 01:05:26 e_D_L_AU.GR.Fensteroeffner_P_Locked unlocked
2019-09-22 01:05:26 e_D_L_AU.GR.Fensteroeffner_events close
2019-09-22 01:01:30 mode enabled
2019-09-22 01:05:36 state locked
2019-09-22 01:05:36 wait_timer no timer
Regex:
accu:
cond:
D_L_AU.GR.Fensteroeffner:
0:
&STATE ^D_L_AU.GR.Fensteroeffner$
1:
P_Locked ^D_L_AU.GR.Fensteroeffner$:^P_Locked:
attr:
cmdState:
0:
command sent
command sent
1:
unlocked
locked
wait:
0:
0
0
1:
0
10
waitdel:
condition:
0 ::ReadingValDoIf($hash,'D_L_AU.GR.Fensteroeffner','P_Locked',' "locked"') eq "unlocked" and ::EventDoIf('D_L_AU.GR.Fensteroeffner',$hash,'(open|close)',1)
1 ::ReadingValDoIf($hash,'D_L_AU.GR.Fensteroeffner','P_Locked',' "locked"') eq "unlocked"
do:
0:
0 set AU.GR.Fensteroeffner $EVENT
1 set D_L_AU.GR.Fensteroeffner cmd_2_1
1:
0
1 set D_L_AU.GR.Fensteroeffner P_Locked locked
2:
helper:
event close
globalinit 1
last_timer 0
sleepdevice set_cmd_2_1
sleepsubtimer -1
sleeptimer -1
timerdev D_L_AU.GR.Fensteroeffner
timerevent close
triggerDev D_L_AU.GR.Fensteroeffner
DOIF_eventa:
cmd_nr: 2
cmd_seqnr: 2
cmd_event: set_cmd_2_1
locked
bm:
DOIF_Get:
cnt 3
dmx -1000
dtot 0
dtotcnt 0
mTS 22.09. 01:02:01
max 1.28746032714844e-05
tot 2.288818359375e-05
mAr:
HASH(0x55f5ded7f578)
D_L_AU.GR.Fensteroeffner
?
DOIF_Notify:
cnt 19
dmx -1000
dtot 0
dtotcnt 0
mTS 22.09. 01:05:26
max 0.0123090744018555
tot 0.0258975028991699
mAr:
HASH(0x55f5ded7f578)
HASH(0x55f5ded7f578)
DOIF_Set:
cnt 115
dmx -1000
dtot 0
dtotcnt 0
mTS 22.09. 01:02:01
max 0.0361897945404053
tot 0.152661561965942
mAr:
HASH(0x55f5ded7f578)
D_L_AU.GR.Fensteroeffner
checkall
timerevents:
close
e_D_L_AU.GR.Fensteroeffner_events: close
wait_timer: no timer
cmd_nr: 1
cmd: 1.1
command sent
cmd_nr: 2
cmd: 2.1
cmd_event: set_cmd_2_1
unlocked
wait_timer: 22.09.2019 01:05:36 cmd_2_2 set_cmd_2_1
cmd_nr: 1
cmd_seqnr: 2
cmd: 1.2
cmd_event: D_L_AU.GR.Fensteroeffner
command sent
timereventsState:
close
e_D_L_AU.GR.Fensteroeffner_events: close
wait_timer: no timer
cmd_nr: 1
cmd: 1.1
command sent
cmd_nr: 2
cmd: 2.1
cmd_event: set_cmd_2_1
unlocked
wait_timer: 22.09.2019 01:05:36 cmd_2_2 set_cmd_2_1
cmd_nr: 1
cmd_seqnr: 2
cmd: 1.2
cmd_event: D_L_AU.GR.Fensteroeffner
command sent
triggerEvents:
close
e_D_L_AU.GR.Fensteroeffner_events: close
wait_timer: no timer
cmd_nr: 1
cmd: 1.1
command sent
cmd_nr: 2
cmd: 2.1
cmd_event: set_cmd_2_1
unlocked
wait_timer: 22.09.2019 01:05:36 cmd_2_2 set_cmd_2_1
cmd_nr: 1
cmd_seqnr: 2
cmd: 1.2
cmd_event: D_L_AU.GR.Fensteroeffner
command sent
triggerEventsState:
close
e_D_L_AU.GR.Fensteroeffner_events: close
wait_timer: no timer
cmd_nr: 1
cmd: 1.1
command sent
cmd_nr: 2
cmd: 2.1
cmd_event: set_cmd_2_1
unlocked
wait_timer: 22.09.2019 01:05:36 cmd_2_2 set_cmd_2_1
cmd_nr: 1
cmd_seqnr: 2
cmd: 1.2
cmd_event: D_L_AU.GR.Fensteroeffner
command sent
internals:
readings:
all D_L_AU.GR.Fensteroeffner:P_Locked
trigger:
all D_L_AU.GR.Fensteroeffner
uiState:
uiTable:
Attributes:
cmdIcon open:fts_window_1w_tilt close:fts_window_1w stop:time_manual_mode
cmdState command sent,command sent|unlocked,locked
do resetwait
event-on-change-reading .*
group Locks
icon secur_locked
readingList P_Locked
room Auto
setList P_Locked:locked,unlocked open close stop
wait 0,0:0,10
webCmd P_Locked:open:close:stop
Patrick
Es ist schwierig, die "lists" von 2 unterschiedlichen DOIFs zu vergleichen...
Aber klar, dass "open" nichts verursacht: solange P_locked auf "unlocked" bleibt, sieht der DOIF die Notwendigkeit nicht, den 2. Zweig zu verlassen.
Wenn es mal funktioniert hat, und jetzt nicht mehr, bitte dieses Thread gucken: https://forum.fhem.de/index.php/topic,103873.msg976332.html#msg976332
Zitat von: amenomade am 22 September 2019, 02:09:38
Es ist schwierig, die "lists" von 2 unterschiedlichen DOIFs zu vergleichen...
Auch wenn die Devices nahezu identisch sind gebe ich Dir Recht.
Leider bekomme ich jetzt den reparierten Fall auch mit checkall nicht mehr rekonstruiert.Zitat von: amenomade am 22 September 2019, 02:09:38
Aber klar, dass "open" nichts verursacht: solange P_locked auf "unlocked" bleibt, sieht der DOIF die Notwendigkeit nicht, den 2. Zweig zu verlassen.
Außer natürlich der erste Fall wird wahr wie bei set open.
Zitat von: amenomade am 22 September 2019, 02:09:38
Wenn es mal funktioniert hat, und jetzt nicht mehr, bitte dieses Thread gucken: https://forum.fhem.de/index.php/topic,103873.msg976332.html#msg976332
Ok, werde mich dort mal dranhängen.
/Edit:
Aktuell blicke ich nicht mehr durch. Ich hatte das DOIF nach modify und checkall wieder am Laufen, es funktionierte aber nur exakt einmal.
Patrick
Zitat von: PatrickR am 22 September 2019, 03:18:03
Außer natürlich der erste Fall wird wahr wie bei set open.
Wenn der erste Fall wahr wird, heisst es nicht, dass der 2. nicht mehr wahr ist.
Zitat von: amenomade am 22 September 2019, 12:41:14
Wenn der erste Fall wahr wird, heisst es nicht, dass der 2. nicht mehr wahr ist.
Unbestritten. Aber Fall 1 wird wahr und DOIF wechselt den Zustand. Aber da ich bezweifle, dass dieses Commandref-Duell das Problem löst, das Damian dankenswerterweise schon lokalisiert hat, mache ich mal hier zu.
Danke für den Hinweis auf den Thread.
Patrick