

Sommaire
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
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
- Off = qui est déjà en place
- Confort
- Eco
- Hors Gel
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 : heatzytokenjson = (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 commandArrayIl 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.
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 commandArrayIci, 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
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 commandArrayIci encore des variables a personnaliser :
- le did
- le nom de l’interrupteur selector qui pilote le module