Renault Zoe Anbindung

Hi,

hier ist mal ein kleines initiales script was es erlaubt, die Zoe in Symcon anzubinden. Getestet ist das ganze mit der PH2 (also dem letzen Modell).

Das Script erstellt eiige variablen und lädt alle 24 Stunden einen neuen Token, die Daten vom Fahrzeug werden alle 5 min geholt.

Zusätzlich kann die Vorklimatisierung aktiviert werden sowie das Laden gestartet oder abgebrochen werden.

Die $gigya_api für DE beginnend mit „3_7PLk“ sowie die $Kamereon_Api kann im Netz „oF09“ kann aus dem Netz bezogen werden (weiss nicht ob ich das darf)

Macht euch eine Kategorie, werstellt euch ein leeres Script und fügt den Inhalt dsr unten anhängenden Script ein und startet es. Es werden einige Variablen erstellt und entsprechen gefüllt. Zudem gibt es eine leere Variable namens „Google API“. Wenn Ihr den API Key für Google-Maps einfügt, wird euch auch der Standort angezeigt (soweit ich weiss nur Phase2)

Für Schäden oder ähnliches wird nicht gehaftet, das script ist noch nicht „fertig“, funktioniert hier aber schon ganz gut.

Viele Grüße
Kris

Update
30.11.2020

  • inkl Api Keys
  • neue scripte zur Klimatisierung und starte der Laden. Hier wird es aber noch Änderungen geben, das die Ladung beendet wird klappt noch nicht sauber und die Variable sind derzeit bool sollen aber integer werden. Grund: Es gibt keine Rückmeldung ob die Klimatisierung begonnen hat. Daher mach ich später integer -1 für stop, 0 für dummy und 1 für klimastart…

installscript.txt (26.8 KB)

1 „Gefällt mir“

Hi,

ich habe das Script erweitert.
2020-11-25 21_21_25-IP-Symcon Verwaltungskonsole.png

Man kann nun Vorklimatisieren und die max. Lademenge im Bereich von 60% - 100% einstellen. Die beiden letzten Scripte habe ich allerdings aus Zeitmangel noch nicht ausführlich getestet. Schaffe ich erst am Wochenende.

Bei der max. Lademenge wird beim erreichen des eingetragenen Wertes die Ladung vom Fahrzeug aus beendet.

Viele Grüße

Das sieht nach Fleiß und systematischer Arbeit aus! Hab es mir gleich mal installiert. Allerdings kriege ich noch keine Werte.

Die $gigya_api für DE beginnend mit „3_7PLk“ sowie die $Kamereon_Api kann im Netz „oF09“ kann aus dem Netz bezogen werden

Kannst Du mir hier vielleicht nochmal ein bisschen aufs Pferd helfen? Wo genau bekomme ich die Werte für die beiden APIs her?

Ich habe ja eine recht alte ZOE Q90 (43 kW-Lader, ehemals 22 kWh-Akku, jetzt 41 kWh-Akku), also eine PH1.

Wenn da mal was sinnvolles rauskommt, wäre es ja fast traumhaft. bisher ist das Auto ein Datengrab…

Hi,

schön das Du testen möchtest, ich habe oben eine neue Version angehangen. Da sind die Apikeys nun drin. Die sind auf Github u.a beim pyze pojekt und noch div. anderen alle im klartext.

Ich arbeite derzeit an einer Version bei der man die VIN nicht mehr angeben muss, da ich sie auslesen kann. Ich schaue auch mal das ich eine Unterscheidung zwischen Ph1 und Ph2 hinbekomme. Weiss leider nicht ob ich die Daten auch auslesen kann oder ob man die selber angeben muss.

Viele Grüße

Ja super! Funktioniert zwar nicht alles, aber immerhin:

  • Reichweite km
  • Ladestand %
  • letzte Aktualisierung Batterie
  • Eingesteckt
  • Laden

Die beiden Stecker/Ladezustände muss ich noch testen.

Was ja für mich noch Königsklasse wäre: Kilometerstand und Standort.

Ich habe heute einen CanSee für den CanZE gebaut (Dongle mit ESP32 und zwei Can-Adaptern). Vielleicht kann ich darüber auch noch ein Datenposting generieren. Schlimmstenfalls baue ich da noch ein GPS-Modul und eine SIM-Karte ein… Wird aber wieder ein häßlicher Aufwand.

