Abfrage Heizölpreis HTTPMOD

Begonnen von subseven, 09 Januar 2020, 16:51:01

Vorheriges Thema - Nächstes Thema

yersinia

Beim suchen nach einer API bin ich über diese xml Schnittstelle gestolpert, der aktualisierte Code wäre dann:
defmod Heizoel_heizoel24 HTTPMOD https://www.heizoel24.de/DailyPriceXml.ashx?zipcode=%%PLZ%%&litre=%%MENGE%%&unloadingpoints=%%ENTLADESTELLEN%%&oilgrade=standard 3600
attr Heizoel_heizoel24 userattr replacement03Value:1,2,3,4,5,6,7,8,9,10
attr Heizoel_heizoel24 enableControlSet 1
attr Heizoel_heizoel24 reading010Name Heizoelpreis
attr Heizoel_heizoel24 reading010OExpr $val =~ s/,/\./;; $val;;
attr Heizoel_heizoel24 reading010Regex ([\d\,]+)<\/price
attr Heizoel_heizoel24 replacement01Mode text
attr Heizoel_heizoel24 replacement01Regex %%PLZ%%
attr Heizoel_heizoel24 replacement01Value 12345
attr Heizoel_heizoel24 replacement02Mode text
attr Heizoel_heizoel24 replacement02Regex %%MENGE%%
attr Heizoel_heizoel24 replacement02Value 3000
attr Heizoel_heizoel24 replacement03Mode text
attr Heizoel_heizoel24 replacement03Regex %%ENTLADESTELLEN%%
attr Heizoel_heizoel24 replacement03Value 1
attr Heizoel_heizoel24 stateFormat { my $price = 0.0;;\
$price = (AttrNum($name,"replacement02Value",0)*ReadingsNum($name,"Heizoelpreis",0))/100;;\
my $lastCheck = ReadingsTimestamp($name,"Heizoelpreis","");;\
my $ret = "<div style=\"text-align: left;;\">".$lastCheck.":";;\
my $link = "https://www.heizoel24.de/heizoel/angebotsliste?";;\
$link .= "zipCode=".AttrVal($name,"replacement01Value","");;\
$link .= "&amount=".AttrVal($name,"replacement02Value","");;\
$link .= "&stations=".AttrVal($name,"replacement03Value","");;\
$link .= "&product=1";;\
$ret .= "&nbsp;;<a href=\"".$link."\" rel=\"noopener noreferrer\" target=\"_blank\" style=\"font-weight:bold;;\">";;\
$ret .= ReadingsVal($name,"Heizoelpreis","-");;\
$ret .= "&euro;;</a>/100l";;\
$ret .= "&nbsp;;(".AttrVal($name,"replacement02Value","0")."l = ";;\
$ret .= sprintf("%.2f",$price);;\
$ret .= "&euro;;)</div>";;\
return $ret;;\
}
attr Heizoel_heizoel24 timeout 10
attr Heizoel_heizoel24 webCmd reread

Ich habe das kurz getestet und es sieht erstmal gut aus.
viele Grüße, yersinia
----
FHEM 6.3 (SVN) on RPi 4B with RasPi OS Bullseye (perl 5.32.1) | FTUI
nanoCUL->2x868(1x ser2net)@tsculfw, 1x433@Sduino | MQTT2 | Tasmota | ESPEasy
VCCU->14xSEC-SCo, 7xCC-RT-DN, 5xLC-Bl1PBU-FM, 3xTC-IT-WM-W-EU, 1xPB-2-WM55, 1xLC-Sw1PBU-FM, 1xES-PMSw1-Pl

AET_FHEM

kann ich nur so bestätigen sieht sehr gut aus ...
=> bis auf den Preis :-) der ist zu hoch  ;D

amenomade

Danke, ich habe es so in httpmod.template eingecheckt.
Pi 3B, Alexa, CUL868+Selbstbau 1/2λ-Dipol-Antenne, USB Optolink / Vitotronic, Debmatic und HM / HmIP Komponenten, Rademacher Duofern Jalousien, Fritz!Dect Thermostaten, Proteus

docolli

#63
Coole Sache, das mit der Heizölpreisabfrage. Seit kurzem habe ich einen Tanksensor, den ich in FHEM eingebunden habe und jetzt wollte ich das mit dem aktuellen Heizölpreis ergänzen.

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

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

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

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

Zur Ergänzung meine Definition:

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

