FHEM Forum

FHEM => Automatisierung => Perl für FHEM-User => Thema gestartet von: gestein am 08 August 2022, 19:09:16

Titel: UTC in local time umrechnen?
Beitrag von: gestein am 08 August 2022, 19:09:16
Hallo,

Ich habe den ganzen Nachmittag damit verbracht, einen Zeitstring in UTC in die lokale Zeit umzurechnen - hab's aber leider nicht geschafft.
Die ganzen Beispiele im Netz verwenden alle unterschiedliche Ansätze und ich bringe unter FHEM keinen zum Funktionieren.
Kann mir hier bitte jemand helfen?

Die Zeitstrings sehen so aus:
2022-08-08T17:00:00Z

Wie bekomme ich davon die lokale Zeit?
Danke im Voraus
Lg, Gerhard
Titel: Antw:UTC in local time umrechnen?
Beitrag von: betateilchen am 08 August 2022, 19:28:12

sub test {
  my $utc = '2022-08-08T17:20:00Z';
  my ($sec, $min, $hour, $mday, $mon, $year) = ((reverse(split /\D/,$utc))[0..5]);
  my $time = timegm($sec, $min, $hour, $mday, ($mon-1), $year);
  Debug strftime "%Y-%m-%dT%T UTC", gmtime($time);
  Debug strftime "%Y-%m-%dT%T %Z %z", localtime($time);
}


liefert als Ergebnis (im Logfile)


2022.08.08 19:26:50 1: DEBUG>2022-08-08T17:20:00 UTC
2022.08.08 19:26:50 1: DEBUG>2022-08-08T19:20:00 CEST +0200
Titel: Antw:UTC in local time umrechnen?
Beitrag von: gestein am 08 August 2022, 21:15:51
Hallo Betateilchen,

Danke. Das Beispiel hatte ich auch gefunden und probiert.

Ich wollte es in einem DOIF verwenden, da steigt dann DOIF aus.

Bei folgendem Test-DOIF kommt dann eine Fehlermeldung (yrno ist das Device von Dir für yr.no):
defmod diyrno DOIF {#https://stackoverflow.com/questions/63485237/utc-to-local-time-conversion-using-perl-minimal-installed-modules\
# if([yrno:&API_LAST_MSG] == 200) {\
\
    for(my $i=0;; $i <= 6;; $i++) {\
      my $utc=ReadingsVal("yrno","properties.timeseries.$i.time","");;\
      my ($sec, $min, $hour, $mday, $mon, $year) = ((reverse(split /\D/,$utc))[0..5]);;\
      my $time = timegm($sec, $min, $hour, $mday, ($mon-1), $year);;\
  set_Reading("test_$i",localtime($time));;\
    }\
  }\
}


Folgende Fehlermeldung kommt dann:
condition c01: syntax error at (eval 9271854) line 6, near ")::InternalDoIf"
Global symbol "$mon" requires explicit package name (did you forget to declare "my $mon"?) at (eval 9271854) line 7.
Unmatched right curly bracket at (eval 9271854) line 10, at end of line
syntax error at (eval 9271854) line 10, near "}
  }"


Und je mehr ich herumbastle, desto eigenartiger werden die Meldungen.
Gut zu wissen, dass das eigentlich funktionieren sollte.
Dann frage ich mal im DOIF-Bereich.

Lg, Gerhard
Titel: Antw:UTC in local time umrechnen?
Beitrag von: Damian am 08 August 2022, 21:28:07
Was schon mal auffällt, du hast zwei öffnende geschweifte Klammen und drei schließende (if hast du ja auskommentiert)
Titel: Antw:UTC in local time umrechnen?
Beitrag von: betateilchen am 08 August 2022, 21:38:59
Zitat von: gestein am 08 August 2022, 21:15:51
Ich wollte es in einem DOIF verwenden, da steigt dann DOIF aus.
Bei folgendem Test-DOIF kommt dann eine Fehlermeldung (yrno ist das Device von Dir für yr.no):

Du kannst die ganze Umrechnung und Formatierung doch direkt im yrno device machen, dafür gibt es doch entsprechende Attribute in JsonMod.
Wozu brauchst Du da noch ein DOIF?
Titel: Antw:UTC in local time umrechnen?
Beitrag von: betateilchen am 08 August 2022, 21:48:09
Zitat von: betateilchen am 08 August 2022, 21:38:59
Du kannst die ganze Umrechnung und Formatierung doch direkt im yrno device machen, dafür gibt es doch entsprechende Attribute in JsonMod.


defmod yrno JsonMod https://api.met.no/weatherapi/locationforecast/2.0/compact?lat=48.14&lon=16.21
attr yrno readingList single(test(jsonPath('properties.timeseries.0.time')),'time_converted','n/a')


test() ist eine Funktion in der 99_myUtils.pm in der die Konvertierung vorgenommen wird.


sub test {
  my $utc = shift;
  my ($sec, $min, $hour, $mday, $mon, $year) = ((reverse(split /\D/,$utc))[0..5]);
  my $time = timegm($sec, $min, $hour, $mday, ($mon-1), $year);
  return strftime "%Y-%m-%dT%T %Z %z", localtime($time);
}
Titel: Antw:UTC in local time umrechnen?
Beitrag von: gestein am 08 August 2022, 22:01:36
Danke für die Hinweise.
Da hatte ich wohl Tomaten auf den Augen.

Das DOIF wollte ich nehmen, da ich mich damit etwas auskenne und mit JSONMOD aber überhaupt nicht.
Außerdem dachte ich, dass ich mit DOIF flexibler bin beim Umrechnen und Formatieren.
Das werde ich mir aber dann doch mal anschauen.

Lg, Gerhard
Titel: Antw:UTC in local time umrechnen?
Beitrag von: gestein am 08 August 2022, 22:34:44
Wenn ich im DOIF eine ,,}" wegnehme, dann kommt bei mir die folgende Fehlermeldung:
condition c01: syntax error at (eval 9380392) line 6, near ")::InternalDoIf"
Global symbol "$mon" requires explicit package name (did you forget to declare "my $mon"?) at (eval 9380392) line 7.


Und wenn ich $mon umbenenne, dann kommt beim Ausführen von Block 1 die Fehlermeldung:
condition c01: syntax error,::InternalDoIf"
Und das Warning:
condition c01: (Missing operator before ::InternalDoIf?)

Also werde ich versuchen die Funktion so wie Du in eine sub auslagern.

Lg, Gerhard
Titel: Antw:UTC in local time umrechnen?
Beitrag von: Damian am 08 August 2022, 23:00:27
Das Problem ist die Angabe [1..5] im DOIF-Block, diese wird als Trigger interpretiert.

Wenn du es mit DOIF machen willst, dann würde ich die test-Routine im subs-Block definierten und sie dann im DOIF-Block nutzen.