FHEM Forum

FHEM => Anfängerfragen => Thema gestartet von: holle75 am 17 März 2019, 16:21:57

Titel: Perl - Datum / Zeit in Unix timestamp wandeln
Beitrag von: holle75 am 17 März 2019, 16:21:57
Bin seit Tagen dran und langsam glüht der Raspi von den vielen Neustarts um die sub in 99_myUtils für Tests zu aktualisieren.

Ich versuche aus 59_weather Daten einen Plot zu generieren. Ich bin schon ganz weit vorne, aber das Datum/Zeit-Format passend zum Rest der sub zu formatieren macht mich langsam wuschig. Im entsprechenden Thread habe ich die Frage auch schonmal gestellt, aber wahrscheinlich gibt es andere Baustellen.

Bis anhin war das Format unix timestamp. zB:

hourly_data_01_time              1552834800

und wurde durch

($hdmsec, $hdmmin, $hdmhour, $hdmmday, $hdmmon, $hdmyear, $hdmwday, $hdmyday, $hdmisdst) = localtime(ReadingsVal($device, "hourly_data_".$h."_time",undef));

# necessary conversion of $mon and $year
$hdmmon += 1;
$hdmyear += 1900;
   
$timestamp = sprintf("%04d-%02d-%02d_%02d:%02d:%02d", $hdmyear, $hdmmon, $hdmmday, $hdmhour, $hdmmin, $hdmsec);


in zB

2010-05-22 13:43:17

formatiert.


59_weather gibt mir als Äquivalent zu _time zB

hfc16_pubDate            Mo, 18 Mär 2019 07:00

und ich bekomms einfach nicht hin, einen unix timestamp daraus zu konvertieren. Der Rest der sub würde dann wieder greifen


Könnte sich jemand erbarmen?

Danke und Gruß
Titel: Antw:Perl - Datum / Zeit in Unix timestamp wandeln
Beitrag von: amenomade am 17 März 2019, 16:54:24
Ich frage mich warum Du dein Raspi neustarten musst, um eine Funktion in myUtils zu testen...

use Date::Parse;
my $date = "Tue, 11 Feb 2014 11:01:00";
my $time = str2time($date);
printf $time;
Titel: Antw:Perl - Datum / Zeit in Unix timestamp wandeln
Beitrag von: betateilchen am 17 März 2019, 17:03:49
das geht auch ganz ohne zusätzliches Date::Parse...


{ str2time "Tue, 11 Feb 2014 11:01:00" }


in der FHEM Befehlszeile liefert als Ergebnis 1392112860

Bei {str2time "Mo, 18 Mär 2019 07:00" } wird es aber - vermutlich wegen des deutschen Textes - schwierig.
Titel: Antw:Perl - Datum / Zeit in Unix timestamp wandeln
Beitrag von: holle75 am 17 März 2019, 17:07:21
Zitat von: amenomade am 17 März 2019, 16:54:24
Ich frage mich warum Du dein Raspi neustarten musst, um eine Funktion in myUtils zu testen...


fhem Neustart auf dem Raspi.... und jetzt wo dus sagst, habe ich kein einziges mal versucht, ohne fhem Neustart die bearbeitete 99_myUtils zu probieren. Dachte die lädt fhem nur beim Neustart neu.

Danke für den Codeschnipsel. Ich setz mich mal ran, wobei ich mir fast sicher bin, die Variante erfolglos auch probiert zu haben. Aber das schränkt das Fehlersuchen schon mal extrem ein .... wenn die Basisidee stimmt.

@Byte09:
Danke dir. Hab ich auch durch, aber hatte das Gefühl, meine jetzige Problemformatierung dort nicht abgebildet zu finden. Ich werds nochmal versuchen.