setstate Heizoelpreis <div style="text-align: left;;;;">2021-07-15 13:14:15:&nbsp;;<a href="https://www.esyoil.com/preisausgabe.php?pr-unloading-points=1&pr-product=8&pr-payment-type=2&pr-truck-type=&pr-hose-length=40m&pr-app=1&pr-zip=88447&pr-amount=2500&submit=" rel="noopener noreferrer" target="_blank" style="font-weight:bold;;">-&euro;;</a>/100l&nbsp;;(2500l = 0.00&euro;;)</div>
setstate Heizoelpreis 2021-07-15 13:14:17 Fuellkosten 0
setstate Heizoelpreis 2021-07-15 13:14:17 Tankmenge 2238
setstate Heizoelpreis 2021-07-15 08:28:03 Tankvolumen 3000
setstate Heizoelpreis 2021-07-15 13:05:15 attrTemplateVersion 20201206

yersinia

#64
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
viele Grüße, yersinia
----
FHEM 6.3 (SVN) on RPi 4B with RasPi OS Bullseye (perl 5.32.1) | FTUI
nanoCUL->2x868(1x ser2net)@tsculfw, 1x433@Sduino | MQTT2 | Tasmota | ESPEasy
VCCU->14xSEC-SCo, 7xCC-RT-DN, 5xLC-Bl1PBU-FM, 3xTC-IT-WM-W-EU, 1xPB-2-WM55, 1xLC-Sw1PBU-FM, 1xES-PMSw1-Pl

docolli

Okay, ich befürchte HTTPMOD kann kein Javascript ausführen.

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

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

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



yersinia

viele Grüße, yersinia
----
FHEM 6.3 (SVN) on RPi 4B with RasPi OS Bullseye (perl 5.32.1) | FTUI
nanoCUL->2x868(1x ser2net)@tsculfw, 1x433@Sduino | MQTT2 | Tasmota | ESPEasy
VCCU->14xSEC-SCo, 7xCC-RT-DN, 5xLC-Bl1PBU-FM, 3xTC-IT-WM-W-EU, 1xPB-2-WM55, 1xLC-Sw1PBU-FM, 1xES-PMSw1-Pl

docolli

#67
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

docolli

Bin ein Stück weiter. Die Menge wird in der Get URL schon korrekt eingetragen, das sehe ich am Preis, der zurück kommt. Es ist ein Problem im stateFormat, welches den Wert des Attributes über "AttrVal($name,"replacement02Value","") zu ermitteln versucht, aber dabei nur den Text "ReadingsVal("Heizoel_heizoel24","Tankmenge",0)" zurück bekommt. Das wird hier nicht als "expression" interpretiert!


attr Heizoel_heizoel24 stateFormat { my $price = 0.0;;\
$price = (AttrNum($name,"replacement02Value",0)*ReadingsNum($name,"Heizoelpreis",0))/100;;\
my $lastCheck = ReadingsTimestamp($name,"Heizoelpreis","");;\
my $ret = "<div style=\"text-align: left;;\">";;\
my $link = "https://www.heizoel24.de/heizoel/angebotsliste?";;\
$link .= "zipCode=".AttrVal($name,"replacement01Value","");;\
$link .= "&amount=".AttrVal($name,"replacement02Value","");;\
$link .= "&stations=".AttrVal($name,"replacement03Value","");;\
$link .= "&product=1";;\
$ret .= "&nbsp;;<a href=\"".$link."\" rel=\"noopener noreferrer\" target=\"_blank\" style=\"font-weight:bold;;\">";;\
$ret .= ReadingsVal($name,"Heizoelpreis","-");;\
$ret .= "&euro;;</a>/100l";;\
$ret .= "&nbsp;;(".AttrVal($name,"replacement02Value","0")."l = ";;\
$ret .= sprintf("%.2f",$price);;\
$ret .= "&euro;;) - ".$lastCheck."</div>";;\
return $ret;;\
}

docolli

Für mich habe ich jetzt eine Lösung!
Ich rechne in einer userreadings Definition und beziehe mich dann auf diese Readings:

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

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

docolli

#70
Ich habe mich noch etwas mit den XML Parametern beschäftigt und das "oilgrade" noch über ein userattribut konfigurierbar gemacht.

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


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

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


yersinia

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)
viele Grüße, yersinia
----
FHEM 6.3 (SVN) on RPi 4B with RasPi OS Bullseye (perl 5.32.1) | FTUI
nanoCUL->2x868(1x ser2net)@tsculfw, 1x433@Sduino | MQTT2 | Tasmota | ESPEasy
VCCU->14xSEC-SCo, 7xCC-RT-DN, 5xLC-Bl1PBU-FM, 3xTC-IT-WM-W-EU, 1xPB-2-WM55, 1xLC-Sw1PBU-FM, 1xES-PMSw1-Pl

docolli

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 .= "&nbsp;;<a href=\"".$link."\" rel=\"noopener noreferrer\" target=\"_blank\" style=\"font-weight:bold;;\">";;\
$ret .= ReadingsVal($name,"Heizoelpreis","-");;\
$ret .= "&euro;;</a>/100l";;\
$ret .= "&nbsp;;(".ReadingsNum($name,"Tankmenge",0)."l = ";;\
$ret .= sprintf("%.2f",$price);;\
$ret .= "&euro;;) ";;\
        $ret .= " / ".ReadingsVal($name,"Heizoelsorte","-");;\
        $ret .= " - ".$lastCheck."</div>";;\
