von sunset_rel bzw. sunrise_rel noch rand() abziehen/draufrechnen

Begonnen von Ralli, 08 November 2014, 19:30:26

Vorheriges Thema - Nächstes Thema

Ralli

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?
Gruß,
Ralli

Proxmox 8.4 Cluster mit HP ED800G2i7, Intel NUC11TNHi7+NUC7i5BNH, virtualisiertes fhem 6.4 dev, virtualisierte RaspberryMatic (3.83.6.20250705) mit HB-RF-ETH 1.3.0 / RPI-RF-MOD, HM-LAN-GW (1.4.1) und HMW-GW, FRITZBOX 7490 (07.59), FBDECT, Siri und Alexa

betateilchen

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")}
-----------------------
Formuliere die Aufgabe möglichst einfach und
setze die Lösung richtig um - dann wird es auch funktionieren.
-----------------------
Lesen gefährdet die Unwissenheit!

Ralli

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.
Gruß,
Ralli

Proxmox 8.4 Cluster mit HP ED800G2i7, Intel NUC11TNHi7+NUC7i5BNH, virtualisiertes fhem 6.4 dev, virtualisierte RaspberryMatic (3.83.6.20250705) mit HB-RF-ETH 1.3.0 / RPI-RF-MOD, HM-LAN-GW (1.4.1) und HMW-GW, FRITZBOX 7490 (07.59), FBDECT, Siri und Alexa

Puschel74

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.
Zotac BI323 als Server mit DBLog
CUNO für FHT80B, 3 HM-Lan per vCCU, RasPi mit CUL433 für Somfy-Rollo (F2F), RasPi mit I2C(LM75) (F2F), RasPi für Panstamp+Vegetronix +SONOS(F2F)
Ich beantworte keine Supportanfragen per PM! Bitte im Forum suchen oder einen Beitrag erstellen.

betateilchen

Achso. (verstehe zwar den Sinn nicht, ob da nun 17:59.xx oder 18.00:00 rauskommt)

Arbeite mit sunset_abs() und timestamps.
-----------------------
Formuliere die Aufgabe möglichst einfach und
setze die Lösung richtig um - dann wird es auch funktionieren.
-----------------------
Lesen gefährdet die Unwissenheit!

Ralli

Der Sinn ist das Entzerren von Funkbefehlen - weil halt mehrere Rollläden mehr oder weniger gleichzeitig geschaltet werden.
Gruß,
Ralli

Proxmox 8.4 Cluster mit HP ED800G2i7, Intel NUC11TNHi7+NUC7i5BNH, virtualisiertes fhem 6.4 dev, virtualisierte RaspberryMatic (3.83.6.20250705) mit HB-RF-ETH 1.3.0 / RPI-RF-MOD, HM-LAN-GW (1.4.1) und HMW-GW, FRITZBOX 7490 (07.59), FBDECT, Siri und Alexa

betateilchen

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.
-----------------------
Formuliere die Aufgabe möglichst einfach und
setze die Lösung richtig um - dann wird es auch funktionieren.
-----------------------
Lesen gefährdet die Unwissenheit!

Ralli

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.
Gruß,
Ralli

Proxmox 8.4 Cluster mit HP ED800G2i7, Intel NUC11TNHi7+NUC7i5BNH, virtualisiertes fhem 6.4 dev, virtualisierte RaspberryMatic (3.83.6.20250705) mit HB-RF-ETH 1.3.0 / RPI-RF-MOD, HM-LAN-GW (1.4.1) und HMW-GW, FRITZBOX 7490 (07.59), FBDECT, Siri und Alexa