Posts: 236
Threads: 65
Joined: May 2018
Reputation:
4
Hello, any ideas on how to integrate this?
https://api.easee.cloud/index.html
I've found a Python script on github, is it possible to convert this in any way?
https://github.com/fondberg/pyeasee
Regards..
Posts: 8211
Threads: 43
Joined: Jun 2015
Reputation:
473
This is a similar API: https://forum.logicmachine.net/showthread.php?tid=1786
There's a difference in login procedure (GetToken function). You need to set the 'content-type' header to 'application/json' and send username/password as json string:
Code: request_body= json.encode({
userName = 'aaa',
password = 'bbb',
})
Posts: 236
Threads: 65
Joined: May 2018
Reputation:
4
Thanks, it works.
What would be the best way if i wanted the connection to the API to stay active, and then run seperate scripts for various commands?
It's not best practise to request new tokens for every command.
Posts: 8211
Threads: 43
Joined: Jun 2015
Reputation:
473
Create a scheduled script that will call GetToken() periodically and save the token into storage. All other scripts will use this token to make requests.
Check the expiresIn field that /api/accounts/token returns. It will tell for how many seconds the token is valid. Adjust scheduled script execution period accordingly.
Posts: 6
Threads: 1
Joined: Dec 2020
Reputation:
0
(15.04.2021, 19:56)tomnord Wrote: Thanks, it works.
What would be the best way if i wanted the connection to the API to stay active, and then run seperate scripts for various commands?
It's not best practise to request new tokens for every command.
Did you get your script to work?
Are you willing to share your script and the commands for the Easee charger?
Posts: 133
Threads: 28
Joined: May 2016
Reputation:
3
that would be very nice and would save me a lot of time :-)
Posts: 236
Threads: 65
Joined: May 2018
Reputation:
4
Works like a charm. I'll post when I have access to my LM again.
Posts: 6
Threads: 1
Joined: Dec 2020
Reputation:
0
(28.01.2022, 16:28)tomnord Wrote: Works like a charm. I'll post when I have access to my LM again.
Hi soo exaited about this!
Will you post it? Or sent it on PM?
Thanks
Posts: 236
Threads: 65
Joined: May 2018
Reputation:
4
07.10.2022, 16:51
(This post was last modified: 07.10.2022, 16:52 by tomnord.)
Code: -- Load modules
require('json')
require('ssl.https')
require('ltn12')
-- Set credentials for Easee API
ChargerID = storage.get('EaseeAPI_ChargerID')
API_Token = storage.get('EaseeAPI_Token') --reads API Token from storage, The token is fetched from scheduled script: "Easee_Authenticate"
--log(ChargerID)
function RequestFromEasee(request)
request_url = 'https://api.easee.cloud/api/' .. request
local response_body = {}
local request_body = ""
local body, code, hdrs, stat = ssl.https.request{
url = request_url;
method = "GET";
headers =
{
["Content-Type"] = "application/json";
["Authorization"] = "Bearer " .. API_Token;
};
source = ltn12.source.string(request_body);
sink = ltn12.sink.table(response_body);
}
log(code)
if code == 200 then
ret = table.concat(response_body)
ret = json.pdecode(ret)
return ret
else
--API_Token = GetToken() -- request a new token
end
end
-- Get products, run once to get charger ID
if ChargerID == nil then
chargers = RequestFromEasee('chargers')
Easee_ChargerID = chargers[1]["id"]
--log(Easee_ChargerID, 'ID') -- Check here for your charger ID
storage.set('EaseeAPI_ChargerID', Easee_ChargerID)
end
ChargerState = RequestFromEasee('chargers/' .. ChargerID .. '/state')
log(ChargerState)
currentChargePower = ChargerState["totalPower"]
currentCableRating = ChargerState["cableRating"]
currentMaxPower = ChargerState["outputCurrent"]
chargerOnline = ChargerState["isOnline"]
currentChargeEnergy = ChargerState["sessionEnergy"]
log(currentChargePower, currentCableRating, currentMaxPower, chargerOnline, currentChargeEnergy)
function WriteToEasee(request, request_body)
request_url = 'https://api.easee.cloud/api/' .. request
local response_body = {}
local content_length
if type(request_body) == "string" then
content_length = #request_body
else
request_body = ""
end
local body, code, hdrs, stat = ssl.https.request{
url = request_url;
method = "POST";
headers =
{
["Content-Type"] = "application/json";
["Authorization"] = "Bearer " .. API_Token;
["Content-Length"] = content_length;
};
source = ltn12.source.string(request_body);
sink = ltn12.sink.table(response_body);
}
log(code)
if code == 200 then
ret = table.concat(response_body)
ret = json.pdecode(ret)
return ret
else
API_Token = GetToken() -- request a new token
end
end
Code: require('json')
require('ssl.https')
require('ltn12')
-- Set credentials for Easee API
email ='****************'
password ='*************'
function GetToken()
request_token_url = 'https://api.easee.cloud/api/accounts/login'
local response_body = {}
local request_body = json.encode({
userName = email,
password = password,
})
local body, code, hdrs, stat = ssl.https.request{
url = request_token_url;
method = "POST";
headers =
{
["Content-Type"] = "application/json";
["Content-Length"] = #request_body;
};
source = ltn12.source.string(request_body);
sink = ltn12.sink.table(response_body);
}
log(code)
if code == 200 then
ret = table.concat(response_body)
ret = json.pdecode(ret)
log(ret)
return ret.accessToken
end
end
-- Request token
if not API_Token then
API_Token = GetToken()
log(API_Token, 'api_token')
end
--Store API Token to memory
storage.set('EaseeAPI_Token', API_Token)
Posts: 21
Threads: 7
Joined: Aug 2021
Reputation:
0
29.06.2025, 19:38
(This post was last modified: 29.06.2025, 19:39 by johan84.)
Here is a script I use at a client's company to visualize the current charging power at each charging point in their company parking lot. Thank you tomnord for the earlier scrips
Code: -- Load required libraries once
require('json')
require('ssl.https')
require('ltn12')
-- Your configuration
local API_Token = storage.get('EaseeAPI_Token')
-- Define all 8 charging stations with placeholder names, IDs and KNX group addresses
local chargingStations = {
{ name = 'charger 1', id = 'charger 1 id', ga = '55/1/1' },
{ name = 'charger 2', id = 'charger 2 id', ga = '55/1/2' },
{ name = 'charger 3', id = 'charger 3 id', ga = '55/1/3' },
{ name = 'charger 4', id = 'charger 4 id', ga = '55/1/4' },
{ name = 'charger 5', id = 'charger 5 id', ga = '55/1/5' },
{ name = 'charger 6', id = 'charger 6 id', ga = '55/1/6' },
{ name = 'charger 7', id = 'charger 7 id', ga = '55/1/7' },
{ name = 'charger 8', id = 'charger 8 id', ga = '55/1/8' },
}
-- Function for making a GET request to the Easee API
local function RequestFromEasee(endpoint)
local url = 'https://api.easee.cloud/api/' .. endpoint
local response = {}
local _, code = ssl.https.request{
url = url,
method = "GET",
headers = {
["Content-Type"] = "application/json",
["Authorization"] = "Bearer " .. API_Token,
},
sink = ltn12.sink.table(response),
}
if code == 200 then
return json.pdecode(table.concat(response))
else
log('Easee API error (' .. endpoint .. '): ' .. tostring(code))
return nil
end
end
-- Parameters for power calculation
local voltage = 230 -- V per phase
local phases = 3 -- three-phase
local cosFi = 0.95 -- power factor, adjust if needed
-- Loop over all charging stations
for _, station in ipairs(chargingStations) do
-- Fetch status
local state = RequestFromEasee('chargers/' .. station.id .. '/state')
if state then
-- Try to use totalPower directly
local power = state.totalPower
if not power or power == 0 then
-- Fallback: calculate using I × U × √3 × cosφ
local current = state.outputCurrent or 0
power = (current * voltage * phases * cosFi) / 1000 -- in kW
end
-- Send power (kW) to the configured KNX group address
grp.write(station.ga, power)
else
log('Could not retrieve status for ' .. station.name .. ' (' .. station.id .. ')')
end
end
|