Forum eedomus
http://forum.eedomus.fr/

tado climatisation V3
http://forum.eedomus.fr/viewtopic.php?f=14&t=11156
Page 1 sur 1
Auteur:  Ben34 [ 18 Déc 2021 20:33 ]
Sujet du message:  tado climatisation V3

bonjour

j'ai deja parametré des tado V2 avec le plugin, tout marche (sauf la puissance du ventillateur)
je viens de recevoir et installer de nouveaux tado (V3), install.ok, retour temperature et humidité ok, mise en off ok; mais impossible de lancer une consigne de chauffage.
prend l'info mais rien ne se passe sur les tado.
ca marche parfaitement avec l'appli tado, mais impossible avec eedomus...

si quelqu'un à une idée..

Merci d'avance,
Benoit
Auteur:  Freezecool [ 01 Jan 2022 19:30 ]
Sujet du message:  Re: tado climatisation V3

Bonjour Ben34,

Je viens juste de voir ton post concernant les Tado, j'ai également le même souci que toi. j'ai effectué la mise à jour de mes Tado et plus rien ne fonctionnait.

L'équipe de Tado a modifié son API, j'ai du modifier le script de l'équipe eedomus.
Et il faut modifier les valeurs de la ventilation ( voir capture).

La Team est au courant, je leur ai envoyé le script modifié mais je n'ai pas eu de réponse de leur part.

Je te joins le script mais attention que cela n'impacte pas les tado en V2 ou peut etre vérifié s'il n'exista pas une mise à jour sur les Tado V2 en les réinstallant.

Espérant avoir pu t'aider.

Code : Tout sélectionner
<?php
// script créé par Connected Object pour eedomus


$CACHE_DURATION = 5; // minutes
$api_url = 'https://my.tado.com/';

$prev_code = loadVariable('code');

function sdk_get_tado_value($name, $default_value, $home_id, $zone_id)
{
   $value = loadVariable($name.'_'.$home_id.'_'.$zone_id);
   if ($value == '') { $value = $default_value; }
   saveVariable($name.'_'.$home_id.'_'.$zone_id, $value);
   return $value;
}

function sdk_tado_api_call($url, $action = 'GET', $post = NULL)
{
   $headers = array("Authorization: Bearer ".$GLOBALS['access_token']);
   if ($post != '')
   {
      $headers[] = 'Content-Type: application/json';
   }
   $response = httpQuery($url, $action, $post, 'tado_oauth2', $headers);
   //echo "url=[$url] post=[$post] response=[$response]";
   return $response;
}

