[GELÖST] Beleuchtungstimer + Bewegungsmelder in einem DOIF zusammen

Begonnen von FFHEM, 15 Januar 2019, 19:09:08

Vorheriges Thema - Nächstes Thema

FFHEM

Hallo zusammen,
nachdem ich mich schon stundenlang versuche, die Frage an Euch:
Ein Flurlicht soll in einem (!) DOIF zu bestimmten Zeiten, wenn es dunkel ist und außerhalb dieser Zeiten durch einen Bewegungsmelder eingeschaltet werden.
Gewissermaßen ist es die Zusammenführung in diesem Beispiel:
https://forum.fhem.de/index.php/topic,95708.0.html
Haben wir alles schon gehabt, nur möchte ich das wegen der Übersichtlichkeit in einem DOIF realisieren.

list:
Internals:
   CFGFN     
   DEF        ([merker] ne "an" and [PIRI3_Motion:"motion"] and [Tageslicht] eq "dunkel")
  (set lampe on)                             ### wait 0
  (IF ([merker] ne "an")  (set lampe off))   ### wait 100

DOELSEIF ([18:00-19:00] and [Tageslicht] eq "dunkel" )
   (set merker an, set lampe on)
   
DOELSE
   (IF ([merker] eq "an")
      (set merker aus, set lampe off)
    )
   MODEL      FHEM
   NAME       di_Treppenhaus
   NR         11331
   NTFY_ORDER 50-di_Treppenhaus
   STATE      initialize
   TYPE       DOIF
   READINGS:
     2019-01-15 19:04:16   mode            enabled
     2019-01-15 19:04:16   state           initialize
     2019-01-15 19:04:00   timer_01_c02    16.01.2019 18:00:00
     2019-01-15 19:04:00   timer_02_c02    16.01.2019 19:00:00
   Regex:
   attr:
     cmdState:
     wait:
       0:
         0
         100
     waitdel:
   condition:
     0          ::InternalDoIf($hash,'merker','STATE') ne "an" and ::EventDoIf('PIRI3_Motion',$hash,'motion',1) and ::InternalDoIf($hash,'Tageslicht','STATE') eq "dunkel"
     1          ::DOIF_time($hash,0,1,$wday,$hms) and ::InternalDoIf($hash,'Tageslicht','STATE') eq "dunkel"
   days:
   devices:
     0           merker PIRI3_Motion Tageslicht
     1           Tageslicht
     all         merker PIRI3_Motion Tageslicht
   do:
     0:
       0          set lampe on
       1          IF ([merker] ne "an")  (set lampe off)
     1:
       0          set merker an, set lampe on
     2:
       0          IF ([merker] eq "an")        (set merker aus, set lampe off)     
   helper:
     globalinit 1
     last_timer 2
     sleeptimer -1
   internals:
     0           merker:STATE Tageslicht:STATE
     1           Tageslicht:STATE
     all         merker:STATE Tageslicht:STATE
   interval:
     0          -1
     1          0
   intervalfunc:
   itimer:
   localtime:
     0          1547658000
     1          1547661600
   realtime:
     0          18:00:00
     1          19:00:00
   time:
     0          18:00:00
     1          19:00:00
   timeCond:
     0          1
     1          1
   timer:
     0          0
     1          0
   timers:
     1           0  1
   trigger:
     all         PIRI3_Motion
   triggertime:
     1547658000:
       localtime  1547658000
       hash:
     1547661600:
       localtime  1547661600
       hash:
   uiState:
   uiTable:
Attributes:
   do         resetwait
   room       Test
   wait       0,100

Und als RAW:
defmod di_Treppenhaus DOIF ([merker] ne "an" and [PIRI3_Motion:"motion"] and [Tageslicht] eq "dunkel")\
  (set lampe on)                             ### wait 0\
  (IF ([merker] ne "an")  (set lampe off))   ### wait 100\
\
DOELSEIF ([18:00-19:00] and [Tageslicht] eq "dunkel" )\
   (set merker an, set lampe on)\
   \
DOELSE\
   (IF ([merker] eq "an") \
      (set merker aus, set lampe off)\
    )
attr di_Treppenhaus do resetwait
attr di_Treppenhaus room Test
attr di_Treppenhaus wait 0,100

