Différences entre les versions de « Station météo Netatmo »
Ligne 45 : | Ligne 45 : | ||
==PHP sur le Synology== | ==PHP sur le Synology== | ||
voici le script | |||
=== Le script== | |||
voici le code que vous devez copier et coller dans l'environnement Web de votre synology. | |||
Pour ma part, j'ai créé un dossier Netatmo dans mon dossier Web, j'y ai sauvegardé le script sous le nom "netatmo2push.php". | |||
<source> | <source> | ||
<?php | <?php | ||
Ligne 53 : | Ligne 58 : | ||
$app_id = "Votre_Client_ID"; | $app_id = "Votre_Client_ID"; | ||
$app_secret ="Votre_Client_Secret"; | $app_secret ="Votre_Client_Secret"; | ||
$API_key="Votre_Key_IPX800" | |||
//---fin de paramétrage-- | //---fin de paramétrage-- | ||
Ligne 112 : | Ligne 118 : | ||
} | } | ||
//Module extérieur | //Module extérieur | ||
$ext_temp = floatval($json_devices["body"]["modules"][0]["dashboard_data"]["Temperature"]) * 10; | $ext_temp = floatval($json_devices["body"]["modules"][0]["dashboard_data"]["Temperature"]) * 10; | ||
Ligne 166 : | Ligne 163 : | ||
$ext_max_time=intval(($ext_max_time - $today)/60); | $ext_max_time=intval(($ext_max_time - $today)/60); | ||
$URL_Push="http://192.168.0.112/api/xdevices.json?key=" . $API_key . "&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 ; | |||
$URL_Push="http://192.168.0.112/api/xdevices.json?key= | |||
echo $URL_Push . "<br>"; | echo $URL_Push . "<br>"; | ||
Ligne 203 : | Ligne 190 : | ||
?> | ?> | ||
</source> | </source> | ||
===les identifiants=== | |||
Renseignez vos identifiants dans les cinq premières lignes du code. | Renseignez vos identifiants dans les cinq premières lignes du code. | ||
===récupération des données=== | |||
Le script se charge de récupérer les données de vos différents modules. | Le script se charge de récupérer les données de vos différents modules. | ||
Dans mon cas, les modules sont les suivant | Dans mon cas, les modules sont les suivant | ||
Ligne 227 : | Ligne 214 : | ||
Clquez sur le bouton "Tree viewer" Vous devriez alors obtenir une arborescence bien lisible de vos données. | Clquez sur le bouton "Tree viewer" Vous devriez alors obtenir une arborescence bien lisible de vos données. | ||
Vous devriez y retouver les différents modules avec leur index ainsi que les relevés météorologiques (dashboard_data) pour chacun d'entre eux. Le module principal de la station se trouve en bas de l'arborescence, c'est un device qui en général est identifié ["devices"][0] | Vous devriez y retouver les différents modules avec leur index ainsi que les relevés météorologiques (dashboard_data) pour chacun d'entre eux. Le module principal de la station se trouve en bas de l'arborescence, c'est un device qui en général est identifié ["devices"][0] | ||
Pensez à rétablir les commentaires après la manip. | |||
===Préparation des données=== | |||
Les fonctions Batterie1 et Batterie2 permettent de convertir la valeur du niveau de charge en un 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 de 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 [https://dev.netatmo.com/resources/technical/reference/weather référence de l'API]. | |||
Les relevés de températures et de pression sont effectués sous forme de nombre décimal. | |||
Si nous envoyons ces données dans une analogique virtuelle de l'IPX800, cette dernière ignorera la partie décimale. Nous perdrons en précision. | |||
Afin de ne pas perdre nos décimales tout en envoyant des nombres entiers, nous multiplierons ces valeurs par 10. | |||
Sur l'IPX800, nous mettrons alors une formule en place (x / 10) sur les entrées analogiques respectives afin de rétablir la valeur d'origine. | |||
===Envoi des données à l'IPX800=== | |||
Pour envoyer les données à l'IPX800, nous utilisons son API Http. | |||
Toutes les données seront envoyées dans des entrées analogiques virtuelles, afin d'être affichables et utilisables dans les scenarii. | |||
Nous utiliserons la commande SetVAxx que nous assemblerons sous forme d'URL. Celle-ci sera alors exécutée par la fonction curl(). | |||
Dans notre script, nous récupérons toutes les valeurs importantes. Vous pouvez restreindre le nombre des valeurs afin d'utiliser moins d'entrées analogiques. | |||
===Test et plannification du script=== | |||
Après adaptation du code, vous pouvez le tester. Vous devriez alors obtenir l'affichage de l'URL qui a été générée afin d'envoyer les données à l'IPX800 grâce à son API. |
Version du 11 mars 2018 à 17:47
| |||
---|---|---|---|
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
= Le script
voici le code que vous devez copier et coller dans l'environnement Web de votre synology. Pour ma part, j'ai créé un dossier Netatmo dans mon dossier Web, j'y ai sauvegardé le script sous le nom "netatmo2push.php".
<?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";
$API_key="Votre_Key_IPX800"
//---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;
//exit();
$json_devices = json_decode($resultat_device,true);
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];
}
//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=" . $API_key . "&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 identifiants
Renseignez vos identifiants dans les cinq premières lignes du code.
récupération des données
Le script se charge de récupérer les données de vos différents modules. Dans mon cas, les modules sont les suivant
- ["modules"][0] correspond au module extérieur.
- ["modules"][1] correspond au 1er module intérieur additionnel.
- ["modules"][2] correspond au 2nd module intérieur additionnel.
- ["modules"][3] correspond au Pluviomètre.
Pour voir à quoi correspondent les données chez vous, faites comme suit
- décommentez les lignes 40 et 41 du code
- Exécutez le script dans votre navigateur. Vous devriez obtenir l'ensemble des données JSON servies par l'API.
Sélectionnez la totalité de ces données, copiez et collez dans un visualiseur de données Json.
Clquez sur le bouton "Tree viewer" Vous devriez alors obtenir une arborescence bien lisible de vos données. Vous devriez y retouver les différents modules avec leur index ainsi que les relevés météorologiques (dashboard_data) pour chacun d'entre eux. Le module principal de la station se trouve en bas de l'arborescence, c'est un device qui en général est identifié ["devices"][0]
Pensez à rétablir les commentaires après la manip.
Préparation des données
Les fonctions Batterie1 et Batterie2 permettent de convertir la valeur du niveau de charge en un 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 de 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.
Les relevés de températures et de pression sont effectués sous forme de nombre décimal.
Si nous envoyons ces données dans une analogique virtuelle de l'IPX800, cette dernière ignorera la partie décimale. Nous perdrons en précision.
Afin de ne pas perdre nos décimales tout en envoyant des nombres entiers, nous multiplierons ces valeurs par 10.
Sur l'IPX800, nous mettrons alors une formule en place (x / 10) sur les entrées analogiques respectives afin de rétablir la valeur d'origine.
Envoi des données à l'IPX800
Pour envoyer les données à l'IPX800, nous utilisons son API Http. Toutes les données seront envoyées dans des entrées analogiques virtuelles, afin d'être affichables et utilisables dans les scenarii. Nous utiliserons la commande SetVAxx que nous assemblerons sous forme d'URL. Celle-ci sera alors exécutée par la fonction curl().
Dans notre script, nous récupérons toutes les valeurs importantes. Vous pouvez restreindre le nombre des valeurs afin d'utiliser moins d'entrées analogiques.
Test et plannification du script
Après adaptation du code, vous pouvez le tester. Vous devriez alors obtenir l'affichage de l'URL qui a été générée afin d'envoyer les données à l'IPX800 grâce à son API.