Seite 4 von 30

Re: Mercedes SoC

Verfasst: Mi Sep 23, 2020 12:18 pm
von riogrande75
So, bei mir schaut das so aus:
"authorize.php"

Code: Alles auswählen

#!/usr/bin/php
<?php
$debug=0;
$authorize_url = "https://id.mercedes-benz.com/as/authorization.oauth2";
$token_url = "https://id.mercedes-benz.com/as/token.oauth2";
$FIN = "WDD242xxxx";
$acc_token = "";

// callback URL specified when the application was defined--has to match what the application says
$callback_uri = "https://localhost";

$api_url_soc = "https://api.mercedes-benz.com/vehicledata/v2/vehicles/".$FIN."/resources/soc"; //StateOfCharge only
$api_url_range = "https://api.mercedes-benz.com/vehicledata/v2/vehicles/".$FIN."/resources/rangeelectric"; //range only

//      client (application) credentials - located at apim.byu.edu
$client_id = "<your-client-id>";
$client_secret = "<your-client-secret>";

//Main calls
getAuthorizationCode();
getAccessToken($autho_code);

//Needed functions
function getAuthorizationCode() {
        global $authorize_url, $client_id, $callback_uri, $autho_code;
        $authorization_redirect_url = $authorize_url . "?response_type=code&client_id=" . $client_id . "&redirect_uri=" . $callback_uri . "&scope=mb:vehicle:mbdata:evstatus offline_access";
        header("Location: " . $authorization_redirect_url);
        // if you don't want to redirect
        echo "Geh in einem Browser zu\n---   \033[1m$authorization_redirect_url\033[0m   ---\nkopiere den code aus dem link und fuege ihn hier ein:\n";
        $autho_code = fgets(STDIN);
}
function getAccessToken($authorization_code) {
        global $debug, $token_url, $client_id, $client_secret, $callback_uri, $acc_token;

        $authorization = base64_encode("$client_id:$client_secret");
        $header = array("Authorization: Basic {$authorization}","Content-Type: application/x-www-form-urlencoded");
        $content = "grant_type=authorization_code&code=$authorization_code&redirect_uri=$callback_uri";
        $curl = curl_init();
        curl_setopt_array($curl, array(
                CURLOPT_URL => $token_url,
                CURLOPT_HTTPHEADER => $header,
                CURLOPT_SSL_VERIFYPEER => false,
                CURLOPT_RETURNTRANSFER => true,
                CURLOPT_POST => true,
                CURLOPT_POSTFIELDS => $content
        ));
        $response = curl_exec($curl);
        curl_close($curl);

        if ($response === false) {
                echo "Failed";
                echo curl_error($curl);
                echo "Failed";
        } elseif (json_decode($response)) {
                if($debug){
                        echo "Code:";
                        echo $authorization_code;
                        echo $response;
                        }
        }
        $acc_token = json_decode($response)->access_token;
        $ref_token = json_decode($response)->refresh_token;
        $expires = json_decode($response)->expires_in;
        $token_type =  json_decode($response)->token_type;
        if($debug)
        {
                echo "\n*** AccessToken:".$acc_token."\n";
                echo "*** RefreshToken:".$ref_token."\n";
                echo "*** TokenType:".$token_type ."\n";
                $ablauf = time() + $expires;
                echo "*** Expires in:".$expires." Sekunden, also um ".date('H:i:s', $ablauf)."\n";
        }
        //Schreibe Access Token in file
        $fp1 = fopen ("/etc/eauto/access_token", "w");
        fwrite ($fp1, $acc_token);
        fclose ($fp1);
        //Schreibe Refresh Token in file
        $fp2 = fopen ("/etc/eauto/refresh_token", "w");
        fwrite ($fp2, $ref_token);
        fclose ($fp2);
}
Dann die "refresh.php":

Code: Alles auswählen

#!/usr/bin/php
<?php
$debug=0;
$token_url = "https://id.mercedes-benz.com/as/token.oauth2";

//      client (application) credentials - located at apim.byu.edu
$client_id = "<your-client-id>";
$client_secret = "<your-client-secret>";

//Main calls
refreshTokens();

