[Store] Thermostat Netatmo Application

Discussion et échanges de scripts pour la box eedomus

Re: [Store] Thermostat Netatmo Application

Messagepar Christophe » 28 Fév 2023 08:40

Bonjour,

Même demande pour moi, est-ce possible ? oui, non ?
J'ai 3 plannings Netatmo: Matin, Nuit, Soirée que je voudrais basculer alternativement le dimanche soir
que j'oublie parfois de faire manuellement, possible depuis Eedomus ?(les 2 scripts sont installés).

Merci d'une tite réponse :P

:wave:
Eedomus+, Netatmo: Camera Thermostat pluviomètre anémomètre Station météo , Synology Ds218, Raspberry Pi 3, Alarme Myfox HCPRO, Ensemble Dio modules détecteurs portes, Antenne GP433
Christophe
 
Messages : 152
Inscription : 28 Sep 2019
Localisation : Hauts de France

Re: [Store] Thermostat Netatmo Application

Messagepar pena20100 » 15 Mars 2023 18:39

Alors, j'ai un peu triché, mais j'y suis arrivé?.

J'ai créé des agendas sur Netatmo, que j'appelle par requête web via IFTTT.
Je sais pas si je suis clair, mais je peux préciser au besoin.

Mais si quelqu'un a une solution sans IFTTT, je prends !
pena20100
 
Messages : 136
Inscription : 04 Sep 2017

Re: [Store] Thermostat Netatmo Application

Messagepar pena20100 » 15 Mars 2023 18:41

je viens d'ouvrir mon appli Netatmo (ce que je ne fais jamais) pour vérifier mes agendas... et il y a mention de l'arret de Ifttt energy... donc ma solution va être à repenser. Désolé.
pena20100
 
Messages : 136
Inscription : 04 Sep 2017

Re: [Store] Thermostat Netatmo Application

Messagepar vfdelage » 11 Déc 2023 17:56

Bonjour.
J'ai essayé de comprendre l'info via le xml pour mon thermostat dans l'eedomus mais j'ai la même erreur que Julien.
Résultat XPath :
ERREUR: Valeur lue vide.

Est ce que ça fonctionne chez vous ?
Y a t-il une nouvelle documentation ou version du script ?

Merci par avance, je vais avoir besoin d'aide.
vfdelage
 
Messages : 4
Inscription : 11 Déc 2023

Re: [Store] Thermostat Netatmo Application

Messagepar MrSympa » 14 Déc 2023 11:55

Salut,

Est-ce que quelqu’un a reussi a faire fonctionner le thermostat Netatmo avec l’eedomus, car perso je n’y arrive pas non plus ?
MrSympa
 
Messages : 3
Inscription : 08 Fév 2020

Re: [Store] Thermostat Netatmo Application

Messagepar guilt » 14 Déc 2023 12:58

oui mois ca marche

j'ai de temps en temps un petit timeout mais sinon ca fait le job de maniere general
Pièces jointes
Capture.JPG
netatmo
Capture.JPG (18.19 Kio) Consulté 19381 fois
guilt
 
Messages : 78
Inscription : 09 Juil 2015

Re: [Store] Thermostat Netatmo Application

Messagepar MrSympa » 14 Déc 2023 13:09

guilt a écrit:oui mois ca marche

j'ai de temps en temps un petit timeout mais sinon ca fait le job de maniere general


Bonne nouvelle, comment as-tu fais du coup car avec les plugins j’ai pas réussi, avec les deux j’ai des messages d’erreurs ?
MrSympa
 
Messages : 3
Inscription : 08 Fév 2020

Re: [Store] Thermostat Netatmo Application

Messagepar guilt » 14 Déc 2023 13:37

aucune idée cela fait longtemps que je ne l'ai pas reinstaller

j'ai la version suivantes :
Fichier installé : netatmo_thermostat_oauth.php (2022-04-07 8:27)
Vous avez déjà la dernière version disponible.
guilt
 
