[gelöst] Template mit Zufallswert in Zeitspanne

Begonnen von kjmEjfu, 30 November 2020, 21:52:27

Vorheriges Thema - Nächstes Thema

kjmEjfu

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?
Migriere derzeit zu Home Assistant

Damian

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")');
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

kjmEjfu

Das ist natürlich auch eine Möglichkeit. Coole Idee.
Gleich mal umbauen.

Danke dir!
Migriere derzeit zu Home Assistant