[GELÖST] Denkanstoß für DOIF mit mehreren Variablen benötigt

Begonnen von SpearOfDestiny, 13 Juli 2022, 10:04:02

Vorheriges Thema - Nächstes Thema

SpearOfDestiny

Hallo,

ich habe vor kurzem meine kabelgebundenen Bewegungsmelder wegen eines Defektes ausgemustert und gegen Intertechno PIR-6000 getauscht,
da ich bereits seit längerem meine alten Funksteckdosen und -Schalter im Innen- & Aussenbereich mit FHEM/Alexa steuere.

Nun habe ich 3 Bewegungsmelder welche meinem FHEM für 5 Sek. ein "on" mitteilen, danach wieder auf "off" schalten.
Einer ist vor dem Haus, einer auf der Terasse und einer in der Einfahrt.
Die Detektion läuft quasi den ganzen Tag, wird über twilight (sunset) jedoch auf die Abend- und Nachtstunden beschränkt.
Da ich unser Aussenlicht aber gerne auch händisch schalten können mag, habe ich hierfür ein eigenes Device konfiguriert.
Logischerweise soll die Automation zusätzlich zur zeitlichen Beschränkung auch inaktiv bleiben, wenn dieses Device "an" ist.

Eigentlich funktioniert ja alles, aber es gibt da so zwei Sachen welche mir nicht gefallen.

Das zuerst ausgelöste Device schaltet automatisch das Licht aus, auch wenn ein weiteres Device ausgelöst hat.
Manchmal gehe ich morgens aus dem Haus, es ist schon hell und das Licht ist noch immer an.
Schau ich in FHEM, ist manchmal das Device fürs Licht noch an, manchmal aber auch aus.
Ich habe im DOIF mal noch via "sleep" einen zweiten Schaltbefehl eingegeben,
jedoch friert mir dabei das komplette FHEM für die dauer des sleep ein.

Ich hab an dem Server ein RFXtrx433 als Funkmodul.

   Die Logik soll abhängig vom "aus"-Zustand von Aussenlicht
   ab 30 Minuten vor SunSet bis SunRise
   bei Detektion eines Melders für 3 Minuten das Device PIR6K_Licht auf "an" stellen
   und nach dem "off" des zuletzt detektierten Melders sicher wieder aus schalten.

So, nun  zum Code:

define AussenLicht TRX_LIGHT ARC L1 light
attr AussenLicht IODev RFXtrx433XL

define PIR6K_Licht TRX_LIGHT ARC L1 light
attr PIR6K_Licht IODev RFXtrx433XL

define TRX_AC_00299ac30a TRX_LIGHT AC 00299ac30a light
attr TRX_AC_00299ac30a alias PIR6K_Einfahrt
define TRX_AC_002a1edb0a TRX_LIGHT AC 002a1edb0a light
attr TRX_AC_002a1edb0a alias PIR6K_Vorne
define TRX_AC_002a2b830a TRX_LIGHT AC 002a2b830a light
attr TRX_AC_002a2b830a alias PIR6K_Terasse

define PIREinfahrt DOIF ([{sunset(-1800)}-{sunrise(+0)}] and [AussenLicht] eq "off" and [TRX_AC_00299ac30a] eq "on") (set PIR6K_Licht on-for-timer 180)
attr PIREinfahrt devStateIcon cmd_1:general_an@green:cmd_2 cmd_2|initialized:general_aus@red:cmd_1
attr PIREinfahrt icon helper_doif
define PIRVorne DOIF ([{sunset(-1800)}-{sunrise(+0)}] and [AussenLicht] eq "off" and [TRX_AC_002a1edb0a] eq "on") (set PIR6K_Licht on-for-timer 180)
attr PIRVorne devStateIcon cmd_1:general_an@green:cmd_2 cmd_2|initialized:general_aus@red:cmd_1
attr PIRVorne icon helper_doif
define PIRTerrasse DOIF ([{sunset(-1800)}-{sunrise(+0)}] and [AussenLicht] eq "off" and [TRX_AC_002a2b830a] eq "on") (set PIR6K_Licht on-for-timer 180)
attr PIRTerrasse devStateIcon cmd_1:general_an@green:cmd_2 cmd_2|initialized:general_aus@red:cmd_1
attr PIRTerrasse icon helper_doif

Ich hoffe, ich habe nicht zu kompliziert erklärt.
Vielen Dank für Eure Zeit, ich hänge gerade echt fest.

MfG

Damian

#1
Ich würde alles über ein DOIF regeln, da du nur ein Device schaltest. Schalter soll die Automatik übersteuern.

DOIF ([?{sunset(-1800)}-{sunrise(+0)}] and [schalter] eq "on" ) (set PIR6K_Licht on)
DOELSEIF  ([?{sunset(-1800)}-{sunrise(+0)}] and [?schalter] eq "off" and ["^TRX_AC_00:on"]) (set PIR6K_Licht on) (set PIR6K_Licht off) (set PIR6K_Licht  off)
DOELSEIF ([schalter] eq "off") (set PIR6K_Licht off)

attr wait 0:0,180,1:0


wait ersetzt hier geschickt sleep und on-for-timer.

Wenn schalter auf "on" geschaltet wird, dann wird Licht dauerhaft auf "on" geschaltet, bei Bewegung eines der Bewegungsmelder geht das Licht für drei Minuten an bzw. wird auf drei Minuten verlängert, danach wird zwei mal mit Abstand von einer Sekunde zur Sicherheit "off" gesendet.
Wenn schalter auf off geschaltet wird, dann wird Licht ausgeschaltet.

Durch die Definition nur in einem DOIF ist jeder Zustand eindeutig und schließt sich gegenseitig aus.
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

SpearOfDestiny

Hallo Damian,

vielen herzlichen Dank.

Deine Lösung war einfach und funktioniert perfekt.
Ich habe bei meinem Lösungsansatz wohl zu kompliziert gedacht.

LG