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 ?

Titel: Aw: Abfrage Heizölpreis HTTPMOD
Beitrag von: Bartimaus am 10 Dezember 2025, 17:22:40
Moin,

muss das Thema nochmal hochholen. Leider bietet Check24 keine Heizölabfrage mehr an.
Hat jemand Alternativvorschläge ?

LG
Titel: Aw: Abfrage Heizölpreis HTTPMOD
Beitrag von: Wzut am 13 Dezember 2025, 09:02:41
Heizölpreis gibt es inzwischen als Template von HTTPMOD und nutzt IMHO https://www.heizoel24.de/DailyPriceXml.ashx als Quelle
Titel: Aw: Abfrage Heizölpreis HTTPMOD
Beitrag von: Bartimaus am 13 Dezember 2025, 09:58:59
Danke, das habe ich auch bereits umgestellt.

Leider gibt es ein kleines "Aber"....

im
replacement02Regex. %%MENGE%%
replacement02Value. CN.Blaubrenner:Bestellmenge

habe ich bislang die Bestellmenge nicht als absolute Zahl erfasst, sondern mir den Wert als das Reading aus einem anderen Device (Hourcounter) geholt wo ich zuverlässig die Bestellmenge errechne. Das hat bislang auch prächtig funktioniert, und auch die Bestellmenge wird derzeit dort korrekt errechnet.

Alternativ habe ich hier im Device ein Userreading eingerichtet wo ich das Reading zur Bestellmenge mir einfach aus dem anderen Device hole. Auch ohne Erfolg. Kaum trage ich hier allerdings eine Absolute Zahl ein, wird der aktuelle Heizölpreis errechnet

Das es funktionieren soll, ist ja auch hier beschrieben:

replacement[0-9]*Value
Defines the replacement. If the corresponding replacementMode is text, then value is a static text that is used as the replacement.
If replacementMode is reading then Value can be the name of a reading of this device or it can be a reading of a different device referred to by devicename:reading.
If replacementMode is internal the Value can be the name of an internal of this device or it can be an internal of a different device referred to by devicename:internal.
If replacementMode is expression the the Value is treated as a Perl expression that computes the replacement value. The expression can use $1, $2 and so on to refer to capture groups of the corresponding regex that is matched against the original URL, header or post data.
If replacementMode is key then the module will use a value from a key / value pair that is stored in an obfuscated form in the file system with the set storeKeyValue command. This might be useful for storing passwords.

Nur wie gesagt, funktioniert es derzeit nicht mehr.
Was mache ich hier falsch ?
Titel: Aw: Abfrage Heizölpreis HTTPMOD
Beitrag von: TomLee am 13 Dezember 2025, 11:43:36
Zitat von: Bartimaus am 13 Dezember 2025, 09:58:59Was mache ich hier falsch ?

Nach der Umstellung auf "replacementMode reading" weiterhin in stateFormat mit dem Attributwert zu rechnen. Da steht ja jetzt kein numerischer Wert mehr drin.

Lösung: stateFormat anpassen und mit dem Wert aus dem Hourcounter-Device rechnen.

Gruß Thomas
Titel: Aw: Abfrage Heizölpreis HTTPMOD
Beitrag von: Bartimaus am 13 Dezember 2025, 22:14:41
Danke,

aber das ist ad hoc zu hoch für mich.
Im Stateformat zu replacementvalue02 steht aktuell attrVal($name....) das ersetzen durch das entsprechende Reading ?
Titel: Aw: Abfrage Heizölpreis HTTPMOD
Beitrag von: TomLee am 13 Dezember 2025, 22:53:32
Ich denke nicht, dass es zu anspruchsvoll ist, sondern eher, dass die Umsetzung deines Gedanken bislang keine Priorität hatte.
Titel: Aw: Abfrage Heizölpreis HTTPMOD
Beitrag von: Bartimaus am 14 Dezember 2025, 13:04:50
Das hilft mir nicht weiter
Titel: Aw: Abfrage Heizölpreis HTTPMOD
Beitrag von: TomLee am 14 Dezember 2025, 13:37:52
Zitat{    my $price = 0.0;
    $price = (AttrNum($name,"replacement02Value",0)*ReadingsNum($name,"Heizoelpreis",0))/100; # hier rechn
    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;
}

