Neue Version von HTTPMOD mit neuen Features zum Testen

Begonnen von StefanStrobel, 05 Dezember 2015, 08:31:32

Vorheriges Thema - Nächstes Thema

ch.eick

Hallo zusammen,

ich habe da noch ein Problem gefunden.
Bei einem get mit JSON und OExpr wird die OExpr anscheinend für jedes reading durchlaufen, es sollte aber nur für das definierte reading sein.
attr EVU_Tibber get02Data { "query": "{viewer {home(id:\"%%homeID%%\") {currentSubscription {priceInfo {current {total startsAt} today {total startsAt} tomorrow {total startsAt}}}}}}" }

attr EVU_Tibber get02JSON data_viewer_home_currentSubscription_priceInfo

attr EVU_Tibber get02-1Name current_date
attr EVU_Tibber get02-1OExpr $val =~ s/T/ /g ;; substr($val,0,19)
attr EVU_Tibber get02-2Name current_price                            <<<< hier gibt es kein OExpr, es wird aber get02-1OExpr angewendet
attr EVU_Tibber get02-3Name fc0_00_startsAt                          <<<< da soll es auch verwendet werden, aber ist noch nicht angegeben.
attr EVU_Tibber get02-4Name fc0_00_total
attr EVU_Tibber get02-5Name fc0_01_startsAt
attr EVU_Tibber get02-6Name fc0_01_total

< snip >

attr EVU_Tibber get02Header01 Content-Type: application/json
attr EVU_Tibber get02Header02 Authorization: Bearer %%token%%
attr EVU_Tibber get02Name 02_priceAll
attr EVU_Tibber get02URL https://api.tibber.com/v1-beta/gql
Das ist zwar jetzt ganz schön, weil ich es nur einmal devinieren muss, könnte aber zu side effects führen.

2023.04.04 13:35:23.882 5: EVU_Tibber: perl expression eval evaluated package main; my $timeDiff = $oRef->{'$timeDiff'};$val =~ s/T/ /g ; substr($val,0,19) to 2023-04-05 21:00:00
2023.04.04 13:35:23.882 5: EVU_Tibber: ExtractReading for get02-93 sets 02_priceAll-93 to 2023-04-05 21:00:00
2023.04.04 13:35:23.882 5: EVU_Tibber: ExtractReading value as hex is 323032332d30342d30352032313a30303a3030
2023.04.04 13:35:23.883 5: EVU_Tibber: perl expression eval evaluated package main; my $timeDiff = $oRef->{'$timeDiff'};$val =~ s/T/ /g ; substr($val,0,19) to 0.347
2023.04.04 13:35:23.883 5: EVU_Tibber: ExtractReading for get02-94 sets 02_priceAll-94 to 0.347
2023.04.04 13:35:23.883 5: EVU_Tibber: ExtractReading value as hex is 302e333437
2023.04.04 13:35:23.884 5: EVU_Tibber: perl expression eval evaluated package main; my $timeDiff = $oRef->{'$timeDiff'};$val =~ s/T/ /g ; substr($val,0,19) to 2023-04-05 22:00:00
2023.04.04 13:35:23.884 5: EVU_Tibber: ExtractReading for get02-95 sets 02_priceAll-95 to 2023-04-05 22:00:00
2023.04.04 13:35:23.884 5: EVU_Tibber: ExtractReading value as hex is 323032332d30342d30352032323a30303a3030

VG  Christian
RPI4; Docker; CUNX; Eltako FSB61NP; SamsungTV H-Serie; Sonos; Vallox; Luxtronik; 3x FB7490; Stromzähler mit DvLIR; wunderground; Plenticore 10 mit BYD; EM410; SMAEM; Modbus TCP
Contrib: https://svn.fhem.de/trac/browser/trunk/fhem/contrib/ch.eick

StefanStrobel

Hallo Christian,

da hast Du einen uralten Bug gefunden. Thanx!
Hier eine neue Version.

Gruss
   Stefan

schwatter

Nabend,

ab und zu kommt es vor, das ich einen Wert "0.0" bekomme, da das Device down ist. Der letzte Wert zum Beispiel ist "472.4"
Meine Regex ist
(\d+[.]\d+)
Ich habe schon eine angepasste Regex probiert, für Werte von 0.1 bis 9999.9.
(9999(\.[0-9])?|[1-9][0-9]{0,3}(\.[0-9])?|0?\.[1-9])
Diese wird aber nicht genommen. Ist es möglich "0.0" explizit zu ignorieren?
Ich habe auch schon mit MaxAge und MaxAgeReplacement $val rumgespielt, bisher ohne Erfolg.
Auch da lief es auf "0.0" hinaus.