@betateilchen: Danke. Verdammt, an str2time war ich die letzten 3 Stunden dran. Bekomme so langsam das Gefühl, dass es noch an anderen Stellen in meiner sub schwer hängt :(
ps. Doppelt Danke für den Edit .... jup, irgendwie ist das Format recht problematisch.
Titel: Antw:Perl - Datum / Zeit in Unix timestamp wandeln
Beitrag von: betateilchen am 17 März 2019, 17:08:50
Zitat von: holle75 am 17 März 2019, 17:07:21
ohne fhem Neustart die bearbeitete 99_myUtils zu probieren. Dachte die lädt fhem nur beim Neustart neu.

Wenn Du die 99_myUtils.pm über "Edit files" bearbeitest, wird sie beim Abspeichern automatisch neu geladen und dabei auch gleich auf Syntax-Fehler überprüft. Sehr hilfreich für Leute, die nicht genau wissen, was sie tun.
Titel: Antw:Perl - Datum / Zeit in Unix timestamp wandeln
Beitrag von: holle75 am 17 März 2019, 17:13:07
Zitat von: betateilchen am 17 März 2019, 17:08:50
Sehr hilfreich für Leute, die nicht genau wissen, was sie tun.

Na danke :D :D ... aber Danke!
Titel: Antw:Perl - Datum / Zeit in Unix timestamp wandeln
Beitrag von: OdfFhem am 17 März 2019, 17:27:15
Ich bearbeite 99_myUtils.pm mit einem externen Editor.

Folgender Befehl in der FHEM-Kommandozeile macht einen Neustart unnötig.

reload 99_myUtils.pm
Titel: Antw:Perl - Datum / Zeit in Unix timestamp wandeln
Beitrag von: holle75 am 17 März 2019, 18:00:11
Zitat von: OdfFhem am 17 März 2019, 17:27:15
Ich bearbeite 99_myUtils.pm mit einem externen Editor.

Folgender Befehl in der FHEM-Kommandozeile macht einen Neustart unnötig.

reload 99_myUtils.pm


Deine sowie auch betateilchens Variante ist großartig! Wobei zum testen, wenn man nicht genau weiß was man tut :D, wirklich das Editieren direkt in fhem mir gerade die Augen geöffnet hat. Tolle Sache

Also, hab auch dadurch soeben in unglaublicher Schnelle alle Ideen ausprobiert. Funktioniert sowas von wie erwünscht mit allen möglichen Datums/Zeit-Angaben. Egal ob händisch testweise reingeschrieben, oder aus dem Modul gezogen.

Nur leider überhaupt nicht, sobald es in deutsch daherkommt.

Da kann ich lange probieren.

Jemand eine Workaroundsidee?
Titel: Antw:Perl - Datum / Zeit in Unix timestamp wandeln
Beitrag von: amenomade am 17 März 2019, 18:39:59
Leider scheint perl ein Problem mit dem Monat März zu haben...

use Date::Language;
my $lang = Date::Language->new('German');
$text = $lang->time2str("%B", 1556151600);
printf "$text";

ergibt April

use Date::Language;
my $lang = Date::Language->new('German');
$text = $lang->time2str("%B", 1553151600);
printf "$text";

ergibt... nix (epoch ist in März). Sollte März ergeben

use Date::Language;
my $lang = Date::Language->new('German');
$text = $lang->time2str("%B", 1550151600);
printf "$text";

ergibt Februar

use Date::Language;
my $lang = Date::Language->new('German');
$text = $lang->time2str("%B", 1570151600);
printf "$text";

ergibt Oktober

Workaround wäre selbst zu parsen.
Titel: Antw:Perl - Datum / Zeit in Unix timestamp wandeln
Beitrag von: holle75 am 17 März 2019, 18:44:47
Könnte man den Mär (Problem wird wohl der Umlaut sein) nicht in der Definition abfangen und ersetzen?
Titel: Antw:Perl - Datum / Zeit in Unix timestamp wandeln
Beitrag von: amenomade am 17 März 2019, 19:30:51
Doch schon. Man könnte Mär durch Mar ersetzen, aber mit Mar würde str2time auf Deutsch auch nichts anfangen können

Alternativ: dein Weather Modul auf Englisch benutzen (lang=en in der DEF)Scheint nur Einfluss auf "condition" zu haben
Titel: Antw:Perl - Datum / Zeit in Unix timestamp wandeln
Beitrag von: holle75 am 17 März 2019, 19:40:50
Zitat von: amenomade am 17 März 2019, 19:30:51
Alternativ: dein Weather Modul auf Englisch benutzen (lang=en in der DEF)

Hab ich eben probiert. Dann kommen zwar die Vorhersagen auf Englisch, aber das Datum bleibt auf deutsch. Recht blöd.

Hab eben auch noch mit deiner $lang - Version gespielt. Final funktioniert das auch nicht, unabhängig vom März, weil str2time, obwohl als Beispiel zB hier

https://metacpan.org/pod/Date::Parse#str2time

angegeben, den Wochentag am Anfang mit dem Komma in der deutsch-Version nicht mag.

Glaube, ich stecke sowohl mit dem deutsch als auch mit dem Format im deutsch fest. Irgendwie seltsam, dass es da keine Lösung gibt.

Werde jetzt mal den 59_weather Author anpingen, ob er nicht das ursprüngliche Reading _time (denn das kommt von der API) einfach noch zusätzlich als Reading im Modul weitergibt. Weiß nur noch nicht wo.
Titel: Antw:Perl - Datum / Zeit in Unix timestamp wandeln
Beitrag von: amenomade am 17 März 2019, 19:48:29
Vorschlag für ein Workaround:
$reading = "Mo, 18 Mär 2019 07:00";
$reading =~ s/^....//; #Wochentag weg
$reading =~ s/ä/a/; #März
$reading =~ s/i/y/; #Mai
$reading =~ s/k/c/; #Oktober
$reading =~ s/z/c/; #Dezember
printf "$reading\n";
$time = str2time($reading);
printf "$time\n";
Titel: Antw:Perl - Datum / Zeit in Unix timestamp wandeln
Beitrag von: holle75 am 17 März 2019, 19:57:03
gib mir mal ne Stunde. Muss das erstmal verstehen ;)
Titel: Antw:Perl - Datum / Zeit in Unix timestamp wandeln
Beitrag von: amenomade am 17 März 2019, 20:09:28
Ich bringe nur ihn dazu zu glauben, dass das Datum auf Englisch ist. Ohne Wochentag ist es einfacher, und dann
Januar, Jannuary = Jan
Februar, February = Feb
=> März, March => Mar (ersetze ä durch a)
April, April = Apr
=> Mai, May => May (ersetze i durch y)
Juni, June = Jun
Juli, July = Jul
August, August = Aug
September, September = Sep
=> Oktober, October => Oct (ersetze k durch c)
November, November = Nov
=> Dezember, December => Dec (ersetze z durch c)

Damit kann str2time arbeiten.
Titel: Antw:Perl - Datum / Zeit in Unix timestamp wandeln
Beitrag von: holle75 am 17 März 2019, 20:32:41
Das ist ja schonmal ganz eindrucksvoll.

Im angehängten Image sieht man oben den jetzt neuen Plot von 59_weather mit deinem workaround und drunter als direkte DarkSkyAPI HTTPMOD-Abfrage mit _time.
Jetzt muß ich nur noch herausfinden, warum er mir nur 2 Tage plotten will.

Edit:
Lol,... weil nunmal 50 Stunden Readings eben nur 2 Tage sind.
Titel: Antw:Perl - Datum / Zeit in Unix timestamp wandeln
Beitrag von: holle75 am 18 März 2019, 08:46:06
Danke @amenomade