Aber Deine Lösung hier ist natürlich ziemlich elegant.

By the Way: hast Du Erfahrung mit dem ABRP (A better Route Planner)? Der verarbeitet auch den Ladezustand der Batterie, aber sie kommen glaube ich noch nicht an die ZOE-Batterie dran…

Kleine Korrektur:

„Charging Status“ wird bei mir nicht aktualisiert, das Feld gibt es wohl bei der PH1 nicht. Steht bei mir immer auf „true“

Aktualisierung alle 30 Minuten oder wenn das Fahrzeug an- oder abgestöpselt wird. Ist jetzt nicht rasend schnell, aber besser als alles, was ich seither hatte :wink:

Hab es noch mit den Zählerdaten aus meiner Wallbox kombiniert, da habe ich das Wichtigste auf einen Blick.

Das würde ich gern benutzen.

Meine ZOE ist jetzt 3,5 Jahre alt und hat fast 70.000 km runter.

Gruß
Bernd

Sollte funktionieren! Du kannst halt „nur“

  • Reichweite km
  • Ladestand %
  • letzte Aktualisierung Batterie
  • Eingesteckt

bekommen.

Die Energiewerte (Leistung, Verbrauch, kumulierte Werte für Tag, Woche, Monat, Jahr) kommen von meinem ModBus-Zähler und einem Auswerte-Skript, das bei mir schon einige Jahre läuft. Da sind die Ladungen, die ich unterwegs mache, nicht dabei.

Reichweite und Ladestand habe ich jetzt auch mal geloggt.

Ich hatte mich ja schon seit längerem über diese albernen SMS geärgert, die man jetzt zu Ladebeginn und Ladeende bekommt. Mir wären eigentlich Faxe lieber gewesen :wink:

Seit ich nun den Abfrage-Dienst eingerichtet habe, bekomme ich währen der Ladung alle 30 Minuten per SMS den Hinweis: „Laden des Fahrzeugs nicht möglich. Kommunikationsfehler oder Laden schon begonnen. Das Renault Team“

Ich hab den Quatsch in der App abgeschaltet. Das Auto lädt tatsächlich. Vermutlich ist der Dienst, der diese SMS versendet, jetzt beleidigt, weil das Konto alle 5 min abgefragt wird. Überfordert die Renault-Server.

Hi,

juhu, Willige Tester :smiley:

Also soweit ich das sehe gehen bestimmte Dinge bei der Phase 1 nicht. bspw die GPS Daten.

Dafür fehlen bei der Phase 2 die Batterietemperatur und die Außentemperatur. Die gibt es nur bei der 1.

@Bernd
Phase 1 wurde bis ca 2019 gebaut und danach Phase2, sollte also klappen.

Ihr könnt ja in der Kategorie folgendes Script einfügen und ausführen:

<?php

function GetBatteryData(){
    $ObjektInfo = IPS_GetObject(IPS_GetParent($_IPS['SELF']));
    $ObjectID = $ObjektInfo['ObjectID'];

    $TokenID =      GetValue(IPS_GetObjectIDByIdent($ObjectID."_TokenID", $ObjectID));
    $AccountID =    GetValue(IPS_GetObjectIDByIdent($ObjectID."_AccountID", $ObjectID));
    $KameronID =    GetValue(IPS_GetObjectIDByIdent($ObjectID."_KAMEREON_API", $ObjectID));
    $VinID =        GetValue(IPS_GetObjectIDByIdent($ObjectID."_VIN", $ObjectID));
    $CountryID =    GetValue(IPS_GetObjectIDByIdent($ObjectID."_COUNTRY", $ObjectID));

    $postData = array(
        'apikey: '.$KameronID,
        'x-gigya-id_token: '.$TokenID
    );
    $ch = curl_init('https://api-wired-prod-1-euw1.wrd-aws.com/commerce/v1/accounts/'.$AccountID.'/kamereon/kca/car-adapter/v2/cars/'.$VinID.'/battery-status?country='.$CountryID);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, TRUE);
    curl_setopt($ch, CURLOPT_HTTPHEADER, $postData);
    $response = curl_exec($ch);
    if ($response === FALSE) die(curl_error($ch));
    $md5 = md5($response);
    $responseData = json_decode($response, TRUE);
    print_r($responseData);
}