Gruß schwatter

StefanStrobel

Hallo schwatter,

poste doch mal Deine vollständige Konfiguration.
Vermutlich hängt es nicht an der Regex ...

Gruss
   Stefan

schwatter

#1264
Nabend,

habe mehrere Microinverter die schlafen gehen.

Internals:
   BUSY       0
   DEF        http://xxx:xxx@192.168.178.72/status.html 300
   FUUID      63255e2b-f33f-86cf-e15c-d8a18dcd0b074ca6
   Interval   300
   MainURL    http://xxx:xxx@192.168.178.72/status.html
   ModuleVersion 4.1.15 - 17.12.2022
   NAME       PV_Deye1600_01
   NOTIFYDEV  global
   NR         373
   NTFY_ORDER 50-PV_Deye1600_01
   STATE      Aktuell: 0 Wh - Heute: 6.0 kWh - Total: 478.4 kWh<br>
Rssi: 59% - Ip: 192.168.178.72 - 2023-04-18 20:22:45
   TYPE       HTTPMOD
   eventCount 454
   value     
   CompiledRegexes:
   HttpUtils:
     NAME       
     addr       http://192.168.178.72:80
     auth       1
     data       
     displayurl http://xxx:xxx@192.168.178.72/status.html
     errno      113
     header     
     host       192.168.178.72
     httpversion 1.0
     ignoreredirects 1
     loglevel   4
     path       /status.html
     protocol   http
     pwd        xxx
     redirects  0
     timeout    8
     url        http://xxx:xxx@192.168.178.72/status.html
     user       xxx
     sslargs:
   QUEUE:
   READINGS:
     2023-04-18 20:17:49   IP              192.168.178.72
     2023-04-18 20:22:45   Power           0
     2023-04-18 20:17:49   RSSI            59
     2023-01-01 22:10:26   Start_Kw        241672
     2023-04-18 20:12:42   Today           6.0
     2023-04-18 20:12:42   Total           478.4
     2023-04-17 19:27:41   Total-1         472.4
     2023-04-17 19:27:41   Total-3         .4
     2023-04-13 21:16:24   Zero            0
   REQUEST:
     context    reading
     data       
     header     
     ignoreredirects 0
     num        unknown
     retryCount 0
     type       update
     url        http://xxx:xxx@192.168.178.72/status.html
   defptr:
     readingBase:
       IP         reading
       Power      reading
       RSSI       reading
       Today      reading
       Total      reading
       Total-1    reading
       Total-2    reading
       Total-3    reading
     readingNum:
       IP         05
       Power      01
       RSSI       04
       Today      02
       Total      03
       Total-1    03
       Total-2    03
       Total-3    03
     readingOutdated:
       Power      1
       Total-1    1
       Total-3    1
     readingSubNum:
       Total-1    -1
       Total-2    -2
       Total-3    -3
     requestReadings:
       update:
         IP         reading 05
         Power      reading 01
         RSSI       reading 04
         Today      reading 02
         Total      reading 03
         Total-1    reading 03-1
         Total-2    reading 03-2
         Total-3    reading 03-3
   hmccu:
Attributes:
   cmdIcon    reread:refresh
   enforceGoodReadingNames 1
   icon       solar
   reading01MaxAge 600
   reading01MaxAgeReplacement Zero
   reading01MaxAgeReplacementMode reading
   reading01Name Power
   reading01Regex var webdata_now_p = "(\d+)"
   reading02MaxAge 61200
   reading02MaxAgeReplacement $val
   reading02MaxAgeReplacementMode expression
   reading02Name Today
   reading02Regex var webdata_today_e = "(\d+[.]\d+)"
   reading03MaxAge 61200
   reading03MaxAgeReplacement $val
   reading03MaxAgeReplacementMode expression
   reading03Name Total
   reading03Regex var webdata_total_e = "(\d+[.]\d+)"
   reading04Name RSSI
   reading04Regex var cover_sta_rssi = "(100|[1-9]?\d)%"
   reading05Name IP
   reading05Regex var cover_sta_ip = "(\d+[.]\d+[.]\d+[.]\d+)"
   room       14.PV
   stateFormat Aktuell: [$name:Power] Wh - Heute: [$name:Today] kWh - Total: [$name:Total] kWh<br>
