[PHP] Thermostat Netatmo - Lecture et statut
Publié : 14 déc. 2014, 20:28
Bonjour,
Je vais vous joindre un de mes premiers scripts pour le thermostat netatmo (car il y en aura d'autres, et j'en ferais d'autres pour d'autres objets connectés). Tout d'abord que fait celui la et a quoi il sert.
Le script que je fournis permet de mettre à jour 3 capteurs virtuels (à créer au préalable):
1) un switch on/off : pour savoir si le système de chauffe (chaudière par exemple) est allumé ou pas
2) un virtual sensor de température : pour savoir la température mesurée par le thermostat
3) un virtual sensor (setpoint) : pour connaitre la température de consigne actuelle du thermostat.
Il faut donc comme à l'accoutumé dans domoticz créer les 3 capteurs au préalable et récupérer leurs idx.
Donc voici le script (à mettre dans un cron par exemple). Il est inspiré du script de Cyril E que j'ai beaucoup adapté à domoticz. Car même si vous le mettez en CRON toutes les deux minutes, je ne metterais à jour domoticz que si il y a un changement (ce qui permet de laisser la date last seen qui correspond a la date réelle de dernier changement)
Voici le script : (en php, meme si d'habitude je fais tout en python ou en sh)
Je compte fournir de meme le moyen d'interagir avec le thermostat de manière conviviale via domoticz.
J'essaie de me mettre au C++ car j'aimerais faire un plugin natif avec tout en un mais la c'est autre chose
Je vais vous joindre un de mes premiers scripts pour le thermostat netatmo (car il y en aura d'autres, et j'en ferais d'autres pour d'autres objets connectés). Tout d'abord que fait celui la et a quoi il sert.
Le script que je fournis permet de mettre à jour 3 capteurs virtuels (à créer au préalable):
1) un switch on/off : pour savoir si le système de chauffe (chaudière par exemple) est allumé ou pas
2) un virtual sensor de température : pour savoir la température mesurée par le thermostat
3) un virtual sensor (setpoint) : pour connaitre la température de consigne actuelle du thermostat.
Il faut donc comme à l'accoutumé dans domoticz créer les 3 capteurs au préalable et récupérer leurs idx.
Donc voici le script (à mettre dans un cron par exemple). Il est inspiré du script de Cyril E que j'ai beaucoup adapté à domoticz. Car même si vous le mettez en CRON toutes les deux minutes, je ne metterais à jour domoticz que si il y a un changement (ce qui permet de laisser la date last seen qui correspond a la date réelle de dernier changement)
Voici le script : (en php, meme si d'habitude je fais tout en python ou en sh)
Code : Tout sélectionner
<?php
// Ludovic SARAKHA script complet de lecture et maj de 3 capteurs domoticz (setpoint, temp et etat chaudière) avec les valeurs du thermostat netatmo
// Script inspiré du script de Cyril E http://www.ituilerie.com
//parametrage individuel (a changer)
$password='XXXXXXXX';
$username='XXXXXXXX';
$app_id = 'XXXXXXXX';
$app_secret = 'XXXXXXXX';
$domoticz_ip_port='XXX.XXX.XXX.XXX:XXXX';
$chaudiere_idx ='XX';
$setpoint_idx='XX';
$temp_idx='XX';
//partie de communication avec netatmo
$token_url = "https://api.netatmo.net/oauth2/token";
$postdata = http_build_query(
array(
'grant_type' => "password",
'client_id' => $app_id,
'client_secret' => $app_secret,
'username' => $username,
'password' => $password,
'scope' => 'read_station read_thermostat write_thermostat'
)
);
$opts = array('http' =>
array(
'method' => 'POST',
'header' => 'Content-type: application/x-www-form-urlencoded',
'content' => $postdata
)
);
$context = stream_context_create($opts);
$response = file_get_contents($token_url, false, $context);
$params = null;
$params = json_decode($response, true);
$api_url = "https://api.netatmo.net/api/getuser?access_token=" . $params['access_token']."&app_type=app_thermostat";
$requete = @file_get_contents($api_url);
$url_devices = "https://api.netatmo.net/api/devicelist?access_token=" . $params['access_token']."&app_type=app_thermostat";
$resulat_device = @file_get_contents($url_devices);
$json_devices = json_decode($resulat_device,true);
$device1 = $json_devices["body"]["devices"][0]["_id"];
$module1 = $json_devices["body"]["modules"][0]["_id"];
//recuperation des valeurs netatmo
$url_thermostat1="http://api.netatmo.net/api/getthermstate?access_token=" . $params['access_token']."&device_id=".$device1."&module_id=".$module1;
$value_thermostat1= file_get_contents($url_thermostat1);
$json_mesures_thermostat1 = json_decode($value_thermostat1, true);
$temperature_thermostat1 = $json_mesures_thermostat1["body"]["measured"]["temperature"];
$run_thermostat1 = $json_mesures_thermostat1["body"]["therm_relay_cmd"];
$setpoint_thermostat1=$json_mesures_thermostat1["body"]["measured"]["setpoint_temp"];
//transformation 0 en off et 100 en on
$stat_chaudiere="Off";
if ($run_thermostat1=="100") {
$stat_chaudiere="On";
}
//construction des requetes denvoi a domoticz
$url_send_temp="http://" . $domoticz_ip_port . "/json.htm?type=command¶m=udevice&idx=" . $temp_idx . "&nvalue=0&svalue=" . $temperature_thermostat1;
$url_send_consigne="http://" . $domoticz_ip_port . "/json.htm?type=command¶m=udevice&idx=" . $setpoint_idx . "&nvalue=0&svalue=" . $setpoint_thermostat1;
$url_statut_chaudiere="http://" . $domoticz_ip_port . "/json.htm?type=command¶m=switchlight&idx=" . $chaudiere_idx . "&switchcmd=" . $stat_chaudiere . "&level=0";
//recuperation des etats actuels domoticz et envoi uniquement si different (ce qui permet davoir la vraie info de lheure du dernier changement
$current_temp_domo=json_decode(file_get_contents("http://" . $domoticz_ip_port . "/json.htm?type=devices&rid=" . $temp_idx), true)["result"][0]["Temp"];
if ($current_temp_domo!=$temperature_thermostat1) {
$send_temp_thermostat= file_get_contents($url_send_temp);
}
$current_consigne_domo=json_decode(file_get_contents("http://" . $domoticz_ip_port . "/json.htm?type=devices&rid=" . $setpoint_idx), true)["result"][0]["Data"];
if ($current_consigne_domo!=$setpoint_thermostat1) {
$send_temp_consigne= file_get_contents($url_send_consigne);
}
$current_stat_chaudiere=json_decode(file_get_contents("http://" . $domoticz_ip_port . "/json.htm?type=devices&rid=" . $chaudiere_idx), true)["result"][0]["Data"];
if ($current_stat_chaudiere!=$stat_chaudiere) {
$send_statut_chaudiere= file_get_contents($url_statut_chaudiere);
}
?>Je compte fournir de meme le moyen d'interagir avec le thermostat de manière conviviale via domoticz.
J'essaie de me mettre au C++ car j'aimerais faire un plugin natif avec tout en un mais la c'est autre chose