FHEM Forum

FHEM => Automatisierung => DOIF => Thema gestartet von: Ellert am 21 April 2016, 17:52:22

Titel: DOIF: CheckAll-Funktionalität
Beitrag von: Ellert am 21 April 2016, 17:52:22
Die CheckAll-Funktionalität wird immer mal wieder nachgefragt, hier wird ein Weg aufgezeigt wie CheckAll nachgebildet werden kann.

Das nachstehende DOIF prüft bei einem Trigger alle Bedingungen und führt die zugehörigen Befehle aus, wenn die Bedingung wahr ist.

(["^(du1|du2|du3)$"] and $cmd =~ "0|8") ## Starttrigger: alle im DOIF triggernden Geräte, initialized oder Endzustand

##Erster CheckAll-Abschnitt
DOELSEIF ([$SELF:cmd] =~ "1" and [du1] eq "on" ) ## Zustand 1 und Bedingung ist wahr, triggert
DOELSEIF ([$SELF:cmd] =~ "1" and !([du1] eq "on")) ##Zustand 1 und Bedingung ist unwahr, triggert

##Zweiter CheckAll-Abschnitt
DOELSEIF ([$SELF:cmd] =~ "2|3" and [du2] eq "x1" ) ##Zustand 2 o. 3 und Bedingung ist wahr, triggert
DOELSEIF ([$SELF:cmd] =~ "2|3" and !([du2] eq "x1")) ##Zustand 2 o. 3 und Bedingung ist unwahr, triggert

##Dritter CheckAll-Abschnitt
DOELSEIF ([$SELF:cmd] =~ "4|5" and [du3] eq "x1" ) ##Der vorhergehende Zustand des CheckAll-Abschnitts für wahr o. unwahr und Bedingung ist wahr, triggert
DOELSEIF ([$SELF:cmd] =~ "4|5" and !([du3] eq "x1")) ##Der vorhergehende Zustand des CheckAll-Abschnitts für wahr o. unwahr und Bedingung ist unwahr, triggert

##ggf. weitere CheckAll-Abschnitte

DOELSEIF ([$SELF:cmd] =~ "6|7") ##Endzustand nach CheckAll, es triggern die beiden Bedingungszweige des letzten CheckAll-Abschnittes

## du1, du2, du3 sind Dummys, stellvertretend für eigene triggernde Geräte. Den Bedingungen sollten nur Befehle folgen, die nicht in die Selbsttriggerung eingreifen
## Die Bedingungen, wie im ersten CheckAll-Abschnitt [du1] eq "on" und die komplementäre Bedingung !([du1] eq "on"), stehen für beliebige eigene Bedingungen und deren Komplement.
## Die komplementäre Bedingung ist erforderlich, damit im Falle einer unwahren Bedingung weitergeschaltet wird.
## Für dieses DOIF muss die Selbsttriggerung eingeschaltet sein und für jeden Bedingungszweig muss ein Wait-Timer gesetzt werden.
## selftrigger wait
## wait .1:.1:.1:.1:.1:.1:.1:.1
Titel: Antw:DOIF: CheckAll-Funktionalität
Beitrag von: dancatt am 13 Mai 2016, 10:36:56
Moin,

ich würde dies gerne mal testen, aber irgendwie scheint immer nur das Erste zu triggern:

Internals:
   CFGFN
   DEF        ([10:29] and $cmd =~ "0|5")
({Log 3,"1 Events $EVENTS"})
##1. Homeoffice
DOELSEIF ([$SELF:cmd] =~ "1")
({Log 3,"2 Events $EVENTS"})
##2. Schulfrei
DOELSEIF ([$SELF:cmd] =~ "2")
({Log 3,"3 Events $EVENTS"})
##3. Krank
DOELSEIF ([$SELF:cmd] =~ "3")
({Log 3,"4 Events $EVENTS"})
DOELSEIF ([$SELF:cmd] =~ "4")
({Log 3,"5 Events $EVENTS"})
   NAME       doif_Heizungstest
   NR         320
   NTFY_ORDER 50-doif_Heizungstest
   STATE      cmd_1
   TYPE       DOIF
   Helper:
     Dblog:
       Cmd:
         Dblog:
           TIME       1463128140.0269
           VALUE      1
       Cmd_event:
         Dblog:
           TIME       1463128140.0269
           VALUE      timer_1
       Cmd_nr:
         Dblog:
           TIME       1463128140.0269
           VALUE      1
       State:
         Dblog:
           TIME       1463128140.0269
           VALUE      cmd_1
   Readings:
     2016-05-13 10:29:00   cmd             1
     2016-05-13 10:29:00   cmd_event       timer_1
     2016-05-13 10:29:00   cmd_nr          1
     2016-05-13 10:29:00   state           cmd_1
     2016-05-13 10:29:00   timer_1_c1      14.05.2016 10:29:00
   Condition:
     0          DOIF_time_once($hash,$hash->{timer}{0},$wday,"") and $cmd =~ "0|5"
     1          ReadingValDoIf($hash,'doif_Heizungstest','cmd','','',AttrVal($hash->{NAME},'notexist',undef)) =~ "1"
     2          ReadingValDoIf($hash,'doif_Heizungstest','cmd','','',AttrVal($hash->{NAME},'notexist',undef)) =~ "2"
     3          ReadingValDoIf($hash,'doif_Heizungstest','cmd','','',AttrVal($hash->{NAME},'notexist',undef)) =~ "3"
     4          ReadingValDoIf($hash,'doif_Heizungstest','cmd','','',AttrVal($hash->{NAME},'notexist',undef)) =~ "4"
   Days:
   Devices:
     1           doif_Heizungstest
     2           doif_Heizungstest
     3           doif_Heizungstest
     4           doif_Heizungstest
     all         doif_Heizungstest
   Do:
     0:
       0          {Log 3,"1 Events $EVENTS"}
     1:
       0          {Log 3,"2 Events $EVENTS"}
     2:
       0          {Log 3,"3 Events $EVENTS"}
     3:
       0          {Log 3,"4 Events $EVENTS"}
     4:
       0          {Log 3,"5 Events $EVENTS"}
   Helper:
     event      timer_1
     globalinit 1
     last_timer 1
     sleeptimer -1
     timerdev
     timerevent timer_1
     timereventsState
     triggerDev
     timerevents:
       timer_1
     triggerEvents:
       timer_1
   Internals:
   Interval:
   Itimer:
   Localtime:
     0          1463214540
   Readings:
     1           doif_Heizungstest:cmd
     2           doif_Heizungstest:cmd
     3           doif_Heizungstest:cmd
     4           doif_Heizungstest:cmd
     all         doif_Heizungstest:cmd
   Realtime:
     0          10:29:00
   Regexp:
     All:
   State:
   Time:
     0          10:29:00
   Timecond:
     0          0
   Timer:
     0          0
   Timers:
     0           0
   Triggertime:
     1463214540:
       localtime  1463214540
       Hash:
Attributes:
   loglevel   6
   notexist   novalue
   room       0_02_Heizung
   selftrigger wait
   wait       wait .1:.1:.1:.1:.1


Was mache ich falsch?

Danke und Gruß Daniel
Titel: Antw:DOIF: CheckAll-Funktionalität
Beitrag von: Ellert am 13 Mai 2016, 14:49:10
Wahrscheinlich fehlt das Attribut timerWithWait