Heatzy Pilote, vous connaissez ? Sorti il y a presque un an les modules Pilote de Heatzy (startup française, basé a Bordeaux), sont des modules wifi qui permettent de piloter vos radiateurs via le fils pilote.   Dans cet article, je vais vous expliquer comment les intégrer dans Domoticz.

Heatzy c’est quoi ?

Le matériel :

Un boitier raccorder au 230v et à votre radiateur électrique. À l’intérieur un composant hyper connus des maker DIY : une ESP 8266 (une sorte d’Arduino Wifi), en ouvrant le module on voit bien l’ESP et aussi son port de reprogrammation.  

L’application :

Ios / Android : personne n’est oublié, c’est par l’application que vous pourrez configurer votre Heatzy Pilote car ce module fonctionne via le cloud, on aime, on aime pas, le débat n’est pas la.

Par l’application :

  • Planning
  • Renommage
  • Création de groupe
  • Pilotage des modules parmi les 4 choix : Off/Confort/Eco-Reduit/Hors Gel
C’est limpide efficace, le packaging et le mode d’emploi également, un bon produit ne nécessite presque pas d’avoir à lire le mode d’emploi, il doit être intuitif, et c’est le cas avec Heatzy Pilote. Je vous propose de découvrir l’article de Domo-Blog si vous souhaitez en savoir plus :  https://www.domo-blog.fr/test-de-heatzy-pilotez-chauffage-electrique-nimporte/  revenez ici après !

Comment marche l’API ?

En avril 2017 Heatzy a mis en place une API permettant de pouvoir contrôler vos modules sans les applications mobiles : https://drive.google.com/drive/u/0/mobile/folders/0B9nVzuTl4YMOcEppWnFFUGZrM0k/0B9nVzuTl4YMOaXAzRnRhdXVma1k?usp=sharing&sort=13&direction=a Dans un premier temps il nous faut récupérer un token, une clef propre à chaqu’un qui est valable 7 jours. Grâce à ce token, on récupère les did : Device ID : un numéro propre à chacun de vos modules Heatzy Pilote, liés à votre compte. Avec ce did nous pouvons changer le mode de fonctionnement du module, et interroger son état sur les serveurs Heatzy.   Fort ces éléments, bien que n’ayant pas de chauffage électrique, j’ai tout de même souhaité vous proposer une façon de les contrôler depuis Domoticz.  

Dans Domoticz

Bien-sûr Domoticz propose des plugins en Python depuis cet été et la dernière stable, mais j’ai préféré vous proposer une méthode « plus facile » pour moi : 3 scripts LUA. Ils vont utiliser :
  • L’API Heatzy
  • Les événements LUA de Domoticz
  • Vous allez apprendre à aller chercher des informations dans les réponses au interrogation de l’API Heatzy dans du JSON
Dans le premier nous créons une variable utilisateur qui va interroger le serveur Heatzy tout les 5 jours afin d’avoir un token toujours à jour. Le second nous sert à piloter le module grâce à un Dummy Selector, avec le did qui sera écrit dans la case description de votre interrupteur sélecteur. Le troisième va interroger les serveurs Heatzy toutes les minutes pour connaître l’état du module si vous êtes amener a le changer via l’application la aussi, on va utiliser le did que l’on retrouve avec une ligne de commande Pour faire les choses proprement, on commence par crée un Dummy Hardware qui s’appel Heatzy :

Grace a ce hardware Nous allons créer : Un Selector Switch pour piloter le module Et mettre les différents mode de fonctionnement du modules Heatzy :
  • Off = qui est déjà en place
  • Confort
  • Eco
  • Hors Gel
Un simple ON/Off pour recuperer le token la premiere fois : Get Heatzy Token Ici je lui mets un délai d’extinction de 90 secondes, cela a pour effet de l’éteindre automatiquement et ainsi éviter que l’on demande un token toutes les minutes a Heatzy

Le Token :

