Mercedes SoC

Anfragen zum Erstellen von Modulen, Fragen zu Modulen
Benutzeravatar
riogrande75
Beiträge: 10
Registriert: Mi Sep 09, 2020 10:17 am

Re: Mercedes SoC

Beitrag 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)
Benutzeravatar
riogrande75
Beiträge: 10
Registriert: Mi Sep 09, 2020 10:17 am

Re: Mercedes SoC

Beitrag 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?
solarjunkie
Beiträge: 61
Registriert: So Jun 07, 2020 5:43 pm

Re: Mercedes SoC

Beitrag 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
Benutzeravatar
riogrande75
Beiträge: 10
Registriert: Mi Sep 09, 2020 10:17 am

Re: Mercedes SoC

Beitrag 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.
solarjunkie
Beiträge: 61
Registriert: So Jun 07, 2020 5:43 pm

Re: Mercedes SoC

Beitrag 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
aling
Beiträge: 62
Registriert: So Sep 13, 2020 2:51 pm

Re: Mercedes SoC

Beitrag von aling »

Bei meinem EQC funktioniert die Abfrage (php und py).

viele Grüße Achim
Benutzeravatar
riogrande75
Beiträge: 10
Registriert: Mi Sep 09, 2020 10:17 am

Re: Mercedes SoC

Beitrag 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.
hirschcom
Beiträge: 11
Registriert: Di Sep 01, 2020 2:37 pm

Re: Mercedes SoC

Beitrag 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 ?
openWB
Site Admin
Beiträge: 7901
Registriert: So Okt 07, 2018 1:50 pm

Re: Mercedes SoC

Beitrag 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.
Supportanfragen bitte NICHT per PN stellen.
Hardwareprobleme bitte über die Funktion Debug Daten senden mitteilen oder per Mail an support@openwb.de
Benutzeravatar
riogrande75
Beiträge: 10
Registriert: Mi Sep 09, 2020 10:17 am

Re: Mercedes SoC

Beitrag 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.
Antworten