Hallo!
Ich benötige mal einen Denkanstoss...
Ich habe das Beispiel von hier: https://wiki.fhem.de/wiki/DOIF/Einsteigerleitfaden,_Grundfunktionen_und_Erl%C3%A4uterungen#Beispiel_C.29:_Kombinierte_Ereignis-_und_Zeitsteuerung
etwas verändert um auch nach Helligkeit mit einer "hysterese" die Weihnachtsbeleuchtung zu schalten.
Zusätzlich möchte ich auch noch einen Taster verwenden, der die Beleuchtung für eine Stunde einschaltet. Hier mal meine Spielwiese:
defmod sensor dummy
attr sensor alias Helligkeitssensor
attr sensor group C) Kombinierte Ereignis- und Zeitsteuerung
attr sensor icon message_light_intensity
attr sensor readingList brightness
attr sensor room Weihnachten
attr sensor setList brightness:slider,0,10,15000
attr sensor stateFormat brightness
attr sensor webCmd brightness
setstate sensor 12650
setstate sensor 2019-12-16 15:39:34 brightness 12650
defmod lamp dummy
attr lamp alias Lampe
attr lamp group C) Kombinierte Ereignis- und Zeitsteuerung
attr lamp icon light_light
attr lamp room Weihnachten
attr lamp webCmd on:off
setstate lamp off
setstate lamp 2019-12-16 15:40:09 state off
defmod Weihnachtsbeleuchtung_Einstellung dummy
attr Weihnachtsbeleuchtung_Einstellung group Kombinierte Ereignis- und Zeitsteuerung
attr Weihnachtsbeleuchtung_Einstellung readingList start end hysterese helligkeit
attr Weihnachtsbeleuchtung_Einstellung room Weihnachten
attr Weihnachtsbeleuchtung_Einstellung setList start:time end:time hysterese:slider,0,500,5000 helligkeit:slider,0,500,25000
attr Weihnachtsbeleuchtung_Einstellung stateFormat start - end <br>\
Hell: helligkeit<br>\
Hysterese: hysterese\
attr Weihnachtsbeleuchtung_Einstellung webCmd start:end:helligkeit:hysterese
attr Weihnachtsbeleuchtung_Einstellung webCmdLabel Von:Bis\
:Helligkeit\
:Hysterese
setstate Weihnachtsbeleuchtung_Einstellung 06:30 - 09:00 <br>\
Hell: 10000<br>\
Hysterese: 1000\
setstate Weihnachtsbeleuchtung_Einstellung 2019-12-16 14:47:16 end 09:00
setstate Weihnachtsbeleuchtung_Einstellung 2019-12-16 14:09:34 helligkeit 10000
setstate Weihnachtsbeleuchtung_Einstellung 2019-12-16 14:09:37 hysterese 1000
setstate Weihnachtsbeleuchtung_Einstellung 2019-12-15 17:42:21 start 06:30
setstate Weihnachtsbeleuchtung_Einstellung 2019-12-15 12:39:46 state start 15:30
defmod di_lamp DOIF ##1 - Zeit und Helligkeit\
([[Weihnachtsbeleuchtung_Einstellung:start]-[Weihnachtsbeleuchtung_Einstellung:end]] and \
[sensor] < ([Weihnachtsbeleuchtung_Einstellung:helligkeit] - [Weihnachtsbeleuchtung_Einstellung:hysterese])) (\
set lamp on\
)\
##2 - Hysterese\
DOELSEIF ([[Weihnachtsbeleuchtung_Einstellung:start]-[Weihnachtsbeleuchtung_Einstellung:end\
]] and [sensor] <= [Weihnachtsbeleuchtung_Einstellung:helligkeit])(\
## Nichts unternehmen! Zwischenzustand!\
)\
##3 - Hell - AUS\
DOELSEIF ([[Weihnachtsbeleuchtung_Einstellung:start]-[Weihnachtsbeleuchtung_Einstellung:end\
]] and [sensor] > [Weihnachtsbeleuchtung_Einstellung:helligkeit])(\
set lamp off\
)\
##4 - Manuell eingeschaltet\
##Nach 60Min abschalten\
DOELSEIF ([[Weihnachtsbeleuchtung_Einstellung:end]-[Weihnachtsbeleuchtung_Einstellung:start]] and [lamp:"on"])(\
sleep 0;; set lamp off;;\
)\
##5 - Nach der eingestellten Zeit\
DOELSE (\
set lamp off\
)
attr di_lamp checkall all
attr di_lamp devStateIcon 1
attr di_lamp group Kombinierte Ereignis- und Zeitsteuerung
attr di_lamp icon helper_doif
attr di_lamp room Weihnachten
attr di_lamp stateFormat state\
wait_timer
attr di_lamp wait 1:1:1:30:0
setstate di_lamp cmd_5\
no timer
setstate di_lamp 2019-12-16 15:40:09 Device lamp
setstate di_lamp 2019-12-15 12:10:48 EndZeit 22:15
setstate di_lamp 2019-12-15 11:58:32 StartZeit 06:15
setstate di_lamp 2019-12-16 15:40:09 cmd 5
setstate di_lamp 2019-12-16 15:40:09 cmd_event lamp
setstate di_lamp 2019-12-16 15:40:09 cmd_nr 5
setstate di_lamp 2019-12-16 15:40:09 e_lamp_events off
setstate di_lamp 2019-12-16 15:39:34 e_sensor_STATE 12650
setstate di_lamp 2019-12-16 15:37:53 mode enabled
setstate di_lamp 2019-12-16 15:40:09 state cmd_5
setstate di_lamp 2019-12-16 15:37:53 timer_01_c01 17.12.2019 06:30:00
setstate di_lamp 2019-12-16 15:37:53 timer_02_c01 17.12.2019 09:00:00
setstate di_lamp 2019-12-16 15:37:53 timer_03_c02 17.12.2019 06:30:00
setstate di_lamp 2019-12-16 15:37:53 timer_04_c02 17.12.2019 09:00:00
setstate di_lamp 2019-12-16 15:37:53 timer_05_c03 17.12.2019 06:30:00
setstate di_lamp 2019-12-16 15:37:53 timer_06_c03 17.12.2019 09:00:00
setstate di_lamp 2019-12-16 15:37:53 timer_07_c04 17.12.2019 09:00:00
setstate di_lamp 2019-12-16 15:37:53 timer_08_c04 17.12.2019 06:30:00
setstate di_lamp 2019-12-16 15:40:09 wait_timer no timer
Die Steuerung nach Helligkeit und Zeit funktioniert.
Die Steuerung mit dem Taster außerhalb der Zeiten (cmd_4) funktioniert nicht so richtig.
Wird die Lampe manuell eingeschaltet, wird der interne Timer gestartet. Allerdings wird dieser wieder abgebrochen, wenn während der Wartezeit eine Helligkeitsänderung stattfindet.
Wenn ich es richtig verstanden habe, müsste doch durch das Attribut "checkall all" wieder der Zweig "cmd 4" aufgerufen werden? Allerdings würde dann die Zeit niemals ablaufen, da Helligkeitsänderungen laufend vorhanden sind.
1.) Welchen Denkfehler habe ich hier?
2.) Wie könnte ich das besser lösen, das auch Tagsüber (also innerhalb der Zeit) das Licht für eine Stunde eingeschaltet werden kann?
Gruß
Bismosa
A: Reihenfolge ändern (ist hier nur für die Übersicht und einfachere Wartung), den manuellen Zweig nach oben. Dazu einen zweiten Command-Teil fürs Ausschalten
B: DOELSE-Zweig löschen (Ausschalten anders lösen)
C: Zusätzlich abfragen, ob das DOIF nicht im cmd 1_1 ist, nur dann darf ein anderer Status (inkl. Command) eingenommen werden.
Hallo!
Danke für den Denkanstoss! Ich glaube ich habe es nun hinbekommen:
Erstmal habe ich genauer aufgeschrieben, worauf ich hinaus möchte:
Die Automatik hat Vorrang. Wir allerdings manuell eingeschaltet, wird die Helligkeit für eine Stunde nicht berücksichtigt.
Nur bei Ablauf der Zeit wird die Manuelle Schaltung unterbrochen.
Nach der Stunde Manueller betrieb wird nur abgeschaltet, wenn es nicht wieder innerhalb des Zeitraums dunkel geworden ist.
Hell 0 -> Dunkel
Zeit 0 -> Außerhalb
Manuell 1 -> Manuell eingeschaltet
Hell | Zeit | Manuell | Lampe
0 | 0 | 0 | 0
0 | 0 | 1 | 1 (1h)
0 | 1 | 0 | 1
0 | 1 | 1 | 1 (Vorrang Automatik)
1 | 0 | 0 | 0
1 | 0 | 1 | 1 (1h)
1 | 1 | 0 | 0
1 | 1 | 1 | 1 (1h)
Zustände
* darf in dieses Zustand wechseln, auch wenn Manuell an
# darf nicht in den Zustand "Manuell 1h an" wechseln
1 -> Manuell an -> 1h an
2 -> Zeit und Helligkeit -> an #
3 -> Hysterese #
4 -> Wieder dunkel -> aus
5 -> Zeit abgelaufen -> aus *
defmod di_lamp DOIF \
##1 - Manuell eingeschaltet\
##Nach 60Min abschalten,\
([lamp:"on"] and ([$SELF:state] ne "cmd_2") and ([$SELF:state] ne "cmd_3"))\
(\
##Nur abschalten, wenn nicht mittlerweile wieder Dunkel und im Automatikzeitfenster\
if ((not ($hms gt ("[Weihnachtsbeleuchtung_Einstellung:start]") and $hms lt ("[Weihnachtsbeleuchtung_Einstellung:end]"))) or \
[sensor] > [Weihnachtsbeleuchtung_Einstellung:helligkeit]) \
(set lamp off)\
)\
\
##2 - Zeit und Helligkeit\
DOELSEIF ( [$SELF:wait_timer] !~ "cmd_1 lamp" and\
[[Weihnachtsbeleuchtung_Einstellung:start]-[Weihnachtsbeleuchtung_Einstellung:end]] and \
[sensor] < ([Weihnachtsbeleuchtung_Einstellung:helligkeit] - [Weihnachtsbeleuchtung_Einstellung:hysterese])) \
(\
IF ([lamp] ne "on") (set lamp on)\
)\
##3 - Hysterese\
DOELSEIF ( [$SELF:wait_timer] !~ "cmd_1 lamp" and \
[[Weihnachtsbeleuchtung_Einstellung:start]-[Weihnachtsbeleuchtung_Einstellung:end]] and \
[sensor] <= [Weihnachtsbeleuchtung_Einstellung:helligkeit])\
(\
## Nichts unternehmen! Zwischenzustand!\
)\
##4 - Hell - AUS\
DOELSEIF ( [$SELF:wait_timer] !~ "cmd_1 lamp" and\
[[Weihnachtsbeleuchtung_Einstellung:start]-[Weihnachtsbeleuchtung_Einstellung:end]] and \
[sensor] > [Weihnachtsbeleuchtung_Einstellung:helligkeit])\
(\
IF ([lamp] ne "off") (set lamp off)\
)\
##5 - Nach der eingestellten Zeit\
DOELSEIF ([[Weihnachtsbeleuchtung_Einstellung:end]])\
(\
IF ([lamp] ne "off") (set lamp off)\
)\
attr di_lamp checkall all
attr di_lamp devStateIcon 1
attr di_lamp do resetwait
attr di_lamp group Kombinierte Ereignis- und Zeitsteuerung
attr di_lamp icon helper_doif
attr di_lamp room Weihnachten
attr di_lamp stateFormat state\
wait_timer
attr di_lamp wait 10:1:1:1
setstate di_lamp cmd_4\
no timer
setstate di_lamp 2019-12-19 10:40:58 Device sensor
setstate di_lamp 2019-12-19 10:40:59 cmd 4
setstate di_lamp 2019-12-19 10:40:59 cmd_event sensor
setstate di_lamp 2019-12-19 10:40:59 cmd_nr 4
setstate di_lamp 2019-12-19 10:40:47 e_lamp_events on
setstate di_lamp 2019-12-19 10:40:58 e_sensor_STATE 14460
setstate di_lamp 2019-12-19 10:39:48 mode enabled
setstate di_lamp 2019-12-19 10:40:59 state cmd_4
setstate di_lamp 2019-12-19 10:39:48 timer_01_c02 20.12.2019 06:30:00
setstate di_lamp 2019-12-19 10:39:48 timer_02_c02 19.12.2019 19:22:00
setstate di_lamp 2019-12-19 10:39:48 timer_03_c03 20.12.2019 06:30:00
setstate di_lamp 2019-12-19 10:39:48 timer_04_c03 19.12.2019 19:22:00
setstate di_lamp 2019-12-19 10:39:48 timer_05_c04 20.12.2019 06:30:00
setstate di_lamp 2019-12-19 10:39:48 timer_06_c04 19.12.2019 19:22:00
setstate di_lamp 2019-12-19 10:39:48 timer_07_c05 19.12.2019 19:22:00
setstate di_lamp 2019-12-19 10:40:59 wait_timer no timer
Ich hoffe ich habe nun alle Zustände getestet...es scheint zu funktionieren :)
Gruß
Bismosa