FHEM Forum

FHEM => Automatisierung => Thema gestartet von: Ralli am 08 November 2014, 19:30:26

Titel: von sunset_rel bzw. sunrise_rel noch rand() abziehen/draufrechnen
Beitrag von: Ralli am 08 November 2014, 19:30:26
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?
Titel: Antw:von sunset_rel bzw. sunrise_rel noch rand() abziehen/draufrechnen
Beitrag von: betateilchen am 08 November 2014, 19:37:02
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")}
Titel: Antw:von sunset_rel bzw. sunrise_rel noch rand() abziehen/draufrechnen
Beitrag von: Ralli am 08 November 2014, 19:49:28
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.
Titel: Antw:von sunset_rel bzw. sunrise_rel noch rand() abziehen/draufrechnen
Beitrag von: Puschel74 am 08 November 2014, 19:57:13
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.
Titel: Antw:von sunset_rel bzw. sunrise_rel noch rand() abziehen/draufrechnen
Beitrag von: betateilchen am 08 November 2014, 19:58:13
Achso. (verstehe zwar den Sinn nicht, ob da nun 17:59.xx oder 18.00:00 rauskommt)

Arbeite mit sunset_abs() und timestamps.
Titel: Antw:von sunset_rel bzw. sunrise_rel noch rand() abziehen/draufrechnen
Beitrag von: Ralli am 08 November 2014, 20:05:09
Der Sinn ist das Entzerren von Funkbefehlen - weil halt mehrere Rollläden mehr oder weniger gleichzeitig geschaltet werden.
Titel: Antw:von sunset_rel bzw. sunrise_rel noch rand() abziehen/draufrechnen
Beitrag von: betateilchen am 08 November 2014, 20:07:54
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.
Titel: Antw:von sunset_rel bzw. sunrise_rel noch rand() abziehen/draufrechnen
Beitrag von: Ralli am 09 November 2014, 20:15:48
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.