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: $roomId, temperature: $temperature}\n ) {\n id\n adjustTemperature {\n active\n endDateTime\n temperature\n __typename\n }\n __typename\n }\n}"