EV Charger API Collection

Hi,
New here & although I don’t use HA I did spend some considerable time months back dissecting EV chargers you may all find useful (Couldn’t find anything on a search?)
All of these below are chargers I do not own (I have an Ohme & an Indra) so I’ve taken them as far as I can and it’s time for others to pick up the baton. It atleast gets you in to the APIs. Someone will need to run CharlesProxy or similar on the apps direct & toggle switching Chargers on & Off to get that level of detail to actually allow control & data feedback (some may already do this under “Sessions” or whatever but seeing as I don’t have the device to test i don’t know!)

Note: Calls Available in DETAILS Section of each one.
In each case, you will need to import the collection to your own Postman Account & change the collections variables to your own login details i.e:
click the collection heading > find the variables tab > change “initial values” > CLICK SAVE ICON!

Intelligent Octopus GraphQl API: Postman Collection

Details:
A reverse engineered Octopus API to give you planned charge times on Octopus Intelligent (so you can schedule either battery charges or battery pause if it occurs outside the normal time period)
1: Login to Kraken
2: Get User Details
Registered Devices (Car or Chargers)
Vehicle Charge Preferences
Planned Charge Sessions
Completed Charge Sessions.
*Note - You will need to run the first two calls (1 then 2) to allow Postman to fetch your details and populate variables correctly.
After that you will just need to run the login one (1) & then whatever call you need. Login token has a long expiry so don’t need to run it every time.
*Note 2: Kraken runs with GraphQL for queries - which is more efficient but less simple to guess queries to give extra info.

Indra/Kaluza/Charged EV
No need for any fancy tricks as it all runs in the browser.
Simply use Dev Tools (Ctrl + Shift + I) and watch the Fetch/XHR calls under the Network Tab.

EO: Postman Link
Details:
Login
User
List Device
Country Codes
Vehicle
Session
Session History
Update Charge Options

Note - Had to split the post up as new member limited to 2 links per post… scroll down

Hope all this lot helps people. Any others to add feel free to share below or let me know and I’ll try some others. Likewise I can explain how to run a proxy if needed to interrogate apps.

Hoggy

3 Likes

PodPoint: Postman Link
Details:
Login
Sessions
Get User Info
Favourites
Get User Details
Get All Vehicles
List Home Pod Units

SyncEV: Postman Collection
Details:
Login
General Status
Charge Points
Subscription Plans
Custom Menu Items
Invoice Details
Filters
Reservations
Device Status (Needs Device ID)
Billing Settings
Pins
Topup Status
Active Session
Session Stats
Session History
Balance History
RFIDs

2 Likes

Walbox: Postman Collection
Details:
Login
Assigned Chargers V3
Assigned Chargers V2
Charger Info
User Data
*Note Wallbox Login requires your to convert your username & password into Base64. This is easy to do & noted in the postman variables - you just need to be aware of it.

1 Like

does anyone know if there are any EV chargers that have local control? Seems so crazy to me that a device is on my network but i have to go through some cloud service to get the data off. Do any manufacturers of EV chargers have a local API?

1 Like

I think the Wallbox ones have local control.
All my work above was using their associated Apps / Cloud Portals I’m afraid.

1 Like

Hi, thanks for the step forward in EO. I know from problem solving with them that they also get the CT readings remotely sent to them so can anyone find out the values for this?

Also after I put them into postman how do I then get that data to Home Assistance, a basic questions but new to this today.

Ideally I would want the amps reading from the CTs in EO converted to KW but that might just be fairytale!

Sorry, as I don’t use Home Assistant so don’t check here often.
(I put these up as more of a kickstart for someone else to roll with - I don’t actually use Home Assistant at all!)
Postman just shows you that it works, you would have to code something specific (sensors or whatever they are called in Home Assistant?) to mimic what Postman is doing calling URLs/Endpoints.

Hi @hoggy thanks for doing the reversing of the APIs. I just found your post today. I’ve been investigating the EO charger, with an eye to making an energy usage sensor.

I’ve been looking at the /api/session/detail endpoint, as it’s the closest to giving real power draw values that I could see. It returns minute-by-minute information about the charge point in the time range you ask for.

I found that endpoint is returning some very odd looking units in the CT2 field - I can’t make them line up exactly with what the EO app is reporting - closest I got is to divide the total by 260,000 to convert to kWh, which makes the numbers match to within 1% or so… I was wondering if you know anything about that, perhaps there’s something similar in other APIs?