Rssi: [$name:RSSI]% - Ip: [$name:IP] - [$name:Power:t]
   timeout    8
   webCmd     reread

defmod PV_Deye1600_01 HTTPMOD http://xxx:xxx@192.168.178.72/status.html 300
attr PV_Deye1600_01 cmdIcon reread:refresh
attr PV_Deye1600_01 enforceGoodReadingNames 1
attr PV_Deye1600_01 icon solar
attr PV_Deye1600_01 reading01MaxAge 600
attr PV_Deye1600_01 reading01MaxAgeReplacement Zero
attr PV_Deye1600_01 reading01MaxAgeReplacementMode reading
attr PV_Deye1600_01 reading01Name Power
attr PV_Deye1600_01 reading01Regex var webdata_now_p = "(\d+)"
attr PV_Deye1600_01 reading02MaxAge 61200
attr PV_Deye1600_01 reading02MaxAgeReplacement $val
attr PV_Deye1600_01 reading02MaxAgeReplacementMode expression
attr PV_Deye1600_01 reading02Name Today
attr PV_Deye1600_01 reading02Regex var webdata_today_e = "(\d+[.]\d+)"
attr PV_Deye1600_01 reading03MaxAge 61200
attr PV_Deye1600_01 reading03MaxAgeReplacement $val
attr PV_Deye1600_01 reading03MaxAgeReplacementMode expression
attr PV_Deye1600_01 reading03Name Total
attr PV_Deye1600_01 reading03Regex var webdata_total_e = "(\d+[.]\d+)"
attr PV_Deye1600_01 reading04Name RSSI
attr PV_Deye1600_01 reading04Regex var cover_sta_rssi = "(100|[1-9]?\d)%"
attr PV_Deye1600_01 reading05Name IP
attr PV_Deye1600_01 reading05Regex var cover_sta_ip = "(\d+[.]\d+[.]\d+[.]\d+)"
attr PV_Deye1600_01 room 14.PV
attr PV_Deye1600_01 stateFormat Aktuell: [$name:Power] Wh - Heute: [$name:Today] kWh - Total: [$name:Total] kWh<br>\
Rssi: [$name:RSSI]% - Ip: [$name:IP] - [$name:Power:t]
attr PV_Deye1600_01 timeout 8
attr PV_Deye1600_01 webCmd reread

setstate PV_Deye1600_01 Aktuell: 0 Wh - Heute: 6.0 kWh - Total: 478.4 kWh<br>\
Rssi: 59% - Ip: 192.168.178.72 - 2023-04-18 20:22:45
setstate PV_Deye1600_01 2023-04-18 20:17:49 IP 192.168.178.72
setstate PV_Deye1600_01 2023-04-18 20:22:45 Power 0
setstate PV_Deye1600_01 2023-04-18 20:17:49 RSSI 59
setstate PV_Deye1600_01 2023-01-01 22:10:26 Start_Kw 241672
setstate PV_Deye1600_01 2023-04-18 20:12:42 Today 6.0
setstate PV_Deye1600_01 2023-04-18 20:12:42 Total 478.4
setstate PV_Deye1600_01 2023-04-17 19:27:41 Total-1 472.4
setstate PV_Deye1600_01 2023-04-17 19:27:41 Total-3 .4
setstate PV_Deye1600_01 2023-04-13 21:16:24 Zero 0

reading01MaxAgeReplacement ist gewollt und wird auf "0" gesetzt.
Heute ist mal alles ok....

Gruß schwatter

StefanStrobel

#1265
Um welches Reading geht es denn?
Wie sieht die Response aus, wenn 0.0 herauskommt?
Und antwortet das Gerät in dem Fall überhaupt?
Kannst Du mal verbose auf 5 setzen und dann einen Auszug aus dem Log schicken, in dem man sieht, was im Fehlerfall als Antwort gesendet wird und wie diese Antwort Geparden wird?

Gruß
    Stefan

StefanStrobel


schwatter

Nabend,

ok, werde ich versuchen. Es geht um die Readings Today und Total. Power setzte ich gewollt auf 0.
Momentan kann ich nix beitragen. Heute ist der 2 Tag, an dem es bei allen 3 Invertern ohne Ausfall
mit meinen Settings klappt... Kann nur mutmaßen, das bei Schwachlicht am Abend kurzzeitig 0.0
im Inverterlogger angezeigt wird.

Gruß schwatter

StefanStrobel

Hallo,

