Autor Thema: [gelöst]HTTPMOD mit Oexpr  (Gelesen 434 mal)

Offline privat58

  • Jr. Member
  • **
  • Beiträge: 90
[gelöst]HTTPMOD mit Oexpr
« am: 21 September 2022, 11:08:12 »
Hallo,
ich lese den Strompreis täglich über die entsoe API per HTTPMOD. Das funktioniert gut.
Der Strompreis wird in EUR/MWh ausgelesen.
Da ich gern den Pris aber in schwedischen Oere brauche, muss dieser noch umgewandelt werden.
Den aktuellen Kurs Euro-schwedische Krone lese ich per HTTPMOD von fcsapi.com aus und erhalte da ein aktuelles reading.
Meine Frage ist, kann ich den ausgelesenen Strompreis per "readingOExpr" mit einem anderen reading rechnen?
z.Bsp. $val   *   [Kurs_EUR_SEK:EURSEK]  /10 damit würde ich auf den Preis von Oere/kWh kommen.
   reading01Format %.2f
   reading01Name abs_00_amount
   reading01Regex position>1<\Sposition>\n\t*<price\Samount>([¨0-9]+[0-9\.]+)

Danke erst einmal
« Letzte Änderung: 21 September 2022, 22:44:46 von privat58 »

Offline Gisbert

  • Hero Member
  • *****
  • Beiträge: 2806
  • Das Ziel ist das Ziel !
Antw:HTTPMOD mit Oexpr
« Antwort #1 am: 21 September 2022, 13:10:04 »
Hallo privat58,

kannst du die gesamte Definition deines Devices hier posten? Welche Preise sind das, deutsche, europäische, was ist es genau, was abgefragt wird? Das würde mich interessieren, und zweitens ist es wahrscheinlich einfacher dir dann Hilfe zu geben.

Vom Grundsatz her, kann man verschiedene URLs in einem Device abfragen; man ist nicht auf die URL beschränkt, die in der Definition des Devices benutzt wird.

Ich kann dir nur ein Beispiel geben, aber nicht erklären, warum und wie es genau funktioniert, es handelt sich um die Abfrage von Spritpreisen an 6 verschiedenen Tankstellen, somit 6 verschiedene URLs.