For example, one charge session was reported as having consumed 30.98kWh. The sum of the CT2 readings is 8,030,500 for that period, and dividing that by 260,000 gives 30.89 pseudo-kWh… It all feels a bit arbitrary. 260,000 is just some number I came at by looking at a few charging sessions and choosing a round number which roughly fitted.

I’ll have to say no I don’t know what’s going on with that. That seems a very odd number.
I guess you could assume it’s converting to Wh rather than kWh (so dividing by 260) but that still doesn’t explain where it comes from.
(Sadly as I had none of these chargers I got no further than general “access into the API” in this case)

I did it using Charles Proxy (iphone app) and watching what was coming & going from the app. Perhaps that may help shed some light on what it’s doing.

OK thanks for the quick reply! I’m not familiar with MITM, so I may just shrug and carry on with getting a basic integration together with the weird number for now - perhaps gathering info from more charge points from others here once there’s something written will give the needed info.

Hi everyone,
I’ve been lurking in the HA forums for a bit and have finally found something I can start giving back. I’ve got an EO charger and have spent the evening making an Android emulator talk to Charles proxy.
I’ve got 3 new API calls to add to @hoggy 's collection. They get the status, and enable and disable the charger (the pause / play button). I’ll try and work out how to make it permanently on later this week (i.e. disable schedule / solar charging so that the play button will instantly start charging).

I don’t have anywhere to host this, so I’m pasting the raw text to import into Postman below.
If it fails, I’ll post some more info in the next reply.

Murdoch

