Abfrage Heizölpreis HTTPMOD

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

Vorheriges Thema - Nächstes Thema

Bartimaus

Ich habe mir mal erlaubt, mir die Abfrage in "stateFormat" durch ChatGPT erläutern zu lassen....

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

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

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

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

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

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

Aktuell wird mir aber kein Preis geliefert, weil die Tankmenge momentan unter dem Bestellminimum liegt, und/oder ich zu oft die Werte abgefragt habe
LG
B.


FHEM@AMD-Ryzen7-5825U@Debian-LXC (ProxmoxHOST), CUL1101,FS20,IT,DS18B20,DS2413(Heizungslogger),DS2423(Stromlogger)Homematic,HM-LAN,ZWave,MiniCULs,Shelly

TomLee

#121
Handarbeit, mit etwas FHEM-Erfahrung:

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

    my $link = qq(https://www.heizoel24.de/heizoel/angebotsliste?zipCode=$zip&amp;amount=$amount&amp;stations=$stations&amp;product=1);
   
    return sprintf(
    q(<div style="text-align: left;">%s: <a href="%s" rel="noopener noreferrer" target="_blank" style="font-weight:bold">%.2f€</a>/100l (%sL = %.2f€)</div>),$lastcheck,$link,$oilprice,$amount,$price);
}

Bartimaus

Deins habe ich mal getestet.... wenn ich auf den Link im State klicke, werde ich ordnungsgemäß zu Heizoel24 weitergeleitet, und bekomme einen Preis mit meinen Eingabeparametern, wird aber im State/Readings nicht angezeigt, stattdessen 0,0€.

LG
B.


FHEM@AMD-Ryzen7-5825U@Debian-LXC (ProxmoxHOST), CUL1101,FS20,IT,DS18B20,DS2413(Heizungslogger),DS2423(Stromlogger)Homematic,HM-LAN,ZWave,MiniCULs,Shelly

Bartimaus

Sorry, aber bei mir wird nur ein Heizölpreis abgefragt, wenn ich im im replacement02Value einen festen numerischen Wert eintrage. Mit einem Reading funktioniert es nicht.

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



LG
B.


FHEM@AMD-Ryzen7-5825U@Debian-LXC (ProxmoxHOST), CUL1101,FS20,IT,DS18B20,DS2413(Heizungslogger),DS2423(Stromlogger)Homematic,HM-LAN,ZWave,MiniCULs,Shelly

TomLee

Mein gezeigtes Kunsthandwerk ersetzt 1:1 das stateFormat aus dem Template.

Das musst natürlich auch anpassen.


Bartimaus

Wie ich schrieb.... StateFormat ist nicht das Problem....

LG
B.


FHEM@AMD-Ryzen7-5825U@Debian-LXC (ProxmoxHOST), CUL1101,FS20,IT,DS18B20,DS2413(Heizungslogger),DS2423(Stromlogger)Homematic,HM-LAN,ZWave,MiniCULs,Shelly

yersinia

#126
Ruf mal den generierten Link auf
https://www.heizoel24.de/DailyPriceXml.ashx?zipcode=40477&litre=4000&unloadingpoints=1&oilgrade=standardWenn du mehr als drei Anfragen innerhalb von drei Stunden machst, bekommst du
Zitat"Sie haben in den letzten 180 Minuten mehr als 3 Mal die Preise abgefragt. Bitte versuchen Sie es später erneut."
als Rückmeldung.
Ich würde das Abfrageintervall testhalber reduzieren erhöhen.
viele Grüße, yersinia
----
FHEM 6.4 (SVN) on RPi 4B with RasPi OS Bookworm (perl 5.36.0) | 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

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

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

CN.Blaubrenner:Bestellmenge

oder

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

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

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

Über Deinen Link bekomme ich:

404771982,8784,3087,35

Hier das List meines Devices:

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

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

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

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

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

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

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

   timeout    10
   userReadings Bestellmenge {(ReadingsNum("CN.Blaubrenner","Tankvolumen",0)-ReadingsNum("CN.Blaubrenner","appTanklevel",0))},
Fuellkosten {sprintf("%.2f",ReadingsNum("Heizoel_esyoil","Bestellmenge",0)/100*ReadingsNum("Heizoel_esyoil","Heizoelpreis",0))},
Fuellstand {sprintf("%.2f", ReadingsNum("CN.Blaubrenner","appTanklevel",0))}
   userattr   replacement03Value:1,2,3,4,5,6,7,8,9,10
   webCmd     reread
LG
B.


FHEM@AMD-Ryzen7-5825U@Debian-LXC (ProxmoxHOST), CUL1101,FS20,IT,DS18B20,DS2413(Heizungslogger),DS2423(Stromlogger)Homematic,HM-LAN,ZWave,MiniCULs,Shelly

yersinia

#128
Zitat von: Bartimaus am 15 Dezember 2025, 17:21:02ich bekomme ja einen Preis..... aber NUR wenn ich im replacement02Value einen Wert von z.B. 3000 eintrage.
Trage ich dort (wie in der Hilfe beschrieben)

CN.Blaubrenner:Bestellmenge

oder

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

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

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

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

Darüber hinaus würde ich die Bestellmenge auf mindestens 1000(l) setzen und auf ganze 100er aufrunden bevor du anfragst.
   2025-12-15 18:23:16   Bestellmenge    36
viele Grüße, yersinia
----
FHEM 6.4 (SVN) on RPi 4B with RasPi OS Bookworm (perl 5.36.0) | 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