Ich möchte mein Gartenlicht mit einem DOIF bei Sonnenuntergang bis zu einem gewissen Zeitpunkt einschalten. Dafür verwende ich folgendes DOIF
Internals:
DEF ([{sunset_abs("HORIZON=3",0,"14:30","20:00")}])
(set Licht.Garten on-till 20:45)
FUUID 5e189785-f33f-55a1-c485-9709b0f9897d5e79
MODEL FHEM
NAME GartenlichtOnOff
NOTIFYDEV global
NR 226
NTFY_ORDER 50-GartenlichtOnOff
STATE cmd_1
TYPE DOIF
VERSION 24274 2021-04-18 16:40:42
READINGS:
2021-05-02 19:45:27 cmd 1
2021-05-02 19:45:27 cmd_event timer_1
2021-05-02 19:45:27 cmd_nr 1
2021-05-02 11:01:15 mode enabled
2021-05-02 19:45:27 state cmd_1
2021-05-02 19:45:27 timer_01_c01 03.05.2021 19:45:27
Regex:
accu:
collect:
attr:
cmdState:
waitdel:
condition:
0 ::DOIF_time_once($hash,0,$wday)
days:
do:
0:
0 set Licht.Garten on-till 20:45
1:
helper:
DEVFILTER ^global$
NOTIFYDEV global
event timer_1
globalinit 1
last_timer 1
sleeptimer -1
timerdev
timerevent timer_1
triggerDev
timerevents:
timer_1
timereventsState:
timer_1
triggerEvents:
timer_1
triggerEventsState:
timer_1
interval:
intervalfunc:
localtime:
0 1620063927
perlblock:
realtime:
0 19:45:27
time:
0 {sunset_abs("HORIZON=3",0,"14:30","20:00")}
timeCond:
0 0
timer:
0 0
timers:
0 0
triggertime:
1620063927:
localtime 1620063927
hash:
uiState:
uiTable:
Num möchte ich das Licht nicht zu einem bestimmten Zeitpunkt ausschalten, sondern "variabel". Ich habe mir zu diesem Zweck eine Sub im 99_myUtils.pm geschrieben die so aussieht:
sub sub_randomtime($$){
my ($MeH,$MeM,$MeS) = split(":", shift);
my ($MeMp,$MeSp) = split(":", shift);
my $ZtA = int($MeH*3600 + $MeM*60 + rand($MeMp*60) + $MeSp);
my $ZtH = int($ZtA/3600);
my $ZtM = int(($ZtA-$ZtH*3600)/60);
my $ZtS = int($ZtA-($ZtH*3600+$ZtM*60));
return sprintf("%2.2d:%2.2d:%2.2d",$ZtH,$ZtM,$ZtS);
und mir eine zufällige Zeit im Bereich der übergebenen Zeit zurück liefert. Diese Sub funktioniert für mich einwandfrei auch bei Aufrufen an anderer Stelle. Nur, wenn ich das eingangs erwähnte DOIF so umstelle
DEF ([{sunset_abs("HORIZON=3",0,"14:30","20:00")}])
(set Licht.Garten on-till {sub_randomtime('20:30:00','29:00')})
FUUID 5e189785-f33f-55a1-c485-9709b0f9897d5e79
MODEL FHEM
NAME GartenlichtOnOff
NOTIFYDEV global
NR 226
NTFY_ORDER 50-GartenlichtOnOff
STATE initialized
TYPE DOIF
VERSION 24274 2021-04-18 16:40:42
READINGS:
2021-05-03 09:22:13 cmd 0
2021-05-03 09:22:13 mode enabled
2021-05-03 09:22:13 state initialized
2021-05-03 09:22:13 timer_01_c01 03.05.2021 19:46:47
Regex:
accu:
collect:
attr:
cmdState:
waitdel:
condition:
0 ::DOIF_time_once($hash,0,$wday)
days:
do:
0:
0 set Licht.Garten on-till {sub_randomtime('20:30:00','29:00')}
1:
helper:
DEVFILTER ^global$
NOTIFYDEV global
globalinit 1
last_timer 1
sleeptimer -1
intervalfunc:
localtime:
0 1620064007
realtime:
0 19:46:47
time:
0 {sunset_abs("HORIZON=3",0,"14:30","20:00")}
timeCond:
0 0
timer:
0 0
timers:
0 0
triggertime:
1620064007:
localtime 1620064007
hash:
uiState:
uiTable:
schaltet sich das Gartenlicht erst gar nicht ein. Muss ich das DOIF auf Perl umstellen ? Und wenn ja: warum ?
Hi,
was Du machen willst nennt sich set magic (https://fhem.de/commandref_DE.html#set) - wenn Du da mal in die Doku schaust wirst Du sehen -> nicht {Perl} sondern {(Perl)}
Also zwei Klammern und es funktioniert bestimmt :) - hat nichts mit DOIF zu tun (obwohl es da sicher eine besondere Lösung gibt)
Gruß Otto
Danke, wieder etwas gelernt. Ich bin zuversichtlich, dass das heute abends funktioniert ! Dass das mit DIOF nichts zu tun hat war mir schon klar aber hinbekommen hab ich es trotzdem ohne Hilfe nicht 8)