FHEM Forum

FHEM => Automatisierung => DOIF => Thema gestartet von: kjmEjfu am 30 November 2020, 21:52:27

Titel: [gelöst] Template mit Zufallswert in Zeitspanne
Beitrag von: kjmEjfu am 30 November 2020, 21:52:27
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?
Titel: Antw:Template mit Zufallswert in Zeitspanne
Beitrag von: Damian am 30 November 2020, 22:05:03
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")');
Titel: Antw:Template mit Zufallswert in Zeitspanne
Beitrag von: kjmEjfu am 01 Dezember 2020, 08:16:18
Das ist natürlich auch eine Möglichkeit. Coole Idee.
Gleich mal umbauen.

Danke dir!