Oilfox per HTTPMOD einbinden

Begonnen von Micky79, 20 Juni 2019, 21:33:53

Vorheriges Thema - Nächstes Thema

Micky79

Hallo an Alle,

mir ist es gelungen den Oilfox per HTTPMOD in FHEM einzubinden. Das ganze war etwas kniffelig und ist bestimmt noch ausbaufähig.
Da ich mich erst seit vorgestern mit dem HHTPMOD Modul auseinandergesetzt habe, gibt es bestimmt noch Leute, die Verbesserungsvorschläge haben, aber für mich ist das Ergebnis erstmal OK.

hier die Daten meines HTTPMODs (Einfach Das Device mittels define definieren und dann die Attribute der Reihe nach füllen):

define Oilfox HTTPMOD https://api.oilfox.io/v2/backoffice/session 3600

userattr get01JSON get01Name get01Poll get01Regex get02Name get02Poll get02Regex get03Name get03Poll get03Regex get04Name get04Poll get04Regex getData getHeader1 getHeader2 getURL reading01JSON reading01Name replacement01Mode replacement01Regex replacement01Value requestData01 requestHeader01

enableCookies 1

get01Name 01.Fuellgrad_in_Prozent
get02Name 02.Fuellgrad_in_Litern
get03Name 03.Fuellgrad_in_cm
get04Name 04.Batteriezustand

get01Regex "fillingPercentage":([\d\.]+)
get02Regex "liters":([\d\.]+)
get03Regex "currentOilHeight":([\d\.]+)
get04Regex "battery":([\d\.]+)

get01Poll 1
get02Poll 1
get03Poll 1
get04Poll 1

getHeader1 Content-Type: application/json
getHeader2 X-Auth-Token: %Token%

getURL https://api.oilfox.io/v2/user/summary
reading01JSON token
reading01Name Token

replacement01Mode reading
replacement01Regex %Token%
replacement01Value Token

requestData01 {"email":"<E-Mailadresse>","password":"<Passwort>"}     <- Hier natürlich eurer E-Mailadresse und euer Passwort eintragen
requestHeader01 Content-Type: application/json

stateFormat { "Oeltank Füllstand: " . ReadingsNum($name, "01.Fuellgrad_in_Prozent", 0) . "% -> " . ReadingsNum($name, "02.Fuellgrad_in_Litern", 0) . "Liter -> " . ReadingsNum($name, "03.Fuellgrad_in_cm", 0) . "cm  -  Batteriezustand: " . ReadingsNum($name, "04.Batteriezustand", 0) . "%" }

Viele Grüße Micky

RiffRaff

Coole Sache! Danke Micky79!

Hast du schon eine Lösung für die neuer URL parat? So funktioniert es leider nicht mehr.

Danke & Gruß
RiffRaff

c0d4

Hätte ebenfalls Interesse an einer Lösung.

Habe mich mal hier umgesehen:
https://github.com/iobroker-community-adapters/ioBroker.oilfox/blob/master/main.js

Die Version soll funktionieren, spricht allerdings die V3 Endpoints an, die V4 ist wohl aktuell. Ich versuche es ganz einfach über Postman und gebe die richtigen Header
etc. mit, bekomme aber immer einen Error 400.

Butzel

wurde dies schon oben berücksichtigt ??

