Example on how to access the Renault Zoe API using exec binding and python

Tags: #<Tag:0x00007f7459983120> #<Tag:0x00007f7459982fb8> #<Tag:0x00007f7459982e50>

Hi all,
I stumbled over this web site on reverse engineering the Renault Zoe API and as I have such a electric car I decided to integrate this into my openHAB set-up.

Bildschirmfoto%20vom%202019-10-04%2023-41-05

I know that there is a Zoe API binding in beta status out there as well, but a few curl requests seemed to me overdone for a binding. So here 's my take on this - in case somebody likes to use it:

  • Obviously you need a Renault Zoe to test this, but there are other APIs described out there (e.g. BMW). You can use the script as a basis.
  • this script assumes you have registered your-self with Renault Service.

Some python code in the file ze.py:

#!/usr/bin/python

import requests
import json
#https://shkspr.mobi/blog/2016/10/reverse-engineering-the-renault-zoe-api/

headers = {    'Content-Type': 'application/json',}
data = '{"username":"you@email.com","password":"YourPassword"}'
response = requests.post('https://www.services.renault-ze.com/api/user/login', headers=heade$
token = response.json()["token"]
user = response.json()["user"]
vin = user["vehicle_details"]["VIN"]

# curl -H "Authorization: Bearer AAAA" "https://www.services.renault-ze.com/api/vehicle/VVVV$
headers = {    'Authorization': 'Bearer '+token,}
response = requests.get('https://www.services.renault-ze.com/api/vehicle/'+vin+'/battery', h$

print (response.json()["charge_level"])

Some notes to this script:

  • replace you@email.com and YourPassword with your credentials for the Renault service
  • make this script executable (chmod +x ze.py). If the script works well you should receive a number between 0 to 100
  • I received an [ERROR] [untime.internal.engine.RuleEngineImpl] when I tried to return the full json response to openHab (it worked in the console though) and couldn’t resolve that. Send me a note if you know why. Anyhow I was just interested in the charge status, therefor it returns only this (see the last line with [“charge_level”])
  • the web site has various other examples (air condition, etc.) on the API which should be easily implementable using this script as basis

Further implementation in openHAB is pretty straight forward:
the thing file

Thing exec:command:zoe [command="/home/pi/ze.py", interval=600, timeout=15, autorun=true]

the items file

String Zoe_Out {channel="exec:command:zoe:output"}
Number ZoeLevel "Zoe Batterie [%.0f %%]" <ecar> (gAU) 

a rule file

rule "Zoe"
  when
     Item Zoe_Out received update
  then
     
    logInfo("Zoe ", Zoe_Out.state.toString )
    var String data = Zoe_Out.state.toString
    var String level = transform("JSONPATH", "$.charge_level", data)
    ZoeLevel.postUpdate( (Float::parseFloat(level) as Number )  )
end

That’s it. Have fun.
Jan

2 Likes