return $ret;;\
}\

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


yersinia

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

Dabei sind

  • 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\,]+)\&nbsp\;;\&euro\;;
attr DEVICE replacement01Mode text
attr DEVICE replacement01Regex %%PLZ%%
attr DEVICE replacement01Value ZIPCODE
attr DEVICE replacement02Mode text
attr DEVICE replacement02Regex %%MENGE%%
attr DEVICE replacement02Value ORDERVOLUME
attr DEVICE replacement03Mode text
attr DEVICE replacement03Regex %%ENTLADESTELLEN%%
attr DEVICE replacement03Value 1
attr DEVICE replacement04Mode text
attr DEVICE replacement04Regex %%SCHLAUCHLAENGE%%
attr DEVICE replacement04Value hose=
attr DEVICE replacement05Mode text
attr DEVICE replacement05Regex %%ANHAENGER%%
attr DEVICE replacement05Value short_vehicle=
attr DEVICE replacement06Mode text
attr DEVICE replacement06Regex %%OILGRADE%%
attr DEVICE replacement06Value 8
attr DEVICE replacement07Mode text
attr DEVICE replacement07Regex %%PAYMENT%%
attr DEVICE replacement07Value 2
attr DEVICE replacement08Mode text
attr DEVICE replacement08Regex %%EXPRESS%%
attr DEVICE replacement08Value express=
attr DEVICE stateFormat { my $price = 0.0;;\
$price = (AttrNum($name,"replacement02Value",0)*ReadingsNum($name,"Heizoelpreis",0))/100;;\
my $lastCheck = ReadingsTimestamp($name,"Heizoelpreis","");;\
my $ret = "<div style=\"text-align: left;;\">".$lastCheck.":";;\
my $link = "https://www.check24.de/heizoel/?c24_calculate=calculate";;\
$link .= "&zipcode=".AttrVal($name,"replacement01Value","");;\
$link .= "&amount=".AttrVal($name,"replacement02Value","");;\
$link .= "&up=".AttrVal($name,"replacement03Value","");;\
$link .= "&".AttrVal($name,"replacement04Value","");; #hose length\
$link .= "&".AttrVal($name,"replacement05Value","");; #short vehicle\
$link .= "&prod=".AttrVal($name,"replacement06Value","");; # product 8 = normal schwefelarm 4 = premium schwefelarm\
$link .= "&payment_type=".AttrVal($name,"replacement07Value","");; # 1 = Barzahlung, 2 = EC-Karte, 3 = Vorkasse, 4 = Lastschrift, 5 = Wärmekonto, 6 = Rechnung, 10 = Ratenkauf\
$link .= "&".AttrVal($name,"replacement08Value","");; #express;;\
$ret .= "&nbsp;;<a href=\"".$link."\" rel=\"noopener noreferrer\" target=\"_blank\" style=\"font-weight:bold;;\">";;\
$ret .= ReadingsVal($name,"Heizoelpreis","-");;\
$ret .= "&euro;;</a>/100l";;\
$ret .= "&nbsp;;(".AttrVal($name,"replacement02Value","0")."l = ";;\
$ret .= sprintf("%.2f",$price);;\
$ret .= "&euro;;)</div>";;\
return $ret;;\
}
attr DEVICE timeout 10
attr DEVICE webCmd reread
attr DEVICE room WHICHROOM
attr DEVICE model fuel_oil_check_esyoil
setreading DEVICE attrTemplateVersion 20210720
viele Grüße, yersinia
----
FHEM 6.3 (SVN) on RPi 4B with RasPi OS Bullseye (perl 5.32.1) | FTUI
nanoCUL->2x868(1x ser2net)@tsculfw, 1x433@Sduino | MQTT2 | Tasmota | ESPEasy
VCCU->14xSEC-SCo, 7xCC-RT-DN, 5xLC-Bl1PBU-FM, 3xTC-IT-WM-W-EU, 1xPB-2-WM55, 1xLC-Sw1PBU-FM, 1xES-PMSw1-Pl

yersinia

Zitat von: docolli am 16 Juli 2021, 19:04:39Weitere Verbesserungen:

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

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

