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');
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.
Guten Morgen,
Ist es bestimmt. Muß ich mir mal anschauen.
Grüße
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.)
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.
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))