Hallo,
ich habe das Problem, dass DOIF meine Wait-Timer abbricht. Das ist laut Commandref auch korrekt so, aber dann funzt mein Modul nicht so, wie es soll!
Ich trigger den Status "Auto-Licht aus" = "aktiv" über den Schalter, (das ist später das TV-Gerät) wenn die Lichtszene auf "TV" steht. So wird mir in fhem angezeigt, dass die Abschaltautomatik aktiviert ist (Bedingung 1).
Schalte ich den Schalter auf "disconnect" sollen die Funzeln nach und nach mit einer Verzögerung ausgeschaltet werden /Bedingung 2).
Danach geht die "Auto-Licht-aus"-Automatik auf deaktiv (Bedingung 3).
Das Problem ist, dass ich auch auf die Lichtszene "TV" triggern muss, da es sonst passieren kann, dass zwar der TV läuft, aber die Lichtszene noch nicht auf "TV" steht. Die Szene wird nur bei Bedarf manuell eingestellt.
Da sich die Lichtszene aber ändert, wenn die erste Lampe über die Abschaltautomatik abgeschaltet wird (Szene ungleich "TV"), triggert die erste Bedingung in meinem DOIF und die Zeitverzögerung aus Bedingung 2 wird abgebrochen.
Wie kann ich das verhindern? Das habe ich noch nicht durchblickt!
Christian.
DOIF:
Internals:
CFGFN
DEF ([Schalter]eq "opened" and
[scene.EG.wz.Licht] eq "TV")
DOELSEIF
([Schalter]eq "disconnected" and
[?scene.EG.wz.Licht] eq "TV")
(set EG.wz.DI.Stehlampe off) (set EG.ku.DI.DeckenSpot off) (set EG.wz.DI.Esstisch off)
DOELSE
NAME di.01.EG.wz.TV.UE46ES8090.test
NR 1453
NTFY_ORDER 50-di.01.EG.wz.TV.UE46ES8090.test
STATE deaktiv
TYPE DOIF
Readings:
2016-11-30 11:49:57 Device scene.EG.wz.Licht
2016-11-30 11:49:55 cmd 3
2016-11-30 11:49:55 cmd_event scene.EG.wz.Licht
2016-11-30 11:49:55 cmd_nr 3
2016-11-30 11:49:33 e_Schalter_STATE disconnected
2016-11-30 11:49:57 e_scene.EG.wz.Licht_STATE unknown
2016-11-30 11:49:55 state deaktiv
2016-11-30 11:49:55 wait_timer no timer
Condition:
0 InternalDoIf($hash,'Schalter','STATE')eq "opened" and InternalDoIf($hash,'scene.EG.wz.Licht','STATE') eq "TV"
1 InternalDoIf($hash,'Schalter','STATE')eq "disconnected" and InternalDoIf($hash,'scene.EG.wz.Licht','STATE') eq "TV"
Devices:
0 Schalter scene.EG.wz.Licht
1 Schalter
all Schalter scene.EG.wz.Licht
Do:
0:
0
1:
0 set EG.wz.DI.Stehlampe off
1 set EG.ku.DI.DeckenSpot off
2 set EG.wz.DI.Esstisch off
2:
0
Helper:
event unknown
globalinit 1
last_timer 0
sleepdevice Schalter
sleepsubtimer 1
sleeptimer -1
timerdev scene.EG.wz.Licht
timerevent unknown
triggerDev scene.EG.wz.Licht
timerevents:
unknown
timereventsState:
state: unknown
triggerEvents:
unknown
triggerEventsState:
state: unknown
Internals:
0 Schalter:STATE scene.EG.wz.Licht:STATE
1 Schalter:STATE scene.EG.wz.Licht:STATE
all Schalter:STATE scene.EG.wz.Licht:STATE
Itimer:
Readings:
Regexp:
0:
1:
All:
State:
Trigger:
Attributes:
alias TV aus schaltet Licht aus
cmdState on|off|deaktiv
comment wird TV ausgeschaltet, schaltet Wohnraumlicht verzögert aus
devStateIcon .*on:general_an@lightgreen .*off:general_aus@red .*deaktiv:general_aus@grey
group Scripte
icon time_automatic
room 01-Wohnzimmer
wait 0:20,20,10:0
Du könntest den Status des DOIF mit abfragen and ([?$SELF:cmd] <> 2) (evtl. noch subcmd) , damit bekommst du eine Sperre, bevor nicht Stufe 3 erreicht ist, findet das DOIF keine passende Bedingung.
Hallo Per,
danke für Deinen Tipp. Habe es mal eingebaut, aber auch hier wird nach dem ersten Wait (also nach 20s) abgebrochen. Die anderen Wait-Timer werden nicht ausgeführt.
([Schalter]eq "opened" and
[scene.EG.wz.Licht] eq "TV")
DOELSEIF
([Schalter]eq "disconnected" and
[?scene.EG.wz.Licht] eq "TV" and [?$SELF:cmd] != 2)
(set EG.wz.DI.Stehlampe off) (set EG.ku.DI.DeckenSpot off) (set EG.wz.DI.Esstisch off)
DOELSE
Spartacus
DOIF-List
Internals:
DEF ([Schalter]eq "opened" and
[scene.EG.wz.Licht] eq "TV")
DOELSEIF
([Schalter]eq "disconnected" and
[?scene.EG.wz.Licht] eq "TV" and [?$SELF:cmd] != 2)
(set EG.wz.DI.Stehlampe off) (set EG.ku.DI.DeckenSpot off) (set EG.wz.DI.Esstisch off)
DOELSE
NAME di.01.EG.wz.TV.UE46ES8090.test
NR 1075
NTFY_ORDER 50-di.01.EG.wz.TV.UE46ES8090.test
STATE deaktiv
TYPE DOIF
Readings:
2016-11-30 20:40:55 Device scene.EG.wz.Licht
2016-11-30 20:40:00 cmd 3
2016-11-30 20:40:00 cmd_event scene.EG.wz.Licht
2016-11-30 20:40:00 cmd_nr 3
2016-11-30 20:39:38 e_Schalter_STATE disconnected
2016-11-30 20:40:55 e_scene.EG.wz.Licht_STATE TV
2016-11-30 20:40:00 state deaktiv
2016-11-30 20:40:00 wait_timer no timer
Condition:
0 InternalDoIf($hash,'Schalter','STATE')eq "opened" and InternalDoIf($hash,'scene.EG.wz.Licht','STATE') eq "TV"
1 InternalDoIf($hash,'Schalter','STATE')eq "disconnected" and InternalDoIf($hash,'scene.EG.wz.Licht','STATE') eq "TV" and ReadingValDoIf($hash,'di.01.EG.wz.TV.UE46ES8090.test','cmd') != 2
Devices:
0 Schalter scene.EG.wz.Licht
1 Schalter
all Schalter scene.EG.wz.Licht
Do:
0:
0
1:
0 set EG.wz.DI.Stehlampe off
1 set EG.ku.DI.DeckenSpot off
2 set EG.wz.DI.Esstisch off
2:
0
Helper:
event TV
globalinit 1
last_timer 0
sleepdevice Schalter
sleepsubtimer 1
sleeptimer -1
timerdev scene.EG.wz.Licht
timerevent TV
triggerDev scene.EG.wz.Licht
timerevents:
TV
timereventsState:
state: TV
triggerEvents:
TV
triggerEventsState:
state: TV
Internals:
0 Schalter:STATE scene.EG.wz.Licht:STATE
1 Schalter:STATE scene.EG.wz.Licht:STATE
all Schalter:STATE scene.EG.wz.Licht:STATE
Itimer:
Readings:
1 di.01.EG.wz.TV.UE46ES8090.test:cmd
all di.01.EG.wz.TV.UE46ES8090.test:cmd
Regexp:
0:
1:
All:
State:
Trigger:
Attributes:
alias TV aus schaltet Licht aus
cmdState on|off,off,off|deaktiv
comment wird TV ausgeschaltet, schaltet Wohnraumlicht verzögert aus
devStateIcon .*on:general_an@lightgreen .*off:general_aus@red .*deaktiv:general_aus@grey
group Scripte
icon time_automatic
room 01-Wohnzimmer
wait 0:20,20,10:0
Mach mal das DOELSE weg oder ersetz es durch ein (sinnvolles) DOELSEIF.
Hallo Per,
danke für Deine Hilfe, aber so richtig habe ich es noch nicht durchschaut!
Es klappt zwar, wenn ich das DOELSE weglasse, allerdings fehlt mir dann der dritte Status "deaktiv". Diesen muss ich dann wohl mit DOELSEIF abfackelt. Und genau da tritt dann wieder das besagte Problem auf. Wait-timer 1 läuft ab, Timer 2 und 3 werden abgebrochen und das Modul geht direkt in Bedingung 3. Vielleicht kann man das auch mit der Verriegelung abfangen, aber das verstehe ich nicht! Was genau macht dieses "[?$SELF:cmd] != 2" und wie verhindere ich, das Bedingung 3 zuschlägt, bevor die Wait-Timer 1,2 und 3 abgelaufen sind?
Christian
([Schalter]eq "opened" and
[scene.EG.wz.Licht] eq "TV")
DOELSEIF
([Schalter]eq "disconnected" and
[?scene.EG.wz.Licht] eq "TV" and [?$SELF:cmd] != 2)
(set EG.wz.DI.Stehlampe off) (set EG.ku.DI.DeckenSpot off) (set EG.wz.DI.Esstisch off)
DOELSEIF
([Schalter] and
[scene.EG.wz.Licht] ne "TV")