Lichtsteuerung mit Bewegungsmelder im Bad; DOIF

Begonnen von bmwfan, 30 Dezember 2017, 20:26:49

Vorheriges Thema - Nächstes Thema

bmwfan

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
Synology DS720+ mit Docker-Container und Haupt-FHEM, HM-LAN, Jalousienaktoren HmWired, Shelly-Devices; Raspi 3B+ mit piVCCU ohne FHEM-Instanz, CUL, JeeLink; Raspi 3B+ mit FHEM und HMUARTUSB,  Raspi 3B+ mit HMUARTGPIO, 1-wire, ebusd

Ellert

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

ComputerZOO

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 ???

bmwfan

@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.
Synology DS720+ mit Docker-Container und Haupt-FHEM, HM-LAN, Jalousienaktoren HmWired, Shelly-Devices; Raspi 3B+ mit piVCCU ohne FHEM-Instanz, CUL, JeeLink; Raspi 3B+ mit FHEM und HMUARTUSB,  Raspi 3B+ mit HMUARTGPIO, 1-wire, ebusd

bmwfan

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
Synology DS720+ mit Docker-Container und Haupt-FHEM, HM-LAN, Jalousienaktoren HmWired, Shelly-Devices; Raspi 3B+ mit piVCCU ohne FHEM-Instanz, CUL, JeeLink; Raspi 3B+ mit FHEM und HMUARTUSB,  Raspi 3B+ mit HMUARTGPIO, 1-wire, ebusd