//Abfrage Kilometerstand
function GetCockpitData(){
    $ObjektInfo = IPS_GetObject(IPS_GetParent($_IPS['SELF']));
    $ObjectID = $ObjektInfo['ObjectID'];

    $TokenID =      GetValue(IPS_GetObjectIDByIdent($ObjectID."_TokenID", $ObjectID));
    $AccountID =    GetValue(IPS_GetObjectIDByIdent($ObjectID."_AccountID", $ObjectID));
    $KameronID =    GetValue(IPS_GetObjectIDByIdent($ObjectID."_KAMEREON_API", $ObjectID));
    $VinID =        GetValue(IPS_GetObjectIDByIdent($ObjectID."_VIN", $ObjectID));
    $CountryID =    GetValue(IPS_GetObjectIDByIdent($ObjectID."_COUNTRY", $ObjectID));

    $postData = array(
         'apikey: '.$KameronID,
          'x-gigya-id_token: '.$TokenID
    );
    $ch = curl_init('https://api-wired-prod-1-euw1.wrd-aws.com/commerce/v1/accounts/'.$AccountID.'/kamereon/kca/car-adapter/v1/cars/'.$VinID.'/cockpit?country='.$CountryID);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, TRUE);
    curl_setopt($ch, CURLOPT_HTTPHEADER, $postData);
    $response = curl_exec($ch);
    if ($response === FALSE) die(curl_error($ch));
    $responseData = json_decode($response, TRUE);
    print_r($responseData);
}

// hole Positionsdaten
function GetPosition(){
    $ObjektInfo = IPS_GetObject(IPS_GetParent($_IPS['SELF']));
    $ObjectID = $ObjektInfo['ObjectID'];

    $TokenID =      GetValue(IPS_GetObjectIDByIdent($ObjectID."_TokenID", $ObjectID));
    $AccountID =    GetValue(IPS_GetObjectIDByIdent($ObjectID."_AccountID", $ObjectID));
    $KameronID =    GetValue(IPS_GetObjectIDByIdent($ObjectID."_KAMEREON_API", $ObjectID));
    $VinID =        GetValue(IPS_GetObjectIDByIdent($ObjectID."_VIN", $ObjectID));
    $CountryID =    GetValue(IPS_GetObjectIDByIdent($ObjectID."_COUNTRY", $ObjectID));

    $postData = array(
      'apikey: '.$KameronID,
      'x-gigya-id_token: '.$TokenID
      );
    $ch = curl_init('https://api-wired-prod-1-euw1.wrd-aws.com/commerce/v1/accounts/'.$AccountID.'/kamereon/kca/car-adapter/v1/cars/'.$VinID.'/location?country='.$CountryID);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, TRUE);
    curl_setopt($ch, CURLOPT_HTTPHEADER, $postData);
    $response = curl_exec($ch);
    if ($response === FALSE) die(curl_error($ch));
    print_r($response);
}

echo "################# Hole Batteriedaten ab
";
GetBatteryData();
echo "################# Hole Cockpitdaten ab
";
GetCockpitData();
echo "################# Hole Positionsdaten ab
";
GetPosition();

Die daten stehen mir zur Verfügung… Ich brauch noch ein wenig Zeit, am WE hat mein Kind Geburtstag, da schaff ich wahrscheinlich nix

Viele Grüße

Da will man Doch Deinen Er-Finder-Geist auf keinen Fall ausbremsen.

Hier meine Ergebnisse:


################# Hole Batteriedaten ab
Array
(
    [data] => Array
        (
            [type] => Car
            [id] => VF1AGVYA052xxxxx
            [attributes] => Array
                (
                    [timestamp] => 2020-12-03T17:28:13+01:00
                    [batteryLevel] => 96
                    [batteryTemperature] => 5
                    [batteryAutonomy] => 193
                    [batteryCapacity] => 0
                    [batteryAvailableEnergy] => 0
                    [plugStatus] => 0
                    [chargingStatus] => -1
                )

        )

)
################# Hole Cockpitdaten ab
Array
(
    [type] => FUNCTIONAL
    [messages] => Array
        (
            [0] => Array
                (
                    ((code)) => err.func.403  # [ ] Klammern von mir durch (( )) ersetzt
                    [message] => {"errors":[{"status":"403","code":"security.access","detail":"Access is denied for this resource"}]}
                )

        )

    [errors] => Array
        (
            [0] => Array
                (
                    [errorCode] => err.func.403
                    [errorMessage] => {"errors":[{"status":"403","code":"security.access","detail":"Access is denied for this resource"}]}
                )

        )

    [error_reference] => FUNCTIONAL
)
################# Hole Positionsdaten ab
{"type":"FUNCTIONAL","messages":[{"code":"err.func.403","message":"{\"errors\":[{\"status\":\"403\",\"code\":\"security.access\",\"detail\":\"Access is denied for this resource\"}]}"}],"errors":[{"errorCode":"err.func.403","errorMessage":"{\"errors\":[{\"status\":\"403\",\"code\":\"security.access\",\"detail\":\"Access is denied for this resource\"}]}"}],"error_reference":"FUNCTIONAL"}


