Beleuchtungssteuerung mit Bewegungsmeldern, Schaltern und Türkontakten

Begonnen von XXL-Wing, 07 Oktober 2017, 07:44:16

Vorheriges Thema - Nächstes Thema

XXL-Wing

Hallo zusammen,

ich habe folgendes Setup (Homematic) und einen Knopf im Hirn:

Es existiert ein Schalter (HM_4E9AA9_Btn_06 --> an, HM_4E9AA9_Btn_05 --> aus), mit dem das Licht (2 HUE Lampen, HUEDevice7 und HUEDevice8) ein- und ausgeschaltet werden können soll. Wenn es manuell eingeschaltet ist, soll es auch durch Bewegungsmelder (Meldeintervall 60s) abhängige Events oder Helligkeit nicht wieder ausgeschaltet werden.

Zusätzlich existieren 2 Türkontakte (Eingangstüre HM_37B072 und die Türe zur Garage HM_4553C5), die jeweils das Licht aktivieren sollen für 3 Minuten, sofern in bzw. nach dieser Zeit der Bewegungsmelder HM_4F24C0 weiterhin motion meldet, soll das Licht solange eingeschalten bleiben, bis der Bewegungsmelder auf noMotion zurückfällt.
Während dieser Zeit soll der Schalter natürlich auch abschalten können wenn man der Meinung ist das Licht nicht mehr zu brauchen.

Als Addon soll das ganze nur dann passieren, wenn eine bestimmte Helligkeit (gemeldet vom Bewegungsmelder) unterschritten ist.

Bislang betreibe ich das Ganze mit mehreren notifys und on-for-timer mit dem blöden Nebeneffekt, dass dass dadurch dass diese nichts voneinander wissen, das Licht immer wieder ausgeht und sofort wieder angeht, obwohl die on-for-timer deutlich länger gesetzt ist als das Meldeintervall des Bewegungsmelders.

Also war mein Ansatz das mit einem (wie ich dann feststellen musste gar nicht mehr trivialen DOIF) zu lösen.

Folgenden Stand nach einigem Forum lesen habe ich (der aber leider so überhaupt nichts tut):


(
(([HM_37B072:?open]) or ([HM_4553C5:?open])) and
([HM_4F24C0:brightness < 90])
)(
  set HUEDevice7 on, set HUEDevice8 on
)
DOELSEIF
([HM_4E9AA9_Btn_06:?Short.*]
)(
  set HUEDevice7 on, set HUEDevice8 on
)
DOELSEIF
([HM_4E9AA9_Btn_05:?Short.*]
)(
  set HUEDevice7 off, set HUEDevice8 off
)
DOELSEIF
(([HM_4F24C0:?motion]) and
([HM_4F24C0:brightness < 90]) and
(([$SELF:cmd] != 2 ) or ([HUEDevice7:state] eq "off" ))
)(
  set HUEDevice7 on, set HUEDevice8 on
)(
  set HUEDevice7 off, set HUEDevice8 off
)


Weitere DOIF Einstellungen:
cmdState = set on|set off|set on-for-timer,waiting
do = always
wait = 0:0:0:3,0

Bitte um Hilfe, danke!
--> Wäre vermutlich auch ein nettes komplexeres Beispiel für DOIF um anderen zu helfen.

lG
Mike

Ellert

Syntaktisch fällt mir folgendes auf

([HM_37B072:?open]) or ([HM_4553C5:?open])
Die runden Klammern sind unnötig.
[HM_4E9AA9_Btn_06:?Short.*]
? soll für Events nicht mehr benutzt werden.
[HM_4F24C0:brightness < 90]
Die rechte eckige Klammer steht an falscher Stelle.

ZitatFolgenden Stand nach einigem Forum lesen habe ich

Und hast Du auch mal in der Befehlsreferenz gelesen?

XXL-Wing

Hallo Ellert,

danke für den Hinweis :-)
Ich habe so lange an dem Ding herumgedoktert dass es in Wahrheit schon so vermurxt ist dass es sich auszahl alles nochmal im Detail anzusehen.

Mittlerweile funktioniert es wie es sollte.
Korrigierter Code:

(
([HM_37B072:"open"] or [HM_4553C5:"open"]) and
([HM_4F24C0:brightness] < 90)
)(
  set HUEDevice7 on, set HUEDevice8 on
)(
  set HUEDevice7 off, set HUEDevice8 off
)
DOELSEIF
([HM_4E9AA9_Btn_06:"Short.*"]
)(
  set HUEDevice7 on, set HUEDevice8 on
)
DOELSEIF
([HM_4E9AA9_Btn_05:"Short.*"]
)(
  set HUEDevice7 off, set HUEDevice8 off, set HM_4F24C0 noMotion
)
DOELSEIF
( [HM_4F24C0:"motion"] and ([HM_4F24C0:brightness] < 90)
)(
  set HUEDevice7 on, set HUEDevice8 on
)(
  set HUEDevice7 off, set HUEDevice8 off
)


Korrekte Settings:


cmdState set on-for-timer|set on|set off|set on-for-timer,waiting
do resetwait
wait 0,180:0:0:0,180

XXL-Wing

Wobei noch nicht ganz....

Wie ich es hinbekomme, dass die Lampe eingeschaltet bleibt wenn die manuell eingeschaltet wurde fehlt jetzt noch.. da hab ich noch keine Idee dazu.
Wenn ich auf schon an abfrage beim motion event dann habe ich den alten effekt dass die lampe erst ausgehen muss bevor sie retriggered wird

Ellert

... übrigens, die runden Klammern um den Vergleich sind auch nicht erforderlich.

Du könntest den Status in ein Reading schreiben und im Befehl dann abfragen.

DOELSEIF
( [HM_4F24C0:"motion"] and ([HM_4F24C0:brightness] < 90)
)(
  setreading $SELF T_emp7 [HUEDevice7], setreading $SELF T_emp8 [HUEDevice8],
  set HUEDevice7 on, set HUEDevice8 on
)(
  IF (ReadingsVal("$SELF", "T_emp7", "off") eq "off")  (set HUEDevice7 off),
  IF (ReadingsVal("$SELF", "T_emp8", "off") eq "off")  (set HUEDevice8 off)
)


So in etwa

Per

Zitat von: Ellert am 07 Oktober 2017, 14:34:30
  IF (ReadingsVal("$SELF", "T_emp7", "off") eq "off")  (set HUEDevice7 off),
  IF (ReadingsVal("$SELF", "T_emp8", "off") eq "off")  (set HUEDevice8 off)

Oder

  set HUEDevice7:FILTER=STATE!=[$SELF:T_emp7] [$SELF:T_emp7],
  set HUEDevice8:FILTER=STATE!=[$SELF:T_emp8] [$SELF:T_emp8]


Damit bist du sogar für den "on-Fall" vorbereitet ;).
Evtl. ein
attr DOIF-Name notexist off
anfügen.