Différences entre les versions de « Station météo Netatmo »
Ligne 3 : | Ligne 3 : | ||
{{Infobox IPX800 | {{Infobox IPX800 | ||
| titre = WS NETATMO | | titre = WS NETATMO | ||
| image = | | image = Netatmo_presentation.png | ||
| famille = Objets connectés | | famille = Objets connectés | ||
| date-create = 11/03/2018 | | date-create = 11/03/2018 |
Version du 11 mars 2018 à 16:23
| |||
---|---|---|---|
Nom | WS NETATMO | ||
Famille | Objets connectés | ||
Wiki créé le | 11/03/2018 | ||
Wiki mis à jour le | 11/03/2018 | ||
Auteur | fgtoul |
Présentation
La station Netatmo peut être consultée à distance à l'aide de l'API. Nous allons voir comment récupérer les données de la station météo afin d'interagir avec notre IPX800 V4.
Il sera nécessaire d'écrire un script qui aura pour tâche de
- se connecter à l'API de Netatmo,
- récupérer les données des différents modules (extérieur, intérieurs, pluviomètre, ...),
- envoyer les données à l'IPX800 V4.
J'ai choisi d'écrire un script en Php que j'hébergerai sur mon NAS Synology, mais vous pouvez tout à fait héberger ce script chez votre FAI si vous ne disposez ni de NAS, ni de serveur web.
Nous pourrons alors utiliser ces informations dans des scènes de notre IPX800.
Accès à l'API Netatmo
Nous allons créer une application sur le site de développement Netatmo afin d'obtenir nos identifiants.
Connectez vous avec vos identifiants Netamo
cliquez sur le bouton de création d'une application
renseignez le nom et la description puis validez
notez les identifiants générés pour votre application
- Client ID
- Client secret
Ces informations seront utilisées dans le script Php
PHP sur le Synology
voici le script :
<?php
//renseignez vos identifiants ci-dessous
$password="Votre_mot_de_passe_Netatmo";
$username="Votre_identifiant_Netatmo";
$app_id = "Votre_Client_ID";
$app_secret ="Votre_Client_Secret";
//---fin de paramétrage--
$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
)
);
$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'];
$requete = file_get_contents($api_url);
$url_devices = "https://api.netatmo.net/api/devicelist?access_token=" . $params['access_token'];
$resultat_device = file_get_contents($url_devices);
//echo $resultat_device;
$json_devices = json_decode($resultat_device,true);
//équation pour batterie EXT et Pluvio
//y = 0,002x - 6 ou y = 0,05x - 175
// 3500:1 / 4000 : 2 / 4500 :3 / 5000 : 4 / 5500 : 5
function Batterie1($valeur){
$T1=array(0,10,25,50,75,100);
$valeur=intval(0.002*$valeur-6);
if ($valeur>=5){
$valeur= 5;
}else if ($valeur<1){
$valeur=1;
}
return $T1[$valeur];
}
function Batterie2($valeur){
$T2=array(0,10,25,50,75,100);
$valeur=intval(0.0024*$valeur-8.6341);
if ($valeur>=5){
$valeur= 5;
}else if ($valeur<1){
$valeur=1;
}
return $T2[$valeur];
}
// équation modules intérieurs
//y = 0,0024x - 8,6341
// 3950:1 / 4360:2 / 4770:3 / 5180:4 / 5590:5
//Module extérieur
$ext_temp = floatval($json_devices["body"]["modules"][0]["dashboard_data"]["Temperature"]) * 10;
$ext_temp_min = floatval($json_devices["body"]["modules"][0]["dashboard_data"]["min_temp"]) * 10;
$ext_temp_max = floatval($json_devices["body"]["modules"][0]["dashboard_data"]["max_temp"]) * 10;
$ext_humidite = floatval($json_devices["body"]["modules"][0]["dashboard_data"]["Humidity"]) * 10;
$ext_battery = Batterie1(floatval($json_devices["body"]["modules"][0]["battery_vp"]));
//module 1 : CH1
$M1_temp = floatval($json_devices["body"]["modules"][1]["dashboard_data"]["Temperature"]) * 10;
$M1_temp_min = floatval($json_devices["body"]["modules"][1]["dashboard_data"]["min_temp"]) * 10;
$M1_temp_max = floatval($json_devices["body"]["modules"][1]["dashboard_data"]["max_temp"]) * 10;
$M1_humidite = floatval($json_devices["body"]["modules"][1]["dashboard_data"]["Humidity"]) * 10;
$M1_battery = Batterie2(floatval($json_devices["body"]["modules"][1]["battery_vp"]));
$M1_CO2=floatval($json_devices["body"]["modules"][1]["dashboard_data"]["CO2"]);
//module 2 : CH2
$M2_temp = floatval($json_devices["body"]["modules"][2]["dashboard_data"]["Temperature"]) * 10;
$M2_temp_min = floatval($json_devices["body"]["modules"][2]["dashboard_data"]["min_temp"]) * 10;
$M2_temp_max = floatval($json_devices["body"]["modules"][2]["dashboard_data"]["max_temp"]) * 10;
$M2_humidite = floatval($json_devices["body"]["modules"][2]["dashboard_data"]["Humidity"]) * 10;
$M2_battery = Batterie2(floatval($json_devices["body"]["modules"][2]["battery_vp"]));
$M2_CO2=floatval($json_devices["body"]["modules"][2]["dashboard_data"]["CO2"]);
//module 3 : Pluviomètre
$M3_Rain = floatval($json_devices["body"]["modules"][3]["dashboard_data"]["Rain"]) * 10;
$M3_Rain_24 = floatval($json_devices["body"]["modules"][3]["dashboard_data"]["sum_rain_24"]) * 10;
$M3_Rain_1 = floatval($json_devices["body"]["modules"][3]["dashboard_data"]["sum_rain_1"]) * 10;
$M3_battery = Batterie1(floatval($json_devices["body"]["modules"][3]["battery_vp"]));
//module Station
$MS_temp = floatval($json_devices["body"]["devices"][0]["dashboard_data"]["Temperature"]) * 10;
$MS_temp_min = floatval($json_devices["body"]["devices"][0]["dashboard_data"]["min_temp"]) * 10;
$MS_temp_max = floatval($json_devices["body"]["devices"][0]["dashboard_data"]["max_temp"]) * 10;
$MS_humidite = floatval($json_devices["body"]["devices"][0]["dashboard_data"]["Humidity"]) * 10;
$MS_CO2=floatval($json_devices["body"]["devices"][0]["dashboard_data"]["CO2"]);
$MS_Pressure=floatval($json_devices["body"]["devices"][0]["dashboard_data"]["Pressure"]) * 10;
$MS_Noise=floatval($json_devices["body"]["devices"][0]["dashboard_data"]["Noise"]);
//dates
//timestamp=86400 secondes par jour. dépasse la capacité d'une analogique (65536), conc on divise par 60 pour avoir des minutes. A la restitution sur ipx, on remultipliera par 60 ==> effet perte des secondes dans l'heure.
$today = mktime(0, 0, 0, date("m") , date("d"), date("Y"));
$ext_min_time=intval(($ext_min_time - $today)/60);
$ext_max_time=intval(($ext_max_time - $today)/60);
$URL_Push="http://192.168.0.112/api/xdevices.json?key=fgtoul&SetVA01=" . $ext_temp . "&SetVA02=" . $ext_temp_min . "&SetVA03=" . $ext_temp_max . "&SetVA04=" . $ext_humidite . "&SetVA05=" . $ext_battery . "&SetVA06=" . $M1_temp . "&SetVA07=" . $M1_temp_min . "&SetVA08=" . $M1_temp_max . "&SetVA09=" . $M1_humidite . "&SetVA10=" . $M1_battery . "&SetVA11=" . $M1_CO2 . "&SetVA12=" . $M2_temp ."&SetVA13=" . $M2_temp_min . "&SetVA14=" . $M2_temp_max . "&SetVA15=" . $M2_humidite . "&SetVA16=" . $M2_battery . "&SetVA17=" . $M2_CO2 . "&SetVA18=0" . $M3_rain ."&SetVA19=0" . $M3_rain_24 . "&SetVA20=0" . $M3_rain_1 . "&SetVA21=" . $M3_battery . "&SetVA22=" . $MS_temp . "&SetVA23=" . $MS_temp_min . "&SetVA24=" . $MS_temp_max . "&SetVA25=" . $MS_humidite . "&SetVA26=" . $MS_CO2 . "&SetVA27=" . $MS_Pressure . "&SetVA28=" . $MS_Noise ;
echo $URL_Push . "<br>";
//$Push = file_get_contents($URL_push);
$ch = curl_init();
//Set the URL that you want to GET by using the CURLOPT_URL option.
curl_setopt($ch, CURLOPT_URL, $URL_Push);
//Set CURLOPT_RETURNTRANSFER so that the content is returned as a variable.
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
//Set CURLOPT_FOLLOWLOCATION to true to follow redirects.
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true);
//Execute the request.
$data = curl_exec($ch);
//Close the cURL handle.
curl_close($ch);
?>
Les fonctions Batterie1 et Batterie2 permettent de convertir la valeur du niveau de charge en un indice dont la valeur est comprise entre 1 et 5 puis en taux de charge (10%, 25%, 50%, 75%, 100%). Cela permettra l'affichage de l'icône adéquate sur l'interface de l'IPX800 tout en mettant le moins dde code possible sur l'IPX800 afin de le charger au munimum. Les formules ont été déterminées grâce aux seuils fournis par Netatmo sur la page référence de l'API.