Das mit dem Wochenende ist verständlich :wink: Aber wozu gibt es diese Nächte :smiley:

[batteryTemperature] => 5 # Wert in °C

Der Wert stimmt, also kann man das bei PH1 auch noch auslesen.

Allerdings scheint das ein grob gemittelter und nach unten abgerundeter Wert zu sein, der mir im CanZE auch „summarisch“ ausgegeben wird. Die Zell-Module haben wohl im Mittel etwa 6°C

Vielleicht kanntest Du die Quelle schon, hab das jetzt nicht weiter recherchiert. Mit IOBroker haben wohl schon einige herumexperimentiert und auch ein Skript für die neue API-Version 2020 erarbeitetn
https://michael-heck.net/index.php/elektromobilitaet/renault-zoe-im-smarthome-neue-api-2020

Da kann man wohl auch die restliche Ladedauer und den Ladeschluss-Zeitpunkt auslesen.

Hi,

komisch, bei dir werfen die zwei letzten Befehle einen error aus aber zumindest der km stand sollte angezeigt werden…

Kannst du es ggf nochmal versuchen. Evtl hilft es wenn du vorher das GetToken script ausführst?

Das mit dem Wochenende ist verständlich :wink: Aber wozu gibt es diese Nächte

och nöööö, lass ma :D:D

Viele Grüße

ne, da ist er sich mit den Fehlern sicher, Cockpit- und Positionsdaten mag er beide nicht.
Was Hast Du denn für eine ZOE? Hat das bei anderen PH1 schon mal geklappt?

Es gibt wohl auch andere ZOE, die keinen km-Stand auswerfen. Mein Verdacht: Die Q90 und R90 machen das noch nicht, jedenfalls die relativ frühen. Und meiner hat demnächst seinen sechsten Geburtstag. In der App kann ich den km-Stand manuell eingeben, wird aber gar nicht angezeigt. Renault halt…

Kennst Du das Repository hier:
https://github.com/db-EV/ZoePHP

Ich habe mich hier mal angemeldet, weil ich durch das goingeletric Forum darauf gestoßen bin. Und die Einbindung in symcon ganz interessant find.

Das Script habe ich mal installiert. Funktioniert soweit auch ganz gut, auch die Vorklimatisierung funktioniert tadellos. Was für mich ganz Interessant wäre, ist die Ladegrenze bis 80%. Das funktioniert gar nicht bei mir, egal welchen Wert ich einstelle. Hat das bei jmd. schon mal funktioniert?

Grüße

Hi,

Leider klappt das nicht. Ich kann maximal die ladung starten und auch das nicht immer. Muss mal sehen ob es mit pyze klappt.

Hab noch eine weitere Version in der Pipeline mit einigen Änderungen, hab aber noch ein Problem mit der Erstellung einer variable, das wollte ich noch gelöst haben.

Viele grüsse

Gesendet von meinem HD1903 mit Tapatalk

Danke für die schnelle Antwort.
Ist das seitens Renault überhaupt möglich einen Befehl per Software an das Auto zu senden, um die Ladung abzubrechen? Dachte immer, das ist nur Hardwareseitig möglich, also entweder auf der Wallboxseite, oder in dem man die Ladeklappe am Fahrzeug öffnet.

Hi,

scheinbar ist es nicht möglich von der zoe aus.

Man kann in der entsprechenden Funktion ein print_r nutzen und sehen das bei einem „stop“ die Sequenz fehlerfrei angenommen wird. Daher dachte ich, das würde funktionieren.

würdest du beispielsweise „cancel“ oder „false“ nehmen kommt es zu einem Fehler…

ich denke ich werde daher diese Funktion zur Benachrichtigung via push nutzen, wenn die lademenge erreicht ist.

Viele grüsse

Gesendet von meinem HD1903 mit Tapatalk