In den rot markierten AttrVal()-Abfragen steht nach deiner Änderung CN.Blaubrenner:Bestellmenge.
Die musst ersetzen, durch ReadingsNum()-Abfragen der Bestellmenge in dem HourCounter-Device.
Titel: Aw: Abfrage Heizölpreis HTTPMOD
Beitrag von: Bartimaus am 14 Dezember 2025, 15:25:17
Ich danke Dir.

Leider funktioniert es noch nicht.

Hier mal ein List des Devices

Internals:
   BUSY       0
   CFGFN     
   DEF        https://www.heizoel24.de/DailyPriceXml.ashx?zipcode=%%PLZ%%&litre=%%MENGE%%&unloadingpoints=%%ENTLADESTELLEN%%&oilgrade=standard 43200
   FUUID      693af639-f33f-7539-f121-98c0e83bffc3ec0b
   Interval   43200
   MainURL    https://www.heizoel24.de/DailyPriceXml.ashx?zipcode=%%PLZ%%&litre=%%MENGE%%&unloadingpoints=%%ENTLADESTELLEN%%&oilgrade=standard
   ModuleVersion 4.2.0 - 11.8.2023
   NAME       Heizoelpreis
   NOTIFYDEV  global
   NR         39797
   NTFY_ORDER 50-Heizoelpreis
   STATE      <div style="text-align: left;;">:&nbsp;<a href="https://www.heizoel24.de/heizoel/angebotsliste?zipCode=40477&amount=CN.Blaubrenner:Bestellmenge&stations=1&product=1" rel="noopener noreferrer" target="_blank" style="font-weight:bold;;">-&euro;</a>/100l&nbsp;(CN.Blaubrenner:Bestellmengel = 0.00&euro;)</div>
   TYPE       HTTPMOD
   eventCount 30
   value     
   CompiledRegexes:
   HttpUtils:
     NAME       
     addr       https://www.heizoel24.de:443
     auth       0
     buf       
     code       400
     compress   1
     conn       
     data       
     displayurl https://www.heizoel24.de/DailyPriceXml.ashx?zipcode=40477&litre=CN.Blaubrenner:Bestellmenge&unloadingpoints=1&oilgrade=standard
     header     
     host       www.heizoel24.de
     httpheader HTTP/1.1 400 Bad Request
Cache-Control: no-store, no-cache, must-revalidate, private
Pragma: no-cache
Content-Type: application/xml
Content-Encoding: gzip
Vary: Accept-Encoding
Strict-Transport-Security: max-age=31536000; includeSubDomains; preload
X-Powered-By:
X-Powered-By:
X-Content-Type-Options: nosniff
Date: Sun, 14 Dec 2025 14:35:16 GMT
Connection: close
Content-Length: 192
     httpversion 1.0
     hu_blocking 0
     hu_filecount 1
     hu_port    443
     hu_portSfx
     ignoreredirects 1
     loglevel   4
     path       /DailyPriceXml.ashx?zipcode=40477&litre=CN.Blaubrenner:Bestellmenge&unloadingpoints=1&oilgrade=standard
     protocol   https
     redirects  0
     timeout    10
     url        https://www.heizoel24.de/DailyPriceXml.ashx?zipcode=40477&litre=CN.Blaubrenner:Bestellmenge&unloadingpoints=1&oilgrade=standard
     sslargs:
   OLDREADINGS:
   QUEUE:
   READINGS:
     2025-12-14 15:35:17   Bestellmenge    26
     2025-12-14 15:35:17   Fuellkosten     0.00
     2025-12-14 15:35:17   Fuellstand      8174.00
     2025-12-13 13:19:17   Tankvolumen     8200
     2025-12-11 17:51:24   attrTemplateVersion 20210626
   REQUEST:
     context    reading
     data       
     header     
     ignoreredirects 0
     num        unknown
     retryCount 0
     type       update
     url        https://www.heizoel24.de/DailyPriceXml.ashx?zipcode=%%PLZ%%&litre=%%MENGE%%&unloadingpoints=%%ENTLADESTELLEN%%&oilgrade=standard
