FHEM Forum

FHEM => Automatisierung => DOIF => Thema gestartet von: Spartacus am 30 November 2016, 12:12:30

Titel: DOIF bricht Wait-Timer ab
Beitrag von: Spartacus am 30 November 2016, 12:12:30
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
Titel: Antw:DOIF bricht Wait-Timer ab
Beitrag von: Per am 30 November 2016, 13:06:22
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.
Titel: Antw:DOIF bricht Wait-Timer ab
Beitrag von: Spartacus am 30 November 2016, 20:44:15
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
Titel: Antw:DOIF bricht Wait-Timer ab
Beitrag von: Per am 01 Dezember 2016, 12:44:14
Mach mal das DOELSE weg oder ersetz es durch ein (sinnvolles) DOELSEIF.
Titel: Antw:DOIF bricht Wait-Timer ab
Beitrag von: Spartacus am 01 Dezember 2016, 17:00:29
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")