Messages : 78
Inscription : 09 Juil 2015

Re: [Store] Thermostat Netatmo Application

Messagepar vfdelage » 15 Déc 2023 13:42

Bonjour.
Merci pour ce retour.

Pouvez-vous me dire comment l'installer sur Eedomus?

Merci.

Cordialement.

François
vfdelage
 
Messages : 4
Inscription : 11 Déc 2023

Re: [Store] Thermostat Netatmo Application

Messagepar guilt » 15 Déc 2023 14:12

vfdelage a écrit:Bonjour.
Merci pour ce retour.

Pouvez-vous me dire comment l'installer sur Eedomus?

Merci.

Cordialement.

François


connectez vous sur votre box , configuration /ajouter un peripherique /store eedomus (en bas a droite )
ensuite dans la rubrique energie , selectionnez netatmo energie App
il faut ensuite suivre la doc pour recuperer le code authentication netatmo
rien de plus
guilt
 
Messages : 78
Inscription : 09 Juil 2015

Re: [Store] Thermostat Netatmo Application

Messagepar vfdelage » 19 Déc 2023 14:10

Je suis en version 5.3
vfdelage
 
Messages : 4
Inscription : 11 Déc 2023

Re: [Store] Thermostat Netatmo Application

Messagepar Vicnau32 » 07 Jan 2024 08:04

Bonjour à tous.
Le script netatmo thermostat fonctionne parfaitement mais impossible de changer de planning. Hors j'aimerais pouvoir le faire pour optimiser l'économie sur le chauffage.

J'ai vu sur une page que l'on pouvait vraisemblablement le faire. mais mes compétences en codages s'avère limités ! ;)

Je mets donc la page des informations au cas ou quelqu'un serait susceptible de modifier le script existant en intégrant un actionneur pour choisir son planning.

https://github.com/Netatmo/Netatmo-API-PHP

Infos du site :

Gérer les plannings hebdomadaires du thermostat Netatmo
Le SDK Netatmo Thermostat vous permet également de gérer le planning du thermostat :

Vous pouvez créer une nouvelle planification :

$res = $client->createSchedule($device['_id'], $module['_id'], $zones, $timetable, 'new schedule');
Vous trouverez l’id de la planification créée dans la valeur de retour.

$schedule_id = $res['schedule_id'];
Changez ensuite le programme actuel du thermostat pour un autre programme existant :

$client->switchSchedule($device['_id'], $module['_id'], $schedule_id);
Et modifiez votre planning actuel :

$client->syncSchedule($device['_id'], $module['_id'], $zones, $timetable);
Ensuite, vous pouvez renommer une planification :

$client->renameSchedule($device['_id'], $module['_id'], $schedule_id, 'new Name');
Enfin, vous pouvez également supprimer un planning :

$client->deleteSchedule($device['_id'], $module['_id'], $schedule_id);
EEDOMUS +, RFXCOM, TELEINFO, FGR222, PRISES AN180-6, FGS223, FGBS001 SONDES, TELECOMMANDE DUEWI ZME_RC2, SYNOLOGY DS220+, CAMERAS IP, THERMOSTAT NETATMO, PRISES 433 MHZ, GOOGLE HOME, ECO-DEVICE, PANNEAUX PHOTOVOLTAIQUES + MICRO ONDULEURS ENPHASE
Vicnau32
 
Messages : 102
Inscription : 17 Juil 2016
Localisation : 32

Re: [Store] Thermostat Netatmo Application

Messagepar Vicnau32 » 02 Mars 2024 21:50

Bon ben je vais chercher un thermostat connecté qui peut se gérer mieux que le netatmo avec l'eedomus... car ne pas pouvoir changer le planning est quand même un problème....

Connaissez vous une alternative ?
EEDOMUS +, RFXCOM, TELEINFO, FGR222, PRISES AN180-6, FGS223, FGBS001 SONDES, TELECOMMANDE DUEWI ZME_RC2, SYNOLOGY DS220+, CAMERAS IP, THERMOSTAT NETATMO, PRISES 433 MHZ, GOOGLE HOME, ECO-DEVICE, PANNEAUX PHOTOVOLTAIQUES + MICRO ONDULEURS ENPHASE
Vicnau32
 