Attributes:
   enableControlSet 1
   model      fuel_oil_check_heizoel24_v2
   reading010Name Heizoelpreis
   reading010OExpr $val =~ s/,/\./; $val;
   reading010Regex ([\d\,]+)<\/price
   replacement01Mode text
   replacement01Regex %%PLZ%%
   replacement01Value 40477
   replacement02Mode text
   replacement02Regex %%MENGE%%
   replacement02Value CN.Blaubrenner:Bestellmenge
   replacement03Mode text
   replacement03Regex %%ENTLADESTELLEN%%
   replacement03Value 1
   room       HTTPMOD,Heizung
   stateFormat {   my $price = 0.0;
    $price = ("CN.Blaubrenner:Bestellmenge"*ReadingsNum($name,"Heizoelpreis",0))/100; # hier rechn
    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="."CN.Blaubrenner:Bestellmenge";
        $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;("."CN.Blaubrenner:Bestellmenge"."l = ";
    $ret .= sprintf("%.2f",$price);
    $ret .= "&euro;)</div>";
    return $ret;
}
   timeout    10
   userReadings Bestellmenge {ReadingsNum("Heizoelpreis","Tankvolumen",0)-ReadingsNum("CN.Blaubrenner","appTanklevel",0)},
Fuellkosten {sprintf("%.2f",ReadingsNum("Heizoelpreis","Bestellmenge",0)/100*ReadingsNum("Heizoelpreis","Heizoelpreis",0))},
Fuellstand {sprintf("%.2f", ReadingsNum("CN.Blaubrenner","appTanklevel",0))}
   userattr   replacement03Value:1,2,3,4,5,6,7,8,9,10
   webCmd     reread

Ein reread funktioniert noch nicht. Im Logfile wird noch bemängelt das ein kein numerischer Wert zum berechnen ist.
Titel: Aw: Abfrage Heizölpreis HTTPMOD
Beitrag von: TomLee am 14 Dezember 2025, 15:52:38
Oje...

Hier (https://wiki.fhem.de/wiki/DevelopmentModuleAPI#ReadingsNum) ist die Syntax von ReadingsNum() beschrieben.

In deinem Fall dann:
ReadingsNum("CN.Blaubrenner","Bestellmenge,0)
Titel: Aw: Abfrage Heizölpreis HTTPMOD
Beitrag von: Bartimaus am 14 Dezember 2025, 18:01:42
Ich habe mir mal erlaubt, mir die Abfrage in "stateFormat" durch ChatGPT erläutern zu lassen....

Dann hat mir ChatGPT angeboten, die Abfrage etwas umzustrukturieren. Das Ergebnis sieht so aus. Ist für mich als NichtInformatiker "leichter" zu lesen. Was hältst Du davon ?

{
  my $menge = ReadingsNum("CN.Blaubrenner","Bestellmenge",0);
  my $preis = ReadingsNum($name,"Heizoelpreis",0);
  my $zeit  = ReadingsTimestamp($name,"Heizoelpreis","");

  return '<span style="color:gray;">kein Preis</span>'
    if !$menge || !$preis;

  my $gesamt = sprintf("%.2f", ($menge * $preis) / 100);

  my $link = "https://www.heizoel24.de/heizoel/angebotsliste?"
           . "zipCode="  . AttrVal($name,"replacement01Value","")
           . "&amount="  . $menge
           . "&stations=". AttrVal($name,"replacement03Value","")
           . "&product=1";

  return
    qq(<span>$zeit: <a href="$link" target="_blank" rel="noopener noreferrer"><b>$preis&nbsp;&euro;</b></a>/100l ($menge&nbsp;l = $gesamt&nbsp;&euro;)</span>);
}

Aktuell wird mir aber kein Preis geliefert, weil die Tankmenge momentan unter dem Bestellminimum liegt, und/oder ich zu oft die Werte abgefragt habe
Titel: Aw: Abfrage Heizölpreis HTTPMOD
Beitrag von: TomLee am 14 Dezember 2025, 21:22:45
Handarbeit, mit etwas FHEM-Erfahrung:

{
    my $oilprice = ReadingsNum($name,'Heizoelpreis',0);
    my $lastcheck = ReadingsTimestamp($name,'Heizoelpreis','');
    my $zip = AttrNum($name,'replacement01Value',0);
    my $amount = AttrNum($name,'replacement02Value',0);
    my $stations = AttrNum($name,'replacement03Value',0);
    my $price = $amount*$oilprice/100;

    my $link = qq(https://www.heizoel24.de/heizoel/angebotsliste?zipCode=$zip&amp;amount=$amount&amp;stations=$stations&amp;product=1);
   
    return sprintf(
    q(<div style="text-align: left;">%s: <a href="%s" rel="noopener noreferrer" target="_blank" style="font-weight:bold">%.2f€</a>/100l (%sL = %.2f€)</div>),$lastcheck,$link,$oilprice,$amount,$price);
}
Titel: Aw: Abfrage Heizölpreis HTTPMOD
Beitrag von: Bartimaus am 14 Dezember 2025, 23:17:10
Deins habe ich mal getestet.... wenn ich auf den Link im State klicke, werde ich ordnungsgemäß zu Heizoel24 weitergeleitet, und bekomme einen Preis mit meinen Eingabeparametern, wird aber im State/Readings nicht angezeigt, stattdessen 0,0€.

Titel: Aw: Abfrage Heizölpreis HTTPMOD
Beitrag von: Bartimaus am 15 Dezember 2025, 08:56:04
Sorry, aber bei mir wird nur ein Heizölpreis abgefragt, wenn ich im im replacement02Value einen festen numerischen Wert eintrage. Mit einem Reading funktioniert es nicht.

Im State sehe ich dann einen Preis und Bestellmenge, aber die Bestellmenge ist die dynamische aus dem eingetragenen Reading in der Definition des Stateformats. Klicke ich auf den Link, werde ich zu Heizöl24 weitergeleitet, mit der korrekten Bestellmenge.



Titel: Aw: Abfrage Heizölpreis HTTPMOD
Beitrag von: TomLee am 15 Dezember 2025, 09:33:29
Mein gezeigtes Kunsthandwerk ersetzt 1:1 das stateFormat aus dem Template.

Das musst natürlich auch anpassen.

Titel: Aw: Abfrage Heizölpreis HTTPMOD
Beitrag von: Bartimaus am 15 Dezember 2025, 10:53:38
Wie ich schrieb.... StateFormat ist nicht das Problem....

Titel: Aw: Abfrage Heizölpreis HTTPMOD
Beitrag von: yersinia am 15 Dezember 2025, 15:18:44
Ruf mal den generierten Link auf
https://www.heizoel24.de/DailyPriceXml.ashx?zipcode=40477&litre=4000&unloadingpoints=1&oilgrade=standardWenn du mehr als drei Anfragen innerhalb von drei Stunden machst, bekommst du
Zitat"Sie haben in den letzten 180 Minuten mehr als 3 Mal die Preise abgefragt. Bitte versuchen Sie es später erneut."
als Rückmeldung.
Ich würde das Abfrageintervall testhalber reduzieren erhöhen.
Titel: Aw: Abfrage Heizölpreis HTTPMOD
Beitrag von: Bartimaus am 15 Dezember 2025, 17:21:02
Zitat von: yersinia am 15 Dezember 2025, 15:18:44Ruf mal den generierten Link auf
https://www.heizoel24.de/DailyPriceXml.ashx?zipcode=40477&litre=4000&unloadingpoints=1&oilgrade=standardWenn du mehr als drei Anfragen innerhalb von drei Stunden machst, bekommst du
Zitat"Sie haben in den letzten 180 Minuten mehr als 3 Mal die Preise abgefragt. Bitte versuchen Sie es später erneut."
als Rückmeldung.
Ich würde das Abfrageintervall testhalber reduzieren.

Danke.... ich bekomme ja einen Preis..... aber NUR wenn ich im replacement02Value einen Wert von z.B. 3000 eintrage.
Trage ich dort (wie in der Hilfe beschrieben)

CN.Blaubrenner:Bestellmenge

oder

ReadingsNum("CN.Blaubrenner","Bestellmenge",0)

ein, bekomme ich KEINEN Preis. Man sieht das, da das Reading -> "Heizölpreis" nicht aktualisiert wird.

Stateformat läuft bei mir korrekt, und über den Implementierten Link bekomme ich einen Preis.

Über Deinen Link bekomme ich:

404771982,8784,3087,35

Hier das List meines Devices:

Internals:
   BUSY       0
   DEF        https://www.heizoel24.de/DailyPriceXml.ashx?zipcode=%%PLZ%%&litre=%%MENGE%%&unloadingpoints=%%ENTLADESTELLEN%%&oilgrade=standard 86400
   FUUID      61a9d2dd-f33f-7539-3212-2d5e4617f66ee9b6
   Interval   86400
   MainURL    https://www.heizoel24.de/DailyPriceXml.ashx?zipcode=%%PLZ%%&litre=%%MENGE%%&unloadingpoints=%%ENTLADESTELLEN%%&oilgrade=standard
   ModuleVersion 4.2.0 - 11.8.2023
   NAME       Heizoel_esyoil
   NOTIFYDEV  global
   NR         1147
   NTFY_ORDER 50-Heizoel_esyoil
   STATE     
    <span>
      2025-12-15 07:54:40:
      <a href="https://www.heizoel24.de/heizoel/angebotsliste?zipCode=40477&amount=1000&stations=1&product=1" target="_blank" rel="noopener noreferrer">
        <b>85.88&nbsp;&euro;</b>
      </a>/100l
      (1000&nbsp;l = 858.80&nbsp;&euro;)
    </span>
 
   TYPE       HTTPMOD
   eventCount 185
   value     
   CompiledRegexes:
   HTTPCookieHash:
     c24_splash_BlackFriday;/:
       Name       c24_splash_BlackFriday
       Options    expires=Fri, 28 Nov 2025 05:54:40 GMT; Max-Age=10800; path=/; domain=.check24.de; SameSite=lax
       Path       /
       Value      1_2_11_12
     c24_splash_energy;/:
       Name       c24_splash_energy
       Options    expires=Fri, 28 Nov 2025 05:54:40 GMT; Max-Age=10800; path=/; domain=.check24.de; SameSite=lax
       Path       /
       Value      1
     cs_code_checked;/:
       Name       cs_code_checked
       Options    expires=Thu, 01 Jan 1970 00:00:01 GMT; Max-Age=0; path=/; domain=.check24.de; HttpOnly; SameSite=lax
       Path       /
       Value      deleted
     deviceoutput;/:
       Name       deviceoutput
       Options    expires=Thu, 27 Nov 2025 20:54:43 GMT; Max-Age=21600; path=/; domain=.check24.de; SameSite=lax
       Path       /
       Value      desktop
     devicetype;/:
       Name       devicetype
       Options    expires=Thu, 04 Dec 2025 14:54:43 GMT; Max-Age=604800; path=/; domain=.check24.de; SameSite=lax
       Path       /
       Value      desktop
     emodSession;/:
       Name       emodSession
       Options    path=/; domain=.check24.de; secure; HttpOnly; SameSite=lax
       Path       /
       Value      35b6f461753e1df203f90e1932180bc6
     energy_useractivity_comparison;/:
       Name       energy_useractivity_comparison
       Options    expires=Thu, 01 Jan 1970 00:00:01 GMT; Max-Age=0; path=/; domain=.check24.de; secure; HttpOnly; SameSite=lax
       Path       /
       Value      deleted
     energy_useractivity_has_comparisons;/:
       Name       energy_useractivity_has_comparisons
       Options    expires=Thu, 01 Jan 1970 00:00:01 GMT; Max-Age=0; path=/; domain=.check24.de; secure; HttpOnly; SameSite=lax
       Path       /
       Value      deleted
     ppset;/:
       Name       ppset
       Options    expires=Tue, 02 Dec 2025 14:54:43 GMT; Max-Age=432000; path=/; domain=.check24.de; SameSite=lax
       Path       /
       Value      strom
     wpset;/:
       Name       wpset
       Options    expires=Fri, 09 Jan 2026 14:54:41 GMT; Max-Age=2592000; path=/; domain=.check24.de; SameSite=lax
       Path       /
       Value      energie_pss_directtypein
   HttpUtils:
     NAME       
     addr       https://www.heizoel24.de:443
     auth       0
     buf       
     code       429
     compress   1
     conn       
     data       
     displayurl https://www.heizoel24.de/DailyPriceXml.ashx?zipcode=40477&litre=ReadingsNum($name,"Bestellmenge",0)&unloadingpoints=1&oilgrade=standard
     header     Cookie: c24_splash_BlackFriday=1_2_11_12; c24_splash_energy=1; cs_code_checked=deleted; deviceoutput=desktop; devicetype=desktop; emodSession=35b6f461753e1df203f90e1932180bc6; energy_useractivity_comparison=deleted; energy_useractivity_has_comparisons=deleted; ppset=strom; wpset=energie_pss_directtypein
     host       www.heizoel24.de
     httpheader HTTP/1.1 429 Too Many Requests
Cache-Control: no-store, no-cache, must-revalidate, private
Pragma: no-cache
Content-Type: application/json
Content-Encoding: gzip
Vary: Accept-Encoding
Strict-Transport-Security: max-age=31536000; includeSubDomains; preload
X-Powered-By:
X-Powered-By:
X-Content-Type-Options: nosniff
Date: Mon, 15 Dec 2025 17:23:16 GMT
Connection: close
Content-Length: 118
     httpversion 1.0
     hu_blocking 0
     hu_filecount 1
     hu_port    443
     hu_portSfx
     ignoreredirects 1
     loglevel   4
     path       /DailyPriceXml.ashx?zipcode=40477&litre=ReadingsNum($name,"Bestellmenge",0)&unloadingpoints=1&oilgrade=standard
     protocol   https
     redirects  0
     timeout    10
     url        https://www.heizoel24.de/DailyPriceXml.ashx?zipcode=40477&litre=ReadingsNum($name,"Bestellmenge",0)&unloadingpoints=1&oilgrade=standard
     sslargs:
   QUEUE:
   READINGS:
     2025-12-15 18:23:16   Bestellmenge    36
     2025-12-15 18:23:16   Fuellkosten     30.92
     2025-12-15 18:23:16   Fuellstand      8164.00
     2025-12-15 07:54:40   Heizoelpreis    85.88
     2024-02-27 11:35:58   Tankvolumen     8200
     2025-12-10 17:49:42   attrTemplateVersion 20210626
   REQUEST:
     context    reading
     data       
     header     
     ignoreredirects 0
     num        unknown
     retryCount 0
     type       update
     url        https://www.heizoel24.de/DailyPriceXml.ashx?zipcode=%%PLZ%%&litre=%%MENGE%%&unloadingpoints=%%ENTLADESTELLEN%%&oilgrade=standard
   defptr:
     readingBase:
       Heizoelpreis reading
     readingNum:
       Heizoelpreis 010
     readingOutdated:
     requestReadings:
       update:
         Heizoelpreis reading 010
Attributes:
   enableControlSet 1
   fhem_widget_channels [{"allowed_values":[],"alias":"Bestellmenge","suffix":"l","controlled_attribute":"Bestellmenge","group":"05 - Heizung"},{"allowed_values":[],"alias":"Füllkosten","suffix":"€","controlled_attribute":"Fuellkosten","group":"05 - Heizung"},{"allowed_values":[],"alias":"Ölpreis","suffix":"€","controlled_attribute":"Heizoelpreis","group":"05 - Heizung"}]
   model      fuel_oil_check_heizoel24_v2
   reading010Name Heizoelpreis
   reading010OExpr $val =~ s/,/\./; $val;
   reading010Regex ([\d\,]+)<\/price
   replacement01Mode text
   replacement01Regex %%PLZ%%
   replacement01Value 40477
   replacement02Mode text
   replacement02Regex %%MENGE%%
   replacement02Value ReadingsNum($name,"Bestellmenge",0)
   replacement03Mode text
   replacement03Regex %%ENTLADESTELLEN%%
   replacement03Value 1
   replacement04Mode text
   replacement04Regex %%SCHLAUCHLAENGE%%
   replacement04Value hose=
   replacement05Mode text
   replacement05Regex %%ANHAENGER%%
   replacement05Value short_vehicle=
   replacement06Mode text
   replacement06Regex %%OILGRADE%%
   replacement06Value 8
   replacement07Mode text
   replacement07Regex %%PAYMENT%%
   replacement07Value 6
   replacement08Mode text
   replacement08Regex %%EXPRESS%%
   replacement08Value express=1
   room       Energie,HTTPMOD,Heizung,Widget
   stateFormat {
  my $menge = ReadingsNum("CN.Blaubrenner","Bestellmenge",0);

  # Mindestbestellmenge 1000 l
  $menge = $menge >= 1000 ? $menge : 1000;

  my $preis = ReadingsNum($name,"Heizoelpreis",0);
  my $zeit  = ReadingsTimestamp($name,"Heizoelpreis","");

  return '<span style="color:gray;">kein Preis</span>'
    if !$preis;

  my $gesamt = sprintf("%.2f", ($menge * $preis) / 100);

  my $link = "https://www.heizoel24.de/heizoel/angebotsliste?"
           . "zipCode="  . AttrVal($name,"replacement01Value","")
           . "&amount="  . $menge
           . "&stations=". AttrVal($name,"replacement03Value","")
           . "&product=1";

  return qq(
    <span>
      $zeit:
      <a href="$link" target="_blank" rel="noopener noreferrer">
        <b>$preis&nbsp;&euro;</b>
      </a>/100l
      ($menge&nbsp;l = $gesamt&nbsp;&euro;)
    </span>
  );
}

   timeout    10
   userReadings Bestellmenge {(ReadingsNum("CN.Blaubrenner","Tankvolumen",0)-ReadingsNum("CN.Blaubrenner","appTanklevel",0))},
Fuellkosten {sprintf("%.2f",ReadingsNum("Heizoel_esyoil","Bestellmenge",0)/100*ReadingsNum("Heizoel_esyoil","Heizoelpreis",0))},
Fuellstand {sprintf("%.2f", ReadingsNum("CN.Blaubrenner","appTanklevel",0))}
   userattr   replacement03Value:1,2,3,4,5,6,7,8,9,10
   webCmd     reread
Titel: Aw: Abfrage Heizölpreis HTTPMOD
Beitrag von: yersinia am 16 Dezember 2025, 07:45:06
Zitat von: Bartimaus am 15 Dezember 2025, 17:21:02ich bekomme ja einen Preis..... aber NUR wenn ich im replacement02Value einen Wert von z.B. 3000 eintrage.
Trage ich dort (wie in der Hilfe beschrieben)

CN.Blaubrenner:Bestellmenge

oder

ReadingsNum("CN.Blaubrenner","Bestellmenge",0)

ein, bekomme ich KEINEN Preis. Man sieht das, da das Reading -> "Heizölpreis" nicht aktualisiert wird.

Allein replacementValue zu ändern reicht nicht laut commandref:
Zitatreplacement[0-9]*Regex
Defines a replacement to be applied to an HTTP request header, data or URL before it is sent. This allows any part of the request to be modified based on a reading, an internal or an expression. The regex defines which part of a header, data or URL should be replaced. The replacement is defined with the following attributes:
replacement[0-9]*Mode
Defines how the replacement should be done and what replacementValue means. Valid options are text, reading, internal and expression.
replacement[0-9]*Value
Defines the replacement. If the corresponding replacementMode is text, then value is a static text that is used as the replacement.
If replacementMode is reading then Value can be the name of a reading of this device or it can be a reading of a different device referred to by devicename:reading.
If replacementMode is expression the the Value is treated as a Perl expression that computes the replacement value. The expression can use $1, $2 and so on to refer to capture groups of the corresponding regex that is matched against the original URL, header or post data.
If replacementMode is key then the module will use a value from a key / value pair that is stored in an obfuscated form in the file system with the set storeKeyValue command. This might be useful for storing passwords.
(https://fhem.de/commandref.html#HTTPMOD (https://fhem.de/commandref.html#HTTPMOD))

Demnach müsste es eigtl mit
   replacement02Mode reading
   replacement02Regex %%MENGE%%
   replacement02Value Heizoel_esyoil:Bestellmenge
oder
   replacement02Mode expression
   replacement02Regex %%MENGE%%
   replacement02Value ReadingsNum($name,"Bestellmenge",0)
funktionieren.

Darüber hinaus würde ich die Bestellmenge auf mindestens 1000(l) setzen und auf ganze 100er aufrunden bevor du anfragst.
   2025-12-15 18:23:16   Bestellmenge    36
Titel: Aw: Abfrage Heizölpreis HTTPMOD
Beitrag von: Bartimaus am 16 Dezember 2025, 23:07:33
Arrrrgh... ich danke Dir.... replacement02Mode war der Schlüssel, es funktioniert natürlich mit "reading" oder "expression" und dem entsprechenden Value...
Titel: Aw: Abfrage Heizölpreis HTTPMOD
Beitrag von: Bartimaus am 17 Dezember 2025, 09:44:02
Moin,

ich habe jetzt in meiner Abfrage-URL auch eine Mindestbestellmenge ergänzt:

replacement02Mode expression
replacement02Regex %%MENGE%%
replacement02Value
{
  my $m = ReadingsNum($name,"Bestellmenge",0);
  $m = $m >= 1000 ? $m : 1000;
  return int(($m + 99) / 100) * 100;
}


Das Reading "Bestellmenge" im Device ist bei mir ein Userreading welches den Wert aus meinem HourcounterDevice extrahiert
Titel: Aw: Abfrage Heizölpreis HTTPMOD
Beitrag von: yersinia am 18 Dezember 2025, 08:52:51
[OT]
Zitat von: Bartimaus am 17 Dezember 2025, 09:44:02Das Reading "Bestellmenge" im Device ist bei mir ein Userreading welches den Wert aus meinem HourcounterDevice extrahiert
ja, sieht man im list
Bestellmenge {(ReadingsNum("CN.Blaubrenner","Tankvolumen",0)-ReadingsNum("CN.Blaubrenner","appTanklevel",0))}Dieses userReading wird mWn immer nur dann neu berechnet, wenn das HTTPMOD Device einen trigger bekommt - also eigtl wenn es schon angefragt und ein Ergebnis erhalten hat.
Wäre es nicht sinnvoller, die Bestellmenge direkt im Device CN.Blaubrenner zu berechnen wenn es einen neuen Tanklevelstand gibt? Dann hast du immer einen aktuellen Wert von dort - und das kannst du dann sowohl in der Abfrage (replacement02Value) als auch im Link des stateFormat nutzen. Im Device CN.Blaubrenner würde das userReading dann in etwa so aussehen (ungetestet; und vorausgesetzt das es für das reading appTanklevel auch ein Event geben wird):
attr CN.Blaubrenner userReadings Bestellmenge:appTanklevel.* {\
  my $m = ReadingsNum($name,"Tankvolumen",0) - ReadingsNum($name,"appTanklevel",0);;\
  $m = $m < 1000 ? 1000 : $m;; #Mindestbestellmenge >= 1000\
  $m = $m % 100 == 0 ? $m : ($m + (100 - ($m % 100)));; #auf volle 100er aufrunden\
  return $m;;\
}

Und im HTTPMOD Device entsprechend das userReading einbinden (ungetestet):
setreading Heizoel_esyoil replacement02Mode reading
setreading Heizoel_replacement02Regex %%MENGE%%
setreading Heizoel_replacement02Value CN.Blaubrenner:Bestellmenge
Im stateFormat bleibt dann $menge wie gehabt; die Prüfung auf >= 1000 kannst du dann sparen.
[/OT]
Titel: Aw: Abfrage Heizölpreis HTTPMOD
Beitrag von: Bartimaus am 19 Dezember 2025, 10:25:27
Guten Morgen,

jetzt muss ich erstmal schauen, wieso ich keine eMailBenachrichtigung aus dem Forum bekomme.

Danke für Deinen Tip, ja, es macht absolut Sinn, die Mindestbestellmenge direkt im Hourcounterdevice zu berechnen, und darauf im Heizoeldevice zu verweisen (Reading)

Habe Deinen Codeschnipsel quasi übernommen, und im CN.Blaubrenner ein eigenes Reading für die Mindestbestellmenge ergänzt. (ähnlich wie das Tankvolumen):

So siehts jetzt aus, getestet und für gut befunden:

attr CN.Blaubrenner userReadings Bestellmenge {
  my $tankvol = ReadingsNum($name,"Tankvolumen",0);
  my $level   = ReadingsNum($name,"appTanklevel",0);
  my $min     = ReadingsNum($name,"minOrderVolume",0);

  my $bedarf = $tankvol - $level;
  $bedarf = 0 if $bedarf < 0;

  # Mindestbestellmenge anwenden
  $bedarf = $bedarf < $min ? $min : $bedarf;

  # Auf volle 100 l aufrunden
  $bedarf = int(($bedarf + 99) / 100) * 100;

  return $bedarf;
}