Funktion zur Abfrage ob es zwischen zwei Uhrzeiten ist z.B 18:00-22:00

Begonnen von CoolTux, 14 September 2017, 20:54:51

Vorheriges Thema - Nächstes Thema

CoolTux

Da bereits ein paar mal hinter fragt stelle ich die Funktion hier zur Verfügung.
ACHTUNG!!! Die Funktion ist aus der disableForInterval Routine aus der fhem.pl geborgt. Sie wurde Ursprünglich von Rudi geschrieben!!!


sub isInTime($) {

    my $dfi = shift;

    $dfi =~ s/{([^\x7d]*)}/$cmdFromAnalyze=$1; eval $1/ge; # Forum #69787
    my ($sec,$min,$hour,$mday,$month,$year,$wday,$yday,$isdst) = localtime;
    my $dhms = sprintf("%s\@%02d:%02d:%02d", $wday, $hour, $min, $sec);
    foreach my $ft (split(" ", $dfi)) {
        my ($from, $to) = split("-", $ft);
        if(defined($from) && defined($to)) {
            $from = "$wday\@$from" if(index($from,"@") < 0);
            $to   = "$wday\@$to"   if(index($to,  "@") < 0);
            return 1 if($from le $dhms && $dhms le $to);
        }
    }
   
    return 0;
}


Diese Funktion bitte in eine 99_myUtils eintragen und abfragen mit

isInTime('18:00-22:00')


isInTime('22:00-24:00 00:00-04:00')


Schalte die Lampe nur zwischen 22 und 4 Uhr

fhem('set LampeAussen on-for-timer 300') if( isInTime('22:00-24:00 00:00-04:00');


Benachrichtige mich immer über irgendwas aber nicht zwischen 22 und 6 Uhr

fhem('set msg Nachricht') if( ! isInTime('22:00-24:00 00:00-06:00');
Du musst nicht wissen wie es geht! Du musst nur wissen wo es steht, wie es geht.
Support me to buy new test hardware for development: https://www.paypal.com/paypalme/MOldenburg
My FHEM Git: https://git.cooltux.net/FHEM/
Das TuxNet Wiki:
https://www.cooltux.net

ComputerZOO

Moin CoolTux,
mal ganz frech nachgefragt: Ist es möglich so etwas auch für ein Datum (isInDate('22.10.2017-28.10.2017')) zu programmieren? Ich habe mal gesucht, aber nix gefunden.

CoolTux

Guten Morgen,

Ist es bestimmt. Muß ich mir mal anschauen.

Grüße
Du musst nicht wissen wie es geht! Du musst nur wissen wo es steht, wie es geht.
Support me to buy new test hardware for development: https://www.paypal.com/paypalme/MOldenburg
My FHEM Git: https://git.cooltux.net/FHEM/
Das TuxNet Wiki:
https://www.cooltux.net

ComputerZOO

Ne Idee hätte ich (glaube ich), ist aber nen etwas größerer Umweg und deshalb bestimmt anders machbar.

(Ich würde die das jeweilige Datum zerlegen, und je einen Timestamp daraus erzeugen, dann die jetzige Zeit in einen Timestamp umrechnen und durch einen Vergleich feststellen, ob der Wert <= dem Enddatum und >= dem Startdatum ist.)

ComputerZOO

Soooooooo,
ich habe da mal etwas gebastelt:
sub isInDate($$) {
use Time::Local;
my ($strBEGIN, $strEND) = @_;
my @SplitDate = split(/\./, $strBEGIN);
my $BEGIN = timelocal(0, 0, 0, $SplitDate[0], $SplitDate[1] - 1, $SplitDate[2]) + 7200;
@SplitDate = split(/\./, $strEND);
my $END = timelocal(0, 0, 0, $SplitDate[0], $SplitDate[1] - 1, $SplitDate[2]) + 93599;
if (time() > $BEGIN && time() < $END) {
return 1;
} else {
return 0;
}
}

ist bestimmt nicht schön, aber selten und funktioniert folgendermaßen:
isInDate("23.10.2017", "27.10.2017")
gibt am heutigen Tag (24.10.2017) true, also "1" zurück.

Das ganze ist etwas unschön, da ich händisch die 7200 (UTC +2 Stunden = MESZ) beim Begin hinzuaddieren musste, ebenfalls die 93599 damit der Tag am 27.10. (also dem Ende des Zeitraums) auch bis 23:59 Uhr geht.

Wenn jemand für das Problem mit der Zeitzone/Sommerzeit eine Lösung hat, dann wäre ich hier für einen Hinweis dankbar.

sku

Eventuell hilft eine Rechnung in Sekunden seit 1970? berücksichtigt diese Sommer/Winterzeit?

Hier mal ein Schnipsel:


my $t_001_btime = ReadingsVal("Kalender_View","t_001_btime","0");
my @t_001_btime_ary = split(/\D/,$t_001_btime);
fhem("define at_heizungrunter at ".FmtTime(time_str2num("2015-01-01 $t_001_btime_ary[0]:$t_001_btime_ary[1]:00")-30*60)." set heizungsabsenkung_rasp3 on"); #halbe stunde von startzeit abziehen. time_str2num rechnet in sekunden seit 1970, -30*60 zieht 30minuten ab, FmtTime pickt sich die Uhrzeit im format hh:mm:ss heraus



(ist nur ein Auszug meiner Heizungsplanung für den Tag andhand eines Kalenders, kompletter Code hier)