Gérer ses radiateurs électriques avec Home Assistant + TIKO - Vos Projets - Home Assistant Communauté Francophone
Bonjour à tous, Je voudrai partager avec vous un retour d’expérience avec le service TIKO (récemment racheté par ENEDIS), qui permet de gérer ses vieux radiateurs à distance, et que j’utilise depuis maintenant 1 mois. T…
Gérer ses radiateurs électriques avec Home Assistant + TIKO - Vos Projets - Home Assistant Communauté Francophone Gérer ses radiateurs électriques avec Home Assistant + TIKO Do It Yourself Vos Projets tutoriel noiwid Janvier 16, 2023, 11:40 1 Bonjour à tous, Je voudrai partager avec vous un retour d’expérience avec le service TIKO (récemment racheté par ENEDIS), qui permet de gérer ses vieux radiateurs à distance, et que j’utilise depuis maintenant 1 mois. Tiko propose à ceux qui ont au moins 3 radiateurs électriques chez eux de venir installer un dispositif permettant de gérer ses radiateurs à distance. Ils facturent l’installation 9€, et le service est sans abonnement et sans engagement. Voir les détails de l’offre sur leur site : https://tiko.fr/ A ce prix, l’état prend en charge une bonne partie des frais. L’intérêt est probablement de pouvoir délester des radiateurs connectés, afin d’avoir un maillon plus faible et précis qu’un quartier complet en cas de surcharge de consommation qui conduirait à devoir effectivement réaliser des coupures à grande échelle. Le dispositif en question est composé d’un hub à brancher en RJ45 à sa box (ou à un hub), d’un module de pilotage branché à chaque radiateur, et d’un capteur de température/humidité par pièce. Les modules de pilotage des radiateurs communiquent avec le hub par CPL (courant porteur). En complément, une APP est fournie pour permettre la gestion à distance de ses radiateurs : Gestion de la température par pièce Activation de modes HORS-GEL / ABSENT/ BOOST / OFF Gestion de programmation horaires ↔ températures cibles par pièces J’ai fait installer cette solution à mon bureau, et franchement c’est vraiment super pratique. La première question que je me suis posée une fois le dispositif opérationnel c’est comment connecter ce truc à Home Assistant. Ne trouvant pas d’API ou docs de leur côté, j’ai remonté le fil en partant de leur APP, et me suis rendu compte qu’un API existait, et était utilisable. J’ai dev une page PHP qui fait office de gateway avec leur API, et permet de récupérer les infos des radiateurs + gérer les différentes fonctions de l’APP (hors programmation horaires des pièces franchement bien intégrée dans leur APP). Cette page aide également à générer le YAML nécessaire à l’intégration des fonctionnalités/sensors dans Home Assistant. Je n’ai pas vraiment envie d’hébergera cette solution, mais suis prêt à la mettre à dispo de qui souhaite s’en servir… Ce qui implique en l’état de pouvoir héberger quelque part la page PHP qui fait office de gateway vers leur API. Je ne maitrise pas du tout Python, et ne saurai pas par ou commencer pour en faire une intégration, mais si quelqu’un est tenté pour s’y atteler, je serai ravi de l’assister dans cette tâche… Ci-dessous, un exemple de l’intégration sur Lovelace : tiko499×1336 45.9 KB paulchartres Février 6, 2023, 6:37 2 Bonjour noiwid, Je serais très intéressé par la création d’une intégration avec un serveur NodeJS, afin de pouvoir ensuite contrôler mes radiateurs via HomeKit/HomeBridge. Serait-il possible d’accéder à ce que tu as pu réaliser afin de voir comment se présente l’API ? J’ai moi même beaucoup cherché comment celle-ci fonctionne et suis content de voir qu’elle existe bel et bien Merci pour ton travail ! noiwid Février 13, 2023, 4:06 3 Hello, Alors, pour commencer, il faut t’identifier auprès de leur API. Ce que j’ai fait en PHP, c’est une petite fonction, qui se charge des appels vers leur API. Je me sert de cette fonction pour m’identifier, récupérer des infos de leur API ou modifier les réglages des radiateurs. Voilà à quoi ressemble la fonction : function f_tiko($json, $token=false, $account_id=false){ if(!$account_id) { $url = "https://particuliers-tiko.fr/api/v3/graphql/"; $method = "POST"; } else { $url = "https://particuliers-tiko.fr/api/v3/properties/".$account_id."/consumption_summary/"; $method = "GET"; } $headers = array( 'Content-Type:application/json', // 'User-agent:Mozilla/5.0 (Linux; Android 13; Pixel 4a Build/T1B3.221003.003; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/106.0.5249.126 Mobile Safari/537.36' // needed with tiko.ch api endpoint ); if($token) $headers[] = 'Authorization: token '.$token; $chObj = curl_init(); curl_setopt($chObj, CURLOPT_SSL_VERIFYPEER, FALSE); // needed localy with wamp curl_setopt($chObj, CURLOPT_URL, $url); curl_setopt($chObj, CURLOPT_FRESH_CONNECT, TRUE); curl_setopt($chObj, CURLOPT_RETURNTRANSFER, true); curl_setopt($chObj, CURLOPT_CUSTOMREQUEST, $method); curl_setopt($chObj, CURLOPT_POSTFIELDS, $json); curl_setopt($chObj, CURLOPT_HTTPHEADER, $headers); $json = curl_exec($chObj); curl_close($chObj); return json_decode($json,true); } Le premier paramètre $json permet de passer les paramètres souhaités à l’API de TIKO Le paramètre $token, optionnel est à passer une fois identifié, il est récupéré lors du login Le paramètre $account_id, optionnel est également à passer pour certaines commandes, il est récupéré lors du login. Voici comment je m’identifie ensuite : // login params, email/password are same as thoose used for the Mobile App. $json = '{ "variables":{ "email":"'.$email.'", "password":"'.$password.'", "langCode": "fr", "retainSession": true }, "query":"mutation LogIn($email: String!, $password: String!, $langCode: String, $retainSession: Boolean) {\n logIn(\n input: {email: $email, password: $password, langCode: $langCode, retainSession: $retainSession}\n ) {\n settings {\n client {\n name\n __typename\n }\n support {\n serviceActive\n phone\n email\n __typename\n }\n __typename\n }\n user {\n id\n clientCustomerId\n agreements\n properties {\n id\n allInstalled\n __typename\n }\n inbox(modes: [\"app\"]) {\n actions {\n label\n type\n value\n __typename\n }\n id\n lockUser\n maxNumberOfSkip\n messageBody\n messageHeader\n __typename\n }\n __typename\n }\n token\n firstLogin\n __typename\n }\n}\n" }'; // Call the function that'll send request to TIKO $login = f_tiko($json); // get account_id & token in login feedback $account_id = $login["data"]["logIn"]["user"]["properties"][0]["id"]; $token = $login["data"]["logIn"]["token"]; Une fois identifié, tu peux récupérer les statuts/infos/réglages de tes radiateurs : /******************************* * GET GLOBAL ENERGY CONSUMPTION *******************************/ if(!$_REQUEST["room_id"] and !isset($_REQUEST["mode"]) and $_REQUEST["consumption"]){ $datas = f_tiko(false, $token, $account_id); $feedback = $datas["response"]; $logs = file_put_contents($serv_root.$prod."/include/logs/".date("Ymd-His")."-getDatas.log", print_r($feedback, true)); } /********************************** * GET heaters datas + global modes ***********************************/ elseif(!$_REQUEST["room_id"] and !isset($_REQUEST["mode"]) and !isset($_REQUEST["install"])){ $json = '{ "operationName":"GET_PROPERTY_OVERVIEW_DECENTRALISED", "variables":{ "id":'.$account_id.' }, "query":"query GET_PROPERTY_OVERVIEW_DECENTRALISED($id: Int!, $excludeRooms: [Int]) {\n settings {\n benchmark {\n isEnabled\n __typename\n }\n __typename\n }\n property(id: $id) {\n id\n mode\n mboxDisconnected\n isNetatmoAuthorised\n netatmoLinkAccountUrl\n isSinapsiEnabled\n isSinapsiAuthorised\n allInstalled\n ownerPermission\n constructionYear\n surfaceArea\n floors\n valueProposition\n address {\n id\n street\n number\n city\n zipCode\n __typename\n }\n tips {\n id\n tip\n __typename\n }\n ...CentralisedDevicesCompact\n rooms(excludeRooms: $excludeRooms) {\n id\n name\n type\n color\n heaters\n hasTemperatureSchedule\n currentTemperatureDegrees\n targetTemperatureDegrees\n humidity\n sensors\n devices {\n id\n code\n type\n name\n mac\n __typename\n }\n ...Status\n __typename\n }\n __typename\n }\n}\n\nfragment CentralisedDevicesCompact on PropertyType {\n devices(excludeDecentralised: true) {\n id\n code\n type\n name\n mac\n __typename\n }\n externalDevices {\n id\n name\n __typename\n }\n __typename\n}\n\nfragment Status on RoomType {\n status {\n disconnected\n heaterDisconnected\n heatingOperating\n sensorBatteryLow\n sensorDisconnected\n temporaryAdjustment\n __typename\n }\n __typename\n}" }'; $rooms = f_tiko($json, $token); $modes = $rooms["data"]["property"]["mode"]; foreach($modes as $k=>$v){ $feedback[$k] = $v?true:false; } //$feedback["settings"] = $rooms["data"]["property"]["mode"]; foreach($rooms["data"]["property"]["rooms"] as $k=>$v){ $feedback[str_replace("-","",clean($v["name"]))."_cur"] = $v["currentTemperatureDegrees"]; $feedback[str_replace("-","",clean($v["name"]))."_tar"] = $v["targetTemperatureDegrees"]; $feedback[str_replace("-","",clean($v["name"]))."_dry"] = $v["humidity"]; $feedback[str_replace("-","",clean($v["name"]))."_on"] = $v["status"]["heatingOperating"]?true:false; } } Ou modifier les réglages : /************************** * CHANGE ROOM TEMPERATURE * * @param int $room_id target room * @param decimal $temperature target temperature * @return boolean **************************/ if($_REQUEST["room_id"] and $_REQUEST["temperature"]>0){ $json = '{ "variables":{ "propertyId": '.$account_id.', "roomId":'.$_REQUEST["room_id"].', "temperature":'.$_REQUEST["temperature"].' }, "query":"mutation SET_PROPERTY_ROOM_ADJUST_TEMPERATURE($propertyId: Int!, $roomId: Int!, $temperature: Float!) {\n setRoomAdjustTemperature(\n input: {propertyId: $propertyId, roomId: $roomId, temperature: $temperature}\n ) {\n id\n adjustTemperature {\n active\n endDateTime\n temperature\n __typename\n }\n __typename\n }\n}" }'; $temperature = f_tiko($json, $token); if($temperature["data"]["setRoomAdjustTemperature"]) $feedback["status"]=true; else $feedback["status"]=false; $logs = file_put_contents($serv_root.$prod."/include/logs/".date("Ymd-His")."-changeRoomTemp_".$_REQUEST["room_id"].".log", print_r($feedback, true)); } /********************************* * CHANGE GLOBAL MODE * * @param enum $mode * frost * boost * absence * disableHeating * @return boolean *********************************/ if(isset($_REQUEST["mode"])){ if($_REQUEST["mode"]) $mode = $_REQUEST["mode"]; else $mode = "false"; $json = '{ "variables":{ "propertyId": '.$account_id.', "mode":"'.$mode.'" }, "query":"mutation SET_PROPERTY_MODE($propertyId: Int!, $mode: String!) {\n setPropertyMode(input: {propertyId: $propertyId, mode: $mode}) {\n id\n mode\n __typename\n }\n}" }'; $feedback_mode = f_tiko($json, $token); $feedback["mode"]=$mode!="false"?$mode:false; if($feedback_mode["data"]["setPropertyMode"]) $feedback["status"]=true; else $feedback["status"]=false; $logs = file_put_contents($serv_root.$prod."/include/logs/".date("Ymd-His")."-changeMode_".$mode.".log", $_SERVER['REMOTE_ADDR']."\n".$_SERVER['HTTP_USER_AGENT']."\n".basename($_SERVER['REQUEST_URI'])."\n\n".print_r($feedback, true)); } Si tu n’es pas familier du PHP, les paramètres $_REQUEST["xxxx’'] sont récupérés depuis l’URL d’appel de la page (paramètres GET) ou via des post de formulaires (paramètres POST). Mon programme PHP s’appelle tiko.php, pour récupérer les infos d’un radiateur en particulier, je dois appeler la page comme ca : https://mondomaine.com/tiko.php?room_id=xxxxxx Tu récuperera l’ID de chaque pièce via le second appel à l’API, une fois que tu seras identifié. N’hésite pas à demander si tout n’est pas bien clair… Attention, ce qui est à l’intérieur des query envoyées à TIKO via les appels json n’est pas à modifier, les données dedans ne viennent pas de PHP, c’est à laisser tel quel… même si tu fais tes appels autrement… Ce que tu peux modifier dans les appels c’est la partie variables des appels json. ex : "query":"mutation SET_PROPERTY_ROOM_ADJUST_TEMPERATURE($propertyId: Int!, $roomId: Int!, $temperature: Float!) {\n setRoomAdjustTemperature(\n input: {propertyId: $propertyId, roomId: $roo…