DOIF für Beleuchtungssteuerung mit Schalter beeinflussen

Begonnen von Yil, 05 Dezember 2016, 20:20:48

Vorheriges Thema - Nächstes Thema

Yil

Hallo zusammen,

ich habe mit eine automatische Innenraum-Beleuchtungssteuerung über ein DOIF-Statement zusammen gebaut. Zu den Bedingungen gehören Zeitspannen, Helligkeiten sowie die Zustände verschiedener Dummys.

define InnenraumBeleuchtung DOIF (Bedingung-für-morgens) (Anweisungen)
DOELSEIF (Bedingung-für-morgens) (Anweisungen)
DOELSEIF (Bedingung-für-morgens-bei Abwesenheit) (Anweisungen)
DOELSEIF (Bedingung-für-tagsüber) (Anweisungen)
DOELSEIF (Bedingung-für-abends) (Anweisungen)
DOELSEIF (Bedingung-für-abends-bei Abwesenheit) (Anweisungen)
DOELSEIF (Bedingung-für-spätabends) (Anweisungen)
DOELSE (Leuchten ausschalten)


Es geht in allen Bedingungen immer um die gleichen Leuchten. Nun möchte ich aus diesem Set an Leuchten einzelne durch einen weiteren Dummy ausschalten.

Konkretes Beispiel: die Beleuchtung geht Abends in verschiedenen Zimmern an. In Zimmer A sind 2 Leuchten, in Zimmer B auch, in Zimmer C ist nur eine Leuchte. Es kommt hin und wieder vor, dass im Zimmer A abends niemand ist. Dann möchte ich die Beleuchtung in diesem Zimmer ausschalten respektive wieder anschalten, wenn doch jemand das Zimmer betritt. Derzeit löse ich das über eine IF-Abfrage innerhalb eines Anweisungsblocks. Dabei stört sich DOIF daran, wenn ich mehrere Anweisungen innerhalb eines IF-Statements zusammenfasse. Für 2 Leuchten, die ich anders schalten will, muss ich also 2 IF-Statements definieren. Damit das DOIF-Statement zeitnah auf den Schalterstatus reagiert, lasse ich es mit repeatcmd 30 oft durchlaufen.

Meine Frage ist: ist das ein cleveres Vorgehen? Gibt es eine andere Form, das besser zu regeln?

Der Code sieht aktuell so aus:

([({firstAlarm()})-09:30] and [isHome] eq "on" and [Garten.Bewegung:1.BRIGHTNESS] < 180 and [AllesAus] eq 'off' and [Sommerzeit] eq 'off') (
     ({if (Value('LichtInnenAn') eq 'off') {PushInfo('Dämmerungslicht','Dämmerungslicht Morgens: eingeschaltet','Steph')}}),
     ({if (Value('LichtInnenAn') eq 'off') {Log 3,'Dämmerungslicht morgens: An'}}),
     (set Licht.AZ.Eckleuchte dim50%),
({if (Value('EZ.Licht') eq 'on') {fhem('set Licht.EZ.Stehleuchte dim75')} else {fhem('set Licht.EZ.Stehleuchte aus')}}),
({if (Value('EZ.Licht') eq 'on') {fhem('set Licht.EZ.Eckleuchte dim50%')} else {fhem('set Licht.EZ.Eckleuchte aus')}}),
     (set LichtInnenAn:FILTER=STATE=off on))
DOELSEIF ([({firstAlarm()})-09:30] and [isHome] eq "off" and [Garten.Bewegung:1.BRIGHTNESS] < 160 and [AllesAus] eq 'off' and [Sommerzeit] eq 'off') (
     ({if (Value('LichtInnenAn') eq 'off') {PushInfo('Dämmerungslicht','Dämmerungslicht Morgens (abwesend): eingeschaltet','Steph')}}),
({if (Value('LichtInnenAn') eq 'off') {Log 3,'Dämmerungslicht morgens: An'}}),
(set Licht.AZ.Eckleuchte dim50%),
(set Licht.WZ.Stehleuchte dim50%),
     (set Licht.EZ.Stehleuchte dim75%),
     (set LichtInnenAn:FILTER=STATE=off on))
DOELSEIF ([09:30-16:30] and [isHome] eq 'on' and [Garten.Bewegung:1.BRIGHTNESS] < 175 and [AllesAus] eq 'off') (
     ({if (Value('LichtInnenAn') eq 'off')  {PushInfo('Dämmerungslicht','Dämmerungslicht tagsüber: eingeschaltet','Steph')}}),
     ({if (Value('LichtInnenAn') eq 'off')  {Log 3,'Dämmerungslicht tagsüber: An'}}),
     (set Licht.WZ.Stehleuchte dim75%),
(set Licht.EZ.Stehleuchte dim75%),
(set Licht.AZ.Eckleuchte dim50%),
(set Licht.EZ.Eckleuchte dim50%),
(set ZWAVE_Schalter_8:FILTER=STATE!=on on),
     (set LichtInnenAn:FILTER=STATE!=on on))
