Hauptmenü

DOIF: CheckAll-Funktionalität

Begonnen von Ellert, 21 April 2016, 17:52:22

Vorheriges Thema - Nächstes Thema

Ellert

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

dancatt

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
Cubietruck: FHEM-Server 6.0

Homematic: HM-USB-CFG2, HM-CFG-LAN, HM-LC-SW1-FM, HM-LC-Sw1-Pl-DN-R1, HM-CC-RT-DN, HM-TC-IT-WM-W-EU, HM-SEC-SC-2, HM-SEC-SD, HM-PB-6-WM55

Ellert

Wahrscheinlich fehlt das Attribut timerWithWait