Dummies:
merker soll angeben, ob die Lampe von der Zeitsteuerung geschaltet wurde (an oder aus)
Tageslicht ist entweder "hell" oder "dunkel"
lampe  soll dann die Lampe sein (on oder off)

Das Problem bei obigem DOIF: Wenn während der Zeitsteuerung sich der Bewegungsmelder meldet, landet man im DOELSE und die Lampe geht aus.
Wie kann ich also im DOELSE-Zweig noch den Bewegungsmelder abfragen?
Zu beachten ist auch, dass kurz vor 18:00 Uhr eine eventuelle Bewegung nicht dazu führen darf, dass kurz nach 18:00 Uhr das Licht durch den Wait beim Bewegungsmelder wieder ausgeht.

Würde mich über Tipps sehr freuen!
Gruß
Friedhelm

Raspberry Pi 4B, Homematic, Sonoff, Shelly, Worx, Arduino, ESP8266

Otto123

#1
Hi,

ist das nicht so? Nicht getestet...
defmod di_Treppenhaus DOIF (([PIRI3_Motion:"motion"] or [18:00-19:00]) and [?Tageslicht] eq "dunkel" )(set lampe on) DOELSE (set lampe off)
attr di_Treppenhaus do resetwait
attr di_Treppenhaus room Test
attr di_Treppenhaus wait 0:100


Entweder motion oder 18:00-19:00 schalten an wenn es dunkel ist.
Ansonsten wird nach 100 sec ausgeschaltet.

Wenn Du exakt 19:00 aus haben willst müsstest Du 18:58:60 als Ende nehmen :)

Gruß Otto
Viele Grüße aus Leipzig  ⇉  nächster Stammtisch an der Lindennaundorfer Mühle
RaspberryPi B B+ B2 B3 B3+ ZeroW,HMLAN,HMUART,Homematic,Fritz!Box 7590,WRT3200ACS-OpenWrt,Sonos,VU+,Arduino nano,ESP8266,MQTT,Zigbee,deconz

FFHEM

Hallo Otto,

ich kann erst heute Abend mit einem echten Bewegungsmelder testen, aber mit einem Dummy als PIRI3_Motion funktioniert es nicht:
Wenn PIRI3_Motion auf "motion" gesetzt wird, geht die Lampe an, es wird aber kein Timer gestartet, und die Lampe geht nicht mehr aus nach 100 s.
Vermutung: wait kann man nur auf DOELSEIF-Zweige anwenden, nicht aber auf den DOELSE-Ausgang.

Gruß
Friedhelm
Raspberry Pi 4B, Homematic, Sonoff, Shelly, Worx, Arduino, ESP8266

Morgennebel

Die Lampe bleibt solange an, wie der Dummy-Melder "motion" meldet. Hast Du Deinen Dummy wieder auf "noMotion" gesetzt und dann die 100s wait-Time abgewartet?

Ciao, -MN
Einziger Spender an FHEM e.V. mit Dauerauftrag seit >= 24 Monaten

FHEM: MacMini/ESXi, 2-3 FHEM Instanzen produktiv
In-Use: STELLMOTOR, VALVES, PWM-PWMR, Xiaomi, Allergy, Proplanta, UWZ, MQTT,  Homematic, Luftsensor.info, ESP8266, ESERA

FFHEM

Hallo Otto und Morgennebel,
das war's!!!
Mir ist jetzt (hoffentlich endgültig) klar geworden, dass der eventuell laufende Timer durch den Bewegungsmelder kurz vor Eintritt der normalen Zeitspanne gelöscht wird, hatte immer noch im Hinterkopf, der würde dann da reinfunken.

Vielen Dank!!!

Gruß
Friedhelm
Raspberry Pi 4B, Homematic, Sonoff, Shelly, Worx, Arduino, ESP8266

Otto123

Moin Friedhelm,

nein, habe gerade getestet. Das Problem ist der Eventtrigger! Nur motion triggert das DOIF, der DOELSE Fall wird so außerhalb 18:00-19:00 Uhr nicht erreicht!

Du musst auf Zustand triggern, erst dann kann der nomotion Event das DOIF in den anderen Zustand setzen.


Jeder Event triggert das DOIF, das ist ok. Aber der no Motion Event vom BM darf nicht noch einmal motion enthalten (siehe Doku), dann würde sich der Zustand nicht ändern.
So wäre es aus meiner Sicht exakter:
defmod di_Treppenhaus DOIF (([PIRI3_Motion] eq "motion" or [18:00-19:00]) and [?Tageslicht] eq "dunkel" )(set lampe on) DOELSE (set lampe off)

