Uerreadings mit Readingstimestamp zeigt falsche Uhrzeit

Begonnen von bmwfan, 28 November 2021, 17:08:00

Vorheriges Thema - Nächstes Thema

bmwfan

Hallo,

ich verwende den Apothekenfinder, um mir den WE-Notdienst an einem Tablet anzuzeigen. Die Werte werden am apothekenfinder.mobi auch korrekt abgefragt und in Readings übernommen. Die Readings Beginn und Ende will ich mit einem Userreading umformatieren, damit sie am Tablet in unserem Format (dd.mm.yy) dargestellt werden. Bei einem Wert (Beginn) geht das, beim anderen Wert (Ende) wird immer das Datum des Beginns angezeigt und ich komme nicht darauf, was in meinem Userreading falsch sein soll.

Internals:
   BUSY       0
   CFGFN     
   DEF        https://apothekenfinder.mobi/interface/json.php?device=web&source=not&search=XXXXX 0
   FUUID      61a398ee-f33f-d125-8c1e-fd92f1996895e5e2
   Interval   0
   MainURL    https://apothekenfinder.mobi/interface/json.php?device=web&source=not&search=XXXXX
   ModuleVersion 4.1.10 - 6.7.2021
   NAME       NotdienstApotheke
   NOTIFYDEV  global
   NR         15250
   NTFY_ORDER 50-NotdienstApotheke
   STATE     YYYY
   TYPE       HTTPMOD
   value     
   HttpUtils:
     NAME       
     addr       https://apothekenfinder.mobi:443
     auth       0
     buf       
     code       200
     compress   1
     conn       
     data       
     displayurl https://apothekenfinder.mobi/interface/json.php?device=web&source=not&search=XXXXX
     header     Accept-Encoding: gzip, deflate
Accept-Language: de-DE,de;;q=0.9,en-US;;q=0.8,en;;q=0.7,fr;;q=0.6
User-Agent: Lynx/2.8.8dev.3 libwww-FM/2.14 SSL-MM/1.4.1
Referer: http://apothekenfinder.mobi/
X-Requested-With: XMLHttpRequest
Connection: keep-alive
     host       apothekenfinder.mobi
     httpheader HTTP/1.1 200 OK
Date: Sun, 28 Nov 2021 15:46:12 GMT
Server: Apache
Vary: Accept-Encoding
Content-Encoding: gzip
Content-Length: 962
Keep-Alive: timeout=15, max=100
Connection: Keep-Alive
Content-Type: application/json; charset=utf-8
     httpversion 1.0
     hu_blocking 0
     hu_filecount 1
     hu_port    443
     hu_portSfx
     ignoreredirects 1
     loglevel   4
     path       /interface/json.php?device=web&source=not&search=XXXXX
     protocol   https
     redirects  0
     timeout    60
     url        https://apothekenfinder.mobi/interface/json.php?device=web&source=not&search=XXXXX
     sslargs:
   QUEUE:
   READINGS:
     2021-11-28 16:46:03   Beginn          2021-11-28 08:30:00
     2021-11-28 16:46:03   BeginnJG        Am 28.11.21 um 16:46
     2021-11-28 16:46:03   Breitengrad     ZZ
     2021-11-28 16:46:03   Ende            2021-11-29 08:30:00
     2021-11-28 16:46:03   EndeJG          Am 28.11.21 um 16:46
     2021-11-28 16:46:03   Entfernung      6.26
     2021-11-28 16:46:03   Laengengrad     ZZ
     2021-11-28 16:46:03   Name            YYYY
     2021-11-28 16:46:03   Ort             YYYY
     2021-11-28 16:46:03   Plz             YYYYY
     2021-11-28 16:46:03   Strasse         YYYYY
     2021-11-28 16:46:03   Telefax         01234
     2021-11-28 16:46:03   Telefon         01234
   REQUEST:
     context    reading
     data       
     header     Accept-Encoding: gzip, deflate
