Abfrage Heizölpreis HTTPMOD

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

Vorheriges Thema - Nächstes Thema

docolli

Ich hatte Probleme mit der Abfrage bei Heizöl24 und bin jetzt drauf gekommen, dass es daran liegt, dass ich die Bedarfsmenge dynamisch aus meinem Tankinhaltssensor berechne und die Menge aktuell nur bei wenigen Litern liegt.

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

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


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

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

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





daheim

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?!

yersinia

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.
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

daheim

Danke für die Rückmeldung. Hatte eine ; zu viel

Bartimaus

#79
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 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
LG
B.


FHEM@Intel-J4105@Debian-LXC, CUL1101,FS20,IT,DS18B20,DS2413(Heizungslogger),DS2423(Stromlogger)Homematic,HM-LAN,ZWave,MiniCULs,Shelly

yersinia

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?
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

Bartimaus

#81
@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
LG
B.


FHEM@Intel-J4105@Debian-LXC, CUL1101,FS20,IT,DS18B20,DS2413(Heizungslogger),DS2423(Stromlogger)Homematic,HM-LAN,ZWave,MiniCULs,Shelly

Bartimaus

#82
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 ?  ::)
LG
B.


FHEM@Intel-J4105@Debian-LXC, CUL1101,FS20,IT,DS18B20,DS2413(Heizungslogger),DS2423(Stromlogger)Homematic,HM-LAN,ZWave,MiniCULs,Shelly

yersinia

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



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.
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

Bartimaus

#84
Moin,

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

Hier mal die von mir verwendete Definition:

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


FHEM@Intel-J4105@Debian-LXC, CUL1101,FS20,IT,DS18B20,DS2413(Heizungslogger),DS2423(Stromlogger)Homematic,HM-LAN,ZWave,MiniCULs,Shelly

yersinia

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

Bartimaus

Danke, erledigt.

Kannst Du mit einfachen Worten kurz sagen, was das optimieren der replacementvalues bewirkt ?
LG
B.


FHEM@Intel-J4105@Debian-LXC, CUL1101,FS20,IT,DS18B20,DS2413(Heizungslogger),DS2423(Stromlogger)Homematic,HM-LAN,ZWave,MiniCULs,Shelly

yersinia

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

sash.sc

Hallo zusammen.

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

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.
Raspi 4B+ Bullseye ;LaCrosse; HomeMatic; MapleCUL; ZigBee; Signalduino ESP32 ; Shellys; MQTT2; Grafana mit Influxdb

TomLee

Das dafür bereitgestellte Template (setter attrTemplate) hast du ausprobiert und klappt nicht ?