//Needed function
function refreshTokens()
        {
        global $debug, $token_url, $client_id, $client_secret;
        $refresh_token = file_get_contents('/etc/eauto/refresh_token',true);
        if(!$refresh_token) echo "ACHTUNG: Kein Refresh Token vorhanden!\n";
        $authorization = base64_encode("$client_id:$client_secret");
        $header = array("Authorization: Basic {$authorization}","Content-Type: application/x-www-form-urlencoded");
        $content = "grant_type=refresh_token&refresh_token=$refresh_token";
        $curl = curl_init();
        curl_setopt_array($curl, array(
                CURLOPT_URL => $token_url,
                CURLOPT_HTTPHEADER => $header,
                CURLOPT_SSL_VERIFYPEER => false,
                CURLOPT_RETURNTRANSFER => true,
                CURLOPT_POST => true,
                CURLOPT_POSTFIELDS => $content
        ));
        $response = curl_exec($curl);
        curl_close($curl);
        if($debug) echo "JSON:json_decode($response)\n";

        $acc_token = json_decode($response)->access_token;
        $ref_token = json_decode($response)->refresh_token;
        $expires = json_decode($response)->expires_in;
        if($debug)
        {
                echo "\n*** AccessToken:".$acc_token."\n";
                echo "*** RefreshToken:".$ref_token."\n";
                $ablauf = time() + $expires;
                echo "*** Expires in:".$expires." Sekunden, also um ".date('H:i:s', $ablauf)."\n";
        }
        //Schreibe neues Access Token in file
        $fp1 = fopen ("/etc/eauto/access_token", "w");
        fwrite ($fp1, $acc_token);
        fclose ($fp1);
        //Schreibe neues Refresh Token in file
        $fp2 = fopen ("/etc/eauto/refresh_token", "w");
        fwrite ($fp2, $ref_token);
        fclose ($fp2);
}
?>
Und hier noch die "abfrage.php":

Code: Alles auswählen

#!/usr/bin/php
<?php
$debug=0;

$FIN = "WDD242xxx";
$api_url_soc = "https://api.mercedes-benz.com/vehicledata/v2/vehicles/".$FIN."/resources/soc"; //StateOfCharge only
$api_url_range = "https://api.mercedes-benz.com/vehicledata/v2/vehicles/".$FIN."/resources/rangeelectric"; //range only

//      client (application) credentials - located at apim.byu.edu
$client_id = "<your-client-id>";
$client_secret = "<your-client-secret>";

//Main calls
//getAuthorizationCode();
//getAccessToken($autho_code);
$acc_token = file_get_contents('/etc/eauto/access_token', true);
//if($debug) echo "ACCESS_TOKEN:$acc_token\n";
getResource($acc_token);

//      we can now use the access_token as much as we want to access protected resources
function getResource($access_token) {
        global $debug, $api_url_soc, $api_url_range;
        $header = array("Authorization: Bearer {$access_token}");
        $curls = curl_init();
        curl_setopt_array($curls, array(
                CURLOPT_URL => $api_url_soc,
                CURLOPT_HTTPHEADER => $header,
                CURLOPT_SSL_VERIFYPEER => false,
                CURLOPT_RETURNTRANSFER => true
        ));
        $responseS = curl_exec($curls);
        curl_close($curls);
        sleep(3);
        $curlr = curl_init();
        curl_setopt_array($curlr, array(
                CURLOPT_URL => $api_url_range,
                CURLOPT_HTTPHEADER => $header,
                CURLOPT_SSL_VERIFYPEER => false,
                CURLOPT_RETURNTRANSFER => true
        ));
        $responseR = curl_exec($curlr);
        curl_close($curlr);
        // debugging
        $soc =  json_decode($responseS,true)['soc']['value'];
        $range = json_decode($responseR,true)['rangeelectric']['value'];
        if($debug)
        {
                echo "SocReso:$responseS\n";
                print_r(json_decode($responseS, true));
                echo "RangeResp:$responseR\n";
                print_r(json_decode($responseR, true));
        echo "SOC:$soc\n";
        echo "RANGE:$range\n";
        }
        $fp = fopen ("/tmp/eauto.txt", "w");
        fwrite ($fp, $soc);
        fclose ($fp);
}
?>
Alles quick'n'dirty, aber funktioniert soweit und reicht für mich aus. Hab die scripte auch auf https://github.com/riogrande75/mercedes_soc gepostet.

PS: Kann man sicher schöner programmieren (aber nicht ich)

Re: Mercedes SoC

Verfasst: Do Sep 24, 2020 9:57 am
von riogrande75
Mal ne (vielleicht blöde) Frage: Wird der SoC während des Ladens des Wagens nie upgedatet?
Bei mir kommt schon den ganzen Tag

Code: Alles auswählen

Received empty response with status code 204. Vehicle did not provide update for >12h. Keeping soc unchanged.
Ist das "normal", liefert der Benz wirklich nur Daten wenn er fährt?

Re: Mercedes SoC