Accept-Language: de-DE,de;;q=0.9,en-US;;q=0.8,en;;q=0.7,fr;;q=0.6
User-Agent: Lynx/2.8.8dev.3 libwww-FM/2.14 SSL-MM/1.4.1
Referer: http://apothekenfinder.mobi/
X-Requested-With: XMLHttpRequest
Connection: keep-alive
     ignoreredirects 0
     num        unknown
     retryCount 0
     type       update
     url        https://apothekenfinder.mobi/interface/json.php?device=web&source=not&search=XXXXX
   defptr:
     readingBase:
       Beginn     reading
       Breitengrad reading
       Ende       reading
       Entfernung reading
       Laengengrad reading
       Name       reading
       Ort        reading
       Plz        reading
       Strasse    reading
       Telefax    reading
       Telefon    reading
     readingNum:
       Beginn     07
       Breitengrad 10
       Ende       08
       Entfernung 11
       Laengengrad 09
       Name       01
       Ort        04
       Plz        03
       Strasse    02
       Telefax    06
       Telefon    05
     readingOutdated:
     requestReadings:
       update:
         Beginn     reading 07
         Breitengrad reading 10
         Ende       reading 08
         Entfernung reading 11
         Laengengrad reading 09
         Name       reading 01
         Ort        reading 04
         Plz        reading 03
         Strasse    reading 02
         Telefax    reading 06
         Telefon    reading 05
   hmccu:
Attributes:
   comment    Beginn / Ende für eigene Zeitermittelung geht noch nicht. Selber Tag und aktuelle UIhrzeit wird angezeigt.
   model      pharmacy_emergency_service_germany
   reading01Encode UTF-8
   reading01JSON result_01_name
   reading01Name Name
   reading02JSON result_01_street
   reading02Name Strasse
   reading03JSON result_01_plz
   reading03Name Plz
   reading04JSON result_01_place
   reading04Name Ort
   reading05JSON result_01_number
   reading05Name Telefon
   reading06JSON result_01_fax
   reading06Name Telefax
   reading07JSON result_01_start
   reading07Name Beginn
   reading07OExpr FmtDateTime($val)
   reading08JSON result_01_end
   reading08Name Ende
   reading08OExpr FmtDateTime($val)
   reading09JSON result_01_lng
   reading09Name Laengengrad
   reading10JSON result_01_lat
   reading10Name Breitengrad
   reading11JSON result_01_distance
   reading11Name Entfernung
   readingEncode UTF-8
   requestHeader2 Accept-Encoding: gzip, deflate
   requestHeader3 Accept-Language: de-DE,de;;q=0.9,en-US;;q=0.8,en;;q=0.7,fr;;q=0.6
   requestHeader4 User-Agent: Lynx/2.8.8dev.3 libwww-FM/2.14 SSL-MM/1.4.1
   requestHeader5 Referer: http://apothekenfinder.mobi/
   requestHeader6 X-Requested-With: XMLHttpRequest
   requestHeader7 Connection: keep-alive
   room       1.7_Haus
   showBody   0
   stateFormat Name, Telefon, Strasse in Plz Ort
   timeout    60
   userReadings BeginnJG {ReadingsTimestamp($name,"Beginn","") =~ /^(\d+)-(\d+)-(\d+)\s(\d+:\d+):(\d+)$/;
  return "Am $3.$2.".substr($1,length($1)-2,2)." um $4"},
EndeJG {ReadingsTimestamp($name,"Ende","") =~ /^(\d+)-(\d+)-(\d+)\s(\d+:\d+):(\d+)$/;
  return "Am $3.$2.".substr($1,length($1)-2,2)." um $4"}
   userattr   get01Encode get01JSON get01Name get02ExtractAllJSON:0,1 getURL requestHeader requestHeader1


Das sind nochmal meine userreadings und die Ausgabe:
BeginnJG {ReadingsTimestamp($name,"Beginn","") =~ /^(\d+)-(\d+)-(\d+)\s(\d+:\d+):(\d+)$/;
  return "Am $3.$2.".substr($1,length($1)-2,2)." um $4"},
EndeJG {ReadingsTimestamp($name,"Ende","") =~ /^(\d+)-(\d+)-(\d+)\s(\d+:\d+):(\d+)$/;
  return "Am $3.$2.".substr($1,length($1)-2,2)." um $4"}

