Hallo! :)
Ich bin grad dabei, einen Kalender zu integrieren. Im Endeffekt soll sich die Heizung einschalten, wenn ein Termin in der nächsten Stunde startet und der Ort im Termin "Büro" ist. (es sollen dann eigentlich Termine aus 2 verschiedenen Kalendern berücksichtigt werden, und auch mehrere Termine gleichzeitig, aber soweit bin ich noch lange nicht.)
Momentan steh ich bei der Zeitdifferenz Momentanzeit <-> Startzeit Termin. Dazu hab ich eigentlich eh eine super Anleitung im Forum gefunden, die ich ein bisschen abändern musste damit es hier meiner Meinung nach passt .
Der Aufruf von der Startzeit vom Termin an sich funktioniert und mir wird die Zeit vom nächsten Termin in einem "Popup" angezeigt: zb. 26.02.2016 18:00:00.
Hier ist die Subroutine in 99_MyUtils.pm:
sub bTerminZeit ($){
# 02.03.2016 13:00:00
my ($locked_tstamp) = @_;
my @locked = split(" ",$locked_tstamp);
my @locked_day = split(".",$locked[0]);
my @locked_time = split(":",$locked[1]);
my $locked_time = fhemTimeLocal($locked_time[2],$locked_time[1],$locked_time[0],$locked_day[0],$locked_day[1],$locked_day[2]);
my $now_tstamp = TimeNow();
my @now = split(" ",$now_tstamp);
my @now_day = split("-",$now[0]);
my @now_time = split(":",$now[1]);
my $now_time = fhemTimeLocal($now_time[2],$now_time[1],$now_time[0],$now_day[2],$now_day[1],$now_day[0]);
my $del_minutes = int(($now_time - $locked_time)/60);
return $del_minutes;
}
Zum Test rufe ich folgendes auf: {bTerminZeit("get PP_Internes start next 1")}
Ausgegeben wird so etwas wie 1060437163 - erwartet wird aber eine viel kleinere Zahl.
Folgende Warnungen bekomme ich:
2016.02.26 17:13:13 1: PERL WARNING: Argument "get" isn't numeric in addition (+) at /usr/local/FHEM/bin/fhem.pl line 4138.
2016.02.26 17:13:13 1: PERL WARNING: Use of uninitialized value $month in numeric gt (>) at /usr/local/FHEM/bin/fhem.pl line 4154.
2016.02.26 17:13:13 1: PERL WARNING: Use of uninitialized value $month in array element at /usr/local/FHEM/bin/fhem.pl line 4155.
2016.02.26 17:13:13 1: PERL WARNING: Use of uninitialized value $mday in addition (+) at /usr/local/FHEM/bin/fhem.pl line 4155.
2016.02.26 17:13:13 1: PERL WARNING: Argument "PP_Internes" isn't numeric in addition (+) at /usr/local/FHEM/bin/fhem.pl line 4155.
2016.02.26 17:13:13 1: PERL WARNING: Use of uninitialized value $min in addition (+) at /usr/local/FHEM/bin/fhem.pl line 4155.
2016.02.26 17:13:13 1: PERL WARNING: Use of uninitialized value $sec in addition (+) at /usr/local/FHEM/bin/fhem.pl line 4155.
Offensichtlich geht da was bei der Übergabe schief oder ich verwende da etwas das es nicht mehr gibt. Weiß da wer weiter bzw. gibts überhaupt einen einfacheren Weg für das ganze den ich bisher übersehen hab?
Zitat von: Schrottpresse am 26 Februar 2016, 18:03:11
Offensichtlich geht da was bei der Übergabe schief
Natürlich geht da was schief. Nimm mal ein perl-Manual zur Hand und lies nach.
Du übergibst den Text "get PP_Internes start next 1" an Deine Funktion und versuchst mit den einzelnen Teilen des Strings zu rechnen. Logischerweise geht das schief, weil "get" eben kein numerischer Wert ist, mit dem sich rechnen läßt.
Huhu!
Vielen Dank, das hab ich übersehen! :)
Ich hab jetzt die Übergabe der Werte auch direkt in die 99_MyUtils.pm gegeben, mit fhemTimeLocal klappts aber momentan nicht so und ich hab leider keine Beschreibung von der Funktion gefunden.
Ich hab daher mal für mich selbst abgeleitet, dass das Format für fhemTimeLocal (Sekunden,Minuten,Stunden,Tag,Monat,Jahr) ist und das dementsprechend angepasst - trotzdem kommt für $locked_time eine negative Zahl raus und dementsprechend im Endeffekt auch wieder eine viel zu große Zeitdifferenz.
sub bTerminZeit {
my ($locked_tstamp) = fhem("get PP_Internes start next 1"); # 02.03.2016 13:00:00
my @locked = split(" ",$locked_tstamp);
my @locked_day = split(".",$locked[0]);
my @locked_time = split(":",$locked[1]);
my $locked_time = fhemTimeLocal($locked_time[2],$locked_time[1],$locked_time[0],$locked_day[0],$locked_day[1],$locked_day[2]); # -2209032000
my $now_tstamp = TimeNow(); # 2016-02-29 10:54:43
my @now = split(" ",$now_tstamp);
my @now_day = split("-",$now[0]);
my @now_time = split(":",$now[1]);
my $now_time = fhemTimeLocal($now_time[2],$now_time[1],$now_time[0],$now_day[2],$now_day[1],$now_day[0]); # 61417387179
my $del_minutes = int(($now_time - $locked_time)/60); # 1060440319
return $del_minutes;
}
Die geloggten Werte hab ich mal als Kommentar in die jeweiligen Zeilen geschrieben. Ich finde leider den Fehler nicht, wäre also sehr dankbar für Hilfe!
EDIT: Ah ich glaub der Fehler liegt beim RegEx Teil, die Datumsvariablen sind leer - wie muss der Punkt "." geschrieben werden damit er in dem Fall als Expression funktioniert?
my @locked_day = split(/[.]/,$locked[0]);
Gruß
Hans
Edit:
Ich glaube, du kannst die Jahrezahl so nicht übernehmen, da ab 1900 (oder 1970?) gezählt wird. Bin mir aber nicht sicher. Musst du recherchieren.
Zitat von: Schrottpresse link=topic=49922.msg417687#msg417687
Ich hab daher mal für mich selbst abgeleitet, dass das Format für fhemTimeLocal (Sekunden,Minuten,Stunden,Tag,Monat,Jahr) ist und das dementsprechend angepasst -
nimm doch zum Umrechnen String nach Unix Timestamp die Funktion aus der 99_Utils.pm :
time_str2num("YYYY-MM-DD HH:MM:SS") returns a numerical value, which makes computation of time differences easier
Hallo,
vielen Dank für die Hilfe! time_str2num hat super geklappt und der RegEx Ausdruck funktioniert auch. :)
sub bTerminZeit {
# 02.03.2016 13:00:00
my ($locked_tstamp) = fhem("get PP_Internes start next 1");
my @locked = split(" ",$locked_tstamp);
my @locked_day = split(/[.]/g,$locked[0]);
my @locked_time = split(":",$locked[1]);
# time_str2num("YYYY-MM-DD HH:MM:SS")
my $locked_time = time_str2num("$locked_day[2]\-$locked_day[1]\-$locked_day[0] $locked_time[0]\:$locked_time[1]\:$locked_time[2]");
my $now_tstamp = TimeNow();
my $now_time = time_str2num("$now_tstamp");
my $del_minutes = int(($locked_time - $now_time)/60);
return $del_minutes;
}
Ich weiß nicht ob die Übergabe von der Uhrzeit zu time_str2num() so gemacht wird aber es funktioniert jedenfalls. :D
Danke!
Zitat von: Schrottpresse am 29 Februar 2016, 14:06:46
my $now_tstamp = TimeNow();
my $now_time = time_str2num("$now_tstamp");
das kannst auch ohne Wandlung direkt machen :
my $now_time =gettimeofday();