https://github.com/edent/renault-zoe-api
A basic API for getting information about your Renault Zoe Electric Vehicle.
https://github.com/edent/renault-zoe-api
Last synced: 4 months ago
JSON representation
A basic API for getting information about your Renault Zoe Electric Vehicle.
- Host: GitHub
- URL: https://github.com/edent/renault-zoe-api
- Owner: edent
- Created: 2016-10-15T20:47:42.000Z (over 9 years ago)
- Default Branch: master
- Last Pushed: 2022-01-13T14:46:28.000Z (over 4 years ago)
- Last Synced: 2025-04-05T17:36:54.129Z (about 1 year ago)
- Language: Python
- Size: 28.3 KB
- Stars: 95
- Watchers: 21
- Forks: 24
- Open Issues: 5
-
Metadata Files:
- Readme: README.md
- Funding: .github/FUNDING.yml
Awesome Lists containing this project
README
# Renault-Zoe-API
A basic API for getting information about your Renault Zoe Electric Vehicle. [Read the original blog post](https://shkspr.mobi/blog/2016/10/reverse-engineering-the-renault-zoe-api).
**Please Note!** I no longer have a Renault Zoe, so I am unable to keep this API updated. You are welcome to discuss issues with it in the "issues" tab.
All these API calls can be found by using the [Renault ZE Services website](https://www.services.renault-ze.com). I am indebted to [this German blog post](http://www.aironaut.ch/my-ze-online-abfragen/) for kicking off this work. I'd also like to thank Renault for their ["esoteric" use of JavaScript](https://www.services.renault-ze.com/js/main.js)!
[](https://ko-fi.com/edent)
## What's Available?
This API is fairly limited, here's what you can do with it:
* See battery status, range, charging status.
* Start preconditioning
* See preconditioning history
* See and set charging schedule.
* See charging history
## Getting started
First, register with [Renault ZE Services](https://www.services.renault-ze.com/). This will give you a username and password.
Secondly, you'll need to get your VIN and API token. This can be obtained by posting the username and password to Renault. For example:
```
curl \
-H "Content-Type: application/json" \
-X POST \
-d '{"username":"you@example.com","password":"P4ssw0rd"}' \
https://www.services.renault-ze.com/api/user/login`
```
This will get you back some JSON with your API tokens. Here's an example:
```
{
"token": "AAAA",
"refresh_token": "BBBB",
"user": {
"id": "CCCC",
"locale": "en_GB",
"country": "GB",
"timezone": "Europe/London",
"email": "you@example.com",
"first_name": "Terence",
"last_name": "Eden",
"phone_number": "+447700900123",
"vehicle_details": {
"timezone": "Europe/London",
"VIN": "VVVV",
"activation_code": "GGGG",
"phone_number": "+447700900123"
},
"scopes": ["BATTERY_CHARGE_STATUS",
"BATTERY_CHARGE_HISTORY",
"BATTERY_CHARGE_REMOTE_ACTIVATION",
"BATTERY_CHARGE_SCHEDULING",
"AC_REMOTE_CONTROL",
"BATTERY_CHARGE_LOWALERT"],
"active_account": "DDDD",
"associated_vehicles": [{
"VIN": "VVVV",
"activation_code": "GGGG",
"user_id": "XXXX"
}],
"gdc_uid": "YYYY"
}
}
```
## Battery Status
Let's start with the battery. We need to use your `token` and `VIN` from above.
```
curl \
-H "Authorization: Bearer AAAA" \
"https://www.services.renault-ze.com/api/vehicle/VVVV/battery"
```
This gets us:
```
{
"charging": false,
"plugged": true,
"charge_level": 100,
"remaining_range": 124.0,
"last_update": 1476472742000,
"charging_point": "INVALID",
"remaining_time": 750
}
```
A few point to note. The `remaining_range` is in Kilometres. The `last_update` is a Unix timestamp. The `remaining_time` is in minutes.
The `charging_point` is available only when `plugged` is true.
The `remaining_time` is available only when `charging` is true.
## Preconditioning
The Zoe can be set to warm-up or cool down depending on the last temperate you set in the car. It will also blast the front window de-mister. The process takes five minutes, so you can set it shortly before you need to set off. Preconditioning will only work when the car's battery is above 45%.
### Precondition Now
```
curl \
-X POST \
-H 'Content-Type: application/json' \
-H "Authorization: Bearer AAAA" \
"https://www.services.renault-ze.com/api/vehicle/VVVV/air-conditioning"
```
This command does **not** return any value. There is also no way to cancel the command remotely - you have to physically enter the car and turn it off.
### Precondition Later
If you know that you want to leave at a specific time, you can set the car to precondition at a set time.
```
curl \
-H "Authorization: Bearer AAAA" \
-H 'Content-Type: application/json;charset=UTF-8' \
--data-binary '{"start":"1753"}' \
'https://www.services.renault-ze.com/api/vehicle/VVVV/air-conditioning/scheduler'
```
As far as I can tell, the `start` time is when you want the conditioning to start - not when you want it to be finished.
There is **no way** to cancel a precondition.
### Preconditioning Last Status
Want to see if the preconditioning message was received by the car correctly?
```
curl \
-H "Authorization: Bearer AAAA" \
"https://www.services.renault-ze.com/api/vehicle/VVVV/air-conditioning/last"
```
This returns information about who or what sent the request:
```
{
"date": 1476538293000,
"type": "USER_REQUEST",
"result": "SUCCESS"
}
```
### Preconditioning History
You can also see how often your car has been preconditioned.
```
curl \
-H "Authorization: Bearer AAAA" \
https://www.services.renault-ze.com/api/vehicle/VVVV/air-conditioning?begin=1016&end=1016
```
```
[{
"date": 1476165377000,
"type": "USER_REQUEST",
"result": "ERROR"
}, {
"date": 1476079325000,
"type": "CAR_NOTIFICATION",
"result": "ERROR"
}, {
"date": 1476079270000,
"type": "USER_REQUEST",
"result": "SUCCESS"
}, {
"date": 1476079266000,
"type": "CAR_NOTIFICATION",
"result": "SUCCESS"
}]
```
## Start Charging
You may have set your Zoe only to charge at specific times - perhaps to take advantage of cheap rate electricity. You can override this by issuing the charge command.
```
curl \
-X POST \
-H 'Content-Type: application/json' \
-H "Authorization: Bearer AAAA" \
https://www.services.renault-ze.com/api/vehicle/VVVV/charge
```
Again, this won't return a response. If your battery cannot be charged, you'll be notified via email or SMS depending on the preference you set up when you registered.
### Charging History
```
curl \
-H "Authorization: Bearer AAAA" \
https://www.services.renault-ze.com/api/vehicle/VVVV/charge/history?begin=1016&end=1016
```
The `begin` and `end` take `MMYY` as their arguments. That is, if you want October 2016 you need to use `1016`.
This returns an array, the most recent charging session at the top.
```
[{
"date": 1476538527000,
"type": "START_NOTIFICATION",
"charging_point": "SLOW",
"charge_level": 99,
"remaining_autonomy": 119
}, {
"date": 1476472727000,
"type": "END_NOTIFICATION",
"charging_point": "INVALID",
"charge_level": 100,
"remaining_autonomy": 124
}, {
"date": 1476462129000,
"type": "START_NOTIFICATION",
"charging_point": "ACCELERATED",
"charge_level": 34,
"remaining_autonomy": 42,
"remaining_time": 10500000
}]
```
The `remaining_autonomy` is, again, the range in **Km**. The `remaining time` is expressed in *milliseconds*. So `10500000` is the equivalent of 2 hours and 55 minutes.
## Notifications
You can use the website to set up notifications. For example, if there is a problem with your charge, Renault will send you an SMS. This API call lets you see what notifications you have set up.
### Set Notifications
```
curl \
-H "Authorization: Bearer AAAA" \
-X PUT \
-H 'Content-Type: application/json;charset=UTF-8' \
--data-binary '{"battery_status":"EMAIL","charge_start":"SMS","charge_end":"SMS","charge_problem":"SMS","low_battery":"SMS","low_battery_reminder":"SMS","do_not_disturb":null}' \
'https://www.services.renault-ze.com/api/vehicle/VVVV/settings/notification'
```
You can change any of the options with `EMAIL` or `SMS`.
You can set a "do not disturb" option. This will suppress all notifications during specific times. Sadly, this is a fairly blunt instrument - you can only set one time which then is enforced every day.
In the above example, change `"do_not_disturb":null` to
`"do_not_disturb":{"start":"1710","end":"1811"}}'`
This will give you peace between 5:10pm and 6:11pm.
### See Notifications
You can use the website to set up notifications. For example, if there is a problem with your charge, Renault will send you an SMS. This API call lets you see what notifications you have set up.
```
curl \
-H "Authorization: Bearer AAAA" \
https://www.services.renault-ze.com/api/vehicle/VVVV/settings/notification
```
This returns:
```
{
"battery_status": "EMAIL",
"charge_start": "NONE",
"charge_end": "SMS",
"charge_problem": "SMS",
"low_battery": "SMS",
"low_battery_reminder": "SMS",
"do_not_disturb": null
}
```
## Charging Times
The Zoe's charging calendar is, sadly, crap. You can say "charge between these times" but you can only have **one schedule per day**. So if you only want the car to charge between 0300-0700 and 1800-2200 on Mondays - you're out of luck.
It also seemed to force me to set a schedule for *every* day.
This is a multi-stage process.
### Create a schedule
In this example, I'm setting the charging to be active on Monday from 0100 for 1 hour and 15 minutes.
All other days start at different times, but last only for 15 minutes.
All `start` times **must** be at 00, 15, 30, 45 minutes. All `duration`s **must** be in increments of 15 minutes.
```
curl \
-H 'Authorization: Bearer AAAA' \
-X PUT \
--data-binary '{"optimized_charge":false,"mon":{"start":"0100","duration":"0115"},"tue":{"start":"0200","duration":"0015"},"wed":{"start":"0300","duration":"0015"},"thu":{"start":"1600","duration":"0015"},"fri":{"start":"1900","duration":"0015"},"sat":{"start":"1400","duration":"0015"},"sun":{"start":"1200","duration":"0015"}}' \
'https://www.services.renault-ze.com/api/vehicle/VVVV/charge/scheduler/offboard'
```
### View the schedule
Let's make sure the schedule has been sent correctly
```
curl \
-H 'Authorization: Bearer AAAA' \
'https://www.services.renault-ze.com/api/vehicle/VVVV/charge/scheduler/onboard'
```
Returned - hopefully! - is the schedule:
```
{
"enabled": false,
"schedule": {
"mon": {
"start": "0100",
"duration": "0115"
},
"tue": {
"start": "0200",
"duration": "0015"
},
"wed": {
"start": "0300",
"duration": "0015"
},
"thu": {
"start": "1600",
"duration": "0015"
},
"fri": {
"start": "1900",
"duration": "0015"
},
"sat": {
"start": "1400",
"duration": "0015"
},
"sun": {
"start": "1200",
"duration": "0015"
}
}
}
```
### Deploy the schedule
Be default, the schedule isn't activated. It needs to be "deployed" in order to send it to the car.
```
curl \
-H 'Authorization: Bearer AAAA' \
-X POST \
'https://www.services.renault-ze.com/api/vehicle/VVVV/charge/scheduler/offboard/deploy'
```
### Deactivate the schedule
If you deactivate the schedule then the car will charge whenever it is plugged in.
```
curl \
-H 'Authorization: Bearer AAAA' \
-X PUT \
--data-binary '{"enabled":false}' \
'https://www.services.renault-ze.com/api/vehicle/VVVV/charge/scheduler/onboard'
```
## Refreshing the authorization token after expiry
Refreshing a token can be done easily and without username or password. You need your expired token as well as the refresh_token that was issued at login.
```
curl \
-X POST \
-H 'Authorization: Bearer eyJAAA.eyJBBB.CCC' \
-d '{"token":"eyJAAA.eyJBBB.CCC","refresh_token":"DDDD"}' \
'https://www.services.renault-ze.com/api/user/token/refresh'
```
The answer is an updated token:
```
{"token":"eyJDDD.eyJEEE.FFF"}
```
Note that the refresh will work multiple times using the same refresh_token, so keep that one at hand.
### How do I know if my token expired?
The token itself contains this information. It is in JSON Web Token format, i.e. it consists of three parts, each separated by a period. The middle part (called the payload) is a base64-encoded JSON text which contains the following fields:
```
{
"sub": "myzelogin@example.com",
"jti": "1111222233334444aaaabbbbccccdddd",
"iat": 1527613751,
"exp": 1527649751
}
```
The `exp` field is the UNIX timestamp of the token expiry. The refreshed token will have the same `sub` and `jti` values.
## That's all folks?
There are a few other API calls - mostly around registering and removing vehicles, and updating personal details.
## What's Missing?
Sadly, the Renault API is quite poor compared to BMW's API. Here's what I'd *love* to see:
* Vehicle status - doors locked, headlights on.
* Efficiency - last journey, total.
* Mileage (although available in MY Renault API, so included in this script).
* Physical location.
## The End Result
https://twitter.com/edent_car/status/787387100396068864