{
	"info": {
		"_postman_id": "79cc1537-011a-4412-a786-9d4a7bb83eb5",
		"name": "EO Mini (Blank)",
		"schema": "https://schema.getpostman.com/json/collection/v2.1.0/collection.json"
	},
	"item": [
		{
			"name": "Login To EO",
			"request": {
				"method": "POST",
				"header": [],
				"body": {
					"mode": "raw",
					"raw": "grant_type=password&username={{emailId}}&password={{passwordId}}",
					"options": {
						"raw": {
							"language": "text"
						}
					}
				},
				"url": {
					"raw": "https://eoappi.eocharging.com//Token",
					"protocol": "https",
					"host": [
						"eoappi",
						"eocharging",
						"com"
					],
					"path": [
						"",
						"Token"
					]
				}
			},
			"response": []
		},
		{
			"name": "User",
			"event": [
				{
					"listen": "prerequest",
					"script": {
						"type": "text/javascript",
						"exec": [
							"const tokenUrl = `https://eoappi.eocharging.com//Token`;\r",
							"\r",
							"const getTokenRequest = {\r",
							"  method: 'POST',\r",
							"  url: tokenUrl,\r",
							"   body: {\r",
							"        mode: 'raw',\r",
							"        raw: (`grant_type=password&username=${pm.collectionVariables.get(\"emailId\")}&password=${pm.collectionVariables.get(\"passwordId\")}`)\r",
							"    }\r",
							"};\r",
							"\r",
							"pm.sendRequest(getTokenRequest, (err, response) => {\r",
							"  const jsonResponse = response.json();\r",
							"  const newAccessToken = jsonResponse.access_token;\r",
							"\r",
							"  pm.variables.set('access_token', newAccessToken);\r",
							"});"
						]
					}
				}
			],
			"request": {
				"method": "GET",
				"header": [
					{
						"key": "Authorization",
						"value": "Bearer {{access_token}}"
					}
				],
				"url": {
					"raw": "https://eoappi.eocharging.com//api/user/",
					"protocol": "https",
					"host": [
						"eoappi",
						"eocharging",
						"com"
					],
					"path": [
						"",
						"api",
						"user",
						""
					]
				}
			},
			"response": []
		},
		{
			"name": "List Mini",
			"event": [
				{
					"listen": "prerequest",
					"script": {
						"type": "text/javascript",
						"exec": [
							"const tokenUrl = `https://eoappi.eocharging.com//Token`;\r",
							"\r",
							"const getTokenRequest = {\r",
							"  method: 'POST',\r",
							"  url: tokenUrl,\r",
							"   body: {\r",
							"        mode: 'raw',\r",
							"        raw: (`grant_type=password&username=${pm.collectionVariables.get(\"emailId\")}&password=${pm.collectionVariables.get(\"passwordId\")}`)\r",
							"    }\r",
							"};\r",
							"\r",
							"pm.sendRequest(getTokenRequest, (err, response) => {\r",
							"  const jsonResponse = response.json();\r",
							"  const newAccessToken = jsonResponse.access_token;\r",
							"\r",
							"  pm.variables.set('access_token', newAccessToken);\r",
							"});"
						]
					}
				}
			],
			"request": {
				"method": "GET",
				"header": [
					{
						"key": "Authorization",
						"value": "Bearer {{access_token}}"
					}
				],
				"url": {
					"raw": "https://eoappi.eocharging.com//api/mini/list",
					"protocol": "https",
					"host": [
						"eoappi",
						"eocharging",
						"com"
					],
					"path": [
						"",
						"api",
						"mini",
						"list"
					]
				}
			},
			"response": []
		},
		{
			"name": "Get charger status",
			"event": [
				{
					"listen": "prerequest",
					"script": {
						"exec": [
							"const tokenUrl = `https://eoappi.eocharging.com//Token`;\r",
							"\r",
							"const getTokenRequest = {\r",
							"  method: 'POST',\r",
							"  url: tokenUrl,\r",
							"   body: {\r",
							"        mode: 'raw',\r",
							"        raw: (`grant_type=password&username=${pm.collectionVariables.get(\"emailId\")}&password=${pm.collectionVariables.get(\"passwordId\")}`)\r",
							"    }\r",
							"};\r",
							"\r",
							"pm.sendRequest(getTokenRequest, (err, response) => {\r",
							"  const jsonResponse = response.json();\r",
							"  const newAccessToken = jsonResponse.access_token;\r",
							"\r",
							"  pm.variables.set('access_token', newAccessToken);\r",
							"});"
						],
						"type": "text/javascript"
					}
				}
			],
			"request": {
				"method": "GET",
				"header": [
					{
						"key": "Authorization",
						"value": "Bearer {{access_token}}"
					}
				],
				"url": {
					"raw": "https://eoappi.eocharging.com/api/mini/status?address={{chargerID}}",
					"protocol": "https",
					"host": [
						"eoappi",
						"eocharging",
						"com"
					],
					"path": [
						"",
						"api",
						"mini",
						"status"
					],
					"query": [
						{
							"key": "address",
							"value": "{{chargerID}}"
						}
					]
				}
			},
			"response": []
		},
		{
			"name": "Country Codes",
			"event": [
				{
					"listen": "prerequest",
					"script": {
						"type": "text/javascript",
						"exec": [
							"const tokenUrl = `https://eoappi.eocharging.com//Token`;\r",
							"\r",
							"const getTokenRequest = {\r",
							"  method: 'POST',\r",
							"  url: tokenUrl,\r",
							"   body: {\r",
							"        mode: 'raw',\r",
							"        raw: (`grant_type=password&username=${pm.collectionVariables.get(\"emailId\")}&password=${pm.collectionVariables.get(\"passwordId\")}`)\r",
							"    }\r",
							"};\r",
							"\r",
							"pm.sendRequest(getTokenRequest, (err, response) => {\r",
							"  const jsonResponse = response.json();\r",
							"  const newAccessToken = jsonResponse.access_token;\r",
							"\r",
							"  pm.variables.set('access_token', newAccessToken);\r",
							"});"
						]
					}
				}
			],
			"request": {
				"method": "GET",
				"header": [
					{
						"key": "Authorization",
						"value": "Bearer {{access_token}}"
					}
				],
				"url": {
					"raw": "https://eoappi.eocharging.com//api/data/countrycodes",
					"protocol": "https",
					"host": [
						"eoappi",
						"eocharging",
						"com"
					],
					"path": [
						"",
						"api",
						"data",
						"countrycodes"
					]
				}
			},
			"response": []
		},
		{
			"name": "Vehicle",
			"event": [
				{
					"listen": "prerequest",
					"script": {
						"type": "text/javascript",
						"exec": [
							"const tokenUrl = `https://eoappi.eocharging.com//Token`;\r",
							"\r",
							"const getTokenRequest = {\r",
							"  method: 'POST',\r",
							"  url: tokenUrl,\r",
							"   body: {\r",
							"        mode: 'raw',\r",
							"        raw: (`grant_type=password&username=${pm.collectionVariables.get(\"emailId\")}&password=${pm.collectionVariables.get(\"passwordId\")}`)\r",
							"    }\r",
							"};\r",
							"\r",
							"pm.sendRequest(getTokenRequest, (err, response) => {\r",
							"  const jsonResponse = response.json();\r",
							"  const newAccessToken = jsonResponse.access_token;\r",
							"\r",
							"  pm.variables.set('access_token', newAccessToken);\r",
							"});"
						]
					}
				}
			],
			"request": {
				"method": "GET",
				"header": [
					{
						"key": "Authorization",
						"value": "Bearer {{access_token}}"
					}
				],
				"url": {
					"raw": "https://eoappi.eocharging.com//api/vehicle/",
					"protocol": "https",
					"host": [
						"eoappi",
						"eocharging",
						"com"
					],
					"path": [
						"",
						"api",
						"vehicle",
						""
					]
				}
			},
			"response": []
		},
		{
			"name": "Session",
			"event": [
				{
					"listen": "prerequest",
					"script": {
						"type": "text/javascript",
						"exec": [
							"const tokenUrl = `https://eoappi.eocharging.com//Token`;\r",
							"\r",
							"const getTokenRequest = {\r",
							"  method: 'POST',\r",
							"  url: tokenUrl,\r",
							"   body: {\r",
							"        mode: 'raw',\r",
							"        raw: (`grant_type=password&username=${pm.collectionVariables.get(\"emailId\")}&password=${pm.collectionVariables.get(\"passwordId\")}`)\r",
							"    }\r",
							"};\r",
							"\r",
							"pm.sendRequest(getTokenRequest, (err, response) => {\r",
							"  const jsonResponse = response.json();\r",
							"  const newAccessToken = jsonResponse.access_token;\r",
							"\r",
							"  pm.variables.set('access_token', newAccessToken);\r",
							"});"
						]
					}
				}
			],
			"request": {
				"method": "GET",
				"header": [
					{
						"key": "Authorization",
						"value": "Bearer {{access_token}}"
					}
				],
				"url": {
					"raw": "https://eoappi.eocharging.com//api/session/",
					"protocol": "https",
					"host": [
						"eoappi",
						"eocharging",
						"com"
					],
					"path": [
						"",
						"api",
						"session",
						""
					]
				}
			},
			"response": []
		},
		{
			"name": "Session History",
			"event": [
				{
					"listen": "prerequest",
					"script": {
						"type": "text/javascript",
						"exec": [
							"const tokenUrl = `https://eoappi.eocharging.com//Token`;\r",
							"\r",
							"const getTokenRequest = {\r",
							"  method: 'POST',\r",
							"  url: tokenUrl,\r",
							"   body: {\r",
							"        mode: 'raw',\r",
							"        raw: (`grant_type=password&username=${pm.collectionVariables.get(\"emailId\")}&password=${pm.collectionVariables.get(\"passwordId\")}`)\r",
							"    }\r",
							"};\r",
							"\r",
							"pm.sendRequest(getTokenRequest, (err, response) => {\r",
							"  const jsonResponse = response.json();\r",
							"  const newAccessToken = jsonResponse.access_token;\r",
							"\r",
							"  pm.variables.set('access_token', newAccessToken);\r",
							"});"
						]
					}
				}
			],
			"request": {
				"method": "POST",
				"header": [
					{
						"key": "Authorization",
						"value": "Bearer {{access_token}}"
					}
				],
				"body": {
					"mode": "urlencoded",
					"urlencoded": [
						{
							"key": "id",
							"value": "0",
							"type": "text"
						},
						{
							"key": "startDate",
							"value": "1614159816",
							"description": "Enter Unix Epoch Timecodes!",
							"type": "text"
						},
						{
							"key": "endDate",
							"value": "1614159876",
							"description": "Enter Unix Epoch Timecodes!",
							"type": "text"
						}
					]
				},
				"url": {
					"raw": "https://eoappi.eocharging.com//api/session/detail",
					"protocol": "https",
					"host": [
						"eoappi",
						"eocharging",
						"com"
					],
					"path": [
						"",
						"api",
						"session",
						"detail"
					]
				}
			},
			"response": []
		},
		{
			"name": "Disable Charger",
			"event": [
				{
					"listen": "prerequest",
					"script": {
						"exec": [
							"const tokenUrl = `https://eoappi.eocharging.com//Token`;\r",
							"\r",
							"const getTokenRequest = {\r",
							"  method: 'POST',\r",
							"  url: tokenUrl,\r",
							"   body: {\r",
							"        mode: 'raw',\r",
							"        raw: (`grant_type=password&username=${pm.collectionVariables.get(\"emailId\")}&password=${pm.collectionVariables.get(\"passwordId\")}`)\r",
							"    }\r",
							"};\r",
							"\r",
							"pm.sendRequest(getTokenRequest, (err, response) => {\r",
							"  const jsonResponse = response.json();\r",
							"  const newAccessToken = jsonResponse.access_token;\r",
							"\r",
							"  pm.variables.set('access_token', newAccessToken);\r",
							"});"
						],
						"type": "text/javascript"
					}
				}
			],
			"request": {
				"method": "POST",
				"header": [
					{
						"key": "Authorization",
						"value": "Bearer {{access_token}}"
					},
					{
						"warning": "This is a duplicate header and will be overridden by the Content-Type header generated by Postman.",
						"key": "Content-Type",
						"value": "application/x-www-form-urlencoded",
						"type": "default"
					}
				],
				"body": {
					"mode": "urlencoded",
					"urlencoded": [
						{
							"key": "id",
							"value": "{{chargerID}}",
							"type": "text"
						}
					]
				},
				"url": {
					"raw": "https://eoappi.eocharging.com//api/mini/disable",
					"protocol": "https",
					"host": [
						"eoappi",
						"eocharging",
						"com"
					],
					"path": [
						"",
						"api",
						"mini",
						"disable"
					]
				}
			},
			"response": []
		},
		{
			"name": "Enable Charger",
			"event": [
				{
					"listen": "prerequest",
					"script": {
						"exec": [
							"const tokenUrl = `https://eoappi.eocharging.com//Token`;\r",
							"\r",
							"const getTokenRequest = {\r",
							"  method: 'POST',\r",
							"  url: tokenUrl,\r",
							"   body: {\r",
							"        mode: 'raw',\r",
							"        raw: (`grant_type=password&username=${pm.collectionVariables.get(\"emailId\")}&password=${pm.collectionVariables.get(\"passwordId\")}`)\r",
							"    }\r",
							"};\r",
							"\r",
							"pm.sendRequest(getTokenRequest, (err, response) => {\r",
							"  const jsonResponse = response.json();\r",
							"  const newAccessToken = jsonResponse.access_token;\r",
							"\r",
							"  pm.variables.set('access_token', newAccessToken);\r",
							"});"
						],
						"type": "text/javascript"
					}
				}
			],
			"request": {
				"method": "POST",
				"header": [
					{
						"key": "Authorization",
						"value": "Bearer {{access_token}}"
					},
					{
						"warning": "This is a duplicate header and will be overridden by the Content-Type header generated by Postman.",
						"key": "Content-Type",
						"value": "application/x-www-form-urlencoded",
						"type": "default"
					}
				],
				"body": {
					"mode": "urlencoded",
					"urlencoded": [
						{
							"key": "id",
							"value": "{{chargerID}}",
							"type": "text"
						}
					]
				},
				"url": {
					"raw": "https://eoappi.eocharging.com//api/mini/enable",
					"protocol": "https",
					"host": [
						"eoappi",
						"eocharging",
						"com"
					],
					"path": [
						"",
						"api",
						"mini",
						"enable"
					]
				}
			},
			"response": []
		},
		{
			"name": "Update Charge Options (WARNING MAY WIPE CURRENT SETTINGS IF RUN)",
			"event": [
				{
					"listen": "prerequest",
					"script": {
						"type": "text/javascript",
						"exec": [
							"const tokenUrl = `https://eoappi.eocharging.com//Token`;\r",
							"\r",
							"const getTokenRequest = {\r",
							"  method: 'POST',\r",
							"  url: tokenUrl,\r",
							"   body: {\r",
							"        mode: 'raw',\r",
							"        raw: (`grant_type=password&username=${pm.collectionVariables.get(\"emailId\")}&password=${pm.collectionVariables.get(\"passwordId\")}`)\r",
							"    }\r",
							"};\r",
							"\r",
							"pm.sendRequest(getTokenRequest, (err, response) => {\r",
							"  const jsonResponse = response.json();\r",
							"  const newAccessToken = jsonResponse.access_token;\r",
							"\r",
							"  pm.variables.set('access_token', newAccessToken);\r",
							"});"
						]
					}
				}
			],
			"request": {
				"method": "POST",
				"header": [
					{
						"key": "Authorization",
						"value": "Bearer {{access_token}}"
					}
				],
				"body": {
					"mode": "urlencoded",
					"urlencoded": [
						{
							"key": "cpid",
							"value": "0",
							"type": "text"
						},
						{
							"key": "scheduleWDay",
							"value": "TTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTT00",
							"type": "text"
						},
						{
							"key": "scheduleWEnd",
							"value": "TTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTT00",
							"type": "text"
						},
						{
							"key": "tariffWDay",
							"value": "11111111111111111111111111111111111111111111111100",
							"type": "text"
						},
						{
							"key": "tariffWEnd",
							"value": "11111111111111111111111111111111111111111111111100",
							"type": "text"
						},
						{
							"key": "appSchedWDay",
							"value": "DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD00",
							"type": "text"
						},
						{
							"key": "appSchedWEnd",
							"value": "DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD00",
							"type": "text"
						},
						{
							"key": "timeMode",
							"value": "0",
							"type": "text"
						},
						{
							"key": "solarMode",
							"value": "0",
							"type": "text"
						},
						{
							"key": "solarMin",
							"value": "6",
							"type": "text"
						},
						{
							"key": "opMode",
							"value": "0",
							"type": "text"
						},
						{
							"key": "pricePeak",
							"value": "0",
							"type": "text"
						},
						{
							"key": "priceOffPeak",
							"value": "0",
							"type": "text"
						},
						{
							"key": "tnid",
							"value": "5",
							"type": "text"
						},
						{
							"key": "tariffZone",
							"value": "N/A",
							"type": "text"
						}
					]
				},
				"url": {
					"raw": "https://eoappi.eocharging.com//api/user/updateChargeOpts",
					"protocol": "https",
					"host": [
						"eoappi",
						"eocharging",
						"com"
					],
					"path": [
						"",
						"api",
						"user",
						"updateChargeOpts"
					]
				}
			},
			"response": []
		}
	],
	"event": [
		{
			"listen": "prerequest",
			"script": {
				"type": "text/javascript",
				"exec": [
					""
				]
			}
		},
		{
			"listen": "test",
			"script": {
				"type": "text/javascript",
				"exec": [
					""
				]
			}
		}
	],
	"variable": [
		{
			"key": "emailId",
			"value": "enter your email address here"
		},
		{
			"key": "passwordId",
			"value": "enter your password here"
		},
		{
			"key": "chargerID",
			"value": "charger address here - you can get this by using the List Mini call",
			"type": "default"
		}
	]
}

