FHEM Forum

FHEM => Codeschnipsel => Thema gestartet von: subseven am 09 Januar 2020, 16:51:01

Titel: Abfrage Heizölpreis HTTPMOD
Beitrag von: subseven am 09 Januar 2020, 16:51:01
Für die Bestellung meiner Heizölvorräte beobachte ich immer den Preis eine Zeitlang. Dafür hole ich mir von der Seite "esyoil.com" die aktuellen Preise für die benötigte Menge. Der angegebene Preis entspricht dann dem Tatsächlich möglichem Kaufpreis.

Für Interessierte anbei mein HTTPMOD ggf. Hat ja Jemand Verbesserungsvorschläge:

defmod Heizoel HTTPMOD https://www.esyoil.com/preisausgabe.php?pr-unloading-points=1&pr-product=8&pr-payment-type=2&pr-truck-type=&pr-hose-length=&pr-app=1&pr-zip=[PLZ]&pr-amount=[Menge in Litr]&submit= 1800
attr Heizoel userattr reading01Expr reading01Name reading01Regex reading02Name reading02Regex reading03Name reading03Regex reading04Name reading04Regex
attr Heizoel enableControlSet 1
attr Heizoel reading01Expr $val =~ s/,/\./;; $val;;
attr Heizoel reading01Name Heizoelpreis
attr Heizoel reading01Regex <span class="fw_b ">([\d\,]+)
attr Heizoel room Konfiguration->Websites
attr Heizoel stateFormat Heizöl Heizoelpreis €


In der URL sind die Punkte zip=[PLZ] Durch die eigene Postleitzahl und amount=[Menge in Litr] Durch die Benötigte Menge in Litern abzuändern.
Beispielsweise:
https://www.esyoil.com/preisausgabe.php?pr-unloading-points=1&pr-product=8&pr-payment-type=2&pr-truck-type=&pr-hose-length=&pr-app=1&pr-zip=[PLZ]&pr-amount=[Menge in Litr]&submit= 1800
Ersetzen durch:
https://www.esyoil.com/preisausgabe.php?pr-unloading-points=1&pr-product=8&pr-payment-type=2&pr-truck-type=&pr-hose-length=&pr-app=1&pr-zip=36211&pr-amount=3500&submit= 1800

Grüße
Titel: Antw:Abfrage Heizölpreis HTTPMOD
Beitrag von: yersinia am 10 Januar 2020, 16:31:02
Cool! Ich hab mich dessen bedient und basierend auf diesen Post (https://forum.fhem.de/index.php/topic,106953.msg1008007.html#msg1008007) es etwas erweitert:
<< siehe post #9 (https://forum.fhem.de/index.php/topic,107189.msg1017754.html#msg1017754) >>
PLZ und Menge können dynamisch über die Attribute
attr Heizoelpreis replacement01Value 36211 (PLZ)
attr Heizoelpreis replacement02Value 3500 (Menge in l)
angepasst werden.
Titel: Antw:Abfrage Heizölpreis HTTPMOD
Beitrag von: subseven am 13 Januar 2020, 09:42:47
Die Attribute werde ich bei mir auch noch nachrüsten. Danke!
Titel: Antw:Abfrage Heizölpreis HTTPMOD
Beitrag von: Bartimaus am 15 Januar 2020, 10:56:11
Sehr cool, habe für mich jetzt noch Userreadings hinzugefügt (Tankvolumen, Nachfuellmenge (berechnet aus dem Tankvolumen-Fuellstand (aus Heizoel.Hourcounter), Nachüllkosten). Das ganze dann 2 x täglich per Pushnachricht.

Ginge bestimmt auch per attr/regex aber so fit bin ich in der Materie nicht
Titel: Antw:Abfrage Heizölpreis HTTPMOD
Beitrag von: tarum am 15 Januar 2020, 12:32:40
hallo

@Bartimaus würdest du diesen userreadings abschnitt zur Verfügung stellen.

Danke
Titel: Antw:Abfrage Heizölpreis HTTPMOD
Beitrag von: Tedious am 15 Januar 2020, 13:52:31
Tolle Sache - danke für den Codeschnipsel!
Titel: Antw:Abfrage Heizölpreis HTTPMOD
Beitrag von: Bartimaus am 15 Januar 2020, 14:16:00
Zitat von: tarum am 15 Januar 2020, 12:32:40
hallo

@Bartimaus würdest du diesen userreadings abschnitt zur Verfügung stellen.

Danke

Bitte:

attr Heizoelpreis replacement02Mode expression
attr Heizoelpreis replacement02Regex %%MENGE%%
attr Heizoelpreis replacement02Value ReadingsVal("Heizoelpreis","Tankmenge",0)
attr Heizoelpreis room Heizung,Widget
attr Heizoelpreis stateFormat {"<div>".ReadingsTimestamp($name,"Heizoelpreis","-")." \
<b>".ReadingsVal($name,"Heizoelpreis","-")."&euro;;</b>/100l</div>"}
attr Heizoelpreis userReadings Tankvolumen:none {}, Tankmenge {ReadingsVal("Heizoelpreis","Tankvolumen",0)-ReadingsVal("CN.Blaubrenner","appTanklevel",0)}, Fuellkosten {ReadingsVal("Heizoelpreis","Tankmenge",0)/100*ReadingsVal("Heizoelpreis","Heizoelpreis",0)}


Das Tankvolumen dann manuell setzen (setreading....)

Titel: Antw:Abfrage Heizölpreis HTTPMOD
Beitrag von: tarum am 16 Januar 2020, 12:24:24
@Bartimaus

Danke
Titel: Antw:Abfrage Heizölpreis HTTPMOD
Beitrag von: GreenFHEMfan am 26 Januar 2020, 20:48:17
Hallo - Super Codeschnipsel,
wäre es auch möglich mehrere Abnahmestellen zu konfigurieren um evtl den Preis für eine Sammelbestellung zu erfragen?
Titel: Antw:Abfrage Heizölpreis HTTPMOD
Beitrag von: yersinia am 27 Januar 2020, 10:16:39
Zitat von: mnennstiel am 26 Januar 2020, 20:48:17wäre es auch möglich mehrere Abnahmestellen zu konfigurieren um evtl den Preis für eine Sammelbestellung zu erfragen?
Ja, einfach das Attribut hinter pr-hose-length= ergänzen.
Müsste ungefähr so funktionieren, ungetestet:
siehe Edit 2020-03-10

EDIT 2020-02-01: Bedingungen für %%ANHAENGER%% angepasst; siehe auch HTTPMOD DEF oben unten.

EDIT 2020-02-03: Beta-User (https://forum.fhem.de/index.php?action=profile;u=9229) hat es in die httpmod.templates (https://forum.fhem.de/index.php/topic,108051.0.html) übernommen

EDIT 2020-03-10: esyoil hat die Seite angepasst und das obige httpmod findet keine Preise mehr. Hier eine aktualisierte Version basierend auf post #19 (https://forum.fhem.de/index.php/topic,107189.msg1030838.html#msg1030838) (es ändert sich nur attr Heizoelpreis reading010Regex ([\d\,]+)[\s]*€):
defmod Heizoelpreis HTTPMOD https://www.esyoil.com/preisausgabe.php?pr-unloading-points=%%ENTLADESTELLEN%%&pr-product=8&pr-payment-type=2&%%ANHAENGER%%&pr-hose-length=%%SCHLAUCHLAENGE%%&pr-app=1&pr-zip=%%PLZ%%&pr-amount=%%MENGE%%&submit= 1800
attr Heizoelpreis userattr reading010Name reading010OExpr reading010Regex replacement01Mode:reading,internal,text,expression,key replacement01Regex replacement01Value replacement02Mode:reading,internal,text,expression,key replacement02Regex replacement02Value replacement03Mode:reading,internal,text,expression,key replacement03Regex replacement03Value replacement04Mode:reading,internal,text,expression,key replacement04Regex replacement04Value replacement05Mode:reading,internal,text,expression,key replacement05Regex replacement05Value
attr Heizoelpreis enableControlSet 1
attr Heizoelpreis reading010Name Heizoelpreis
attr Heizoelpreis reading010OExpr $val =~ s/,/\./;; $val;;
attr Heizoelpreis reading010Regex ([\d\,]+)[\s]+€
attr Heizoelpreis replacement01Mode text
attr Heizoelpreis replacement01Regex %%PLZ%%
attr Heizoelpreis replacement01Value 36211
attr Heizoelpreis replacement02Mode text
attr Heizoelpreis replacement02Regex %%MENGE%%
attr Heizoelpreis replacement02Value 3500
attr Heizoelpreis replacement03Mode text
attr Heizoelpreis replacement03Regex %%ENTLADESTELLEN%%
attr Heizoelpreis replacement03Value 1
attr Heizoelpreis replacement04Mode text
attr Heizoelpreis replacement04Regex %%SCHLAUCHLAENGE%%
attr Heizoelpreis replacement04Value 40m
attr Heizoelpreis replacement05Mode text
attr Heizoelpreis replacement05Regex %%ANHAENGER%%
attr Heizoelpreis replacement05Value pr-truck-type=
attr Heizoelpreis room HEIZOEL
attr Heizoelpreis stateFormat {"<div>".ReadingsTimestamp($name,"Heizoelpreis","-")." \
<b>".ReadingsVal($name,"Heizoelpreis","-")."&euro;;</b>/100l</div>"}
attr Heizoelpreis webCmd reread

replacement01Regex %%PLZ%% nimmt via replacement01Value die PLZ auf

replacement02Regex %%MENGE%% gibt via replacement02Value die Menge zu bestellenden Heizöls in Liter an

replacement03Regex %%ENTLADESTELLEN%% nimmt über replacement03Value die Entladestellen auf, ist hier mit 1 vorbelegt

replacement04Regex %%SCHLAUCHLAENGE%% gibt über replacement04Value die Schlauchlänge vor, Standard sind 40[m]; Optionen der Webseite sind 40, 60 und 80
--> [2020-03-17] hier gab es auch eine Änderung (siehe post #39 (https://forum.fhem.de/index.php/topic,107189.msg1032384.html#msg1032384)): neue Werte für replacement04Value sind 40 oder leer für Standard (40m), hose_l für 60m oder hose_xl für 80m. Danke @Guzzi-Charlie (https://forum.fhem.de/index.php?action=profile;u=9079) für den Hinweis (https://forum.fhem.de/index.php/topic,107189.msg1032384.html#msg1032384)
--> [2020-03-19] es funktionieren auch 40m, 60m, 80m als Wert (siehe auch post #47 (https://forum.fhem.de/index.php/topic,107189.msg1032928.html#msg1032928))

replacement05Regex %%ANHAENGER%% für all die, die beengt wohnen und einen LKW ohne Anhänger benötigen (wenn ja -> replacement05Value pr-truck-type=short_vehicle setzen, sonst nur replacement05Value pr-truck-type=)

EDIT 2020-03-18: *sigh* (post #44 (https://forum.fhem.de/index.php/topic,107189.msg1032684.html#msg1032684))
Zitat von: yersinia am 18 März 2020, 15:55:18Apropos, ich hatte gerade von esyoil das Heizoelpreis Reading 000 (die scheinen echt an Ihrer Webseite zu schrauben -.-). Ich habe meine RegEx von
attr Heizoelpreis reading010Regex ([\d\,]+)[\s]*€
nach
attr Heizoelpreis reading010Regex ([\d\,]+)[\s]+€
geändert und es funktioniert wieder.
Den obigen Code habe ich angepasst.
Titel: Antw:Abfrage Heizölpreis HTTPMOD
Beitrag von: BM-Sorry am 28 Januar 2020, 17:10:08
Danke für den Code,
war gerade dabei, mir was von fasternergy.de zu bsteln - bin aber mal wieder gescheitert.
Mit dem Code hat es auf Anhieb binnen 5 min. geklappt - 1000 Dank!
Titel: Antw:Abfrage Heizölpreis HTTPMOD
Beitrag von: Beta-User am 28 Januar 2020, 17:29:09
Auch hier wieder eine klasse Koproduktion mehrerer Beteiligter!

Wäre wieder ein HTTPMOD-attrTemplate-Kandidat, oder?
Mag jemand das finalisieren, ist ja jetzt nicht mehr schwierig...?

@yersinia: Suche immer noch nach einem (nennen wir es) Co-Maintainer für httpmod.template... Wäre das nichts für dich?
Titel: Antw:Abfrage Heizölpreis HTTPMOD
Beitrag von: Wzut am 28 Januar 2020, 17:48:47
schönes Beispiel wie Wissen über die Zeit verloren geht. Ich logge damit den Heizoelpreis seit Augist 2016 -> https://forum.fhem.de/index.php/topic,22554.msg479039.html#msg479039
Die Quelle esyoli.com ist noch gleich nur die Regex von damals stimmen nicht mehr weil die irgendwann 2019 ihre Seite etwas geändert hatten.
Titel: Antw:Abfrage Heizölpreis HTTPMOD
Beitrag von: yersinia am 29 Januar 2020, 09:42:09
Zitat von: Beta-User am 28 Januar 2020, 17:29:09@yersinia: Suche immer noch nach einem (nennen wir es) Co-Maintainer für httpmod.template... Wäre das nichts für dich?
Ja, das wäre nichts für mich.
Für derartige Betreuung habe ich zu wenig -verlässlich vorhandene- Zeit. :(
Titel: Antw:Abfrage Heizölpreis HTTPMOD
Beitrag von: Beta-User am 29 Januar 2020, 11:33:57
Zitat von: yersinia am 29 Januar 2020, 09:42:09
Ja, das wäre nichts für mich.
Für derartige Betreuung habe ich zu wenig -verlässlich vorhandene- Zeit. :(
Na ja, zum einen ist es "nur" eine Co-Maintainerschaft, zum anderen halten sich die Aktivitäten bei den HTTPMOD-templates sehr in Grenzen, das waren nur etwa 20 commits in etwas mehr wie einem Jahr: https://svn.fhem.de/trac/log/trunk/fhem/FHEM/lib/AttrTemplate/httpmod.template, und das meiste waren Einführungsthemen und kleine fixes...

Das ganze ist auch nicht "kritisch" für den FHEM-Betrieb, kleine Fehler haben keine wirklich gravierenden Auswirkungen.

Und mal ernsthaft: ich bin in HTTPMOD nach wie vor nicht eingearbeitet, und manche templates funktionieren (noch) nicht oder nicht auf allen Maschinen... (aber auch da freue ich mich über "tätige Rückmeldungen" von anderen... ;) )

Zitat von: Wzut am 28 Januar 2020, 17:48:47
schönes Beispiel wie Wissen über die Zeit verloren geht. Ich logge damit den Heizoelpreis seit Augist 2016 -> https://forum.fhem.de/index.php/topic,22554.msg479039.html#msg479039 (https://forum.fhem.de/index.php/topic,22554.msg479039.html#msg479039)
Die Quelle esyoli.com ist noch gleich nur die Regex von damals stimmen nicht mehr weil die irgendwann 2019 ihre Seite etwas geändert hatten.
Witzig, der Thread sollte in dem Benzinpreis-Ding verlinkt sein. Aber mir war auch nicht geläufig, dass da auch Heizöl versteckt war ::) .
Der erweiterte Code hier geht aber schon noch ein Stück über "das Original" hinaus, oder habe ich was verpaßt?
Titel: Antw:Abfrage Heizölpreis HTTPMOD
Beitrag von: Wzut am 29 Januar 2020, 12:36:09
Zitat von: Beta-User am 29 Januar 2020, 11:33:57
oder habe ich was verpaßt?
nein nein alles gut :) klar da kommt kein Mensch drauf beim Grundthema Benzin nach Heizöl zu suchen - die SuFu findet es eh nur wenn man direkt nach esyoil sucht.
Titel: Antw:Abfrage Heizölpreis HTTPMOD
Beitrag von: Schotty am 22 Februar 2020, 10:34:46
Zitat von: subseven am 09 Januar 2020, 16:51:01
Für Interessierte anbei mein HTTPMOD
Zitat von: yersinia am 10 Januar 2020, 16:31:02
Ich hab mich dessen bedient und ... es etwas erweitert
Danke!
Titel: Antw:Abfrage Heizölpreis HTTPMOD
Beitrag von: subseven am 09 März 2020, 20:32:59
Esyoil hat die Seite umgebaut. Das Feld, welche ich abgefragt habe, existiert in der Form nicht mehr. Morgen werde ich mal schauen welches man stattdessen abfragen kann.
Falls jemand schneller als ich ist, kann er gerne seine Lösung zur Verfügung stellen.
Titel: Antw:Abfrage Heizölpreis HTTPMOD
Beitrag von: Schotty am 10 März 2020, 10:06:13
Hmm, also ich hatte yersinias Codebeispiel übernommen (was ja eigtl auf deinem beruht) und bis jetzt funktioniert noch alles!
Titel: Antw:Abfrage Heizölpreis HTTPMOD
Beitrag von: yersinia am 10 März 2020, 11:42:46
Bei mir funktioniert das HTTPMOD fehlerfrei, aber die RegEx zieht nicht mehr. Ich habe zurzeit kein FHEM zur Hand, aber einen regextester. Kann einer von euch diese RegEx bitte testen:
attr Heizoelpreis reading010Regex ([\d\,]+)[\s]*€
Ist leider nicht so schnell wie die Version vorher....
Titel: Antw:Abfrage Heizölpreis HTTPMOD
Beitrag von: Schotty am 10 März 2020, 11:56:04
Ich bin diesbzgl noch nicht so fit.. Ist es das hier (bei der Ausgabe von "list Heizoelpreis"):

   READINGS:
     2020-03-07 14:33:33   Heizoelpreis    54.50

Dann stimmt es in der Tat nicht mehr - war mir vorhin nicht aufgefallen, da der Preis zu dem Zeitpunkt noch passte. Momentan aber nicht mehr, der liegt für meine Abfrage (1000l + PLZ) gerade bei 55,57€.

Kurze Frage am Rande (ich hoffe, es ist hier erlaubt?): Wäre es möglich, zusätzlich die Preistendenzgrafik von der esyoil-Startseite mit abzurufen und quasi 1:1 darstellen zu lassen (bspw bei FPUI/FTUI)?

EDIT: Sorry, anscheinend ist mein RegEx aber leicht anders:

reading010Regex <span class="fw_b ">([\d\,]+)


Hier mal das komplette Listing falls es irgendwie hilft - PLZ habe ich durch XXXXX ersetzt:

Internals:
   BUSY       0
   CHANGED   
   DEF        https://www.esyoil.com/preisausgabe.php?pr-unloading-points=1&pr-product=8&pr-payment-type=2&pr-truck-type=&pr-hose-length=&pr-app=1&pr-zip=%%PLZ%%&pr-amount=%%MENGE%%&submit= 1800
   FUUID      5e50f415-f33f-e3ee-29c5-4268f0198d30d1eb
   Interval   1800
   LASTSEND   1583835976.00684
   MainURL    https://www.esyoil.com/preisausgabe.php?pr-unloading-points=1&pr-product=8&pr-payment-type=2&pr-truck-type=&pr-hose-length=&pr-app=1&pr-zip=%%PLZ%%&pr-amount=%%MENGE%%&submit=
   ModuleVersion 3.5.22 - 7.2.2020
   NAME       Heizoelpreis
   NOTIFYDEV  global
   NR         30
   NTFY_ORDER 50-Heizoelpreis
   ReplacementEnabled 1
   STATE      <div>2020-03-07 14:33:33  <b>54.50&euro;</b>/100l</div>
   TRIGGERTIME 1583837776.00568
   TRIGGERTIME_FMT 2020-03-10 11:56:16
   TYPE       HTTPMOD
   addr       https://www.esyoil.com:443
   auth       0
   buf       
   code       200
   compress   1
   conn       
   data       
   displayurl https://www.esyoil.com/preisausgabe.php?pr-unloading-points=1&pr-product=8&pr-payment-type=2&pr-truck-type=&pr-hose-length=&pr-app=1&pr-zip=XXXXX&pr-amount=1000&submit=
   header     Cookie: calc_arguments=XXXXX%3B1000%3B1%3B8%3B2%3B0%3B%3B%3B%3B%242y%2410%243JEU7KQKYEwoIYPXuKyHWeFj%2FwfDkhCAyi%2FGGzm0aGdtBd4kZ%2Fleu; esyoil_com=mf642ujk9k74h90evsg36s0qg8
   host       www.esyoil.com
   httpheader HTTP/1.1 200 OK
Date: Tue, 10 Mar 2020 10:26:16 GMT
Server: Apache/2.4.41 (Ubuntu)
Content-Security-Policy: style-src 'unsafe-inline' 'self' https://stackpath.bootstrapcdn.com https://use.fontawesome.com https://fonts.googleapis.com https://cdnjs.cloudflare.com blob:; font-src 'self' https://fonts.googleapis.com https://fonts.gstatic.com https://use.fontawesome.com data:; report-uri /api.php?sid=570
Expires: Thu, 19 Nov 1981 08:52:00 GMT
Cache-Control: no-store, no-cache, must-revalidate
Pragma: no-cache
Set-Cookie: calc_arguments=XXXXX%3B1000%3B1%3B8%3B2%3B0%3B%3B%3B%3B%242y%2410%243JEU7KQKYEwoIYPXuKyHWeFj%2FwfDkhCAyi%2FGGzm0aGdtBd4kZ%2Fleu; expires=Tue, 24-Mar-2020 10:26:16 GMT; Max-Age=1209600; path=/; secure
Strict-Transport-Security: max-age=31536000; includeSubDomains; preload
Upgrade: h2
Connection: Upgrade, close
Vary: Accept-Encoding
Content-Encoding: gzip
Cache-Control: no-cache
Content-Language: de
Content-Length: 36468
Content-Type: text/html; charset="utf-8"
   httpversion 1.0
   hu_blocking 0
   hu_filecount 4
   hu_port    443
   hu_portSfx
   ignoreredirects 1
   loglevel   4
   path       /preisausgabe.php?pr-unloading-points=1&pr-product=8&pr-payment-type=2&pr-truck-type=&pr-hose-length=&pr-app=1&pr-zip=XXXXX&pr-amount=1000&submit=
   protocol   https
   redirects  0
   timeout    2
   url        https://www.esyoil.com/preisausgabe.php?pr-unloading-points=1&pr-product=8&pr-payment-type=2&pr-truck-type=&pr-hose-length=&pr-app=1&pr-zip=XXXXX&pr-amount=1000&submit=
   value      0
   CompiledRegexes:
   HTTPCookieHash:
     calc_arguments;/:
       Name       calc_arguments
       Options    expires=Tue, 24-Mar-2020 10:26:16 GMT; Max-Age=1209600; path=/; secure
       Path       /
       Value      XXXXX%3B1000%3B1%3B8%3B2%3B0%3B%3B%3B%3B%242y%2410%243JEU7KQKYEwoIYPXuKyHWeFj%2FwfDkhCAyi%2FGGzm0aGdtBd4kZ%2Fleu
     esyoil_com;/:
       Name       esyoil_com
       Options    expires=Tue, 10-Mar-2020 09:06:17 GMT; Max-Age=600; path=/; secure; HttpOnly
       Path       /
       Value      mf642ujk9k74h90evsg36s0qg8
   QUEUE:
   READINGS:
     2020-03-07 14:33:33   Heizoelpreis    54.50
   REQUEST:
     data       
     header     
     ignoreredirects 0
     retryCount 0
     type       update
     url        https://www.esyoil.com/preisausgabe.php?pr-unloading-points=1&pr-product=8&pr-payment-type=2&pr-truck-type=&pr-hose-length=&pr-app=1&pr-zip=%%PLZ%%&pr-amount=%%MENGE%%&submit=
     value      0
   sslargs:
Attributes:
   DbLogExclude 1
   enableControlSet 1
   reading010Expr $val =~ s/,/\./; $val;
   reading010Name Heizoelpreis
   reading010OExpr $val =~ s/,/\./; $val;
   reading010Regex <span class="fw_b ">([\d\,]+)
   replacement01Mode text
   replacement01Regex %%PLZ%%
   replacement01Value XXXXX
   replacement02Mode text
   replacement02Regex %%MENGE%%
   replacement02Value 1000
   room       HEIZOEL,Unsorted
   stateFormat {"<div>".ReadingsTimestamp($name,"Heizoelpreis","-")." \ <b>".ReadingsVal($name,"Heizoelpreis","-")."&euro;</b>/100l</div>"}
   userattr   reading010Expr reading010Name reading010OExpr reading010Regex replacement01Mode:reading,internal,text,expression,key replacement01Regex replacement01Value replacement02Mode:reading,internal,text,expression,key replacement02Regex replacement02Value
   webCmd     reread
Titel: Antw:Abfrage Heizölpreis HTTPMOD
Beitrag von: yersinia am 10 März 2020, 12:33:49
Dat hascht aber jelesen, oder?
Zitat von: yersinia am 10 März 2020, 11:42:46
Bei mir funktioniert das HTTPMOD fehlerfrei, aber die RegEx zieht nicht mehr. Ich habe zurzeit kein FHEM zur Hand, aber einen regextester. Kann einer von euch diese RegEx bitte testen:
attr Heizoelpreis reading010Regex ([\d\,]+)[\s]*€
Ist leider nicht so schnell wie die Version vorher....

Nach Sicherung könntest du testhalber das Attribut von
reading010Regex <span class="fw_b ">([\d\,]+)
auf
reading010Regex ([\d\,]+)[\s]*€
ändern.

Keine Garantie, das es sauber funktioniert, ist ein erster Schuß. Wie gesagt, hab derzeit kein FHEM zur Hand.
Titel: Antw:Abfrage Heizölpreis HTTPMOD
Beitrag von: Schotty am 10 März 2020, 12:47:30
Ja hatte ich (EDIT: Zur Erklärung: Ich hatte den Code von dir auf S.1 so übernommen), hab's jetzt geändert und es scheint zu funktionieren:

Heizoelpreis  2020-03-10 12:45:35 55.57€/100l

Danke schonmal! :)
Titel: Antw:Abfrage Heizölpreis HTTPMOD
Beitrag von: yersinia am 10 März 2020, 17:02:10
Danke Schotty. Ich hatte jetzt auch die Gelegenheit es zu testen und es sieht gut aus.

Schön wäre es, wenn noch mehr testen würden. Oder gar das RegEx optimieren würden.

Wenn es keine Einwände gibt, werde ich die Änderung in das httpmod.template einpflegen.
Titel: Antw:Abfrage Heizölpreis HTTPMOD
Beitrag von: subseven am 10 März 2020, 18:45:06
Funktioniert auch bei mir  :D
Titel: Antw:Abfrage Heizölpreis HTTPMOD
Beitrag von: Jump2016 am 11 März 2020, 07:59:17
@Schotty: Habe es getestet. Kann bestätigen, es funktioniert :)
Titel: Antw:Abfrage Heizölpreis HTTPMOD
Beitrag von: FHEM-User22 am 11 März 2020, 08:03:26
Moin,
auch bei mir, funzt.
Dankeschön
Titel: Antw:Abfrage Heizölpreis HTTPMOD
Beitrag von: Beta-User am 11 März 2020, 08:33:25
Zitat von: yersinia am 10 März 2020, 17:02:10
Wenn es keine Einwände gibt, werde ich die Änderung in das httpmod.template einpflegen.
:)
...das habe ich gehört und hoffe, es richtig interpretiert zu haben!
*freu*

Mit dem nächsten update zu diversen attrTemplate wird der Fix jedenfalls drin sein,  falls das die richtige Version ist:
attr DEVICE reading010Regex ([\d\,]+)[\s]*€
Titel: Antw:Abfrage Heizölpreis HTTPMOD
Beitrag von: yersinia am 11 März 2020, 09:11:16
Zitat von: Beta-User am 11 März 2020, 08:33:25
:)
...das habe ich gehört und hoffe, es richtig interpretiert zu haben!
*freu*
Höchstwahrscheinlich nicht. Ich hätte das angepasste Template dir kopierfertig in httpmod.template thread gekippt.... ;D

Zitat von: Beta-User am 11 März 2020, 08:33:25
Mit dem nächsten update zu diversen attrTemplate wird der Fix jedenfalls drin sein,  falls das die richtige Version ist:
attr DEVICE reading010Regex ([\d\,]+)[\s]*€
Ja, das ist mMn richtig. Verstehe _ich_ das richtig, dass du das direkt übernimmst? ;)
Titel: Antw:Abfrage Heizölpreis HTTPMOD
Beitrag von: Beta-User am 11 März 2020, 10:14:32
Schade, aber du bist jederzeit weiter herzlich eingeladen...