READINGS:
     2021-11-28 16:46:03   Beginn          2021-11-28 08:30:00
     2021-11-28 16:46:03   BeginnJG        Am 28.11.21 um 16:46
     2021-11-28 16:46:03   Ende            2021-11-29 08:30:00
     2021-11-28 16:46:03   EndeJG          Am 28.11.21 um 16:46


Problem 1: Bei EndeJG wird das Datum des Readings "Beginn" angezeigt.
Problem 2: Wenn ich manuell die Daten vom Apothekenfinder abrufe, wird als Zeit immer die aktuelle Zeit und nicht die vom Server gezogene Uhrzeit (sollte 08:30 sein) angezeigt.

Im Logfile sieht man, dass die Daten und Uhrzeiten korrekt geholt werden.
2021.11.28 16:46:03.096 5: NotdienstApotheke: ExtractReading Beginn with json result_01_start ...
2021.11.28 16:46:03.097 5: NotdienstApotheke: perl expression eval evaluated package main; my $timeDiff = $oRef->{'$timeDiff'};FmtDateTime($val) to 2021-11-28 08:30:00
2021.11.28 16:46:03.097 5: NotdienstApotheke: ExtractReading for reading07-1 sets Beginn to 2021-11-28 08:30:00
2021.11.28 16:46:03.098 5: NotdienstApotheke: ExtractReading value as hex is 323032312d31312d32382030383a33303a3030
2021.11.28 16:46:03.098 5: NotdienstApotheke: ExtractReading Ende with json result_01_end ...
2021.11.28 16:46:03.100 5: NotdienstApotheke: perl expression eval evaluated package main; my $timeDiff = $oRef->{'$timeDiff'};FmtDateTime($val) to 2021-11-29 08:30:00
2021.11.28 16:46:03.100 5: NotdienstApotheke: ExtractReading for reading08-1 sets Ende to 2021-11-29 08:30:00
2021.11.28 16:46:03.100 5: NotdienstApotheke: ExtractReading value as hex is 323032312d31312d32392030383a33303a3030


Wo liegt der Fehler in meinem Userreading?

Grüße Jürgen
Synology DS720+ mit Docker-Container und Haupt-FHEM, HW-LAN, Jalousienaktoren; Raspi 3B+ mit piVCCU ohne FHEM-Instanz, CUL, JeeLink; Raspi 3B+ mit FHEM und HMUARTUSB,  Raspi 3B+ mit HMUARTGPIO, 1-wire, ebusd

betateilchen

Zitat von: bmwfan am 28 November 2021, 17:08:00
Wo liegt der Fehler in meinem Userreading

Eigentlich sind doch beide Werte (BeginnJG und EndeJG) nicht die Werte, die Du haben willst.
Rein von der Ausführung Deiner Userreadings sind die beiden Werte aber völlig korrekt.

Dein Problem dürfte darin liegen, dass Du ReadingsTimestamp() verwendest. In Wirklichkeit willst Du doch nicht den Wert 2021-11-28 16:46:03 verarbeiten, sondern die beiden Werte "2021-11-28 08:30:00" und "2021-11-29 08:30:00"

Dann solltest Du besser mit ReadingsVal() arbeiten statt mit ReadingsTimestamp().
-----------------------
Formuliere die Aufgabe möglichst einfach und
setze die Lösung richtig um - dann wird es auch funktionieren.
-----------------------
Lesen gefährdet die Unwissenheit!

bmwfan

ZitatRein von der Ausführung Deiner Userreadings sind die beiden Werte aber völlig korrekt.

Kannst Du mir das näher erklären? Meinem Verständnis nach sagt der Code
{ReadingsTimestamp($name,"Ende","") =~ /^(\d+)-(\d+)-(\d+)\s(\d+:\d+):(\d+)$/;
  return "Am $3.$2.".substr($1,length($1)-2,2)." um $4"}

aus: Nimm vom Device "$name" das Reading "Ende", interpretiere es als Datum + Uhrzeit und formatiere es um. Wie es umformatiert und angezeigt werden soll wird in dem Codeteil "=~/....." definiert. Dann müsste doch im Ergebnis das Datum des readings "Ende" sein und nicht das Datum eines readings, das gar nicht angesprochen wird.