bist Du sicher, dass 0.0 kommt weil das Device down ist und nicht weil das Device tatsächlich 0.0 liefert?
Wenn ein Webserver keine Daten liefert, dann setzt HTTPMOD auch keine Readings. Lediglich das MaxAge greift dann eventuell, wobei das auch nur aktiv wird, wenn gelesene Daten verarbeitet werden.

Wenn Dein Device tatsächlich aktiv ist und 0.0 liefert und Du nur bei diesem Wert verhindern möchtest, dass Readings aktualisiert werden, dann geht das ggf. mit einer IgnoreExpr. Die fehlt noch in der Doku (siehe https://forum.fhem.de/index.php?topic=45176.1155). Funktioniert aber wie bei Modbus. Wenn die Expression 1 liefert, dann wird der Wert ignoriert. Also z.B. $val eq '0'
Gruss
  Stefan

schwatter

Nabend,

vor 3 Tagen ist es wieder passiert. Gestern nicht, als ich geloggt habe...
Sicher bi ich mir nicht, passiert halt kurz vor Ende. Vielleicht passiert da etwas
wie schlaf, aufwachen,schlaf und dann kommt kurz Müll.

Danke für den Link, das hier

attr reading01IgnoreExpr $val <= $oldVal
sieht doch genau danach aus, wonach ich suche.

Gruß schwatter

mumpitzstuff

Gibt es eine einfache Möglichkeit das überschreiben der Readings zu verhindern, wenn man sich über getXURL mehrere requests definiert hat, welche einen JSON Output zurück liefern, bei denen sich nur die Werte unterscheiden? Aktuell Habe ich nach dem Aufruf von get1URL die Daten der ersten Abfrage in den Readings und diese werden durch die Abfrage von get2URL wieder überschrieben. Der Einfachheit halber habe ich ExtractAllJson aktuell auf 1 stehen.

StefanStrobel

Hallo mumpitzstuff,

wenn Du in einer JSON-Response mit ExtractAllJson alle Werte in Readings packst, dann werden evt. schon existierende Readings mit gleichem Namen überschrieben.
Wenn Du nur wenige Readings überschreiben möchtest, dann müsstest Di ExtractAllJson rausnehmen und nur die Readings explizit angeben, die bei dem Request auch relevant sind.

Gruss
   Stefan

DigiNecro

Zitat von: betateilchen am 22 Februar 2023, 14:05:16
Zitat von: DigiNecro am 22 Februar 2023, 10:16:30Sorry, ich bin gerade bissl eingespannt. Ich werd aber mal was zusammenstellen. Danke für das Angebot!

Warum für alles immer HTTPMOD, insbesondere wenn das Ergebnis JSON ist?
Das werde ich in diesem Leben wohl nicht mehr verstehen.

defmod witzapi JsonMod https://witzapi.de/api/joke/?language=de
attr witzapi readingList complete()

Funktioniert einwandfrei, auch mit den indischen Nachbarn - siehe Screenshot.

Lag einfach daran, dass ich da grad mit HTTPMOD rumgespielt hab  O:-)

debu

Hallo zusammen,

ich würde gerne einen POST request über fhem absetzen. Scheinbar ist HTTPMOD das Mittel der Wahl. Allerdings bekomme ich es leider nicht zum laufen. Bekomme immer einen 405 Method not allowed. Es wird trozt meiner settings ein GET request abgesetzt.
Internals:
   BUSY       0
   CFGFN     
   DEF        none 0
   FUUID      64a90d06-f33f-3cde-fac8-892deebaad2ddb85
   Interval   0
   MainURL   
   ModuleVersion 4.1.12 - 19.4.2022
   NAME       tedee_lock
   NOTIFYDEV  global
   NR         1495420
   NTFY_ORDER 50-tedee_lock
   STATE      ???
   TYPE       HTTPMOD
   eventCount 4
   httpbody   
   value     
   CompiledRegexes:
   HttpUtils:
     NAME       
     addr       https://api.tedee.com:443
     auth       0
     buf       
     code       405
     compress   1
     conn       
     data       
     displayurl https://api.tedee.com/api/v1.30/my/lock/***/operation/lock
     header     Accept: application/json
Authorization: ***
Content-Type: application/json
User-Agent: PostmanRuntime/7.29.2
Access-Control-Request-Method: POST
X-HTTP-Method-Override: POST
     host       api.tedee.com
     httpheader HTTP/1.1 405 Method Not Allowed