Ja, update kommt, ich war nur etwas zu spät dran für den regulären update-Zyklus und habe noch ein paar andere Baustellen, von denen evtl. weitere Kleinigkeiten zurückkommen, die dann ggf. gleich auch noch mit rein können.
Titel: Antw:Abfrage Heizölpreis HTTPMOD
Beitrag von: yersinia am 11 März 2020, 11:33:26
Zitat von: Beta-User am 11 März 2020, 10:14:32
Ja, update kommt, ich war nur etwas zu spät dran für den regulären update-Zyklus und habe noch ein paar andere Baustellen, von denen evtl. weitere Kleinigkeiten zurückkommen, die dann ggf. gleich auch noch mit rein können.
Danke dafür, kein Druck. So eilig ist es auch wieder nicht und die meisten FHEM User schaffen das Update des Attributes sicherlich auch via WebGUI. ;)
Titel: Antw:Abfrage Heizölpreis HTTPMOD
Beitrag von: Beta-User am 11 März 2020, 12:11:18
Klar...

Nur: Wer jetzt via attrTemplate einsteigt, sollte eigentlich möglichst direkt funktionalen Code bekommen, und nicht gleich nachbessern müssen...

[OT]
Trotzdem wäre es nett, wenn du mal alle HTTPMOD-templates auf Verbesserungsmöglichkeiten durchsehen könntest, die sich auf allg. Quellen beziehen - das Wetter-Zeug für Österreich und so. Auch das eilt nicht, aber mir wäre es sehr viel wohler, wenn sich jemand das ansehen würde, der was von der Sache versteht ;D . Wenn ich das mache, dauert es ewig, und ob es dann funktional (oder gar optimal!) ist, ist eine ganz andere Frage.

aber auch da gilt: eilt nicht...
[/OT]
Titel: Antw:Abfrage Heizölpreis HTTPMOD
Beitrag von: Guzzi-Charlie am 16 März 2020, 16:10:16
Hallo,

ich habe auch das Modul zum Abfragen der Heizölpreise (mit dem Template fuel_oil_check) angelegt, aber irgendwie funktioniert es nicht richtig. Es hat genau einmal den Preis abgefragt, wobei ich noch nicht einmal weiß woher es den Preis hat (der auch falsch zu sein scheint), denn eine manuelle Abfrage auf der easyoil-Seite bringt nur eine Fehlermeldung aber keinen Preis.

Auch ein "reread" zeigt keinerlei Funktion, d.h. es wird kein neuer Wert geholt.

Wie kann ich die Funktion prüfen?
Titel: Antw:Abfrage Heizölpreis HTTPMOD
Beitrag von: yersinia am 16 März 2020, 16:29:47
1. stimmt deine Version mit der Letzten überein (post #9 (https://forum.fhem.de/index.php/topic,107189.msg1017754.html#msg1017754) mit dem Edit)?
2. Attribute replacement01Value, replacement02Value, replacement03Value, replacement04Value und replacement05Value sind richtig gepflegt (siehe auch post #9)?
3. wenn du den Link des Internal displayurl manuell öffnest, wird der richtige Preis angezeigt?
4. wenn alles mit 'ja' beantwortet worden ist, bitte ein List des Devices
Titel: Antw:Abfrage Heizölpreis HTTPMOD
Beitrag von: Guzzi-Charlie am 16 März 2020, 17:48:32
Hallo yersinia,

vielen Dank für die schnelle Antwort.

Es war alles richtig und (fast) alles Gleich, nur die PLZ nicht. Als ich die URL manuell eingegeben hatte bekam ich auch eine aussagekräftige Fehlermeldung auf der easyoil-Seite "Diese Postleitzahl wird leider nicht beliefert. (Fehler 2001)". Mit einer PLZ aus dem "Liefergebiet" funktioniert alles. Da muß man erstmal drauf kommen. Ich dachte das wäre eine bundesweite Seite.

Ich habe meine Preise bisher immer manuell über "Heizoelboerse.de" abgefragt.

Naja, dann muß ich mal sehen ob ich das HTTMOD umbauen kann, damit es mir von einer anderen Seite die Preise holt.
Titel: Antw:Abfrage Heizölpreis HTTPMOD
Beitrag von: Guzzi-Charlie am 16 März 2020, 18:24:18
Hallo,

ich habe es gerade mal versucht von einer anderen Seite Werte zu lesen, aber das ist "eine Nummer zu hoch" für mich. Da fehlt mir einfach das Wissen. Ich werde also wohl weiterhin die Preise manuell abfragen müssen. Danke nochmal für die Hilfe.

Falls sich aber Jemand berufen fühlen sollte mich zu unterstützen, dann wäre das natürlich super. Am liebsten würde ich die Preise von "heizoelboerse.de" auslesen, aber die haben irgendwie ein Berechnungsscript drin und der Preis wird dann auf einer neuen Seite angezeigt.
Titel: Antw:Abfrage Heizölpreis HTTPMOD
Beitrag von: Schotty am 17 März 2020, 11:41:13
Zitat von: Guzzi-Charlie am 16 März 2020, 17:48:32
Es war alles richtig und (fast) alles Gleich, nur die PLZ nicht.
...
Mit einer PLZ aus dem "Liefergebiet" funktioniert alles. Da muß man erstmal drauf kommen. Ich dachte das wäre eine bundesweite Seite.
Genau, yersinia hatte es in seinem ersten Beitrag als Anmerkung geschrieben:
Zitat von: yersinia am 10 Januar 2020, 16:31:02
PLZ und Menge können dynamisch über die Attribute
attr Heizoelpreis replacement01Value 36211 (PLZ)
attr Heizoelpreis replacement02Value 3500 (Menge in l)
angepasst werden.
Dann nimmst du vorher nur die Version, die dir
Zitat von: yersinia am 16 März 2020, 16:29:47
1. stimmt deine Version mit der Letzten überein (post #9 (https://forum.fhem.de/index.php/topic,107189.msg1017754.html#msg1017754) mit dem Edit)?
hier empfohlen hat.
Schon hast du einen auf dein Liefergebiet und mit deiner Wunschmenge abgefragten Heizölpreis der entspr Firmen. Die Preise variieren ja bundesweit, lokal weichen sie ab, das wird bei der von dir erwähnten heizoelberse letztlich nicht anders sein.
Titel: Antw:Abfrage Heizölpreis HTTPMOD
Beitrag von: Guzzi-Charlie am 17 März 2020, 12:31:27
Hallo Schotty,

Danke für Deine Antwort, aber leider ist diese für mich nutzlos. Ich glaube Du hast meine Antwort nicht vollständig gelesen. Natürlich hatte ich die entsprechenden Felder angepaßt. Genau deshalb hat es ja nicht funktioniert.

Bei easyoil ist offensichtlich kein Lieferant für meine Anschrift gelistet, ergo gibt es auch keinen Preis sondern nur die von mir genannte Fehlermeldung.
Titel: Antw:Abfrage Heizölpreis HTTPMOD
Beitrag von: yersinia am 17 März 2020, 12:56:43
[OT]
Ich finde es kurios, dass es PLZ gibt, die nicht beliefert werden. Oder lebst du auf eine der Nordseeinseln? Oder in Büsingen (https://de.wikipedia.org/wiki/B%C3%BCsingen_am_Hochrhein)?  :o
Hast du mal bei heizoel24.de geschaut, listen die Lieferanten, welche zu dir liefern? (Erfahrung sagt aber, dass heizoel24 teurer als esyoil ist, bei gleicherm Lieferanten...)
[/OT]

Funktionieren Nachbar-PLZ? Ansonsten frag doch mal bei esyoil an, ob es da einen Fehler geben könnte.
Titel: Antw:Abfrage Heizölpreis HTTPMOD
Beitrag von: Guzzi-Charlie am 17 März 2020, 14:43:30
Hallo,

ich glaube ich habe das Problem gefunden.

Die zu übergebenden Werte für die Schlauchlängen scheinen so nicht zu funktionieren.
Wenn man auf der Webseite die verschiedenen Meterzahlen auswählt, dann erscheinen diese nicht in der URL, sondern statt dessen:
40m ==> https://www.esyoil.com/preisausgabe.php?pr-zip=67246&pr-amount=3000&pr-product=8&pr-payment-type=2&pr-delivery-date=&pr-unloading-points=1&pr-hose-length=&pr-truck-type=&pr-app=1&submit=Neu+rechnen
60m ==> https://www.esyoil.com/preisausgabe.php?pr-zip=67246&pr-amount=3000&pr-product=8&pr-payment-type=2&pr-delivery-date=&pr-unloading-points=1&pr-hose-length=hose_l&pr-truck-type=&pr-app=1&submit=Neu+rechnen
80m ==> https://www.esyoil.com/preisausgabe.php?pr-zip=67246&pr-amount=3000&pr-product=8&pr-payment-type=2&pr-delivery-date=&pr-unloading-points=1&pr-hose-length=hose_xl&pr-truck-type=&pr-app=1&submit=Neu+rechnen

Die Website erwartet also nicht 40/60/80m sondern ', hose_l oder hose_xl. Wenn ich also jetzt nur ein Hochkomma oder "hose_l" eingebe dann funktioniert der Abruf, d.h. Standard (40m) ist offenbar "Nichts", 60m = L und 80m XL.

Auf jeden Fall funktioniert es jetzt so. Danke nochmal für die Unterstützung.

P.S.
Wenn ich bei meiner PLZ "80m" abfrage, dann kommt auch wieder "Wir liefern nicht an diese PLZ". Es gibt offensichtlich keinen gelisteten Händler der Fahrzeuge mit 80m hat/anbietet.
Titel: Antw:Abfrage Heizölpreis HTTPMOD
Beitrag von: yersinia am 17 März 2020, 16:25:53
Zitat von: Guzzi-Charlie am 17 März 2020, 14:43:30
Hallo,

ich glaube ich habe das Problem gefunden.

Die zu übergebenden Werte für die Schlauchlängen scheinen so nicht zu funktionieren.
Wenn man auf der Webseite die verschiedenen Meterzahlen auswählt, dann erscheinen diese nicht in der URL, sondern statt dessen:
40m ==> https://www.esyoil.com/preisausgabe.php?pr-zip=67246&pr-amount=3000&pr-product=8&pr-payment-type=2&pr-delivery-date=&pr-unloading-points=1&pr-hose-length=&pr-truck-type=&pr-app=1&submit=Neu+rechnen
60m ==> https://www.esyoil.com/preisausgabe.php?pr-zip=67246&pr-amount=3000&pr-product=8&pr-payment-type=2&pr-delivery-date=&pr-unloading-points=1&pr-hose-length=hose_l&pr-truck-type=&pr-app=1&submit=Neu+rechnen
80m ==> https://www.esyoil.com/preisausgabe.php?pr-zip=67246&pr-amount=3000&pr-product=8&pr-payment-type=2&pr-delivery-date=&pr-unloading-points=1&pr-hose-length=hose_xl&pr-truck-type=&pr-app=1&submit=Neu+rechnen

Die Website erwartet also nicht 40/60/80m sondern ', hose_l oder hose_xl. Wenn ich also jetzt nur ein Hochkomma oder "hose_l" eingebe dann funktioniert der Abruf, d.h. Standard (40m) ist offenbar "Nichts", 60m = L und 80m XL.
Vielen Dank für den Hinweis. Das fällt nur auf, wenn man einen langen Schlauch benötigt. Oo Danke fürs Testen und Feedback!
Ich werde das in der 'Doku' anpassen. post #9 (https://forum.fhem.de/index.php/topic,107189.msg1017754.html#msg1017754) ist angepasst.

Achja, für alle, die noch die Gesamtkosten anzeigen lassen wollen, können stateFormat wie folgt ersetzen (Raw definition):
attr Heizoelpreis stateFormat { my $price = 0.0;;;;\
$price = (AttrNum($name,"replacement02Value",0)*ReadingsNum($name,"Heizoelpreis",0))/100;;;;\
my $ret = "<div>".ReadingsTimestamp($name,"Heizoelpreis","-");;;;\
$ret .= "&nbsp;;<b>".ReadingsVal($name,"Heizoelpreis","-")."&euro;;</b>/100l";;;;\
$ret .= "&nbsp;;(".AttrVal($name,"replacement02Value","0")."l = ";;;;\
$ret .= sprintf("%.2f",$price);;;;\
$ret .= "€)</div>";;;;\
return $ret;;;;\
}

ergibt einen state wie diesen:
Zitat2020-03-17 16:01:01 52.66€/100l (2000l = 1053.20€)
Titel: Antw:Abfrage Heizölpreis HTTPMOD
Beitrag von: Guzzi-Charlie am 17 März 2020, 17:16:40
Hallo,

gern geschehen.

Nachdem die Abfrage nun funktioniert hab ich natürlich gleich noch ein wenig weiter "gespielt" und zwar auch genau mit dem stateFormat.

Ich wollte die Zahlenwerte in Grün und die Einheiten/Texte in weiß darstellen. Im Prinzip klappt das auch, aber aus mir nicht ersichtlichen Gründen macht FHEM nach jedem Farbwechsel einen Zeilenumbruch. Wenn ja, wie kann ich das verhindern?

Mein stateFormat sieht aktuell so aus:
{"<div style='color:green'>".ReadingsVal($name,"Heizoelpreis","-")."<div style='color:white'>"." Cent/Liter"."<br>"
."max. Bestellmenge: "."<div style='color:green'>".int(ReadingsVal($name,"Tankmenge","-"))." Liter"."</div>"}

und das Ergebnis so:
==> siehe Dateianhang
Eigentlich soll das "Cent/Liter" hinter dem Wert in der gleichen Zeile stehen. Genauso sollte das "max. Bestellmenge:" vor dem Wert stehen.
Titel: Antw:Abfrage Heizölpreis HTTPMOD
Beitrag von: yersinia am 17 März 2020, 21:14:35
Das liegt an deinen <div> container, die ohne weitere Definition untereinander dargestellt werden.

Versuche es mal so:
{"<div><font style=\"color:green;\">".ReadingsVal($name,"Heizoelpreis","-")."</font><font style=\"color:white;\"> Cent/Liter</font><br />max. Bestellmenge: <font style=\"color:green;\">".ReadingsVal($name,"Tankmenge","-")."</font><font style=\"color:white;\"> Liter</font></div>"}
Titel: Antw:Abfrage Heizölpreis HTTPMOD
Beitrag von: Guzzi-Charlie am 17 März 2020, 23:30:35
Hallo yersinia,

FHEM ist doch eine Raketenwissenschaft. Ich glaube das hätte ich Allein nicht hingekriegt, aber jetzt klappt es perfekt.

Danke Dir nochmal. Vielen Dank.
Titel: Antw:Abfrage Heizölpreis HTTPMOD
Beitrag von: yersinia am 18 März 2020, 15:55:18
Zitat von: Guzzi-Charlie am 17 März 2020, 23:30:35FHEM ist doch eine Raketenwissenschaft.
Naja, Raketenwissenschaft ist es in diesem Fall nicht. Nur ein bisschen HTML richtig angwendet und fertig.

Apropos, ich hatte gerade von esyoil das Heizoelpreis Reading 000 (die scheinen echt an Ihrer Webseite zu schrauben -.-). Ich habe meine RegEx von
attr Heizoelpreis reading010Regex ([\d\,]+)[\s]*€
nach
attr Heizoelpreis reading010Regex ([\d\,]+)[\s]+€
geändert und es funktioniert wieder.
Titel: Antw:Abfrage Heizölpreis HTTPMOD
Beitrag von: Guzzi-Charlie am 18 März 2020, 17:27:53
Ha, gerade hab ich das auch festgestellt und wollte schon fragen warum es jetzt schon wieder nicht mehr funktioniert.

==> Deine Änderung eingebaut und es funktioniert wieder.

Super  :) :) :)
Titel: Antw:Abfrage Heizölpreis HTTPMOD
Beitrag von: Jump2016 am 18 März 2020, 21:08:26
@yersinia Vielen Dank für die Anpassung  :) nun funktionierts auch bei mir wieder
Titel: Antw:Abfrage Heizölpreis HTTPMOD
Beitrag von: yersinia am 19 März 2020, 15:11:10
durch Zufall habe ich gerade heraus gefunden, dass esyoil unterschiedliche Preise zurückliefert, je nach dem wie man die URL aufruft:
https://www.esyoil.com/preisausgabe.php?pr-zip=14469&pr-amount=5000&pr-product=8&pr-payment-type=2&pr-delivery-date=&pr-unloading-points=2&pr-hose-length=40m&pr-truck-type=short_vehicle&pr-app=1&submit=Rechnen (https://www.esyoil.com/preisausgabe.php?pr-zip=14469&pr-amount=5000&pr-product=8&pr-payment-type=2&pr-delivery-date=&pr-unloading-points=2&pr-hose-length=40m&pr-truck-type=short_vehicle&pr-app=1&submit=Rechnen)
=> 51,97€/100l
https://www.esyoil.com/preisausgabe.php?pr-zip=14469&pr-amount=5000&pr-product=8&pr-payment-type=2&pr-delivery-date=&pr-unloading-points=2&pr-hose-length=40&pr-truck-type=short_vehicle&pr-app=1&submit=Rechnen (https://www.esyoil.com/preisausgabe.php?pr-zip=14469&pr-amount=5000&pr-product=8&pr-payment-type=2&pr-delivery-date=&pr-unloading-points=2&pr-hose-length=40&pr-truck-type=short_vehicle&pr-app=1&submit=Rechnen)
=> 52,80€/100l
https://www.esyoil.com/preisausgabe.php?pr-zip=14469&pr-amount=5000&pr-product=8&pr-payment-type=2&pr-delivery-date=&pr-unloading-points=2&pr-hose-length=&pr-truck-type=short_vehicle&pr-app=1&submit=Rechnen (https://www.esyoil.com/preisausgabe.php?pr-zip=14469&pr-amount=5000&pr-product=8&pr-payment-type=2&pr-delivery-date=&pr-unloading-points=2&pr-hose-length=&pr-truck-type=short_vehicle&pr-app=1&submit=Rechnen)
=> 51,97€/100l

