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