Bonjour à tous,
Petit post pour aider ceux qui sont dans le même cas que moi ! J'ai un chauffe eau tout neuf Thermor 270L thermodynamique. Bref c'est cool, mais il est pas compatible HC2, mais ... il peut se connecter en IO Home Control (techno proprio de Somfy entre autre)
Bref, j'ai pas acheté une Tahoma car trop cher, mais un bridge CozyTouch , sur EBay , pour 56€ 'fdp inclus !)
grace a ce bridge, je peux installer une app sur mon Teléphone (Thermor cozytouch), et piloter mon chauffe eau. Outre le fait que l'appli a été codé avec les pieds, et dès fois qu'elle répond pas ou affiche des données incohérentes, cela est quand même pratique.
mais surtout, je peut utiliser les API 'privé' du bridget CozyTouch pour appeler moi-même les API Rest. Ahh , la ca devient plus interessant !
2 URL a connaitre
- https://ha110-1.overkiz.com/enduser-mobile-web/externalAPI/json/login
A appeler en POST, avec 2 parametre dans le body en urlEncoded : userId=TONUSER&userPassword=TONPASSWORD
Il faut récupérer le Set-Cookie de la réponse (qui contient le JSESSIONID)
- https://ha110-1.overkiz.com/enduser-mobile-web/externalAPI/json/getSetup
A Appeler en GET (ou POST), avec dans le Header : Cookie : les cookies récupéré dans l'appel du login (avec le jessionid)
Dans le retour , on a TOUT !!!!
Et bien, avec tout cela, j'ai fait un petit VD dans la HC2, qui m'affiche le nombre de douche restante ( Nbr de L eau chaude restant divisé par 30L) , le mode, si le boost est actif, si le mode abs est actif , le mode (auto, manu, eco)
Vu qu'un VD ne peut pas faire d'appel en POST, j'ai du passer par une scene (id 34 , il faut changer l'id de la scene apperl dans le VD offcourse) qui fait le taf (en asyncrhone de 1s) et stock le résultat dans des vars global que lit le VD
PS : Le VD affiche en icone un chiffre , qui est une image , le 7 étant l'image 1010 chez moi, et le 0 la 1017
PS : il faut créer les var gloable:
- mode_chauffe_eau
- douche_restante
- chauffe_eau_boostD
- chauffe_eau_boost
- chauffe_eau_abs_D
prochaine étape : pouvoir activer le mode boost...
La scene
--[[
%% properties
%% events
%% globals
--]]
local user = "xxxxxxxxxxxx"
local pass = "xxxxxxxxxxxxxx"
local url = "https://ha110-1.overkiz.com/enduser-mobile-web/externalAPI/json/";
local url_login = "login"
local url_data = "getSetup"
local body = "userId=" .. urlencode(user) .. "&userPassword=" .. urlencode(pass)
--print(urlencode(body))
local JSESSION_ID=""
local data = nil
fibaro:debug(body)
function urlencode(s)
if (s) then
s = string.gsub (s, "\n", "\r\n")
s = string.gsub (s, "([^%w ])",
function (c) return string.format ("%%%02X", string.byte(c)) end)
s = string.gsub (s, " ", "+")
end
return s
end
function connect()
print("> Connect ...")
local httpClient = net.HTTPClient()
httpClient:request(url .. url_login , {
success = function(response)
if (tonumber(response.status) == 200 or tonumber(response.status) == 201 or tonumber(response.status) == 202) then
print(" > Connexion OK")
JSESSION_ID=response.headers['Set-Cookie']
print(" > JSSESSION ID : " .. response.headers['Set-Cookie'])
get_data()
else
print(" > Connexion KO !")
fibaro:debug('Error' .. response.status)
print("Error " .. response.data)
end
end,
error = function(err)
print(' > error = ' .. err)
end,
options = {
method = 'POST',
headers = {
["content-type"] = 'application/x-www-form-urlencoded',
},
data = body
}
});
end
function get_data()
print("> Get data...")
local httpClient = net.HTTPClient()
httpClient:request(url .. url_data , {
success = function(response)
if (tonumber(response.status) == 200 or tonumber(response.status) == 201 or tonumber(response.status) == 202) then
print(" > Get data OK")
data= json.decode(response.data)
--print("Data " .. response.data)
read_data()
else
print(" > Get data KO")
fibaro:debug('Error' .. response.status)
print(" > Error " .. response.data)
end
end,
error = function(err)
print('error = ' .. err)
end,
options = {
method = 'POST',
headers = {
["content-type"] = 'application/x-www-form-urlencoded',
["Cookie"] = JSESSION_ID,
},
data = nil
}
});
end
function read_data()
local devices=data['setup']['devices']
for i,v in ipairs(devices) do
local one_device=devices[i]
if(one_device['controllableName'] == 'io:AtlanticDomesticHotWaterProductionIOComponent') then
read_data_chauffe_eau(one_device)
end
end
end
function read_data_chauffe_eau(device)
--core:WaterConsumptionState
local state_eau_restante = get_state_by_name(device['states'],'core:WaterConsumptionState')
print('L d\'eau restante : ' .. state_eau_restante['value'])
local douche_r=math.floor(tonumber(state_eau_restante['value']) / 30)
print('douche restante : ' .. douche_r)
fibaro:setGlobal('douche_restante',douche_r)
local state_mode = get_state_by_name(device['states'],'io:DHWModeState')
local mode = 'null'
if(state_mode['value'] == 'autoMode') then mode='Auto' end
if(state_mode['value'] == 'manualEcoInactive') then mode='Manuel' end
if(state_mode['value'] == 'manualEcoActive') then mode='Manuel [Eco]' end
fibaro:setGlobal('mode_chauffe_eau',mode)
print('mode : ' .. mode)
local chauffe_eau_boost = get_state_by_name(device['states'],'core:BoostModeDurationState')
local mode_boost = 'OFF'
if(chauffe_eau_boost['value'] ~= 0) then mode_boost = 'ON' end
fibaro:setGlobal('chauffe_eau_boost',mode_boost)
print('BOOST : ' .. mode_boost )
print('BOOST durée : ' .. chauffe_eau_boost['value'])
fibaro:setGlobal('chauffe_eau_boostD',chauffe_eau_boost['value'])
--chauffe_eau_abs_D
local chauffe_eau_abs = get_state_by_name(device['states'],'io:AwayModeDurationState')
print('Absence durée : ' .. chauffe_eau_abs['value'])
fibaro:setGlobal('chauffe_eau_abs_D',chauffe_eau_abs['value'])
end
function get_state_by_name(l_states,name)
for i,v in ipairs(l_states) do
local one_s=l_states[i]
if(one_s['name'] == name) then
return one_s
end
end
end
connect();
Chauffe-Eau.vfib