Premier script, Le Token, Il va nous permettre de demander a Heatzy une clef afin de pouvoir parler au serveur Heatzy, il s’exécute tous les 5 jours, ou toutes les minutes si vous activé l’interrupteur Get Heatzy Token. Il vous faut crée une Variable utilisateur de type chaîne que l’on va appeler  : heatzytoken   Ensuite vous créeez un événement Lua de type TIME
json = (loadfile "/home/nico/domoticz/scripts/lua/JSON.lua")()  -- For Linux enlever les -- devant la ligne qui vous interesse et mettre -- devant la ligne a commenter
--   json = (loadfile "/home/pi/domoticz/scripts/lua/JSON.lua")()  -- For raspberry enlever les -- devant la ligne qui vous interesse et mettre -- devant la ligne a commenter
--   json = (loadfile "D:\\Domoticz\\scripts\\lua\\json.lua")()  -- For Windows enlever les -- devant la ligne qui vous interesse et mettre -- devant la ligne a commenter
--   json = (loadfile "/volume1/@appstore/domoticz/var/scripts/lua/json.lua")()  -- For Syno enlever les -- devant la ligne qui vous interesse et mettre -- devant la ligne a commenter


---variable a editer 
user = 'xxxxxxx' --adresse email pour s'enregistrer sur l'application conserver les ' '
password = 'xxxxxxxx'   -- mot de passe utiliser pour l'application conserver les ' '
heatzyvariable = 'heatzytoken' --Nom de la variable utilisateur de type chaine qui stock le token conserver les ' '
--fin des variables a editer

function ChkToken()
 local config=assert(io.popen('curl -X POST --header \'Content-Type: application/json\' --header \'Accept: application/json\' --header \'X-Gizwits-Application-Id:  c70a66ff039d41b4a220e198b0fcc8b3\' -d \'{ "username": "'..user..'", "password": "'..password..'", "lang": "en" }\' \'https://euapi.gizwits.com/app/login\''))
 local blocjson = config:read('*all')
 config:close()
 --print (blocjson)
 local jsonValeur = json:decode(blocjson)
 token = jsonValeur.token
-- print('****************')
-- print(token)
 commandArray['Variable:'..heatzyvariable..'']=''..token..''
end
 
commandArray = {}

time = os.date("*t")

-- rafraichissement du token tout les 5 jours
if ((((time.day-1) % 5)== 0) and (time.hour==00 and time.min ==1)) then ChkToken()
    
elseif otherdevices['Get Heatzy Token'] == 'On' then ChkToken()
    
    end
return commandArray
Il vous faut personnaliser quelques éléments :
  • Votre environnement : Linux, Pi, Syno, Windows, pour ce faire vous enlever les — devant la ligne qui vous convient et mettez des — devant la ligne qui ne vous convient pas
  • Votre User : L’adresse Email que vous avez utilisé pour vous inscrire a l’app Heatzy.
  • Votre Password : Le mot de passe que vous avez utilisé pour vous inscrire a l’app Heatzy.
Dans l’editeur d’événement de Domoticz, une ligne commenter (non active) apparaît de couleur verte (ici en orange), si vous enlevez les — devant les lignes ou il y a Print, vous voyez dans les logs de Domoticz tout ce que l’on reçoit

Le did :

C’est la parti un peu « compliqué de la démarche », chaque module a son propre did, il est nécessaire pour dire au serveur Heatzy que l’on veut piloter ce module et pas un autre, mais aussi que l’on retrouver son état. N’étant un fou en programmation et en script, je gère cette « variable » a la main sachant que le did est fixe un fois pour toutes tant que le module est associé a votre compte. En ligne de commande (avec une connection ssh sur votre serveur sous linux) vous allez coller cette ligne :  
curl -X GET --header 'Accept: application/json' --header 'X-Gizwits-User-token: votretoken' --header 'X-Gizwits-Application-Id: c70a66ff039d41b4a220e198b0fcc8b3' 'https://euapi.gizwits.com/app/bindings?limit=20&skip=0'
Ou vous remplacerez votretoken par la valeur qui s’est placer dans la variable utilisateur heatzytoken, le retour sera celui-ci :
{"did":"6oHvfZqaAasGG3wvW","updated_at":1505489750,"attr":{"mode":"\u505c\u6b62"}}
C’est la série entre les «  » de did qui nous intéresse, il s’agit du numéro unique de votre module a vous, rien qu’a vous, (dans votre fenêtre ssh vous pouvez le surligner (selection clique gauche), puis clique droit, ouvrer bloc note et clique droit coller, voila vous avez tout ce que vous avez surligné), nous en avons besoin pour les 2 Scripts suivants, conservez le précieusement, perso je le colle dans la description de l’interrupteur selector crée pour le module.

Le contrôle :

On a le Token, on a le did, nickel, je vous donne le script qui va bien ! c’est un événement LUA de type DEVICE
--script pilotant les modules fils pilote heatzy