Hi - I thought it’d be good to share the EO mini integration I wrote a couple of months ago - it’s very early days, but with the latest contribution it seems basically working. GitHub - twhittock/eo_mini: EO Mini integration for Home Assistant

The play / pause endpoints found by @Murdoch sound like a nice thing to add, too!

1 Like

@Murdoch do you know if it’s possible to get the current enabled status of the charger? The status endpoint just returns the following for me:

{
    "hubStatus": "200",
    "miniStatus": "200"
}

@tom_w - I found a Pypi library which has some basic control of the charger and I’ve since made my own version which adds functions for getting the status (off peak on|off, solar charging on|off, etc), and overwriting these with new options.
I have no idea how to make an integration in HA, so I’ll take a peek at yours and hopefully learn something :smile:

@tom_w To get the current enabled/disabled status, call List Mini in the Postman collection
https://eoappi.eocharging.com//api/mini/list

Great, thank you!

Hi, thank you for your hard work. I have managed to connect my charger and can plot the cumulative charge time and cumulative watts. For the life of me I can seem to get any calculation to get the instaneous wattage (i.e change in seconds divided by change in wattage). I don’t suppose you have a good way of calculating this or being able to pull that info directly into Home Assistant?

Do you mean you want the power usage in watts? I’m curious what that’s useful for. You’d be able to do it with a derivative helper I guess?

Sorry for delayed response! As in I’d like the exact kilowatts the charger is using per second as shown on the EO app. I can sign in and see the exact wattage being drawn at that second (generally 6.9kw) I’d like this data so I can build up my own consumption figures hourly or to the minutes if that makes sense? And have my line charts all on the same chart of wattage drawn by heaters, fridge, car etc. If you have an example way I can do this from the cumulative data you have already extracted that would be great!

I see. The energy dashboard, which shows that sort of information, relies on cumulative sensors. To work out the average watts drawn over a period of time, you simply take the values at the beginning and end of a period and then divide them by that period’s amount of time… The derivative helper should allow you to take cumulative data and see that. If not, it should be easy enough to get the historical data and do it manually in the python, though I don’t know how to access the history information off the top of my head.