Hi zusammen,
ich kämpfe mit einem Problem, dass ich mal wieder nicht alleine lösen kann.
So habe ich folgendes Template definiert:
DEF TPL_light ( ## Definition des Templates namens TPL_light
## Parameternummer $1 $2 $3 $4 $5 $6 $7 $8 $9
## Bedeutung Name der Szene Lichtsensor des Zimmers Lichtaktor Schwellwert ein Schwellwert aus Zeitspanne Befehl zum Einschalten Befehl zum Ausschalten Zusatzbedingung (z.B. nur bei Abwesenheit)
light_$1 {
## DOIF Block
my $timestamp = $6;
if (($timestamp) and [$2:control:d] < $4 and (get_Reading("1_$1.Status") eq "false") and ($9)) {
fhem_set("$3 $7");
set_State("Szene: $1 Lampe ein");
set_Reading("1_$1.Status","true");
} elsif ((([$2:control:d] > $5 ) or !($timestamp)) and (get_Reading("1_$1.Status") eq "true") ) {
if ($9) {
fhem_set("$3 $8");
set_State("Szene: $1 Lampe aus");
}
set_Reading("1_$1.Status","false");
}
}
) ## Ende der Templatedefinition
## $1 $2 $3 $4 $5 $6 $7 $8 $9
TPL_light (Aussen_Anbau,Sensor_Aussen_HWR_Sonne,Licht_Aussen_Wohnzimmerdach,80,130,[([07:15]-int(rand(600)))-([21:00]+int(rand(900)))],on,off,1)
DOIF macht daraus:
my $timestamp = ::DOIF_time($hash,11,12,$wday,$hms);
if (($timestamp) and ::ReadingValDoIf($hash,'Sensor_Aussen_HWR_Sonne','control','','d') < 80 and (get_Reading("1_Aussen_Anbau.Status") eq "false") and (1)) {
fhem_set("Licht_Aussen_Wohnzimmerdach on");
set_State("Szene: Aussen_Anbau Lampe ein"); set_Reading("1_Aussen_Anbau.Status","true");
} elsif (((::ReadingValDoIf($hash,'Sensor_Aussen_HWR_Sonne','control','','d') > 130 ) or !($timestamp)) and (get_Reading("1_Aussen_Anbau.Status") eq "true") ) {
if (1) {
fhem_set("Licht_Aussen_Wohnzimmerdach off");
set_State("Szene: Aussen_Anbau Lampe aus");
}
set_Reading("1_Aussen_Anbau.Status","false"); }
Die entsprechenden Zeitwert sind (aus dem List entnommen):
11 07:12:09
12 21:03:47
Dies führt jetzt aber dazu, dass um 21:03:47 das Licht wie gewünscht ausgeschaltet wird, anschließend wird allerdings die Zeit 12 neu kalkuliert (für den nächsten Tag) und wenn sie nun auf später als 21:03:47 liegt, wird das Licht kurz später wieder angeschaltet. Was nachvollziehbar ist, weil die Endzeit ja noch nicht erreicht ist.
Wie kann ich das vermeiden?
my $timestamp = $6;
habe ich eingebaut, weil ansonsten für den if- und elsif-Zweig eigene Timer angelegt wurden, die sich dann überschnitten haben.
Kann ich irgendwie festlegen, dass die Zeit nur um Mitternacht neu kalkuliert wird?
Du könntest den Zufall aus dem Zeitintervall herausnehmen und das Ein-, bzw. Ausschalten verzögern:
statt
fhem_set("$3 $7");
set_Exec("$1",rand(600),'fhem_set("$3 $7")');
Das ist natürlich auch eine Möglichkeit. Coole Idee.
Gleich mal umbauen.
Danke dir!