Also ruhig, wie in diesem Beispiel replacement04Value, verschiedene Werte mal durchprobieren; vor allem auch mit anderen Vergleichsportalen (zB heizoel24.de) vergleichen.

Kennt ihr noch andere Portale?
Titel: Antw:Abfrage Heizölpreis HTTPMOD
Beitrag von: Schotty am 19 März 2020, 15:45:36
Hi yersinia,
hab durch Zufall gerade einen Logeintrag entdeckt - nur für den Fall, dass das wichtig ist (ich kenne mich da nicht so aus ;) ):


2020.03.19 13:12:14 3: Heizoelpreis: the attribute reading010Expr should no longer be used. Please use reading010OExpr instead
2020.03.19 13:12:14 3: Heizoelpreis: For most old attributes you can specify enableControlSet and then set device upgradeAttributes to automatically modify the configuration

Titel: Antw:Abfrage Heizölpreis HTTPMOD
Beitrag von: yersinia am 19 März 2020, 15:50:24
Zitat von: Schotty am 19 März 2020, 15:45:36
Hi yersinia,
hab durch Zufall gerade einen Logeintrag entdeckt - nur für den Fall, dass das wichtig ist (ich kenne mich da nicht so aus ;) ):


2020.03.19 13:12:14 3: Heizoelpreis: the attribute reading010Expr should no longer be used. Please use reading010OExpr instead
2020.03.19 13:12:14 3: Heizoelpreis: For most old attributes you can specify enableControlSet and then set device upgradeAttributes to automatically modify the configuration

