Hallo, ich habe schon seit einiger Zeit immer mal wieder das Problem, das bei meinen Tankstellen-Devices, die per HHTMOD von Clever-Tanken die aktuellen Preise auslesen an einzelnen Tankstellen immer mal wieder nur eine 0 ausgelesen wird. Das verhaut mir natürlich dann auch alle Statistic-Berechnungen und führt somit zu Falschbenachrichtigungen.
Ich habe schon ein paar Sachen ausprobiert aber bekomme den Fehler einfach nicht ausgemerzt.
Aktuelle Lösung (laut Netz/KI-Recherge):
reading08OExpr
{ ($val < 1) ? ReadingsVal($name,"Diesel-1",0) : $val }
Dazu noch Versucht im Filelog die 0-Werte nicht mitzuloggen.
Hier noch eins der Devices (sind alle iedentisch):
Internals:
BUSY 0
DEF https://www.clever-tanken.de/tankstelle_details/15360 600
FUUID 69d76140-f33f-7706-a7d6-12051dc493774932
FVERSION 98_HTTPMOD.pm:0.291590/2024-09-23
Interval 600
MainURL https://www.clever-tanken.de/tankstelle_details/15360
ModuleVersion 4.2.0 - 11.8.2023
NAME Tankstelle_HSe_ARAL_Roermonderstr
NOTIFYDEV global
NR 588
NTFY_ORDER 50-Tankstelle_HSe_ARAL_Roermonderstr
STATE Super E5: 0.01 € * Super E10: 0.01 € * Super Plus: 0.01 € * Diesel: 0.01 €
TYPE HTTPMOD
eventCount 4798
value
CompiledRegexes:
HTTPCookieHash:
csrftoken;:
Name csrftoken
Options expires=Sun, 30 May 2027 14:59:47 GMT; Max-Age=31449600; Path=/; SameSite=Lax
Path
Value k4JmswBEcTxSBI6FDGz09aL5gSVOm2x5
HttpUtils:
NAME
addr https://www.clever-tanken.de:443
auth 0
data
displayurl https://www.clever-tanken.de/tankstelle_details/15360
header Cookie: csrftoken=k4JmswBEcTxSBI6FDGz09aL5gSVOm2x5
host www.clever-tanken.de
httpversion 1.0
ignoreredirects 1
loglevel 4
path /tankstelle_details/15360
protocol https
redirects 0
timeout 10
url https://www.clever-tanken.de/tankstelle_details/15360
sslargs:
QUEUE:
READINGS:
2026-05-31 17:39:55 Bioethanol_avg 0
2026-05-31 17:39:55 Bioethanol_complete 0
2026-05-31 17:39:55 Bioethanol_old -
2026-05-31 17:39:55 CNG_avg 0
2026-05-31 17:39:55 CNG_complete 0
2026-05-31 17:39:55 CNG_old -
2026-05-31 17:39:55 Diesel_avg 1.92
2026-05-31 17:39:55 Diesel_complete 0
2026-05-31 17:39:55 Diesel_old -
2026-05-31 17:39:55 LNG_avg 0
2026-05-31 17:39:55 LNG_complete 0
2026-05-31 17:39:55 LNG_old -
2026-05-31 17:39:55 LPG_avg 1.14
2026-05-31 17:39:55 LPG_complete 0
2026-05-31 17:39:55 LPG_old -
2026-05-31 17:39:55 SuperE10_avg 1.93
2026-05-31 17:39:55 SuperE10_complete 0
2026-05-31 17:39:55 SuperE10_old -
2026-05-31 17:29:55 SuperE5_avg 1.21
2026-05-31 17:39:55 SuperE5_complete 0
2026-05-31 17:39:55 SuperE5_old -
2026-05-31 17:19:55 SuperPlus_avg 1.06
2026-05-31 17:39:55 SuperPlus_complete 0
2026-05-31 17:39:55 SuperPlus_old -
2026-05-31 17:39:55 Wasserstoff_avg 0
2026-05-31 17:39:55 Wasserstoff_complete 0
2026-05-31 17:39:55 Wasserstoff_old -
REQUEST:
context reading
data
header
ignoreredirects 0
num unknown
retryCount 0
type update
url https://www.clever-tanken.de/tankstelle_details/15360
defptr:
readingBase:
readingNum:
readingOutdated:
readingSubNum:
requestReadings:
update:
Attributes:
alias ARAL in Karken (Roermonder Str.)
enableControlSet 1
event-min-interval .*:1800
event-on-change-reading .*
group Informationen
icon fuel
model clever_tanken_single_station
reading01Name Name
reading01Regex <span class="strong-title" itemprop="name">(.*)</span>
reading02Name Strasse
reading02Regex <span itemprop="streetAddress">(.*)</span>
reading03Name PLZ
reading03Regex <span itemprop="http://schema.org/postalCode">(.*)</span>
reading04Name Ort
reading04Regex <span itemprop="http://schema.org/addressCountry">(.*)</span>
reading05Name open_days
reading05RegOpt g
reading05Regex <div class="d-flex justify-content-between weak-body">\s*<span>\s*(.*)<\/span>
reading06Name open_hours
reading06RegOpt g
reading06Regex <div class="d-flex justify-content-between weak-body">\s*<span>\s*.*<\/span>\s*<span>\s*(.*)<\/span>
reading07Name last_update
reading07Regex <span>Letzte Aktualisierung: (.*)</span>
reading08Name Diesel
reading08OExpr { ($val < 1) ? ReadingsVal($name,"Diesel-1",0) : $val }
reading08Regex <div[^>]*class="price-type-name"[^>]*>Diesel<\/div>[\s\S]*?<span[^>]*id="current-price-\d+"[^>]*>([\d.]+)<\/span>[\s\S]*?<sup[^>]*id="suffix-price-\d+"[^>]*>(\d+)<\/sup>
reading09Name SuperE10
reading09OExpr { ($val < 1) ? ReadingsVal($name,"SuperE10-1",0) : $val }
reading09Regex <div[^>]*class="price-type-name"[^>]*>Super E10<\/div>[\s\S]*?<span[^>]*id="current-price-\d+"[^>]*>([\d.]+)<\/span>[\s\S]*?<sup[^>]*id="suffix-price-\d+"[^>]*>(\d+)<\/sup>
reading10Name SuperE5
reading10OExpr { ($val < 1) ? ReadingsVal($name,"SuperE5-1",0) : $val }
reading10Regex <div[^>]*class="price-type-name"[^>]*>Super E5<\/div>[\s\S]*?<span[^>]*id="current-price-\d+"[^>]*>([\d.]+)<\/span>[\s\S]*?<sup[^>]*id="suffix-price-\d+"[^>]*>(\d+)<\/sup>
reading11Name SuperPlus
reading11OExpr { ($val < 1) ? ReadingsVal($name,"SuperPlus-1",0) : $val }
reading11Regex <div[^>]*class="price-type-name"[^>]*>ARAL Superplus<\/div>[\s\S]*?<span[^>]*id="current-price-\d+"[^>]*>([\d.]+)<\/span>[\s\S]*?<sup[^>]*id="suffix-price-\d+"[^>]*>(\d+)<\/sup>
reading12Name LPG
reading12OExpr { ($val < 1) ? ReadingsVal($name,"LPG-1",0) : $val }
reading12Regex <div[^>]*class="price-type-name"[^>]*>LPG<\/div>[\s\S]*?<span[^>]*id="current-price-\d+"[^>]*>([\d.]+)<\/span>[\s\S]*?<sup[^>]*id="suffix-price-\d+"[^>]*>(\d+)<\/sup>
reading13Name LNG
reading13OExpr { ($val < 1) ? ReadingsVal($name,"LNG-1",0) : $val }
reading13Regex <div[^>]*class="price-type-name"[^>]*>LNG<\/div>[\s\S]*?<span[^>]*id="current-price-\d+"[^>]*>([\d.]+)<\/span>[\s\S]*?<sup[^>]*id="suffix-price-\d+"[^>]*>(\d+)<\/sup>
reading14Name CNG
reading14OExpr { ($val < 1) ? ReadingsVal($name,"CNG-1",0) : $val }
reading14Regex <div[^>]*class="price-type-name"[^>]*>CNG<\/div>[\s\S]*?<span[^>]*id="current-price-\d+"[^>]*>([\d.]+)<\/span>[\s\S]*?<sup[^>]*id="suffix-price-\d+"[^>]*>(\d+)<\/sup>
reading15Name Bioethanol
reading15OExpr { ($val < 1) ? ReadingsVal($name,"Bioethanol-1",0) : $val }
reading15Regex <div[^>]*class="price-type-name"[^>]*>Bioethanol<\/div>[\s\S]*?<span[^>]*id="current-price-\d+"[^>]*>([\d.]+)<\/span>[\s\S]*?<sup[^>]*id="suffix-price-\d+"[^>]*>(\d+)<\/sup>
reading16Name Wasserstoff
reading16OExpr { ($val < 1) ? ReadingsVal($name,"Wasserstoff-1",0) : $val }
reading16Regex <div[^>]*class="price-type-name"[^>]*>Wasserstoff<\/div>[\s\S]*?<span[^>]*id="current-price-\d+"[^>]*>([\d.]+)<\/span>[\s\S]*?<sup[^>]*id="suffix-price-\d+"[^>]*>(\d+)<\/sup>
readingMaxAge 5
readingMaxAgeReplacementMode delete
readingOExpr $val =~ s/<[\d\D]+>//;;$val
room Information->Spritpreise
stateFormat {
sprintf("Super E5: %.2f € * Super E10: %.2f € * Super Plus: %.2f € * Diesel: %.2f €",
ReadingsNum($name,"SuperE5-1",0) + 0.01,
ReadingsNum($name,"SuperE10-1",0) + 0.01,
ReadingsNum($name,"SuperPlus-1",0) + 0.01,
ReadingsNum($name,"Diesel-1",0) + 0.01
)
}
timeout 10
timestamp-on-change-reading .*
userReadings Diesel_old { OldReadingsVal($name,"Diesel-1", ReadingsVal($name,"Diesel-1","-")) },
SuperE5_old { OldReadingsVal($name,"SuperE5-1", ReadingsVal($name,"SuperE5-1","-")) },
SuperE10_old { OldReadingsVal($name,"SuperE10-1", ReadingsVal($name,"SuperE10-1","-")) },
SuperPlus_old { OldReadingsVal($name,"SuperPlus-1", ReadingsVal($name,"SuperPlus-1","-")) },
LPG_old { OldReadingsVal($name,"LPG-1", ReadingsVal($name,"LPG-1","-")) },
LNG_old { OldReadingsVal($name,"LNG-1", ReadingsVal($name,"LNG-1","-")) },
CNG_old { OldReadingsVal($name,"CNG-1", ReadingsVal($name,"CNG-1","-")) },
Bioethanol_old { OldReadingsVal($name,"Bioethanol-1", ReadingsVal($name,"Bioethanol-1","-")) },
Wasserstoff_old { OldReadingsVal($name,"Wasserstoff-1", ReadingsVal($name,"Wasserstoff-1","-")) },
Diesel_complete { ReadingsNum($name,"Diesel-1", 0) + (ReadingsNum($name,"Diesel-2", 0) / 1000) },
SuperE5_complete { ReadingsNum($name,"SuperE5-1", 0) + (ReadingsNum($name,"SuperE5-2", 0) / 1000) },
SuperE10_complete { ReadingsNum($name,"SuperE10-1", 0) + (ReadingsNum($name,"SuperE10-2", 0) / 1000) },
SuperPlus_complete { ReadingsNum($name,"SuperPlus-1", 0) + (ReadingsNum($name,"SuperPlus-2", 0) / 1000) },
LPG_complete { ReadingsNum($name,"LPG-1", 0) + (ReadingsNum($name,"LPG-2", 0) / 1000) },
LNG_complete { ReadingsNum($name,"LNG-1", 0) + (ReadingsNum($name,"LNG-2", 0) / 1000) },
CNG_complete { ReadingsNum($name,"CNG-1", 0) + (ReadingsNum($name,"CNG-2", 0) / 1000) },
Bioethanol_complete { ReadingsNum($name,"Bioethanol-1", 0) + (ReadingsNum($name,"Bioethanol-2", 0) / 1000) },
Wasserstoff_complete { ReadingsNum($name,"Wasserstoff-1", 0) + (ReadingsNum($name,"Wasserstoff-2", 0) / 1000) },
Diesel_avg { ReadingsVal("Diesel","Durchschnitt","0") },
SuperE5_avg { ReadingsVal("SuperE5","Durchschnitt","0") },
SuperE10_avg { ReadingsVal("SuperE10","Durchschnitt","0") },
SuperPlus_avg { ReadingsVal("SuperPlus","Durchschnitt","0") },
LPG_avg { ReadingsVal("LPG","Durchschnitt","0") },
LNG_avg { ReadingsVal("LNG","Durchschnitt","0") },
CNG_avg { ReadingsVal("CNG","Durchschnitt","0") },
Bioethanol_avg { ReadingsVal("Bioethanol","Durchschnitt","0") },
Wasserstoff_avg { ReadingsVal("Wasserstoff","Durchschnitt","0") },
userattr
verbose 3
Ich weiß, dass es inzwischen auch eine API über Tankerkönig gibt, doch 1) liefert die nicht alle Daten die ich suche und 2) weiß ich nicht wie man aus einer API Daten ausliest und 3) handelt es sich wenn dann auch nur um ein HTTPMOD soweit ich das nachgelesen habe.
Daher wäre mir lieber eine Lösung über Clever-Tanken wo dann beim Auslesen sichergestellt wird, dass einfach keine 0 zurückgegeben werden kann oder in einem solchen Fall der alte Wert beibehalten wird.
Hi
Bist du sicher, dass nur immer mal wieder 0 in deinen Readings steht?
Von den 16 definierten (HTTPMOD) Readings ist aus meiner Sicht kein Einziges im list - lediglich deine Userreadings.
Gruß Ralf
Hi,
es gibt da für HTTPMOD ein paar attrTemplate vielleicht kann man die als Grundlage nehmen und dann das Device anpassen.
Ich sehe zumindest kein Reading mit dem Namen "Diesel-1". Damit wird ReadingsVal($name,"Diesel-1",0) immer null ergeben, wobei dann auch wieder die Verwendung von ReadingsVal() fragwürdig ist - siehe ReadingsNum()
Gruß Otto
Zitat von: Otto123 am 01 Juni 2026, 12:20:01es gibt da für HTTPMOD ein paar attrTemplate vielleicht kann man die als Grundlage nehmen und dann das Device anpassen.
ja, aber guckst Du:
Attributes:
alias ARAL in Karken (Roermonder Str.)
...
model clever_tanken_single_station
Das sieht schon sehr danach aus, dass es sich um einen Versuch mit einem template handelt 8)
aber eventuell bloß um einen ehemaligen ;) Versuch? Ich erkenne keinen Zusammenhang mit dem Inhalt des Templates
Get prices for a single gas station.
Define a HTTPMOD device like
defmod DEVICE HTTPMOD http://www.clever-tanken.de/tankstelle_details/29092 1800
Change station ID to your needs
Source: Forum
attr DEVICE userattr reading01Name reading01Regex reading02Name reading02Regex reading03Name reading03Regex reading04Name reading04Regex readingOExpr
attr DEVICE enableControlSet 1
attr DEVICE reading01Name Diesel
attr DEVICE reading01Regex
Diesel
[\S\s\r\n]*?(\d.\d{2}[\S\s\r\n]*?[\d]+)
attr DEVICE reading02Name SuperE10
attr DEVICE reading02Regex
Super E10
[\S\s\r\n]*?(\d.\d{2}[\S\s\r\n]*?[\d]+)
attr DEVICE reading03Name SuperE5
attr DEVICE reading03Regex
Super E5
[\S\s\r\n]*?(\d.\d{2}[\S\s\r\n]*?[\d]+)
attr DEVICE readingOExpr $val =~ s/<[\d\D]+>//;;$val
attr DEVICE stateFormat E5: SuperE5 € / E10: SuperE10 € / D: Diesel €
attr DEVICE timeout 10
attr DEVICE verbose 2
attr DEVICE room WHICHROOM
attr DEVICE model clever_tanken_single_station
setreading DEVICE attrTemplateVersion 20201129Zumal ja eben genau die notwendigen Readings fehlen? Insofern nochmal auf Anfang? :)
Die regEx im Device des TE sehen (gegenüber der Vorlage, die bei mir gut funktioniert) ziemlich komplex aus, da würde es mich nicht wundern, wenn Fehler beim Auslesen bei Seitenlayoutänderungen passieren.
Zitat von: RalfRog am 01 Juni 2026, 11:28:07Bist du sicher, dass nur immer mal wieder 0 in deinen Readings steht?
Ursprünglich hatte alles funktioniert, dann kam immer mal wieder ein 0-Wert zurück, letzte Woche war es dann so schlimm, dass 3 Tage am Stück nur 0 ausgegeben wurde.
Zitat von: RalfRog am 01 Juni 2026, 11:28:07Von den 16 definierten (HTTPMOD) Readings ist aus meiner Sicht kein Einziges im list - lediglich deine Userreadings
Keine Ahnung wie das kommt, das muss mit dem Fehler zu tun haben. Hier mal ein List eines zur Zeit funktionierenden Device bei dem die Readings eindeutig zu sehen sind (das einzige was anders ist ist die Tankstellennummer):
Internals:
BUSY 0
DEF https://www.clever-tanken.de/tankstelle_details/26021 600
FUUID 69d76460-f33f-7706-165d-443273b731930e6d
FVERSION 98_HTTPMOD.pm:0.291590/2024-09-23
Interval 600
MainURL https://www.clever-tanken.de/tankstelle_details/26021
ModuleVersion 4.2.0 - 11.8.2023
NAME Tankstelle_AC_SB_UebacherWeg
NOTIFYDEV global
NR 590
NTFY_ORDER 50-Tankstelle_AC_SB_UebacherWeg
STATE Super E5: 1.89 € * Super E10: 1.83 € * Super Plus: 1.98 € * Diesel: 1.81 €
TYPE HTTPMOD
eventCount 4936
value
CompiledRegexes:
HTTPCookieHash:
csrftoken;:
Name csrftoken
Options expires=Mon, 31 May 2027 16:57:27 GMT; Max-Age=31449600; Path=/; SameSite=Lax
Path
Value moIMqYSDDODsoKQm1kbsDsiXQ9XsUopo
HttpUtils:
NAME
addr https://www.clever-tanken.de:443
auth 0
code 200
compress 1
conn
data
displayurl https://www.clever-tanken.de/tankstelle_details/26021
header Cookie: csrftoken=moIMqYSDDODsoKQm1kbsDsiXQ9XsUopo
host www.clever-tanken.de
httpheader HTTP/1.1 200 OK
Date: Mon, 01 Jun 2026 16:57:27 GMT
Server: Apache/2.4.52 (Ubuntu)
Vary: Cookie,Accept-Encoding
Content-Encoding: gzip
Content-Type: text/html; charset=utf-8
Set-Cookie: csrftoken=moIMqYSDDODsoKQm1kbsDsiXQ9XsUopo; expires=Mon, 31 May 2027 16:57:27 GMT; Max-Age=31449600; Path=/; SameSite=Lax
X-Correlation-Uid: ah25951EIT5UmeGiBjmttQAAAGA
Connection: close
httpversion 1.0
hu_blocking 0
hu_filecount 1
hu_port 443
hu_portSfx
ignoreredirects 1
loglevel 4
path /tankstelle_details/26021
protocol https
redirects 0
timeout 10
url https://www.clever-tanken.de/tankstelle_details/26021
sslargs:
QUEUE:
READINGS:
2026-06-01 18:37:26 Bioethanol_avg 0
2026-06-01 18:37:26 Bioethanol_complete 0
2026-06-01 18:37:26 Bioethanol_old -
2026-06-01 18:37:26 CNG_avg 0
2026-06-01 18:37:26 CNG_complete 0
2026-06-01 18:37:26 CNG_old -
2026-06-01 18:57:26 Diesel-1 1.80
2026-06-01 18:57:26 Diesel-2 9
2026-06-01 18:57:26 Diesel_avg 1.91
2026-06-01 18:57:26 Diesel_complete 1.809
2026-06-01 18:57:26 Diesel_old 1.80
2026-06-01 18:37:26 LNG_avg 0
2026-06-01 18:37:26 LNG_complete 0
2026-06-01 18:37:26 LNG_old -
2026-06-01 18:57:26 LPG_avg 1.07
2026-06-01 18:37:26 LPG_complete 0
2026-06-01 18:37:26 LPG_old -
2026-06-01 18:57:26 Name SB
2026-06-01 18:57:26 Ort Alsdorf
2026-06-01 18:57:26 PLZ 52477
2026-06-01 18:57:26 Strasse Übacher Weg 174
2026-06-01 18:57:26 SuperE10-1 1.82
2026-06-01 18:57:26 SuperE10-2 9
2026-06-01 18:57:26 SuperE10_avg 1.91
2026-06-01 18:57:26 SuperE10_complete 1.829
2026-06-01 18:57:26 SuperE10_old 1.82
2026-06-01 18:57:26 SuperE5-1 1.88
2026-06-01 18:57:26 SuperE5-2 9
2026-06-01 18:37:26 SuperE5_avg 1.21
2026-06-01 18:57:26 SuperE5_complete 1.889
2026-06-01 18:57:26 SuperE5_old 1.88
2026-06-01 18:57:26 SuperPlus-1 1.97
2026-06-01 18:57:26 SuperPlus-2 9
2026-06-01 18:37:26 SuperPlus_avg 1.06
2026-06-01 18:57:26 SuperPlus_complete 1.979
2026-06-01 18:57:26 SuperPlus_old 1.97
2026-06-01 18:37:26 Wasserstoff_avg 0
2026-06-01 18:37:26 Wasserstoff_complete 0
2026-06-01 18:37:26 Wasserstoff_old -
2026-06-01 18:57:26 last_update 01.06.2026 18:55
2026-06-01 18:57:26 open_days-1 Samstag
2026-06-01 18:57:26 open_days-2 Sonntag
2026-06-01 18:57:26 open_days-3 Mo-Fr
2026-06-01 18:57:26 open_hours-1 7:00-22:00
2026-06-01 18:57:26 open_hours-2 7:00-22:00
2026-06-01 18:57:26 open_hours-3 7:00-22:00
REQUEST:
context reading
data
header
ignoreredirects 0
num unknown
retryCount 0
type update
url https://www.clever-tanken.de/tankstelle_details/26021
defptr:
readingBase:
Diesel-1 reading
Diesel-2 reading
Name reading
Ort reading
PLZ reading
Strasse reading
SuperE10-1 reading
SuperE10-2 reading
SuperE5-1 reading
SuperE5-2 reading
SuperPlus-1 reading
SuperPlus-2 reading
last_update reading
open_days-1 reading
open_days-2 reading
open_days-3 reading
open_hours-1 reading
open_hours-2 reading
open_hours-3 reading
readingNum:
Diesel-1 08
Diesel-2 08
Name 01
Ort 04
PLZ 03
Strasse 02
SuperE10-1 09
SuperE10-2 09
SuperE5-1 10
SuperE5-2 10
SuperPlus-1 11
SuperPlus-2 11
last_update 07
open_days-1 05
open_days-2 05
open_days-3 05
open_hours-1 06
open_hours-2 06
open_hours-3 06
readingOutdated:
readingSubNum:
Diesel-1 -1
Diesel-2 -2
SuperE10-1 -1
SuperE10-2 -2
SuperE5-1 -1
SuperE5-2 -2
SuperPlus-1 -1
SuperPlus-2 -2
open_days-1 -1
open_days-2 -2
open_days-3 -3
open_hours-1 -1
open_hours-2 -2
open_hours-3 -3
requestReadings:
update:
Diesel-1 reading 08-1
Diesel-2 reading 08-2
Name reading 01
Ort reading 04
PLZ reading 03
Strasse reading 02
SuperE10-1 reading 09-1
SuperE10-2 reading 09-2
SuperE5-1 reading 10-1
SuperE5-2 reading 10-2
SuperPlus-1 reading 11-1
SuperPlus-2 reading 11-2
last_update reading 07
open_days-1 reading 05-1
open_days-2 reading 05-2
open_days-3 reading 05-3
open_hours-1 reading 06-1
open_hours-2 reading 06-2
open_hours-3 reading 06-3
Attributes:
alias SB Tankstelle in Alsdorf (Übacher Weg)
enableControlSet 1
event-min-interval .*:1800
event-on-change-reading .*
group Informationen
icon fuel
model clever_tanken_single_station
reading01Name Name
reading01Regex <span class="strong-title" itemprop="name">(.*)</span>
reading02Name Strasse
reading02Regex <span itemprop="streetAddress">(.*)</span>
reading03Name PLZ
reading03Regex <span itemprop="http://schema.org/postalCode">(.*)</span>
reading04Name Ort
reading04Regex <span itemprop="http://schema.org/addressCountry">(.*)</span>
reading05Name open_days
reading05RegOpt g
reading05Regex <div class="d-flex justify-content-between weak-body">\s*<span>\s*(.*)<\/span>
reading06Name open_hours
reading06RegOpt g
reading06Regex <div class="d-flex justify-content-between weak-body">\s*<span>\s*.*<\/span>\s*<span>\s*(.*)<\/span>
reading07Name last_update
reading07Regex <span>Letzte Aktualisierung: (.*)</span>
reading08Expr { ($val < 1) ? ReadingsVal($name,"Diesel-1",0) : $val }
reading08Name Diesel
reading08Regex <div[^>]*class="price-type-name"[^>]*>Diesel<\/div>[\s\S]*?<span[^>]*id="current-price-\d+"[^>]*>([\d.]+)<\/span>[\s\S]*?<sup[^>]*id="suffix-price-\d+"[^>]*>(\d+)<\/sup>
reading09Expr { ($val < 1) ? ReadingsVal($name,"SuperE10-1",0) : $val }
reading09Name SuperE10
reading09Regex <div[^>]*class="price-type-name"[^>]*>Super E10<\/div>[\s\S]*?<span[^>]*id="current-price-\d+"[^>]*>([\d.]+)<\/span>[\s\S]*?<sup[^>]*id="suffix-price-\d+"[^>]*>(\d+)<\/sup>
reading10Expr { ($val < 1) ? ReadingsVal($name,"SuperE5-1",0) : $val }
reading10Name SuperE5
reading10Regex <div[^>]*class="price-type-name"[^>]*>Super E5<\/div>[\s\S]*?<span[^>]*id="current-price-\d+"[^>]*>([\d.]+)<\/span>[\s\S]*?<sup[^>]*id="suffix-price-\d+"[^>]*>(\d+)<\/sup>
reading11Expr { ($val < 1) ? ReadingsVal($name,"SuperPlus-1",0) : $val }
reading11Name SuperPlus
reading11Regex <div[^>]*class="price-type-name"[^>]*>SuperPlus<\/div>[\s\S]*?<span[^>]*id="current-price-\d+"[^>]*>([\d.]+)<\/span>[\s\S]*?<sup[^>]*id="suffix-price-\d+"[^>]*>(\d+)<\/sup>
reading12Expr { ($val < 1) ? ReadingsVal($name,"LPG-1",0) : $val }
reading12Name LPG
reading12Regex <div[^>]*class="price-type-name"[^>]*>LPG<\/div>[\s\S]*?<span[^>]*id="current-price-\d+"[^>]*>([\d.]+)<\/span>[\s\S]*?<sup[^>]*id="suffix-price-\d+"[^>]*>(\d+)<\/sup>
reading13Expr { ($val < 1) ? ReadingsVal($name,"LNG-1",0) : $val }
reading13Name LNG
reading13Regex <div[^>]*class="price-type-name"[^>]*>LNG<\/div>[\s\S]*?<span[^>]*id="current-price-\d+"[^>]*>([\d.]+)<\/span>[\s\S]*?<sup[^>]*id="suffix-price-\d+"[^>]*>(\d+)<\/sup>
reading14Expr { ($val < 1) ? ReadingsVal($name,"CNG-1",0) : $val }
reading14Name CNG
reading14Regex <div[^>]*class="price-type-name"[^>]*>CNG<\/div>[\s\S]*?<span[^>]*id="current-price-\d+"[^>]*>([\d.]+)<\/span>[\s\S]*?<sup[^>]*id="suffix-price-\d+"[^>]*>(\d+)<\/sup>
reading15Expr { ($val < 1) ? ReadingsVal($name,"Bioethanol-1",0) : $val }
reading15Name Bioethanol
reading15Regex <div[^>]*class="price-type-name"[^>]*>Bioethanol<\/div>[\s\S]*?<span[^>]*id="current-price-\d+"[^>]*>([\d.]+)<\/span>[\s\S]*?<sup[^>]*id="suffix-price-\d+"[^>]*>(\d+)<\/sup>
reading16Expr { ($val < 1) ? ReadingsVal($name,"Wasserstoff-1",0) : $val }
reading16Name Wasserstoff
reading16Regex <div[^>]*class="price-type-name"[^>]*>Wasserstoff<\/div>[\s\S]*?<span[^>]*id="current-price-\d+"[^>]*>([\d.]+)<\/span>[\s\S]*?<sup[^>]*id="suffix-price-\d+"[^>]*>(\d+)<\/sup>
readingMaxAge 5
readingMaxAgeReplacementMode delete
readingOExpr $val =~ s/<[\d\D]+>//;;$val
room Information->Spritpreise
stateFormat {
sprintf("Super E5: %.2f € * Super E10: %.2f € * Super Plus: %.2f € * Diesel: %.2f €",
ReadingsNum($name,"SuperE5-1",0) + 0.01,
ReadingsNum($name,"SuperE10-1",0) + 0.01,
ReadingsNum($name,"SuperPlus-1",0) + 0.01,
ReadingsNum($name,"Diesel-1",0) + 0.01
)
}
timeout 10
timestamp-on-change-reading .*
userReadings Diesel_old { OldReadingsVal($name,"Diesel-1", ReadingsVal($name,"Diesel-1","-")) },
SuperE5_old { OldReadingsVal($name,"SuperE5-1", ReadingsVal($name,"SuperE5-1","-")) },
SuperE10_old { OldReadingsVal($name,"SuperE10-1", ReadingsVal($name,"SuperE10-1","-")) },
SuperPlus_old { OldReadingsVal($name,"SuperPlus-1", ReadingsVal($name,"SuperPlus-1","-")) },
LPG_old { OldReadingsVal($name,"LPG-1", ReadingsVal($name,"LPG-1","-")) },
LNG_old { OldReadingsVal($name,"LNG-1", ReadingsVal($name,"LNG-1","-")) },
CNG_old { OldReadingsVal($name,"CNG-1", ReadingsVal($name,"CNG-1","-")) },
Bioethanol_old { OldReadingsVal($name,"Bioethanol-1", ReadingsVal($name,"Bioethanol-1","-")) },
Wasserstoff_old { OldReadingsVal($name,"Wasserstoff-1", ReadingsVal($name,"Wasserstoff-1","-")) },
Diesel_complete { ReadingsNum($name,"Diesel-1", 0) + (ReadingsNum($name,"Diesel-2", 0) / 1000) },
SuperE5_complete { ReadingsNum($name,"SuperE5-1", 0) + (ReadingsNum($name,"SuperE5-2", 0) / 1000) },
SuperE10_complete { ReadingsNum($name,"SuperE10-1", 0) + (ReadingsNum($name,"SuperE10-2", 0) / 1000) },
SuperPlus_complete { ReadingsNum($name,"SuperPlus-1", 0) + (ReadingsNum($name,"SuperPlus-2", 0) / 1000) },
LPG_complete { ReadingsNum($name,"LPG-1", 0) + (ReadingsNum($name,"LPG-2", 0) / 1000) },
LNG_complete { ReadingsNum($name,"LNG-1", 0) + (ReadingsNum($name,"LNG-2", 0) / 1000) },
CNG_complete { ReadingsNum($name,"CNG-1", 0) + (ReadingsNum($name,"CNG-2", 0) / 1000) },
Bioethanol_complete { ReadingsNum($name,"Bioethanol-1", 0) + (ReadingsNum($name,"Bioethanol-2", 0) / 1000) },
Wasserstoff_complete { ReadingsNum($name,"Wasserstoff-1", 0) + (ReadingsNum($name,"Wasserstoff-2", 0) / 1000) },
Diesel_avg { ReadingsVal("Diesel","Durchschnitt","0") },
SuperE5_avg { ReadingsVal("SuperE5","Durchschnitt","0") },
SuperE10_avg { ReadingsVal("SuperE10","Durchschnitt","0") },
SuperPlus_avg { ReadingsVal("SuperPlus","Durchschnitt","0") },
LPG_avg { ReadingsVal("LPG","Durchschnitt","0") },
LNG_avg { ReadingsVal("LNG","Durchschnitt","0") },
CNG_avg { ReadingsVal("CNG","Durchschnitt","0") },
Bioethanol_avg { ReadingsVal("Bioethanol","Durchschnitt","0") },
Wasserstoff_avg { ReadingsVal("Wasserstoff","Durchschnitt","0") },
verbose 0Wie man erkennt sollte Diesel-1 der Hauptpreis und Diesel-2 das Suffix, also die 0,9 Cent sein. Das war bei allen Devices so vorhanden. Das die Readings jetzt nicht mehr da sind fällt mir jetzt erst auf.
Zitat von: Otto123 am 01 Juni 2026, 12:20:01es gibt da für HTTPMOD ein paar attrTemplate vielleicht kann man die als Grundlage nehmen und dann das Device anpassen
Die Devices haben ja alle funktioniert, daher möchte ich ungern jetzt irgendwelche Templates drüberbügeln.
Zitat von: Otto123 am 01 Juni 2026, 12:20:01Ich sehe zumindest kein Reading mit dem Namen "Diesel-1". Damit wird ReadingsVal($name,"Diesel-1",0) immer null ergeben, wobei dann auch wieder die Verwendung von ReadingsVal() fragwürdig ist - siehe ReadingsNum()
Siehe dazu meine Ausführungen weiter oben. Das mit Val und Num ist ein Fakt, hat aber mit Val eigentlich funktioniert und wie man anderem anderen List sieht tut es das ja auch jetzt noch. Wenn ich manuell ein Rerad anstoße funktioniert es manchmal für kurze Zeit und geht dann wieder auf 0. Hatte schon einen Block der Webseite in Verdacht, doch eine Änderung des Intervalls brachte keine Änderung.
Zitat von: Otto123 am 01 Juni 2026, 13:12:34Die regEx im Device des TE sehen (gegenüber der Vorlage, die bei mir gut funktioniert) ziemlich komplex aus, da würde es mich nicht wundern, wenn Fehler beim Auslesen bei Seitenlayoutänderungen passieren.
Die Regex stammt ursprüngich aus einem der Templates und wurde von mir angepasst, da ich differenzierte Werte haben wollte. Das Template liefert zb. den Suffix nicht einzeln. Für eine Durchschnittsberechnung darf diese meiner Meinung nach aber nicht im Preis enthalten sein. Die angepasste Regex habe ich bei der Entwicklung stetig mit Regex101.com geprüft wo sie auch funktioniert hat. Das andere oben angefügte List zeigt ja auch, dass es grundsätzlich tut was es soll. Warum bei diesen 0-Werten dann die Readings nicht richtig ausgelesen werden verstehe ich im Moment auch nicht. Aber ich glaube kaum, das Clever-Tanken einige Seiten einer Layoutänderung unterzogen hat und andere nicht.
Zitat von: Otto123 am 01 Juni 2026, 12:20:01...kein Reading mit dem Namen "Diesel-1". Damit wird ReadingsVal($name,"Diesel-1",0) immer null ergeben...
Ich würde Ottos Hinweis mal eruieren. Immer dann wenn das Reading nicht existiert bzw. bei ReadingsNum nicht numerisch ist wird der Default-Wert hinein geschrieben.
Mithin schreibst du dir eventuell bei Problemen im Abruf der Seite selber die "0" ins Reading.
So als Idee...
https://wiki.fhem.de/wiki/DevelopmentModuleAPI#ReadingsNum
Gruß
Ja werde ich ändern, wobei ich nicht glaube dass dies die Ursache ist. Wenn kommt die 0 ja aus dem Ersatzteil der ReadingVal, die wäre ja bei ReadingNum genauso. Es ist damit nur geklärt woher die 0 kommt, aber nicht warum das Reading im Readingsval gar nicht existiert.
{ ($val < 1) ? ReadingsVal($name,"SuperE5-1",0) : $val }Was es bräuchte wäre also ein alternativer Ersatzwert für die Null. Kann man diesen Ersatzwert auch komplett weglassen? Was würde dann als Ersatz geschrieben?
Die Frage die sich mir stellt, ist warum die Readings mit der Erweiterung -1 und -2 nicht ordnungsgemäß erzeugt werden. Die Regex erzeugt die Readings ja gar nicht, weder mit der erweiterten -1 noch ohne diese.
Das HTTPMOD erzeugt das Reading mit der Erweiterung ja automatisch wenn aus der Regex bei einem Match mehrere Werte ausgelesen werden. Doch er findet ja offenbar weder einen noch mehrere Werte. Gestern und heute mit Regex101.com noch mal gegengetestet sagt mir die Webseite, das die Regex funktioniert.
Also selbst wenn ich auf einen anderen Ersatzwert mit anderem Readingnamen ohne die -1 Erweiterung verweise, existiert der genauso wenig. Aus dem stehgreif heraus würde mir jetzt nur ReadingsOld einfallen und damit sogesehen eine Kopie des eigentlichen Readings anzulegen und darauf zu verweisen wenn das eigentliche Reading nicht vorhanden ist. Doch damit würde ich ja auch die Richtigkeit der Daten kompromittieren, da diese dann nicht mehr mit dem aktuellen Stand übereinstimmen.
Ergänzung zum Post oben:
Ich habe jetzt bei einem Device ReadingsVal überall in ReadingsNum geändert und die Schreiweise auf numerische Ersatzwerte kontrolliert. Regex101 sagt das die Regex korrekt ist und funktioniert. Doch egal was ich machen, es werden weiterhin keine Readings erstellt. Habe es mit reread, clearCookies und upgradeAttributes probiert. Nichts hat geholfen, obwohl es laut Regex101 funktioniert.
Dann habe ich zufällig das DEF geändert und die Intervallzeit von 600 auf 900 gestellt und bestätigt um das ganze danach direkt rückgängig zu machen und erneut ein reread gemacht. Und was soll ich sagen, es funktioniert (für den Moment) wieder. Die Readings werden erzeugt und dadurch funktioniert alles andere auch, die Ersatzwerte werden gar nicht erst geschrieben, da die Readings gefunden werden.
Der Fehler hat also offenbar irgendetwas mit dem DEF zu tun oder lässt sich zumindest durch eine Aktualisierung dessen umgehen. Die Frage ist halt nur wie lange dies hält und warum.
Hier das List des aktualisierten Readings:
Internals:
BUSY 0
DEF https://www.clever-tanken.de/tankstelle_details/15360 600
FUUID 69d76140-f33f-7706-a7d6-12051dc493774932
FVERSION 98_HTTPMOD.pm:0.291590/2024-09-23
Interval 600
MainURL https://www.clever-tanken.de/tankstelle_details/15360
ModuleVersion 4.2.0 - 11.8.2023
NAME Tankstelle_HSe_ARAL_Roermonderstr
NOTIFYDEV global
NR 588
NTFY_ORDER 50-Tankstelle_HSe_ARAL_Roermonderstr
STATE Super E5: 1.90 € * Super E10: 1.84 € * Super Plus: 2.02 € * Diesel: 1.84 €
TYPE HTTPMOD
eventCount 5047
value
CompiledRegexes:
HTTPCookieHash:
csrftoken;:
Name csrftoken
Options expires=Tue, 01 Jun 2027 08:27:46 GMT; Max-Age=31449600; Path=/; SameSite=Lax
Path
Value ZU591SpNfTQHxRywgNTa07sW1fueCvAy
HttpUtils:
NAME
addr https://www.clever-tanken.de:443
auth 0
code 200
compress 1
conn
data
displayurl https://www.clever-tanken.de/tankstelle_details/15360
header
host www.clever-tanken.de
httpheader HTTP/1.1 200 OK
Date: Tue, 02 Jun 2026 08:27:45 GMT
Server: Apache/2.4.52 (Ubuntu)
Vary: Cookie,Accept-Encoding
Content-Encoding: gzip
Content-Type: text/html; charset=utf-8
Set-Cookie: csrftoken=ZU591SpNfTQHxRywgNTa07sW1fueCvAy; expires=Tue, 01 Jun 2027 08:27:46 GMT; Max-Age=31449600; Path=/; SameSite=Lax
X-Correlation-Uid: ah6UAYl8rhR8uZkjOMWyHgAAAhs
Connection: close
httpversion 1.0
hu_blocking 0
hu_filecount 1
hu_port 443
hu_portSfx
ignoreredirects 1
loglevel 4
path /tankstelle_details/15360
protocol https
redirects 0
timeout 10
url https://www.clever-tanken.de/tankstelle_details/15360
sslargs:
QUEUE:
READINGS:
2026-06-02 10:09:57 Bioethanol_avg 0
2026-06-02 10:09:57 Bioethanol_complete 0
2026-06-02 10:27:27 Bioethanol_old 0
2026-06-02 10:09:57 CNG_avg 0
2026-06-02 10:09:57 CNG_complete 0
2026-06-02 10:27:27 CNG_old 0
2026-06-02 10:27:45 Diesel-1 1.83
2026-06-02 10:27:45 Diesel-2 9
2026-06-02 09:59:57 Diesel_avg 1.83
2026-06-02 10:27:45 Diesel_complete 1.839
2026-06-02 10:27:45 Diesel_old 1.83
2026-06-02 10:09:57 LNG_avg 0
2026-06-02 10:09:57 LNG_complete 0
2026-06-02 10:27:27 LNG_old 0
2026-06-02 10:27:45 LPG-1 1.12
2026-06-02 10:27:45 LPG-2 9
2026-06-02 10:09:57 LPG_avg 1.12
2026-06-02 10:27:45 LPG_complete 1.129
2026-06-02 10:27:45 LPG_old 1.12
2026-06-02 10:27:45 Name ARAL
2026-06-02 10:27:45 Ort Heinsberg
2026-06-02 10:27:45 PLZ 52525
2026-06-02 10:27:45 Strasse Roermonder Str. 41
2026-06-02 10:27:45 SuperE10-1 1.83
2026-06-02 10:27:45 SuperE10-2 9
2026-06-02 09:59:57 SuperE10_avg 1.83
2026-06-02 10:27:45 SuperE10_complete 1.839
2026-06-02 10:27:45 SuperE10_old 1.83
2026-06-02 10:27:45 SuperE5-1 1.89
2026-06-02 10:27:45 SuperE5-2 9
2026-06-02 10:09:57 SuperE5_avg 1.21
2026-06-02 10:27:45 SuperE5_complete 1.899
2026-06-02 10:27:45 SuperE5_old 1.89
2026-06-02 10:27:45 SuperPlus-1 2.01
2026-06-02 10:27:45 SuperPlus-2 9
2026-06-02 10:09:57 SuperPlus_avg 1.06
2026-06-02 10:27:45 SuperPlus_complete 2.019
2026-06-02 10:27:45 SuperPlus_old 2.01
2026-06-02 10:09:57 Wasserstoff_avg 0
2026-06-02 10:09:57 Wasserstoff_complete 0
2026-06-02 10:27:27 Wasserstoff_old 0
2026-06-02 10:27:45 last_update 02.06.2026 10:15
2026-06-02 10:27:45 open_days-1 Samstag
2026-06-02 10:27:45 open_days-2 Sonntag
2026-06-02 10:27:45 open_days-3 Mo-Fr
2026-06-02 10:27:45 open_hours-1 8:00-20:00
2026-06-02 10:27:45 open_hours-2 9:00-20:00
2026-06-02 10:27:45 open_hours-3 7:00-20:00
REQUEST:
context reading
data
header
ignoreredirects 0
num unknown
retryCount 0
type update
url https://www.clever-tanken.de/tankstelle_details/15360
defptr:
readingBase:
Diesel-1 reading
Diesel-2 reading
LPG-1 reading
LPG-2 reading
Name reading
Ort reading
PLZ reading
Strasse reading
SuperE10-1 reading
SuperE10-2 reading
SuperE5-1 reading
SuperE5-2 reading
SuperPlus-1 reading
SuperPlus-2 reading
last_update reading
open_days-1 reading
open_days-2 reading
open_days-3 reading
open_hours-1 reading
open_hours-2 reading
open_hours-3 reading
readingNum:
Diesel-1 08
Diesel-2 08
LPG-1 12
LPG-2 12
Name 01
Ort 04
PLZ 03
Strasse 02
SuperE10-1 09
SuperE10-2 09
SuperE5-1 10
SuperE5-2 10
SuperPlus-1 11
SuperPlus-2 11
last_update 07
open_days-1 05
open_days-2 05
open_days-3 05
open_hours-1 06
open_hours-2 06
open_hours-3 06
readingOutdated:
readingSubNum:
Diesel-1 -1
Diesel-2 -2
LPG-1 -1
LPG-2 -2
SuperE10-1 -1
SuperE10-2 -2
SuperE5-1 -1
SuperE5-2 -2
SuperPlus-1 -1
SuperPlus-2 -2
open_days-1 -1
open_days-2 -2
open_days-3 -3
open_hours-1 -1
open_hours-2 -2
open_hours-3 -3
requestReadings:
update:
Diesel-1 reading 08-1
Diesel-2 reading 08-2
LPG-1 reading 12-1
LPG-2 reading 12-2
Name reading 01
Ort reading 04
PLZ reading 03
Strasse reading 02
SuperE10-1 reading 09-1
SuperE10-2 reading 09-2
SuperE5-1 reading 10-1
SuperE5-2 reading 10-2
SuperPlus-1 reading 11-1
SuperPlus-2 reading 11-2
last_update reading 07
open_days-1 reading 05-1
open_days-2 reading 05-2
open_days-3 reading 05-3
open_hours-1 reading 06-1
open_hours-2 reading 06-2
open_hours-3 reading 06-3
Attributes:
alias ARAL in Karken (Roermonder Str.)
enableControlSet 1
event-min-interval .*:1800
event-on-change-reading .*
group Informationen
icon fuel
model clever_tanken_single_station
reading01Name Name
reading01Regex <span class="strong-title" itemprop="name">(.*)</span>
reading02Name Strasse
reading02Regex <span itemprop="streetAddress">(.*)</span>
reading03Name PLZ
reading03Regex <span itemprop="http://schema.org/postalCode">(.*)</span>
reading04Name Ort
reading04Regex <span itemprop="http://schema.org/addressCountry">(.*)</span>
reading05Name open_days
reading05RegOpt g
reading05Regex <div class="d-flex justify-content-between weak-body">\s*<span>\s*(.*)<\/span>
reading06Name open_hours
reading06RegOpt g
reading06Regex <div class="d-flex justify-content-between weak-body">\s*<span>\s*.*<\/span>\s*<span>\s*(.*)<\/span>
reading07Name last_update
reading07Regex <span>Letzte Aktualisierung: (.*)</span>
reading08Name Diesel
reading08OExpr { ($val < 0.25) ? ReadingsNum($name,"Diesel-1",0) : $val }
reading08Regex <div[^>]*class="price-type-name"[^>]*>Diesel<\/div>[\s\S]*?<span[^>]*id="current-price-\d+"[^>]*>([\d.]+)<\/span>[\s\S]*?<sup[^>]*id="suffix-price-\d+"[^>]*>(\d+)<\/sup>
reading09Name SuperE10
reading09OExpr { ($val < 0.25) ? ReadingsNum($name,"SuperE10-1",0) : $val }
reading09Regex <div[^>]*class="price-type-name"[^>]*>Super E10<\/div>[\s\S]*?<span[^>]*id="current-price-\d+"[^>]*>([\d.]+)<\/span>[\s\S]*?<sup[^>]*id="suffix-price-\d+"[^>]*>(\d+)<\/sup>
reading10Name SuperE5
reading10OExpr { ($val < 0.25) ? ReadingsNum($name,"SuperE5-1",0) : $val }
reading10Regex <div[^>]*class="price-type-name"[^>]*>Super E5<\/div>[\s\S]*?<span[^>]*id="current-price-\d+"[^>]*>([\d.]+)<\/span>[\s\S]*?<sup[^>]*id="suffix-price-\d+"[^>]*>(\d+)<\/sup>
reading11Name SuperPlus
reading11OExpr { ($val < 0.25) ? ReadingsNum($name,"SuperPlus-1",0) : $val }
reading11Regex <div[^>]*class="price-type-name"[^>]*>ARAL Superplus<\/div>[\s\S]*?<span[^>]*id="current-price-\d+"[^>]*>([\d.]+)<\/span>[\s\S]*?<sup[^>]*id="suffix-price-\d+"[^>]*>(\d+)<\/sup>
reading12Name LPG
reading12OExpr { ($val < 0.25) ? ReadingsNum($name,"LPG-1",0) : $val }
reading12Regex <div[^>]*class="price-type-name"[^>]*>LPG<\/div>[\s\S]*?<span[^>]*id="current-price-\d+"[^>]*>([\d.]+)<\/span>[\s\S]*?<sup[^>]*id="suffix-price-\d+"[^>]*>(\d+)<\/sup>
reading13Name LNG
reading13OExpr { ($val < 0.25) ? ReadingsNum($name,"LNG-1",0) : $val }
reading13Regex <div[^>]*class="price-type-name"[^>]*>LNG<\/div>[\s\S]*?<span[^>]*id="current-price-\d+"[^>]*>([\d.]+)<\/span>[\s\S]*?<sup[^>]*id="suffix-price-\d+"[^>]*>(\d+)<\/sup>
reading14Name CNG
reading14OExpr { ($val < 0.25) ? ReadingsNum($name,"CNG-1",0) : $val }
reading14Regex <div[^>]*class="price-type-name"[^>]*>CNG<\/div>[\s\S]*?<span[^>]*id="current-price-\d+"[^>]*>([\d.]+)<\/span>[\s\S]*?<sup[^>]*id="suffix-price-\d+"[^>]*>(\d+)<\/sup>
reading15Name Bioethanol
reading15OExpr { ($val < 0.25) ? ReadingsNum($name,"Bioethanol-1",0) : $val }
reading15Regex <div[^>]*class="price-type-name"[^>]*>Bioethanol<\/div>[\s\S]*?<span[^>]*id="current-price-\d+"[^>]*>([\d.]+)<\/span>[\s\S]*?<sup[^>]*id="suffix-price-\d+"[^>]*>(\d+)<\/sup>
reading16Name Wasserstoff
reading16OExpr { ($val < 0.25) ? ReadingsNum($name,"Wasserstoff-1",0) : $val }
reading16Regex <div[^>]*class="price-type-name"[^>]*>Wasserstoff<\/div>[\s\S]*?<span[^>]*id="current-price-\d+"[^>]*>([\d.]+)<\/span>[\s\S]*?<sup[^>]*id="suffix-price-\d+"[^>]*>(\d+)<\/sup>
readingMaxAge 15
readingMaxAgeReplacementMode delete
readingOExpr $val =~ s/<[\d\D]+>//;;$val
room Information->Spritpreise
stateFormat {
sprintf("Super E5: %.2f € * Super E10: %.2f € * Super Plus: %.2f € * Diesel: %.2f €",
ReadingsNum($name,"SuperE5-1",0) + 0.01,
ReadingsNum($name,"SuperE10-1",0) + 0.01,
ReadingsNum($name,"SuperPlus-1",0) + 0.01,
ReadingsNum($name,"Diesel-1",0) + 0.01
)
}
timeout 10
timestamp-on-change-reading .*
userReadings Diesel_old { OldReadingsNum($name,"Diesel-1", ReadingsNum($name,"Diesel-1",0)) },
SuperE5_old { OldReadingsNum($name,"SuperE5-1", ReadingsNum($name,"SuperE5-1",0)) },
SuperE10_old { OldReadingsNum($name,"SuperE10-1", ReadingsNum($name,"SuperE10-1",0)) },
SuperPlus_old { OldReadingsNum($name,"SuperPlus-1", ReadingsNum($name,"SuperPlus-1",0)) },
LPG_old { OldReadingsNum($name,"LPG-1", ReadingsNum($name,"LPG-1",0)) },
LNG_old { OldReadingsNum($name,"LNG-1", ReadingsNum($name,"LNG-1",0)) },
CNG_old { OldReadingsNum($name,"CNG-1", ReadingsNum($name,"CNG-1",0)) },
Bioethanol_old { OldReadingsNum($name,"Bioethanol-1", ReadingsNum($name,"Bioethanol-1",0)) },
Wasserstoff_old { OldReadingsNum($name,"Wasserstoff-1", ReadingsNum($name,"Wasserstoff-1",0)) },
Diesel_complete { ReadingsNum($name,"Diesel-1", 0) + (ReadingsNum($name,"Diesel-2", 0) / 1000) },
SuperE5_complete { ReadingsNum($name,"SuperE5-1", 0) + (ReadingsNum($name,"SuperE5-2", 0) / 1000) },
SuperE10_complete { ReadingsNum($name,"SuperE10-1", 0) + (ReadingsNum($name,"SuperE10-2", 0) / 1000) },
SuperPlus_complete { ReadingsNum($name,"SuperPlus-1", 0) + (ReadingsNum($name,"SuperPlus-2", 0) / 1000) },
LPG_complete { ReadingsNum($name,"LPG-1", 0) + (ReadingsNum($name,"LPG-2", 0) / 1000) },
LNG_complete { ReadingsNum($name,"LNG-1", 0) + (ReadingsNum($name,"LNG-2", 0) / 1000) },
CNG_complete { ReadingsNum($name,"CNG-1", 0) + (ReadingsNum($name,"CNG-2", 0) / 1000) },
Bioethanol_complete { ReadingsNum($name,"Bioethanol-1", 0) + (ReadingsNum($name,"Bioethanol-2", 0) / 1000) },
Wasserstoff_complete { ReadingsNum($name,"Wasserstoff-1", 0) + (ReadingsNum($name,"Wasserstoff-2", 0) / 1000) },
Diesel_avg { ReadingsNum("Diesel","Durchschnitt",0) },
SuperE5_avg { ReadingsNum("SuperE5","Durchschnitt",0) },
SuperE10_avg { ReadingsNum("SuperE10","Durchschnitt",0) },
SuperPlus_avg { ReadingsNum("SuperPlus","Durchschnitt",0) },
LPG_avg { ReadingsNum("LPG","Durchschnitt",0) },
LNG_avg { ReadingsNum("LNG","Durchschnitt",0) },
CNG_avg { ReadingsNum("CNG","Durchschnitt",0) },
Bioethanol_avg { ReadingsNum("Bioethanol","Durchschnitt",0) },
Wasserstoff_avg { ReadingsNum("Wasserstoff","Durchschnitt",0) },
userattr
verbose 3
Ergänzung2:
Beim nächsten automatischen Abruf der Daten sind die Readings wieder weg und es taucht logischerweise damit wieder der Ersatzwert "0" auf.
Die Frage ist also wieso funktioniert es nach einer Aktualisierung des DEF's und manuellem Reread , nicht aber beim automatischen Abruf. Und warum werden die bestehenden Readings gelöscht. Soweit ich Fhem verstanden habe bleiben einmal angelegte Readings existent, auch wenn sie keine Werte haben.
Hier das List des gleichen Device nach dem automatischen Abruf:
Internals:
BUSY 0
DEF https://www.clever-tanken.de/tankstelle_details/15360 600
FUUID 69d76140-f33f-7706-a7d6-12051dc493774932
FVERSION 98_HTTPMOD.pm:0.291590/2024-09-23
Interval 600
MainURL https://www.clever-tanken.de/tankstelle_details/15360
ModuleVersion 4.2.0 - 11.8.2023
NAME Tankstelle_HSe_ARAL_Roermonderstr
NOTIFYDEV global
NR 588
NTFY_ORDER 50-Tankstelle_HSe_ARAL_Roermonderstr
STATE Super E5: 0.01 € * Super E10: 0.01 € * Super Plus: 0.01 € * Diesel: 0.01 €
TYPE HTTPMOD
eventCount 5048
value
CompiledRegexes:
HTTPCookieHash:
csrftoken;:
Name csrftoken
Options expires=Tue, 01 Jun 2027 08:27:46 GMT; Max-Age=31449600; Path=/; SameSite=Lax
Path
Value ZU591SpNfTQHxRywgNTa07sW1fueCvAy
HttpUtils:
NAME
addr https://www.clever-tanken.de:443
auth 0
data
displayurl https://www.clever-tanken.de/tankstelle_details/15360
header Cookie: csrftoken=ZU591SpNfTQHxRywgNTa07sW1fueCvAy
host www.clever-tanken.de
httpversion 1.0
ignoreredirects 1
loglevel 4
path /tankstelle_details/15360
protocol https
redirects 0
timeout 10
url https://www.clever-tanken.de/tankstelle_details/15360
sslargs:
QUEUE:
READINGS:
2026-06-02 10:09:57 Bioethanol_avg 0
2026-06-02 10:09:57 Bioethanol_complete 0
2026-06-02 10:27:27 Bioethanol_old 0
2026-06-02 10:09:57 CNG_avg 0
2026-06-02 10:09:57 CNG_complete 0
2026-06-02 10:27:27 CNG_old 0
2026-06-02 10:37:27 Diesel_avg 1.83
2026-06-02 10:37:27 Diesel_complete 0
2026-06-02 10:37:27 Diesel_old 0
2026-06-02 10:09:57 LNG_avg 0
2026-06-02 10:09:57 LNG_complete 0
2026-06-02 10:27:27 LNG_old 0
2026-06-02 10:09:57 LPG_avg 1.12
2026-06-02 10:37:27 LPG_complete 0
2026-06-02 10:37:27 LPG_old 0
2026-06-02 10:37:27 SuperE10_avg 1.84
2026-06-02 10:37:27 SuperE10_complete 0
2026-06-02 10:37:27 SuperE10_old 0
2026-06-02 10:09:57 SuperE5_avg 1.21
2026-06-02 10:37:27 SuperE5_complete 0
2026-06-02 10:37:27 SuperE5_old 0
2026-06-02 10:09:57 SuperPlus_avg 1.06
2026-06-02 10:37:27 SuperPlus_complete 0
2026-06-02 10:37:27 SuperPlus_old 0
2026-06-02 10:09:57 Wasserstoff_avg 0
2026-06-02 10:09:57 Wasserstoff_complete 0
2026-06-02 10:27:27 Wasserstoff_old 0
REQUEST:
context reading
data
header
ignoreredirects 0
num unknown
retryCount 0
type update
url https://www.clever-tanken.de/tankstelle_details/15360
defptr:
readingBase:
readingNum:
readingOutdated:
readingSubNum:
requestReadings:
update:
Attributes:
alias ARAL in Karken (Roermonder Str.)
enableControlSet 1
event-min-interval .*:1800
event-on-change-reading .*
group Informationen
icon fuel
model clever_tanken_single_station
reading01Name Name
reading01Regex <span class="strong-title" itemprop="name">(.*)</span>
reading02Name Strasse
reading02Regex <span itemprop="streetAddress">(.*)</span>
reading03Name PLZ
reading03Regex <span itemprop="http://schema.org/postalCode">(.*)</span>
reading04Name Ort
reading04Regex <span itemprop="http://schema.org/addressCountry">(.*)</span>
reading05Name open_days
reading05RegOpt g
reading05Regex <div class="d-flex justify-content-between weak-body">\s*<span>\s*(.*)<\/span>
reading06Name open_hours
reading06RegOpt g
reading06Regex <div class="d-flex justify-content-between weak-body">\s*<span>\s*.*<\/span>\s*<span>\s*(.*)<\/span>
reading07Name last_update
reading07Regex <span>Letzte Aktualisierung: (.*)</span>
reading08Name Diesel
reading08OExpr { ($val < 0.25) ? ReadingsNum($name,"Diesel-1",0) : $val }
reading08Regex <div[^>]*class="price-type-name"[^>]*>Diesel<\/div>[\s\S]*?<span[^>]*id="current-price-\d+"[^>]*>([\d.]+)<\/span>[\s\S]*?<sup[^>]*id="suffix-price-\d+"[^>]*>(\d+)<\/sup>
reading09Name SuperE10
reading09OExpr { ($val < 0.25) ? ReadingsNum($name,"SuperE10-1",0) : $val }
reading09Regex <div[^>]*class="price-type-name"[^>]*>Super E10<\/div>[\s\S]*?<span[^>]*id="current-price-\d+"[^>]*>([\d.]+)<\/span>[\s\S]*?<sup[^>]*id="suffix-price-\d+"[^>]*>(\d+)<\/sup>
reading10Name SuperE5
reading10OExpr { ($val < 0.25) ? ReadingsNum($name,"SuperE5-1",0) : $val }
reading10Regex <div[^>]*class="price-type-name"[^>]*>Super E5<\/div>[\s\S]*?<span[^>]*id="current-price-\d+"[^>]*>([\d.]+)<\/span>[\s\S]*?<sup[^>]*id="suffix-price-\d+"[^>]*>(\d+)<\/sup>
reading11Name SuperPlus
reading11OExpr { ($val < 0.25) ? ReadingsNum($name,"SuperPlus-1",0) : $val }
reading11Regex <div[^>]*class="price-type-name"[^>]*>ARAL Superplus<\/div>[\s\S]*?<span[^>]*id="current-price-\d+"[^>]*>([\d.]+)<\/span>[\s\S]*?<sup[^>]*id="suffix-price-\d+"[^>]*>(\d+)<\/sup>
reading12Name LPG
reading12OExpr { ($val < 0.25) ? ReadingsNum($name,"LPG-1",0) : $val }
reading12Regex <div[^>]*class="price-type-name"[^>]*>LPG<\/div>[\s\S]*?<span[^>]*id="current-price-\d+"[^>]*>([\d.]+)<\/span>[\s\S]*?<sup[^>]*id="suffix-price-\d+"[^>]*>(\d+)<\/sup>
reading13Name LNG
reading13OExpr { ($val < 0.25) ? ReadingsNum($name,"LNG-1",0) : $val }
reading13Regex <div[^>]*class="price-type-name"[^>]*>LNG<\/div>[\s\S]*?<span[^>]*id="current-price-\d+"[^>]*>([\d.]+)<\/span>[\s\S]*?<sup[^>]*id="suffix-price-\d+"[^>]*>(\d+)<\/sup>
reading14Name CNG
reading14OExpr { ($val < 0.25) ? ReadingsNum($name,"CNG-1",0) : $val }
reading14Regex <div[^>]*class="price-type-name"[^>]*>CNG<\/div>[\s\S]*?<span[^>]*id="current-price-\d+"[^>]*>([\d.]+)<\/span>[\s\S]*?<sup[^>]*id="suffix-price-\d+"[^>]*>(\d+)<\/sup>
reading15Name Bioethanol
reading15OExpr { ($val < 0.25) ? ReadingsNum($name,"Bioethanol-1",0) : $val }
reading15Regex <div[^>]*class="price-type-name"[^>]*>Bioethanol<\/div>[\s\S]*?<span[^>]*id="current-price-\d+"[^>]*>([\d.]+)<\/span>[\s\S]*?<sup[^>]*id="suffix-price-\d+"[^>]*>(\d+)<\/sup>
reading16Name Wasserstoff
reading16OExpr { ($val < 0.25) ? ReadingsNum($name,"Wasserstoff-1",0) : $val }
reading16Regex <div[^>]*class="price-type-name"[^>]*>Wasserstoff<\/div>[\s\S]*?<span[^>]*id="current-price-\d+"[^>]*>([\d.]+)<\/span>[\s\S]*?<sup[^>]*id="suffix-price-\d+"[^>]*>(\d+)<\/sup>
readingMaxAge 15
readingMaxAgeReplacementMode delete
readingOExpr $val =~ s/<[\d\D]+>//;;$val
room Information->Spritpreise
stateFormat {
sprintf("Super E5: %.2f € * Super E10: %.2f € * Super Plus: %.2f € * Diesel: %.2f €",
ReadingsNum($name,"SuperE5-1",0) + 0.01,
ReadingsNum($name,"SuperE10-1",0) + 0.01,
ReadingsNum($name,"SuperPlus-1",0) + 0.01,
ReadingsNum($name,"Diesel-1",0) + 0.01
)
}
timeout 10
timestamp-on-change-reading .*
userReadings Diesel_old { OldReadingsNum($name,"Diesel-1", ReadingsNum($name,"Diesel-1",0)) },
SuperE5_old { OldReadingsNum($name,"SuperE5-1", ReadingsNum($name,"SuperE5-1",0)) },
SuperE10_old { OldReadingsNum($name,"SuperE10-1", ReadingsNum($name,"SuperE10-1",0)) },
SuperPlus_old { OldReadingsNum($name,"SuperPlus-1", ReadingsNum($name,"SuperPlus-1",0)) },
LPG_old { OldReadingsNum($name,"LPG-1", ReadingsNum($name,"LPG-1",0)) },
LNG_old { OldReadingsNum($name,"LNG-1", ReadingsNum($name,"LNG-1",0)) },
CNG_old { OldReadingsNum($name,"CNG-1", ReadingsNum($name,"CNG-1",0)) },
Bioethanol_old { OldReadingsNum($name,"Bioethanol-1", ReadingsNum($name,"Bioethanol-1",0)) },
Wasserstoff_old { OldReadingsNum($name,"Wasserstoff-1", ReadingsNum($name,"Wasserstoff-1",0)) },
Diesel_complete { ReadingsNum($name,"Diesel-1", 0) + (ReadingsNum($name,"Diesel-2", 0) / 1000) },
SuperE5_complete { ReadingsNum($name,"SuperE5-1", 0) + (ReadingsNum($name,"SuperE5-2", 0) / 1000) },
SuperE10_complete { ReadingsNum($name,"SuperE10-1", 0) + (ReadingsNum($name,"SuperE10-2", 0) / 1000) },
SuperPlus_complete { ReadingsNum($name,"SuperPlus-1", 0) + (ReadingsNum($name,"SuperPlus-2", 0) / 1000) },
LPG_complete { ReadingsNum($name,"LPG-1", 0) + (ReadingsNum($name,"LPG-2", 0) / 1000) },
LNG_complete { ReadingsNum($name,"LNG-1", 0) + (ReadingsNum($name,"LNG-2", 0) / 1000) },
CNG_complete { ReadingsNum($name,"CNG-1", 0) + (ReadingsNum($name,"CNG-2", 0) / 1000) },
Bioethanol_complete { ReadingsNum($name,"Bioethanol-1", 0) + (ReadingsNum($name,"Bioethanol-2", 0) / 1000) },
Wasserstoff_complete { ReadingsNum($name,"Wasserstoff-1", 0) + (ReadingsNum($name,"Wasserstoff-2", 0) / 1000) },
Diesel_avg { ReadingsNum("Diesel","Durchschnitt",0) },
SuperE5_avg { ReadingsNum("SuperE5","Durchschnitt",0) },
SuperE10_avg { ReadingsNum("SuperE10","Durchschnitt",0) },
SuperPlus_avg { ReadingsNum("SuperPlus","Durchschnitt",0) },
LPG_avg { ReadingsNum("LPG","Durchschnitt",0) },
LNG_avg { ReadingsNum("LNG","Durchschnitt",0) },
CNG_avg { ReadingsNum("CNG","Durchschnitt",0) },
Bioethanol_avg { ReadingsNum("Bioethanol","Durchschnitt",0) },
Wasserstoff_avg { ReadingsNum("Wasserstoff","Durchschnitt",0) },
userattr
verbose 3
Wenn ich deinen Link zur Tankstelle öffne gibt es bei mir nur 5 Spritsorten:
- Diesel
- Super E10
- Super E5
- ARAL Superplus
- LPG
Wo sollen die Werte für z.B. Wasserstoff, Bioethanol und LNG herkommen wenn sie gar nicht auf der Seite zu finden sind?
Gruß
Dan
Des Weiteren nutzt die Verwendung von "OldReadings..." überhaupt nichts, solange das Attribut "oldreadings" nicht entsprechend gesetzt ist.
Gruß
Dan
P.S. Ich würde mal alles rausschmeißen und mit einem Reading "richtig" anfangen! Dann Stück für Stück um weitere Readings erweitern.
Zitat von: DeeSPe am 02 Juni 2026, 11:19:19Wenn ich deinen Link zur Tankstelle öffne gibt es bei mir nur 5 Spritsorten
Das ist richtig und einfach nur Vorbereitung für die Zukunft. Einige Tankstellen bieten zb LNG an, andere CNG. Um das zu vereinheitlichen ist einfach in allen Devices für alle Möglichkeiten ein Reading angelegt.
Aber das ist ja nicht das Problem, sondern, das bei Super, Super-E10, Super Plus, Diesel genauso keine Werte zurückgegeben/ausgelesen werden.
Zitat von: DeeSPe am 02 Juni 2026, 12:15:30Des Weiteren nutzt die Verwendung von "OldReadings..." überhaupt nichts, solange das Attribut "oldreadings" nicht entsprechend gesetzt ist.
Danke für den Hinweis, ist wohl im Zuge diverser Anpassungen verloren gegangen.
Zitat von: DeeSPe am 02 Juni 2026, 12:15:30Ich würde mal alles rausschmeißen und mit einem Reading "richtig" anfangen!
Bringt das meines Erachtens nichts wenn ich nicht die Ursache kenne und diese sich einfach nur wiederholt.
Meine Recherge ergab zumindestens bisher folgendes:
Laut Netz sind für das Löschen der Readings die beiden Attribute readingMaxAge und
readingMaxAgeReplacementMode verantwortlich, daher habe ich diese jetzt mal gelöscht.
Als weiteres Problem hat die Google-KI die automatisierte Abfrage benannt, da sie von Clever-Tanken als Bot erkannt wird, da clever-tanken mittlerweise auch auf regelmäßigkeiten etc. prüft und durch das starre Intervall leicht als Bot identifizierbar sei. Das würde auch dazu passen, dass es am Anfang funktioniert hat und nach und nach immer häufiger der 0-Fehler auftrat. Die Prüfroutine von clever-tanken hat gelernt und die Abfrage nach und nach mehr als Bot erkennt.
Deshalb habe ich (von der KI vorgeschlagen) dem HTTPMOD-Device eine Header-Info angehangen:
requestHeader1 User-Agent: Mozilla/5.0 WindowsNT10.0 Chrome/120.0.0.0 Safari/537.36und dazu das Attribut httpVersion auf 1.1 gesetzt.
Weiterhin wurde das Attribut reading08OExpr um "fhem("attr $name Interval " . (600 + int(rand(120)) - 60));; " ergänzt. Damit soll das Internal Intervall angeblich bei jedem Abruf neu gesetzt werden mit einer Zeit zwischen 540 und 660 Sekunden, wodurch keine Regelmäßigkeit mehr vorliegt.
Zu guter Letzt habe ich das stateFormat folgendermaßen erweitert, damit ein Fehler beim automatischen Abruf direkt im state angezeigt wird:
{ if (InternalVal($name,"LAST_ERROR","") ne "") { return "⚠️ FEHLER: Automatischer Abruf fehlgeschlagen! (Daten veraltet)"; } else { sprintf("Super E5: %.2f € * Super E10: %.2f € * Super Plus: %.2f € * Diesel: %.2f €", ReadingsNum($name,"SuperE5-1",0) + 0.01, ReadingsNum($name,"SuperE10-1",0) + 0.01, ReadingsNum($name,"SuperPlus-1",0) + 0.01, ReadingsNum($name,"Diesel-1",0) + 0.01) ; } }In Verbindung mit dem Löschen der beiden Attribute readingMaxAge und readingMaxAgeReplacementMode hoffe ich auf eine Lösung.
Werde mir das jetzt mal alles ein paar Stunden ansehen.
Ich benutzte schon sehr lange ein festes Interval von 900.
Einen Header habe ich überhaupt nicht explizit gesetzt.
Die Attribute readingMaxAge... benutze ich nicht!
Komisch dass mein HTTPMOD Device trotzdem funktioniert.
Gruß
Dan
Zitat von: DeeSPe am 02 Juni 2026, 12:37:57Ich benutzte schon sehr lange ein festes Interval von 900.
Einen Header habe ich überhaupt nicht explizit gesetzt.
Die Attribute readingMaxAge... benutze ich nicht!
Ich habe nur wiedergegeben was die KI eventuell als Fehler identifiziert hat.
Also nach den ersten 20 Minuten (also 2 automatischen Aktualisierungen) bleibt das Intervall auf 600 und wird nicht neu gesetzt. Aber es werden Daten ausgelesen.
Ich vermute daher mal, dass das einzige Problem an den beiden maxAge-Attributen gelegen hat. Werde es weiter beobachten.
Zitat von: Marko1976 am 02 Juni 2026, 12:52:24Ich habe nur wiedergegeben was die KI eventuell als Fehler identifiziert hat.
Meine KI (Kopf-Intelligenz) hat nur wiedergegeben was bei mir funktioniert.
Gruß
Dan
Zitat von: Marko1976 am 02 Juni 2026, 12:52:24Ich habe nur wiedergegeben was die KI eventuell als Fehler identifiziert hat.
"Die KI" ist in diesem Fall ein Sprachmodell ohne Verständnis für Fehler.
Kann also gar nicht sein.
pah (NI = Natürliche Intelligenz)
Zitat von: Prof. Dr. Peter Henning am 02 Juni 2026, 19:44:18"Die KI" ist in diesem Fall ein Sprachmodell ohne Verständnis für Fehler.
Wieder einmal Schwachsinn, denn wir reden nicht von Alexa und Co.
Die KI ist eine Datenbank mit milliarden von Eingaben programmiert und sucht lediglich aus all diesen Informationen die passensde Lösung heraus. Von selbstdenkenden KI's sind wir gottseidank noch Jahre entfernt.
Darum kann eine KI auch nicht selbstständig lernen sondern nur angelernt werden. Der Begriff KI hat also rein gar nichts mit Sprachassistent zutun.
Meine Güte sowas nennt sich Professor und macht hier auf Oberlehrer.
Hier mal eine Referenz mit Tankstellen im Umkreis von latitude/longitude.
Vielleicht hilft.
defmod CleverTanken HTTPMOD https://www.clever-tanken.de/tankstelle_liste?spritsorte=7&r=5&lat=48.5&lon=11.9&sort=p 0
attr CleverTanken comment Debuggen geht indem du deinen clever-tanken Link öffnest, \
Quelltext anzeigen lässt und diesen dann in das Textfeld auf https://regex101.com kopierst. \
Das RegEx kommt in die Eingabezeile ganz oben und rechts siehst du das Ergebnis.\
spritsorte=7\
1 = Autogas\
2 = LKW-Diesel\
3 = Diesel\
4 = Bioethanol\
5 = SuperE10\
6 = SuperPlus\
7 = SuperE5\
8 = Erdgas
attr CleverTanken enableControlSet 1
attr CleverTanken reading01DeleteIfUnmatched 1
attr CleverTanken reading01Name Tankstellenname
attr CleverTanken reading01RegOpt g
attr CleverTanken reading01Regex <span class=\"fuel-station-location-name\">(.*)<\/span>
attr CleverTanken reading02DeleteIfUnmatched 1
attr CleverTanken reading02Name Preis
attr CleverTanken reading02RegOpt g
attr CleverTanken reading02Regex <div class=\"price-text price text-color-ct-blue\">(?>\s*)(\d.*)<sup>
attr CleverTanken reading03DeleteIfUnmatched 1
attr CleverTanken reading03Name Strasse
attr CleverTanken reading03RegOpt g
attr CleverTanken reading03Regex <div class=\"fuel-station-location-street\">(.*)<\/div>
attr CleverTanken reading04DeleteIfUnmatched 1
attr CleverTanken reading04Name Ort
attr CleverTanken reading04RegOpt g
attr CleverTanken reading04Regex <div class=\"fuel-station-location-city\">(.*)<\/div>
attr CleverTanken reading05DeleteIfUnmatched 1
attr CleverTanken reading05Name Entfernung
attr CleverTanken reading05RegOpt g
attr CleverTanken reading05Regex <div class=\"fuel-station-location-distance d-flex justify-content-end\">(?>\s*)<span>(\d.\d)
attr CleverTanken timeout 2
attr CleverTanken verbose 2
Nachtrag zu deiner Einlassung oben, dass du Diesel-1,-2 erwartest.
Siehe CommandRef:
Attribut "reading[xy]RegOpt g" ist dann bei mehrfachem Auftreten von reading[xy]Name nötig.
Zitat von: RalfRog am 02 Juni 2026, 21:36:22Attribut "reading[xy]RegOpt g" ist dann bei mehrfachem Auftreten von reading[xy]Name nötig.
Offenbar wohl nicht sonst könnte das List hier ja nicht funktionieren:
Internals:
BUSY 0
DEF https://www.clever-tanken.de/tankstelle_details/15360
FUUID 69d76140-f33f-7706-a7d6-12051dc493774932
FVERSION 98_HTTPMOD.pm:0.291590/2024-09-23
Interval 396
MainURL https://www.clever-tanken.de/tankstelle_details/15360
ModuleVersion 4.2.0 - 11.8.2023
NAME Tankstelle_HSe_ARAL_Roermonderstr
NOTIFYDEV global
NR 588
NTFY_ORDER 50-Tankstelle_HSe_ARAL_Roermonderstr
STATE Super E5: 1.99 € * Super E10: 1.93 € * Super Plus: 2.11 € * Diesel: 1.91 €
TYPE HTTPMOD
eventCount 5205
value
CompiledRegexes:
HTTPCookieHash:
csrftoken;:
Name csrftoken
Options expires=Tue, 01 Jun 2027 22:20:50 GMT; Max-Age=31449600; Path=/; SameSite=Lax
Path
Value 6T6esr2u7j1BGsgE4wg15PJYAUxFtV84
HttpUtils:
NAME
addr https://www.clever-tanken.de:443
auth 0
buf
code 200
compress 1
conn
data
displayurl https://www.clever-tanken.de/tankstelle_details/15360
header User-Agent: Mozilla/5.0 WindowsNT10.0 Chrome/120.0.0.0 Safari/537.36
Cookie: csrftoken=6T6esr2u7j1BGsgE4wg15PJYAUxFtV84
host www.clever-tanken.de
httpheader HTTP/1.1 200 OK
Date: Tue, 02 Jun 2026 22:20:50 GMT
Server: Apache/2.4.52 (Ubuntu)
Vary: Cookie,Accept-Encoding
Content-Encoding: gzip
Content-Type: text/html; charset=utf-8
Set-Cookie: csrftoken=6T6esr2u7j1BGsgE4wg15PJYAUxFtV84; expires=Tue, 01 Jun 2027 22:20:50 GMT; Max-Age=31449600; Path=/; SameSite=Lax
X-Correlation-Uid: ah9XQrz0h5kNjZw-oXv0SAAAACQ
Connection: close
Transfer-Encoding: chunked
httpversion 1.1
hu_blocking 0
hu_filecount 1
hu_port 443
hu_portSfx
ignoreredirects 1
loglevel 4
path /tankstelle_details/15360
protocol https
redirects 0
timeout 10
url https://www.clever-tanken.de/tankstelle_details/15360
sslargs:
QUEUE:
READINGS:
2026-06-03 00:02:09 Bioethanol_avg 0
2026-06-03 00:02:09 Bioethanol_complete 0
2026-06-03 00:02:09 Bioethanol_old 0
2026-06-03 00:02:09 CNG_avg 0
2026-06-03 00:02:09 CNG_complete 0
2026-06-03 00:02:09 CNG_old 0
2026-06-03 00:20:50 Diesel-1 1.90
2026-06-03 00:20:50 Diesel-2 9
2026-06-03 00:08:42 Diesel_avg 1.85
2026-06-03 00:14:33 Diesel_complete 1.909
2026-06-03 00:14:33 Diesel_old 1.90
2026-06-03 00:02:09 LNG_avg 0
2026-06-03 00:02:09 LNG_complete 0
2026-06-03 00:02:09 LNG_old 0
2026-06-03 00:20:50 LPG-1 1.12
2026-06-03 00:20:50 LPG-2 9
2026-06-03 00:08:42 LPG_avg 1.11
2026-06-03 00:02:09 LPG_complete 1.129
2026-06-03 00:02:09 LPG_old 1.12
2026-06-03 00:20:50 Name ARAL
2026-06-03 00:20:50 Ort Heinsberg
2026-06-03 00:20:50 PLZ 52525
2026-06-03 00:20:50 Strasse Roermonder Str. 41
2026-06-03 00:20:50 SuperE10-1 1.92
2026-06-03 00:20:50 SuperE10-2 9
2026-06-03 00:08:42 SuperE10_avg 1.87
2026-06-03 00:14:33 SuperE10_complete 1.929
2026-06-03 00:14:33 SuperE10_old 1.92
2026-06-03 00:20:50 SuperE5-1 1.98
2026-06-03 00:20:50 SuperE5-2 9
2026-06-03 00:20:50 SuperE5_avg 1.93
2026-06-03 00:14:33 SuperE5_complete 1.989
2026-06-03 00:14:33 SuperE5_old 1.98
2026-06-03 00:20:50 SuperPlus-1 2.10
2026-06-03 00:20:50 SuperPlus-2 9
2026-06-03 00:20:50 SuperPlus_avg 2.02
2026-06-03 00:14:33 SuperPlus_complete 2.109
2026-06-03 00:14:33 SuperPlus_old 2.10
2026-06-03 00:02:09 Wasserstoff_avg 0
2026-06-03 00:02:09 Wasserstoff_complete 0
2026-06-03 00:02:09 Wasserstoff_old 0
2026-06-03 00:02:09 last_update 03.06.2026 00:00
2026-06-03 00:20:50 open_days-1 Samstag
2026-06-03 00:20:50 open_days-2 Sonntag
2026-06-03 00:20:50 open_days-3 Mo-Fr
2026-06-03 00:20:50 open_hours-1 8:00-20:00
2026-06-03 00:20:50 open_hours-2 9:00-20:00
2026-06-03 00:20:50 open_hours-3 7:00-20:00
2026-06-03 00:02:09 trigger_next_interval 1
REQUEST:
context reading
data
header User-Agent: Mozilla/5.0 WindowsNT10.0 Chrome/120.0.0.0 Safari/537.36
ignoreredirects 0
num unknown
retryCount 0
type update
url https://www.clever-tanken.de/tankstelle_details/15360
defptr:
readingBase:
Diesel-1 reading
Diesel-2 reading
LPG-1 reading
LPG-2 reading
Name reading
Ort reading
PLZ reading
Strasse reading
SuperE10-1 reading
SuperE10-2 reading
SuperE5-1 reading
SuperE5-2 reading
SuperPlus-1 reading
SuperPlus-2 reading
last_update reading
open_days-1 reading
open_days-2 reading
open_days-3 reading
open_hours-1 reading
open_hours-2 reading
open_hours-3 reading
readingNum:
Diesel-1 08
Diesel-2 08
LPG-1 12
LPG-2 12
Name 01
Ort 04
PLZ 03
Strasse 02
SuperE10-1 09
SuperE10-2 09
SuperE5-1 10
SuperE5-2 10
SuperPlus-1 11
SuperPlus-2 11
last_update 07
open_days-1 05
open_days-2 05
open_days-3 05
open_hours-1 06
open_hours-2 06
open_hours-3 06
readingOutdated:
readingSubNum:
Diesel-1 -1
Diesel-2 -2
LPG-1 -1
LPG-2 -2
SuperE10-1 -1
SuperE10-2 -2
SuperE5-1 -1
SuperE5-2 -2
SuperPlus-1 -1
SuperPlus-2 -2
open_days-1 -1
open_days-2 -2
open_days-3 -3
open_hours-1 -1
open_hours-2 -2
open_hours-3 -3
requestReadings:
update:
Diesel-1 reading 08-1
Diesel-2 reading 08-2
LPG-1 reading 12-1
LPG-2 reading 12-2
Name reading 01
Ort reading 04
PLZ reading 03
Strasse reading 02
SuperE10-1 reading 09-1
SuperE10-2 reading 09-2
SuperE5-1 reading 10-1
SuperE5-2 reading 10-2
SuperPlus-1 reading 11-1
SuperPlus-2 reading 11-2
last_update reading 07
open_days-1 reading 05-1
open_days-2 reading 05-2
open_days-3 reading 05-3
open_hours-1 reading 06-1
open_hours-2 reading 06-2
open_hours-3 reading 06-3
Attributes:
alias ARAL in Karken (Roermonder Str.)
enableControlSet 1
event-min-interval .*:1800
event-on-change-reading .*
group Informationen
httpVersion 1.1
icon fuel
model clever_tanken_single_station
reading01Name Name
reading01Regex <span class="strong-title" itemprop="name">(.*)</span>
reading02Name Strasse
reading02Regex <span itemprop="streetAddress">(.*)</span>
reading03Name PLZ
reading03Regex <span itemprop="http://schema.org/postalCode">(.*)</span>
reading04Name Ort
reading04Regex <span itemprop="http://schema.org/addressCountry">(.*)</span>
reading05Name open_days
reading05RegOpt g
reading05Regex <div class="d-flex justify-content-between weak-body">\s*<span>\s*(.*)<\/span>
reading06Name open_hours
reading06RegOpt g
reading06Regex <div class="d-flex justify-content-between weak-body">\s*<span>\s*.*<\/span>\s*<span>\s*(.*)<\/span>
reading07Name last_update
reading07Regex <span>Letzte Aktualisierung: (.*)</span>
reading08Name Diesel
reading08OExpr { ($val < 0.25) ? ReadingsNum($name,"Diesel-1",0) : $val }
reading08Regex <div[^>]*class="price-type-name"[^>]*>Diesel<\/div>[\s\S]*?<span[^>]*id="current-price-\d+"[^>]*>([\d.]+)<\/span>[\s\S]*?<sup[^>]*id="suffix-price-\d+"[^>]*>(\d+)<\/sup>
reading09Name SuperE10
reading09OExpr { ($val < 0.25) ? ReadingsNum($name,"SuperE10-1",0) : $val }
reading09Regex <div[^>]*class="price-type-name"[^>]*>Super E10<\/div>[\s\S]*?<span[^>]*id="current-price-\d+"[^>]*>([\d.]+)<\/span>[\s\S]*?<sup[^>]*id="suffix-price-\d+"[^>]*>(\d+)<\/sup>
reading10Name SuperE5
reading10OExpr { ($val < 0.25) ? ReadingsNum($name,"SuperE5-1",0) : $val }
reading10Regex <div[^>]*class="price-type-name"[^>]*>Super E5<\/div>[\s\S]*?<span[^>]*id="current-price-\d+"[^>]*>([\d.]+)<\/span>[\s\S]*?<sup[^>]*id="suffix-price-\d+"[^>]*>(\d+)<\/sup>
reading11Name SuperPlus
reading11OExpr { ($val < 0.25) ? ReadingsNum($name,"SuperPlus-1",0) : $val }
reading11Regex <div[^>]*class="price-type-name"[^>]*>ARAL Superplus<\/div>[\s\S]*?<span[^>]*id="current-price-\d+"[^>]*>([\d.]+)<\/span>[\s\S]*?<sup[^>]*id="suffix-price-\d+"[^>]*>(\d+)<\/sup>
reading12Name LPG
reading12OExpr { ($val < 0.25) ? ReadingsNum($name,"LPG-1",0) : $val }
reading12Regex <div[^>]*class="price-type-name"[^>]*>LPG<\/div>[\s\S]*?<span[^>]*id="current-price-\d+"[^>]*>([\d.]+)<\/span>[\s\S]*?<sup[^>]*id="suffix-price-\d+"[^>]*>(\d+)<\/sup>
reading13Name LNG
reading13OExpr { ($val < 0.25) ? ReadingsNum($name,"LNG-1",0) : $val }
reading13Regex <div[^>]*class="price-type-name"[^>]*>LNG<\/div>[\s\S]*?<span[^>]*id="current-price-\d+"[^>]*>([\d.]+)<\/span>[\s\S]*?<sup[^>]*id="suffix-price-\d+"[^>]*>(\d+)<\/sup>
reading14Name CNG
reading14OExpr { ($val < 0.25) ? ReadingsNum($name,"CNG-1",0) : $val }
reading14Regex <div[^>]*class="price-type-name"[^>]*>CNG<\/div>[\s\S]*?<span[^>]*id="current-price-\d+"[^>]*>([\d.]+)<\/span>[\s\S]*?<sup[^>]*id="suffix-price-\d+"[^>]*>(\d+)<\/sup>
reading15Name Bioethanol
reading15OExpr { ($val < 0.25) ? ReadingsNum($name,"Bioethanol-1",0) : $val }
reading15Regex <div[^>]*class="price-type-name"[^>]*>Bioethanol<\/div>[\s\S]*?<span[^>]*id="current-price-\d+"[^>]*>([\d.]+)<\/span>[\s\S]*?<sup[^>]*id="suffix-price-\d+"[^>]*>(\d+)<\/sup>
reading16Name Wasserstoff
reading16OExpr { ($val < 0.25) ? ReadingsNum($name,"Wasserstoff-1",0) : $val }
reading16Regex <div[^>]*class="price-type-name"[^>]*>Wasserstoff<\/div>[\s\S]*?<span[^>]*id="current-price-\d+"[^>]*>([\d.]+)<\/span>[\s\S]*?<sup[^>]*id="suffix-price-\d+"[^>]*>(\d+)<\/sup>
readingOExpr $val =~ s/<[\d\D]+>//;;$val
requestHeader1 User-Agent: Mozilla/5.0 WindowsNT10.0 Chrome/120.0.0.0 Safari/537.36
room Information->Spritpreise
stateFormat {
if (InternalVal($name,"LAST_ERROR","") ne "") {
return "⚠️ FEHLER: Automatischer Abruf fehlgeschlagen! (Daten veraltet)";
} else {
sprintf("Super E5: %.2f € * Super E10: %.2f € * Super Plus: %.2f € * Diesel: %.2f €",
ReadingsNum($name,"SuperE5-1",0) + 0.01,
ReadingsNum($name,"SuperE10-1",0) + 0.01,
ReadingsNum($name,"SuperPlus-1",0) + 0.01,
ReadingsNum($name,"Diesel-1",0) + 0.01) ;
}
}
timeout 10
timestamp-on-change-reading .*
userReadings Diesel_old { OldReadingsNum($name,"Diesel-1", ReadingsNum($name,"Diesel-1",0)) },
SuperE5_old { OldReadingsNum($name,"SuperE5-1", ReadingsNum($name,"SuperE5-1",0)) },
SuperE10_old { OldReadingsNum($name,"SuperE10-1", ReadingsNum($name,"SuperE10-1",0)) },
SuperPlus_old { OldReadingsNum($name,"SuperPlus-1", ReadingsNum($name,"SuperPlus-1",0)) },
LPG_old { OldReadingsNum($name,"LPG-1", ReadingsNum($name,"LPG-1",0)) },
LNG_old { OldReadingsNum($name,"LNG-1", ReadingsNum($name,"LNG-1",0)) },
CNG_old { OldReadingsNum($name,"CNG-1", ReadingsNum($name,"CNG-1",0)) },
Bioethanol_old { OldReadingsNum($name,"Bioethanol-1", ReadingsNum($name,"Bioethanol-1",0)) },
Wasserstoff_old { OldReadingsNum($name,"Wasserstoff-1", ReadingsNum($name,"Wasserstoff-1",0)) },
Diesel_complete { ReadingsNum($name,"Diesel-1", 0) + (ReadingsNum($name,"Diesel-2", 0) / 1000) },
SuperE5_complete { ReadingsNum($name,"SuperE5-1", 0) + (ReadingsNum($name,"SuperE5-2", 0) / 1000) },
SuperE10_complete { ReadingsNum($name,"SuperE10-1", 0) + (ReadingsNum($name,"SuperE10-2", 0) / 1000) },
SuperPlus_complete { ReadingsNum($name,"SuperPlus-1", 0) + (ReadingsNum($name,"SuperPlus-2", 0) / 1000) },
LPG_complete { ReadingsNum($name,"LPG-1", 0) + (ReadingsNum($name,"LPG-2", 0) / 1000) },
LNG_complete { ReadingsNum($name,"LNG-1", 0) + (ReadingsNum($name,"LNG-2", 0) / 1000) },
CNG_complete { ReadingsNum($name,"CNG-1", 0) + (ReadingsNum($name,"CNG-2", 0) / 1000) },
Bioethanol_complete { ReadingsNum($name,"Bioethanol-1", 0) + (ReadingsNum($name,"Bioethanol-2", 0) / 1000) },
Wasserstoff_complete { ReadingsNum($name,"Wasserstoff-1", 0) + (ReadingsNum($name,"Wasserstoff-2", 0) / 1000) },
Diesel_avg { ReadingsNum("Diesel","Durchschnitt",0) },
SuperE5_avg { ReadingsNum("SuperE5","Durchschnitt",0) },
SuperE10_avg { ReadingsNum("SuperE10","Durchschnitt",0) },
SuperPlus_avg { ReadingsNum("SuperPlus","Durchschnitt",0) },
LPG_avg { ReadingsNum("LPG","Durchschnitt",0) },
LNG_avg { ReadingsNum("LNG","Durchschnitt",0) },
CNG_avg { ReadingsNum("CNG","Durchschnitt",0) },
Bioethanol_avg { ReadingsNum("Bioethanol","Durchschnitt",0) },
Wasserstoff_avg { ReadingsNum("Wasserstoff","Durchschnitt",0) },
trigger_next_interval:.* { fhem("set $name interval " . (360 + int(rand(120)) - 60));; return 1;; },
userattr
verbose 3Wie man sieht werden die Readings bei Mehrfachmatches auch ohne "reading[xy]RegOpt g" mit der Erweiterung -1, -2, etc. ganz normal geschrieben. Scheint dann wohl eine Diskrepanz in der Doku zu sein.
Nachdem ich das readingsMaxAge und das readingMaxAgeReplacementMode gelöscht hatte ging es wieder Problemlos. Alle anderen Änderungen sind wahrscheinlich nicht nötig, erhöhen aber den Schutz vor einer Boterkennung.
Offenbar hat Marko1976 mal wieder Verständnisschwierigkeiten, er kennt den Unterschied zwischen Sprachmodell und Sprachassistent nicht.
ZitatKI ist eine Datenbank mit milliarden von Eingaben programmiert und sucht lediglich aus all diesen Informationen die passensdte Lösung heraus.
Das ist granatenmäßiger Unsinn. ;D
pah