DOELSEIF ([16:30-23:00] and [isHome] eq 'on' and [Garten.Bewegung:1.BRIGHTNESS] < 160 and [AllesAus] eq 'off') (
     ({if (Value('LichtInnenAn') eq 'off')  {PushInfo('Dämmerungslicht','Dämmerungslicht Abends: eingeschaltet','Steph')}}),
     ({if (Value('LichtInnenAn') eq 'off')  {Log 3,'Dämmerungslicht Abends: An'}}),
     (set Licht.WZ.Stehleuchte dim75%),
(set Licht.EZ.Stehleuchte dim75%), 
(set Licht.AZ.Eckleuchte dim50%),
(set Licht.EZ.Eckleuchte dim75%),
({if (Value('LichtInnenSpaeter') eq 'on')  {fhem('set ZWAVE_Schalter_8:FILTER=STATE!=on on')}}),
     (set LichtInnenAn:FILTER=STATE=off on))
DOELSEIF ([16:30-([22:45]+int(rand(1800)))] and [isHome] eq 'off' and [Garten.Bewegung:1.BRIGHTNESS] < 160 and [AllesAus] eq 'off') (
     ({if (Value('LichtInnenAn') eq 'off')  {PushInfo('Dämmerungslicht','Dämmerungslicht Abends (abwesend): eingeschaltet','Steph')}}),
     ({if (Value('LichtInnenAn') eq 'off')  {Log 3,'Dämmerungslicht Abends: An'}}),
     (set Licht.WZ.Stehleuchte dim50%),
(set Licht.EZ.Stehleuchte dim50%),
     (set Licht.AZ.Eckleuchte dim50%),
(set Licht.EZ.Eckleuchte dim50%),
(set ZWAVE_Schalter_8:FILTER=STATE!=off off),
     (set LichtInnenAn:FILTER=STATE=off on))
DOELSEIF ([23:00-({firstAlarm()})] and [isHome] eq "on" and [Garten.Bewegung:1.BRIGHTNESS] < 160 and [AllesAus] eq 'off' and [SchlafLos] eq 'an') (
     ({if (Value('LichtInnenAn') eq 'off')  {PushInfo('Dämmerungslicht','Schlafloslicht: eingeschaltet','Steph')}}),
     ({if (Value('LichtInnenAn') eq 'off')  {Log 3,'Schlafloslicht: An'}}),
     (set Licht.WZ.Stehleuchte dim25%),
(set Licht.EZ.Stehleuchte dim25%),
({if (Value('LichtInnenSpaeter') eq 'on')  {fhem('set ZWAVE_Schalter_8:FILTER=STATE!=on on')}}),
     (set LichtInnenAn:FILTER=STATE=off on))
DOELSE (
     ({if (Value('LichtInnenAn') eq 'on')  {PushInfo('Dämmerungslicht','Dämmerungslicht: ausgeschaltet','Steph')}}),
     ({if (Value('LichtInnenAn') eq 'on')  {Log 3,'Dämmerungslicht: Aus'}}),
     (set Licht.WZ.Stehleuchte aus),
(set Licht.EZ.Stehleuchte aus),
(set Licht.AZ.Eckleuchte aus),
(set Licht.EZ.Eckleuchte aus),
     ({fhem('set ZWAVE_Schalter_8:FILTER=STATE!=off off') if (Value('TV') ne 'an')}),
(set LichtInnenSpaeter:FILTER=STATE!=off off),
     (set LichtInnenAn:FILTER=STATE=on off))


Ich hatte mir überlegt, statt der IF-Abfrage einfach eine weitere DOELSEIF-Bedingung einzufügen. Wäre das eine sinnvolle Alternative?
HM CCU3 und HCU mit ca. 50 HM-Komponenten inkl. Bausätzen
fhem auf RPi mit Sonos, EnOcean-CUL, ZWAVE-CUL und Bluetooth,
HUE, UniFi

Muschelpuster

Also ganz spontan würde ich mal sagen, Du solltest Dich mal mit structure vergnügen.

spontane Grüße
Niels
fhem @ ZBOX mit 1,6MHz Celeron, 4GB RAM & 120GB SSD mit Debian Bullseye # MiLight # Homematic via CCU3 # W&T WebIO # Rademacher DuoFern # ESPeasy # logdb@mysql # configdb@mysql # Shelly @ MQTT2 # go-eCharger mit PV-Überschussladung via DOIF

Otto123

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

Brockmann

Zitat von: Yil am 05 Dezember 2016, 20:20:48
Dabei stört sich DOIF daran, wenn ich mehrere Anweisungen innerhalb eines IF-Statements zusammenfasse. Für 2 Leuchten, die ich anders schalten will, muss ich also 2 IF-Statements definieren.
Warum sollte DOIF sich daran stören? Was innerhalb seiner (Aktion) vor sich geht, ist DOIF völlig egal, solange es syntaktisch korrekt ist. Also liegt das Problem wohl eher da.
Warum verwendest Du statt if nicht IF? Dann hast Du quasi diesselbe Syntax und solltest keine Probleme damit haben.

Achja, diese Klammerei von jedem einzelnen Befehl in den Aktionen brauchst Du nur, wenn Du das wait-Attribut verwendest. Sonst kannst Du Dir das sparen. Ich finde, das macht es nicht gerade übersichtlicher...

Yil

Danke für die vielen Infos.

LightScene kannte ich nicht - hört sich gut an.

Und IF kannte ich nicht, das hört sich sogar noch besser an, denn damit entfällt ja das ständige Wechseln zwischen FHEM- und Pearl-Modus.

Wie gut, dass es hier Jungs mit soviel Ahnung gibt  :)
HM CCU3 und HCU mit ca. 50 HM-Komponenten inkl. Bausätzen
fhem auf RPi mit Sonos, EnOcean-CUL, ZWAVE-CUL und Bluetooth,
HUE, UniFi