Neue Version von HTTPMOD mit neuen Features zum Testen

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

Vorheriges Thema - Nächstes Thema

StefanStrobel

Zitat von: betateilchen am 19 Februar 2023, 14:10:53
1. Frage: welchen Sinn hat die Ausgabe des featurelevel am Ende einer define Meldung?

2023.02.19 13:59:10 3: pegel: Defined with URL https://... and interval 900 featurelevel 6.2

2. Frage: gehört diese Meldung nicht eigentlich in den Loglevel 4? Wenn jedes Modul ein "Define" im Loglevel 3 bestätigen würde, dann gute Nacht...

zu 1.: Ich hatte das eingebaut als sich Defaults von HTTPMOD mal mit einem Featurelevel geändert haben.
zu 2.: das habe ich vor 10 Jahren mal so gemacht und seither hat sich keiner beschwert. Ich werde das bei nächster Gelegenheit auf Level 4 ändern.

Gruß
    Stefan

twinFHEM

#1246
Hallo zusammen,

mit replacementXXMode möchte ich verschiedene Parameter an eine URL hängen. Nehme ich den Mode text und als replacementXXValue einen statischen Inhalt wie z.b. year=2022 funktioniert es.
Auch bei dem Attribut get02Replacement01Value funktioniert es tadellos. Verwende ich den Mode reading, um Inhalt aus dem Reading Parameter auszulesen, funktioniert es partout nicht!
Ich habe auch außerhalb dieses Forums nach einer Doku, Info gesucht, bin aber leider nicht fündig geworden.

Im FHEM-Wiki steht:
ZitatIf the replacement[0-9]*Mode is reading, then the corresponding replacement[0-9]*Value is interpreted as the name of a reading of the same device or as device:reading to refer to another device.
Meine diesbezüglichen Versuche mit Name des Readings, in Klammern, ohne Klammern, mit und ohne Doppelpunkt und Device schlugen leider fehl!

Mit text sieht meine URL korrekterweise so aus:
https://XXX@backend.powerfox.energy/api/2.0/my/XXX/report?year=2022

Mit reading so:
https://XXX@backend.powerfox.energy/api/2.0/my/XXX/report?Parameter

Was mache ich falsch?
Ich würde mich wahnsinnig über ein paar Tipps von euch freuen.

Hier meine Device:
defmod powerfox_report_dyn HTTPMOD none 0
attr powerfox_report_dyn extractAllJSON 0
attr powerfox_report_dyn get01Name Jahr
attr powerfox_report_dyn get02Name Monat
attr powerfox_report_dyn get02Replacement01Value Parameter
attr powerfox_report_dyn get03Name Tag
attr powerfox_report_dyn getURL https://XXX@backend.powerfox.energy/api/2.0/my/XXX/report?%%VARS%%
attr powerfox_report_dyn reading01JSON Consumption_Sum
attr powerfox_report_dyn reading01Name Consumption_Sum
attr powerfox_report_dyn replacement01Mode text
attr powerfox_report_dyn replacement01Regex %%VARS%%
attr powerfox_report_dyn replacement01Value year=2022
attr powerfox_report_dyn replacement02Mode reading
attr powerfox_report_dyn userReadings Parameter { "year=" . ReadingsVal("powerfox_report_dyn","yearApp",0) . "&month=" . ReadingsVal("powerfox_report_dyn","monthApp",0)}

setstate powerfox_report_dyn 2023-02-26 15:28:52 Consumption_Sum 21.5980000000012
setstate powerfox_report_dyn 2023-02-26 15:28:52 Parameter year=2023&month=02
setstate powerfox_report_dyn 2023-02-25 16:17:56 dayApp 15
setstate powerfox_report_dyn 2023-02-25 16:26:06 monthApp 02
setstate powerfox_report_dyn 2023-02-25 19:12:41 yearApp 2023


fremitus


Mit text sieht meine URL korrekterweise so aus:
https://XXX@backend.powerfox.energy/api/2.0/my/XXX/report?year=2022

ich habe es wie folgt gelöst (siehe meinen eigenen Eintrag ein paar Seiten vorher):
https://forum.fhem.de/index.php/topic,45176.msg1259940.html#msg1259940

Gruss

Peer

StefanStrobel

Hallo twinFhem,

kann es sein dass Du mit der Nummerierung der Replacements durcheinander gekommen bist?
Für Replacement01 hast Du Value auf Parameter gesetzt, aber den Mode auf text.
Dafür hast Du bei Replacement02 den Mode auf reading gesetzt, aber Replacement02 hat weder eine Regex noch eine Value ...

