Neue Version von HTTPMOD mit neuen Features zum Testen

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

Vorheriges Thema - Nächstes Thema

Onkel.Tom


Hallo Stefan,

im Schritt #4 kommt in der Tat ein js-File zurück.
Ich kann mit meinem Wissen dort nicht wirklich etwas herauslesen.

Anbei das File:
Du darfst diesen Dateianhang nicht ansehen.


Bin weiterhin für jede Hilfestellung dankbar !

Viele Grüße
Onkel Tom

StefanStrobel

Hallo Onkel Tom,

da müsste sich jemand mit etwas mehr JS-Erfahrung drum kümmern. ich bin da raus.
Aber prinzipiell müssen ja alle Session-Werte irgendwo im JS-Code erzeugt werden, wenn sie später an den Server geschickt werden.

Gruss
   Stefan

fireball

Hi,

ich habe es geschafft meine Katzenklappe mit HTTPMod abzufragen.
Geht das ganze auch etwas komprimierter?
Ich setze für jedes GET den sid-Token und Content-Type und für die Main-URL musste ich auch nochmal die RequestHeader1/2 setzen, sonst ging die Abfrage gar nicht.

Attributes:
   devStateIcon 1:FS20.on 2:FS20.off
   enableControlSet 1
   enableCookies 1
   event-on-change-reading .*
   extractAllJSON 1
   get01CheckAllReadings 0
   get01ExtractAllJSON 0
   get01Header01 Authorization: Bearer $sid
   get01Header02 Content-Type: application/json, Accept: application/json
   get01Name  Kami
   get01URL   https://app.api.surehub.io/api/pet/xxxxxx
   get02ExtractAllJSON 0
   get02Header01 Authorization: Bearer $sid
   get02Header02 Content-Type: application/json, Accept: application/json
   get02Name  Geräte
   get02URL   https://app.api.surehub.io/api/device
   get03ExtractAllJSON 0
   get03Header01 Authorization: Bearer $sid
   get03Header02 Content-Type: application/json, Accept: application/json
   get03Name  Status
   get03URL   https://app.api.surehub.io/api/pet/?with[]=status&with[]=photo
   get04Header01 Authorization: Bearer $sid
   get04Header02 Content-Type: application/json, Accept: application/json
   get04Name  Maui
   get04URL   https://app.api.surehub.io/api/pet/xxxxxxx
   httpVersion 1.1
   icon       dog_silhouette
   reAuthRegex .*401.*
   replacement01Mode key
   replacement01Regex %%Katzenklappe_Secret%%
   replacement01Value Katzenklappe_Secret
   requestHeader1 Authorization: Bearer $sid
   requestHeader2 Content-Type: application/json, Accept: application/json
   room       GARAGE
   showBody   0
   showError  1
   sid1Data   {"email_address":"email","password":"%%Katzenklappe_Secret%%","device_id":"xxxxxxx"}
   sid1Header1 Content-Type: application/json
   sid1Header2 Accept: application/json
   sid1IdJSON data_token
   sid1URL    https://app.api.surehub.io/api/auth/login
   stateFormat Maui: data_pets_01_position_where <br> Kami: data_pets_02_position_where
   verbose    0

Außerdem würde ich gern in FHEMWEB die beiden Nummern für stateFormat mit Bildern formatieren, aber komme da irgendwie ins straucheln...

Viell. hat noch jemand einen Tipp?

VG
René

StefanStrobel

#1338
Wenn Du statt get01Header01 und get01Header02 etc. getHeader01 und getHeader02 verwendest, dann gelten die übergreifend für alle gets.

Gruß
    Stefan

fireball


alkazaa

Moin!
Vorweg: mein im folgenden beschriebenes device tut was es soll, aber es erscheint eine Fehlermeldung im Log, die möglicherweise auf einen (unschädlichen) bug hindeutet (oder ich mache was falsch, kann natürlich sein).

Ich nutze ein HTTPMOD device, dass zwei readings erzeugt: eins von der MainUrl, das mittels eines 'reading01XPath-Strict' geparsed wird, und eins von einer anderen URL (aber vom gleichen physikalischen device), das mittels 'get02JSON' geparsed wird.

