[Gelöst] Zeit bis nächstem Termin in Kalender

Begonnen von Schrottpresse, 26 Februar 2016, 18:03:11

Vorheriges Thema - Nächstes Thema

Schrottpresse

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?

betateilchen

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

Schrottpresse

#2
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?

Hans Franz

#3
   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.
Raspi
CUL, Nano-CUL
FHT8V, FHT80B, S300TH
WM1000WZ, ELRO
LW12, LD382,DS18B20

Wzut

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
Maintainer der Module: MAX, MPD, UbiquitiMP, UbiquitiOut, SIP, BEOK, readingsWatcher

Schrottpresse

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!

Wzut

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();
Maintainer der Module: MAX, MPD, UbiquitiMP, UbiquitiOut, SIP, BEOK, readingsWatcher