Hallo zusammen,
ich bin auf der Suche, wie ich den Preis von HVO 100 auslesen kann. Mittlerweile ist eine Tankstelle von Hoyer in Dormagen bei clever-tanken.de eingepflegt - nur ist es leider so, dass der Preis vom Betreiber nicht beim Bundeskartellamt gemeldet wird, so dass er sich nur sporadisch dann ändert, wenn ein User den aktuellen Preis bei clever-tanken.de meldet.
Hoyer hat eine Webseite, bei der der aktuelle Preis eingesehen werden kann. Damit ist es prinzipiell möglich den Preis für "HVO 100" per HTTPMOD auszulesen. Da die Seite aber anders aufgebaut ist, greift die Definition bei clever-tanken.de zum Auslesen nicht.
Könnte sich jemand diese Seite: https://www.hoyer.de/tankstelle/hoyer-automatenstation-41540-dormagen-alte-heerstr-2|48/ (https://www.hoyer.de/tankstelle/hoyer-automatenstation-41540-dormagen-alte-heerstr-2%7C48/) freundlicherweise anschauen und mir sagen, wie die Regex aussehen muss, um den Preis von "HVO 100" auszulesen? Vor Jahren hatte ich mich ansatzweise mit dieser Materie beschäftigt, aber mittlerweile ist auch das weg.
Viele Grüße Gisbert
Hallo zusammen,
da sich bisher niemand gemeldet hat, ist dies ein Versuch, Aufmerksamkeit zu erreichen.
Viele Grüße Gisbert
Zitat von: Gisbert am 28 Juni 2024, 09:18:42ist dies ein Versuch, Aufmerksamkeit zu erreichen.
sowas nervt... ok, negative Aufmerksamkeit ist immerhin auch Aufmerksamkeit.
Zitat von: betateilchen am 28 Juni 2024, 09:52:02sowas nervt... ok, negative Aufmerksamkeit ist immerhin auch Aufmerksamkeit.
Darüber dass es jemanden "nervt" bin ich mehr erstaunt als dass man noch mal einen kleinen "Aufmerksamkeits"-Post absetzt. Nicht jeder sieht jeden Tag alles was hier im Forum abgeht...
Ob der Post schon nach 1,5 Tagen nötig gewesen wäre, ist auch für mich fraglich.
Aber helfen möchte man (zumindest ich) gern, wenn es denn geht.
Ich habe leider im Moment keinen Zugriff auf ein FHEM System um Dir (Gisbert) eine fertige Lösung anbieten zu können, dafür fehlt mir auch das spezielle Wissen um HTTPMOD.
Probier mal folgendes:
readingXXRegex HVO.100<.h.*css-125p0aq.ev2ns5r2..(\d\.<span>\d\d<.*css-1k8r6qu ev2ns5r1..\d)
readingOExpr $val =~ s/(\d.)<span>(\d+)<[\d\D]+>(\d)/$1$2$3/;;$val
Gruß
Dan
Hallo Dan,
ich versuche immer sachlich und hoffentlich auch freundlich Anfragen zu stellen. In diesem Fall hatte ich mich zunächst an einen bestehenden Thread zum generellen Thema HTTPMOD drangehängt und meine Frage gestellt. Nachdem ich gewartet hatte (Zeit weiß ich nicht mehr genau, es waren vermutlich einige Tage), und keine Antwort bekommen habe, kam mir der Gedanke, dass es vielleicht unklug ist in einem allgemeinen Thema zu HTTPMOD meine spezielle Frage zu stellen. Deshalb habe ich einen neuen Thread geöffnet und die Beiträge im anderen Thread gelöscht, um Doppel-Posts und Konfusion zu vermeiden.
Dass es tatsächlich erst 1.5 Tage her sind, dass ich meine Anfrage gestellt hatte, hab ich im Nachhinein auch bemerkt - ich werde also für die Zukunft länger warten und auf eine Antwort hoffen.
Zum Thema:
Wenn ich das "innere HTML" in regex101.com kopiere:
<h5 class="css-rkiwex ev2ns5r3">HVO.100</h5><h5 class="css-125p0aq.ev2ns5r2">1.<span>87</span><span class="css-1k8r6qu ev2ns5r1">9</span></h5><span class="css-ot4ncn ev2ns5r0">28.06.2024
11:24 Uhr</span>
und mit dieser Regex abfrage:
HVO.100<.h.*css-125p0aq.ev2ns5r2..(\d\.<span>\d\d<.*css-1k8r6qu ev2ns5r1..\d)
erhalte ich als Group 1:
1.<span>87</span><span class="css-1k8r6qu ev2ns5r1">9
Edit (s. unten): Damit sind schon mal alle Informationen vorhanden, aber das Attribut getxxOExpr liefert kein Ergebnis.
Mit verbose 5 erhalte ich dagegen folgende Einträge, wenn ich eine Anfrage starte (reread):
2024.06.28 12:55:25.631 5: Premiumdiesel: ExtractReading Hoyer_Automatenstation_Dormagen with regex /(?^:HVO.100<.h.*css-125p0aq.ev2ns5r2..(\d\.<span>\d\d<.*css-1k8r6qu ev2ns5r1..\d))/...
2024.06.28 12:55:25.632 5: Premiumdiesel: ExtractReading Hoyer_Automatenstation_Dormagen did not match
2024.06.28 12:55:25.632 4: Premiumdiesel: Read response to get04 didn't match any Reading
Viele Grüße Gisbert
Edit:
Das Attribut getxxOExpr würde das richtige Ergebnis liefern, wenn die Abfrage richtig funktionieren würde:
{my $val = '1.<span>87</span><span class="css-1k8r6qu ev2ns5r1">9';; $val =~ s/(\d.)<span>(\d+)<[\d\D]+>(\d)/$1$2$3/;;$val}
liefert: 1.879
Demnach ist die Abfrage noch nicht in Ordnung, getxxOExpr schon.
Hallo zusammen,
diesmal als Ergänzung zum vorherigen Beitrag (ich wollte das Editieren nicht überstrapazieren).
Log-Auszug mit verbose 4:
2024.06.28 16:18:35.300 4: kill_HVO_100: GetUpdate called (reread)
2024.06.28 16:18:35.302 4: kill_HVO_100: HandleSendQueue sends update with timeout 10 to https://www.hoyer.de/tankstelle/hoyer-automatenstation-41540-dormagen-alte-heerstr-2%7C48/, No Data, No Header
2024.06.28 16:18:36.361 4: kill_HVO_100: Read callback: request type was update retry 0,
header: HTTP/1.1 200 OK
Content-Type: text/html
Content-Length: 237337
Connection: close
Last-Modified: Fri, 28 Jun 2024 04:49:42 GMT
Server: AmazonS3
Date: Fri, 28 Jun 2024 14:18:36 GMT
Cache-Control: public, max-age=0, must-revalidate
ETag: "2853683fd1d315e62cd8cfd72e9c7fe5"
Vary: Accept-Encoding
X-Cache: RefreshHit from cloudfront
Via: 1.1 c80ae6bd97b709ed6e4747f0d5ea4efc.cloudfront.net (CloudFront)
X-Amz-Cf-Pop: FRA60-P3
X-Amz-Cf-Id: ftUM7TM_-T1wuS_7pgjB3Dz3wBL526WWe5VgBAnAKCAbQ4vK2qeSKQ==, body length 237337
2024.06.28 16:18:36.362 4: kill_HVO_100: BodyDecode is not decoding the response body (charset not found, bodyDecode defaults to none)
2024.06.28 16:18:36.363 4: kill_HVO_100: checking for redirects, code=200, ignore=0
2024.06.28 16:18:36.363 4: kill_HVO_100: no redirects to handle
2024.06.28 16:18:36.364 4: kill_HVO_100: Read response to update didn't match any Reading
Device-Definition (als einzelne Abfrage, um den Vorgang lesbar zu halten):
defmod kill_HVO_100 HTTPMOD https://www.hoyer.de/tankstelle/hoyer-automatenstation-41540-dormagen-alte-heerstr-2%7C48/ 600
attr kill_HVO_100 enableControlSet 1
attr kill_HVO_100 enableCookies 1
attr kill_HVO_100 group Dieselpreise
attr kill_HVO_100 icon fuel
attr kill_HVO_100 model clever_tanken_single_station
attr kill_HVO_100 reading01Name HVO100
attr kill_HVO_100 reading01OExpr $val =~ s/(\d.)<span>(\d+)<[\d\D]+>(\d)/$1$2$3/;;;; $val
attr kill_HVO_100 reading01Regex HVO.100<.h.*css-125p0aq.ev2ns5r2..(\d\.<span>\d\d<.*css-1k8r6qu ev2ns5r1..\d)
attr kill_HVO_100 room Strassenverkehr
attr kill_HVO_100 stateFormat HVO100
attr kill_HVO_100 timeout 10
attr kill_HVO_100 verbose 4
Hier noch einvollständiges List:
define kill_HVO_100 HTTPMOD https://www.hoyer.de/tankstelle/hoyer-automatenstation-41540-dormagen-alte-heerstr-2%7C48/ 600
attr kill_HVO_100 enableControlSet 1
attr kill_HVO_100 enableCookies 1
attr kill_HVO_100 group Dieselpreise
attr kill_HVO_100 icon fuel
attr kill_HVO_100 model clever_tanken_single_station
attr kill_HVO_100 reading01Name HVO100
attr kill_HVO_100 reading01OExpr $val =~ s/(\d.)<span>(\d+)<[\d\D]+>(\d)/$1$2$3/;;;; $val
attr kill_HVO_100 reading01Regex HVO.100<.h.*css-125p0aq.ev2ns5r2..(\d\.<span>\d\d<.*css-1k8r6qu ev2ns5r1..\d)
attr kill_HVO_100 room Strassenverkehr
attr kill_HVO_100 stateFormat HVO100
attr kill_HVO_100 timeout 10
attr kill_HVO_100 verbose 4
# BUSY 0
# CFGFN
# DEF https://www.hoyer.de/tankstelle/hoyer-automatenstation-41540-dormagen-alte-heerstr-2%7C48/ 600
# FUUID 667eb87d-f33f-e986-6773-b8eab011228fe8a5
# Interval 600
# MainURL https://www.hoyer.de/tankstelle/hoyer-automatenstation-41540-dormagen-alte-heerstr-2%7C48/
# ModuleVersion 4.2.0 - 11.8.2023
# NAME kill_HVO_100
# NOTIFYDEV global
# NR 1456
# NTFY_ORDER 50-kill_HVO_100
# STATE HVO100
# TYPE HTTPMOD
# eventCount 15
# value
# CompiledRegexes:
# HttpUtils:
# NAME
# addr https://www.hoyer.de:443
# auth 0
# buf
# code 200
# compress 1
# conn
# data
# displayurl https://www.hoyer.de/tankstelle/hoyer-automatenstation-41540-dormagen-alte-heerstr-2%7C48/
# header
# host www.hoyer.de
# httpheader HTTP/1.1 200 OK
#Content-Type: text/html
#Content-Length: 237337
#Connection: close
#Last-Modified: Fri, 28 Jun 2024 04:49:42 GMT
#Server: AmazonS3
#Date: Fri, 28 Jun 2024 14:18:36 GMT
#Cache-Control: public, max-age=0, must-revalidate
#ETag: "2853683fd1d315e62cd8cfd72e9c7fe5"
#Vary: Accept-Encoding
#X-Cache: RefreshHit from cloudfront
#Via: 1.1 c80ae6bd97b709ed6e4747f0d5ea4efc.cloudfront.net (CloudFront)
#X-Amz-Cf-Pop: FRA60-P3
#X-Amz-Cf-Id: ftUM7TM_-T1wuS_7pgjB3Dz3wBL526WWe5VgBAnAKCAbQ4vK2qeSKQ==
# httpversion 1.0
# hu_blocking 0
# hu_filecount 1
# hu_port 443
# hu_portSfx
# ignoreredirects 1
# loglevel 4
# path /tankstelle/hoyer-automatenstation-41540-dormagen-alte-heerstr-2%7C48/
# protocol https
# redirects 0
# timeout 10
# url https://www.hoyer.de/tankstelle/hoyer-automatenstation-41540-dormagen-alte-heerstr-2%7C48/
# sslargs:
# QUEUE:
# READINGS:
# 2024-06-28 15:53:44 attrTemplateVersion 20201129
# REQUEST:
# context reading
# data
# header
# ignoreredirects 0
# num unknown
# retryCount 0
# type update
# url https://www.hoyer.de/tankstelle/hoyer-automatenstation-41540-dormagen-alte-heerstr-2%7C48/
# helper:
# bm:
# CODE(0x56358473aa58):
# cnt 50
# dmx -1000
# dtot 0
# dtotcnt 0
# mTS 28.06. 15:27:59
# max 0.000174999237060547
# tot 0.00428271293640137
# mAr:
# HASH(0x5635989c8850)
# kill_HVO_100
# ?
# CODE(0x5635847bdc60):
# cnt 219
# dmx -1000
# dtot 0
# dtotcnt 0
# mTS 28.06. 15:53:44
# max 0.48801589012146
# tot 0.614885091781616
# mAr:
# HASH(0x5635989c8850)
# kill_HVO_100
# attrTemplate
# clever_tanken_single_station
# CODE(0x5635848a69a8):
# cnt 8
# dmx -1000
# dtot 0
# dtotcnt 0
# mTS 28.06. 15:38:02
# max 0.0020749568939209
#- tot 0.0159111022949219
# mAr:
# HASH(0x5635989c8850)
# kill_HVO_100 HTTPMOD https://www.hoyer.de/tankstelle/hoyer-automatenstation-41540-dormagen-alte-heerstr-2|48/ 600
# CODE(0x5635848a7960):
# cnt 106
# dmx -1000
# dtot 0
# dtotcnt 0
# mTS 28.06. 15:53:44
# max 6.00814819335938e-05
# tot 0.00172209739685059
# mAr:
# HASH(0x5635989c8850)
# HASH(0x56357ec54e20)
# CODE(0x5635848a8dc8):
# cnt 82
# dmx -1000
# dtot 0
# dtotcnt 0
# mTS 28.06. 15:57:18
# max 0.00847005844116211
# tot 0.123710632324219
# mAr:
# set
# kill_HVO_100
# verbose
# 4
# lastpoll:
# Hoyer_Automatenstation_Dormagen 1719582382.73628
#
setstate kill_HVO_100 HVO100
setstate kill_HVO_100 2024-06-28 15:53:44 attrTemplateVersion 20201129
Warum kein Treffer gefunden wird, ist mir ein Rätsel.
Viele Grüße Gisbert
Hab es mir mal angesehen!
Die unter der URL geladene Webseite enthält keinen HTML Code. Dieser wird erst durch JavaScript erzeugt, hab keine Ahnung ob HTTPMOD das irgendwie per Attribut kann.
Gruß
Dan
Hallo Dan,
vielen Dank für deine Antwort zu JavaScript und HTTPMOD. Dann muss ich mich wohl vom Ziel verabschieden, den Preis abfragen zu können.
Viele Grüße Gisbert
Zitat von: Gisbert am 28 Juni 2024, 20:32:03Dann muss ich mich wohl vom Ziel verabschieden, den Preis abfragen zu können.
Ich weiß nicht ob das wirklich so ist!
Wie gesagt, evtl. gibt es dazu eine mögliche Konfiguration für HTTPMOD.
Gruß
Dan
ohne Gewähr:
defmod hoymod HTTPMOD https://api.hoyer.de/rest/gas-stations/48/prices/146
attr hoymod extractAllJSON 1
VG
habl
Zitat von: DeeSPe am 28 Juni 2024, 11:00:28Ob der Post schon nach 1,5 Tagen nötig gewesen wäre, ist auch für mich fraglich.
Aber helfen möchte man (zumindest ich) gern, wenn es denn geht.
Ich habe leider im Moment keinen Zugriff auf ein FHEM System um Dir (Gisbert) eine fertige Lösung anbieten zu können
Darum ging es mir. Man möchte ja helfen, aber das Forum ist halt keine 24/7 Supportabteilung und manchmal muss man deshalb eben etwas mehr Geduld haben.
Im Moment bin ich seit Mittwoch nur mit ipad auf Reisen, und damit macht Quellcodeanalyse einfach keinen Spaß.
Zitat von: habl am 29 Juni 2024, 08:52:52ohne Gewähr:
defmod hoymod HTTPMOD https://api.hoyer.de/rest/gas-stations/48/prices/146
attr hoymod extractAllJSON 1
VG
habl
Hallo habe,
phänomenal, es funktioniert und die Preise sind mit denen auf der Homepage identisch.
Wie hast du diese Quelle ausfindig gemacht? Ich hatte deren Service per Email angeschrieben und nach einer Datenschnittstelle gefragt, dann aber nur den Link zu deren Homepage bekommen.
Da das meiste an Readings nicht gebraucht wird, hab ich es noch so eingeschränkt:
attr <device> extractAllJSONFilter preise_03_preis
Das Reading preise_03_preis ist der Preis für HVO 100.
Kann man auch noch nach mehr als einem Ausdruck filtern? Die commandref sagt nur:
extractAllJSONFilter
is an optional regular expression that filters the readings to be created with extractAllJSON.
Vielen Dank und viele Grüße
Gisbert
Edit:
Wenn man es so einschränkt:
attr <device> extractAllJSONFilter preise_03_.*
bekommt man alles was mit "preise_03_" anfängt - schon mal deutlich weniger, aber immer noch viel.
Edit2:
So geht es:
attr <device> extractAllJSONFilter preise_03_preis|preise_03_gueltig_datum|preise_03_gueltig_zeit|preise_03_kraftstoffe_name
Du findest sowas z.B. mit den Entwicklertools von Chrome. In diesem Fall hatte ich die API auch gefunden, aber keine Zeit zum Posten gehabt. Dazu habe ich die Seite aufgerufen, die Entwicklertools geöffnet, Fetch/XHR im Network-Tab ausgewählt und dann nach dem Preis gesucht. Da waren eh nur vier Items geladen und das letzte war's dann auch.
Wenn es schon eine api gibt, die json als Ergebnis liefert, wäre meine Empfehlung aber JsonMod anstatt HTTPMOD, dann kann man sich genau die Werte als reading erzeugen, die man wirklich haben möchte.
Super, das ist mal wieder eine api, die nur per IPv4 erreichbar ist :-\
defmod hoyer JsonMod https://api.hoyer.de/rest/gas-stations/48/prices/146
attr hoyer readingList single(jsonPath('$.preise.2.preis'),"hvo100",-1)
Zitat von: betateilchen am 29 Juni 2024, 17:13:38defmod hoyer JsonMod https://api.hoyer.de/rest/gas-stations/48/prices/146
attr hoyer readingList single(jsonPath('$.preise.2.preis'),"hvo100",-1)
Hallo betateilchen,
deine Definition funktioniert erwartungsgemäß, besten Dank.
Was ist der Grund, warum du in diesem Fall JsonMod statt HTTPMOD empfiehlst? Die angefragte Webseite ist ja sehr "klein" und enthält ja nur etwas Text. Macht es da noch einen Unterschied zwischen JsonMod oder HTTPMOD?
Viele Grüße Gisbert
JsonMod ist halt das Modul, das speziell für die Verarbeitung von json Daten gemacht wurde.
Zum Vergleich:
Du benutzt doch auch nicht Excel, um einen Brief zu schreiben? Auch wenn es technisch ,,irgendwie" funktionieren würde.
Genau so ist es mit JsonMod und HTTPMOD. Das eine ist für json, das andere für html.
Und die api liefert halt json und nicht html.