Ja, hatte ich 'damals' auch gesehen und 'meinen' Definition entsprechend angepasst.
subsevens ursprünglicher Code (https://forum.fhem.de/index.php/topic,107189.msg1010977.html#msg1010977):
attr Heizoel reading01Expr $val =~ s/,/\./;; $val;;
meine Version (https://forum.fhem.de/index.php/topic,107189.msg1017754.html#msg1017754)
attr Heizoelpreis reading010OExpr $val =~ s/,/\./;; $val;;

Das in dem Device zu ersetzen ist kein Hexenwerk.
Titel: Antw:Abfrage Heizölpreis HTTPMOD
Beitrag von: Schotty am 19 März 2020, 15:54:46
Zitat von: yersinia am 19 März 2020, 15:50:24
meine Version (https://forum.fhem.de/index.php/topic,107189.msg1017754.html#msg1017754)
attr Heizoelpreis reading010OExpr $val =~ s/,/\./;; $val;;

Das in dem Device zu ersetzen ist kein Hexenwerk.
Genau so habe ich es bei mir ja auch eingetragen..
Titel: Antw:Abfrage Heizölpreis HTTPMOD
Beitrag von: hdosw am 19 März 2020, 17:03:48
Zitat von: Bartimaus am 15 Januar 2020, 14:16:00
Bitte:

attr Heizoelpreis replacement02Mode expression
attr Heizoelpreis replacement02Regex %%MENGE%%
attr Heizoelpreis replacement02Value ReadingsVal("Heizoelpreis","Tankmenge",0)
attr Heizoelpreis room Heizung,Widget
attr Heizoelpreis stateFormat {"<div>".ReadingsTimestamp($name,"Heizoelpreis","-")." \
<b>".ReadingsVal($name,"Heizoelpreis","-")."&euro;;</b>/100l</div>"}
attr Heizoelpreis userReadings Tankvolumen:none {}, Tankmenge {ReadingsVal("Heizoelpreis","Tankvolumen",0)-ReadingsVal("CN.Blaubrenner","appTanklevel",0)}, Fuellkosten {ReadingsVal("Heizoelpreis","Tankmenge",0)/100*ReadingsVal("Heizoelpreis","Heizoelpreis",0)}


Das Tankvolumen dann manuell setzen (setreading....)

Hallo Bartimaus,
ich habe das Tankvolumen eingebaut nur weiss ich nicht wie ich dies manuell setzen soll  :-\
kannst du mir dies verraten?

Viele Grüße
Titel: Antw:Abfrage Heizölpreis HTTPMOD
Beitrag von: hdosw am 19 März 2020, 18:09:09
Hallo Bartimaus,

habs rausgefunden  :)

Viele Grüße
Titel: Antw:Abfrage Heizölpreis HTTPMOD
Beitrag von: yersinia am 20 März 2020, 15:12:31
Wäre anstelle eines userReadings nicht ein (zusätzliches) userAttr für das Tankvolumen sinnvoller bzw. einfacher zu pflegen für den Endbenutzer?

Ich stelle mir das so vor:
attr Heizoelpreis userattr reading010Name reading010OExpr reading010Regex replacement01Mode:reading,internal,text,expression,key replacement01Regex replacement01Value replacement02Mode:reading,internal,text,expression,key replacement02Regex replacement02Value replacement03Mode:reading,internal,text,expression,key replacement03Regex replacement03Value replacement04Mode:reading,internal,text,expression,key replacement04Regex replacement04Value replacement05Mode:reading,internal,text,expression,key replacement05Regex replacement05Value Tankvolumen
attr Heizoelpreis replacement02Mode expression
attr Heizoelpreis replacement02Regex %%MENGE%%
attr Heizoelpreis replacement02Value ReadingsVal($name,"Tankmenge",0)
attr Heizoelpreis Tankvolumen 0
attr Heizoelpreis userReadings Tankmenge {AttrNum($name,"Tankvolumen",0)-ReadingsNum("CN.Blaubrenner","appTanklevel",0)}, Fuellkosten {ReadingsNum($name,"Tankmenge",0)/100*ReadingsNum($name,"Heizoelpreis",0)}

(Anstelle von xxVal würde ich für die Berechnungen xxNum verwenden - und $name anstelle des Devicenamens)

Man könnte noch weiter gehen und das Füllstands-Device und -Reading über zwei weitere User-Attribute definieren:
attr Heizoelpreis userattr reading010Name reading010OExpr reading010Regex replacement01Mode:reading,internal,text,expression,key replacement01Regex replacement01Value replacement02Mode:reading,internal,text,expression,key replacement02Regex replacement02Value replacement03Mode:reading,internal,text,expression,key replacement03Regex replacement03Value replacement04Mode:reading,internal,text,expression,key replacement04Regex replacement04Value replacement05Mode:reading,internal,text,expression,key replacement05Regex replacement05Value Tankvolumen FuellstandDevice FuellstandReading
attr Heizoelpreis replacement02Mode expression
attr Heizoelpreis replacement02Regex %%MENGE%%
attr Heizoelpreis replacement02Value ReadingsVal($name,"Tankmenge",0)
attr Heizoelpreis Tankvolumen 0
attr Heizoelpreis FuellstandDevice CN.Blaubrenner
attr Heizoelpreis FuellstandReading appTanklevel
attr Heizoelpreis userReadings Tankmenge {AttrNum($name,"Tankvolumen",0)-ReadingsNum(AttrVal($name,"FuellstandDevice","no device defined"),AttrVal($name,"FuellstandReading","no reading defined"),0)}, Fuellkosten {ReadingsNum($name,"Tankmenge",0)/100*ReadingsNum($name,"Heizoelpreis",0)}


(die Raw defines müssten sich nahtlos in die urprüngliche Definition (https://forum.fhem.de/index.php/topic,107189.msg1017754.html#msg1017754) einfügen, einfach die entsprechenden attr, sofern vorhanden, ersetzen)
Titel: Antw:Abfrage Heizölpreis HTTPMOD
Beitrag von: yersinia am 18 Mai 2020, 14:23:11
Konkurrenz belebt das Geschäft, hier eine Version für heizoel24.de zum Testen:
defmod Heizoel_heizoel24 HTTPMOD https://www.heizoel24.de/heizoelpreise-direkt/%%PLZ%%/%%MENGE%%/%%ENTLADESTELLEN%% 1800
attr Heizoel_heizoel24 userattr reading010Name reading010OExpr reading010Regex replacement01Mode:reading,internal,text,expression,key replacement01Regex replacement01Value replacement02Mode:reading,internal,text,expression,key replacement02Regex replacement02Value replacement03Mode:reading,internal,text,expression,key replacement03Regex replacement03Value
attr Heizoel_heizoel24 enableControlSet 1
attr Heizoel_heizoel24 reading010Name Heizoelpreis
attr Heizoel_heizoel24 reading010OExpr $val =~ s/,/\./;; $val;;
attr Heizoel_heizoel24 reading010Regex <span class="unitprice">([\d\,]+)[\s]+<span
attr Heizoel_heizoel24 replacement01Mode text
attr Heizoel_heizoel24 replacement01Regex %%PLZ%%
attr Heizoel_heizoel24 replacement01Value 36211
attr Heizoel_heizoel24 replacement02Mode text
attr Heizoel_heizoel24 replacement02Regex %%MENGE%%
attr Heizoel_heizoel24 replacement02Value 3500
attr Heizoel_heizoel24 replacement03Mode text
attr Heizoel_heizoel24 replacement03Regex %%ENTLADESTELLEN%%
attr Heizoel_heizoel24 replacement03Value 1
attr Heizoel_heizoel24 room WHICHROOM
attr Heizoel_heizoel24 stateFormat { my $price = 0.0;;\
$price = (AttrNum($name,"replacement02Value",0)*ReadingsNum($name,"Heizoelpreis",0))/100;;\
my $lastCheck = POSIX::strftime("%d.%m. %H:%M",localtime(time_str2num(ReadingsTimestamp($name,"Heizoelpreis","2000-01-01 00:00:00"))));;\
my $ret = "<div style=\"text-align: left;;\">".$lastCheck.":";;\
$ret .= "&nbsp;;<a href=\"".InternalVal($name,"displayurl","https://www.heizoel24.de")."\" rel=\"noopener noreferrer\" target=\"_blank\" style=\"font-weight:bold;;\">";;\
$ret .= ReadingsVal($name,"Heizoelpreis","-");;\
$ret .= "&euro;;</a>/100l";;\
$ret .= "&nbsp;;(".AttrVal($name,"replacement02Value","0")."l = ";;\
$ret .= sprintf("%.2f",$price);;\
$ret .= "&euro;;)</div>";;\
return $ret;;\
}
attr Heizoel_heizoel24 webCmd reread

PLZ, Menge und Entladestellen sind wie gehabt; was nicht funktioniert sind Schlauchlänge und Fahrzeugbeschränkungen (hab ich noch nicht herausgefunden, wie man das mit HTTPMOD via POST weiterreicht).
Titel: Antw:Abfrage Heizölpreis HTTPMOD
Beitrag von: yersinia am 02 Dezember 2020, 13:45:09
Unter anderem wegen einiger Änderungen im httpmod Modul (das internal displayUrl existiert nicht mehr und wird jetzt im stateFormat zusammengebaut), hier ein kleines Update:

easyoil:
defmod Heizoel_esyoil HTTPMOD https://www.esyoil.com/preisausgabe.php?pr-unloading-points=%%ENTLADESTELLEN%%&pr-product=8&pr-payment-type=2&%%ANHAENGER%%&pr-hose-length=%%SCHLAUCHLAENGE%%&pr-app=1&pr-zip=%%PLZ%%&pr-amount=%%MENGE%%&submit= 3600
attr Heizoel_esyoil userattr reading010Name reading010OExpr reading010Regex replacement01Mode:reading,internal,text,expression,key replacement01Regex replacement01Value replacement02Mode:reading,internal,text,expression,key replacement02Regex replacement02Value replacement03Mode:reading,internal,text,expression,key replacement03Regex replacement03Value replacement04Mode:reading,internal,text,expression,key replacement04Regex replacement04Value replacement05Mode:reading,internal,text,expression,key replacement05Regex replacement05Value
attr Heizoel_esyoil enableControlSet 1
attr Heizoel_esyoil reading010Name Heizoelpreis
attr Heizoel_esyoil reading010OExpr $val =~ s/,/\./;; $val;;
attr Heizoel_esyoil reading010Regex ([\d\,]+)[\s]+€
attr Heizoel_esyoil replacement01Mode text
attr Heizoel_esyoil replacement01Regex %%PLZ%%
attr Heizoel_esyoil replacement01Value 12345
attr Heizoel_esyoil replacement02Mode text
attr Heizoel_esyoil replacement02Regex %%MENGE%%
attr Heizoel_esyoil replacement02Value 3000
attr Heizoel_esyoil replacement03Mode text
attr Heizoel_esyoil replacement03Regex %%ENTLADESTELLEN%%
attr Heizoel_esyoil replacement03Value 1
attr Heizoel_esyoil replacement04Mode text
attr Heizoel_esyoil replacement04Regex %%SCHLAUCHLAENGE%%
attr Heizoel_esyoil replacement04Value 40m
attr Heizoel_esyoil replacement05Mode text
attr Heizoel_esyoil replacement05Regex %%ANHAENGER%%
attr Heizoel_esyoil replacement05Value pr-truck-type=short_vehicle
attr Heizoel_esyoil stateFormat { my $price = 0.0;;\
$price = (AttrNum($name,"replacement02Value",0)*ReadingsNum($name,"Heizoelpreis",0))/100;;\
my $lastCheck = FmtDateTime(InternalVal($name,".LastUpdate",0));;\
my $ret = "<div style=\"text-align: left;;\">".$lastCheck.":";;\
my $link = "https://www.esyoil.com/preisausgabe.php?";;\
$link .= "pr-unloading-points=".AttrVal($name,"replacement03Value","");;\
$link .= "&pr-product=8&pr-payment-type=2";;\
$link .= "&".AttrVal($name,"replacement05Value","");;\
$link .= "&pr-hose-length=".AttrVal($name,"replacement04Value","");;\
$link .= "&pr-app=1&pr-zip=".AttrVal($name,"replacement01Value","");;\
$link .= "&pr-amount=".AttrVal($name,"replacement02Value","");;\
$link .= "&submit=";;\
$ret .= "&nbsp;;<a href=\"".$link."\" rel=\"noopener noreferrer\" target=\"_blank\" style=\"font-weight:bold;;\">";;\
$ret .= ReadingsVal($name,"Heizoelpreis","-");;\
$ret .= "&euro;;</a>/100l";;\
$ret .= "&nbsp;;(".AttrVal($name,"replacement02Value","0")."l = ";;\
$ret .= sprintf("%.2f",$price);;\
$ret .= "&euro;;)</div>";;\
return $ret;;\
}
attr Heizoel_esyoil timeout 10
attr Heizoel_esyoil webCmd reread


heizoel24.de
defmod Heizoel_heizoel24 HTTPMOD https://www.heizoel24.de/heizoelpreise-direkt/%%PLZ%%/%%MENGE%%/%%ENTLADESTELLEN%% 3600
attr Heizoel_heizoel24 userattr reading010Name reading010OExpr reading010Regex replacement01Mode:reading,internal,text,expression,key replacement01Regex replacement01Value replacement02Mode:reading,internal,text,expression,key replacement02Regex replacement02Value replacement03Mode:reading,internal,text,expression,key replacement03Regex replacement03Value replacement04Mode:reading,internal,text,expression,key
attr Heizoel_heizoel24 enableControlSet 1
attr Heizoel_heizoel24 reading010Name Heizoelpreis
attr Heizoel_heizoel24 reading010OExpr $val =~ s/,/\./;; $val;;
attr Heizoel_heizoel24 reading010Regex <span class="unitprice">([\d\,]+)[\s]+<span
attr Heizoel_heizoel24 replacement01Mode text
attr Heizoel_heizoel24 replacement01Regex %%PLZ%%
attr Heizoel_heizoel24 replacement01Value 12345
attr Heizoel_heizoel24 replacement02Mode text
attr Heizoel_heizoel24 replacement02Regex %%MENGE%%
attr Heizoel_heizoel24 replacement02Value 3000
attr Heizoel_heizoel24 replacement03Mode text
attr Heizoel_heizoel24 replacement03Regex %%ENTLADESTELLEN%%
attr Heizoel_heizoel24 replacement03Value 1
attr Heizoel_heizoel24 stateFormat { my $price = 0.0;;\
$price = (AttrNum($name,"replacement02Value",0)*ReadingsNum($name,"Heizoelpreis",0))/100;;\
my $lastCheck = FmtDateTime(InternalVal($name,".LastUpdate",0));;\
my $ret = "<div style=\"text-align: left;;\">".$lastCheck.":";;\
my $link = "https://www.heizoel24.de/heizoelpreise-direkt";;\
$link .= "/".AttrVal($name,"replacement01Value","");;\
$link .= "/".AttrVal($name,"replacement02Value","");;\
$link .= "/".AttrVal($name,"replacement03Value","");;\
$ret .= "&nbsp;;<a href=\"".$link."\" rel=\"noopener noreferrer\" target=\"_blank\" style=\"font-weight:bold;;\">";;\
$ret .= ReadingsVal($name,"Heizoelpreis","-");;\
$ret .= "&euro;;</a>/100l";;\
$ret .= "&nbsp;;(".AttrVal($name,"replacement02Value","0")."l = ";;\
$ret .= sprintf("%.2f",$price);;\
$ret .= "&euro;;)</div>";;\
return $ret;;\
}
attr Heizoel_heizoel24 timeout 10
attr Heizoel_heizoel24 webCmd reread
Titel: Antw:Abfrage Heizölpreis HTTPMOD
Beitrag von: yersinia am 05 Dezember 2020, 09:56:03
Dank amenomade (https://forum.fhem.de/index.php/topic,97694.msg1107545.html#msg1107545) sind die beiden Heizölabfragen via esyoil und heizöl24 auch als httpmod.template (https://forum.fhem.de/index.php/topic,116454.0.html) vorhanden. :)
Titel: Antw:Abfrage Heizölpreis HTTPMOD
Beitrag von: amenomade am 05 Dezember 2020, 18:37:53
Zitat von: yersinia am 05 Dezember 2020, 09:56:03
Dank amenomade (https://forum.fhem.de/index.php/topic,97694.msg1107545.html#msg1107545) sind die beiden Heizölabfragen via esyoil und heizöl24 auch als httpmod.template (https://forum.fhem.de/index.php/topic,116454.0.html) vorhanden. :)
Naja, eher dank den Autoren der jeweiligen Templates (subseven+yersinia und yersinia). Ich habe nur eingecheckt ;)
Titel: Antw:Abfrage Heizölpreis HTTPMOD
Beitrag von: daheim am 21 Juni 2021, 13:15:29
Hallo zusammen,
meine ich das nur oder funktioniert Heizöl24 nicht mehr? Habe die URL auf das aktuelle Format angepasst aber ich bekomme nichts geliefert...
Titel: Antw:Abfrage Heizölpreis HTTPMOD
Beitrag von: yersinia am 21 Juni 2021, 15:28:55
Ja, funktioniert bei mir seit dem 17.05. auch nicht mehr.
Zitat von: daheim am 21 Juni 2021, 13:15:29Habe die URL auf das aktuelle Format angepasst aber ich bekomme nichts geliefert...
Was heisst aktuelles Format?
https://www.heizoel24.de/heizoel/angebotsliste?zipCode=%%PLZ%%&amount=%%MENGE%%&stations=%%ENTLADESTELLEN%%&product=1
?

Die URL allein reicht nicht, die RegEx muss auch angepasst werden. Da ist mir aber auch noch überhaupt nicht klar, was fhem via httpmod hier überhaupt empfängt und wie die RegEx auszusehen hat. :-\
Titel: Antw:Abfrage Heizölpreis HTTPMOD
Beitrag von: yersinia am 22 Juni 2021, 09:18:50
Beim suchen nach einer API bin ich über diese xml Schnittstelle (https://homematic-forum.de/forum/viewtopic.php?t=51800) gestolpert, der aktualisierte Code wäre dann:
defmod Heizoel_heizoel24 HTTPMOD https://www.heizoel24.de/DailyPriceXml.ashx?zipcode=%%PLZ%%&litre=%%MENGE%%&unloadingpoints=%%ENTLADESTELLEN%%&oilgrade=standard 3600
attr Heizoel_heizoel24 userattr replacement03Value:1,2,3,4,5,6,7,8,9,10
attr Heizoel_heizoel24 enableControlSet 1
attr Heizoel_heizoel24 reading010Name Heizoelpreis
attr Heizoel_heizoel24 reading010OExpr $val =~ s/,/\./;; $val;;
attr Heizoel_heizoel24 reading010Regex ([\d\,]+)<\/price
attr Heizoel_heizoel24 replacement01Mode text
attr Heizoel_heizoel24 replacement01Regex %%PLZ%%
attr Heizoel_heizoel24 replacement01Value 12345
attr Heizoel_heizoel24 replacement02Mode text
attr Heizoel_heizoel24 replacement02Regex %%MENGE%%
attr Heizoel_heizoel24 replacement02Value 3000
attr Heizoel_heizoel24 replacement03Mode text
attr Heizoel_heizoel24 replacement03Regex %%ENTLADESTELLEN%%
attr Heizoel_heizoel24 replacement03Value 1
attr Heizoel_heizoel24 stateFormat { my $price = 0.0;;\
$price = (AttrNum($name,"replacement02Value",0)*ReadingsNum($name,"Heizoelpreis",0))/100;;\
my $lastCheck = ReadingsTimestamp($name,"Heizoelpreis","");;\
my $ret = "<div style=\"text-align: left;;\">".$lastCheck.":";;\
my $link = "https://www.heizoel24.de/heizoel/angebotsliste?";;\
$link .= "zipCode=".AttrVal($name,"replacement01Value","");;\
$link .= "&amount=".AttrVal($name,"replacement02Value","");;\
$link .= "&stations=".AttrVal($name,"replacement03Value","");;\
$link .= "&product=1";;\
$ret .= "&nbsp;;<a href=\"".$link."\" rel=\"noopener noreferrer\" target=\"_blank\" style=\"font-weight:bold;;\">";;\
$ret .= ReadingsVal($name,"Heizoelpreis","-");;\
$ret .= "&euro;;</a>/100l";;\
$ret .= "&nbsp;;(".AttrVal($name,"replacement02Value","0")."l = ";;\
$ret .= sprintf("%.2f",$price);;\
$ret .= "&euro;;)</div>";;\
return $ret;;\
}
attr Heizoel_heizoel24 timeout 10
attr Heizoel_heizoel24 webCmd reread

Ich habe das kurz getestet und es sieht erstmal gut aus.
Titel: Antw:Abfrage Heizölpreis HTTPMOD
Beitrag von: AET_FHEM am 22 Juni 2021, 17:13:47
kann ich nur so bestätigen sieht sehr gut aus ...
=> bis auf den Preis :-) der ist zu hoch  ;D
Titel: Antw:Abfrage Heizölpreis HTTPMOD
Beitrag von: amenomade am 26 Juni 2021, 02:07:01
Danke, ich habe es so in httpmod.template eingecheckt.
Titel: Antw:Abfrage Heizölpreis HTTPMOD
Beitrag von: docolli am 15 Juli 2021, 11:02:07
Coole Sache, das mit der Heizölpreisabfrage. Seit kurzem habe ich einen Tanksensor, den ich in FHEM eingebunden habe und jetzt wollte ich das mit dem aktuellen Heizölpreis ergänzen.

Ich habe das Template verwendet, aber leider klappt die Abfrage von esyoil nicht. Ich bekomme nur das
Heizoelpreis                       2021-07-15 10:46:34: -€/100l (2500l = 0.00€)

Mein STATE sieht so aus
<div style="text-align: left;;">2021-07-15 10:16:34:&nbsp;<a href="https://www.esyoil.com/preisausgabe.php?pr-unloading-points=1&pr-product=8&pr-payment-type=2&pr-truck-type=&pr-hose-length=40m&pr-app=1&pr-zip=88447&pr-amount=2500&submit=" rel="noopener noreferrer" target="_blank" style="font-weight:bold;">-&euro;</a>/100l&nbsp;(2500l = 0.00&euro;)</div>

Nehm ich die URL aus dem STATE, so klappt die Abfrage. Kann mir jemand helfen, woran das liegt?

Noch was: Ich habe das Attribut "replacement02Value" fix auf 2500 gesetzt. Das war vorher "replacement02Value ReadingsVal("Heizoelpreis","Tankmenge",0)", aber damit landet der String "ReadingsVal("Heizoelpreis","Tankmenge",0)" in der URL anstatt dem Wert des Readings. Das "Tankvolumen" Reading habe ich manuell gesetzt, er rechnet auch richtig, im Device sehe ich im Reading "Tankmenge" den korrekten Wert.

Zur Ergänzung meine Definition:

defmod Heizoelpreis HTTPMOD https://www.esyoil.com/preisausgabe.php?pr-unloading-points=%%ENTLADESTELLEN%%&pr-product=8&pr-payment-type=2&%%ANHAENGER%%&pr-hose-length=%%SCHLAUCHLAENGE%%&pr-app=1&pr-zip=%%PLZ%%&pr-amount=%%MENGE%%&submit= 1800
attr Heizoelpreis userattr replacement03Value:1,2,3,4,5,6,7,8,9,10 replacement04Value:40m,60m,80m replacement05Value:pr-truck-type=,pr-truck-type=short_vehicle
attr Heizoelpreis enableControlSet 1
attr Heizoelpreis model fuel_oil_check_esyoil
attr Heizoelpreis reading010Name Heizoelpreis
attr Heizoelpreis reading010OExpr $val =~ s/,/\./;; $val;;
attr Heizoelpreis reading010Regex ([\d\,]+)[\s]+€
attr Heizoelpreis replacement01Mode text
attr Heizoelpreis replacement01Regex %%PLZ%%
attr Heizoelpreis replacement01Value 88447
attr Heizoelpreis replacement02Mode text
attr Heizoelpreis replacement02Regex %%MENGE%%
attr Heizoelpreis replacement02Value 2500
attr Heizoelpreis replacement03Mode text
attr Heizoelpreis replacement03Regex %%ENTLADESTELLEN%%
attr Heizoelpreis replacement03Value 1
attr Heizoelpreis replacement04Mode text
attr Heizoelpreis replacement04Regex %%SCHLAUCHLAENGE%%
attr Heizoelpreis replacement04Value 40m
attr Heizoelpreis replacement05Mode text
attr Heizoelpreis replacement05Regex %%ANHAENGER%%
attr Heizoelpreis replacement05Value pr-truck-type=
attr Heizoelpreis room HEIZOEL,Heizung/Warmwasser
attr Heizoelpreis stateFormat { my $price = 0.0;;\
$price = (AttrNum($name,"replacement02Value",0)*ReadingsNum($name,"Heizoelpreis",0))/100;;\
my $lastCheck = FmtDateTime(InternalVal($name,".LastUpdate",0));;\
my $ret = "<div style=\"text-align: left;;;;\">".$lastCheck.":";;\
my $link = "https://www.esyoil.com/preisausgabe.php?";;\
$link .= "pr-unloading-points=".AttrVal($name,"replacement03Value","");;\
$link .= "&pr-product=8&pr-payment-type=2";;\
$link .= "&".AttrVal($name,"replacement05Value","");;\
$link .= "&pr-hose-length=".AttrVal($name,"replacement04Value","");;\
$link .= "&pr-app=1&pr-zip=".AttrVal($name,"replacement01Value","");;\
$link .= "&pr-amount=".AttrVal($name,"replacement02Value","");;\
$link .= "&submit=";;\
$ret .= "&nbsp;;<a href=\"".$link."\" rel=\"noopener noreferrer\" target=\"_blank\" style=\"font-weight:bold;;\">";;\
$ret .= ReadingsVal($name,"Heizoelpreis","-");;\
$ret .= "&euro;;</a>/100l";;\
$ret .= "&nbsp;;(".AttrVal($name,"replacement02Value","0")."l = ";;\
$ret .= sprintf("%.2f",$price);;\
$ret .= "&euro;;)</div>";;\
return $ret;;\
}
attr Heizoelpreis timeout 10
attr Heizoelpreis userReadings Tankvolumen:none {}, Tankmenge {ReadingsVal("Heizoelpreis","Tankvolumen",0)-ReadingsVal("Heizoel","liter",0)}, Fuellkosten {ReadingsVal("Heizoelpreis","Tankmenge",0)/100*ReadingsVal("Heizoelpreis","Heizoelpreis",0)}
attr Heizoelpreis webCmd reread

setstate Heizoelpreis <div style="text-align: left;;;;">2021-07-15 13:14:15:&nbsp;;<a href="https://www.esyoil.com/preisausgabe.php?pr-unloading-points=1&pr-product=8&pr-payment-type=2&pr-truck-type=&pr-hose-length=40m&pr-app=1&pr-zip=88447&pr-amount=2500&submit=" rel="noopener noreferrer" target="_blank" style="font-weight:bold;;">-&euro;;</a>/100l&nbsp;;(2500l = 0.00&euro;;)</div>
setstate Heizoelpreis 2021-07-15 13:14:17 Fuellkosten 0
setstate Heizoelpreis 2021-07-15 13:14:17 Tankmenge 2238
setstate Heizoelpreis 2021-07-15 08:28:03 Tankvolumen 3000
setstate Heizoelpreis 2021-07-15 13:05:15 attrTemplateVersion 20201206
Titel: Antw:Abfrage Heizölpreis HTTPMOD
Beitrag von: yersinia am 15 Juli 2021, 14:22:29
Esyoil hat scheinbar gestern die Seitenstruktur geändert - ruf' die Seite mal ohne JavaScript auf, dann siehst du genau keine Preise. Und somit das bisher verwendete HTTPMOD Template ebenso wenig. Ich habe spontan keine Idee, wie man HTTPMOD dazu ermutigt, das JavaScript beim Abruf entsprechend zuzulassen - vlt. weiß jemand anders mehr. :)
Eine alternative Quelle bei easyoil fehlt mir ebenso, leider. Jedenfalls spuckt [Suchmaschine] dazu nichts aus. :-[

Bis dahin bleibt (erstmal) nur heizoel24.

Bezgl der Tankmenge/-größe versuche dies mal: https://forum.fhem.de/index.php/topic,121789.msg1163821.html#msg1163821
attr Heizoelpreis replacement02Value Heizoelpreis:Tankmenge
Titel: Antw:Abfrage Heizölpreis HTTPMOD
Beitrag von: docolli am 15 Juli 2021, 16:31:11
Okay, ich befürchte HTTPMOD kann kein Javascript ausführen.

Dann habe ich jetzt esyoil gelöscht, mir egal, woher der Preis kommt. Soll ja nur eine ungefähre Angabe sein.
Ich habe nun Heizöl24 eingerichtet, aber auch hier bekomme ich keine Daten.

Meine Definition:
defmod Heizoelpreis HTTPMOD https://www.heizoel24.de/heizoelpreise-direkt/%%PLZ%%/%%MENGE%%/%%ENTLADESTELLEN%% 3600
attr Heizoelpreis userattr replacement03Value:1,2,3,4,5,6,7,8,9,10
attr Heizoelpreis enableControlSet 1
attr Heizoelpreis model fuel_oil_check_heizoel24
attr Heizoelpreis reading010Name Heizoelpreis
attr Heizoelpreis reading010OExpr $val =~ s/,/\./;; $val;;
attr Heizoelpreis reading010Regex <span class="unitprice">([\d\,]+)[\s]+<span
attr Heizoelpreis replacement01Mode text
attr Heizoelpreis replacement01Regex %%PLZ%%
attr Heizoelpreis replacement01Value 88447
attr Heizoelpreis replacement02Mode text
attr Heizoelpreis replacement02Regex %%MENGE%%
attr Heizoelpreis replacement02Value 2500
attr Heizoelpreis replacement03Mode text
attr Heizoelpreis replacement03Regex %%ENTLADESTELLEN%%
attr Heizoelpreis replacement03Value 1
attr Heizoelpreis room Heizung/Warmwasser
attr Heizoelpreis stateFormat { my $price = 0.0;;\
$price = (AttrNum($name,"replacement02Value",0)*ReadingsNum($name,"Heizoelpreis",0))/100;;\
my $lastCheck = FmtDateTime(InternalVal($name,".LastUpdate",0));;\
my $ret = "<div style=\"text-align: left;;;;\">".$lastCheck.":";;\
my $link = "https://www.heizoel24.de/heizoelpreise-direkt";;\
$link .= "/".AttrVal($name,"replacement01Value","");;\
$link .= "/".AttrVal($name,"replacement02Value","");;\
$link .= "/".AttrVal($name,"replacement03Value","");;\
$ret .= "&nbsp;;<a href=\"".$link."\" rel=\"noopener noreferrer\" target=\"_blank\" style=\"font-weight:bold;;\">";;\
$ret .= ReadingsVal($name,"Heizoelpreis","-");;\
$ret .= "&euro;;</a>/100l";;\
$ret .= "&nbsp;;(".AttrVal($name,"replacement02Value","0")."l = ";;\
$ret .= sprintf("%.2f",$price);;\
$ret .= "&euro;;)</div>";;\
return $ret;;\
}
attr Heizoelpreis timeout 10
attr Heizoelpreis webCmd reread

setstate Heizoelpreis <div style="text-align: left;;;;">2021-07-15 16:25:46:&nbsp;;<a href="https://www.heizoel24.de/heizoelpreise-direkt/88447/2500/1" rel="noopener noreferrer" target="_blank" style="font-weight:bold;;">-&euro;;</a>/100l&nbsp;;(2500l = 0.00&euro;;)</div>
setstate Heizoelpreis 2021-07-15 16:24:53 attrTemplateVersion 20201206


Titel: Antw:Abfrage Heizölpreis HTTPMOD
Beitrag von: yersinia am 15 Juli 2021, 16:38:59
Du nutzt nicht das aktuelle Template für heizöl24 (https://forum.fhem.de/index.php/topic,107189.msg1163471.html#msg1163471).
Titel: Antw:Abfrage Heizölpreis HTTPMOD
Beitrag von: docolli am 15 Juli 2021, 17:06:04
Danke! So klappt es jetzt mit dem Preis.

Aber das mit dem Attribut und der Übernahme des Wertes aus dem reading bekomme ich nicht hin (habe schon expression und text Mode probiert):
2021-07-15 16:49:16: 69.94€/100l (Heizoel_heizoel24:Tankmengel = 16.79€)

attr Heizoel_heizoel24 replacement02Mode expression
attr Heizoel_heizoel24 replacement02Regex %%MENGE%%
attr Heizoel_heizoel24 replacement02Value Heizoel_heizoel24:Tankmenge


setstate Heizoel_heizoel24 2021-07-15 17:34:24 Fuellkosten 1763.0964
setstate Heizoel_heizoel24 2021-07-15 17:34:24 Heizoelpreis 78.78
setstate Heizoel_heizoel24 2021-07-15 17:34:24 Tankmenge 2238
setstate Heizoel_heizoel24 2021-07-15 16:47:33 Tankvolumen 3000
Titel: Antw:Abfrage Heizölpreis HTTPMOD
Beitrag von: docolli am 15 Juli 2021, 17:55:36
Bin ein Stück weiter. Die Menge wird in der Get URL schon korrekt eingetragen, das sehe ich am Preis, der zurück kommt. Es ist ein Problem im stateFormat, welches den Wert des Attributes über "AttrVal($name,"replacement02Value","") zu ermitteln versucht, aber dabei nur den Text "ReadingsVal("Heizoel_heizoel24","Tankmenge",0)" zurück bekommt. Das wird hier nicht als "expression" interpretiert!


attr Heizoel_heizoel24 stateFormat { my $price = 0.0;;\
$price = (AttrNum($name,"replacement02Value",0)*ReadingsNum($name,"Heizoelpreis",0))/100;;\
my $lastCheck = ReadingsTimestamp($name,"Heizoelpreis","");;\
my $ret = "<div style=\"text-align: left;;\">";;\
my $link = "https://www.heizoel24.de/heizoel/angebotsliste?";;\
$link .= "zipCode=".AttrVal($name,"replacement01Value","");;\
$link .= "&amount=".AttrVal($name,"replacement02Value","");;\
$link .= "&stations=".AttrVal($name,"replacement03Value","");;\
$link .= "&product=1";;\
$ret .= "&nbsp;;<a href=\"".$link."\" rel=\"noopener noreferrer\" target=\"_blank\" style=\"font-weight:bold;;\">";;\
$ret .= ReadingsVal($name,"Heizoelpreis","-");;\
$ret .= "&euro;;</a>/100l";;\
$ret .= "&nbsp;;(".AttrVal($name,"replacement02Value","0")."l = ";;\
$ret .= sprintf("%.2f",$price);;\
$ret .= "&euro;;) - ".$lastCheck."</div>";;\
return $ret;;\
}
Titel: Antw:Abfrage Heizölpreis HTTPMOD
Beitrag von: docolli am 15 Juli 2021, 18:21:10
Für mich habe ich jetzt eine Lösung!
Ich rechne in einer userreadings Definition und beziehe mich dann auf diese Readings:

attr Heizoel_heizoel24 userReadings Tankvolumen:none {}, Tankmenge {ReadingsVal("Heizoel_heizoel24","Tankvolumen",0)-ReadingsVal("Heizoel","liter",0)}, Fuellkosten {ReadingsVal("Heizoel_heizoel24","Tankmenge",0)/100*ReadingsVal("Heizoel_heizoel24","Heizoelpreis",0)}

attr Heizoel_heizoel24 stateFormat { my $price = 0.0;;\
$price = ReadingsNum($name,"Fuellkosten",0);;\
my $lastCheck = ReadingsTimestamp($name,"Heizoelpreis","");;\
my $ret = "<div style=\"text-align: left;;\">";;\
my $link = "https://www.heizoel24.de/heizoel/angebotsliste?";;\
$link .= "zipCode=".AttrVal($name,"replacement01Value","");;\
$link .= "&amount=".ReadingsNum($name,"Tankmenge",0);;\
$link .= "&stations=".AttrVal($name,"replacement03Value","");;\
$link .= "&product=1";;\
$ret .= "&nbsp;;<a href=\"".$link."\" rel=\"noopener noreferrer\" target=\"_blank\" style=\"font-weight:bold;;\">";;\
$ret .= ReadingsVal($name,"Heizoelpreis","-");;\
$ret .= "&euro;;</a>/100l";;\
$ret .= "&nbsp;;(".ReadingsNum($name,"Tankmenge",0)."l = ";;\
$ret .= sprintf("%.2f",$price);;\
$ret .= "&euro;;) - ".$lastCheck."</div>";;\
return $ret;;\
}
Titel: Antw:Abfrage Heizölpreis HTTPMOD
Beitrag von: docolli am 15 Juli 2021, 18:53:34
Ich habe mich noch etwas mit den XML Parametern beschäftigt und das "oilgrade" noch über ein userattribut konfigurierbar gemacht.

Für die Copy&Paste Fraktion (so habe ich heute morgen auch angefangen) hier die Definition:
defmod Heizoel_heizoel24 HTTPMOD https://www.heizoel24.de/DailyPriceXml.ashx?zipcode=%%PLZ%%&litre=%%MENGE%%&unloadingpoints=%%ENTLADESTELLEN%%&oilgrade=%%OELSORTE%% 3600
attr Heizoel_heizoel24 userattr replacement03Value:1,2,3,4,5,6,7,8,9,10 replacement04Value:standard,super,bio
attr Heizoel_heizoel24 alias Heizölpreis
attr Heizoel_heizoel24 enableControlSet 1
attr Heizoel_heizoel24 group Heizung
attr Heizoel_heizoel24 reading010Name Heizoelpreis
attr Heizoel_heizoel24 reading010OExpr $val =~ s/,/\./;; $val;;
attr Heizoel_heizoel24 reading010Regex ([\d\,]+)<\/price
attr Heizoel_heizoel24 replacement01Mode text
attr Heizoel_heizoel24 replacement01Regex %%PLZ%%
attr Heizoel_heizoel24 replacement01Value 88447
attr Heizoel_heizoel24 replacement02Mode expression
attr Heizoel_heizoel24 replacement02Regex %%MENGE%%
attr Heizoel_heizoel24 replacement02Value ReadingsVal($name,"Tankmenge",0)
attr Heizoel_heizoel24 replacement03Mode text
attr Heizoel_heizoel24 replacement03Regex %%ENTLADESTELLEN%%
attr Heizoel_heizoel24 replacement03Value 1
attr Heizoel_heizoel24 replacement04Mode text
attr Heizoel_heizoel24 replacement04Regex %%OELSORTE%%
attr Heizoel_heizoel24 replacement04Value super
attr Heizoel_heizoel24 room Heizung/Warmwasser
attr Heizoel_heizoel24 stateFormat { my $price = 0.0;;\
$price = ReadingsNum($name,"Fuellkosten",0);;\
my $lastCheck = ReadingsTimestamp($name,"Heizoelpreis","");;\
my $ret = "<div style=\"text-align: left;;\">";;\
my $link = "https://www.heizoel24.de/heizoel/angebotsliste?";;\
$link .= "zipCode=".AttrVal($name,"replacement01Value","");;\
$link .= "&amount=".ReadingsNum($name,"Tankmenge",0);;\
$link .= "&stations=".AttrVal($name,"replacement03Value","");;\
$link .= "&product=1";;\
$ret .= "&nbsp;;<a href=\"".$link."\" rel=\"noopener noreferrer\" target=\"_blank\" style=\"font-weight:bold;;\">";;\
$ret .= ReadingsVal($name,"Heizoelpreis","-");;\
$ret .= "&euro;;</a>/100l";;\
$ret .= "&nbsp;;(".ReadingsNum($name,"Tankmenge",0)."l = ";;\
$ret .= sprintf("%.2f",$price);;\
$ret .= "&euro;;) - ".$lastCheck."</div>";;\
return $ret;;\
}
attr Heizoel_heizoel24 timeout 10
attr Heizoel_heizoel24 userReadings Tankvolumen:none {}, Tankmenge {ReadingsVal($name,"Tankvolumen",0)-ReadingsVal("Heizoel","liter",0)}, Fuellkosten {ReadingsVal($name,"Tankmenge",0)/100*ReadingsVal($name,"Heizoelpreis",0)}
attr Heizoel_heizoel24 webCmd reread


Unbedingt noch den maximalen Tankinhalt als Reading "Tankvolumen" mit eurem Wert xxxx anlegen:
setreading Heizoelpreis_heizoel24 Tankvolumen xxxx

und das ReadingsVal [ReadingsVal("Heizoel","liter",0)] in den userReadings, welches auf den aktuellen Tankinhalt zeigt, auch anpassen.

Titel: Antw:Abfrage Heizölpreis HTTPMOD
Beitrag von: yersinia am 16 Juli 2021, 09:11:44
Zitat von: docolli am 15 Juli 2021, 18:53:34Ich habe mich noch etwas mit den XML Parametern beschäftigt und das "oilgrade" noch über ein userattribut konfigurierbar gemacht.
Cool! 8)
Titel: Antw:Abfrage Heizölpreis HTTPMOD
Beitrag von: docolli am 16 Juli 2021, 19:04:39
Weitere Verbesserungen:

Hinweis: Wenn es die gewählte Heizölsorte im PLZ Bereich nicht gibt, dann erkennt man das daran, dass der State nicht aktualisiert wird. Es kommt keine Fehlermeldung oder ähnliches!


defmod Heizoel_heizoel24 HTTPMOD https://www.heizoel24.de/DailyPriceXml.ashx?zipcode=%%PLZ%%&litre=%%MENGE%%&unloadingpoints=%%ENTLADESTELLEN%%&oilgrade=%%OELSORTE%% 86400
attr Heizoel_heizoel24 userattr replacement03Value:1,2,3,4,5,6,7,8,9,10 replacement04Value:standard,super,premiumecotherm,bio roundTo:1,10,50,100,250,500,1000
attr Heizoel_heizoel24 alias Heizölpreis
attr Heizoel_heizoel24 enableControlSet 1
attr Heizoel_heizoel24 group Heizung
attr Heizoel_heizoel24 reading010Name Heizoelpreis
attr Heizoel_heizoel24 reading010OExpr $val =~ s/,/\./;; $val;;
attr Heizoel_heizoel24 reading010Regex ([\d\,]+)<\/price
attr Heizoel_heizoel24 reading020Name Heizoelsorte
attr Heizoel_heizoel24 reading020OExpr $val =~ s/,/\./;; $val;;
attr Heizoel_heizoel24 reading020Regex oilGrade="([^"]*)"
attr Heizoel_heizoel24 replacement01Mode text
attr Heizoel_heizoel24 replacement01Regex %%PLZ%%
attr Heizoel_heizoel24 replacement01Value 88447
attr Heizoel_heizoel24 replacement02Mode expression
attr Heizoel_heizoel24 replacement02Regex %%MENGE%%
attr Heizoel_heizoel24 replacement02Value ReadingsVal($name,"Tankmenge",0)
attr Heizoel_heizoel24 replacement03Mode text
attr Heizoel_heizoel24 replacement03Regex %%ENTLADESTELLEN%%
attr Heizoel_heizoel24 replacement03Value 1
attr Heizoel_heizoel24 replacement04Mode text
attr Heizoel_heizoel24 replacement04Regex %%OELSORTE%%
attr Heizoel_heizoel24 replacement04Value super
attr Heizoel_heizoel24 room Heizung/Warmwasser
attr Heizoel_heizoel24 roundTo 250
attr Heizoel_heizoel24 stateFormat { my $price = 0.0;;\
my $index = 1;;\
my $oilgradecode;;\
my @oilgrade = ("standard","super","premiumecotherm","bio");;\
foreach my $i (@oilgrade){ if ($i eq AttrVal($name,"replacement04Value","")){ $oilgradecode=$index;; } $index++;; }\
$price = ReadingsNum($name,"Fuellkosten",0);;\
my $lastCheck = ReadingsTimestamp($name,"Heizoelpreis","");;\
my $ret = "<div style=\"text-align: left;;\">";;\
my $link = "https://www.heizoel24.de/heizoel/angebotsliste?";;\
$link .= "zipCode=".AttrVal($name,"replacement01Value","");;\
$link .= "&amount=".ReadingsNum($name,"Tankmenge",0);;\
$link .= "&stations=".AttrVal($name,"replacement03Value","");;\
$link .= "&product=".$oilgradecode;;\
$ret .= "&nbsp;;<a href=\"".$link."\" rel=\"noopener noreferrer\" target=\"_blank\" style=\"font-weight:bold;;\">";;\
$ret .= ReadingsVal($name,"Heizoelpreis","-");;\
$ret .= "&euro;;</a>/100l";;\
$ret .= "&nbsp;;(".ReadingsNum($name,"Tankmenge",0)."l = ";;\
$ret .= sprintf("%.2f",$price);;\
$ret .= "&euro;;) ";;\
        $ret .= " / ".ReadingsVal($name,"Heizoelsorte","-");;\
        $ret .= " - ".$lastCheck."</div>";;\
return $ret;;\
}\

attr Heizoel_heizoel24 timeout 10
attr Heizoel_heizoel24 userReadings Tankvolumen:none {}, Tankmenge {int((ReadingsVal($name,"Tankvolumen",0)-ReadingsVal("Heizoel","liter",0))/AttrVal($name,"roundTo",1))*AttrVal($name,"roundTo",1)}, Fuellkosten {ReadingsVal($name,"Tankmenge",0)/100*ReadingsVal($name,"Heizoelpreis",0)}
attr Heizoel_heizoel24 webCmd reread

Titel: Antw:Abfrage Heizölpreis HTTPMOD
Beitrag von: yersinia am 20 Juli 2021, 10:40:16
Da esyoil sich nicht mehr abfragen lässt (https://forum.fhem.de/index.php/topic,107189.msg1166658.html#msg1166658), habe ich den Weg via check24 gefunden - lustigerweise nutzt check24 nach Angaben auf deren Webseite den Service von esyoil. Anbei die neue & erweiterte raw:
defmod Heizoel_esyoil HTTPMOD https://www.check24.de/heizoel/?c24_calculate=calculate&zipcode=%%PLZ%%&amount=%%MENGE%%&up=%%ENTLADESTELLEN%%&prod=%%OILGRADE%%&payment_type=%%PAYMENT%%&%%ANHANGER%%&%%SCHLAUCHLAENGE%%&%%EXPRESS%% 3600
attr Heizoel_esyoil userattr replacement03Value:1,2,3,4,5,6,7,8,9,10 replacement04Value:hose=,hose=hose_l,hose=hose_xl replacement05Value:short_vehicle=,short_vehicle=short_vehicle replacement06Value:8,4 replacement07Value:1,2,3,4,6 replacement08Value:express=,express=1
attr Heizoel_esyoil enableControlSet 1
attr Heizoel_esyoil reading010Name Heizoelpreis
attr Heizoel_esyoil reading010OExpr $val =~ s/,/\./;; $val;;
attr Heizoel_esyoil reading010Regex ([\d\,]+)\&nbsp\;;\&euro\;;
attr Heizoel_esyoil replacement01Mode text
attr Heizoel_esyoil replacement01Regex %%PLZ%%
attr Heizoel_esyoil replacement01Value 12345
attr Heizoel_esyoil replacement02Mode text
attr Heizoel_esyoil replacement02Regex %%MENGE%%
attr Heizoel_esyoil replacement02Value 5000
attr Heizoel_esyoil replacement03Mode text
attr Heizoel_esyoil replacement03Regex %%ENTLADESTELLEN%%
attr Heizoel_esyoil replacement03Value 1
attr Heizoel_esyoil replacement04Mode text
attr Heizoel_esyoil replacement04Regex %%SCHLAUCHLAENGE%%
attr Heizoel_esyoil replacement04Value hose=
attr Heizoel_esyoil replacement05Mode text
attr Heizoel_esyoil replacement05Regex %%ANHAENGER%%
attr Heizoel_esyoil replacement05Value short_vehicle=
attr Heizoel_esyoil replacement06Mode text
attr Heizoel_esyoil replacement06Regex %%OILGRADE%%
attr Heizoel_esyoil replacement06Value 8
attr Heizoel_esyoil replacement07Mode text
attr Heizoel_esyoil replacement07Regex %%PAYMENT%%
attr Heizoel_esyoil replacement07Value 2
attr Heizoel_esyoil replacement08Mode text
attr Heizoel_esyoil replacement08Regex %%EXPRESS%%
attr Heizoel_esyoil replacement08Value express=
attr Heizoel_esyoil stateFormat { my $price = 0.0;;\
$price = (AttrNum($name,"replacement02Value",0)*ReadingsNum($name,"Heizoelpreis",0))/100;;\
#my $lastCheck = POSIX::strftime("%d.%m. %H:%M",localtime(time_str2num(ReadingsTimestamp($name,"Heizoelpreis","2000-01-01 00:00:00"))));;\
#my $lastCheck = FmtDateTime(InternalVal($name,".LastUpdate",0));;\
my $lastCheck = ReadingsTimestamp($name,"Heizoelpreis","");;\
my $ret = "<div style=\"text-align: left;;\">".$lastCheck.":";;\
my $link = "https://www.check24.de/heizoel/?c24_calculate=calculate";;\
$link .= "&zipcode=".AttrVal($name,"replacement01Value","");;\
$link .= "&amount=".AttrVal($name,"replacement02Value","");;\
$link .= "&up=".AttrVal($name,"replacement03Value","");;\
$link .= "&".AttrVal($name,"replacement04Value","");; #hose length\
$link .= "&".AttrVal($name,"replacement05Value","");; #short vehicle\
$link .= "&prod=".AttrVal($name,"replacement06Value","");; # product 8 = normal schwefelarm 4 = premium schwefelarm\
$link .= "&payment_type=".AttrVal($name,"replacement07Value","");; # 1 = Barzahlung, 2 = EC-Karte, 3 = Vorkasse, 4 = Lastschrift, 5 = Wärmekonto, 6 = Rechnung, 10 = Ratenkauf\
$link .= "&".AttrVal($name,"replacement08Value","");; #express;;\
$ret .= "&nbsp;;<a href=\"".$link."\" rel=\"noopener noreferrer\" target=\"_blank\" style=\"font-weight:bold;;\">";;\
$ret .= ReadingsVal($name,"Heizoelpreis","-");;\
$ret .= "&euro;;</a>/100l";;\
$ret .= "&nbsp;;(".AttrVal($name,"replacement02Value","0")."l = ";;\
$ret .= sprintf("%.2f",$price);;\
$ret .= "&euro;;)</div>";;\
return $ret;;\
}
attr Heizoel_esyoil timeout 10
attr Heizoel_esyoil webCmd reread

Dabei sind



EDIT: @amenomade: ein Vorschlag für das Template:
#Contributed by subseven & yersinia, see https://forum.fhem.de/index.php/topic,107189.msg1167281.html#msg1167281
name:fuel_oil_check_esyoil
filter:TYPE=HTTPMOD
desc: checks fuel oil prices via check24.de (service provided by esyoil.com)<br />Define a HTTPMOD device like<br />define heizoelpreis HTTPMOD https://www.check24.de/heizoel/?c24_calculate=calculate&zipcode=%%PLZ%%&amount=%%MENGE%%&up=%%ENTLADESTELLEN%%&prod=%%OILGRADE%%&payment_type=%%PAYMENT%%&%%ANHANGER%%&%%SCHLAUCHLAENGE%%&%%EXPRESS%% 3600<br />Maintain Attributes for ZIP (PLZ), order volume (Bestellmenge), unloading points (Entladestellen), hose length (Schlauchlaenge), truck trailer accessibility (mit Anhaenger moeglich), oilgrade (Oelsorte), payment method (Zahlart) and express delivery (Expresslieferung) before senseful values can be retrieved.<br />Further information and documentation can be found in <a href="https://forum.fhem.de/index.php/topic,107189.msg1167281.html#msg1167281">this FHEM forum thread</a>
par:WHICHROOM;Actual room of the device, defaults to HTTPMOD; {AttrVal("DEVICE","room","HTTPMOD")}
par:INTERVAL;Actual interval for updating, defaults to hourly (3600s); {InternalVal("DEVICE","Interval","3600")}
par:ZIPCODE;German ZIP Code / deutsche Postleitzahl; {AttrVal("DEVICE","replacement01Value","12345")}
par:ORDERVOLUME;fuel order volume in litre / Bestellmenge in Liter; {AttrVal("DEVICE","replacement02Value","5000")}
defmod DEVICE HTTPMOD https://www.check24.de/heizoel/?c24_calculate=calculate&zipcode=%%PLZ%%&amount=%%MENGE%%&up=%%ENTLADESTELLEN%%&prod=%%OILGRADE%%&payment_type=%%PAYMENT%%&%%ANHANGER%%&%%SCHLAUCHLAENGE%%&%%EXPRESS%% INTERVAL
attr DEVICE userattr replacement03Value:1,2,3,4,5,6,7,8,9,10 replacement04Value:hose=,hose=hose_l,hose=hose_xl replacement05Value:short_vehicle=,short_vehicle=short_vehicle replacement06Value:8,4 replacement07Value:1,2,3,4,6 replacement08Value:express=,express=1
attr DEVICE enableControlSet 1
attr DEVICE reading010Name Heizoelpreis
attr DEVICE reading010OExpr $val =~ s/,/\./;; $val;;
attr DEVICE reading010Regex ([\d\,]+)\&nbsp\;;\&euro\;;
attr DEVICE replacement01Mode text
attr DEVICE replacement01Regex %%PLZ%%
attr DEVICE replacement01Value ZIPCODE
attr DEVICE replacement02Mode text
attr DEVICE replacement02Regex %%MENGE%%
attr DEVICE replacement02Value ORDERVOLUME
attr DEVICE replacement03Mode text
attr DEVICE replacement03Regex %%ENTLADESTELLEN%%
attr DEVICE replacement03Value 1
attr DEVICE replacement04Mode text
attr DEVICE replacement04Regex %%SCHLAUCHLAENGE%%
attr DEVICE replacement04Value hose=
attr DEVICE replacement05Mode text
attr DEVICE replacement05Regex %%ANHAENGER%%
attr DEVICE replacement05Value short_vehicle=
attr DEVICE replacement06Mode text
attr DEVICE replacement06Regex %%OILGRADE%%
attr DEVICE replacement06Value 8
attr DEVICE replacement07Mode text
attr DEVICE replacement07Regex %%PAYMENT%%
attr DEVICE replacement07Value 2
attr DEVICE replacement08Mode text
attr DEVICE replacement08Regex %%EXPRESS%%
attr DEVICE replacement08Value express=
attr DEVICE stateFormat { my $price = 0.0;;\
$price = (AttrNum($name,"replacement02Value",0)*ReadingsNum($name,"Heizoelpreis",0))/100;;\
my $lastCheck = ReadingsTimestamp($name,"Heizoelpreis","");;\
my $ret = "<div style=\"text-align: left;;\">".$lastCheck.":";;\
my $link = "https://www.check24.de/heizoel/?c24_calculate=calculate";;\
$link .= "&zipcode=".AttrVal($name,"replacement01Value","");;\
$link .= "&amount=".AttrVal($name,"replacement02Value","");;\
$link .= "&up=".AttrVal($name,"replacement03Value","");;\
$link .= "&".AttrVal($name,"replacement04Value","");; #hose length\
$link .= "&".AttrVal($name,"replacement05Value","");; #short vehicle\
$link .= "&prod=".AttrVal($name,"replacement06Value","");; # product 8 = normal schwefelarm 4 = premium schwefelarm\
$link .= "&payment_type=".AttrVal($name,"replacement07Value","");; # 1 = Barzahlung, 2 = EC-Karte, 3 = Vorkasse, 4 = Lastschrift, 5 = Wärmekonto, 6 = Rechnung, 10 = Ratenkauf\
$link .= "&".AttrVal($name,"replacement08Value","");; #express;;\
$ret .= "&nbsp;;<a href=\"".$link."\" rel=\"noopener noreferrer\" target=\"_blank\" style=\"font-weight:bold;;\">";;\
$ret .= ReadingsVal($name,"Heizoelpreis","-");;\
$ret .= "&euro;;</a>/100l";;\
$ret .= "&nbsp;;(".AttrVal($name,"replacement02Value","0")."l = ";;\
$ret .= sprintf("%.2f",$price);;\
$ret .= "&euro;;)</div>";;\
return $ret;;\
}
attr DEVICE timeout 10
attr DEVICE webCmd reread
attr DEVICE room WHICHROOM
attr DEVICE model fuel_oil_check_esyoil
setreading DEVICE attrTemplateVersion 20210720
Titel: Antw:Abfrage Heizölpreis HTTPMOD
Beitrag von: yersinia am 20 Juli 2021, 11:19:14
Zitat von: docolli am 16 Juli 2021, 19:04:39Weitere Verbesserungen:

  • Ölsorte premiumecotherm ergänzt
  • Name der Ölsorte wird aus XML geholt, als Reading abgelegt und im state angezeigt
  • Link zu Heizöl24 enthält gewählte Ölsorte aus dem Attribut
  • Abrunden der abgefragten Ölmenge auf definierten Wert -> Attribut roundTo
  • Abfragezeit auf 86400s (24h) hochgesetzt
Danke! :)

Einiges davon halte ich für Template-Sinnvoll: Ölsorten einfügen und Auswählbar; Ölsorte als Reading (aber nicht anzeigen via stateFormat); Ölsorte aus Attribut als Teil des Links; kein Runden (mMn wenig Sinnvoll wenn man feste Bestellmengen angibt und nicht ein Reading der (dynamischen) Tankmenge aus einem anderen Device errechnet)

@amenomade: Teile von docolli habe ich in eine Template-Aktualisierung gegossen.
#Contributed by yersinia & enhanced by docolli, see https://forum.fhem.de/index.php/topic,107189.msg1166854.html#msg1166854
name:fuel_oil_check_heizoel24
filter:TYPE=HTTPMOD
desc: checks fuel oil prices via heizoel24.de<br />Define a HTTPMOD device like<br />https://www.heizoel24.de/DailyPriceXml.ashx?zipcode=%%PLZ%%&litre=%%MENGE%%&unloadingpoints=%%ENTLADESTELLEN%%&oilgrade=%%OELSORTE%% 3600<br />Maintain Attributes for ZIP (PLZ), order volume (Bestellmenge) and unloading points (Entladestellen) before senseful values can be retrieved.<br />Further information and documentation can be found in <a href="https://forum.fhem.de/index.php/topic,107189.msg1166854.html#msg1166854">this FHEM forum thread</a>
order:FUEL04
par:WHICHROOM;Actual room of the device, defaults to HTTPMOD; {AttrVal("DEVICE","room","HTTPMOD")}
par:INTERVAL;Actual interval for updating, defaults to hourly (3600s); {InternalVal("DEVICE","Interval","3600")}
par:ZIPCODE;German ZIP Code / deutsche Postleitzahl; {AttrVal("DEVICE","replacement01Value","12345")}
par:ORDERVOLUME;fuel order volume in litre / Bestellmenge in Liter; {AttrVal("DEVICE","replacement02Value","5000")}
defmod DEVICE HTTPMOD https://www.heizoel24.de/DailyPriceXml.ashx?zipcode=%%PLZ%%&litre=%%MENGE%%&unloadingpoints=%%ENTLADESTELLEN%%&oilgrade=%%OELSORTE%% INTERVAL
attr DEVICE userattr replacement03Value:1,2,3,4,5,6,7,8,9,10 replacement04Value:standard,super,premiumecotherm,bio
attr DEVICE enableControlSet 1
attr DEVICE reading010Name Heizoelpreis
attr DEVICE reading010OExpr $val =~ s/,/\./; $val;
attr DEVICE reading010Regex ([\d\,]+)<\/price
attr DEVICE reading020Name Heizoelsorte
attr DEVICE reading020OExpr $val =~ s/,/\./;; $val;;
attr DEVICE reading020Regex oilGrade="([^"]
attr DEVICE replacement01Mode text
attr DEVICE replacement01Regex %%PLZ%%
attr DEVICE replacement01Value ZIPCODE
attr DEVICE replacement02Mode text
attr DEVICE replacement02Regex %%MENGE%%
attr DEVICE replacement02Value ORDERVOLUME
attr DEVICE replacement03Mode text
attr DEVICE replacement03Regex %%ENTLADESTELLEN%%
attr DEVICE replacement03Value 1
attr DEVICE replacement04Mode text
attr DEVICE replacement04Regex %%OELSORTE%%
attr DEVICE replacement04Value standard
attr DEVICE stateFormat {       my $price = 0.0;\
my %oilgradecodes = ('standard', '1',\
'super', '2',\
'premiumecotherm', '3',\
'bio', '4');\
        $price = (AttrNum($name,"replacement02Value",0)*ReadingsNum($name,"Heizoelpreis",0))/100;\
        my $lastCheck = ReadingsTimestamp($name,"Heizoelpreis","");\
        my $ret = "<div style=\"text-align: left;;\">".$lastCheck.":";\
my $link = "https://www.heizoel24.de/heizoel/angebotsliste?";\
$link .= "zipCode=".AttrVal($name,"replacement01Value","");\
$link .= "&amount=".AttrVal($name,"replacement02Value","");\
$link .= "&stations=".AttrVal($name,"replacement03Value","");\
$link .= "&oilgrade=".AttrVal($name,"replacement04Value","");\
$link .= "&product=".$oilgradecodes{AttrVal($name,"replacement04Value","standard")};\
        $ret .= "&nbsp;<a href=\"".$link."\" rel=\"noopener noreferrer\" target=\"_blank\" style=\"font-weight:bold;;\">";\
        $ret .= ReadingsVal($name,"Heizoelpreis","-");\
        $ret .= "&euro;</a>/100l";\
        $ret .= "&nbsp;(".AttrVal($name,"replacement02Value","0")."l = ";\
        $ret .= sprintf("%.2f",$price);\
        $ret .= "&euro;)</div>";\
        return $ret;\
}
attr DEVICE timeout 10
attr DEVICE webCmd reread
attr DEVICE room WHICHROOM
attr DEVICE model fuel_oil_check_heizoel24_v2
setreading DEVICE attrTemplateVersion 20210720
Titel: Antw:Abfrage Heizölpreis HTTPMOD
Beitrag von: docolli am 02 September 2021, 14:10:37
Ich hatte Probleme mit der Abfrage bei Heizöl24 und bin jetzt drauf gekommen, dass es daran liegt, dass ich die Bedarfsmenge dynamisch aus meinem Tankinhaltssensor berechne und die Menge aktuell nur bei wenigen Litern liegt.

Die Mindestmenge liegt aber bei 500 Litern und geringere Menge erzeugen nur einen Fehlercode im XML

<result>
<error>LitreTooLow</error>
<errorMessage>Die Mindestabnahmemenge beträgt 500 Liter.</errorMessage>
</result>


Ich habe ein paar Werte nun so angepasst, dass die Mindestbestellmenge berücksichtigt wird

attr Heizoel_heizoel24 replacement02Value my $minvolume = 500;;\
if (ReadingsNum($name,"Tankmenge",0) > $minvolume) {ReadingsNum($name,"Tankmenge",0)} else {$minvolume};;\

attr Heizoel_heizoel24 stateFormat { my $price = 0.0;;\
my $volume = 500;;\
if (ReadingsNum($name,"Tankmenge",0) > $volume) {$volume = ReadingsNum($name,"Tankmenge",0)}\
my $index = 1;;\
my $oilgradecode;;\
my @oilgrade = ("standard","super","premiumecotherm","bio");;\
foreach my $i (@oilgrade){ if ($i eq AttrVal($name,"replacement04Value","")){ $oilgradecode=$index;; } $index++;; }\
$price = ReadingsNum($name,"Fuellkosten",0);;\
my $lastCheck = ReadingsTimestamp($name,"Heizoelpreis","");;\
my $ret = "<div style=\"text-align: left;;\">";;\
my $link = "https://www.heizoel24.de/heizoel/angebotsliste?";;\
$link .= "zipCode=".AttrVal($name,"replacement01Value","");;\
$link .= "&amount=".$volume;;\
$link .= "&stations=".AttrVal($name,"replacement03Value","");;\
$link .= "&product=".$oilgradecode;;\
$ret .= "&nbsp;;<a href=\"".$link."\" rel=\"noopener noreferrer\" target=\"_blank\" style=\"font-weight:bold;;\">";;\
$ret .= ReadingsVal($name,"Heizoelpreis","-");;\
$ret .= "&euro;;</a>/100l";;\
$ret .= "&nbsp;;(".$volume."l = ";;\
$ret .= sprintf("%.2f",$price);;\
$ret .= "&euro;;) ";;\
        $ret .= " / ".ReadingsVal($name,"Heizoelsorte","-");;\
        $ret .= " - ".$lastCheck."</div>";;\
return $ret;;\
}\




Titel: Antw:Abfrage Heizölpreis HTTPMOD
Beitrag von: daheim am 01 Dezember 2021, 13:34:00
Ich habe mal eine Frage: Funktioniert die Abfrage mit Check24 noch EsyOil ist ja in Rente und mag auch nicht mehr....

Bekomme es mit Check24 nicht ans Laufen?!
Titel: Antw:Abfrage Heizölpreis HTTPMOD
Beitrag von: yersinia am 01 Dezember 2021, 13:56:10
Zitat von: daheim am 01 Dezember 2021, 13:34:00Ich habe mal eine Frage: Funktioniert die Abfrage mit Check24 noch EsyOil ist ja in Rente und mag auch nicht mehr....
Ja, läuft hier mit check24.
Titel: Antw:Abfrage Heizölpreis HTTPMOD
Beitrag von: daheim am 01 Dezember 2021, 14:28:50
Danke für die Rückmeldung. Hatte eine ; zu viel
Titel: Antw:Abfrage Heizölpreis HTTPMOD
Beitrag von: Bartimaus am 02 Dezember 2021, 14:08:12
Zitat von: yersinia am 20 März 2020, 15:12:31
Wäre anstelle eines userReadings nicht ein (zusätzliches) userAttr für das Tankvolumen sinnvoller bzw. einfacher zu pflegen für den Endbenutzer?

Ich stelle mir das so vor:
attr Heizoelpreis userattr reading010Name reading010OExpr reading010Regex replacement01Mode:reading,internal,text,expression,key replacement01Regex replacement01Value replacement02Mode:reading,internal,text,expression,key replacement02Regex replacement02Value replacement03Mode:reading,internal,text,expression,key replacement03Regex replacement03Value replacement04Mode:reading,internal,text,expression,key replacement04Regex replacement04Value replacement05Mode:reading,internal,text,expression,key replacement05Regex replacement05Value Tankvolumen
attr Heizoelpreis replacement02Mode expression
attr Heizoelpreis replacement02Regex %%MENGE%%
attr Heizoelpreis replacement02Value ReadingsVal($name,"Tankmenge",0)
attr Heizoelpreis Tankvolumen 0
attr Heizoelpreis userReadings Tankmenge {AttrNum($name,"Tankvolumen",0)-ReadingsNum("CN.Blaubrenner","appTanklevel",0)}, Fuellkosten {ReadingsNum($name,"Tankmenge",0)/100*ReadingsNum($name,"Heizoelpreis",0)}

(Anstelle von xxVal würde ich für die Berechnungen xxNum verwenden - und $name anstelle des Devicenamens)

Man könnte noch weiter gehen und das Füllstands-Device und -Reading über zwei weitere User-Attribute definieren:
attr Heizoelpreis userattr reading010Name reading010OExpr reading010Regex replacement01Mode:reading,internal,text,expression,key replacement01Regex replacement01Value replacement02Mode:reading,internal,text,expression,key replacement02Regex replacement02Value replacement03Mode:reading,internal,text,expression,key replacement03Regex replacement03Value replacement04Mode:reading,internal,text,expression,key replacement04Regex replacement04Value replacement05Mode:reading,internal,text,expression,key replacement05Regex replacement05Value Tankvolumen FuellstandDevice FuellstandReading
attr Heizoelpreis replacement02Mode expression
attr Heizoelpreis replacement02Regex %%MENGE%%
attr Heizoelpreis replacement02Value ReadingsVal($name,"Tankmenge",0)
attr Heizoelpreis Tankvolumen 0
attr Heizoelpreis FuellstandDevice CN.Blaubrenner
attr Heizoelpreis FuellstandReading appTanklevel
attr Heizoelpreis userReadings Tankmenge {AttrNum($name,"Tankvolumen",0)-ReadingsNum(AttrVal($name,"FuellstandDevice","no device defined"),AttrVal($name,"FuellstandReading","no reading defined"),0)}, Fuellkosten {ReadingsNum($name,"Tankmenge",0)/100*ReadingsNum($name,"Heizoelpreis",0)}


(die Raw defines müssten sich nahtlos in die urprüngliche Definition (https://forum.fhem.de/index.php/topic,107189.msg1017754.html#msg1017754) einfügen, einfach die entsprechenden attr, sofern vorhanden, ersetzen)

Moin,

habe versucht, dies auf die neue Abfrage mit Check24 zu migrieren, aber wenn ich versuche den Tanklevel so abzufragen wie hier beschrieben, klappt es nicht, bzw. der aktuelle Preis wird nicht ermittelt. NUR wenn "replacement02Value" mit einem numerischen Wert eingetragen wird klappt die Abfrage. Ich habe dies jetzt vorübergehend so gelöst, das der Tanklevel extern ermittelt wird, und dann per DOIF täglich als numerischer Wert ins Feld eingetragen wird. Funktioniert, aber elegant ist anders. Hat vielleicht jemand nen Tip ?

Edith:
Habs hinbekommen, danke an @docolli
Titel: Antw:Abfrage Heizölpreis HTTPMOD
Beitrag von: yersinia am 02 Dezember 2021, 14:13:02
Zitat von: Bartimaus am 02 Dezember 2021, 14:08:12habe versucht, dies auf die neue Abfrage mit Check24 zu migrieren
Was heisst migrieren in diesem Kontext?

Zitat von: Bartimaus am 02 Dezember 2021, 14:08:12NUR wenn "replacement02Value" mit einem numerischen Wert eingetragen wird klappt die Abfrage. Ich habe dies jetzt vorübergehend so gelöst, das der Tanklevel extern ermittelt wird, und dann per DOIF täglich als numerischer Wert ins Feld eingetragen wird. Funktioniert, aber elegant ist anders. Hat vielleicht jemand nen Tip ?
userReading und/oder ReadingsNum?
Titel: Antw:Abfrage Heizölpreis HTTPMOD
Beitrag von: Bartimaus am 02 Dezember 2021, 14:37:05
@yersinia,

Danke für die schnelle Rückmeldung.

Mit der Migration meinte ich, meine bestehende (veraltete) Abfrage von Esyoil auf Check24 umzubauen.
Der Fehler lag im von mir falsch verwendeten "stateformat", aber dank dem Posting von Docolli der das gleiche Problem hatte, habe ich es nun gelöst.

Edith: Mist, funktioniert doch nicht, State wird zwar korrekt dargestellt, aber die Abfrage bei Check24 liefert dann doch kein Ergebnis
Titel: Antw:Abfrage Heizölpreis HTTPMOD
Beitrag von: Bartimaus am 02 Dezember 2021, 21:55:45
Sorry, muss doch nochmal fragen:

Wenn ich beim Attribut "replacement02Value" folgenden Wert eintrage: Heizoel_esyoil:Tankmenge
wird der Heizölpreis bei Check24 nicht automatisch abgefragt. Egal ob das zugehörige Attribut -> Mode auf: expression,text oder reading steht.

Das Userreading "Tankmenge" wird korrekt ermittelt. Aktuell 750.123985

Was mache ich hier falsch ?

Nutzt hier jemand Check24 in Verbindung mit einem Füllstandssensor im Tank ?

Edith: Wenn ich Check24-Heizöl manuell aufrufe, wird kein Wert der Bestellmenge mit Nachkommastellen akzeptiert. Wie bekomme ich die errechnete Tankmenge hin ohne Nachkommastellen ?  ::)
Titel: Antw:Abfrage Heizölpreis HTTPMOD
Beitrag von: yersinia am 03 Dezember 2021, 08:56:16
Zitat von: Bartimaus am 02 Dezember 2021, 21:55:45Was mache ich hier falsch ?
Drei posts ohne list oder raw definition des Devices. ::)

Zitat von: Bartimaus am 02 Dezember 2021, 21:55:45Edith: Wenn ich Check24-Heizöl manuell aufrufe, wird kein Wert der Bestellmenge mit Nachkommastellen akzeptiert. Wie bekomme ich die errechnete Tankmenge hin ohne Nachkommastellen ?  ::)
Du hast ein userReading? Dann würde ich replacement02Value mal
ReadingsNum($name,"Tankmenge",500,0);
setzen. (500 war die Mindestbestellmenge, oder)
ZitatReadingsNum(<devicename>,<reading>, <defaultvalue>,<round>)
Gibt die erste Zahl aus dem Readingswert zurück. Falls <round> spezifiziert ist, wird sie auf diese Anzahl von Dezimalstellen gerundet und ggf. mit 0 aufgefüllt, wenn <round> größer ist als die Anzahl der Dezimalstellen.
https://fhem.de/commandref_DE.html#perl (https://fhem.de/commandref_DE.html#perl)



Edith meint, du kannst im userReading Tankmenge auch schon runden mit
sprintf("%.0f",$deine_variable);
bevor du das reading mit einem Wert befüllst.

Im replacement02Value kannst du dann entweder
deinHTTPMODDevice:Tankmenge
oder
ReadingsNum($name,"Tankmenge",0);
versuchen.
Titel: Antw:Abfrage Heizölpreis HTTPMOD
Beitrag von: Bartimaus am 03 Dezember 2021, 09:55:23
Moin,

danke, ich habe es jetzt hinbekommen, indem ich mir im Device alle wichtigen Readings als Userreading speichere. Diese Werte habe ich entsprechend formatiert, so das ich jetzt jetzt nur mit ganzzahligen Werten operiere. Damit klappt jetzt auch die Abfrage bei Check24 incl. errechneter Bestellmenge resultierend aus meinem Tanklevel.

Hier mal die von mir verwendete Definition:

defmod Heizoel_esyoil HTTPMOD https://www.check24.de/heizoel/?c24_calculate=calculate&zipcode=%%PLZ%%&amount=%%MENGE%%&up=%%ENTLADESTELLEN%%&prod=%%OILGRADE%%&payment_type=%%PAYMENT%%&%%ANHANGER%%&%%SCHLAUCHLAENGE%%&%%EXPRESS%% 3600
attr Heizoel_esyoil enableControlSet 1
attr Heizoel_esyoil reading010Name Heizoelpreis
attr Heizoel_esyoil reading010OExpr $val =~ s/,/\./;; $val;;
attr Heizoel_esyoil reading010Regex ([\d\,]+)\&nbsp\;;\&euro\;;
attr Heizoel_esyoil replacement01Mode text
attr Heizoel_esyoil replacement01Regex %%PLZ%%
attr Heizoel_esyoil replacement01Value 06969
attr Heizoel_esyoil replacement02Mode reading
attr Heizoel_esyoil replacement02Regex %%MENGE%%
attr Heizoel_esyoil replacement02Value Heizoel_esyoil:Bestellmenge
attr Heizoel_esyoil replacement03Mode text
attr Heizoel_esyoil replacement03Regex %%ENTLADESTELLEN%%
attr Heizoel_esyoil replacement03Value 1
attr Heizoel_esyoil replacement04Mode text
attr Heizoel_esyoil replacement04Regex %%SCHLAUCHLAENGE%%
attr Heizoel_esyoil replacement04Value hose=
attr Heizoel_esyoil replacement05Mode text
attr Heizoel_esyoil replacement05Regex %%ANHAENGER%%
attr Heizoel_esyoil replacement05Value short_vehicle=
attr Heizoel_esyoil replacement06Mode text
attr Heizoel_esyoil replacement06Regex %%OILGRADE%%
attr Heizoel_esyoil replacement06Value 8
attr Heizoel_esyoil replacement07Mode text
attr Heizoel_esyoil replacement07Regex %%PAYMENT%%
attr Heizoel_esyoil replacement07Value 6
attr Heizoel_esyoil replacement08Mode text
attr Heizoel_esyoil replacement08Regex %%EXPRESS%%
attr Heizoel_esyoil replacement08Value express=
attr Heizoel_esyoil room Energie,HTTPMOD,Heizung
attr Heizoel_esyoil stateFormat {"<div style='color:green'>".ReadingsVal($name,"Heizoelpreis","-")."<div style='color:white'>"." Cent/Liter"."<br>"\
."max. Bestellmenge: "."<div style='color:green'>".int(ReadingsVal($name,"Bestellmenge","-"))." Liter"."</div>"\
."Tankkosten: "."<div style='color:green'>".int(ReadingsVal($name,"Fuellkosten","-"))." Euro"."</div>"}
attr Heizoel_esyoil timeout 10
attr Heizoel_esyoil userReadings Bestellmenge {ReadingsNum("Heizoel_esyoil","Tankvolumen",0)-ReadingsNum("Heizoel_esyoil","Fuellstand",0)},\
Fuellkosten {ReadingsVal("Heizoel_esyoil","Bestellmenge",0)/100*ReadingsVal("Heizoel_esyoil","Heizoelpreis",0)}, Fuellstand {sprintf("%.d", ReadingsNum("CN.Blaubrenner","appTanklevel",0))}
attr Heizoel_esyoil webCmd reread
setstate Heizoel_esyoil 2021-12-03 09:33:23 Tankvolumen 8400
Titel: Antw:Abfrage Heizölpreis HTTPMOD
Beitrag von: yersinia am 03 Dezember 2021, 10:02:55
Gut, wenn es klappt. Ich würde beim Rechnen mit Werten aber eher mit ReadingsNum anstelle von ReadingsVal arbeiten:
attr Heizoel_esyoil userReadings Bestellmenge {return (ReadingsNum($name,"Tankvolumen",0)-ReadingsNum($name,"Fuellstand",0));},\
Fuellkosten {return ((ReadingsNum($name,"Bestellmenge",0)/100)*ReadingsNum("Heizoel_esyoil","Heizoelpreis",0));}, Fuellstand {return sprintf("%.d", ReadingsNum("CN.Blaubrenner","appTanklevel",0));}


Weiterhin könntest du die replacmentValues noch optimieren, aber das ist nur nice-to-have:
attr Heizoel_esyoil userattr replacement03Value:1,2,3,4,5,6,7,8,9,10 replacement04Value:hose=,hose=hose_l,hose=hose_xl replacement05Value:short_vehicle=,short_vehicle=short_vehicle replacement06Value:8,4 replacement07Value:1,2,3,4,6 replacement08Value:express=,express=1
Titel: Antw:Abfrage Heizölpreis HTTPMOD
Beitrag von: Bartimaus am 03 Dezember 2021, 10:14:26
Danke, erledigt.

Kannst Du mit einfachen Worten kurz sagen, was das optimieren der replacementvalues bewirkt ?
Titel: Antw:Abfrage Heizölpreis HTTPMOD
Beitrag von: yersinia am 03 Dezember 2021, 10:19:32
Du bekommst ein drop-down-Auswahlmenü mit den validen Werten wenn du das Attribut anwählst. Wie gesagt, ist nice-to-have und der Mehrwert bei dir wahrscheinlich nicht gegeben. ;D
Titel: Antw:Abfrage Heizölpreis HTTPMOD
Beitrag von: sash.sc am 01 September 2022, 20:16:10
Hallo zusammen.

habe gesehen, dass man auch esyoil den Ölpreis abfragen kann.
Wie kann ich den mit httpmod rausfischen?

https://www.esyoil.com/oelpreis (https://www.esyoil.com/oelpreis)

Habe ein weing rumexperimentiert, jedoch nix wirksames dabei rum gekommen.

Internals:
   BUSY       0
   CFGFN     
   DEF        https://www.esyoil.com/oelpreis 600
   FUUID      6310e2e4-f33f-852e-ed1e-e74cc46347091eba
   Interval   600
   MainURL    https://www.esyoil.com/oelpreis
   ModuleVersion 4.1.12 - 19.4.2022
   NAME       rohoel
   NOTIFYDEV  global
   NR         141056
   NTFY_ORDER 50-rohoel
   STATE      Brentöl: 30€
   TYPE       HTTPMOD
   eventCount 32
   value     
   CompiledRegexes:
   HTTPCookieHash:
     PHPSESSID;/:
       Name       PHPSESSID
       Options    path=/; secure; httponly
       Path       /
       Value      57cqn3ie8spj8taoc0r67fm8rg
     csrf_https-contao_csrf_token;/:
       Name       csrf_https-contao_csrf_token
       Options    path=/; secure; httponly; samesite=lax
       Path       /
       Value      wAMT9xjz4SbGbnBuKMJyYT3pHdGFpKruz542tajRcUk
     heizoel24.nxt.session;:
       Name       heizoel24.nxt.session
       Options    Path=/; Secure; SameSite=Strict
       Path       
       Value      4bbe8037-ab6c-460a-9fcf-9cb2f161d440
   HttpUtils:
     NAME       
     addr       https://www.esyoil.com:443
     auth       0
     buf       
     code       200
     compress   1
     conn       
     data       
     displayurl https://www.esyoil.com/oelpreis
     header     Cookie: PHPSESSID=57cqn3ie8spj8taoc0r67fm8rg; csrf_https-contao_csrf_token=wAMT9xjz4SbGbnBuKMJyYT3pHdGFpKruz542tajRcUk; heizoel24.nxt.session=4bbe8037-ab6c-460a-9fcf-9cb2f161d440
     host       www.esyoil.com
     httpheader HTTP/1.1 200 OK
Server: openresty
Date: Thu, 01 Sep 2022 18:12:34 GMT
Content-Type: text/html; charset=utf-8
Content-Length: 417748
Connection: close
Vary: Accept-Encoding
ETag: "65fd4-0bbn+xHbRE4p2qebhOSBW35qQZo"
Vary: Accept-Encoding
X-Cache-Status: HIT
X-Page-Uses-Cache: STATIC
X-Request-Uri: /oelpreis
Accept-Ranges: bytes
     httpversion 1.0
     hu_blocking 0
     hu_filecount 1
     hu_port    443
     hu_portSfx
     ignoreredirects 1
     loglevel   4
     path       /oelpreis
     protocol   https
     redirects  0
     timeout    2
     url        https://www.esyoil.com/oelpreis
     sslargs:
   QUEUE:
   READINGS:
     2022-09-01 19:06:44   BRENT           30
     2022-09-01 18:52:10   attrTemplateVersion 20201129
   REQUEST:
     context    reading
     data       
     header     
     ignoreredirects 0
     num        unknown
     retryCount 0
     type       update
     url        https://www.esyoil.com/oelpreis
   defptr:
     readingBase:
       BRENT      reading
     readingNum:
       BRENT      01
     readingOutdated:
     requestReadings:
       update:
         BRENT      reading 01
Attributes:
   enableControlSet 1
   model      epson_printer_cartridge_status
   reading01Name BRENT
   reading01Regex Brent.*?='([\d]+)'
   room       HTTPMOD
   stateFormat Brentöl: BRENT€
   userattr   reading01Name reading02Name reading02Regex reading03Name reading03Regex reading04Name reading04Regex reading05Name reading05Regex reading06Name reading06Regex

Könnte mir da jemand unter die Arme greifen?!

Danke schnomal.
Titel: Antw:Abfrage Heizölpreis HTTPMOD
Beitrag von: TomLee am 01 September 2022, 20:58:46
Das dafür bereitgestellte Template (setter attrTemplate) hast du ausprobiert und klappt nicht ?
Titel: Antw:Abfrage Heizölpreis HTTPMOD
Beitrag von: sash.sc am 01 September 2022, 21:05:15
Ich möchte ja nicht Heizöl anfragen, sondern dad Rohöl.
Titel: Antw:Abfrage Heizölpreis HTTPMOD
Beitrag von: TomLee am 01 September 2022, 21:09:30
Ok, sry dafür, bin nur halb dabei und immer noch am essen.

Und am Template orientieren geht auch nicht ?
Titel: Antw:Abfrage Heizölpreis HTTPMOD
Beitrag von: sash.sc am 01 September 2022, 21:38:13
Die URL s sind verschieden
Titel: Antw:Abfrage Heizölpreis HTTPMOD
Beitrag von: TomLee am 01 September 2022, 22:09:37
Wenns net unbedingt esyoil sein muss:

defmod Brent HTTPMOD https://www.finanzen.net/rohstoffe/oelpreis/euro
attr Brent reading01Name Brent
attr Brent reading01Regex Brent:[\w\W\n]*?(\d+\,\d+)
Titel: Antw:Abfrage Heizölpreis HTTPMOD
Beitrag von: sash.sc am 02 September 2022, 21:55:46
Danke
Titel: Antw:Abfrage Heizölpreis HTTPMOD
Beitrag von: TomLee am 02 September 2022, 22:30:23
Zitat von: sash.sc am 02 September 2022, 21:55:46
Danke

... reich ich einfach mal so weiter. An die Person die mich erst auf das Verständnis des "Ausdruck", irgendwo hier in einem anderen Beitrag im Forum, gebracht hat.
Titel: Antw:Abfrage Heizölpreis HTTPMOD
Beitrag von: sash.sc am 12 September 2022, 20:24:53
@TomLee

Habe es jetzt mal umgesetzt. Läuft auch. Habe nur das Problem mit den komma. Influxdb klappt das wohl so nicht.
Kann man das komma durch einen Punkt ersetzen?

Gruß Sascha
Titel: Antw:Abfrage Heizölpreis HTTPMOD
Beitrag von: TomLee am 12 September 2022, 22:58:33
Für die Kommandozeile:

attr Brent reading01OExpr $val =~ s/\,/./g;; return $val;;
Titel: Antw:Abfrage Heizölpreis HTTPMOD
Beitrag von: Bartimaus am 03 Februar 2023, 16:45:17
Zitat von: TomLee am 01 September 2022, 22:09:37
Wenns net unbedingt esyoil sein muss:

defmod Brent HTTPMOD https://www.finanzen.net/rohstoffe/oelpreis/euro
attr Brent reading01Name Brent
attr Brent reading01Regex Brent:[\w\W\n]*?(\d+\,\d+)


Hi,

mit dieser Abfrage hat das bis Dezember 2022 noch funktioniert.
Da die Seite per se noch funktioniert, müsste wahrscheinlich das Regex angepasst werden....

Wärst Du bitte mal so nett das zu prüfen ? Ich steh mit Regex auf dem Kriegsfuss
Titel: Antw:Abfrage Heizölpreis HTTPMOD
Beitrag von: TomLee am 03 Februar 2023, 17:11:12
 ;D Lustig, als ob ich einen Plan von Regexp hätte..

Keine Ahnung wie der Quelltext vorher war, den Ausdruck würd ich mir jetzt selbst so anpassen:

defmod Brent HTTPMOD https://www.finanzen.net/rohstoffe/oelpreis/euro
attr Brent reading01Name Brent
attr Brent reading01Regex snapshot-value-fst-current-0[\w\W\n]*?(\d+\,\d+)


Der Ausdruck sollte eigentlich greifen es werden aber keine Readings geschrieben, darum hab ich mal auf verbose 5 gestellt und sehe das im Log:

2023.02.03 17:01:10 5: Brent: set called with reread
2023.02.03 17:01:10 4: Brent: GetUpdate called (reread)
2023.02.03 17:01:10 5: Brent: AddToQueue adds type update to URL https://www.finanzen.net/rohstoffe/oelpreis/euro, no data, no headers, retry 0, initial queue len: 0
2023.02.03 17:01:10 5: Brent: HandleSendQueue called from AddToSendQueue, qlen = 1
2023.02.03 17:01:10 4: Brent: HandleSendQueue sends update with timeout 2 to https://www.finanzen.net/rohstoffe/oelpreis/euro, No Data, No Header
2023.02.03 17:01:11 5: Brent: ReadCallback called from __ANON__
2023.02.03 17:01:11 4: Brent: Read callback: request type was update retry 0,
header: HTTP/1.0 403 Forbidden
Server: AkamaiGHost
Mime-Version: 1.0
Content-Type: text/html
Content-Length: 297
Expires: Fri, 03 Feb 2023 16:01:11 GMT
Date: Fri, 03 Feb 2023 16:01:11 GMT
Connection: close, body length 297
2023.02.03 17:01:11 5: Brent: Read callback: body
<HTML><HEAD>
<TITLE>Access Denied</TITLE>
</HEAD><BODY>
<H1>Access Denied</H1>

You don't have permission to access "http://www.finanzen.net/rohstoffe/oelpreis/euro" on this server.<P>
Reference #18.546656b8.1675440071.74c1ed22
</BODY>
</HTML>

2023.02.03 17:01:11 4: Brent: BodyDecode is not decoding the response body (charset not found, bodyDecode defaults to none)
2023.02.03 17:01:11 5: Brent: GetCookies is looking for Cookies
2023.02.03 17:01:11 5: Brent: ExtractSid called, context reading, num unknown
2023.02.03 17:01:11 4: Brent: checking for redirects, code=403, ignore=0
2023.02.03 17:01:11 4: Brent: no redirects to handle
2023.02.03 17:01:11 5: Brent: Read callback sets LAST_REQUEST to update
2023.02.03 17:01:11 5: Brent: CheckAuth decided no authentication required
2023.02.03 17:01:11 5: Brent: Read starts parsing response to update with defined readings: 01
2023.02.03 17:01:11 5: Brent: ExtractReading Brent with regex /(?^:snapshot-value-fst-current-0[\w\W\n]*?(\d+\,\d+))/...
2023.02.03 17:01:11 5: Brent: ExtractReading Brent did not match
2023.02.03 17:01:11 4: Brent: Read response to update didn't match any Reading
2023.02.03 17:01:11 5: Brent: HandleSendQueue called from ReadCallback, qlen = 0
2023.02.03 17:01:11 5: Brent: HandleSendQueue found no usable entry in queue


Ich hab keine Ahnung warum es zu diesem You don't have permission to access kommt.
Titel: Antw:Abfrage Heizölpreis HTTPMOD
Beitrag von: TomLee am 04 Februar 2023, 12:05:47
Da keiner was dazu bisher gesagt hat, hier eine Alternative den Wert bei ariva.de auszulesen.

defmod Brent HTTPMOD https://www.ariva.de/brent_crude_rohoel_ice_rolling-kurs 1200
attr Brent reading01Name Brent
attr Brent reading01OExpr $val =~ s/\,/./g;; return $val;;
attr Brent reading01Regex In.Euro</a>:.[\w\W\n]*?(\d+\,\d+)
Titel: Antw:Abfrage Heizölpreis HTTPMOD
Beitrag von: sash.sc am 04 Februar 2023, 12:38:54
Da fragst du aber den Rohöl Preis ab. Der dürfte sich zum Heizöl unterscheiden
Titel: Antw:Abfrage Heizölpreis HTTPMOD
Beitrag von: TomLee am 04 Februar 2023, 12:46:52
Ist zwar hier OT, aber nach dem Rohölpreis hat Bartimaus doch auch gefragt ?
Titel: Antw:Abfrage Heizölpreis HTTPMOD
Beitrag von: Bartimaus am 04 Februar 2023, 15:57:14
Erstmal Danke an @TomLee für den neuen Link/Regex !

@sash.sc ,

das ist korrekt, den Heizölpreis frage ich separat über Check24 ab...

Titel: Antw:Abfrage Heizölpreis HTTPMOD
Beitrag von: cotecmania am 04 März 2023, 10:31:14
Hallo,

gibt es ein aktuelles funktionierendes Template für Heizöl ?

Gruss
Joe
Titel: Antw:Abfrage Heizölpreis HTTPMOD
Beitrag von: TomLee am 04 März 2023, 12:06:22
Gerade mal getestet, fuel_oil_check_heizoel24_v2 funzt nach wie vor.
Titel: Antw:Abfrage Heizölpreis HTTPMOD
Beitrag von: cotecmania am 04 März 2023, 18:02:45
Hmmm, gerade getestet, nur PLZ angepasst :
2023.03.04 18:13:11 5: Heizoel_esyoil: set called with reread
2023.03.04 18:13:11 4: Heizoel_esyoil: GetUpdate called (reread)
2023.03.04 18:13:11 5: Heizoel_esyoil: AddToQueue adds type update to URL Heizoel_esyoil, no data, no headers, retry 0, initial queue len: 0
2023.03.04 18:13:11 5: Heizoel_esyoil: HandleSendQueue called from AddToSendQueue, qlen = 1
2023.03.04 18:13:11 5: Heizoel_esyoil: HandleSendQueue is using Cookie cs_code with path / and Value deleted (key cs_code;/, destination path is )
2023.03.04 18:13:11 5: Heizoel_esyoil: HandleSendQueue is using Cookie nrg_session with path / and Value a9c755421be386a8d3c8c113be3584c1 (key nrg_session;/, destination path is )
2023.03.04 18:13:11 5: Heizoel_esyoil: HandleSendQueue is using Cookie ppset with path / and Value deleted (key ppset;/, destination path is )
2023.03.04 18:13:11 5: Heizoel_esyoil: DoCookies is adding Cookie header: cs_code=deleted; nrg_session=a9c755421be386a8d3c8c113be3584c1; ppset=deleted
2023.03.04 18:13:11 4: Heizoel_esyoil: HandleSendQueue sends update with timeout 2 to Heizoel_esyoil, No Data,
header: Cookie: cs_code=deleted; nrg_session=a9c755421be386a8d3c8c113be3584c1; ppset=deleted
2023.03.04 18:13:11 5: Heizoel_esyoil: ReadCallback called from HttpUtils_NonblockingGet
2023.03.04 18:13:11 5: Heizoel_esyoil: Read callback Error LogLvl set to 3, regex
2023.03.04 18:13:11 3: Heizoel_esyoil: Read callback: Error: Heizoel_esyoil: malformed or unsupported URL
2023.03.04 18:13:11 4: Heizoel_esyoil: Read callback: request type was update retry 0, no headers, no body
2023.03.04 18:13:11 5: Heizoel_esyoil: Read callback: body empty
2023.03.04 18:13:11 4: Heizoel_esyoil: BodyDecode is not decoding the response body (charset not found, bodyDecode defaults to none)
2023.03.04 18:13:11 5: Heizoel_esyoil: GetCookies is looking for Cookies
2023.03.04 18:13:11 5: Heizoel_esyoil: ExtractSid called, context reading, num unknown
2023.03.04 18:13:11 4: Heizoel_esyoil: no header to look for redirects
2023.03.04 18:13:11 5: Heizoel_esyoil: Read callback sets LAST_REQUEST to update
2023.03.04 18:13:11 5: Heizoel_esyoil: CheckAuth decided no authentication required
2023.03.04 18:14:29 5: Heizoel_esyoil: set called with start



Internals:
   BUSY       0
   CFGFN     
   DEF        Heizoel_esyoil HTTPMOD https://www.check24.de/heizoel/?c24_calculate=calculate&zipcode=%%PLZ%%&amount=%%MENGE%%&up=%%ENTLADESTELLEN%%&prod=%%OILGRADE%%&payment_type=%%PAYMENT%%&%%ANHANGER%%&%%SCHLAUCHLAENGE%%&%%EXPRESS%% 3600
attr Heizoel_esyoil userattr replacement03Value:1,2,3,4,5,6,7,8,9,10 replacement04Value:hose=,hose=hose_l,hose=hose_xl replacement05Value:short_vehicle=,short_vehicle=short_vehicle replacement06Value:8,4 replacement07Value:1,2,3,4,6 replacement08Value:express=,express=1
attr Heizoel_esyoil enableControlSet 1
attr Heizoel_esyoil reading010Name Heizoelpreis
attr Heizoel_esyoil reading010OExpr $val =~ s/,/\./;; $val;;
attr Heizoel_esyoil reading010Regex ([\d\,]+)\&nbsp\;;\&euro\;;
attr Heizoel_esyoil replacement01Mode text
attr Heizoel_esyoil replacement01Regex %%PLZ%%
attr Heizoel_esyoil replacement01Value 73568
attr Heizoel_esyoil replacement02Mode text
attr Heizoel_esyoil replacement02Regex %%MENGE%%
attr Heizoel_esyoil replacement02Value 3000
attr Heizoel_esyoil replacement03Mode text
attr Heizoel_esyoil replacement03Regex %%ENTLADESTELLEN%%
attr Heizoel_esyoil replacement03Value 1
attr Heizoel_esyoil replacement04Mode text
attr Heizoel_esyoil replacement04Regex %%SCHLAUCHLAENGE%%
attr Heizoel_esyoil replacement04Value hose=
attr Heizoel_esyoil replacement05Mode text
attr Heizoel_esyoil replacement05Regex %%ANHAENGER%%
attr Heizoel_esyoil replacement05Value short_vehicle=
attr Heizoel_esyoil replacement06Mode text
attr Heizoel_esyoil replacement06Regex %%OILGRADE%%
attr Heizoel_esyoil replacement06Value 8
attr Heizoel_esyoil replacement07Mode text
attr Heizoel_esyoil replacement07Regex %%PAYMENT%%
attr Heizoel_esyoil replacement07Value 2
attr Heizoel_esyoil replacement08Mode text
attr Heizoel_esyoil replacement08Regex %%EXPRESS%%
attr Heizoel_esyoil replacement08Value express=
attr Heizoel_esyoil stateFormat { my $price = 0.0;;
$price = (AttrNum($name,"replacement02Value",0)*ReadingsNum($name,"Heizoelpreis",0))/100;;
#my $lastCheck = POSIX::strftime("%d.%m. %H:%M",localtime(time_str2num(ReadingsTimestamp($name,"Heizoelpreis","2000-01-01 00:00:00"))));;
#my $lastCheck = FmtDateTime(InternalVal($name,".LastUpdate",0));;
my $lastCheck = ReadingsTimestamp($name,"Heizoelpreis","");;
my $ret = "<div style=\"text-align: left;;\">".$lastCheck.":";;
my $link = "https://www.check24.de/heizoel/?c24_calculate=calculate";;
$link .= "&zipcode=".AttrVal($name,"replacement01Value","");;
$link .= "&amount=".AttrVal($name,"replacement02Value","");;
$link .= "&up=".AttrVal($name,"replacement03Value","");;
$link .= "&".AttrVal($name,"replacement04Value","");; #hose length
$link .= "&".AttrVal($name,"replacement05Value","");; #short vehicle
$link .= "&prod=".AttrVal($name,"replacement06Value","");; # product 8 = normal schwefelarm 4 = premium schwefelarm
$link .= "&payment_type=".AttrVal($name,"replacement07Value","");; # 1 = Barzahlung, 2 = EC-Karte, 3 = Vorkasse, 4 = Lastschrift, 5 = Wärmekonto, 6 = Rechnung, 10 = Ratenkauf
$link .= "&".AttrVal($name,"replacement08Value","");; #express;;
$ret .= "&nbsp;;<a href=\"".$link."\" rel=\"noopener noreferrer\" target=\"_blank\" style=\"font-weight:bold;;\">";;
$ret .= ReadingsVal($name,"Heizoelpreis","-");;
$ret .= "&euro;;</a>/100l";;
$ret .= "&nbsp;;(".AttrVal($name,"replacement02Value","0")."l = ";;
$ret .= sprintf("%.2f",$price);;
$ret .= "&euro;;)</div>";;
return $ret;;
}
attr Heizoel_esyoil timeout 10
attr Heizoel_esyoil webCmd reread
   FUUID      640377b2-f33f-623c-131e-9ab37823f0dbcc81
   Interval   0
   MainURL    Heizoel_esyoil
   ModuleVersion 4.1.15 - 17.12.2022
   NAME       Heizoel_esyoil
   NOTIFYDEV  global
   NR         3213
   NTFY_ORDER 50-Heizoel_esyoil
   STATE      ???
   TYPE       HTTPMOD
   eventCount 3
   value     
   HTTPCookieHash:
     cs_code;/:
       Name       cs_code
       Options    expires=Thu, 01-Jan-1970 00:00:01 GMT; Max-Age=0; path=/; domain=.check24.de; HttpOnly; SameSite=lax
       Path       /
       Value      deleted
     nrg_session;/:
       Name       nrg_session
       Options    path=/; domain=.check24.de; secure; HttpOnly
       Path       /
       Value      a9c755421be386a8d3c8c113be3584c1
     ppset;/:
       Name       ppset
       Options    expires=Thu, 01-Jan-1970 00:00:01 GMT; Max-Age=0; path=/; domain=.check24.de; SameSite=lax
       Path       /
       Value      deleted
   HttpUtils:
     data       
     displayurl Heizoel_esyoil
     header     Cookie: cs_code=deleted; nrg_session=a9c755421be386a8d3c8c113be3584c1; ppset=deleted
     httpversion 1.0
     hu_blocking 0
     ignoreredirects 1
     loglevel   4
     redirects  0
     timeout    2
     url        Heizoel_esyoil
     sslargs:
   QUEUE:
   READINGS:
   REQUEST:
     context    reading
     data       
     header     
     ignoreredirects 0
     num        unknown
     retryCount 0
     type       update
     url        Heizoel_esyoil
Attributes:
   room       Heizung
   userattr   
   verbose    5

Titel: Antw:Abfrage Heizölpreis HTTPMOD
Beitrag von: TomLee am 04 März 2023, 18:21:06
ZitatDEF        Heizoel_esyoil HTTPMOD https://www.check24.de/heizoel/?c24_calculate=calculate&zipcode=%%PLZ%%&amount=%%MENGE%%&up=%%ENTLADESTELLEN%%&prod=%%OILGRADE%%&payment_type=%%PAYMENT%%&%%ANHANGER%%&%%SCHLAUCHLAENGE%%&%%EXPRESS%% 3600

Das Heizoel_esyoil HTTPMOD hat da in der DEF nix zu suchen.
Titel: Antw:Abfrage Heizölpreis HTTPMOD
Beitrag von: cotecmania am 04 März 2023, 18:44:10
ok nochmals versucht, geht aber immer noch nicht.
Ich muss doch nur das Device anlegen und die PLZ anpassen ?

2023.03.04 18:40:49 5: Heizoel_esyoil: set called with reread
2023.03.04 18:40:49 4: Heizoel_esyoil: GetUpdate called (reread)
2023.03.04 18:40:49 5: Heizoel_esyoil: AddToQueue adds type update to URL HTTPMOD, no data, no headers, retry 0, initial queue len: 0
2023.03.04 18:40:49 5: Heizoel_esyoil: HandleSendQueue called from AddToSendQueue, qlen = 1
2023.03.04 18:40:49 5: Heizoel_esyoil: HandleSendQueue is using Cookie cs_code with path / and Value deleted (key cs_code;/, destination path is )
2023.03.04 18:40:49 5: Heizoel_esyoil: HandleSendQueue is using Cookie nrg_session with path / and Value 5dc3c05ead51a0c69c7b00d0130f5cf6 (key nrg_session;/, destination path is )
2023.03.04 18:40:49 5: Heizoel_esyoil: HandleSendQueue is using Cookie ppset with path / and Value deleted (key ppset;/, destination path is )
2023.03.04 18:40:49 5: Heizoel_esyoil: DoCookies is adding Cookie header: cs_code=deleted; nrg_session=5dc3c05ead51a0c69c7b00d0130f5cf6; ppset=deleted
2023.03.04 18:40:49 4: Heizoel_esyoil: HandleSendQueue sends update with timeout 2 to HTTPMOD, No Data,
header: Cookie: cs_code=deleted; nrg_session=5dc3c05ead51a0c69c7b00d0130f5cf6; ppset=deleted
2023.03.04 18:40:49 5: Heizoel_esyoil: ReadCallback called from HttpUtils_NonblockingGet
2023.03.04 18:40:49 5: Heizoel_esyoil: Read callback Error LogLvl set to 3, regex
2023.03.04 18:40:49 3: Heizoel_esyoil: Read callback: Error: HTTPMOD: malformed or unsupported URL
2023.03.04 18:40:49 4: Heizoel_esyoil: Read callback: request type was update retry 0, no headers, no body
2023.03.04 18:40:49 5: Heizoel_esyoil: Read callback: body empty
2023.03.04 18:40:49 4: Heizoel_esyoil: BodyDecode is not decoding the response body (charset not found, bodyDecode defaults to none)
2023.03.04 18:40:49 5: Heizoel_esyoil: GetCookies is looking for Cookies
2023.03.04 18:40:49 5: Heizoel_esyoil: ExtractSid called, context reading, num unknown
2023.03.04 18:40:49 4: Heizoel_esyoil: no header to look for redirects
2023.03.04 18:40:49 5: Heizoel_esyoil: Read callback sets LAST_REQUEST to update
2023.03.04 18:40:49 5: Heizoel_esyoil: CheckAuth decided no authentication required


Internals:
   BUSY       0
   CFGFN     
   DEF        HTTPMOD https://www.check24.de/heizoel/?c24_calculate=calculate&zipcode=%%PLZ%%&amount=%%MENGE%%&up=%%ENTLADESTELLEN%%&prod=%%OILGRADE%%&payment_type=%%PAYMENT%%&%%ANHANGER%%&%%SCHLAUCHLAENGE%%&%%EXPRESS%% 3600
attr Heizoel_esyoil userattr replacement03Value:1,2,3,4,5,6,7,8,9,10 replacement04Value:hose=,hose=hose_l,hose=hose_xl replacement05Value:short_vehicle=,short_vehicle=short_vehicle replacement06Value:8,4 replacement07Value:1,2,3,4,6 replacement08Value:express=,express=1
attr Heizoel_esyoil enableControlSet 1
attr Heizoel_esyoil reading010Name Heizoelpreis
attr Heizoel_esyoil reading010OExpr $val =~ s/,/\./;; $val;;
attr Heizoel_esyoil reading010Regex ([\d\,]+)\&nbsp\;;\&euro\;;
attr Heizoel_esyoil replacement01Mode text
attr Heizoel_esyoil replacement01Regex %%PLZ%%
attr Heizoel_esyoil replacement01Value 73568
attr Heizoel_esyoil replacement02Mode text
attr Heizoel_esyoil replacement02Regex %%MENGE%%
attr Heizoel_esyoil replacement02Value 5000
attr Heizoel_esyoil replacement03Mode text
attr Heizoel_esyoil replacement03Regex %%ENTLADESTELLEN%%
attr Heizoel_esyoil replacement03Value 1
attr Heizoel_esyoil replacement04Mode text
attr Heizoel_esyoil replacement04Regex %%SCHLAUCHLAENGE%%
attr Heizoel_esyoil replacement04Value hose=
attr Heizoel_esyoil replacement05Mode text
attr Heizoel_esyoil replacement05Regex %%ANHAENGER%%
attr Heizoel_esyoil replacement05Value short_vehicle=
attr Heizoel_esyoil replacement06Mode text
attr Heizoel_esyoil replacement06Regex %%OILGRADE%%
attr Heizoel_esyoil replacement06Value 8
attr Heizoel_esyoil replacement07Mode text
attr Heizoel_esyoil replacement07Regex %%PAYMENT%%
attr Heizoel_esyoil replacement07Value 2
attr Heizoel_esyoil replacement08Mode text
attr Heizoel_esyoil replacement08Regex %%EXPRESS%%
attr Heizoel_esyoil replacement08Value express=
attr Heizoel_esyoil stateFormat { my $price = 0.0;;
$price = (AttrNum($name,"replacement02Value",0)*ReadingsNum($name,"Heizoelpreis",0))/100;;
#my $lastCheck = POSIX::strftime("%d.%m. %H:%M",localtime(time_str2num(ReadingsTimestamp($name,"Heizoelpreis","2000-01-01 00:00:00"))));;
#my $lastCheck = FmtDateTime(InternalVal($name,".LastUpdate",0));;
my $lastCheck = ReadingsTimestamp($name,"Heizoelpreis","");;
my $ret = "<div style=\"text-align: left;;\">".$lastCheck.":";;
my $link = "https://www.check24.de/heizoel/?c24_calculate=calculate";;
$link .= "&zipcode=".AttrVal($name,"replacement01Value","");;
$link .= "&amount=".AttrVal($name,"replacement02Value","");;
$link .= "&up=".AttrVal($name,"replacement03Value","");;
$link .= "&".AttrVal($name,"replacement04Value","");; #hose length
$link .= "&".AttrVal($name,"replacement05Value","");; #short vehicle
$link .= "&prod=".AttrVal($name,"replacement06Value","");; # product 8 = normal schwefelarm 4 = premium schwefelarm
$link .= "&payment_type=".AttrVal($name,"replacement07Value","");; # 1 = Barzahlung, 2 = EC-Karte, 3 = Vorkasse, 4 = Lastschrift, 5 = Wärmekonto, 6 = Rechnung, 10 = Ratenkauf
$link .= "&".AttrVal($name,"replacement08Value","");; #express;;
$ret .= "&nbsp;;<a href=\"".$link."\" rel=\"noopener noreferrer\" target=\"_blank\" style=\"font-weight:bold;;\">";;
$ret .= ReadingsVal($name,"Heizoelpreis","-");;
$ret .= "&euro;;</a>/100l";;
$ret .= "&nbsp;;(".AttrVal($name,"replacement02Value","0")."l = ";;
$ret .= sprintf("%.2f",$price);;
$ret .= "&euro;;)</div>";;
return $ret;;
}
attr Heizoel_esyoil timeout 10
attr Heizoel_esyoil webCmd reread
   FUUID      64038208-f33f-623c-8e79-e6e8826992b34840
   Interval   0
   MainURL    HTTPMOD
   ModuleVersion 4.1.15 - 17.12.2022
   NAME       Heizoel_esyoil
   NOTIFYDEV  global
   NR         3443
   NTFY_ORDER 50-Heizoel_esyoil
   STATE      ???
   TYPE       HTTPMOD
   eventCount 3
   value     
   HTTPCookieHash:
     cs_code;/:
       Name       cs_code
       Options    expires=Thu, 01-Jan-1970 00:00:01 GMT; Max-Age=0; path=/; domain=.check24.de; HttpOnly; SameSite=lax
       Path       /
       Value      deleted
     nrg_session;/:
       Name       nrg_session
       Options    path=/; domain=.check24.de; secure; HttpOnly
       Path       /
       Value      5dc3c05ead51a0c69c7b00d0130f5cf6
     ppset;/:
       Name       ppset
       Options    expires=Thu, 01-Jan-1970 00:00:01 GMT; Max-Age=0; path=/; domain=.check24.de; SameSite=lax
       Path       /
       Value      deleted
   HttpUtils:
     data       
     displayurl HTTPMOD
     header     Cookie: cs_code=deleted; nrg_session=5dc3c05ead51a0c69c7b00d0130f5cf6; ppset=deleted
     httpversion 1.0
     hu_blocking 0
     ignoreredirects 1
     loglevel   4
     redirects  0
     timeout    2
     url        HTTPMOD
     sslargs:
   QUEUE:
   READINGS:
   REQUEST:
     context    reading
     data       
     header     
     ignoreredirects 0
     num        unknown
     retryCount 0
     type       update
     url        HTTPMOD
Attributes:
   verbose    5
Titel: Antw:Abfrage Heizölpreis HTTPMOD
Beitrag von: TomLee am 04 März 2023, 19:05:41
Zitatund die PLZ anpassen ?

Habs mir nicht nochmal angeschaut, wie auch das Template aufgebaut ist, zusätzlich zur PLZ wurde bei mir die Menge mit abgefragt in dem Dialogfenster das erscheint wenn man das Template anwendet.

Zum weiteren Problem, nochmal, hilft der Link https://wiki.fhem.de/wiki/Erste_Schritte_in_FHEM#Device_anlegen_-_define ?

oder einmal ums Quadrat laufen ?