Hauptmenü

DOIF bricht Wait-Timer ab

Begonnen von Spartacus, 30 November 2016, 12:12:30

Vorheriges Thema - Nächstes Thema

Spartacus

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
Fhem-System: 1 x raspberry PI Typ B, 1 x enOcean PI Typ B | Enocean: PTM210, FMS61NP, FAM14, 2 x FSR14-4x, FTS14-EM | LaCrosse: 2 x TX29D über Jeelink V3 | 1-Wire: 2 x DS18B20 über DS9490R

Per

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.

Spartacus

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
Fhem-System: 1 x raspberry PI Typ B, 1 x enOcean PI Typ B | Enocean: PTM210, FMS61NP, FAM14, 2 x FSR14-4x, FTS14-EM | LaCrosse: 2 x TX29D über Jeelink V3 | 1-Wire: 2 x DS18B20 über DS9490R

Per

Mach mal das DOELSE weg oder ersetz es durch ein (sinnvolles) DOELSEIF.

Spartacus

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")
Fhem-System: 1 x raspberry PI Typ B, 1 x enOcean PI Typ B | Enocean: PTM210, FMS61NP, FAM14, 2 x FSR14-4x, FTS14-EM | LaCrosse: 2 x TX29D über Jeelink V3 | 1-Wire: 2 x DS18B20 über DS9490R