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
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.
Die Attribute werde ich bei mir auch noch nachrüsten. Danke!
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
hallo
@Bartimaus würdest du diesen userreadings abschnitt zur Verfügung stellen.
Danke
Tolle Sache - danke für den Codeschnipsel!
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","-")."€;</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....)
@Bartimaus
Danke
Hallo - Super Codeschnipsel,
wäre es auch möglich mehrere Abnahmestellen zu konfigurieren um evtl den Preis für eine Sammelbestellung zu erfragen?
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","-")."€;</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.
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!
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?
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.
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. :(
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?
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.
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!
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.
Hmm, also ich hatte yersinias Codebeispiel übernommen (was ja eigtl auf deinem beruht) und bis jetzt funktioniert noch alles!
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....
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€</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","-")."€</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
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.
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! :)
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.
Funktioniert auch bei mir :D
@Schotty: Habe es getestet. Kann bestätigen, es funktioniert :)
Moin,
auch bei mir, funzt.
Dankeschön
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]*€
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? ;)
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.
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. ;)
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]
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?
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
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.
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.
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.
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.
[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.
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.
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 .= " ;<b>".ReadingsVal($name,"Heizoelpreis","-")."€;</b>/100l";;;;\
$ret .= " ;(".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€)
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.
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>"}
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.
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.
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 :) :) :)
@yersinia Vielen Dank für die Anpassung :) nun funktionierts auch bei mir wieder
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?
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
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.
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..
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","-")."€;</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
Hallo Bartimaus,
habs rausgefunden :)
Viele Grüße
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)
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 .= " ;<a href=\"".InternalVal($name,"displayurl","https://www.heizoel24.de")."\" rel=\"noopener noreferrer\" target=\"_blank\" style=\"font-weight:bold;;\">";;\
$ret .= ReadingsVal($name,"Heizoelpreis","-");;\
$ret .= "€;</a>/100l";;\
$ret .= " ;(".AttrVal($name,"replacement02Value","0")."l = ";;\
$ret .= sprintf("%.2f",$price);;\
$ret .= "€;)</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).
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 .= " ;<a href=\"".$link."\" rel=\"noopener noreferrer\" target=\"_blank\" style=\"font-weight:bold;;\">";;\
$ret .= ReadingsVal($name,"Heizoelpreis","-");;\
$ret .= "€;</a>/100l";;\
$ret .= " ;(".AttrVal($name,"replacement02Value","0")."l = ";;\
$ret .= sprintf("%.2f",$price);;\
$ret .= "€;)</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 .= " ;<a href=\"".$link."\" rel=\"noopener noreferrer\" target=\"_blank\" style=\"font-weight:bold;;\">";;\
$ret .= ReadingsVal($name,"Heizoelpreis","-");;\
$ret .= "€;</a>/100l";;\
$ret .= " ;(".AttrVal($name,"replacement02Value","0")."l = ";;\
$ret .= sprintf("%.2f",$price);;\
$ret .= "€;)</div>";;\
return $ret;;\
}
attr Heizoel_heizoel24 timeout 10
attr Heizoel_heizoel24 webCmd reread
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. :)
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 ;)
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...
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. :-\
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 .= " ;<a href=\"".$link."\" rel=\"noopener noreferrer\" target=\"_blank\" style=\"font-weight:bold;;\">";;\
$ret .= ReadingsVal($name,"Heizoelpreis","-");;\
$ret .= "€;</a>/100l";;\
$ret .= " ;(".AttrVal($name,"replacement02Value","0")."l = ";;\
$ret .= sprintf("%.2f",$price);;\
$ret .= "€;)</div>";;\
return $ret;;\
}
attr Heizoel_heizoel24 timeout 10
attr Heizoel_heizoel24 webCmd reread
Ich habe das kurz getestet und es sieht erstmal gut aus.
kann ich nur so bestätigen sieht sehr gut aus ...
=> bis auf den Preis :-) der ist zu hoch ;D
Danke, ich habe es so in httpmod.template eingecheckt.
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: <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;">-€</a>/100l (2500l = 0.00€)</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 .= " ;<a href=\"".$link."\" rel=\"noopener noreferrer\" target=\"_blank\" style=\"font-weight:bold;;\">";;\
$ret .= ReadingsVal($name,"Heizoelpreis","-");;\
$ret .= "€;</a>/100l";;\
$ret .= " ;(".AttrVal($name,"replacement02Value","0")."l = ";;\
$ret .= sprintf("%.2f",$price);;\
$ret .= "€;)</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: ;<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;;">-€;</a>/100l ;(2500l = 0.00€;)</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
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
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 .= " ;<a href=\"".$link."\" rel=\"noopener noreferrer\" target=\"_blank\" style=\"font-weight:bold;;\">";;\
$ret .= ReadingsVal($name,"Heizoelpreis","-");;\
$ret .= "€;</a>/100l";;\
$ret .= " ;(".AttrVal($name,"replacement02Value","0")."l = ";;\
$ret .= sprintf("%.2f",$price);;\
$ret .= "€;)</div>";;\
return $ret;;\
}
attr Heizoelpreis timeout 10
attr Heizoelpreis webCmd reread
setstate Heizoelpreis <div style="text-align: left;;;;">2021-07-15 16:25:46: ;<a href="https://www.heizoel24.de/heizoelpreise-direkt/88447/2500/1" rel="noopener noreferrer" target="_blank" style="font-weight:bold;;">-€;</a>/100l ;(2500l = 0.00€;)</div>
setstate Heizoelpreis 2021-07-15 16:24:53 attrTemplateVersion 20201206
Du nutzt nicht das aktuelle Template für heizöl24 (https://forum.fhem.de/index.php/topic,107189.msg1163471.html#msg1163471).
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
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 .= " ;<a href=\"".$link."\" rel=\"noopener noreferrer\" target=\"_blank\" style=\"font-weight:bold;;\">";;\
$ret .= ReadingsVal($name,"Heizoelpreis","-");;\
$ret .= "€;</a>/100l";;\
$ret .= " ;(".AttrVal($name,"replacement02Value","0")."l = ";;\
$ret .= sprintf("%.2f",$price);;\
$ret .= "€;) - ".$lastCheck."</div>";;\
return $ret;;\
}
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 .= " ;<a href=\"".$link."\" rel=\"noopener noreferrer\" target=\"_blank\" style=\"font-weight:bold;;\">";;\
$ret .= ReadingsVal($name,"Heizoelpreis","-");;\
$ret .= "€;</a>/100l";;\
$ret .= " ;(".ReadingsNum($name,"Tankmenge",0)."l = ";;\
$ret .= sprintf("%.2f",$price);;\
$ret .= "€;) - ".$lastCheck."</div>";;\
return $ret;;\
}
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 .= " ;<a href=\"".$link."\" rel=\"noopener noreferrer\" target=\"_blank\" style=\"font-weight:bold;;\">";;\
$ret .= ReadingsVal($name,"Heizoelpreis","-");;\
$ret .= "€;</a>/100l";;\
$ret .= " ;(".ReadingsNum($name,"Tankmenge",0)."l = ";;\
$ret .= sprintf("%.2f",$price);;\
$ret .= "€;) - ".$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.
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)
Weitere 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
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 .= " ;<a href=\"".$link."\" rel=\"noopener noreferrer\" target=\"_blank\" style=\"font-weight:bold;;\">";;\
$ret .= ReadingsVal($name,"Heizoelpreis","-");;\
$ret .= "€;</a>/100l";;\
$ret .= " ;(".ReadingsNum($name,"Tankmenge",0)."l = ";;\
$ret .= sprintf("%.2f",$price);;\
$ret .= "€;) ";;\
$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
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\,]+)\ \;;\&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 .= " ;<a href=\"".$link."\" rel=\"noopener noreferrer\" target=\"_blank\" style=\"font-weight:bold;;\">";;\
$ret .= ReadingsVal($name,"Heizoelpreis","-");;\
$ret .= "€;</a>/100l";;\
$ret .= " ;(".AttrVal($name,"replacement02Value","0")."l = ";;\
$ret .= sprintf("%.2f",$price);;\
$ret .= "€;)</div>";;\
return $ret;;\
}
attr Heizoel_esyoil timeout 10
attr Heizoel_esyoil webCmd reread
Dabei sind
- replacement01Value => Postleitzahl
- replacement02Value => Bestellmenge
- replacement03Value => Entladestellen
- replacement04Value => Schlauchlänge (hose= = egal; hose=hose_l = 60m; hose=hose_xl = 80m)
- replacement05Value => Tankwagen mit/ohne Anhänger (short_vehicle= = mit Anhänger möglich; short_vehicle=short_vehicle = ohne Anhänger)
- replacement06Value => Ölsorte (8 = normal schwefelarm; 4 = premium schwefelarm)
- replacement07Value => Zahlart (1 = Bar; 2 = EC-Karte; 3 = Vorkasse; 4 = Lastschrift; 6 = Rechnung)
- replacement08Value => Expresslieferung (express= = nein; express=1 = ja)
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\,]+)\ \;;\&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 .= " ;<a href=\"".$link."\" rel=\"noopener noreferrer\" target=\"_blank\" style=\"font-weight:bold;;\">";;\
$ret .= ReadingsVal($name,"Heizoelpreis","-");;\
$ret .= "€;</a>/100l";;\
$ret .= " ;(".AttrVal($name,"replacement02Value","0")."l = ";;\
$ret .= sprintf("%.2f",$price);;\
$ret .= "€;)</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
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 .= " <a href=\"".$link."\" rel=\"noopener noreferrer\" target=\"_blank\" style=\"font-weight:bold;;\">";\
$ret .= ReadingsVal($name,"Heizoelpreis","-");\
$ret .= "€</a>/100l";\
$ret .= " (".AttrVal($name,"replacement02Value","0")."l = ";\
$ret .= sprintf("%.2f",$price);\
$ret .= "€)</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
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 .= " ;<a href=\"".$link."\" rel=\"noopener noreferrer\" target=\"_blank\" style=\"font-weight:bold;;\">";;\
$ret .= ReadingsVal($name,"Heizoelpreis","-");;\
$ret .= "€;</a>/100l";;\
$ret .= " ;(".$volume."l = ";;\
$ret .= sprintf("%.2f",$price);;\
$ret .= "€;) ";;\
$ret .= " / ".ReadingsVal($name,"Heizoelsorte","-");;\
$ret .= " - ".$lastCheck."</div>";;\
return $ret;;\
}\
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?!
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.
Danke für die Rückmeldung. Hatte eine ; zu viel
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
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?
@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
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 ? ::)
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.
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\,]+)\ \;;\&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
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
Danke, erledigt.
Kannst Du mit einfachen Worten kurz sagen, was das optimieren der replacementvalues bewirkt ?
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
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.
Das dafür bereitgestellte Template (setter attrTemplate) hast du ausprobiert und klappt nicht ?
Ich möchte ja nicht Heizöl anfragen, sondern dad Rohöl.
Ok, sry dafür, bin nur halb dabei und immer noch am essen.
Und am Template orientieren geht auch nicht ?
Die URL s sind verschieden
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+)
Danke
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.
@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
Für die Kommandozeile:
attr Brent reading01OExpr $val =~ s/\,/./g;; return $val;;
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
;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.
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+)
Da fragst du aber den Rohöl Preis ab. Der dürfte sich zum Heizöl unterscheiden
Ist zwar hier OT, aber nach dem Rohölpreis hat Bartimaus doch auch gefragt ?
Erstmal Danke an @TomLee für den neuen Link/Regex !
@sash.sc ,
das ist korrekt, den Heizölpreis frage ich separat über Check24 ab...
Hallo,
gibt es ein aktuelles funktionierendes Template für Heizöl ?
Gruss
Joe
Gerade mal getestet, fuel_oil_check_heizoel24_v2 funzt nach wie vor.
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\,]+)\ \;;\&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 .= " ;<a href=\"".$link."\" rel=\"noopener noreferrer\" target=\"_blank\" style=\"font-weight:bold;;\">";;
$ret .= ReadingsVal($name,"Heizoelpreis","-");;
$ret .= "€;</a>/100l";;
$ret .= " ;(".AttrVal($name,"replacement02Value","0")."l = ";;
$ret .= sprintf("%.2f",$price);;
$ret .= "€;)</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
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.
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\,]+)\ \;;\&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 .= " ;<a href=\"".$link."\" rel=\"noopener noreferrer\" target=\"_blank\" style=\"font-weight:bold;;\">";;
$ret .= ReadingsVal($name,"Heizoelpreis","-");;
$ret .= "€;</a>/100l";;
$ret .= " ;(".AttrVal($name,"replacement02Value","0")."l = ";;
$ret .= sprintf("%.2f",$price);;
$ret .= "€;)</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
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 ?