Content-Length: 0
Connection: close
Date: Sat, 08 Jul 2023 09:06:18 GMT
Allow: POST
Request-Context: **********
Strict-Transport-Security: max-age=2592000
X-Correlation-ID: '*****************'
     httpversion 1.0
     hu_blocking 0
     hu_filecount 1
     hu_port    443
     hu_portSfx
     ignoreredirects 1
     loglevel   4
     path       /api/v1.30/my/lock/***/operation/lock
     protocol   https
     redirects  0
     timeout    2
     url        https://api.tedee.com/api/v1.30/my/lock/***/operation/lock
     sslargs:
   QUEUE:
   READINGS:
   REQUEST:
     context    get
     data       
     header     Accept: application/json
Authorization: ***
Content-Type: application/json
User-Agent: PostmanRuntime/7.29.2
Access-Control-Request-Method: POST
X-HTTP-Method-Override: POST
     ignoreredirects 0
     num        1
     retryCount 0
     type       get1
     url        https://api.tedee.com/api/v1.30/my/lock/***/operation/lock
     value     
Attributes:
   get1Header1 Accept: application/json
   get1Header2 Authorization: ***
   get1Header3 Content-Type: application/json
   get1Header4 User-Agent: PostmanRuntime/7.29.2
   get1Header5 Access-Control-Request-Method: POST
   get1Header6 X-HTTP-Method-Override: POST
   get1Name   lock
   get1URL    https://api.tedee.com/api/v1.30/my/lock/***/operation/lock
   reading1Name success
   reading1Regex success':([\d\.]+)
   requestData { "test": "success"}
   requestHeader1 Accept: application/json
   requestHeader2 Authorization: ***
   requestHeader3 Content-Type: application/json
   requestHeader4 User-Agent: PostmanRuntime/7.29.2
   requestHeader5 Access-Control-Request-Method: POST
   requestHeader6 X-HTTP-Method-Override: POST
   room       Server
   set01Name  lock
   set01URL   https://api.tedee.com/api/v1.30/my/lock/***/operation/lock
   showBody   1
   showError  1

Was mach ich falsch? Oder ist HTTPMOD nicht geeignet fpr POST requests?

Danke und beste Grüße
debu

debu

Hi zusammen,

habs doch noch hinbekommen. POST geht wohl nur über set* Attribute.
Internals:
   BUSY       0
   CFGFN     
   DEF        none 0
   FUUID      64a90d06-f33f-3cde-fac8-892deebaad2ddb85
   Interval   0
   MainURL   
   ModuleVersion 4.1.12 - 19.4.2022
   NAME       tedee_lock
   NOTIFYDEV  global
   NR         1495420
   NTFY_ORDER 50-tedee_lock
   STATE      ???
   TYPE       HTTPMOD
   eventCount 23
   httpbody   {"success":true}
   value      01
   CompiledRegexes:
   HttpUtils:
     NAME       
     addr       https://api.tedee.com:443
     auth       0
     code       202
     compress   1
     conn       
     data       {"dummy" : "test"}
     displayurl https://api.tedee.com/api/v1.30/my/lock/***/operation/lock
     header     Accept: application/json
Authorization: ***
Content-Type: application/json
     host       api.tedee.com
     httpheader HTTP/1.1 202 Accepted
Connection: close
Content-Type: application/json; charset=utf-8
X-Correlation-ID: ****
     httpversion 1.0
     hu_blocking 0
     hu_filecount 1
     hu_port    443
     hu_portSfx
     ignoreredirects 1
     loglevel   4
     method     POST
     path       /api/v1.30/my/lock/***/operation/lock
     protocol   https
     redirects  0
     timeout    2
     url        https://api.tedee.com/api/v1.30/my/lock/***/operation/lock
     sslargs:
   QUEUE:
   READINGS:
   REQUEST:
     context    set
     data       {"dummy" : "test"}
     header     Accept: application/json
Authorization: ***
Content-Type: application/json
     ignoreredirects 0
     method     POST
     num        01
     retryCount 0
     type       set01
     url        https://api.tedee.com/api/v1.30/my/lock/***/operation/lock
     value      01
Attributes:
   enableCookies 1
   handleRedirects 1
   reading01Name success
   reading01Regex success':([\d\.]+)
   room       Server
   set01Data  {"dummy" : "test"}
   set01Header1 Accept: application/json
   set01Header2 Authorization: ***
   set01Header3 Content-Type: application/json
   set01Method POST
   set01Name  lock
   set01URL   https://api.tedee.com/api/v1.30/my/lock/***/operation/lock
   showBody   1
   showError  1
   webCmd     lock 01

Beste Grüße
DeBu