Gruß
   Stefan

twinFHEM

#1249
Hallo Stefan, hallo Peer,
besten Dank für eure Antworten!

Ich habe eine Testdevice in Form von Peers Eintrag erstellt. Lief natürlich!
Dann auf Fehlersuche gegangen, einige Dinge angepasst. Lief natürlich nicht!
Bis ich dann replacement01Mode auch auf reading gesetzt habe. Noch einen 2. dynamischen Parameter eingerichtet und Donnerschlach!
Es lief! :D

Stefan wird recht haben und ich würde gerne verstehen warum. Von daher wäre ich für eine kurze Erklärung dankbar.
Ich gehe davon aus, dass mit z.B. replacement01Mode, also mit 01, 02, 02, etc. das Ganze in voneinander unabhängige "Blöcke" unterteilt wird.


attr powerfox_report_dyn get01Name Jahr
attr powerfox_report_dyn replacement01Mode text
attr powerfox_report_dyn replacement01Regex %%VARS%%
attr powerfox_report_dyn replacement01Value year=2022


Für "Block 02" habe ich get02Replacement01Value mit der Idee verwendet, dass der Wert von replacement01Value (hier durch powerfox_report_dyn:Parameter) ersetzt wird und damit replacement02Value entfällt. Tatsächlich funktioniert dies auch ohne ein replacement02Regex.

Welche Erklärung gibt es dafür?
Was genau macht get02Replacement01Value und wo liegt der Unterschied zu replacement02Value?

Auf jeden Fall bin ich erstmal megahappy, dass es funktioniert und ich weiterkomme.

Hier mein aktuelle Device:

defmod powerfox_report_dyn HTTPMOD none 0
attr powerfox_report_dyn extractAllJSON 0
attr powerfox_report_dyn get01Name Jahr
attr powerfox_report_dyn get02Name Monat
attr powerfox_report_dyn get02Replacement01Value powerfox_report_dyn:Parameter
attr powerfox_report_dyn get03Name Tag
attr powerfox_report_dyn getURL https://XXX@backend.powerfox.energy/api/2.0/my/XXX/report?%vars%
attr powerfox_report_dyn reading01JSON Consumption_Sum
attr powerfox_report_dyn reading01Name Consumption_Sum
attr powerfox_report_dyn replacement01Mode reading
attr powerfox_report_dyn replacement01Regex %vars%
attr powerfox_report_dyn replacement01Value powerfox_report_dyn:Parameter1
attr powerfox_report_dyn replacement02Mode reading
attr powerfox_report_dyn userReadings Parameter { "year=" . ReadingsVal("powerfox_report_dyn","yearApp",0) . "&month=" . ReadingsVal("powerfox_report_dyn","monthApp",0)}, Parameter1 { "year=" . ReadingsVal("powerfox_report_dyn","yearApp",0)}


Nochmals vielen Dank für euer Zutun & viele Grüße,
Hendrik

StefanStrobel

Hallo Hendrik,

eine Ersetzung sollte aus je einer Regex, einem Mode und einer Value bestehen. Damit man mehrere Ersetzungen machen kann, werden die Ersetzungen mit Nummern getrennt: replacement01, replacement02 etc.

Beispiel:
Replacement01: %%year%% soll mit dem Wert des Readings yearApp ersetzt werden.
Replacement02 %%month%% soll mit dem Wert des Readings monthApp ersetzt werden.

Mit den Nummern von get oder set-Befehlen haben die Nummern der Ersetzungen zunächst nichts zu tun.
get01... ist der erste get, get02... der zweite... völlig unabhängig on Replacements.

Nur wenn man den zu ersetzenden Wert eines Replacements von get01 zu get02 variieren möchte, dann kann man mit get02Replacement01Value den Wert der ersten Ersetzung nur für das zweite get ändern.

In Deinem Fall gibt es kein vollständig definiertes Replacement02, nur einen dafür gesetzten Mode. Den kannst Du somit auch weglassen, da er nicht verwendet wird und nur Verwirrung stiftet.

Gruss
    Stefan


ch.eick

#1251
Hallo zusammen,
ich lese etwas JSON ein und habe da noch eine Frage.

Im httpbody wird "cost":null oder "consumption":null zurück gegeben.

httpbody
{"data":{"viewer":{"home":{"consumption":{"nodes":[{"from":"2023-03-15T16:00:00.000+01:00","to":"2023-03-15T17:00:00.000+01:00","cost":null,"unitPrice":1.5486375,"unitPriceVAT":0.3097275,"consumption":null,"consumptionUnit":"kWh"}]}}}}}



