BMW connected drive in IPS?

Und was ist da der API Aufruf um diese Daten zu bekommen, bzw. sind die denn jetzt schon in einer der Interface Varibalen als Daten enthalten?

Und wie soll die vom Layout aussehen? Da muss dann schon ein konkreter Vorschlag her.

Was kommt denn als Response von BMW zurück wenn man die Methode aufruft?

Habe ich ergänzt.

Das würde dann eine separate Konfigurationsinstanz erfordern, lohnt sich das? Könnte man bei Bedarf ergänzen. Macht aber wohl eher zu IP-Symcon 5 Sinn so was zu ergänzen.

Habe ich abgeändert, aber das Varibalenprofil kann jeder individuell anpassen wie er will.

Kann ich nichts zu sagen, funktioniert das denn beim Rest der Nutzer? Vielleicht ist das wie vieles nur bei bestimmten Fahrzeugen möglich.

Und was geht da genau nicht, kommen keine Daten zurück oder wird der Status verkehrt abgebildet?

ich habe in dem Profil die Option „Auto verschliessen“ abgewählt, gespeichert und wieder aktiviert, gespeichert. Danach funktioniertes es.

Rufst Du eine Methode über ein Skript auf oder schaltest Du das über das Webfront?

bei meinem X5 wird auch keine Information über den Verschluss-Status der Türen geliefert (genauso wie es keine Position in den Daten gibt). Beim (neueren) X3 geht beides. Der Umfang der gelieferten Informationen ist halt ziemlich unterschiedlich.

war über das Web-Interface. hat sich aber schon erledigt (hatte gerade den post geschrieben) nachdem ich die option ‚Türverschluss‘ in der Konfiguration gelöscht und neu gesetzt habe

Es kommen keine Daten zurück

die Änderung des Variablenprofils hatte ich schon selber angepasst - es wurde aber wieder überschrieben durch das Modul.
Danke für die Änderung

hier mal das Beispiel, wie im ConnectedDrive Portal von BMW der Verlauf formatiert wird.

ich habe folgendes Problem. Nachdem das Modul einige Zeit läuft, werden die Daten nicht mehr richtig empfangen/ausgewertet.

Im Logfile sieht das so aus:

/27/18 19:52:34 | 34167 | DEBUG | VariableManager | [Fahrzeuge\BMW X3\Interface Store] = ^<8B>^H^@^@^@^@^@^@^C-<CD>1
<C3>0^L^EЫ|4<9B>^^ <E7><E8>^^<8C><F5>C<84>^S<CB><C8><C6>^TJ<EF>ޡ]<DF><F2><DE><C2>^H^O<D9><C4><DA>ʗ<E9>><BD><B2>I<FA><F9><AE>^%<AC>O<F3>&<9B><O"<97><C2>10<BD><B2><A1><87>/S*l<80><AF>nA.<AF>Ԅ;
<87><C7>MM<F0><C0>?<C0><E1>^A<9F>’^C<C1><<BC><8D><87>|<BE><9F>
<E3>b<E3><87>^@^@^@
02/27/18 19:52:35 | 19869 | DEBUG | VariableManager | [Fahrzeuge\BMW X3\Interface Specs] = ^<8B>^H^@^@^@^@^@^@^C-<CD>1
<C3>0^L^EЫ|4<9B>^^ <E7><E8>^^<8C><F5>C<84>^S<CB><C8><C6>^TJ<EF>ޡ]<DF><F2><DE><C2>^H^O<D9><C4><DA>ʗ<E9>><BD><B2>I<FA><F9><AE>^%<AC>O<F3>&<9B><O"<97><C2>10<BD><B2><A1><87>/S*l<80><AF>nA.<AF>Ԅ;
<87><C7>MM<F0><C0>?<C0><E1>^A<9F>’^C<C1><<BC><8D><87>|<BE><9F>
<E3>b<E3><87>^@^@^@

Der Variableninhalt ist analog, es wird natürlich daraus auch keine Information mehr gewonnen. Das gilt grundsätzlich für alle diese Interface-Variablen.

Der Zustand ändert sich nicht von alleine wieder in ‚richtig‘.

Wenn ich in der Konfiguration des Modules was ändere und dann speichere, sind die Daten wieder lesbar.

