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
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().
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.
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.
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.