Verfasst: Do Sep 24, 2020 7:58 pm
von solarjunkie
riogrande75 hat geschrieben: Do Sep 24, 2020 9:57 am Mal ne (vielleicht blöde) Frage: Wird der SoC während des Ladens des Wagens nie upgedatet?
Bei mir kommt schon den ganzen Tag

Code: Alles auswählen

Received empty response with status code 204. Vehicle did not provide update for >12h. Keeping soc unchanged.
Ist das "normal", liefert der Benz wirklich nur Daten wenn er fährt?
Nein, das sollte regelmäßig aktualisiert werden. Prinzipiell hoert die API tatsaechlich nach 12h ohne Änderung auf, den Status zurückzuliefern.

Ich hatte nach der Renovierung der API das Problem mit 204 aber auch, bis ich zum ersten Mal eine Änderung des SOC hatte. Habe zum Test die Standklimatisierung angemacht.

Bei mir wurde heute geladen und geupdatet :-)
41272DD8-87E5-43E0-BCF1-3104DCB4DCC2.jpeg
VG,
Ralf

Re: Mercedes SoC

Verfasst: Fr Sep 25, 2020 5:17 am
von riogrande75
Was ist da das E-Auto in deinem Diagramm?
Hab gestern das Auto voll geladen, danach kurz Zündung an = SoC in der Cloud wurde upgedatet: Sprung von 43 auf 99%.
Heute Morgen 30km in die Arbeit gefahren - bis jetzt kommt noch immer Status 204 zurück.

Re: Mercedes SoC

Verfasst: Fr Sep 25, 2020 2:29 pm
von solarjunkie
riogrande75 hat geschrieben: Fr Sep 25, 2020 5:17 am Was ist da das E-Auto in deinem Diagramm?
Hab gestern das Auto voll geladen, danach kurz Zündung an = SoC in der Cloud wurde upgedatet: Sprung von 43 auf 99%.
Heute Morgen 30km in die Arbeit gefahren - bis jetzt kommt noch immer Status 204 zurück.
Mysteriös. Das E-Auto in meinem Diagramm ist LP1-SoC (Blau gestrichelt). Wird wie man sieht sowohl beim Laden als auch beim Fahren aktualisiert. Vielleicht unterscheidet sich das je nach Fahrzeug oder Firmware des Wagens??? Bei mir E300de BJ06/2020 - SW Stand müsste ich erst nachschauen.

Werden denn bei Dir in der Mercedes-Me App die Informationen regelmäßig aktualisiert?

VG,
Ralf

Re: Mercedes SoC

Verfasst: Fr Sep 25, 2020 2:39 pm
von aling
Bei meinem EQC funktioniert die Abfrage (php und py).

viele Grüße Achim

Re: Mercedes SoC

Verfasst: Fr Sep 25, 2020 2:54 pm
von riogrande75
Könnte schon sein, dass es an der Firmware des Wagens liegt.
Mein B250e (BJ01/2017) schickt offenbar nur wenn ich den Wagen starte oder abstelle ein Update - aber auch nicht immer.
Während des Ladens schickt er definitiv nichts. Mach nun schon den 2. Ladezyklus. Auch der Empfang des verbauten "Connect-Moduls" dürfe ziemlich mies sein.

Re: Mercedes SoC

Verfasst: Mo Sep 28, 2020 8:10 am
von hirschcom
wollte heute auf meine openwb das Script hochladen, allerdings komme ich per SSH nicht drauf. Das Passwort vom Webinterface funktioniert nicht. Ist da ein Standard Passwort hinterlegt ?

Re: Mercedes SoC

Verfasst: Mo Sep 28, 2020 8:30 am
von openWB
hirschcom hat geschrieben: Mo Sep 28, 2020 8:10 am wollte heute auf meine openwb das Script hochladen, allerdings komme ich per SSH nicht drauf. Das Passwort vom Webinterface funktioniert nicht. Ist da ein Standard Passwort hinterlegt ?
An support@openwb.de wenden. Passwort wird auf Wunsch geändert.
Bedingung:
Wird künftig Support fällig der auf Eigenänderungen/verschulden zurückzuführen ist wird die Supportleistung in Rechnung gestellt.

Re: Mercedes SoC

Verfasst: Sa Okt 03, 2020 3:58 pm
von riogrande75
Auch nach einem Besuch beim Freundlichen, wo mir versichert wurde, dass die aktuellste SW Version drauf ist, funktioniert's nicht besser.
Kann jemand mit einem B250ED das bestätigen? Hab übrigens das Connect UMTS Modul verbaut.