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.