Version ist 4.4 auf einem Raspi.

Hat irgend jemand eine Idee, was ich machen/testen kann?

Könnte sein das der Token ausläuft bzw. nicht rechtzeitig erneuert wird.

Hast Du mal probiert was passiert wenn Du


BMW_CheckToken(12345); // 12345 ObjektID Instanz BMW

aufrufst?

er sagt: „token expired, got new token“ und der nächste abruf war wieder ok

Dann ist es wie ich vermutet hatte, der Token läuft ab und das Update Intervall für das Abholen eines neuen Token bzw. das Prüfen ob ein neuer Token abgeholt werden muss ist im Modul zu hoch eingestellt. Du kannst ja mal schauen was ein passender Wert wäre, indem Du einfach eine Zyklischen Timer auf ein Skript mit dem Methodenaufruf


BMW_CheckToken(12345); // 12345 ObjektID Instanz BMW  

setzt und dann Rückmeldung gibst in welchem Intervall sinnvoller Weise auf ein neuen Token geprüft werden sollte.

Hallo Fons,

Ich habe mir die Token-Abrufe mal angeschaut:


TXT: 27.02.2018 22:24:59.00 |                  BMW | token expired, get new token
TXT: 27.02.2018 22:24:59.00 |       BMW Postfields | username=...
TXT: 27.02.2018 22:25:00.00 |                  BMW | access_token: K7kXly5HTO9Tdhy7xi1I7hKEvL8qyBl5
TXT: 27.02.2018 22:25:00.00 |                  BMW | Bearer expires in: 7199s
TXT: 27.02.2018 22:25:00.00 |                  BMW | set access_token: K7kXly5HTO9Tdhy7xi1I7hKEvL8qyBl5
TXT: 27.02.2018 22:25:00.00 |                  BMW | set token expiration: 1519773899

=> gueltig bis 00:24:59