if ($_GET['mode'] != 'verify')
{
   $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 == '')
{
  if ($_GET['oauth_code'] != '')
  {
    $code = $_GET['oauth_code'];
  }
  else
  {
    $code = $prev_code;
  }

   if (strlen($refresh_token) > 1)
   {
      // 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/tado/callback.php';
    $scope = 'identity:read home.details:read home.operation:read home.operation.overlay:write home.webhooks';
      $postdata = 'grant_type='.$grant_type.'&code='.$code.'&redirect_uri='.urlencode($redirect_uri).'&scope='.urlencode($scope);
   }
 
   $url = 'https://auth.tado.com/oauth/token';
   $response = httpQuery($url, 'POST', $postdata, 'tado_oauth2');
   $params = sdk_json_decode($response);

   if ($params['error'] != '')
   {
   
      die("Erreur lors de l'authentification:"." [".$params['error'].'] (grant_type='.$grant_type.'), vous pouvez lier à nouveau votre compte en cliquant sur [Lier à nouveau] depuis la configuration de votre périphérique'."\n\n".$response);
   }

   // 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']);
      if ($code != '')
      {
         saveVariable('code', $code);
      }
   }
   else if ($access_token == '')
   {
      die("Erreur lors de l'authentification, vous pouvez lier à nouveau votre compte en cliquant sur [Lier à nouveau] depuis la configuration de votre périphérique\n\n".$response);
   }
}

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><?
  echo '<br>';
   echo "Sélectionnez un identifiant thermostat et copiez/collez le dans le paramètrage de votre périphérique Tado eedomus :";
  echo '<br>';
  echo '<br>';

   $url = $api_url.'api/v2/me';
   $response = sdk_tado_api_call($url);
   $json = sdk_json_decode($response);
   
   // aucune "homes", au cas où
   if (sizeof($json['homes']) <= 0)
   {
      var_dump($url, $response);
   }
   
   for ($i = 0; $i < sizeof($json['homes']); $i++)
   {
    $home_id = $json['homes'][$i]['id'];
    $home_name = $json['homes'][$i]['name'];
    //echo $home_id ." - ".$home_name.'<br>';
   
    $url = $api_url.'api/v2/homes/'.$home_id.'/zones';
    $response = sdk_tado_api_call($url);
    $zones = sdk_json_decode($response);
   
    // aucune "zones" désormais ?
    if (sizeof($zones) <= 0)
    {
         echo $home_name . " (## ERROR : "."Aucune Zone configurée, vérifiez votre compte Tado".") : ";
         echo ' <input onclick="this.select();" type="text" size="40" readonly="readonly" value="'.$home_id.'" />'.'<br>';
    }
      else
      {
         for ($j = 0; $j < sizeof($zones); $j++)
         {
            $zone_id = $zones[$j]['id'];
            $zone_name = $zones[$j]['name'];
            echo $home_name ." / ".$zone_name. " : ";
            echo ' <input onclick="this.select();" type="text" size="40" readonly="readonly" value="'.$home_id.'-'.$zone_id.'" />'.'<br>';
         }
      }
   }
}
else if ($_GET['mode'] == 'get')
{

  $home_zone = getArg('home_zone');
  $tok = explode('-', $home_zone);
  $home_id = $tok[0];
  $zone_id = $tok[1];
 
  $last_xml_success = loadVariable('last_xml_success_'.$home_id.'_'.$zone_id);
  if ((time() - $last_xml_success) / 60 < $CACHE_DURATION)
  {
    sdk_header('text/xml');
    $cached_xml = loadVariable('cached_xml_'.$home_id.'_'.$zone_id);
    echo $cached_xml;
    die();
  }
 
   $url = $api_url.'api/v2/homes/'.$home_id.'/zones/'.$zone_id.'/state';
   $response = sdk_tado_api_call($url);
   $json = sdk_json_decode($response);

   if ($json['errors'] != '')
   {
      die($response);
   }

   $inside_temperature = $json['sensorDataPoints']['insideTemperature']['celsius'];
   $humidity = $json['sensorDataPoints']['humidity']['percentage'];
   $overlay = $json['overlay'];
 
  $setting_type = $overlay['type'];
  $setpoint = $overlay['setting']['temperature']['celsius'];
 
  if ($setting_type == '')
  {
    $setting_type = "AUTO";
    $setpoint = $json['setting']['temperature']['celsius'];
  }
 
  if ($setpoint == '')
  {
    $setpoint = 0; // Off eedomus
  }

   $fan_speed = sdk_get_tado_value('fan_speed', 'MIDDLE', $home_id, $zone_id);
   if ($json['setting']['mode'] != '')
   {
      saveVariable('zone_mode_'.$home_id.'_'.$zone_id, $json['setting']['mode']);
   }
   $zone_mode = sdk_get_tado_value('zone_mode', 'HEAT', $home_id, $zone_id);
   
   $swing = sdk_get_tado_value('swing', 'OFF', $home_id, $zone_id);
   
   
   $power = $json['setting']['power'];
      
   $xml = "<tado>";
   
   $xml .= '<cached>0</cached>';
   $xml .= "<inside_temperature>$inside_temperature</inside_temperature>";
   $xml .= "<humidity>$humidity</humidity>";
   $xml .= "<setting_type>$setting_type</setting_type>";
   $xml .= "<setpoint>$setpoint</setpoint>";
   $xml .= "<fan_speed>$fan_speed</fan_speed>";
   $xml .= "<zone_mode>$zone_mode</zone_mode>";
   $xml .= "<power>$power</power>";
   $xml .= "<swing>$swing</swing>";
   
   $xml .= "</tado>";
   
  sdk_header('text/xml');
   echo $xml;
   
   $xml = str_replace('<cached>0</cached>', '<cached>1</cached>', $xml);
   if ($xml != '') // non vide
  {
    saveVariable('cached_xml_'.$home_id.'_'.$zone_id, $xml);
    saveVariable('last_xml_success_'.$home_id.'_'.$zone_id, time());
  }
}
else if ($_GET['setpoint_temperature'] != '' || $_GET['zone_mode'] != '' || $_GET['fan_speed'] != '' || $_GET['swing'] != '')
{
   // type = HEATING, AIR_CONDITIONING, HOT_WATER
   $type = getArg('type');
   $home_zone = getArg('home_zone');
   $tok = explode('-', $home_zone);
   $home_id = $tok[0];
   $zone_id = $tok[1];
 
   if ($_GET['setpoint_temperature'] != '')
   {
      saveVariable('setpoint_temperature_'.$home_id.'_'.$zone_id, $_GET['setpoint_temperature']);
   }
   $setpoint_temperature = sdk_get_tado_value('setpoint_temperature', 0, $home_id, $zone_id);
   
   // mode =  COOL, HEAT
   if ($_GET['zone_mode'] != '')
   {
      saveVariable('zone_mode_'.$home_id.'_'.$zone_id, $_GET['zone_mode']);
   }
   $zone_mode = sdk_get_tado_value('zone_mode', 'HEAT', $home_id, $zone_id);
   
   // fan speeds : fanSpeed = LOW, MIDDLE, HIGH, AUTO
   if ($_GET['fan_speed'] != '')
   {
      saveVariable('fan_speed_'.$home_id.'_'.$zone_id, $_GET['fan_speed']);
   }
   $fan_speed = sdk_get_tado_value('fan_speed', 'MIDDLE', $home_id, $zone_id);
   

   // Swings : swing = ON, OFF
   if ($_GET['swing'] != '')
   {
      saveVariable('swing_'.$home_id.'_'.$zone_id, $_GET['swing']);
   }
   $swing = sdk_get_tado_value('swing', 'OFF', $home_id, $zone_id);

  if ($setpoint_temperature == 0)
   {
      $power = 'OFF';
   }
   else
   {
      $power = 'ON';
   }
   
   if ($zone_mode == 'COOL' || $type == 'AIR_CONDITIONING')
   {
      $json_cooling = ', "fanLevel" :"'.$fan_speed.'"';
   }
   
  // ## ERROR : Querying [https://my.tado.com/api/v2/homes/557101/zones/1/overlay] with [{"setting": {"type": "AIR_CONDITIONING", "power": "ON", "mode": "HEAT", "temperature": {"celsius": 23}, "fanSpeed" :"AUTO"},"termination": {"type": "MANUAL"}}] {"errors":[{"code":"setting.notSupported","title":"swing not in supported swings [OFF, ON]"}]}
 
  // {"errors":[{"code":"setting.notSupported","title":"swing not allowed in mode HEAT"}]}
 
   if ($zone_mode == 'COOL' || ($type == 'AIR_CONDITIONING' && $zone_mode != 'HEAT'))
   {
      $json_cooling .= ', "verticalSwing" :"'.$swing.'"';
   }
   
  $json = '{"setting": {"type": "'.$type.'", "power": "'.$power.'", "mode": "'.$zone_mode.'", "temperature": {"celsius": '.$setpoint_temperature.'}, "fanLevel" :"'.$fan_speed.'", "verticalSwing" :"'.$swing.'"},"termination": {"type": "MANUAL"}}';


  $url = $api_url.'api/v2/homes/'.$home_id.'/zones/'.$zone_id.'/overlay';
   $response = sdk_tado_api_call($url, 'PUT', $json);
 
  if (strpos($response, 'errors') !== false)
  {
     echo "## ERROR : Querying [$url] with [$json]\n";
  }
 
  echo $response;
   
   saveVariable('last_xml_success_'.$home_id.'_'.$zone_id, 0);
}