@amenomade: Teile von docolli habe ich in eine Template-Aktualisierung gegossen.
#Contributed by yersinia & enhanced by docolli, see https://forum.fhem.de/index.php/topic,107189.msg1166854.html#msg1166854
name:fuel_oil_check_heizoel24
filter:TYPE=HTTPMOD
desc: checks fuel oil prices via heizoel24.de<br />Define a HTTPMOD device like<br />https://www.heizoel24.de/DailyPriceXml.ashx?zipcode=%%PLZ%%&litre=%%MENGE%%&unloadingpoints=%%ENTLADESTELLEN%%&oilgrade=%%OELSORTE%% 3600<br />Maintain Attributes for ZIP (PLZ), order volume (Bestellmenge) and unloading points (Entladestellen) before senseful values can be retrieved.<br />Further information and documentation can be found in <a href="https://forum.fhem.de/index.php/topic,107189.msg1166854.html#msg1166854">this FHEM forum thread</a>
order:FUEL04
par:WHICHROOM;Actual room of the device, defaults to HTTPMOD; {AttrVal("DEVICE","room","HTTPMOD")}
par:INTERVAL;Actual interval for updating, defaults to hourly (3600s); {InternalVal("DEVICE","Interval","3600")}
par:ZIPCODE;German ZIP Code / deutsche Postleitzahl; {AttrVal("DEVICE","replacement01Value","12345")}
par:ORDERVOLUME;fuel order volume in litre / Bestellmenge in Liter; {AttrVal("DEVICE","replacement02Value","5000")}
defmod DEVICE HTTPMOD https://www.heizoel24.de/DailyPriceXml.ashx?zipcode=%%PLZ%%&litre=%%MENGE%%&unloadingpoints=%%ENTLADESTELLEN%%&oilgrade=%%OELSORTE%% INTERVAL
attr DEVICE userattr replacement03Value:1,2,3,4,5,6,7,8,9,10 replacement04Value:standard,super,premiumecotherm,bio
attr DEVICE enableControlSet 1
attr DEVICE reading010Name Heizoelpreis
attr DEVICE reading010OExpr $val =~ s/,/\./; $val;
attr DEVICE reading010Regex ([\d\,]+)<\/price
attr DEVICE reading020Name Heizoelsorte
attr DEVICE reading020OExpr $val =~ s/,/\./;; $val;;
attr DEVICE reading020Regex oilGrade="([^"]
attr DEVICE replacement01Mode text
attr DEVICE replacement01Regex %%PLZ%%
attr DEVICE replacement01Value ZIPCODE
attr DEVICE replacement02Mode text
attr DEVICE replacement02Regex %%MENGE%%
attr DEVICE replacement02Value ORDERVOLUME
attr DEVICE replacement03Mode text
attr DEVICE replacement03Regex %%ENTLADESTELLEN%%
attr DEVICE replacement03Value 1
attr DEVICE replacement04Mode text
attr DEVICE replacement04Regex %%OELSORTE%%
attr DEVICE replacement04Value standard
attr DEVICE stateFormat {       my $price = 0.0;\
my %oilgradecodes = ('standard', '1',\
'super', '2',\
'premiumecotherm', '3',\
'bio', '4');\
        $price = (AttrNum($name,"replacement02Value",0)*ReadingsNum($name,"Heizoelpreis",0))/100;\
        my $lastCheck = ReadingsTimestamp($name,"Heizoelpreis","");\
        my $ret = "<div style=\"text-align: left;;\">".$lastCheck.":";\
my $link = "https://www.heizoel24.de/heizoel/angebotsliste?";\
$link .= "zipCode=".AttrVal($name,"replacement01Value","");\
$link .= "&amount=".AttrVal($name,"replacement02Value","");\
$link .= "&stations=".AttrVal($name,"replacement03Value","");\
$link .= "&oilgrade=".AttrVal($name,"replacement04Value","");\
$link .= "&product=".$oilgradecodes{AttrVal($name,"replacement04Value","standard")};\
        $ret .= "&nbsp;<a href=\"".$link."\" rel=\"noopener noreferrer\" target=\"_blank\" style=\"font-weight:bold;;\">";\
        $ret .= ReadingsVal($name,"Heizoelpreis","-");\
        $ret .= "&euro;</a>/100l";\
        $ret .= "&nbsp;(".AttrVal($name,"replacement02Value","0")."l = ";\
        $ret .= sprintf("%.2f",$price);\
        $ret .= "&euro;)</div>";\
        return $ret;\
}
attr DEVICE timeout 10
attr DEVICE webCmd reread
attr DEVICE room WHICHROOM
attr DEVICE model fuel_oil_check_heizoel24_v2
setreading DEVICE attrTemplateVersion 20210720
viele Grüße, yersinia
----
FHEM 6.3 (SVN) on RPi 4B with RasPi OS Bullseye (perl 5.32.1) | FTUI
nanoCUL->2x868(1x ser2net)@tsculfw, 1x433@Sduino | MQTT2 | Tasmota | ESPEasy
VCCU->14xSEC-SCo, 7xCC-RT-DN, 5xLC-Bl1PBU-FM, 3xTC-IT-WM-W-EU, 1xPB-2-WM55, 1xLC-Sw1PBU-FM, 1xES-PMSw1-Pl