TXT: 27.02.2018 22:25:34.00 |                  BMW | Send to url: https://www.bmw-connecteddrive.de/api/vehicle/dynamic/v1/WBAWY51xxxxxxxxxx?offset=-60
TXT: 27.02.2018 22:25:34.00 |                  BMW | 'Content-Type: application/json' , 'Authorization: Bearer ' K7kXly5HTO9Tdhy7xi1I7hKEvL8qyBl5
TXT: 27.02.2018 22:25:36.00 |         BMW Response | {<LF>  "attributesMap" : {<LF>    "updateTime_converted" : "27.02.2018 17:35",<LF>    "DCS_CCH_Ongoing " : null,<LF> ....

letzte Nachricht, die noch ok war


TXT: 28.02.2018 00:18:00.00 |                  BMW | Send to url: https://www.bmw-connecteddrive.de/api/vehicle/remoteservices/v1/WBAWY51xxxxxxxxxx/history
TXT: 28.02.2018 00:18:00.00 |                  BMW | 'Content-Type: application/json' , 'Authorization: Bearer ' K7kXly5HTO9Tdhy7xi1I7hKEvL8qyBl5
TXT: 28.02.2018 00:18:01.00 |         BMW Response | [ {<LF>  "eventId" : "304533343934322223178200@bmw.de",<LF>  "creationTime" : 1519409922279,<LF>  "status" : "SUCCESS" ...

ab hier Schrott. token ist abgelaufen, kein neuer wurde Token abgerufen


TXT: 28.02.2018 00:28:01.00 |                  BMW | Send to url: https://www.bmw-connecteddrive.de/api/vehicle/dynamic/v1/WBAWY51xxxxxxxxxx?offset=-60
TXT: 28.02.2018 00:28:01.00 |                  BMW | 'Content-Type: application/json' , 'Authorization: Bearer ' K7kXly5HTO9Tdhy7xi1I7hKEvL8qyBl5
TXT: 28.02.2018 00:28:02.00 |         BMW Response | <US>?<BS><NUL><NUL><NUL><NUL><NUL><NUL><ETX>-▒1<LF>▒0<FF><ENQ>Ы|4?<RS> ▒▒<RS>?▒C?<DC3>▒▒▒<DC4>J▒ޡ]▒▒▒▒<BS><SI> ...

jetzt wird ein Token abgerufen


TXT: 28.02.2018 01:08:45.00 |                  BMW | token expired, get new token
TXT: 28.02.2018 01:08:45.00 |       BMW Postfields | username=...
TXT: 28.02.2018 01:08:45.00 |                  BMW | access_token: wDvLMKjmuj5jAcA44K17GXAWc2FMSXIU
TXT: 28.02.2018 01:08:45.00 |                  BMW | Bearer expires in: 7199s
TXT: 28.02.2018 01:08:45.00 |                  BMW | set access_token: wDvLMKjmuj5jAcA44K17GXAWc2FMSXIU
TXT: 28.02.2018 01:08:45.00 |                  BMW | set token expiration: 1519783724

=> gueltig bis 03:08:44

ab hier wieder ok


TXT: 28.02.2018 01:18:46.00 |                  BMW | Send to url: https://www.bmw-connecteddrive.de/api/vehicle/dynamic/v1/WBAWY51xxxxxxxxxx?offset=-60
TXT: 28.02.2018 01:18:46.00 |                  BMW | 'Content-Type: application/json' , 'Authorization: Bearer ' wDvLMKjmuj5jAcA44K17GXAWc2FMSXIU
TXT: 28.02.2018 01:18:47.00 |         BMW Response | {<LF>  "attributesMap" : {<LF>    "updateTime_converted" : "27.02.2018 17:35",<LF>    "DCS_CCH_Ongoing " : null,<LF> ...

usw.

Abruf der Tokens, ca. alle 2:30h, Gültigkeit ist aber nur 2h (7199s):


TXT: 27.02.2018 22:25:00.00 |                  BMW | set token expiration: 1519773899
TXT: 28.02.2018 01:08:45.00 |                  BMW | set token expiration: 1519783724
TXT: 28.02.2018 03:38:46.00 |                  BMW | set token expiration: 1519792725
TXT: 28.02.2018 06:08:47.00 |                  BMW | set token expiration: 1519801726
TXT: 28.02.2018 08:20:08.00 |                  BMW | set token expiration: 1519809607

Ja, immer wenn der Token abgelaufen ist, kommt "Müll - erkennen kann man das daran, das der HTTP-Statuscocde 401 geliefert wird.

Also habe ich mir den Code angeschaut und folgende Änderungen angebracht:


$ git diff module.php

diff --git a/BMW/module.php b/BMW/module.php
index b3efc50..dc9f09e 100644
--- a/BMW/module.php
+++ b/BMW/module.php
@@ -533,7 +533,7 @@ class BMWConnectedDrive extends IPSModule

         IPS_SetProperty($this->InstanceID, "token", $matches[1]);
         $this->SendDebug("BMW","set access_token: ".$matches[1],0);
-        $token_expiration = time() + $matches[3];
+        $token_expiration = time() + $matches[3] - 60;
         IPS_SetProperty($this->InstanceID, "token_expiration", $token_expiration);
         $this->SendDebug("BMW","set token expiration: ".$token_expiration,0);
         IPS_ApplyChanges($this->InstanceID);
@@ -1277,6 +1277,8 @@ bmwSkAnswer=BMW_ACCOUNT_SECURITY_QUESTION_ANSWER

     protected function SendBMWAPIV1($command, $action)
     {
+               $this->CheckToken();
+
         $area = $this->ReadPropertyInteger('bmw_server');
         $api = $this->GetBMWServerURL($area);
         $token = $this->ReadPropertyString("token");
@@ -1293,7 +1295,15 @@ bmwSkAnswer=BMW_ACCOUNT_SECURITY_QUESTION_ANSWER
         curl_setopt( $ch, CURLOPT_RETURNTRANSFER, true );
         curl_setopt( $ch, CURLOPT_FOLLOWLOCATION, true );
         $response = curl_exec($ch);
-        if($response === false)
+
+           $httpcode = curl_getinfo($ch, CURLINFO_HTTP_CODE);
+           if ($httpcode != 200)
+                       $this->SendDebug("BMW Response", "got http-code $httpcode", 0);
+           if ($httpcode == 401)
+               {
+                       $response = "";
+           }
+               else if ($response === false)
         {
             $curl_error = curl_error($ch);
             $this->SendDebug("BMW","curl error: ".$curl_error,0);
@@ -1308,6 +1318,8 @@ bmwSkAnswer=BMW_ACCOUNT_SECURITY_QUESTION_ANSWER

     protected function SendBMWAPI($command)
     {
+               $this->CheckToken();
+
         $area = $this->ReadPropertyInteger('bmw_server');
         $api = $this->GetBMWServerURL($area);
         $token = $this->ReadPropertyString("token");
@@ -1319,9 +1331,18 @@ bmwSkAnswer=BMW_ACCOUNT_SECURITY_QUESTION_ANSWER
         curl_setopt( $ch, CURLOPT_RETURNTRANSFER, true );
         curl_setopt( $ch, CURLOPT_FOLLOWLOCATION, true );
         $response = curl_exec($ch);
-        $this->SendDebug("BMW Response", $response,0);
         $curl_error = curl_error($ch);
         // $this->SendDebug("BMW","curl error: ".$curl_error,0);
+
+               $httpcode = curl_getinfo($ch, CURLINFO_HTTP_CODE);
+           if ($httpcode != 200)
+                       $this->SendDebug("BMW Response", "got http-code $httpcode", 0);
+               if ($httpcode == 401 ) {
+                       $response = "";
+               }
+               else {
+                       $this->SendDebug("BMW Response", $response, 0);
+               }
         curl_close( $ch );
         return $response;
     }
@@ -1623,4 +1644,4 @@ bmwSkAnswer=BMW_ACCOUNT_SECURITY_QUESTION_ANSWER

 }

-?>
\ No newline at end of file
+?>

  1. fange ich den Fehler 401 ab, damit kein Müll in den Daten eingetragen wird.
  2. mache ich vor jeden Abruf ein CheckToken() und erneuere damit den Token, wenn abgelaufen
  3. verkürze ich die Gültigkeit des Token um 60 Sekunden, damit es keine raise-condition gibt (der Token ist noch 1s gültig, dann erfolgt der http-Request, der aber etwas braucht, bis er bei BMW eintrudelt …)

Damit ist doch auch dieser Timer überflüssig, oder?


        $this->RegisterTimer('BMWTokenUpdate', 9000000, 'BMW_CheckToken('.$this->InstanceID.');');

Bisher hat die Änderung funktioniert. Was meinst Du?

Ich kann das schlecht beurteilen, denn ich habe keinen BMW mehr um das auf Funktion zu testen. Wenn es bei Dir zuverlässig funktioniert, dann mache einen Pullrequest, dann kann man das ja mergen. Der Timer sollte dann wohl überflüssig sein.

ich habe das Modul aktualisiert, damit ich meine Änderungen mergen und ein epull-Request machen kann.

Dabei trat diese Meldung auf:


03/02/18 19:01:35 | 00000 | MESSAGE | PHPLibrary           | Registriere Funktionen... BMW_GetCarPicture
03/02/18 19:01:35 | 00000 | MESSAGE | PHPLibrary           | Registriere Funktionen... BMW_GetCarPictureForAngle
03/02/18 19:01:35 | 00000 | MESSAGE | PHPLibrary           | Registriere Funktion... BMW_GetCarPictureForAngle: Nicht registrierbare Funktion  BMW_GetCarPictureForAngle: Parameter count does not match
03/02/18 19:01:35 | 00000 | WARNING | PHPLibrary           | Parameter zoom in function BMW_SetCarPictureZoom has no type hint. Please use either 'bool', 'int', 'float' or 'string'.
03/02/18 19:01:35 | 00000 | MESSAGE | PHPLibrary           | Registriere Funktionen... BMW_SetCarPictureZoom

Einen Fehler habe ich nicht gesehen, aber es scheint sich ja hier um Funktionen zu den Bildern zu handeln und die habe ich nicht aktiviert.

Den fehlenden type hint bei BMW_SetCarPictureZoom habe ich korrigiert, was die andere Meldung sagen soll kann ich auf die schnelle nicht zuordnen. Wenn Du die aktuelle Version so pullst und dann Deine Änderungen einpflegst sollte das wohl mit dem Merge dann funktionieren.

Ich hatte schon das Modul bei mir aktualisiert und meine Änderungen eingepflegt und auf der Basis dann meinen Pull-Request gemacht.