HTTPMOD liest bei Clever-Tanken nur 0 aus

Begonnen von Marko1976, 31 Mai 2026, 17:43:52

Vorheriges Thema - Nächstes Thema

Marko1976

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.

RalfRog

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
FHEM VM Debian13 (trixie) auf Proxmox VE9  (Futro S740) - nanoCUL, HM-MOD-RPI-PCB und MAX!Cube über LAN
HM- Fensterkontakte, UP-Schalter, Bewegungsmelder und ein Rauchmelder sowie Shelly 3EM, 1PM, PlugS und IT Schaltsteckdosen

Otto123

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
Viele Grüße aus Leipzig  ⇉  nächster Stammtisch an der Lindennaundorfer Mühle

aktives Mitglied des FHEM e.V. (Technik)

betateilchen

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)
-----------------------
Formuliere die Aufgabe möglichst einfach und
setze die Lösung richtig um - dann wird es auch funktionieren.
-----------------------
Lesen gefährdet die Unwissenheit!

Otto123

#4
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 20201129
Zumal 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.
Viele Grüße aus Leipzig  ⇉  nächster Stammtisch an der Lindennaundorfer Mühle

aktives Mitglied des FHEM e.V. (Technik)

Marko1976

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

RalfRog

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ß
FHEM VM Debian13 (trixie) auf Proxmox VE9  (Futro S740) - nanoCUL, HM-MOD-RPI-PCB und MAX!Cube über LAN
HM- Fensterkontakte, UP-Schalter, Bewegungsmelder und ein Rauchmelder sowie Shelly 3EM, 1PM, PlugS und IT Schaltsteckdosen

Marko1976

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.

Marko1976

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

Marko1976

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

DeeSPe

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
MAINTAINER: 22_HOMEMODE, 98_Hyperion, 98_FileLogConvert, 98_serviced

Als kleine Unterstützung für meine Programmierungen könnt ihr mir gerne einen Kaffee spendieren: https://buymeacoff.ee/DeeSPe

DeeSPe

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.
MAINTAINER: 22_HOMEMODE, 98_Hyperion, 98_FileLogConvert, 98_serviced

Als kleine Unterstützung für meine Programmierungen könnt ihr mir gerne einen Kaffee spendieren: https://buymeacoff.ee/DeeSPe

Marko1976

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.

DeeSPe

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
MAINTAINER: 22_HOMEMODE, 98_Hyperion, 98_FileLogConvert, 98_serviced

Als kleine Unterstützung für meine Programmierungen könnt ihr mir gerne einen Kaffee spendieren: https://buymeacoff.ee/DeeSPe

Marko1976

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.