ZitatVielen Dank für Ihr Interesse am OilFox und Engagement im Open-Source-Bereich.
Leider können wir bei der Weiterentwicklung keine Rücksicht auf bestehende Tools von Drittanbietern nehmen, weswegen es ab und zu vorkommen kann, dass diese Software dann nicht mehr funktioniert. Wir unterstützen Sie aber gerne bei der Verbesserung Ihrer Software.
Wir haben ein neues Login-Verfahren eingeführt, das auf Basis der OpenID Connect-Spezifikation und JWT funktioniert (mehr Infos dazu hier: https://auth0.com/docs/jwt). Wir hoffen mit diesem Verfahren die Sicherheit des Systems (und damit der Daten unserer Nutzer) verbessern zu können. Deshalb müssen Sie für den Login jetzt einen neuen Endpunkt benutzen:
POST https://api.oilfox.io/v3/login
Content-Type: application/json
{"email":"email@host", "password":"********"}
In der Antwort darauf erhalten Sie Ihren "access_token", der 15 Minuten lang gültig ist und mit dem alle bisherigen Anfragen getätigt werden können. Die Gültigkeitsdauer wird u.A. auch im Token gespeichert (zum decodieren siehe https://jwt.io/).
Verwendet wird er in jeder weiteren Anfrage (z.B. beim GET https://api.oilfox.io/v3/user/summary) im Authorization-Header:
Authorization: Bearer eyJ0eXAiO...
Außerdem erhalten Sie beim Login einen "refresh_token", mit dem Sie einen neuen access_token abrufen können, ohne dass Sie das Passwort des Nutzers im Klartext speichern und verwenden müssen. Der refresh_token ist 30 Tage lang gültig, bis er einmal benutzt wird. Damit erhalten Sie ein neues token-Paar:
POST https://api.oilfox.io/v3/token
Content-Type: application/x-www-form-urlencoded
refresh_token=eyJ0eXAiO...
Noch eine Bitte: Wenn Sie als User-Agent den Namen Ihres Plugins setzen (z.B. ioBroker.oilfox), fällt es uns leichter die Anfragen von anderen Clients zu unterscheiden und Probleme leichter zu erkennen.
Viele Grüße,
Ihr OilFox Team

Falls ja, bitte ich um Entschuldigung für Doppelpost

amenomade

Zitat von: Butzel am 28 Juli 2020, 16:09:39
wurde dies schon oben berücksichtigt ??

Falls ja, bitte ich um Entschuldigung für Doppelpost

Im Code oben anscheinend nicht. Aber das sollte mit sid... Attribute machbar sein.
Es gibt aber mittlerweile ein Modul dafür: https://forum.fhem.de/index.php?topic=109102.0
Pi 3B, Alexa, CUL868+Selbstbau 1/2λ-Dipol-Antenne, USB Optolink / Vitotronic, Debmatic und HM / HmIP Komponenten, Rademacher Duofern Jalousien, Fritz!Dect Thermostaten, Proteus

Butzel

Vielen Dank für Deine spontane Hilfe. Gut, dass es Mitglieder wie Dich gibt, die wirkliche Hilfe bieten.

Auch ich teilblindes Huhn konnte meinen OilFox so zur Mitarbeit bewegen.

DoubleD

Hallo zusammen,

gibt es hier eine neue Lösung?
Das Modul und der HTTPMOD funktionieren bei mir nicht mehr.

Danke & Gruß
DD

amenomade

Was heisst "funktionieren nicht mehr"?
Bitte Logausgaben mit verbose 5 und "list" von den Devices
Pi 3B, Alexa, CUL868+Selbstbau 1/2λ-Dipol-Antenne, USB Optolink / Vitotronic, Debmatic und HM / HmIP Komponenten, Rademacher Duofern Jalousien, Fritz!Dect Thermostaten, Proteus

DoubleD

Zitat von: amenomade am 07 September 2020, 11:59:03
Was heisst "funktionieren nicht mehr"?
Bitte Logausgaben mit verbose 5 und "list" von den Devices

Hallo amenomade

Der Token ist gekürzt.
Er wird aber erneuert und ist soweit ich das nachvollziehen kann auch gültig
Es sieht so aus als ob sich die URL geändert hätte und nicht mehr gültig ist.
https://api.oilfox.io/v3/user/summary
Die Logausgabe (des Moduls) ist schon ein paar Tage alt, es hat sich aber daran nichts geändert.


2020.09.02 05:58:25 5: OilFox (HeizoelBruck) - Notify: $VAR1 = [
          'ATTR HeizoelBruck verbose 5'
        ];

2020.09.02 05:58:33 3: HeizoelBruck: set called with update
2020.09.02 05:58:33 3: HeizoelBruck: set update
2020.09.02 05:58:33 5: doUpdate() called.
2020.09.02 05:58:33 2: LOGIN TOKEN MISSING OR EXPIRED
2020.09.02 05:58:33 5: OilFox (HeizoelBruck) - Notify: $VAR1 = [
          'state: disconnected'
        ];

2020.09.02 05:58:33 3: Reconnecting...
2020.09.02 05:58:34 2: {"token_type":"Bearer",....DIyIn0.7nqjlnjfwYmqfvVOs...."}
2020.09.02 05:58:34 5: OilFox (HeizoelBruck) - Notify: $VAR1 = [
          'token: ....NZeTspjVssNgvTZVIXC_1JPGOzyCMai9wOlywf1_kKaHUNIGnkA....',
          'expires: 2020-09-02 06:03:34'
        ];

2020.09.02 05:58:34 5: OilFox (HeizoelBruck) - Notify: $VAR1 = [
          'state: authenticated'
        ];

2020.09.02 05:58:34 5: OilFox(s) found
2020.09.02 05:58:34 5: <!doctype html><html lang="en"><head><title>HTTP Status 404 – Not Found</title><style type="text/css">body {font-family:Tahoma,Arial,sans-serif;} h1, h2, h3, b {color:white;background-color:#525D76;} h1 {font-size:22px;} h2 {font-size:16px;} h3 {font-size:14px;} p {font-size:12px;} a {color:black;} .line {height:1px;background-color:#525D76;border:none;}</style></head><body><h1>HTTP Status 404 – Not Found</h1></body></html>
2020.09.02 05:58:34 2:  - JSON error while request: malformed JSON string, neither tag, array, object, number, string or atom, at character offset 0 (before "<!doctype html><html...") at ./FHEM/12_OilFox.pm line 435.

amenomade

#9
Ahja, das habe ich schon gelesen: https://forum.fhem.de/index.php/topic,109102.25.html#lastPost

Das Problem ist, niemand ist in der Lage die richtige (neue) URL zu finden. Die API ist mWn nicht dokumentiert. Daher wird es schwierig.

Bei openHAB und bei ioBroker haben die anscheinend das gleiche Problem.
https://github.com/iobroker-community-adapters/ioBroker.oilfox/issues/42
https://github.com/iobroker-community-adapters/ioBroker.oilfox/issues/41

Wenn jemand in der Lage ist, eine Traffic-Analyse mit der App zu machen, wäre sicher hilfreich

EDIT:... oder den Hersteller zu kontaktieren...
Pi 3B, Alexa, CUL868+Selbstbau 1/2λ-Dipol-Antenne, USB Optolink / Vitotronic, Debmatic und HM / HmIP Komponenten, Rademacher Duofern Jalousien, Fritz!Dect Thermostaten, Proteus

amenomade

Kannst Du vielleicht mit dem HTTPMOD und der URL https://api.oilfox.io/v4/summary probieren? Diese URL schein zu antworten. Habe aber keine Zugangsdaten.
Pi 3B, Alexa, CUL868+Selbstbau 1/2λ-Dipol-Antenne, USB Optolink / Vitotronic, Debmatic und HM / HmIP Komponenten, Rademacher Duofern Jalousien, Fritz!Dect Thermostaten, Proteus

DoubleD

Zitat von: amenomade am 07 September 2020, 18:13:08
Kannst Du vielleicht mit dem HTTPMOD und der URL https://api.oilfox.io/v4/summary probieren? Diese URL schein zu antworten. Habe aber keine Zugangsdaten.

Ahhh damit funktioniert es schon viel besser. Nur das JSON hat sich etwas geändert wie es ausschaut.
Aber da arbeite ich gerade schon dran.
Danke für den Tipp mit der URL

Gruß
DD

amenomade

Kannst Du vielleicht das JSON hier kopieren?
Pi 3B, Alexa, CUL868+Selbstbau 1/2λ-Dipol-Antenne, USB Optolink / Vitotronic, Debmatic und HM / HmIP Komponenten, Rademacher Duofern Jalousien, Fritz!Dect Thermostaten, Proteus

DoubleD

Hallo

mit diesem diff funktioniert das Modul wieder


*** 12_OilFox_DD.pm 2020-09-07 19:39:44.219672100 +0200
--- 12_OilFox.pm 2020-09-07 19:41:10.554729200 +0200
***************
*** 34,42 ****
  use Data::Dumper;
  use GPUtils qw(GP_Import);
 
! use constant API => "https://api.oilfox.io/";
! #use constant API => "https://api.oilfox.io/v3/";
! #use constant API => "https://api.oilfox.io/v4/";
 
  BEGIN {
      GP_Import(
--- 34,40 ----
  use Data::Dumper;
  use GPUtils qw(GP_Import);
 
! use constant API => "https://api.oilfox.io/v3/";
 
  BEGIN {
      GP_Import(
***************
*** 296,302 ****
                  }';
 
      HttpUtils_NonblockingGet({
!         url        => API . "v3/login",
          timeout    => 5,
          hash        => $hash,
          method      => "POST",
--- 294,300 ----
                  }';
 
      HttpUtils_NonblockingGet({
!         url        => API . "login",
          timeout    => 5,
          hash        => $hash,
          method      => "POST",
***************
*** 401,407 ****
      my $header = "Content-Type: application/json\r\nAccept: application/json\r\nAuthorization: Bearer " . $token;
 
      HttpUtils_NonblockingGet({
!         url        => API . "v4/summary",
          timeout    => 5,
          hash        => $hash,
          method      => "GET",
--- 399,405 ----
      my $header = "Content-Type: application/json\r\nAccept: application/json\r\nAuthorization: Bearer " . $token;
 
      HttpUtils_NonblockingGet({
!         url        => API . "user/summary",
          timeout    => 5,
          hash        => $hash,
          method      => "GET",
***************
*** 417,423 ****
      my ($param, $err, $data) = @_;
      my $hash = $param->{hash};
      my $name = $hash->{NAME};
!
      if($err ne "") {
          Log3 $name, 2, "error while requesting ".$param->{url}." - $err";     
                                             
--- 415,421 ----
      my ($param, $err, $data) = @_;
      my $hash = $param->{hash};
      my $name = $hash->{NAME};
!
      if($err ne "") {
          Log3 $name, 2, "error while requesting ".$param->{url}." - $err";     
                                             
***************
*** 435,441 ****
              Log3 $name, 5, $data;
             
              my $result = eval { decode_json($data) };
-
              if ($@) {
                  Log3( $name, 2, " - JSON error while request: $@");
                  return;
--- 433,438 ----
***************
*** 448,458 ****
              $hash->{OilFox}->{oilfox_name} = $myoilfox->{'name'};
              $hash->{OilFox}->{oilfox_hwid} = $myoilfox->{'hwid'};
              $hash->{OilFox}->{oilfox_tankVolume} = $myoilfox->{'tankVolume'};
!             $hash->{OilFox}->{oilfox_metering_value} = $myoilfox->{'lastMetering'}->{'value'};
!             $hash->{OilFox}->{oilfox_metering_fillingPercentage} = $myoilfox->{'lastMetering'}->{'fillingPercentage'};
!             $hash->{OilFox}->{oilfox_metering_liters} = $myoilfox->{'lastMetering'}->{'liters'};
!             $hash->{OilFox}->{oilfox_metering_currentOilHeight} = $myoilfox->{'lastMetering'}->{'currentOilHeight'};
!             $hash->{OilFox}->{oilfox_metering_battery} = $myoilfox->{'lastMetering'}->{'battery'};
         
              CONNECTED($hash,'connected');
 
--- 445,455 ----
              $hash->{OilFox}->{oilfox_name} = $myoilfox->{'name'};
              $hash->{OilFox}->{oilfox_hwid} = $myoilfox->{'hwid'};
              $hash->{OilFox}->{oilfox_tankVolume} = $myoilfox->{'tankVolume'};
!             $hash->{OilFox}->{oilfox_metering_value} = $myoilfox->{'metering'}->{'value'};
!             $hash->{OilFox}->{oilfox_metering_fillingPercentage} = $myoilfox->{'metering'}->{'fillingPercentage'};
!             $hash->{OilFox}->{oilfox_metering_liters} = $myoilfox->{'metering'}->{'liters'};
!             $hash->{OilFox}->{oilfox_metering_currentOilHeight} = $myoilfox->{'metering'}->{'currentOilHeight'};
!             $hash->{OilFox}->{oilfox_metering_battery} = $myoilfox->{'metering'}->{'battery'};
         
              CONNECTED($hash,'connected');
 
Dateien 12_OilFox_DD.pm und 12_OilFox.pm sind verschieden.
37,39c37
< use constant API => "https://api.oilfox.io/";
< #use constant API => "https://api.oilfox.io/v3/";
< #use constant API => "https://api.oilfox.io/v4/";
---
> use constant API => "https://api.oilfox.io/v3/";
299c297
<         url        => API . "v3/login",
---
>         url        => API . "login",
404c402
<         url        => API . "v4/summary",
---
>         url        => API . "user/summary",
420c418
<
---
>
438d435
<
451,455c448,452
<             $hash->{OilFox}->{oilfox_metering_value} = $myoilfox->{'lastMetering'}->{'value'};
<             $hash->{OilFox}->{oilfox_metering_fillingPercentage} = $myoilfox->{'lastMetering'}->{'fillingPercentage'};
<             $hash->{OilFox}->{oilfox_metering_liters} = $myoilfox->{'lastMetering'}->{'liters'};
<             $hash->{OilFox}->{oilfox_metering_currentOilHeight} = $myoilfox->{'lastMetering'}->{'currentOilHeight'};
<             $hash->{OilFox}->{oilfox_metering_battery} = $myoilfox->{'lastMetering'}->{'battery'};
---
>             $hash->{OilFox}->{oilfox_metering_value} = $myoilfox->{'metering'}->{'value'};
>             $hash->{OilFox}->{oilfox_metering_fillingPercentage} = $myoilfox->{'metering'}->{'fillingPercentage'};
>             $hash->{OilFox}->{oilfox_metering_liters} = $myoilfox->{'metering'}->{'liters'};
>             $hash->{OilFox}->{oilfox_metering_currentOilHeight} = $myoilfox->{'metering'}->{'currentOilHeight'};
>             $hash->{OilFox}->{oilfox_metering_battery} = $myoilfox->{'metering'}->{'battery'};


Login läuft noch über v3 aber das summary über v4.
JSON aus metering wurde lastMetering

Gruß
DD

DoubleD

Zitat von: amenomade am 07 September 2020, 19:29:14
Kannst Du vielleicht das JSON hier kopieren?

Brauchst du den ganzen JSON-String?
Kann ich bei bedarf bereitstellen.

Gruß
DD