Der verwendete Code stammte aus einem Besipiel im Forum, wo solch ein Datum umformatiert wurde
Zitathttps://forum.fhem.de/index.php/topic,75493.0.html
Habe es deswegen verwendet. Da ich mit Zeiten arbeiten wollte schien es mir sinnvoll readingstimestamp und nicht readingsval zu verwenden.

Synology DS720+ mit Docker-Container und Haupt-FHEM, HW-LAN, Jalousienaktoren; Raspi 3B+ mit piVCCU ohne FHEM-Instanz, CUL, JeeLink; Raspi 3B+ mit FHEM und HMUARTUSB,  Raspi 3B+ mit HMUARTGPIO, 1-wire, ebusd

betateilchen

Zitat von: bmwfan am 28 November 2021, 18:00:12
Nimm vom Device "$name" das Reading "Ende", interpretiere es als Datum + Uhrzeit und formatiere es um.

Falsch.

ReadingsTimestamp() greift ausschließlich auf den Zeitpunkt zu, zu dem das reading von FHEM angelegt wurde.
Du verarbeitest also die hier rot markierten Daten:

Zitat

READINGS:
     2021-11-28 16:46:03   Beginn          2021-11-28 08:30:00
     2021-11-28 16:46:03   BeginnJG        Am 28.11.21 um 16:46
     2021-11-28 16:46:03   Ende            2021-11-29 08:30:00
     2021-11-28 16:46:03   EndeJG          Am 28.11.21 um 16:46


Deshalb kommen in Deinen userreadings beide Male "Am 28.11.21 um 16:46" als Ergebnis raus.
Sachlich ist das völlig korrekt. Aber es ist nicht das, was Du willst.

Mit dem tatsächlichen Inhalt des readings hat die Funktion ReadingsTimestamp() nichts zu tun.
Wenn man Inhalte verarbeiten will, muss man ReadingsVal() oder ReadingsNum() verwenden.

Zitat von: bmwfan am 28 November 2021, 18:00:12
Der verwendete Code stammte aus einem Besipiel im Forum, wo solch ein Datum umformatiert wurde

Sowas kommt von sowas. Unsinniges copy&paste ohne zu wissen, was man tut.
-----------------------
Formuliere die Aufgabe möglichst einfach und
setze die Lösung richtig um - dann wird es auch funktionieren.
-----------------------
Lesen gefährdet die Unwissenheit!

bmwfan

ZitatReadingsTimestamp() greift ausschließlich auf den Zeitpunkt zu, zu dem das reading von FHEM angelegt wurde.
Wieder was gelernt. War mir so nicht bewußt. Dachte es ist eine allgemeine Funktion zum Umformatieren von Daten und Zeiten und beim Naclesen ist mir nicht aufgefallen, dass auf das aktuelle Datum und die Uhrzeit zugegriffen wird.

ZitatSowas kommt von sowas. Unsinniges copy&paste ohne zu wissen, was man tut.

Unsinnig würde ich nun doch nicht in der Härte sagen da ich mir schon überlegt habe, ob das Beispiel zu meinem Fall passt und es mir schlüssig erschien.  ;)
Ohne (genau) zu wissen was man tut: da stimme ich Dir zu. Es ist aber auch wirklich ein komplexes Thema. Beim Aufbau der Hausautomatisierung, was meist Abends oder am WE erfolgt, stößt man auf ein konkretes Problem und schaut, wie man es schnell lösen kann. Das hat natürlich nicht viel mit dem systematischen Erlernen einer Programmiersprache / von FHEM zu tun.

Danke für die Hilfe. Ich werde mich an ReadingsVal versuchen.
Synology DS720+ mit Docker-Container und Haupt-FHEM, HW-LAN, Jalousienaktoren; Raspi 3B+ mit piVCCU ohne FHEM-Instanz, CUL, JeeLink; Raspi 3B+ mit FHEM und HMUARTUSB,  Raspi 3B+ mit HMUARTGPIO, 1-wire, ebusd