Messages : 102
Inscription : 17 Juil 2016
Localisation : 32

Re: [Store] Thermostat Netatmo Application

Messagepar Vicnau32 » 03 Mars 2024 08:24

on dirait quand même que le script sur jeedom permet le changement de planning créé...

Je pense que ça doit être possible de le faire du coup sur eedomus....
EEDOMUS +, RFXCOM, TELEINFO, FGR222, PRISES AN180-6, FGS223, FGBS001 SONDES, TELECOMMANDE DUEWI ZME_RC2, SYNOLOGY DS220+, CAMERAS IP, THERMOSTAT NETATMO, PRISES 433 MHZ, GOOGLE HOME, ECO-DEVICE, PANNEAUX PHOTOVOLTAIQUES + MICRO ONDULEURS ENPHASE
Vicnau32
 
Messages : 102
Inscription : 17 Juil 2016
Localisation : 32

Re: [Store] Thermostat Netatmo Application

Messagepar frenchdm » 19 Mars 2025 10:28

Bonjour,
Depuis 2 jours mon script Netatmo ne fonctionne plus pour le thermostat, quand je lance le script, j'ai le message "Erreur lors de la lecture des devices #2: <b>Invalid access token</b>"
Quel est le problème ?
Merci !
frenchdm
 
Messages : 235
Inscription : 20 Jan 2014

Re: [Store] Thermostat Netatmo Application

Messagepar dommarion » 28 Oct 2025 09:02

Bonjour à toutes et tous,
J'ai installé le plugin Thermostat Netatmo et j'ai ajouté les fonctionnalités dont la gestion des plannings.
Je vous laisse regarder ce code:
Code : Tout sélectionner
<?php
// script créé par Connected Object pour eedomus
// ce script permet de générer un XML facilement lisible par eedomus
// généré à partir des données Netatmo récupérées via Oauth
// https://dev.netatmo.com/doc/authentication
// encodage iso-8859-1 pour les accents
// Version 1 / 14 novembre 2014        / 1ère version disponible
// Version 2 / 19 mai 2017            / Mise à jour API Netatmo
// Version 2.1 / 20 mai 2017        / Mise à jour API Netatmo (correction plannings) by @Thibautg16
// Version 2.2 / 20 mai 2017        / Mise à jour API Netatmo (ajout battery_percent) by @Thibautg16
// Version 2.3 / 7 aout 2017        / Correction cache
// Version 2.4 / 11 août 2017       / Ajout informations signal Wifi & RF by @Thibautg16
// version 2.5 / 18 juin 2019            / Mise à jour API Netatmo
// version 2.6 / 6 aout 2019            / Gestion id homes > 0
// version 2.6.1 / 2 novembre 2024            / Gestion des plannings de chauffe
// vesrion 2.7 / 8 septembre 2025         / changement du domaine netatmo.net -> netatmo.com


$MODE_NETATMO = 'netatmo'; // Dans ce mode, on met une consigne temporaire
$delay_netatmo = 3; // Par défaut 3 heures de dérogation (à ajuster avec la configuration dans Netatmo pour avoir la même valeur)
$MODE_EEDOMUS = 'eedomus'; // Dans ce mode, on maintient la température de consigne
$CACHE_DURATION = 2; // minutes
$api_url = 'https://api.netatmo.com';
$is_action = false; // Action ou mode capteur ?

//Modif dommarion
$timetable = array();
$zones = array();
//Calage du nombre de seconde du lundi pour ensuite décoder le planning de chauffe qui est en référence au lundi avec un nombre de minutes.
$reference=date("2024-01-01 00:00:00"); //Lundi 01/01/2024 à 0h00
$now=date("Y-m-d H:i:s",time());
$lundi=strtotime($reference)+floor((strtotime($now)-strtotime($reference))/604800)*604800;
// fin modif

