Hallo zusammen,
ich habe ein paar Timer mit at +*{sunset_rel(-600,"18:00","22:00")} definiert.
Ich würde da gerne noch einen Zufallswert von abziehen bzw. draufrechnen (nicht bei den -600 sondern beim Endergebnis). Einfach ein minus rand(60) z.B. klappt aber nicht, weil dann wohl dann der zurückgelieferte Wert nicht dem erwarteten Format entspricht.
Kann mir hier jemand einen Tipp bzw. die Lösung geben/nennen?
Kommt drauf an, wo Du die Subtraktion ausführst, das hast Du leider nicht geschrieben.
Probier doch einfach mal
{sunset_rel(-600-rand(60),"18:00","22:00")}
Danke.
Die Subtraktion soll vom Endwert abgezogen werden, NICHT von den -600. Denn gerade in den dunklen Monaten wird jetzt ja immer 18:00 Uhr zurückgegeben als frühester Wert. Und davon soll aber jetzt noch ein Zufallswert weiter runter.
Da hat doch jemand ein Modul geschrieben das sowas erledigt ???
Such mal nach Zufall oder Zufallsfunktion oder Zufallszeiten - ich mein da hab ich mal was gelesen im Forum.
Achso. (verstehe zwar den Sinn nicht, ob da nun 17:59.xx oder 18.00:00 rauskommt)
Arbeite mit sunset_abs() und timestamps.
Der Sinn ist das Entzerren von Funkbefehlen - weil halt mehrere Rollläden mehr oder weniger gleichzeitig geschaltet werden.
Das schaffst Du sowieso nicht zuverlässig mit einem Zufallsgenerator. Der kann Dir nämlich theoretisch auch 10 Mal hintereinander den gleichen Wert liefern.
Bau Dir besser eine Funktion in die 99_myUtils.pm mit der Du die Rollläden einfach nacheinander fahren läßt und dazwischen eine geplante Verzögerung einbaust.
Ich habe es - wenn auch umständlich - mit Googles Hilfe wie folgt gelöst:
Zunächst habe ich in 99_myUtils.pm die Funktionen definiert:
sub timespan2seconds {
my $ts = shift;
my $sc = 0;
if ($ts =~ m/(?:(\d+)\s+)?(\d+):(\d+)(?::(\d+))?/) {
$sc += $1 || 0;
$sc *= 24;
$sc += $2;
$sc *= 60;
$sc += $3;
$sc *= 60;
$sc += $4 || 0;
}
else {
my @pt = $ts =~ m/(\d+)([dhms])/g;
my %sf = (
'd' => 24 * 60 * 60,
'h' => 60 * 60,
'm' => 60,
's' => 1
);
$sc += shift(@pt) * $sf{shift(@pt)} while (@pt);
}
return $sc;
}
sub time_num2str {
my $sek_abs = shift;
my $std = int($sek_abs/3600);
my $min = int(($sek_abs - $std*3600)/60);
my $sek = $sek_abs - $std*3600 - $min*60;
my $str = sprintf("%02d:%02d:%02d",$std,$min,$sek);
return $str;
}
Die Funktion timespan2seconds wandelt eine Uhrzeit bzw. Zeitangabe im Format HH:MM:SS in Sekunden um. Die Funktion time_num2str ist das Gegenstück zu der in 99_Utils.pm vorhandenen Funktion time_str2num.
Meine at's definiere ich nun wie folgt:
+*{time_num2str(timespan2seconds(sunset_rel(-600,"18:00","22:00"))-int(rand(60)))} set Rollo off
Damit wird erreicht, dass von den 10 Minuten vor ermitteltem Sonnenuntergang bzw. frühestens 18.00 Uhr oder spätestens 22.00 Uhr noch ein Zufallswert 0..60 Sekunden subtrahiert wird. Bei einer Anzahl X an grundsätzlich gleichzeitig zu schaltenden Aktoren wird so eine Entzerrung der Funkbefehle erreicht. Dies wurde bei mir erforderlich, weil der HMLAN bei der Beantwortung der AES-Requests Husten bekam.