Die komplette "Testumgebung"
defmod di_Treppenhaus DOIF (([PIRI3_Motion] eq "motion" or [18:00-19:00]) and [?Tageslicht] eq "dunkel" )(set lampe on) DOELSE (set lampe off)
attr di_Treppenhaus do resetwait
attr di_Treppenhaus room Test
attr di_Treppenhaus wait 0:100

define PIRI3_Motion dummy
attr PIRI3_Motion room Test
attr PIRI3_Motion setList motion\
nomotion

define Tageslicht dummy
attr Tageslicht room Test
setstate Tageslicht dunkel

define lampe dummy
attr lampe devStateIcon on:on:off off:off:on
attr lampe setList on\
off
attr lampe room Test
setstate lampe on


Gruß Otto
Viele Grüße aus Leipzig  ⇉  nächster Stammtisch an der Lindennaundorfer Mühle
RaspberryPi B B+ B2 B3 B3+ ZeroW,HMLAN,HMUART,Homematic,Fritz!Box 7590,WRT3200ACS-OpenWrt,Sonos,VU+,Arduino nano,ESP8266,MQTT,Zigbee,deconz

FFHEM

Moin Otto,
wenn ich in der 1. Version:
(([testdummy:"motion"] or [18:00-19:00]) and [?Tageslicht] eq "dunkel" )
    (set lampe on)
DOELSE
    (set lampe off)

z. B. um 10:00 Uhr (außerhalb der Zeiten) mit
set testdummy motion
den Bewegungsmelder simuliere, geht die Lampe an, aber ohne Timer.
Setze ich danach mit
set testdummy noMotion
wird ein Timer erzeugt mit 100 s, und die Lampe geht danach aus.
Funktioniert also eigentlich so, wie es gewollt ist.

Gruß
Friedhelm
Raspberry Pi 4B, Homematic, Sonoff, Shelly, Worx, Arduino, ESP8266

Otto123

Ok  :o
Mein Fehler, ich habe nicht noMotion sondern nomotion gesetzt.
ZitatIn diesem Beispiel wird nach dem Vorkommen von "on" innerhalb des Events gesucht. Falls "on" gefunden wird, wird der Ausdruck wahr und der if-Fall wird ausgeführt, ansonsten wird der else-if-Fall entsprechend ausgewertet.

Aber ich würde trotzdem die zweite Variante wählen, ist aus meiner Sicht exakter.
Viele Grüße aus Leipzig  ⇉  nächster Stammtisch an der Lindennaundorfer Mühle
RaspberryPi B B+ B2 B3 B3+ ZeroW,HMLAN,HMUART,Homematic,Fritz!Box 7590,WRT3200ACS-OpenWrt,Sonos,VU+,Arduino nano,ESP8266,MQTT,Zigbee,deconz

FFHEM

Hallo Otto,
werde heute abend Deine Version nehmen.
Ich bin dennoch immer noch begeistert, wie einfach das DOIF jetzt geworden ist.
Vorher bestand die Logik jahrelang aus einem ähnlichen DOIF, einem NOTIFY, einem DUMMY und einer Menge unnützer Vergleiche.
Und hatte den Nachteil, dass man vor der Zeitspanne durch den Bewegungsmelder alles wieder ausschaltete...

Vielen Dank nochmals!

Gruß
Friedhelm
Raspberry Pi 4B, Homematic, Sonoff, Shelly, Worx, Arduino, ESP8266

Otto123

Hallo Friedhelm,

ich habe nicht versucht deinen Code zu verstehen sondern deine Aufgabenbeschreibung.
Das hilft oft ungeheuer: Die alte Lösung einfach vergessen und über die eigentliche Aufgabe neu nachdenken.  ;D
Die Erde hat sich doch in der Zwischenzeit immer etwas weiter gedreht  ;D

Gruß Otto
Viele Grüße aus Leipzig  ⇉  nächster Stammtisch an der Lindennaundorfer Mühle
RaspberryPi B B+ B2 B3 B3+ ZeroW,HMLAN,HMUART,Homematic,Fritz!Box 7590,WRT3200ACS-OpenWrt,Sonos,VU+,Arduino nano,ESP8266,MQTT,Zigbee,deconz