--Variable a personnaliser
did = 'xxxxxxxxxx' -- entre les '  '' --que tu recuperes avec la commande : "curl -X GET --header 'Accept: application/json' --header 'X-Gizwits-User-token: quicetrouvedanstavariableutilisateurdomoticzheatzytoken' --header 'X-Gizwits-Application-Id: c70a66ff039d41b4a220e198b0fcc8b3' 'https://euapi.gizwits.com/app/bindings?limit=20&skip=0'
selectorheatzy = 'Heatzy Pilote' --ici le nom de ton selector entre les '  '
vartoken = 'heatzytoken' -- ici le nom de ta variable utilisateur de type chaîne que tu as créer pour recevoir le token entre les '  '

--Fin des variable a personnaliser


token = tostring(uservariables[vartoken])
Confort = '[1,1,0]'   
Eco = '[1,1,1]' 
Hors_Gel = '[1,1,2]'
Off = '[1,1,3]'


---
commandArray = {}
--Off
if devicechanged[selectorheatzy] == 'Off' then
    
    runcommand = "curl -X POST --header 'Content-Type: application/json' --header 'Accept: application/json' --header 'X-Gizwits-User-token: "..token.."' --header 'X-Gizwits-Application-Id: c70a66ff039d41b4a220e198b0fcc8b3' -d '{\"raw\": "..Off.."} ' 'https://euapi.gizwits.com/app/control/"..did.."'";
    os.execute(runcommand);
   --print(runcommand)
   
--Confort
elseif devicechanged[selectorheatzy] == 'Confort' then
    --print(..token..)
    runcommand = "curl -X POST --header 'Content-Type: application/json' --header 'Accept: application/json' --header 'X-Gizwits-User-token: "..token.."' --header 'X-Gizwits-Application-Id: c70a66ff039d41b4a220e198b0fcc8b3' -d '{\"raw\": "..Confort.."} ' 'https://euapi.gizwits.com/app/control/"..did.."'";
    os.execute(runcommand);
   --print(runcommand)

--Eco
elseif devicechanged[selectorheatzy] == 'Eco' then
    --print(..token..)
    runcommand = "curl -X POST --header 'Content-Type: application/json' --header 'Accept: application/json' --header 'X-Gizwits-User-token: "..token.."' --header 'X-Gizwits-Application-Id: c70a66ff039d41b4a220e198b0fcc8b3' -d '{\"raw\": "..Eco.."} ' 'https://euapi.gizwits.com/app/control/"..did.."'";
    os.execute(runcommand);
   --print(runcommand)

--Horsgel
elseif devicechanged[selectorheatzy] == 'Hors Gel' then
    --print(..token..)
    runcommand = "curl -X POST --header 'Content-Type: application/json' --header 'Accept: application/json' --header 'X-Gizwits-User-token: "..token.."' --header 'X-Gizwits-Application-Id: c70a66ff039d41b4a220e198b0fcc8b3' -d '{\"raw\": "..Hors_Gel.."} ' 'https://euapi.gizwits.com/app/control/"..did.."'";
    os.execute(runcommand);
   --print(runcommand)
   
end
return commandArray

Ici, encore 3 variables a personnaliser :
  • did = la série de caractère que l’on vient de retrouver
  • selectorheatzy = le nom de interrupteur Selectror destiner a
  • vartoken = le nom de la variable utilisateur qui contient le token mis a jour automatiquement
Vous pouvez commencer a jouer avec vos modules, l’api est hyper rapide, un clique et hop la led change d’état, l’application aussi c’est merveilleux de rapidité.

Le retour d’état :

Oui mais si je change l’état du module depuis l’application ? J’y ai penser, et je vous propose un script Time, qui s’exécute toutes les minutes et va demander a Heatzy dans quel mode est votre module :
json = (loadfile "/home/nico/domoticz/scripts/lua/JSON.lua")()  -- For Linux enlever les -- devant la ligne qui vous interesse et mettre -- devant la ligne a commenter
--   json = (loadfile "/home/pi/domoticz/scripts/lua/JSON.lua")()  -- For raspberry enlever les -- devant la ligne qui vous interesse et mettre -- devant la ligne a commenter
--   json = (loadfile "D:\\Domoticz\\scripts\\lua\\json.lua")()  -- For Windows enlever les -- devant la ligne qui vous interesse et mettre -- devant la ligne a commenter
--   json = (loadfile "/volume1/@appstore/domoticz/var/scripts/lua/json.lua")()  -- For Syno enlever les -- devant la ligne qui vous interesse et mettre -- devant la ligne a commenter

 --variable a configurer