$home_id = $_GET['home_id'];
$room_id = $_GET['room_id'];
$module_id = $_GET['module_id'];

function sdk_netatmo_html($extension_module, $thermostats)
{
   $ret = '';

   if(sizeof($extension_module) > 0)
   {
      $ret .= '<br>';
      $ret .= "Voici la liste des modules dont vous pouvez modifier la température de consigne:";
      $ret .= '<br>';
      $ret .= '<br>';
      $ret .= "Vous pouvez copier/coller les identifiants suivants dans le paramètrage de votre périphérique eedomus.";

      $ret .= '<dl>';
   }

   for ($i = 0; $i < sizeof($extension_module); $i++)
   {
      $id = $extension_module[$i]['id'];

      // attention aux "&" qui doivent être convertis
      //$ret .= '<name>'.htmlspecialchars($extension_module[$i]['name']).'</name>';
      //$ret .= '<dt>'.$extension_module[$i]['name'].'</dt>';
      $ret .= '<dd>Identifiant domicile Netatmo (<b>'.$extension_module[$i]['home_name'].'</b>) : <input onclick="this.select();" type="text" size="25" readonly="readonly" value="'.$extension_module[$i]['home_id'].'"</dd>';
      $ret .= '<dd>Identifiant Pièce Netatmo (<b>'.$extension_module[$i]['room_name'].'</b>) : <input onclick="this.select();" type="text" size="17" readonly="readonly" value="'.$extension_module[$i]['room_id'].'"</dd>';
      
      for ($j = 0; $j < sizeof($thermostats); $j++)
      {
         if ($extension_module[$i]['room_id'] == $thermostats[$j]['room_id'])
         {
            $ret .= '<dd>Identifiant Thermostat Netatmo (<b>'.$thermostats[$j]['thermostat_name'].'</b>) : <input onclick="this.select();" type="text" size="17" readonly="readonly" value="'.$thermostats[$j]['thermostat_id'].'"</dd>';
         }
      
      }
      
   }

   if(sizeof($extension_module) > 0)
   {
      $ret .= '</dl>';
   }

   return $ret;
}

function sdk_netatmo_set_temperature($temperature, $mode, $delay = 1)
{
   $endtime;
   if($mode == $GLOBALS['MODE_EEDOMUS'])
   {
      $endtime = time() + $delay_netatmo * 3600;
   }
   else if($mode == $GLOBALS['MODE_NETATMO'])
   {
      $endtime = time() + $delay /*heures*/ * 3600;
   }
   $url = $GLOBALS['api_url'].'/api/setroomthermpoint?access_token='.$GLOBALS['access_token'];
   
   if ($temperature == '30')
   {
      $setpoint_mode = 'max';
   }
   else
   {
      $setpoint_mode = 'manual';
   }
   
   $postdata = 'home_id='.$GLOBALS['home_id'].'&room_id='.$GLOBALS['room_id'].'&mode='.$setpoint_mode.'&temp='.$temperature.'&endtime='.$endtime;
   
   $result = httpQuery($url, 'POST', $postdata, 'netatmo_thermostat_oauth2');
   
   $json = sdk_json_decode($result);
   if ($json['status'] != 'ok')
   {
      echo $result;
   }
   else
   {
      saveVariable('last_xml_success', 0); // pas de cache la fois suivante
   }
}

$setpoint_mode = $_GET['setpoint_mode'];
$setpoint_temp = $_GET['setpoint_temperature'];
if ($setpoint_mode != '' || $setpoint_temp != '')
{
   $is_action = true;
}

$last_xml_success = loadVariable('last_xml_success');
$time_from_last = time() - $last_xml_success;
$time_from_last = $time_from_last / 60;
if (!$is_action && $_GET['mode'] != 'verify' && $time_from_last < $CACHE_DURATION)
{
   sdk_header('text/xml');
   $cached_xml = loadVariable('cached_xml');
   echo $cached_xml;
   die();
}