attr EVU_Tibber reading0301JSON data_viewer_homes_consumption_nodes_01_to
attr EVU_Tibber reading0301Name nodes_to
attr EVU_Tibber reading0302JSON data_viewer_home_consumption_nodes_01_cost
attr EVU_Tibber reading0302Name nodes_cost
attr EVU_Tibber reading0303JSON data_viewer_home_consumption_nodes_01_unitPrice
attr EVU_Tibber reading0303Name nodes_unitPrice
attr EVU_Tibber reading0304JSON data_viewer_home_consumption_nodes_01_consumption
attr EVU_Tibber reading0304Name nodes_consumption


Jedoch werden für die "null" Werte dann keine readings geschrieben
Und auch das Feld "consumption" wird mit "consumptionUnit" geschrieben
Auch das Datum "to" fehlt komplett

nodes_consumption kWh
nodes_unitPrice 1.5486375


Könnte mir da bitte mal jemand helfen?

EDIT: 20230318 Ich habe es nun mit Regex parsen können, wäre aber auch über eine elegantere Lösung erfreut ;-)

attr EVU_Tibber get03-1Name nodes_from
attr EVU_Tibber get03-2Name nodes_to_date
attr EVU_Tibber get03-3Name nodes_to_hour
attr EVU_Tibber get03-4Name nodes_to_timezone
attr EVU_Tibber get03-5Name nodes_cost
attr EVU_Tibber get03-5OMap null:0
attr EVU_Tibber get03-6Name nodes_unitPrice
attr EVU_Tibber get03-7Name nodes_unitPriceVAT
attr EVU_Tibber get03-8Name nodes_consumption
attr EVU_Tibber get03-8OMap null:0
attr EVU_Tibber get03-9Name nodes_consumptionUnit
attr EVU_Tibber get03Data { "query": "{viewer {home(id:\"%%homeID%%\") {consumption(resolution: HOURLY, last: 1) {nodes {from to cost unitPrice unitPriceVAT consumption consumptionUnit}}}}}"}
attr EVU_Tibber get03Header01 Content-Type: application/json
attr EVU_Tibber get03Header02 Authorization: Bearer %%token%%
attr EVU_Tibber get03Name 03_consumption_hour
attr EVU_Tibber get03Regex \{"data":\{"viewer":\{"home":\{"consumption":\{"nodes":\[\{"from":"(.*)","to":"([\d+-]+)T(\d\d):00:00\.000([-+\d]+).*","cost":(.*),"unitPrice":(.*),"unitPriceVAT":(.*),"consumption":(.*),"consumptionUnit":"(.*)"
attr EVU_Tibber get03URL https://api.tibber.com/v1-beta/gql


EDIT: 20230315 Das Problem mit "consumption" habe ich mit mit dem $ Zeichen lösen können.

neue Testdaten
httpbody
{"data":{"viewer":{"home":{"consumption":{"nodes":[{"from":"2023-03-15T16:00:00.000+01:00","to":"2023-03-15T17:00:00.000+01:00","cost":1.85217045,"unitPrice":1.5486375,"unitPriceVAT":0.3097275,"consumption":1.196,"consumptionUnit":"kWh"}]}}}}}

Beim Attribut das $ anhängen
attr EVU_Tibber reading0304JSON data_viewer_home_consumption_nodes_01_consumption$
attr EVU_Tibber reading0304Name nodes_consumption

ergibt nun

nodes_consumption 1.196


Hier noch das Log

Erster Test mit ExpandAllJSON
httpbody
2023.03.15 17:30:57.258 5: EVU_Tibber: Read callback: body
{"data":{"viewer":{"home":{"consumption":{"nodes":[{"from":"2023-03-15T16:00:00.000+01:00","to":"2023-03-15T17:00:00.000+01:00","cost":null,"unitPrice":1.5486375,"unitPriceVAT":0.3097275,"consumption":null,"consumptionUnit":"kWh"}]}}}}}

2023.03.15 17:30:57.258 4: EVU_Tibber: BodyDecode is not decoding the response body (charset utf-8, bodyDecode defaults to none)
2023.03.15 17:30:57.259 4: EVU_Tibber: extracted JSON values to internal
2023.03.15 17:30:57.259 5: EVU_Tibber: GetCookies is looking for Cookies
2023.03.15 17:30:57.259 5: EVU_Tibber: ExtractSid called, context get, num 03
2023.03.15 17:30:57.260 4: EVU_Tibber: checking for redirects, code=200, ignore=0
2023.03.15 17:30:57.260 4: EVU_Tibber: no redirects to handle
2023.03.15 17:30:57.260 5: EVU_Tibber: Read callback sets LAST_REQUEST to get03
2023.03.15 17:30:57.260 5: EVU_Tibber: CheckAuth decided no authentication required
2023.03.15 17:30:57.260 5: EVU_Tibber: ExtractReading for context get, num 03 - no individual parse definition

Bei dem automatischen Entpacken fehlte auch schon das Feld "consumption"
jedoch wurde hier das Datum gelesen.

2023.03.15 17:30:57.261 5: EVU_Tibber: Read sets reading data_viewer_home_consumption_nodes_01_unitPrice to value 1.5486375 of JSON data_viewer_home_consumption_nodes_01_unitPrice
2023.03.15 17:30:57.261 5: EVU_Tibber: Read sets reading data_viewer_home_consumption_nodes_01_consumptionUnit to value kWh of JSON data_viewer_home_consumption_nodes_01_consumptionUnit
2023.03.15 17:30:57.261 5: EVU_Tibber: Read sets reading data_viewer_home_consumption_nodes_01_to to value 2023-03-15T17:00:00.000+01:00 of JSON data_viewer_home_consumption_nodes_01_to
2023.03.15 17:30:57.262 5: EVU_Tibber: Read sets reading data_viewer_home_consumption_nodes_01_from to value 2023-03-15T16:00:00.000+01:00 of JSON data_viewer_home_consumption_nodes_01_from
2023.03.15 17:30:57.262 5: EVU_Tibber: Read sets reading data_viewer_home_consumption_nodes_01_unitPriceVAT to value 0.3097275 of JSON data_viewer_home_consumption_nodes_01_unitPriceVAT



Zweiter Test
httpbody
{"data":{"viewer":{"home":{"consumption":{"nodes":[{"from":"2023-03-15T16:00:00.000+01:00","to":"2023-03-15T17:00:00.000+01:00","cost":1.85217045,"unitPrice":1.5486375,"unitPriceVAT":0.3097275,"consumption":1.196,"consumptionUnit":"kWh"}]}}}}}

2023.03.15 17:49:49.589 5: EVU_Tibber: ExtractReading nodes_to with json data_viewer_homes_consumption_nodes_01_to ...
2023.03.15 17:49:49.589 5: EVU_Tibber: ExtractReading nodes_to with json data_viewer_homes_consumption_nodes_01_to did not match a key directly - trying regex match to create a list
2023.03.15 17:49:49.589 5: EVU_Tibber: ExtractReading nodes_to with json /^data_viewer_homes_consumption_nodes_01_to/ got keylist
2023.03.15 17:49:49.589 5: EVU_Tibber: ExtractReading nodes_to did not match
2023.03.15 17:49:49.589 5: EVU_Tibber: ExtractReading nodes_cost with json data_viewer_home_consumption_nodes_01_cost ...
2023.03.15 17:49:49.590 5: EVU_Tibber: ExtractReading for reading0302-1 sets nodes_cost to 1.85217045
2023.03.15 17:49:49.590 5: EVU_Tibber: ExtractReading value as hex is 312e3835323137303435
2023.03.15 17:49:49.590 5: EVU_Tibber: ExtractReading nodes_unitPrice with json data_viewer_home_consumption_nodes_01_unitPrice ...
2023.03.15 17:49:49.590 5: EVU_Tibber: ExtractReading for reading0303-1 sets nodes_unitPrice to 1.5486375
2023.03.15 17:49:49.591 5: EVU_Tibber: ExtractReading value as hex is 312e35343836333735
2023.03.15 17:49:49.591 5: EVU_Tibber: ExtractReading nodes_consumption with json data_viewer_home_consumption_nodes_01_consumption$ ...
2023.03.15 17:49:49.591 5: EVU_Tibber: ExtractReading nodes_consumption with json data_viewer_home_consumption_nodes_01_consumption$ did not match a key directly - trying regex match to create a list
2023.03.15 17:49:49.591 5: EVU_Tibber: ExtractReading nodes_consumption with json /^data_viewer_home_consumption_nodes_01_consumption$/ got keylist data_viewer_home_consumption_nodes_01_consumption
2023.03.15 17:49:49.592 5: EVU_Tibber: ExtractReading for reading0304-1 sets nodes_consumption to 1.196
2023.03.15 17:49:49.592 5: EVU_Tibber: ExtractReading value as hex is 312e313936


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

Onkel.Tom


Hallo zusammen,

ich möchte die Daten aus der Webseite meines ASEKO Pool-Controllers "Pool live" (https://pool.aseko.com/sign-in) auslesen.

Dabei müsste ich zunächst die Login-/Passwortseite passieren,
auf der neben Benutzername und Passwort (beides vorhanden) auch die terms zu bestätigen sind.

Da ich leider blutiger Anfänger bei Thema Webdesign bin, geling mir dies trotz Einlesen in die Thematik HTTPMOD nicht.

Bin für jede Hifestellung sehr dankbar. 

VG
Onkel Tom

ch.eick

#1253
Zitat von: Onkel.Tom am 18 März 2023, 11:24:38
ich möchte die Daten aus der Webseite meines ASEKO Pool-Controllers "Pool live" (https://pool.aseko.com/sign-in) auslesen.

Dabei müsste ich zunächst die Login-/Passwortseite passieren,
auf der neben Benutzername und Passwort (beides vorhanden) auch die terms zu bestätigen sind.
Hallo Tom,
Du müsstest Deinen Login mit tracen und dann schauen, was auf der http Ebene an Daten ausgetauscht wird.

  • Burpsuite
  • Firefox Browser | Anwendungsmenü | Weitere Werkzeuge | Werkzeuge für Web Entwickler
  • Viel Geduld :-)

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,

null-Werte in JSON-Antworten sind bisher ausgefiltert worden. Eine neue Version, bei der das nicht mehr so ist kommt. Vermutlich komme ich am Wochenende dazu.

Gruß
    Stefan

Onkel.Tom

Zitat von: ch.eick am 18 März 2023, 12:34:35Hallo Tom,
Du müsstest Deinen Login mit tracen und dann schauen, was auf der http Ebene an Daten ausgetauscht wird.
  • Burpsuite
  • Firefox Browser | Anwendungsmenü | Weitere Werkzeuge | Werkzeuge für Web Entwickler
  • Viel Geduld :-)

VG  Christian

Hallo Christian,

ich habe die Spur anhand Deiner Schlagworte aufgenommen.
Vielen Dank erstmal für die schnelle Antwort !

VG
Onkel Tom

StefanStrobel

Hallo Christian,

könntest Du mal die angehängte Änderung testen?
Das File gehört in lib/FHEM/HTTPMOD/

Gruß
    Stefan

Onkel.Tom


Hallo,

Dank der Hilfe konnte ich mittlerweile das Login hinbekommen.
In der verbose 5-log sehe ich die gewünschten Daten im Body der http-response.

Diese Daten in ein reading zu schreiben, gelingt mir aber weder mit readingxRegex noch readingxJSON.

Anbei meine aktuellen Attribute, log-auszug und burp-response:



Bin für jeden Hinweis dankbar !

Grüße
Onkel Tom

StefanStrobel

Hallo,

offenbar enthält de Response Zeichen, an denen sich die JSON-Library verschluckt.
füge doch mal ein bodyEncode utf8 ein. Dann solltest Du mit extractAllJSON alle Werte sehen.

Gruss
   Stefan

Onkel.Tom

Zitat von: StefanStrobel am 31 März 2023, 18:18:59Hallo,

offenbar enthält de Response Zeichen, an denen sich die JSON-Library verschluckt.
füge doch mal ein
bodyEncode utf8 ein. Dann solltest Du mit
extractAllJSON alle Werte sehen.

Gruss
  Stefan

Hallo Stefan,

Danke für die Tipps. Habe es jetzt hinbekommen.

Falls noch jemand seine Aseko-Dosiereinheit einbinden möchte, hier meine Konfiguration:

define PoolController HTTPMOD https://pool.aseko.com/sign-in 300
setuuid PoolController 6419f085-f33f-2bca-0b49-b62ad56f3962901d
attr PoolController alias Pool Controller
attr PoolController enableCookies 1
attr PoolController extractAllJSON 1
attr PoolController get01Name Gerät
attr PoolController get01Poll 1
attr PoolController get01URL https://pool.aseko.com/api/units
attr PoolController get02Name Wasserwerte
attr PoolController get02Poll 1
attr PoolController get02URL https://pool.aseko.com/api/units/1101xyz
attr PoolController reAuthRegex /sign-in
attr PoolController sid01Data {"username":"xy..","password":"xz..","agree":"on" }
attr PoolController sid01IdRegex .*"(.*-.*-.*-[0-9a-z]*).*
attr PoolController sid01URL https://pool.aseko.com/api/login
attr PoolController sidHeader1 Content-Type: application/json
attr PoolController sidHeader2 Accept: */*

Vielen Dank für eure Hilfe !

Onkel Tom