Hallo,
ich habe im Bad eine Lichtsteuerung mit einem Taster HM-LC-Sw1PBU-FM und einem Bew.Mel. HM-Sen-MDIR-WM55 dank einem Codeschnipsel von Damian aus dem Forum realisieren können, nachdem meine Versuche nicht alle Fälle abdecken konnten.
([de_Bew_OG_Bad_Motion:"motion: on"] and [?de_Bew_OG_Bad_Motion:brightness] < 105) or [de_Bew_OG_Bad_Btn_Down:"Short"] or $cmd == 1.1) (set de_Bad_OG_Licht_Spiegel on) (set de_Bad_OG_Licht_Spiegel off) ## Licht über Taster oder Bewegungsmelder einschalten wenn zu dunkel. Nach wait (nach Komma) wieder ausschalten.
DOELSEIF ([de_Bew_OG_Bad_Btn_Up] =~ "Short") (set de_Bad_OG_Licht_Spiegel off) ## Ausschalten ohne Wartezeit wenn ein und Taster AUS gedrückt.
attr cmdState Bewegung | Taster Aus
attr do resetwait
attr room 2.1_OG_Bad,9.8.1_DOIF
attr timerWithWait 1
attr wait 0,240:0
Solange man sich im Bad bewegt verlängert sich das wait automatisch und das Licht bleibt an. Das geht soweit alles bis auf folgendes Problem:
Das Licht geht immer 4 Minuten nach der letztes Bewegung aus, wenn keine weietre Bewegung erkannt wird. Jetzt ist aber unsere Dusche mit satiniertem Gals ausgestattet und der Bewegungsmelder erkennt die Bewegung nicht, so dass während des Duschens das Licht ausgeht. Da ich keine Möglichkeit habe, das Duschen zu erkennen hätte ich es gerne über eine Zeitsteuerung abgefangen. Z.B.: Zwischen 6:00 und 7:30 sowie zwischen 29:30 und 22:00 Uhr soll das Licht 15 Minuten anbleiben, sonst nur 4 min.
Durch den für mich ungewöhnlichen Aufbau des Codes habe ich jetzt keinen Ansatz, wie ich das noch einbauen kann. Einen weiteren DOELSEIF-Zweig wie den ersten aber mit der Angabe eines Zeitraumes wird verm. nicht gehen, da das auslösende Event (die Bewegung) ja in beiden Zweigen dasselbe wäre und dadurch nur der ersten Zweig durchlaufen wird.
Hat jemand eine Idee, wie ich das lösen kann?
Grüße
Jürgen
Baue Dir ein zweites DOIF dessen Status 240 ist (cmdState) und zu den von Dir genannten Zeiten 900. Den Status nutzt Du als Angabe in wait:
wait erstesDOIF 0,[zweitesDOIF:state]:0
Zitat von: bmwfan am 30 Dezember 2017, 20:26:49
...Zwischen 6:00 und 7:30 sowie zwischen 29:30 und 22:00 Uhr soll das Licht 15 Minuten anbleiben, sonst nur 4 min...
Verdammt, schon wieder etwas verpasst. Ist das eine Änderung, die ab dem 1.1.2018 in Kraft tritt, oder ist das sofort, also unverzüglich?
:D ;D ???
@Ellert:
Habe es eingebaut. Mal sehen, ob es so zur Zufriedenheit der Familie klappt.
Da das DOIF (di_Duschzeiten) nach dem Initialisieren (hochfahren) noch keinen cmdstate außer initialised hat, habe ich es mit dem attr initialized 120 "versucht" vorzubelegen. Mit dem String "initialised" fängt das wait meines DOIF ja nichts an. Ich hoffe, dass dies so korrekt ist und nach dem hochfahren von FHEM der cmdstate des di_Duschzeiten nun mit einer Zahl belegt ist.
@ComputerZOO: Stimmt. Wäre ungewöhnlich.
Ich muss meinen alten Thread nochmal ausgraben, da ich folgendes Problem nicht lösen kann. Inzwischen sieht der Code so aus:
Internals:
DEF (([de_Bew_OG_Bad_Motion] eq "motion" and [?de_Bew_OG_Bad_Motion:brightness] < 110 and [?22:50-05:00]) or [de_Bew_OG_Bad_Btn_Down:"Short"] or $cmd == 1.1)
(set Licht_BadOG_Spiegel pct 50 0 20, set PushoverJuergen msg 'Bewegung im Bad OG 50 DI, Timer01c01: [di_Bad_OG_Licht_Spiegel:timer_01_c01], Timer02c01: [di_Bad_OG_Licht_Spiegel:timer_02_c01]' '' 0 '') (set Licht_BadOG_Spiegel off) ## Licht über Taster oder Bewegungsmelder mit 50 % einschalten wenn zu dunkel. Nach wait (nach Komma) wieder ausschalten
DOELSEIF (([de_Bew_OG_Bad_Motion] eq "motion" and [?de_Bew_OG_Bad_Motion:brightness] < 110 and [?05:01-22:49]) or [de_Bew_OG_Bad_Btn_Down:"Short"] or $cmd == 1.1)
(set Licht_BadOG_Spiegel pct 100 0 10, set PushoverJuergen msg 'Bewegung im Bad OG 100 DI, Timer03c02: [di_Bad_OG_Licht_Spiegel:timer_03_c02], Timer04c02: [di_Bad_OG_Licht_Spiegel:timer_04_c02]' '' 0 '') (set Licht_BadOG_Spiegel off) ## Licht über Taster oder Bewegungsmelder mit 100% Helligkeit einschalten wenn zu dunkel. Nach wait (nach Komma) wieder ausschalten
DOELSEIF ([de_Bew_OG_Bad_Btn_Up] =~ "Short") (set Licht_BadOG_Spiegel pct 0 0 10) ## Ausschalten ohne Wartezeit wenn ein und Taster AUS gedrückt (set de_Bad_OG_Licht_Spiegel off, set PushoverJuergen msg 'Taster: Das Licht im Bad ist' '[de_Bad_OG_Licht_Spiegel:state]' '' 0 '', ({Log 1, "Ausschalten"}))
FUUID 5c4c3931-f33f-6b6f-de95-e1cf1c16c9cfcdb4
MODEL FHEM
NAME di_Bad_OG_Licht_Spiegel
NOTIFYDEV de_Bew_OG_Bad_Btn_Down,global,de_Bew_OG_Bad_Btn_Up,de_Bew_OG_Bad_Motion
NR 1335
NTFY_ORDER 50-di_Bad_OG_Licht_Spiegel
STATE initialized
TYPE DOIF
VERSION 21224 2020-02-18 18:45:49
READINGS:
2020-05-01 17:27:25 Device de_Bew_OG_Bad_Motion
2020-05-01 17:21:01 cmd 0
2020-05-01 17:26:27 e_de_Bew_OG_Bad_Btn_Down_events LongRelease 1_63 (to VCCU),trigger: Long_63,trigger_cnt: 63
2020-05-01 17:27:25 e_de_Bew_OG_Bad_Motion_STATE noMotion
2020-05-01 17:21:01 mode enabled
2020-05-01 17:21:01 state initialized
2020-05-01 17:21:01 timer_01_c01 01.05.2020 22:50:00
2020-05-01 17:21:01 timer_02_c01 02.05.2020 05:00:00
2020-05-01 17:21:01 timer_03_c02 02.05.2020 05:01:00
2020-05-01 17:21:01 timer_04_c02 01.05.2020 22:49:00
Regex:
accu:
cond:
de_Bew_OG_Bad_Btn_Down:
0:
&STATE ^de_Bew_OG_Bad_Btn_Down$
1:
&STATE ^de_Bew_OG_Bad_Btn_Down$
2:
de_Bew_OG_Bad_Btn_Up:
2:
&STATE ^de_Bew_OG_Bad_Btn_Up$
de_Bew_OG_Bad_Motion:
0:
&STATE ^de_Bew_OG_Bad_Motion$
1:
&STATE ^de_Bew_OG_Bad_Motion$
2:
attr:
cmdState:
0:
Bewegung 30
1:
Bewegung hell
2:
Taster Aus
wait:
0:
0
[di_Duschzeiten:state]
1:
0
[di_Duschzeiten:state]
2:
0
condition:
0 (::InternalDoIf($hash,'de_Bew_OG_Bad_Motion','STATE') eq "motion" and ::ReadingValDoIf($hash,'de_Bew_OG_Bad_Motion','brightness') < 110 and ::DOIF_time($hash,0,1,$wday,$hms)) or ::EventDoIf('de_Bew_OG_Bad_Btn_Down',$hash,'Short',1) or $cmd == 1.1
1 (::InternalDoIf($hash,'de_Bew_OG_Bad_Motion','STATE') eq "motion" and ::ReadingValDoIf($hash,'de_Bew_OG_Bad_Motion','brightness') < 110 and ::DOIF_time($hash,2,3,$wday,$hms)) or ::EventDoIf('de_Bew_OG_Bad_Btn_Down',$hash,'Short',1) or $cmd == 1.1
2 ::InternalDoIf($hash,'de_Bew_OG_Bad_Btn_Up','STATE') =~ "Short"
days:
do:
0:
0 set Licht_BadOG_Spiegel pct 50 0 20, set PushoverJuergen msg 'Bewegung im Bad OG 50 DI, Timer01c01: [di_Bad_OG_Licht_Spiegel:timer_01_c01], Timer02c01: [di_Bad_OG_Licht_Spiegel:timer_02_c01]' '' 0 ''
1 set Licht_BadOG_Spiegel off
1:
0 set Licht_BadOG_Spiegel pct 100 0 10, set PushoverJuergen msg 'Bewegung im Bad OG 100 DI, Timer03c02: [di_Bad_OG_Licht_Spiegel:timer_03_c02], Timer04c02: [di_Bad_OG_Licht_Spiegel:timer_04_c02]' '' 0 ''
1 set Licht_BadOG_Spiegel off
2:
0 set Licht_BadOG_Spiegel pct 0 0 10
3:
helper:
DEVFILTER ^global$|^de_Bew_OG_Bad_Btn_Down$|^de_Bew_OG_Bad_Motion$|^de_Bew_OG_Bad_Btn_Up$
NOTIFYDEV global|de_Bew_OG_Bad_Btn_Down|de_Bew_OG_Bad_Motion|de_Bew_OG_Bad_Btn_Up
event motion: off,motionDuration: 62,noMotion
globalinit 1
last_timer 4
sleeptimer -1
triggerDev de_Bew_OG_Bad_Motion
triggerEvents:
motion: off
motionDuration: 62
noMotion
triggerEventsState:
motion: off
motionDuration: 62
state: noMotion
internals:
all de_Bew_OG_Bad_Motion:STATE de_Bew_OG_Bad_Btn_Up:STATE
interval:
0 -1
1 0
2 -1
3 2
intervalfunc:
localtime:
0 1588366200
1 1588388400
2 1588388460
3 1588366140
readings:
realtime:
0 22:50:00
1 05:00:00
2 05:01:00
3 22:49:00
time:
0 22:50:00
1 05:00:00
2 05:01:00
3 22:49:00
timeCond:
0 0
1 0
2 1
3 1
timer:
0 0
1 0
2 0
3 0
trigger:
all de_Bew_OG_Bad_Btn_Down
triggertime:
1588366140:
localtime 1588366140
hash:
1588366200:
localtime 1588366200
hash:
1588388400:
localtime 1588388400
hash:
1588388460:
localtime 1588388460
hash:
uiState:
uiTable:
Attributes:
cmdState Bewegung 30 | Bewegung hell | Taster Aus
do resetwait
room 2.1_OG_Bad,9.8.1_DOIF
startup set Licht_BadOG_Spiegel off
timerWithWait 1
wait 0,[di_Duschzeiten:state]:0,[di_Duschzeiten:state]:0
Es geht:
Anschalten durch Bewegung und Taster.
Verlängerung der Anschaltdauer durch Bewegung im Bad während Licht an ist.
Erneutes Anschalten des Lichtes nach Ablauf des Timers, wenn wieder Bewegung im Bad.
aber noch folgendes Problem:
Wenn das Licht über den Taster (egal, ob Taster des Dimmers oder Taster des Bewegungssensors) ausgeschalten wird und es kommt kurz danach wieder jemand ins bad, geht das Licht über den Bewegungsmelder nicht mehr an, obwohl der eine Bewegung erkennt (mitgeloggt).
Mir scheint so, als ob der laufende Timer des Dimmers verhindert, dass das neue Event des Bewegungssensors zum Triggern führt. Wenn die Zeit zwischen Ausschalten und Bewegung lange genug ist, schaltet der Sensor das Licht auch wie gewünscht an.
Ich habe jetzt schon Push-Mesages eingebaut in dem Versuch, mir die Timer anzeigen zu lassen und meine Vermutung zu verifizieren, aber vielleicht hatte ja jemand dieses Problem auch schon und bereits gelöst.
Grüße Jürgen