?>


Pièces jointes:
ventilation.JPG
ventilation.JPG (98.64 Kio) Consulté 2302 fois
Auteur:  Ben34 [ 13 Jan 2022 14:44 ]
Sujet du message:  Re: tado climatisation V3

Bonjour Freezecool,

Je viens de voir ton retour, je ne suis plus sur ce site actuellement et ne retournerais pas sur place avant plusieurs mois.. je ne pense pas pouvoir le faire à distance, je ne pourrais pas voir si ça marche (actuellement sur eedomus, l'ordre et l'etat passe bien mais sur le tado, rien n'arrive)
je suis donc obligé de reporter ce probleme à mon retour..
par contre, je n'ai vraiment pas le niveau informatique pour comprendre à quoi sert le script :D

l'ideal pour moi serait effectivement une mise à jour du plugin par la team

je te tiens au courant

Benoit
Auteur:  Ben34 [ 14 Juin 2022 16:21 ]
Sujet du message:  Re: tado climatisation V3

Bonjour Freezecool,

je viens de relire ton post... en fait, j'y comprends rien et ca ne vient pas de toi... :)
Je crains que ça ne dépasse largement mes capacité.. je ne sais pas comment mettre à jour mes V2 ni comment modifier le script (??) je ne sais meme pas ce qu'est un script (?)

merci
Benoit
Page 1 sur 1 Le fuseau horaire est UTC+1 heure