Probleme mit HTTPMOD und regex

Begonnen von Jump2016, 28 Oktober 2018, 20:03:54

Vorheriges Thema - Nächstes Thema

Jump2016

hallo zusammen,

ich nutze seit längerem HTTPMOD um die Preise von Tankstellen abzufragen.

Dazu habe ich z.B. folgendes Device bei mir eingerichtet:


defmod tank_merklingen HTTPMOD https://www.gibgas.de/Tankstellen/Detail_D_89188_Merklingen_Nellinger%20Stra%C3%9Fe_24 600
attr tank_merklingen userattr reading01Name reading01Regex
attr tank_merklingen alias Aral Merklingen
attr tank_merklingen enableControlSet 1
attr tank_merklingen event-on-change-reading Erdgas_Temp
attr tank_merklingen reading01Name Erdgas_Temp
attr tank_merklingen reading01Regex 9pt[^0-9]+([0-9\,]+)
attr tank_merklingen requestHeader.* 1
attr tank_merklingen room Geräte


Dies hat bis Samstagabend auch funktioniert.

Nun bekomme ich im Log immer die Meldung:
tank_merklingen: Read response to update didn't match any Reading

Ich vermute mal auf der URL https://www.gibgas.de/Tankstellen/Detail_D_89188_Merklingen_Nellinger%20Stra%C3%9Fe_24
hat sich etwas geändert, kann aber nicht erkennen was und warum mein Regex nicht mehr funktioniert.

Kann mir hier jemand helfen?

Vielen Dank

Gruß

Jonas

amenomade

Die Seite liefert:
<b>Preis/kg: <span style="font-size: 9pt;">1,069 <span style="color: red;font-size: 9pt;">€</span></span>

Dann musst Du in deiner Regex zwischen 9pt und capture group die Zeichen ;"> mitberücksichtigen. Einfach auf https://regex101.com/ testen
Pi 3B, Alexa, CUL868+Selbstbau 1/2λ-Dipol-Antenne, USB Optolink / Vitotronic, Debmatic und HM / HmIP Komponenten, Rademacher Duofern Jalousien, Fritz!Dect Thermostaten, Proteus

StefanStrobel

Hallo,

Bei solchen Problemen ist es fast immer sinnvoll, erst einmal verbose auf 5 zu setzen und ins Log zu schauen. Ich habe Deine Konfiguration gerade mal bei mir eingetragen und der Server liefert eine leere Seite aus. Sofern ich mich nicht vertippt habe sieht es so aus, als ob der Server-Betreiber nur noch Anfragen von echten Browsern beantworten möchte und eben nicht von automatisierten Abfragen.
Wenn er sich damit nicht viel Mühe gegeben hat, sollte es ausreichen, die Header, die auch ein Firefox oder Chrome mitschickt, einfach auch von Fhem schicken zu lassen.
Dazu einfach mehrere Attribute wie requestHeader1, requestHeader2 etc. setzen um Accept, UserAgent etc. mit den üblichen Werten mitzuschicken. Das könnte schon reichen.

Gruß
    Stefan

Jump2016

@amenomade, und wie mach ich das?
Kenn mich mit regex nicht wirklich aus.

@StefanStrobel
Danke für den Tipp mit dem Verbose 5

Wenn ich dies mache, dann steht folgendes im Log:

2018.10.28 21:49:17 4: tank_merklingen: GetUpdate called (reread)
2018.10.28 21:49:17 4: tank_merklingen: AddToQueue adds update, initial queue len: 0
2018.10.28 21:49:17 5: tank_merklingen: AddToQueue adds type update to URL https://www.gibgas.de/Tankstellen/Detail_D_89188_Merklingen_Nellinger%20Stra%C3%9Fe_24, no data, header 1, retry 0
2018.10.28 21:49:17 5: tank_merklingen: HandleSendQueue called, qlen = 1
2018.10.28 21:49:17 4: tank_merklingen: HandleSendQueue sends request type update to URL https://www.gibgas.de/Tankstellen/Detail_D_89188_Merklingen_Nellinger%20Stra%C3%9Fe_24, No Data,
header: 1
timeout 2
2018.10.28 21:49:17 5: HttpUtils url=https://www.gibgas.de/Tankstellen/Detail_D_89188_Merklingen_Nellinger%20Stra%C3%9Fe_24
2018.10.28 21:49:17 5: HttpUtils request header:
GET /Tankstellen/Detail_D_89188_Merklingen_Nellinger%20Stra%C3%9Fe_24 HTTP/1.0
Host: www.gibgas.de
User-Agent: fhem
Accept-Encoding: gzip,deflate
1
Content-Length: 0
Content-Type: application/x-www-form-urlencoded

2018.10.28 21:49:17 4: https://www.gibgas.de/Tankstellen/Detail_D_89188_Merklingen_Nellinger%20Stra%C3%9Fe_24: HTTP response code 200
2018.10.28 21:49:17 5: HttpUtils https://www.gibgas.de/Tankstellen/Detail_D_89188_Merklingen_Nellinger%20Stra%C3%9Fe_24: Got data, length: 0
2018.10.28 21:49:17 5: HttpUtils response header:
HTTP/1.1 200 OK
Date: Sun, 28 Oct 2018 20:49:17 GMT
Content-Type: text/html
Content-Length: 0
Connection: close
Server: Apache
Set-Cookie: PHPSESSID=464542cb625692d77b78c89763a8a47a; path=/
Expires: Thu, 19 Nov 1981 08:52:00 GMT
Cache-Control: no-store, no-cache, must-revalidate
Pragma: no-cache
MySQL: replaced
2018.10.28 21:49:17 4: tank_merklingen: Read callback: request type was update retry 0, body empty
2018.10.28 21:49:17 5: tank_merklingen: ExtractSid called, context reading, num
2018.10.28 21:49:17 4: tank_merklingen: CheckAuth decided no authentication required
2018.10.28 21:49:17 5: tank_merklingen: UpdateReadingList created list of reading.* nums to parse during getUpdate as 01
2018.10.28 21:49:17 5: tank_merklingen: Read starts parsing response to update with defined readings: 01
2018.10.28 21:49:17 5: tank_merklingen: ExtractReading Erdgas_Temp with regex /9pt[^0-9]+([0-9\,]+)/...
2018.10.28 21:49:17 5: tank_merklingen: ExtractReading Erdgas_Temp did not match
2018.10.28 21:49:17 3: tank_merklingen: Read response to update didn't match any Reading
2018.10.28 21:49:17 5: tank_merklingen: HandleSendQueue called, qlen = 0


wenn ich das nun richtig verstehe, dann wird da schon die Seite richtig zurückgegeben, das regex passt halt nicht mehr  :(

StefanStrobel

Nein, Du bekommst eine leere Seite:


Content-Length: 0

bzw.

2018.10.28 21:49:17 4: tank_merklingen: Read callback: request type was update retry 0, body empty


Du musst also Deinen Request so anpassen, dass auch eine Seite geliefert wird.
Ein weiterer Header reicht vermutlich schon aus:


attr tank_merklingen requestHeader3: User-Agent: Mozilla/5.0 (Windows NT 10.0 Win64 x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/69.0.3497.100 Safari/537.36


Gruss
   Stefan

Jump2016

@StefanStrobel
Danke so funktionierts wieder  :)