did = '6oHvfZqaAaswvP7n' --did que l'on a trouver avec la ligne de commande un peu chiante on garde les ''
selectorheatzy = 'Heatzy Pilote' --nom de votre inter selecteur qui pilote le heatzy on garde les ''
 --fin des variable a configurere
 
 
 --ligne de commande qui interoge les serveur heatzy pour le retour d'etat
 local config=assert(io.popen('curl -X GET --header \'Accept: application/json\' --header \'X-Gizwits-Application-Id: c70a66ff039d41b4a220e198b0fcc8b3\' \'https://euapi.gizwits.com/app/devdata/'..did..'/latest\''))

 --parsing du json
 local blocjson = config:read('*all')
 config:close()
 --print (blocjson)
 local jsonValeur = json:decode(blocjson)
 mode = jsonValeur.attr.mode
 --print('****************')
 --print(mode)


  
 
commandArray = {}
--print('****************')
if mode == '停止' and otherdevices[selectorheatzy]~='Off' then   --stop en chinois
    --print("mode = stop")
    commandArray[selectorheatzy]='Set Level: 0'
    
elseif mode =='舒适' and otherdevices[selectorheatzy]~='Confort' then --confortable en chinois
    commandArray[selectorheatzy]='Set Level: 10'
    --print("mode = confortable")
    
elseif mode =='经济' and otherdevices[selectorheatzy]~='Eco' then --eco en chinois
    commandArray[selectorheatzy]='Set Level: 20'
    --print("mode = eco")
    
elseif mode =='解冻' and otherdevices[selectorheatzy]~='Hors Gel' then --decongelation en chinois
    commandArray[selectorheatzy]='Set Level: 30'
    --print("mode = horsgel")
    
    
  end
return commandArray
Ici encore des variables a personnaliser :
  • le did
  • le nom de l’interrupteur selector qui pilote le module
Vous remarquez les caractères a consonance asiatique, c’est du chinois, l’api donne l’état des modules dans cette langue, j’adore le décongelation.

À l’usage :

Rapide, efficace, chaque Module peut avoir son planning dans Domoticz, faire parti d’un groupe et être piloté via les événements ou scènes, et aussi avec l’application Domoticz Officiel (Ios et Android). Bien sur vous pourrez mettre des notifications si cela vous fait plaisir, et même les piloter avec la Google Home : « Ok Google, Mets le salon en mode Eco ». Le temps de réaction entre Domoticz et le module est de moins de 3 secondes. Le retour de changement d’état depuis l’application demande 1 minute, largement acceptable. Vraiment bien ce module Heatzy, dommage qu’il n’y ai pas d’API local, l’ESP qui est a l’intérieur a largement assez de mémoire pour permettre de mettre un petit serveur afin de le faire.

Les concurrents :

Heatzy Pilote, n’est pas le seul module a pouvoir piloter des radiateurs électriques grâce au fils pilotes, il existe des modules Zwave (Qubino), des bricolages en 433 mhz (n’utilisant que 2 ordres) seulement ils sont obligatoirement liés a une box, pas d’application mobile dédiée. Pour les gros bricoleurs il y a moyen de ce s’en faire maison en suivant ce tuto : http://blog.zener.free.fr/index.php?post/2017/02/08/Fil-pilote-sur-le-Wemos, en oubliant la partie Jeedom et avec un dummy selector dans Domoticz le résultat est le même. Enfin news toute chaude, le projet est parue en meme temps que l’article, un projet Kickstarter propose presque la meme chose mais sur 4 zones de chauffage et en local uniquement : https://www.kickstarter.com/projects/567868147/domo-fils-pilote-wifi, espéreront que j’ai un échantillon pour vous en parler plus en profondeur.    

Et les autres chauffages ?

Heatzy ne s’arrête pas la, fort de son module pour fils pilote, Heatzy nous prépare un thermostat d’ambiance pour les tous les appareils de chauffage réagissant a un contact sec (Chaudière, Pac, Poêle a bois etc), le Flam, comptez sur moi pour vous en parler ! Un grand merci a Heatzy, pour les demarches de pret de materiel, de mise a dispo de modules dans leurs labos, je continu les demarches pour en faire un plugin Python…l’apprentissage est long.

Laisser un commentaire