Aller au contenu
frixo

HC2 - IO HomeControl - Chauffe-eau Thermor 270L Thermodynamique

Recommended Posts

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

0.png

1.png

2.png

3.png

4.png

5.png

6.png

7.png

  • Like 1

Partager ce message


Lien à poster
Partager sur d’autres sites

Cool, merci bien.....il ne me reste plus qu'à changer mon vieux chauffe eau.

J'ai signé la pétition :60:

Partager ce message


Lien à poster
Partager sur d’autres sites

Finalement vaut plutot mettre

local douche_r=math.floor(tonumber(state_eau_restante['value']) / 40)

Partager ce message


Lien à poster
Partager sur d’autres sites

Pour le boost j'y arrive pas

 

il faut appeler en post 

 

 

https://ha110-1.overkiz.com/enduser-mobile-web/externalAPI/json/../../enduserAPI/exec/apply

 

avec en header le JESSION ID bien sur

 

et en body

{
    "actions": [
    {"deviceURL": "iURL DE TON DEVICE" ,
    "commands": [{ "name": "setCurrentOperatingMode",
    "parameters":[xxxxxxxxxxxx]}]}]}
}

 

 

Je sais pas quoi mettre a la place des x

 

j'ai tenté d'appeler direct la méthode : setDurationBoost , et mettre 1 pour 1j de boost , mais ca semble pas suffire, il faut d'abord basculer le chauffe eau en mode boost, 

il veut un objet JSON, mais je trouve pas le quel

 

je peche la dessus 
 

Partager ce message


Lien à poster
Partager sur d’autres sites

×