defmod Premiumdiesel HTTPMOD https://www.clever-tanken.de/tankstelle_details/9456 600
attr Premiumdiesel userattr stateFormat timeout
attr Premiumdiesel alias <b>Premium</b>
attr Premiumdiesel alignTime 00:07:07
attr Premiumdiesel comment Spritpreis mit Zehntel Centwerten:\
https://forum.fhem.de/index.php/topic,99939.msg933890.html#msg933890
attr Premiumdiesel enableControlSet 1
attr Premiumdiesel get02Name Aral_Leverkusen_Willy_Brandt_20
attr Premiumdiesel get02OExpr $val =~ s/<[\d\D]+>//;;;;$val
attr Premiumdiesel get02Poll 1
attr Premiumdiesel get02Regex "price-type-name">ARAL Ultimate Diesel</div>[\d\D]{700,900}"current-price-.">([0-9\.]+[^0-9]+suffix-price-.">[0-9])
attr Premiumdiesel get02URL https://www.clever-tanken.de/tankstelle_details/1320
attr Premiumdiesel get03Name Aral_Leverkusen_Willy_Brandt_101
attr Premiumdiesel get03OExpr $val =~ s/<[\d\D]+>//;;;;$val
attr Premiumdiesel get03Poll 1
attr Premiumdiesel get03Regex "price-type-name">ARAL Ultimate Diesel</div>[\d\D]{700,900}"current-price-.">([0-9\.]+[^0-9]+suffix-price-.">[0-9])
attr Premiumdiesel get03URL https://www.clever-tanken.de/tankstelle_details/27643
attr Premiumdiesel get04Name Aral_Koeln_Oskar_Schindlerstr
attr Premiumdiesel get04OExpr $val =~ s/<[\d\D]+>//;;;;$val
attr Premiumdiesel get04Poll 1
attr Premiumdiesel get04Regex "price-type-name">ARAL Ultimate Diesel</div>[\d\D]{700,900}"current-price-.">([0-9\.]+[^0-9]+suffix-price-.">[0-9])
attr Premiumdiesel get04URL https://www.clever-tanken.de/tankstelle_details/45766
attr Premiumdiesel get05Name Aral_Koeln_Bergisch_Gladbacher_Str
attr Premiumdiesel get05OExpr $val =~ s/<[\d\D]+>//;;;;$val
attr Premiumdiesel get05Poll 1
attr Premiumdiesel get05Regex "price-type-name">ARAL Ultimate Diesel</div>[\d\D]{700,900}"current-price-.">([0-9\.]+[^0-9]+suffix-price-.">[0-9])
attr Premiumdiesel get05URL https://www.clever-tanken.de/tankstelle_details/3363
attr Premiumdiesel get06Name Total_Leverkusen_Berliner_Str
attr Premiumdiesel get06OExpr $val =~ s/<[\d\D]+>//;;;;$val
attr Premiumdiesel get06Poll 1
attr Premiumdiesel get06Regex "price-type-name">Excellium Diesel</div>[\d\D]{700,900}"current-price-.">([0-9\.]+[^0-9]+suffix-price-.">[0-9])
attr Premiumdiesel get06URL https://www.clever-tanken.de/tankstelle_details/4969
attr Premiumdiesel group Dieselpreise
attr Premiumdiesel icon fuel
attr Premiumdiesel reading01Name Shell_Leverkusen
attr Premiumdiesel reading01OExpr $val =~ s/<[\d\D]+>//;;;;$val
attr Premiumdiesel reading01Regex "price-type-name">Shell V-Power Diesel</div>[\d\D]{700,900}"current-price-.">([0-9\.]+[^0-9]+suffix-price-.">[0-9])
attr Premiumdiesel reading02Name Aral_Leverkusen_Willy_Brandt
attr Premiumdiesel reading02OExpr $val =~ s/<[\d\D]+>//;;;;$val
attr Premiumdiesel room Strassenverkehr
attr Premiumdiesel sortby 1
attr Premiumdiesel stateFormat {'<div style="font-size: 92%;;">Aral Willy-Brandt-Ring 20: '.substr(ReadingsVal($name,'Aral_Leverkusen_Willy_Brandt_20',''),0,4).'<span style="vertical-align: +6px;; font-size: 75%;;">'.substr(ReadingsVal($name,'Aral_Leverkusen_Willy_Brandt_20',''),4,1).'</span> €/L'.'<br/>'.\
'Aral Willy-Brandt-Ring 101: '.substr(ReadingsVal($name,'Aral_Leverkusen_Willy_Brandt_101',''),0,4).'<span style="vertical-align: +6px;; font-size: 75%;;">'.substr(ReadingsVal($name,'Aral_Leverkusen_Willy_Brandt_101',''),4,1).'</span> €/L'.'<br/>'.\
'Shell Willy-Brandt-Ring: '.substr(ReadingsVal($name,'Shell_Leverkusen',''),0,4).'<span style="vertical-align: +6px;; font-size: 75%;;">'.substr(ReadingsVal($name,'Shell_Leverkusen',''),4,1).'</span> €/L'.'<br/>'.\
'Total Berliner Str. 25: '.substr(ReadingsVal($name,'Total_Leverkusen_Berliner_Str',''),0,4).'<span style="vertical-align: +6px;; font-size: 75%;;">'.substr(ReadingsVal($name,'Total_Leverkusen_Berliner_Str',''),4,1).'</span> €/L'.'<br/>'.\
'Aral Köln Oskar-Schindlerstr.: '.substr(ReadingsVal($name,'Aral_Koeln_Oskar_Schindlerstr',''),0,4).'<span style="vertical-align: +6px;; font-size: 75%;;">'.substr(ReadingsVal($name,'Aral_Koeln_Oskar_Schindlerstr',''),4,1).'</span> €/L'.'<br/>'.\
'Aral Köln Berg.-Gladbacher-Str.: '.substr(ReadingsVal($name,'Aral_Koeln_Bergisch_Gladbacher_Str',''),0,4).'<span style="vertical-align: +6px;; font-size: 75%;;">'.substr(ReadingsVal($name,'Aral_Koeln_Bergisch_Gladbacher_Str',''),4,1).'</span> €/L</div>'}
attr Premiumdiesel timeout 15
attr Premiumdiesel userReadings Zeitstempel {substr(ReadingsTimestamp($name,'STATE',''),0,16)}
attr Premiumdiesel verbose 2

Viele Grüße Gisbert
Aktuelles FHEM | HP ThinClient T610 | Debian11 | UniFi-Controller, AP, USG-3 | Homematic, VCCU, HMUART | ESP8266, Eigenbau | Gas-, Wasser-, Stromzähler | Sonoff | 1-Wire-Temperatursensoren | Wlan-Kamera | SIGNALduino, Flamingo Rauchmelder FA21/22RF |  Heizungssteuerung komplett in FHEM

Offline privat58

  • Jr. Member
  • **
  • Beiträge: 90
Antw:HTTPMOD mit Oexpr
« Antwort #2 am: 21 September 2022, 15:54:24 »
Ich habe drei devices angelegt (Strompreis gestern, heute und morgen ab 14:00Uhr)
defmod entsoe_price_today HTTPMOD https://transparency.entsoe.eu/api?securityToken=%%token%%&documentType=A44&in_Domain=10Y1001A1001A46L&out_Domain=10Y1001A1001A46L&periodStart=%%yesterday%%2300&periodEnd=%%today%%2300 86400
attr entsoe_price_today alignTime 00:00:01
attr entsoe_price_today comment token: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
www:https://transparency.entsoe.eu/api?securityToken=c7029ffa-542d-404a-a18c-8fb1ac2eeecf&documentType=A44&in_Domain=10Y1001A1001A46L&out_Domain=10Y1001A1001A46L&periodStart=202209130000&periodEnd=202209132300
attr entsoe_price_today event-on-change-reading .*
attr entsoe_price_today reading01Format %.1f
attr entsoe_price_today reading01Name abs_00_amount
attr entsoe_price_today reading01Regex position>1<\Sposition>\n\t*<price\Samount>([¨0-9]+[0-9\.]+)
attr entsoe_price_today reading02Name abs_01_amount
attr entsoe_price_today reading02Regex position>2<\Sposition>\n\t*<price\Samount>([¨0-9]+[0-9\.]+)
attr entsoe_price_today reading03Name abs_02_amount
attr entsoe_price_today reading03Regex position>3<\Sposition>\n\t*<price\Samount>([¨0-9]+[0-9\.]+)
attr entsoe_price_today reading04Name abs_03_amount
attr entsoe_price_today reading04Regex position>4<\Sposition>\n\t*<price\Samount>([¨0-9]+[0-9\.]+)
attr entsoe_price_today reading05Name abs_04_amount
attr entsoe_price_today reading05Regex position>5<\Sposition>\n\t*<price\Samount>([¨0-9]+[0-9\.]+)
attr entsoe_price_today reading06Name abs_05_amount
attr entsoe_price_today reading06Regex position>6<\Sposition>\n\t*<price\Samount>([¨0-9]+[0-9\.]+)
attr entsoe_price_today reading07Name abs_06_amount
attr entsoe_price_today reading07Regex position>7<\Sposition>\n\t*<price\Samount>([¨0-9]+[0-9\.]+)
attr entsoe_price_today reading08Name abs_07_amount
attr entsoe_price_today reading08Regex position>8<\Sposition>\n\t*<price\Samount>([¨0-9]+[0-9\.]+)
attr entsoe_price_today reading09Name abs_08_amount
attr entsoe_price_today reading09Regex position>9<\Sposition>\n\t*<price\Samount>([¨0-9]+[0-9\.]+)
attr entsoe_price_today reading10Name abs_09_amount
attr entsoe_price_today reading10Regex position>10<\Sposition>\n\t*<price\Samount>([¨0-9]+[0-9\.]+)
attr entsoe_price_today reading11Name abs_10_amount
attr entsoe_price_today reading11Regex position>11<\Sposition>\n\t*<price\Samount>([¨0-9]+[0-9\.]+)
attr entsoe_price_today reading12Name abs_11_amount
attr entsoe_price_today reading12Regex position>12<\Sposition>\n\t*<price\Samount>([¨0-9]+[0-9\.]+)
attr entsoe_price_today reading13Name abs_12_amount
attr entsoe_price_today reading13Regex position>13<\Sposition>\n\t*<price\Samount>([¨0-9]+[0-9\.]+)
attr entsoe_price_today reading14Name abs_13_amount
attr entsoe_price_today reading14Regex position>14<\Sposition>\n\t*<price\Samount>([¨0-9]+[0-9\.]+)
attr entsoe_price_today reading15Name abs_14_amount
attr entsoe_price_today reading15Regex position>15<\Sposition>\n\t*<price\Samount>([¨0-9]+[0-9\.]+)
attr entsoe_price_today reading16Name abs_15_amount
attr entsoe_price_today reading16Regex position>16<\Sposition>\n\t*<price\Samount>([¨0-9]+[0-9\.]+)
attr entsoe_price_today reading17Name abs_16_amount
attr entsoe_price_today reading17Regex position>17<\Sposition>\n\t*<price\Samount>([¨0-9]+[0-9\.]+)
attr entsoe_price_today reading18Name abs_17_amount
attr entsoe_price_today reading18Regex position>18<\Sposition>\n\t*<price\Samount>([¨0-9]+[0-9\.]+)
attr entsoe_price_today reading19Name abs_18_amount
attr entsoe_price_today reading19Regex position>19<\Sposition>\n\t*<price\Samount>([¨0-9]+[0-9\.]+)
attr entsoe_price_today reading20Name abs_19_amount
attr entsoe_price_today reading20Regex position>20<\Sposition>\n\t*<price\Samount>([¨0-9]+[0-9\.]+)
attr entsoe_price_today reading21Name abs_20_amount
attr entsoe_price_today reading21Regex position>21<\Sposition>\n\t*<price\Samount>([¨0-9]+[0-9\.]+)
attr entsoe_price_today reading22Name abs_21_amount
attr entsoe_price_today reading22Regex position>22<\Sposition>\n\t*<price\Samount>([¨0-9]+[0-9\.]+)
attr entsoe_price_today reading23Name abs_22_amount
attr entsoe_price_today reading23Regex position>23<\Sposition>\n\t*<price\Samount>([¨0-9]+[0-9\.]+)
attr entsoe_price_today reading24Name abs_23_amount
attr entsoe_price_today reading24Regex position>24<\Sposition>\n\t*<price\Samount>([¨0-9]+[0-9\.]+)
attr entsoe_price_today replacement01Mode text
attr entsoe_price_today replacement01Regex %%token%%
attr entsoe_price_today replacement01Value <token>
attr entsoe_price_today replacement02Mode expression
attr entsoe_price_today replacement02Regex %%today%%
attr entsoe_price_today replacement02Value {strftime("%Y%m%d", localtime( time))}
attr entsoe_price_today replacement03Mode expression
attr entsoe_price_today replacement03Regex %%yesterday%%
attr entsoe_price_today replacement03Value {strftime("%Y%m%d", localtime(time-86400))}
attr entsoe_price_today room Energie
attr entsoe_price_today stateFormat entsoe_price_now
attr entsoe_price_today verbose 0
Das funktioniert gut, man kann eventuell den Code abkürzen, das scheitert aber an meinem begrenzten Programmier-Wissen.
Die Preise sind von Brüssel auf Eurobasis für alle möglichen Länder-Netze verfügbar.
Grüße von hier oben.

Offline mr_petz

  • Hero Member
  • *****
  • Beiträge: 1112
Antw:HTTPMOD mit Oexpr
« Antwort #3 am: 21 September 2022, 18:12:16 »
Hi,
Du könntest es so lösen mit userreading (Reading muss eine Zahl ohne Einheit sein!):
attr entsoe_price_today userReadings oere_abs_00_amount { ReadingsVal($name,'abs_00_amount',0)*ReadingsVal('KursDevice','KursReading',0)}
oder
attr entsoe_price_today userReadings oere_abs_00_amount { ReadingsVal($name,'abs_00_amount',0)*11}
Stand Heute:
1 EUR = 10,8338 SEK

Edit:
Hinweis. Die Preise sind für eine MWH. Oder sehe ich da was verkehrt?

<price_Measure_Unit.name>MWH</price_Measure_Unit.name>
LG mr_petz
« Letzte Änderung: 21 September 2022, 18:31:05 von mr_petz »

Offline OdfFhem

  • Hero Member
  • *****
  • Beiträge: 1167
Antw:HTTPMOD mit Oexpr
« Antwort #4 am: 21 September 2022, 19:00:04 »
@privat58

Folgende, allgemeine Attribut-Definition könnte helfen:
attr entsoe_price_today readingOExpr $val * ReadingsVal('Kurs_EUR_SEK','EURSEK',0) / 10

Offline mr_petz

  • Hero Member
  • *****
  • Beiträge: 1112
Antw:HTTPMOD mit Oexpr
« Antwort #5 am: 21 September 2022, 20:26:22 »
@OdfFhem

Wieso eigentlich durch 10?
mwh in kwh ist durch 1000.!?

Offline privat58

  • Jr. Member
  • **
  • Beiträge: 90
Antw:HTTPMOD mit Oexpr
« Antwort #6 am: 21 September 2022, 22:43:23 »
Erst einmal vielen Dank. An userreading hatte ich auch erst gedacht, wäre aber so etwas wie unnötige doppelte readings.
OdfFhem hat voll ins schwarze getroffen, konnte es genau so übernehmen.
Ich habe dann noch ein "attr reading01Format %.2f" gesetzt um das ganze auf zwei Nachkommastellen zu begrenzen.
Zur Frage der Umrechnung, der Strompreis wird von entsoe in EUR/MWh ausgelesen. Da ich ihn aber in Oere brauche und nicht in Kronen rechne ich nicht erst durch 1000 und dann wieder mal 100.
Vielen Dank