Guten Tag,
ich möchte meine Flurlichtschaltung für eine Lampe verändern, aber es gelingt mir nicht ganz bis zum letzten Punkt. Da ich jetzt schon über 3 Stunden experimentiere: kann mir jemand einen Tipp geben?
Ausgangslage:
1. Ein HM-Bewegungsmelder "PIRI2". Dieser liefert "motion" und nach 60 s "noMotion"
2. 1 Tageshelligkeitsdummy Werte: 0 (dunkel) 25 (dämmrig), 50 (fast hell), 100 hell. 0 und 25 sind die dunklen Werte.
Gewünscht ist:
1. Morgens von 06:00 Uhr bis 10:00 Uhr soll, nur, wenn der PIR Bewegung (einmal reicht aus) erkannt hat, das Licht solange anbleiben, bis 10:00 Uhr erreicht ist oder die Helligkeit > 25 ist, danach Lampe aus. Wenn keine Bewegung in der Zeit erkannt wurde, bleibt das Licht die ganze Zeit aus.
2. Von 12:00 - 22:00 soll das Licht unabhängig vom PIR angehen, sobald die Helligkeit <= 25 ist. Um 22:00 Uhr soll die Lampe aus gehen.
3. Zu allen anderen Zeiten soll das Licht bei Bewegung für 5 Minuten angehen, wenn die Helligkeit <= 25 ist.
Das Problem mit diesem DOIF ist, dass er in den "anderen Zeiten" (Punkt 3 oben, cmd_3) nicht mehr automatisch ausgeht, wenn eine Bewegung entdeckt wurde.
EDIT: Zu beachten ist, dass die TestHelligkeit sich natürlich ändern kann, also wenn da steht <= 25, kann es sein, dass sie zwischen 0 und 25 wechselt, was zu keinem Statuswechsel führen darf.
(["PIRI2:^motion$"] and [TestHelligkeit] <= 25 and [06:00-10:00])
(set TestST2:FILTER=STATE!=on on)
DOELSEIF ([12:00-22:00] and [TestHelligkeit] <= 25 )
(set TestST2:FILTER=STATE!=on on)
DOELSEIF ([PIRI2:motion] and [TestHelligkeit] <= 25)
(set TestST2:FILTER=STATE!=on on)
DOELSE
(set TestST2:FILTER=STATE!=off off) ### wird durch wait verzögert
Internals:
DEF (["PIRI2:^motion$"] and [TestHelligkeit] <= 25 and [06:00-10:00])
(set TestST2:FILTER=STATE!=on on)
DOELSEIF ([12:00-22:00] and [TestHelligkeit] <= 25 )
(set TestST2:FILTER=STATE!=on on)
DOELSEIF ([PIRI2:motion] and [TestHelligkeit] <= 25)
(set TestST2:FILTER=STATE!=on on)
DOELSE
(set TestST2:FILTER=STATE!=off off) ### wird durch wait verzögert
DOIFDEV ^global$|^TestHelligkeit$|^PIRI2$|PIRI2
FUUID 5c444ff2-f33f-26cd-d07c-934b5ef2ccffc82c
MODEL FHEM
NAME di_Licht_Flur
NR 1136
NTFY_ORDER 50-di_Licht_Flur
STATE wait_timer
TYPE DOIF
VERSION 24905 2021-09-01 18:35:54
READINGS:
2021-12-05 10:40:47 Device TestHelligkeit
2021-12-05 10:40:45 cmd 3
2021-12-05 10:40:45 cmd_event TestHelligkeit
2021-12-05 10:40:45 cmd_nr 3
2021-12-05 10:40:47 e_TestHelligkeit_STATE 0
2021-12-05 10:40:39 mode enabled
2021-12-05 10:40:45 state cmd_3
2021-12-05 10:40:39 timer_01_c01 06.12.2021 06:00:00
2021-12-05 10:40:39 timer_02_c01 06.12.2021 10:00:00
2021-12-05 10:40:39 timer_03_c02 05.12.2021 12:00:00
2021-12-05 10:40:39 timer_04_c02 05.12.2021 22:00:00
Regex:
accu:
collect:
cond:
:
0:
"PIRI2:^motion$" PIRI2:^motion$
PIRI2:
2:
motion ^PIRI2$:^motion:
TestHelligkeit:
0:
&STATE ^TestHelligkeit$
1:
&STATE ^TestHelligkeit$
2:
&STATE ^TestHelligkeit$
attr:
cmdState:
0:
ein
1:
aus
wait:
0:
0
1:
0
2:
0
3:
60
waitdel:
condition:
0 ::EventDoIf('PIRI2',$hash,'^motion$',0) and ::InternalDoIf($hash,'TestHelligkeit','STATE') <= 25 and ::DOIF_time($hash,0,1,$wday,$hms)
1 ::DOIF_time($hash,2,3,$wday,$hms) and ::InternalDoIf($hash,'TestHelligkeit','STATE') <= 25
2 ::ReadingValDoIf($hash,'PIRI2','motion') and ::InternalDoIf($hash,'TestHelligkeit','STATE') <= 25
days:
do:
0:
0 set TestST2:FILTER=STATE!=on on
1:
0 set TestST2:FILTER=STATE!=on on
2:
0 set TestST2:FILTER=STATE!=on on
3:
0 set TestST2:FILTER=STATE!=off off
helper:
DEVFILTER ^global$|^TestHelligkeit$|^PIRI2$|PIRI2
NOTIFYDEV global|TestHelligkeit|PIRI2|.*PIRI2.*
event 0
globalinit 1
last_timer 4
sleeptimer -1
timerdev TestHelligkeit
timerevent 0
triggerDev TestHelligkeit
timerevents:
0
timereventsState:
state: 0
triggerEvents:
0
triggerEventsState:
state: 0
internals:
all TestHelligkeit:STATE
interval:
0 -1
1 0
2 -1
3 2
intervalfunc:
localtime:
0 1638766800
1 1638781200
2 1638702000
3 1638738000
readings:
all PIRI2:motion
realtime:
0 06:00:00
1 10:00:00
2 12:00:00
3 22:00:00
time:
0 06:00:00
1 10:00:00
2 12:00:00
3 22:00:00
timeCond:
0 0
1 0
2 1
3 1
timer:
0 0
1 0
2 0
3 0
timers:
0 0 1
1 2 3
trigger:
triggertime:
1638702000:
localtime 1638702000
hash:
1638738000:
localtime 1638738000
hash:
1638766800:
localtime 1638766800
hash:
1638781200:
localtime 1638781200
hash:
uiState:
uiTable:
Attributes:
cmdState ein | aus
room DOIF,Test
stateFormat wait_timer
wait 0:0:0:60
Testhelligkeit (Dummy):
Internals:
FUUID 61ab2045-f33f-26cd-7707-c438f5656f4a4a84
NAME TestHelligkeit
NR 1324
STATE 0
TYPE dummy
READINGS:
2021-12-05 10:40:47 state 0
Attributes:
room Test
setList state:0,25,50,100
webCmd state
Hi,
weil dieser Ausdruck immer wahr ist -> [PIRI2:motion] ;)
Tipp: es macht mMn keinen Sinn für gleiche Ausführungsteile unterschiedliche DOIF Zweige zu schreiben! Fass alle diese Bedingungen in einem Ausdruck zusammen.
( (["PIRI2:^motion$"] and [TestHelligkeit] <= 25 and [06:00-10:00]) or ([12:00-22:00] and [TestHelligkeit] <= 25 ) or ([PIRI2:motion] eq 'on' and [TestHelligkeit] <= 25) )
Gruß Otto
Hallo Otto,
bist wieder der Retter in der Not ;D ;D
Zu meiner Ehrenrettung: die mehrfachen Ausführungsteile waren zum Schluss nur noch eine Notlösung.
Mein Problem war, dass ich mich nicht getraut hatte, in einer Bedingung ein und den gleichen Trigger in unterschiedlicher Art und Weise zu verwenden.
Nämlich "PIRI2:^motion$"] und [PIRI2:motion] =~ "on".
Ich musste bei mir nur noch =~ "on" schreiben, da bei mir das
e_PIRI2_motion on (to VCCU) noch mit (to VCCU) verziert war.
Vielen Dank!
Gruß,
Friedhelm
Hallo Friedhelm,
Du liegst glaube ich falsch das hier ist der Event: ["PIRI2:^motion$"]
das hier ist die Abfrage eines Readings [PIRI2:motion]
ich nahm vorhin an, das Reading wechselt von off nach on, aber Du hast Recht. Bei genauer Betrachtung, sind die Readings des motion Sensors inkonsistent, aber da können wir beide nichts dafür ;)
Gruß Otto
Hallo Otto,
ich hab mich leider zu früh gefreut. Es ist doch ein bisschen komplizierter:
Heute morgen (ca. 08:00 Uhr) ging das Licht zwar bei Bewegung an, aber nach der wait-Time wieder aus.
Zwischen 06:00 und 12:00 soll das Licht aber durch eine einzige Bewegung angehen und anbleiben, bis die Helligkeit nicht mehr 0 oder 25, sondern >= 50 oder es nach 12:00 Uhr ist.
M. M. nach wird durch die Bedingung:
([PIRI2:motion] =~ 'on' and [TestHelligkeit] <= 25)
das Licht nach 60 s (PIRI2-Zeit, dann 'noMotion') -> DOELSE-Zweig + 10 s (wait-Parameter) wieder ausgeschaltet, da ein 'off' kommt -> Lampe aus.
Wie kann ich die Zeile formulieren?
Hier der aktuelle Stand:
( (["PIRI2:^motion$"] and [TestHelligkeit] <= 25 and [06:00-12:00])
or
([13:00-22:00] and [TestHelligkeit] <= 25 )
or
([PIRI2:motion] =~ 'on' and [TestHelligkeit] <= 25) )
(set TestST2:FILTER=STATE!=on on)
DOELSE
(set TestST2:FILTER=STATE!=off off) ### wird durch wait verzögert
Und in Gänze:
Internals:
CFGFN
DEF ( (["PIRI2:^motion$"] and [TestHelligkeit] <= 25 and [06:00-12:00])
or
([13:00-22:00] and [TestHelligkeit] <= 25 )
or
([PIRI2:motion] =~ 'on' and [TestHelligkeit] <= 25) )
(set TestST2:FILTER=STATE!=on on)
DOELSE
(set TestST2:FILTER=STATE!=off off) ### wird durch wait verzögert
DOIFDEV ^global$|^PIRI2$|^TestHelligkeit$|PIRI2
FUUID 61addcb9-f33f-26cd-1202-bfbb63b12bfb00a9
MODEL FHEM
NAME di_Licht_FlurTEST
NR 46482
NTFY_ORDER 50-di_Licht_FlurTEST
STATE aus
TYPE DOIF
VERSION 24905 2021-09-01 18:35:54
READINGS:
2021-12-06 11:24:54 Device PIRI2
2021-12-06 11:25:04 cmd 2
2021-12-06 11:25:04 cmd_event PIRI2
2021-12-06 11:25:04 cmd_nr 2
2021-12-06 11:24:54 e_PIRI2_motion off
2021-12-06 11:23:41 mode enabled
2021-12-06 11:25:04 state aus
2021-12-06 11:23:42 timer_01_c01 07.12.2021 06:00:00
2021-12-06 11:23:42 timer_02_c01 06.12.2021 12:00:00
2021-12-06 11:23:42 timer_03_c01 06.12.2021 13:00:00
2021-12-06 11:23:42 timer_04_c01 06.12.2021 22:00:00
2021-12-06 11:25:04 wait_timer no timer
Regex:
accu:
collect:
cond:
:
0:
"PIRI2:^motion$" PIRI2:^motion$
PIRI2:
0:
motion ^PIRI2$:^motion:
TestHelligkeit:
0:
&STATE ^TestHelligkeit$
attr:
cmdState:
0:
ein
1:
aus
wait:
0:
0
1:
10
waitdel:
condition:
0 (::EventDoIf('PIRI2',$hash,'^motion$',0) and ::InternalDoIf($hash,'TestHelligkeit','STATE') <= 25 and ::DOIF_time($hash,0,1,$wday,$hms)) or (::DOIF_time($hash,2,3,$wday,$hms) and ::InternalDoIf($hash,'TestHelligkeit','STATE') <= 25 ) or (::ReadingValDoIf($hash,'PIRI2','motion') =~ 'on' and ::InternalDoIf($hash,'TestHelligkeit','STATE') <= 25)
days:
do:
0:
0 set TestST2:FILTER=STATE!=on on
1:
0 set TestST2:FILTER=STATE!=off off
helper:
DEVFILTER ^global$|^PIRI2$|^TestHelligkeit$|PIRI2
NOTIFYDEV global|PIRI2|TestHelligkeit|.*PIRI2.*
event motion: off,motionDuration: 62,noMotion
globalinit 1
last_timer 4
sleepdevice PIRI2
sleepsubtimer -1
sleeptimer -1
timerdev PIRI2
timerevent motion: off,motionDuration: 62,noMotion
triggerDev PIRI2
timerevents:
motion: off
motionDuration: 62
noMotion
timereventsState:
motion: off
motionDuration: 62
state: noMotion
triggerEvents:
motion: off
motionDuration: 62
noMotion
triggerEventsState:
motion: off
motionDuration: 62
state: noMotion
internals:
all TestHelligkeit:STATE
interval:
0 -1
1 0
2 -1
3 2
intervalfunc:
localtime:
0 1638853200
1 1638788400
2 1638792000
3 1638824400
readings:
all PIRI2:motion
realtime:
0 06:00:00
1 12:00:00
2 13:00:00
3 22:00:00
time:
0 06:00:00
1 12:00:00
2 13:00:00
3 22:00:00
timeCond:
0 0
1 0
2 0
3 0
timer:
0 0
1 0
2 0
3 0
timers:
0 0 1 2 3
trigger:
triggertime:
1638788400:
localtime 1638788400
hash:
1638792000:
localtime 1638792000
hash:
1638824400:
localtime 1638824400
hash:
1638853200:
localtime 1638853200
hash:
uiState:
uiTable:
Attributes:
cmdState ein | aus
room Test
wait 0:10
Das Event "motion on (to VCCU)", auf das du triggern willst,
kannst du so angeben:
[PIRI2:"^motion on"] and ...
Hallo Damian,
das funktioniert auch nicht, dann geht die Lampe morgens bei Bewegung an, aber bereits nach gut 10 s (wait) wieder aus. cmd_1, dann sofort cmd_2.
1. Morgens (von 06:00 Uhr bis 12:00 Uhr) soll, nur, wenn der PIR-Melder Bewegung (einmal reicht aus) erkannt hat, das Licht solange anbleiben, bis 12:00 Uhr erreicht ist oder die Helligkeit > 25 ist, danach Lampe aus. Wenn keine Bewegung in der Zeit erkannt wurde, bleibt das Licht die ganze Zeit aus. Einmal Bewegung -> Lampe bleibt an!
2. Von 12:00 - 22:00 soll das Licht unabhängig vom PIR angehen, sobald die Helligkeit <= 25 ist. Um 22:00 Uhr soll die Lampe aus gehen.
3. Zu allen anderen Zeiten - also i. d. R. nachts - soll das Licht bei Bewegung für 5 Minuten angehen, wenn die Helligkeit <= 25 ist.
Der Fall 3. ist hier der schwierige für mich, der "passt" nicht in das DOIF, da er die anderen Bedingung stört. Evtl. dafür ein 2. DOIF?
Vielen Dank!
Zitat von: FFHEM am 06 Dezember 2021, 17:30:06
Hallo Damian,
das funktioniert auch nicht, dann geht die Lampe morgens bei Bewegung an, aber bereits nach gut 10 s (wait) wieder aus. cmd_1, dann sofort cmd_2.
1. Morgens (von 06:00 Uhr bis 12:00 Uhr) soll, nur, wenn der PIR-Melder Bewegung (einmal reicht aus) erkannt hat, das Licht solange anbleiben, bis 12:00 Uhr erreicht ist oder die Helligkeit > 25 ist, danach Lampe aus. Wenn keine Bewegung in der Zeit erkannt wurde, bleibt das Licht die ganze Zeit aus. Einmal Bewegung -> Lampe bleibt an!
2. Von 12:00 - 22:00 soll das Licht unabhängig vom PIR angehen, sobald die Helligkeit <= 25 ist. Um 22:00 Uhr soll die Lampe aus gehen.
3. Zu allen anderen Zeiten - also i. d. R. nachts - soll das Licht bei Bewegung für 5 Minuten angehen, wenn die Helligkeit <= 25 ist.
Der Fall 3. ist hier der schwierige für mich, der "passt" nicht in das DOIF, da er die anderen Bedingung stört. Evtl. dafür ein 2. DOIF?
Vielen Dank!
Dann brauchst du für den 1. Fall ein eignes DOIF für einmal Bewegung zwischen 6 und 12 Uhr.
Zitat von: Damian am 06 Dezember 2021, 18:38:01
Dann brauchst du für den 1. Fall ein eignes DOIF für einmal Bewegung zwischen 6 und 12 Uhr.
Hallo Damian,
Danke für Deine Einschätzung!
Gruß,
Friedhelm
Ich würde das ganze mit einem DOIF mit zwei Zweigen im Perl-Modus lösen. Mir ist nicht klar, wann die Lampe morgens ausgehen soll (zuerst hieß es 10:00, dann 12:00), daher die Angaben in Klammern. Logisch sähe das so aus:
Zweig 1 löst aus, wenn entweder 1. zwischen 22:00 und 10:00 (oder 12:00?) der Bewegungsmelder auslöst und Helligkeit <= 25 ist; 2. zwischen 12:00 und 22:00, wenn die Helligkeit <= 25 ist. Dieser Zweig schaltet die Lampe ein. Wenn es zwischen 22:00 und 6:00 ist, setzt er einen 5-Minuten-Timer mit set_Exec, um die Lampe auszuschalten.
Zweig 2 löst aus, wenn entweder 1. die Helligkeit 25 überschreitet, 2. es 10:00 (oder 12:00?) ist. Dieser Zweig schaltet die Lampe aus.
Zitat von: xenos1984 am 06 Dezember 2021, 19:10:39
Ich würde das ganze mit einem DOIF mit zwei Zweigen im Perl-Modus lösen. Mir ist nicht klar, wann die Lampe morgens ausgehen soll (zuerst hieß es 10:00, dann 12:00), daher die Angaben in Klammern. Logisch sähe das so aus:
Zweig 1 löst aus, wenn entweder 1. zwischen 22:00 und 10:00 (oder 12:00?) der Bewegungsmelder auslöst und Helligkeit <= 25 ist; 2. zwischen 12:00 und 22:00, wenn die Helligkeit <= 25 ist. Dieser Zweig schaltet die Lampe ein. Wenn es zwischen 22:00 und 6:00 ist, setzt er einen 5-Minuten-Timer mit set_Exec, um die Lampe auszuschalten.
Zweig 2 löst aus, wenn entweder 1. die Helligkeit 25 überschreitet, 2. es 10:00 (oder 12:00?) ist. Dieser Zweig schaltet die Lampe aus.
Beim DOIF-Perl muss man sich wohl drum kümmern, dein Einschaltbefehl nicht zu wiederholen, gerade dann, wenn man ständig vom Helligkeitssensor getriggert wird.
Zitat von: Damian am 06 Dezember 2021, 19:15:07
Beim DOIF-Perl muss man sich wohl drum kümmern, dein Einschaltbefehl nicht zu wiederholen, gerade dann, wenn man ständig vom Helligkeitssensor getriggert wird.
Das stimmt natürlich. Ich würde es wie in diesem Beispiel (http://fhem.de/commandref_DE.html#DOIF_Eigene_Funktionen_mit_Parametern) machen und in der sub zusätzlich prüfen, ob die Lampe schon im gewünschten Zustand ist.
Im DOIF-Modus sollte es doch ansonsten auch gehen... Nur die Bedingung, nach 5 Minuten auszuschalten, müsste man geschickt einbauen.
Zitat von: xenos1984 am 06 Dezember 2021, 19:10:39
Ich würde das ganze mit einem DOIF mit zwei Zweigen im Perl-Modus lösen. Mir ist nicht klar, wann die Lampe morgens ausgehen soll (zuerst hieß es 10:00, dann 12:00), daher die Angaben in Klammern. Logisch sähe das so aus:
Zweig 1 löst aus, wenn entweder 1. zwischen 22:00 und 10:00 (oder 12:00?) der Bewegungsmelder auslöst und Helligkeit <= 25 ist; 2. zwischen 12:00 und 22:00, wenn die Helligkeit <= 25 ist. Dieser Zweig schaltet die Lampe ein. Wenn es zwischen 22:00 und 6:00 ist, setzt er einen 5-Minuten-Timer mit set_Exec, um die Lampe auszuschalten.
Zweig 2 löst aus, wenn entweder 1. die Helligkeit 25 überschreitet, 2. es 10:00 (oder 12:00?) ist. Dieser Zweig schaltet die Lampe aus.
Hallo xenos1984, danke für die Idee! Habe das jetzt mal realisiert, Test folgt, aber der Kurztest war schon vielversprechend.
Einfach nach Deiner Anleitung runterprogrammiert (die Zeiten 10:00 bzw. 12:00 waren nebensächlich, Testdaten).
Werde berichten!
So läuft es zum Test:
EDIT: Der echte PIR-Melder, keine TestHelligkeit, "Helligkeit" zusammengefasst, Zeiten und Kommentare
{ ### Einschalten
if
([Helligkeit] <= 25 and
( (["PIRI1:^motion$"] and [[Rolladen_Flur_runter]-09:30]) or
([12:00-[Rolladen_Flur_runter]]))
)
{
fhem_set ("ST2:FILTER=STATE!=on on");
#### Nachts nach Zeit ausschalten
if ([[Rolladen_Flur_runter]-06:00])
{set_Exec("off_timer",300,'fhem_set("ST2 off")');}
}
### Ausschalten
if ([Helligkeit] > 25 or [09:30])
{
fhem_set ("ST2:FILTER=STATE!=off off");
}
}
Nach einem Tag und einer Nacht kann ich sagen: Die oben angegebene Lösung funktioniert bestens!
Deshalb vielen Dank an Otto, Damian und xenos1984!
Gruß,
Friedhelm