// on reprend le dernier refresh_token
$refresh_token = loadVariable('refresh_token');
$expire_time = loadVariable('expire_time');
// s'il n'a pas expiré, on peut reprendre l'access_token
if (time() < $expire_time)
{
   $access_token = loadVariable('access_token');
}

// on a déjà un token d'accés non expiré pour le code demandée
if ($access_token == '' || $_GET['mode'] == 'verify')
{
   if (strlen($refresh_token) > 1 && $_GET['mode'] != 'verify')
   {
      // on peut juste rafraichir le token
      $grant_type = 'refresh_token';
      $postdata = 'grant_type='.$grant_type.'&refresh_token='.$refresh_token;
   }
   else
   {
      // 1ère utilisation aprés obtention du code
      $grant_type = 'authorization_code';
      $redirect_uri = 'https://secure.eedomus.com/sdk/plugins/netatmo_thermostat/callback.php';
      $scope = 'read_thermostat write_thermostat';
      $code = getArg('oauth_code');
      $postdata = 'grant_type='.$grant_type.'&code='.$code.'&redirect_uri='.$redirect_uri.'&scope='.$scope;
   }

   $response = httpQuery($api_url.'/oauth2/token', 'POST', $postdata, 'netatmo_thermostat_oauth2');
   $params = sdk_json_decode($response);

   if ($params['error'] != '')
   {
      die("Erreur lors de l'authentification: [".$params['error'].'] (grant_type='.$grant_type.')');
   }

   // on sauvegarde l'access_token et le refresh_token pour les authentifications suivantes
   if (isset($params['refresh_token']))
   {
      $access_token = $params['access_token'];
      saveVariable('access_token', $access_token);
      saveVariable('refresh_token', $params['refresh_token']);
      saveVariable('expire_time', time()+$params['expires_in']);
      saveVariable('code', $code);
   }
   else if ($access_token == '')
   {
      die("Erreur lors de l'authentification");
   }
}

if ($_GET['mode'] == 'verify')
{
   ?><!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
  <head>
  <title>eedomus</title>
  <style type="text/css">
 
  body,td,th {
    font-family: Arial, Helvetica, sans-serif;
    font-size: 14px;
  }
  </style>
  <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
  </head><?

   $url = $api_url.'/api/homesdata?app_type=app_thermostat&access_token='.$access_token;
   $result_devices = httpQuery($url);
   
   $json_devices = sdk_json_decode($result_devices,true);

   if ($json_devices['error']['code'] == 2 /*invalid access token*/)
   {
     // on force l'expiration pour la fois suivante
     saveVariable('expire_time', 0);
   }

   if ($json_devices['error'] != '')
   {
     die("Erreur lors de la lecture des devices: <b>".$json_devices['error']['message'].'</b>');
   }
   
   // il est arrivé que la maison ne soit pas la 1ère de la liste
   // à revoir pour gérer les domiciles multiples
   $home_idx = -1;
   $rooms_count = 0;
   while ($rooms_count <= 0 && $home_idx <= 10)
   {
      $home_idx++;
      $rooms_count = sizeof($json_devices['body']['homes'][$home_idx]["rooms"]);
   }

   for ($i = 0; $i < $rooms_count; $i++)
   {
      $extension_module[$i]['home_id'] = $json_devices['body']['homes'][$home_idx]['id'];
      $extension_module[$i]['home_name'] = $json_devices['body']['homes'][$home_idx]['name'];
      $extension_module[$i]['room_id'] = $json_devices['body']['homes'][$home_idx]["rooms"][$i]['id'];
      $extension_module[$i]['room_name'] = $json_devices['body']['homes'][$home_idx]["rooms"][$i]['name'];
   }
   
   $modules_count = sizeof($json_devices['body']['homes'][$home_idx]["modules"]);
   $j = 0;
   for ($i = 0; $i < $modules_count; $i++)
   {
      $type = $json_devices['body']['homes'][$home_idx]["modules"][$i]['type'];
      if ($type == 'NATherm1')
      {
         $thermostats[$j]['thermostat_id'] = $json_devices['body']['homes'][$home_idx]["modules"][$i]['id'];
         $thermostats[$j]['room_id'] = $json_devices['body']['homes'][$home_idx]["modules"][$i]['room_id'];
         $thermostats[$j]['thermostat_name'] = $json_devices['body']['homes'][$home_idx]["modules"][$i]['name'];
         $j++;
      }
   }
//Modif dommarion pour les planning de chauffe
   $schedules_count = sizeof($json_devices['body']['homes'][$home_idx]["schedules"]);
   $j = 0;
   for ($i = 0; $i < $schedules_count; $i++)
   {
      $timetable = $json_devices['body']['homes'][$home_idx]["schedules"][$i]['timetable'];
      $zones = $json_devices['body']['homes'][$home_idx]["schedules"][$i]['zones'];
   }
// Fin de modif dommarion

   echo sdk_netatmo_html($extension_module, $thermostats);
   die();
}