Bei einem reread erscheint (mit verbose 3) dies im Event Monitor:
2025-05-22 10:02:36.637 HTTPMOD PVAnlage reread
2025.05.22 10:02:36.693 3: PVAnlage: Content-Type was application/xml
2025-05-22 10:02:36.717 HTTPMOD PVAnlage AC_Power: 399.5
2025-05-22 10:02:37.818 HTTPMOD PVAnlage total_AC_Energy: 14962.224

bzw. bei verbose 4:
2025.05.22 10:04:40.667 4: PVAnlage: GetUpdate called (reread)
2025.05.22 10:04:40.670 4: PVAnlage: HandleSendQueue sends update with timeout 2 to http://wechselrichter/measurements.xml?, No Data, No Header
2025.05.22 10:04:40.674 4: PVAnlage: GetUpdate will request total_AC_Energy
2025-05-22 10:04:40.684 HTTPMOD PVAnlage reread
2025.05.22 10:04:40.764 4: PVAnlage: Read callback: request type was update retry 0, header: HTTP/1.1 200 OK Content-Type: application/xml Cache-Control: no-cache, body length 1716
2025.05.22 10:04:40.765 4: PVAnlage: BodyDecode is not decoding the response body (charset not found, bodyDecode defaults to none)
2025.05.22 10:04:40.766 4: PVAnlage: error while parsing JSON data: malformed JSON string, neither tag, array, object, number, string or atom, at character offset 0 (before "<?xml version='1.0' ...") at lib/FHEM/HTTPMOD/Utils.pm line 694.
2025.05.22 10:04:40.766 3: PVAnlage: Content-Type was application/xml
2025.05.22 10:04:40.767 4: PVAnlage: checking for redirects, code=200, ignore=0
2025.05.22 10:04:40.767 4: PVAnlage: no redirects to handle
2025.05.22 10:04:40.787 4: PVAnlage: Read response matched 1, unmatch 0 Reading(s)
2025-05-22 10:04:40.791 HTTPMOD PVAnlage AC_Power: 427.1
2025.05.22 10:04:41.798 4: PVAnlage: HandleSendQueue sends get02 with timeout 2 to http://wechselrichter/yields.json?total=1, No Data, No Header
2025.05.22 10:04:41.851 4: PVAnlage: Read callback: request type was get02 retry 0, header: HTTP/1.1 200 OK Cache-Control:no-cache Content-Type:application/json; charset=utf-8, body length 1035
2025.05.22 10:04:41.852 4: PVAnlage: BodyDecode is not decoding the response body (charset utf-8, bodyDecode defaults to none)
2025.05.22 10:04:41.859 4: PVAnlage: extracted JSON values to internal
2025.05.22 10:04:41.861 4: PVAnlage: checking for redirects, code=200, ignore=0
2025.05.22 10:04:41.861 4: PVAnlage: no redirects to handle
2025.05.22 10:04:41.864 4: PVAnlage: Read response matched 1, unmatch 0 Reading(s)
2025-05-22 10:04:41.891 HTTPMOD PVAnlage total_AC_Energy: 14962.248

Man sieht hier einen 'error while parsing JSON data: malformed JSON string, ...' Fehler, weil offensichtlich versucht wird, mit dem JSON Parser der Zweit-URL die Antwort der MainUrl zu parsen.

Selbst wenn get02Poll=0 gesetzt wird (also nur die Antwort der MainUrl interessiert), tritt der Fehler auf (bzw. bei verbose3 der zusätzliche Log-Eintrag).

Wie ich schon sagte, funktioniert das device genau so, wie ich es möchte, nur stört mich halt der Log Eintrag.

