Ich möchte ein minimalen State-Automaten realisieren um meine Zeit gesteuerte Beleuchtung mit einem Bewegungsmelder zu kombinieren. Dazu habe ich zwei Dummy Devices angelegt:
Internals:
CFGFN
NAME D_Motion_Treppenhaus
NR 514
STATE off
TYPE dummy
Readings:
2017-03-13 19:01:09 state off
Attributes:
icon user_unknown
room Treppenhaus
Internals:
CFGFN
NAME D_Timer_Treppenhaus_Beleuchtung
NR 362
STATE on
TYPE dummy
Readings:
2017-03-13 17:51:57 state on
Attributes:
icon light_question
room Beleuchtung,Treppenhaus
Wenn mein Bewegungsmelder eine solche detektiert dann setzt ein Notify das Dummy-Device D_Motion_Treppenhaus entsprechend auf 'on'. Wenn die Zeitschaltuhr (abhängig von der Uhrzeit, dem Wochentag und der Twilight Beleuchtung) die Beleuchtung ein- bzw. ausschaltet wird entsprechend das Dummy-Device D_Timer_Treppenhaus_Beleuchtung getriggert.
Das verknüpfen der beiden Dummy-Devices in einem DOIF will mir aber nicht gelingen:
Internals:
CFGFN
DEF ([D_Motion_Treppenhaus] eq "on" AND [D_Timer_Treppenhaus_Beleuchtung] eq "on")
(set D_Motion_Treppenhaus off)
DOELSE
(set D_Motion_Treppenhaus off, set Treppenhaus_Beleuchtung on-for-timer 213)
NAME motionControl_Treppenhaus_Beleuchtung
NR 532
NTFY_ORDER 50-motionControl_Treppenhaus_Beleuchtung
STATE initialized
TYPE DOIF
Readings:
2017-03-13 19:13:02 cmd 0
2017-03-13 19:13:02 state initialized
Condition:
0 InternalDoIf($hash,'D_Motion_Treppenhaus','STATE') eq "on" AND InternalDoIf($hash,'D_Timer_Treppenhaus_Beleuchtung','STATE') eq "on"
Devices:
0 D_Motion_Treppenhaus D_Timer_Treppenhaus_Beleuchtung
all D_Motion_Treppenhaus D_Timer_Treppenhaus_Beleuchtung
Do:
0:
0 set D_Motion_Treppenhaus off
1:
0 set D_Motion_Treppenhaus off, set Treppenhaus_Beleuchtung on-for-timer 213
Helper:
globalinit 1
last_timer 0
sleeptimer -1
Internals:
0 D_Motion_Treppenhaus:STATE D_Timer_Treppenhaus_Beleuchtung:STATE
all D_Motion_Treppenhaus:STATE D_Timer_Treppenhaus_Beleuchtung:STATE
Itimer:
Regexp:
All:
State:
Attributes:
icon edit_settings
room Beleuchtung,Treppenhaus
Setze ich D_Motion_Treppenhaus von 'off' auf 'on' hätte ich erwartet, das abhängig vom Zustand des anderen Devices, eines der beiden Commands ausgeführt würde - doch es passiert nichts...
Es gelten die Perl-Operatoren: AND gibt es nicht, probiere and ;)
Peinlich :-[ - kaum macht Mensch es richtig wird es besser ;D
Vielen Dank für die Lichtung des Nebels!
Leider immer noch nicht vollständig erfolgreich. Die DOIF Abfrage ist zwar jetzt syntaktisch richtig, sie scheint aber nicht immer 'zu feuern'. Ich kann im Log sehen, daß als heute D_Timer_Treppenhaus_Beleuchtung off war und eine Bewegung detektiert wurde (D_Motion_Treppenhaus auf 'on') das cmd_2 nicht ausgeführt wurde. Als später der Timer die Beleuchtung aktivierte und damit den Dummy D_Timer_Treppenhaus_Beleuchtung auf 'on' setze wurde offensichtlich das cmd_1 ausgeführt.
Auch wenn ich jetzt - D_Timer_Treppenhaus_Beleuchtung ist 'on' - den Dummy D_Motion_Treppenhaus manuell per 'set' auf 'on' setze wird das DOIF nicht ausgelöst...
Wie kann ich das Problem weiter eingrenzen?
Vielen Dank,
thomas
Probiere mal diese Lösung aus der Commandref zu DOIF aus:
define di_on_for_timer ([dein_bewegungs_melder:"motion"])
(set Treppenhaus_Beleuchtung on)
(set Treppenhaus_Beleuchtung off)
attr di_on_for_timer do resetwait
attr di_on_for_timer wait 0,213
Sie kommt ohne notify und ohne zusätzliche Dummys aus.
Weitere Vorteile:
- es wird nicht unnötig bei Bewegung geschaltet
- die Ausschaltzeit wird bei Bewegung verlängert, ohne dass die Lampe ausgeht