if($home_id == '' || $room_id == '')
{
   sdk_header('text/xml');
   $xml = '<?xml version="1.0" encoding="utf8" ?>';
   $xml .= '<netatmo>';
   $xml .= '<status>';
   $xml .= 'home_id or room_id is missing';
   $xml .= '</status>';
   $xml .= '</netatmo>';
   echo $xml;
   die();
}

// Les critères sont réunis pour demander d'effectuer une action
if ($is_action)
{
   // Valeurs possibles pour le mode
   // , 'max' plus possible
   $setpoint_mode_valid_values = array('schedule', 'away', 'hg', 'manual', 'max');

   // XML de sortie
   sdk_header('text/xml');
   $xml = '<?xml version="1.0" encoding="utf8" ?>';
   $xml .= '<netatmo>';
   $xml .= '<status>';

   // On va passer en mode manuel et forcer une température
   if($setpoint_temp != '' || $setpoint_mode == 'max')
   {
      $maintain_setpoint = $_GET['maintain_setpoint'];
      if($maintain_setpoint == "always")
      {
         $mode = $MODE_EEDOMUS;
         saveVariable('maintain_mode', $MODE_EEDOMUS);
      }
      else
      {
         $mode = $MODE_NETATMO;
         saveVariable('maintain_mode', $MODE_NETATMO);
      }
      
      if ($setpoint_mode == 'max')
      {
         $setpoint_temp = '30';
      }
      
      sdk_netatmo_set_temperature($setpoint_temp, $mode, abs($maintain_setpoint));
      $xml .= 'ok';
   }
   // On va seulement changer de mode sans modifier la température
   else if(in_array($setpoint_mode, $setpoint_mode_valid_values))
   {
      $url = $api_url.'/api/setthermmode?access_token='.$access_token;
      $postdata = 'home_id='.$GLOBALS['home_id'].'&room_id='.$GLOBALS['room_id'].'&mode='.$setpoint_mode;
      if ($setpoint_mode == 'max')
      {
         $endtime = time() + $delay_netatmo * 3600;
         $postdata .= '&endtime='.$endtime;
      }
      
      $result = httpQuery($url, 'POST', $postdata, 'netatmo_thermostat_oauth2');
      $json = sdk_json_decode($result);
      if ($json['status'] != 'ok')
      {
         //var_dump($url, $postdata);
         $xml .= $postdata." ".$result;
      }
      else
      {
         $xml .= 'ok';
         saveVariable('last_xml_success', 0); // pas de cache la fois suivante
      }
   }
   else
   {
      $xml .= 'ko:'.$setpoint_mode;
   }

   $xml .= '</status>';
   $xml .= '</netatmo>';
   echo $xml;
}
else // On effectue une lecture des données
{

//Modif dommarion
   $url = $api_url.'/api/homesdata?app_type=app_thermostat&access_token='.$access_token;
   $result_devices = httpQuery($url);
   $json_devices = sdk_json_decode($result_devices,true);
   $home_idx=2;
   $ete = date("I",time());
   if ($ete == 1) {$offset=3600;} else {$offset=0;}
   $schedules_count = sizeof($json_devices['body']['homes'][$home_idx]["schedules"]);
   $j = 0;
   for ($i = 0; $i < $schedules_count; $i++)
   {
      $timetable = $json_devices['body']['homes'][$home_idx]["schedules"][$i]['timetable'];
      $zones = $json_devices['body']['homes'][$home_idx]["schedules"][$i]['zones'];
   }

   for ($i=0; $i<count($timetable); $i++)
      {$timetable[$i]["m_offset"]=$timetable[$i]["m_offset"]*60-$offset+$lundi;
      if ($i>0)
      {
      if ($timetable[$i]["m_offset"]>strtotime($now) and $timetable[$i-1]["m_offset"]<=strtotime($now))
         {for ($j=0; $j<count($zones);$j++)
            {if ($zones[$j]["id"]==$timetable[$i-1]["zone_id"]) {$zone_id=$j;}
            }
         $t0=$i-1;
         $t1=$i;
//         echo  "mode: ".$zones[$zone_id]["name"]." car ".$now." est dans l'intervalle [".date("Y-m-d H:i:s",$timetable[$i-1]["m_offset"])." et ".date("Y-m-d H:i:s",$timetable[$i]["m_offset"])."]";
            }
      }}
   if ($timetable[count($timetable)-1]["m_offset"]<strtotime($now))
      {for ($j=0; $j<count($zones);$j++)
         {if ($zones[$j]["id"]==$timetable[$i-1]["zone_id"]) {$zone_id=$j;}
         }
      $t0=count($timetable)-1;
      $t1=$t0;
//         echo  "mode: ".$zones[$zone_id]["name"]." car ".$now." est au delà de [".date("Y-m-d H:i:s",$timetable[count($timetable)-1]["m_offset"])."]";
        }
//Fin de modif

   $url_devices = $api_url.'/api/homestatus?access_token='.$access_token;
   $postdata = 'home_id='.$home_id;
   $result_devices = httpQuery($url_devices, 'POST', $postdata, 'netatmo_thermostat_oauth2');
   
   // gestion offline pour débug
   //saveVariable('result_devices', $result_devices); die();
   //$result_devices = loadVariable('result_devices');

   $json_devices = sdk_json_decode($result_devices,true);

   if ($json_devices['error']['code'] == 2 /*invalid access token*/)
   {
      // on force l'expiration pour la fois suivante
      saveVariable('expire_time', 0);
   }

   if ($json_devices['error'] != '')
   {
      die("Erreur lors de la lecture des devices #2: <b>".$json_devices['error']['message'].'</b>');
   }
 
   $current_home_id = $json_devices['body']['home']['id'];
   for ($i = 0; $i < sizeof($json_devices['body']['home']['rooms']); $i++)
   {
      $current_room_id = $json_devices['body']['home']['rooms'][$i]['id'];
      if ($current_room_id == $room_id)
      {
         $setpoint_mode = $json_devices['body']['home']['rooms'][$i]['therm_setpoint_mode'];
         $setpoint_temperature = $json_devices['body']['home']['rooms'][$i]['therm_setpoint_temperature'];
         $temperature = $json_devices['body']['home']['rooms'][$i]['therm_measured_temperature'];
      }
   }
   
   for ($i = 0; $i < sizeof($json_devices['body']['home']['modules']); $i++)
   {
      $current_module_id = $json_devices['body']['home']['modules'][$i]['id'];
      if ($current_module_id == $module_id)
      {
         $relay_command = $json_devices['body']['home']['modules'][$i]['boiler_status'];
      }
   }

   // XML de sortie
   // permet d'avoir une mise en forme plus lisible dans un browser
   sdk_header('text/xml');
   // Contenu du XML
   $cached_xml = '<?xml version="1.0" encoding="utf8" ?>';
   $cached_xml .= '<netatmo>';
   $cached_xml .= '<cached>0</cached>';
   
   if (isset($setpoint_mode))
   {
      $cached_xml .= '<setpoint_mode>'.$setpoint_mode.'</setpoint_mode>';
   }
   if (isset($setpoint_temperature) && $setpoint_mode == 'manual')
   {
      // Temperature manuellement imposee
      $cached_xml .= '<setpoint_temperature>'.$setpoint_temperature.'</setpoint_temperature>';
//Modif dommarion
      $cached_xml .= '<zone_id>'.$zones[$zone_id]["id"].'</zone_id>';
      $cached_xml .= '<zone_name>'.$zones[$zone_id]["name"].'</zone_name>';
//fin modif

      // Verification: besoin de l'imposer à nouveau ?
      // Oui si on est en mode eedomus et proche du temps imparti
      $maintain_mode = loadVariable('maintain_mode');
      if($maintain_mode != $MODE_NETATMO)
      {
         $now = time();
         $setpoint_endtime = $json_devices['body']['home'][0]['modules'][0]['setpoint']['setpoint_endtime'];
         if($setpoint_endtime - $now < 3600)
         {
            sdk_netatmo_set_temperature($setpoint_temperature, $MODE_EEDOMUS);
         }
      }
   }
   else if($setpoint_mode == 'max')
   {
      // Trouver la temperature en cas d'absence
      $cached_xml .= '<setpoint_temperature>max</setpoint_temperature>';
//Modif dommarion
      $cached_xml .= '<zone_id>'.$zones[$zone_id]["id"].'</zone_id>';
      $cached_xml .= '<zone_name>'.$zones[$zone_id]["name"].'</zone_name>';
//fin modif
   }
   else
   {
      $cached_xml .= '<setpoint_temperature>'.$setpoint_temperature.'</setpoint_temperature>';
//Modif dommarion
      $cached_xml .= '<zone_id>'.$zones[$zone_id]["id"].'</zone_id>';
      $cached_xml .= '<zone_name>'.$zones[$zone_id]["name"].'</zone_name>';
        $cached_xml .= '<zone_debut>'.date("Y-m-d H:i:s",$timetable[$t0]["m_offset"]).'</zone_debut>';
        $cached_xml .= '<zone_fin>'.date("Y-m-d H:i:s",$timetable[$t1]["m_offset"]).'</zone_fin>';
//fin modif
   }
   
   if (isset($temperature))
   {
      $allow_cache = true;
      $cached_xml .= '<temperature>'.$temperature.'</temperature>';
   }
   else
   {
    $allow_cache = false;
   }

   if (isset($relay_command))
   {
      if($relay_command == 100)
      {
         $cached_xml .= '<boiler>100</boiler>';
      }
      else if($relay_command == 0)
      {
         $cached_xml .= '<boiler>0</boiler>';
      }
   }
   
   $cached_xml .= '<token>'.$access_token.'</token>';
   $cached_xml .= '</netatmo>';

   echo $cached_xml;
   $cached_xml = str_replace('<cached>0</cached>', '<cached>1</cached>', $cached_xml);
   if ($allow_cache)
   {
      saveVariable('cached_xml', $cached_xml);
      saveVariable('last_xml_success', time());
   }
}
?>

Bonne journée
dommarion
OpenWeather|Phases soleil|HeatzyV2|Concaténateur|HP Yamaha|SomfyV3|Epson|Seuils n étages|Baie 2 vantaux|Deezer|Intégrale|HTTP Auth. Digest|TV Philips|SmartThings|fonctions PHP|Tuya Smartlife|CozyTouch2|mySMS|TV Sony
dommarion
 
Messages : 713
Inscription : 28 Déc 2020

Précédent

Retour vers Scripts & Périphériques du store

Qui est en ligne ?

Utilisateurs parcourant ce forum : Aucun utilisateur inscrit et 23 invité(s)