Hier das listing des device:
[code]define PVAnlage HTTPMOD http://wechselrichter/measurements.xml? 120
attr PVAnlage DbLogInclude AC_Power,total_AC_Energy
attr PVAnlage comment Für 2025 heißt die JSON Spec: TotalCurves_Datasets_01_Data_26_Data (also 26 = 25+1 !!)\
{my $a=sprintf("%s%2d%s","TotalCurves_Datasets_01_Data_",(localtime)[5] % 100 + 1,"_Data");;;; fhem('attr PVAnlage reading3JSON '.$a)}
attr PVAnlage disable 0
attr PVAnlage enableControlSet 1
attr PVAnlage event-on-change-reading AC_Power_string,AC_Power:20,total_AC_Energy
attr PVAnlage get02JSON TotalCurves_Datasets_01_Data_26_Data
attr PVAnlage get02Name total_AC_Energy
attr PVAnlage get02OExpr $val / 1000 + 11340.12 + 2588.4
attr PVAnlage get02Poll 1
attr PVAnlage get02URL http://wechselrichter/yields.json?total=1
attr PVAnlage reading01Format %.1f
attr PVAnlage reading01Name AC_Power
attr PVAnlage reading01XPath-Strict string(//Measurement[@Type='AC_Power']/attribute::Value)
attr PVAnlage room Energie,HWR
attr PVAnlage stateFormat {sprintf("Leistung %.1f",ReadingsVal($name,"AC_Power",0)) }
attr PVAnlage verbose 4
#   BUSY       0
#   DEF        http://wechselrichter/measurements.xml? 120
#   FUUID      66b38f72-f33f-3e5d-aef7-8f755e064fc60fd2
#   Interval   120
#   MainURL    http://wechselrichter/measurements.xml?
#   ModuleVersion 4.2.0 - 11.8.2023
#   NAME       PVAnlage
#   NOTIFYDEV  global
#   NR         59
#   NTFY_ORDER 50-PVAnlage
#   STATE      Leistung 1637.9
#   TYPE       HTTPMOD
#   eventCount 21
#   value     
#   Helper:
#     DBLOG:
#       AC_Power:
#         logdb:
#           TIME       1747902399.97851
#           VALUE      1637.9
#       total_AC_Energy:
#         logdb:
#           TIME       1747902401.05481
#           VALUE      14962.797
#   HttpUtils:
#     NAME       
#     addr       http://wechselrichter:80
#     auth       0
#     code       200
#     compress   1
#     conn       
#     data       
#     displayurl http://wechselrichter/yields.json?total=1
#     header     
#     host       wechselrichter
#     httpheader HTTP/1.1 200 OK
#Cache-Control:no-cache
#Content-Type:application/json; charset=utf-8
#     httpversion 1.0
#     hu_blocking 0
#     hu_filecount 1
#     hu_port    80
#     hu_portSfx
#     ignoreredirects 1
#     loglevel   4
#     path       /yields.json?total=1
#     protocol   http
#     redirects  0
#     timeout    2
#     url        http://wechselrichter/yields.json?total=1
#     sslargs:
#   QUEUE:
#   READINGS:
#     2025-05-22 10:26:39   AC_Power        1637.9
#     2025-05-22 10:26:41   total_AC_Energy  14962.797
#   REQUEST:
#     context    get
#     data       
#     header     
#     ignoreredirects 0
#     num        02
#     retryCount 0
#     type       get02
#     url        http://wechselrichter/yields.json?total=1
#   defptr:
#     readingBase:
#       AC_Power   reading
#       total_AC_Energy get
#     readingNum:
#       AC_Power   01
#       total_AC_Energy 02
#     readingOutdated:
#     requestReadings:
#       get02:
#         total_AC_Energy get 02
#       update:
#         AC_Power   reading 01
#   lastpoll:
#     total_AC_Energy 1747902399.87519
#
setstate PVAnlage Leistung 1637.9
setstate PVAnlage 2025-05-22 10:26:39 AC_Power 1637.9
setstate PVAnlage 2025-05-22 10:26:41 total_AC_Energy 14962.797

[/code]

betateilchen

Zitat von: alkazaa am 22 Mai 2025, 10:38:54Wie ich schon sagte, funktioniert das device genau so, wie ich es möchte, nur stört mich halt der Log Eintrag.

Wenn man keine anderen Sorgen hat, stört man sich halt an einem in der Sache völlig korrekten Logeintrag...

Es ist einfach unfassbar.
-----------------------
Formuliere die Aufgabe möglichst einfach und
setze die Lösung richtig um - dann wird es auch funktionieren.
-----------------------
Lesen gefährdet die Unwissenheit!