FHEM Forum

FHEM => Codeschnipsel => Thema gestartet von: CoolTux am 14 September 2017, 20:54:51

Titel: Funktion zur Abfrage ob es zwischen zwei Uhrzeiten ist z.B 18:00-22:00
Beitrag von: CoolTux am 14 September 2017, 20:54:51
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');
Titel: Antw:Funktion zur Abfrage ob es zwischen zwei Uhrzeiten ist z.B 18:00-22:00
Beitrag von: ComputerZOO am 24 Oktober 2017, 01:13:34
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.
Titel: Antw:Funktion zur Abfrage ob es zwischen zwei Uhrzeiten ist z.B 18:00-22:00
Beitrag von: CoolTux am 24 Oktober 2017, 05:56:06
Guten Morgen,

Ist es bestimmt. Muß ich mir mal anschauen.

Grüße
Titel: Antw:Funktion zur Abfrage ob es zwischen zwei Uhrzeiten ist z.B 18:00-22:00
Beitrag von: ComputerZOO am 24 Oktober 2017, 09:42:19
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.)
Titel: Antw:Funktion zur Abfrage ob es zwischen zwei Uhrzeiten ist z.B 18:00-22:00
Beitrag von: ComputerZOO am 24 Oktober 2017, 16:45:22
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.
Titel: Antw:Funktion zur Abfrage ob es zwischen zwei Uhrzeiten ist z.B 18:00-22:00
Beitrag von: sku am 24 Oktober 2017, 17:50:47
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 (https://forum.fhem.de/index.php/topic,73700.msg672997.html#msg672997))