FHEM Forum

FHEM => Sonstiges => Thema gestartet von: Marko1976 am 31 Mai 2026, 17:43:52

Titel: HTTPMOD liest bei Clever-Tanken nur 0 aus
Beitrag von: Marko1976 am 31 Mai 2026, 17:43:52
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.