Support des produits connectés Legrand®

Les messages de l'équipe eedomus

Re: Support des produits connectés Legrand®

Messagepar LouLouFactory » 31 Mai 2022 21:38

Vinky a écrit:
LouLouFactory a écrit:Merci. J’ai compris la manip. En revanche ce qui est bizarre c’est que quand tu recrée le périphérique tu as un message Dereure te disant que le nombre de caractères n’est pas le bon. Je suis d’accord avec toi c’est pas acceptable de faire ce type de changement sans délai de prévenance des utilisateurs

J'ai uniquement modifié l'existant, j'ai donc pas pu observer ce que tu évoques.

De ton côté, tu as des volets piloté par interrupteur LeGrand ou uniquement des bubendorff ?


Comme toi. Idiammant
Étrange qd même de devoir tout renommer en supprimer des caractères de la variable.
LouLouFactory
 
Messages : 25
Inscription : 05 Juin 2019

Re: Support des produits connectés Legrand®

Messagepar Vinky » 31 Mai 2022 21:53

J'ai les 2 pour ma part.

J'ai réussi à les faire fonctionner (les volets via interrupteur LeGrand), pour ceux qui sont également ennuyé (en attendant que le support résolve le souci pour de bon) il faut remplacer la ligne 193 :

Code : Tout sélectionner
  if (substr($device_type, 0, 2) == 'NB')

par

Code : Tout sélectionner
  if (substr($device_type, 0, 2) == 'NB' || $device_type == 'NLV')

EDIT :

J'ai réussi à faire fonctionner également les scenarios :D :

Pour l'utiliser/exploiter :

1. Remplacer le code du script par celui-ci dessous.
2. Mettre en [VAR2] du périphérique le nom du scénario parmi les suivants:

  • home
  • away
  • wake_up
  • bedtime
  • custom_1
  • custom_2
  • custom_3
  • custom_4

3. Créer une valeur avec pour action :

Code : Tout sélectionner
&action=[RAW_VALUE]&sceneID=[VAR2]

Et cela fonctionne.

A noter que j'ai ajouté dans mon code :
  • les champs Home ID et Bridge ID qui sont très utiles en cas de dépannage/test.
  • Un petit libellé en complément des codes, ne pas hésiter à la compléter.
  • Récupération de l'état des volets (qui ne fonctionnait plus, mais encore en test, j'ai parfois des erreurs)

NB : Voici le code modifié (@Connected Object : Je te laisse regarder pour éventuellement le mettre comme code officiel lors de l'ajout d'un périphérique) :

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


$api_url = 'https://api.netatmo.com';

$CACHE_DURATION = 1; // minutes

// nettoyage d'éventuels codes précédents
if ($_GET['mode'] == 'verify' && $_GET['oauth_code'] != '')
{
  saveVariable('access_token', '');
  saveVariable('refresh_token', '');
}

// on reprend le dernier refresh_token seulement s'il correspond au même code
$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é
if ($access_token == '')
{
  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
  {
    $code = getArg('oauth_code');
 
    // 1ère utilisation aprés obtention du code
    $grant_type = 'authorization_code';
    $redirect_uri = 'https://secure.eedomus.com/sdk/plugins/legrand_netatmo/callback.php';
    //$scope = 'read_station';
    $postdata = 'grant_type='.$grant_type.'&code='.$code.'&redirect_uri='.$redirect_uri; //.'&scope='.$scope;
  }
 
  // https://api.netatmo.com/oauth2/token
  $response = httpQuery($api_url.'/oauth2/token', 'POST', $postdata, 'legrand_netatmo2_oauth');
  $params = sdk_json_decode($response);
  if ($params['error'] != '')
  {
    die("Erreur lors de l'authentification: <b>".$params['error'].'</b> (grant_type='.$grant_type.' '.$params['error_description'].'), 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']);
    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);
  }
}

$headers = array("Authorization: Bearer $access_token");

if ($_GET['mode'] == 'verify')
{
  $url = $api_url.'/api/homesdata';
  $result = httpQuery($url, 'GET', /*$post*/ NULL, 'legrand_netatmo_oauth', $headers);
 
  $ar = sdk_json_decode($result);
  //var_dump($url, $ar['body']);
  foreach ($ar['body']['homes'] as $p)
  {
    $html .= 'Domicile : <b>'.$p['name'].'</b><br>'; //  ('.$p['id'].')
    $home_id = $p['id'];
   
    foreach ($p['modules'] as $m)
    {
      if ($m['bridge'] != '')
      {
        $m['name'] = utf8_decode($m['name']);
        //$m['name'] = htmlentities($m['name'], ENT_COMPAT, "UTF-8");
       
        // http://www.eteks.com/tips/tip3.html
        $m['name'] = str_replace('\u00e0', '&agrave;', $m['name']);
        $m['name'] = str_replace('\u00e2', '&acirc;', $m['name']);
        $m['name'] = str_replace('\u00e4', '&auml;', $m['name']);
        $m['name'] = str_replace('\u00e7', '&ccedil;', $m['name']);
        $m['name'] = str_replace('\u00e8', '&egrave;', $m['name']);
        $m['name'] = str_replace('\u00e9', '&eacute;', $m['name']);
        $m['name'] = str_replace('\u00ea', '&ecirc;', $m['name']);
        $m['name'] = str_replace('\u00eb', '&euml;', $m['name']);
        $m['name'] = str_replace('\u00ee', '&icirc;', $m['name']);
        $m['name'] = str_replace('\u00ef', '&iuml;', $m['name']);
        $m['name'] = str_replace('\u00f4', '&ocirc;', $m['name']);
        $m['name'] = str_replace('\u00f6', '&ouml;', $m['name']);
        $m['name'] = str_replace('\u00f9', '&ugrave;', $m['name']);
        $m['name'] = str_replace('\u00fb', '&ucirc;', $m['name']);
        $m['name'] = str_replace('\u00fc', '&uuml;', $m['name']);
         
        $clean_module_id = str_replace(':', '', $m['id']);
        saveVariable('device_type_'.$clean_module_id, $m['type']);

        saveVariable('home_'.$clean_module_id, $home_id);
        saveVariable('bridge_'.$clean_module_id, $m['bridge']);

       
        // Traduction code
        // Début ajout Vinky
        $list = array("NBS","NLP","NLT","NLV","NLF","NLM","NLLF","NLPM","NLFN","NLPT","NBR");
        $newlist = array("Volet Battant Bubendorff (NBS)","Prise (NLP)","Interrupteur (NLT)","Volet (NLV)","Lumière (NLF)","Micromodule lumière (NLM)","Ventillation (NLLF)","Prise mobile (NLPM)","Lumière avec Neutre NLFN","Télérupteur (NLPT)","Volet roulant Bubendorff (NBR)");
        $m['type'] = str_replace($list,$newlist,$m['type']);
        // Fin ajout Vinky
        $html .= '<span style="margin-left: 60px;">Périphérique de type <b>"'.$m['type'].'"</b> : <b>'.$m['name'].'</b>, identifiant : <input style="background-color: #DDD;" type="text" value="'.$m['id'].'" onclick="this.select();" readonly></span><br>';
      }
    }
  }

  ?><!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 "Votre compte <b>Legrand&reg; with Netatmo</b> est maintenant associé à eedomus.";
  echo '<br>';
  echo '<br>';
  echo "Voici vos identifiants domiciles et périphériques :";
  echo '<br>';
  echo '<br>';
  echo '<span><b>Home ID : </b><input style="background-color: #DDD;" type="text" value="'.$home_id.'" onclick="this.select();" readonly></span><br>';
  // Début ajout Vinky
  $bridge_id = loadVariable('bridge_'.$clean_module_id);
  echo '<span><b>Bridge ID : </b><input style="background-color: #DDD;" type="text" value="'.$bridge_id.'" onclick="this.select();" readonly></span><br>';
  echo '<br>';
  // Fin ajout Vinky
  echo $html;
  die();
}


$module_id = getArg('module_id');
$clean_module_id = str_replace(':', '', $module_id);
$home_id = loadVariable('home_'.$clean_module_id);
$bridge_id = loadVariable('bridge_'.$clean_module_id);

if ($_GET['action'] != '')
{
  $device_type = loadVariable('device_type_'.$clean_module_id);

  if ($device_type == 'automation')
  {
    // -1 = shutter stop
    if ($_GET['action'] >= -1 && $_GET['action'] <= 100)
    {
      // https://portal.developer.legrand.com/docs/services/59e9ad7f8bda9e0b3caea28c/operations/setautomationstatus
      $post = '{ "ids": [ "string" ], "level": '.$_GET['action'].' }';
    }
    else
    {
      echo "Unsupported action value for automation [".$_GET['action']."]";
      die();
    }
  }
  else
  {
    if ($_GET['action'] > 0)
    {
      $verb = 'on';
      $action_json = 'true';
    }
    else if ($_GET['action'] <= 0)
    {
      $verb = 'on';
      $action_json = 'false';
    }
    else
    {
      echo "Unsupported action value [".$_GET['action']."]";
      die();
    }
  }
 
  $headers[] = 'Content-Type: application/json';

 
  // Bubendorff shutters
  // NBG (gateway)
  // NBR (roller shutter)
  // NBO (orientable shutter)
  // NBS (swing shutter)
  // roller : target_position
 
  if (substr($device_type, 0, 2) == 'NB' || $device_type == 'NLV') // Modif Vinky
  {
    $verb = 'target_position';
    $action_json = $_GET['action'];
  }
  else if ($device_type == 'NLF')
  {
    $more_action = ', "brightness": '.($_GET['action']*1);
  }
 
  // scenario :
  // Début ajout Vinky
  if(isset($_GET['sceneID']))
  {
    $sceneID = $_GET['sceneID'];
    $post = '{"home": { "id": "'.$home_id.'", "modules": [ { "id": "'.$bridge_id.'", "scenario": "'.$sceneID.'"} ] } }'; 
  }
  else
  // Fin ajout Vinky
  {
    $post = '{"home": { "id": "'.$home_id.'", "modules": [ { "id": "'.$module_id.'", "'.$verb.'": '.$action_json.', "bridge": "'.$bridge_id.'" '.$more_action.'} ] } }';

  }

  $url = $api_url.'/api/setstate';
  saveVariable('last_xml_success_'.$home_id, 0); // force cache expiration
  $result = httpQuery($url, 'POST', $post, 'legrand_netatmo2_oauth', $headers, $use_cookies = false, $ignore_errors = false);
  die($result);
}

$last_xml_success = loadVariable('last_xml_success_'.$home_id);
if ((time() - $last_xml_success) / 60 < $CACHE_DURATION)
{
  sdk_header('text/xml');
  $cached_xml = loadVariable('cached_xml_'.$home_id);
  echo $cached_xml;
  die();
}


$cached_xml = '<?xml version="1.0" encoding="utf8" ?>';
$cached_xml .= '<legrand>';
$cached_xml .= '<cached>0</cached>';

// Get all home's modules status
$url = $api_url.'/api/homestatus?home_id='.$home_id;
$result = httpQuery($url, 'GET', /*$post*/ NULL, 'legrand_netatmo2_oauth', $headers);
//var_dump($result);
$ar = sdk_json_decode($result);
if ($ar["errors"] != '' || $ar["statusCode"] == 403)
{
  // { "statusCode": 403, "message": "Out of call volume quota. Quota will be replenished in 15:09:04." }
  // ex: {"errors":[{"userMessage":"","internalMessage":"gateway unreachable","code":41}]}
  die($result);
}

foreach ($ar['body']['home']['modules'] as $id => $m)
{
 
  if ($m['on'] !== '' || $m['level'] !== '')
  {
   
    if ($m['on'] == true)
    {
      if ($m['level'] > 0) // dimmers
      {
        $value = $m['level'];
      }
      else
      {
        $value = 100;
      }
    }
    else
    {
      if ($m['level'] > 0) // automations
      {
        $value = $m['level'];
      }
      else
      {
        $value = 0;
      }
    }
    // Début ajout Vinky
    if ($m['type'] == 'NLV' || $m['type'] == 'NBS' ) //Volets
  {
        $value = $m[2];
  }
    // Fin ajout Vinky
    $clean_module_id = str_replace(':', '', $m['id']);
    if ($m['type'] != '')
    {
      saveVariable('device_type_'.$clean_module_id, $m['type']);
    }
    // consumption pour la rétrocompatibilité avec l'ancienne API
    $xml_content .= '<device id="'.$m['id'].'"><value>'.$value.'</value><type>'.$m['type'].'</type><reachable>'.$m['reachable'].'</reachable><power>'.$m['power'].'</power><consumption>'.$m['power'].'</consumption></device>';
  }
}

// permet d'avoir une mise en forme plus lisible dans un browser
sdk_header('text/xml');
// XML de sortie

$cached_xml .= $xml_content;
$cached_xml .= '</legrand>';
echo $cached_xml;

$cached_xml = str_replace('<cached>0</cached>', '<cached>1</cached>', $cached_xml);
if ($xml_content != '') // non vide
{
  saveVariable('cached_xml_'.$home_id, $cached_xml);
  saveVariable('last_xml_success_'.$home_id, time());
}
?>
Eedomus+
- Legrand/Netatmo (prises/interrupteurs/Volets/VMC) + Bubendorff via idiamant
- Fibaro (Lum./Ouverture/Détecteur)
- Clim Daikin
- Capteurs Aqara (Therm/Ouverture)
- Aeotec (Alarme/Détecteurs)
- Foscam (C2/2xC2M)
- Roborock S7
- Thermostat Nest
Vinky
 
Messages : 85
Inscription : 04 Mars 2021
Localisation : 69

Re: Support des produits connectés Legrand®

Messagepar 95wolf » 01 Juin 2022 08:51

Hello la team (@bart on se sent bien seul ...)

J'ai ce message d'erreur lorsque je fais lier à nouveau
## ERROR : Variable name [device_type_0004740000138975#1] must be a string with characters from [a-zA-Z0-9_]

Effectivement j'ai un interrupteur double filaire dont les identifiants sont :
0004740000138975#1
0004740000138975#2

Qui peut m'aider à modifier le script pour prendre en compte ce type de device ?

Merci.

Ps : qui peut me rassurer sur la santé financiere de Connected Object et son effectif ? Que je sache si je vais devoir basculer ou non sur une autre box bientôt ? Merci.
95wolf
 
Messages : 40
Inscription : 26 Nov 2021

Re: Support des produits connectés Legrand®

Messagepar Bart (eedomus team) » 01 Juin 2022 08:59

Vinky a écrit:
LouLouFactory a écrit:PS : Si j'ai bien compris, le support est passé sur la nouvelle API Netatmo exit donc l'ancienne api ?


Bonjour, c'est ça. L'ancienne API Netatmo a été dépréciée, elle ne fonctionne plus depuis quelques jours maintenant, pour les relais/prises/ampoules mais les volets semblaient encore fonctionner.
Bart (eedomus team)
 
Messages : 394
Inscription : 23 Sep 2013

Re: Support des produits connectés Legrand®

Messagepar Bart (eedomus team) » 01 Juin 2022 09:09

Vinky a écrit:NB : Voici le code modifié (@Connected Object : Je te laisse regarder pour éventuellement le mettre comme code officiel lors de l'ajout d'un périphérique)


Merci beaucoup pour le partage ! Le script a été publié (avec quelques retouches mineures), vous pouvez donc cliquer sur "Vérifier les mises à jour de legrand_netatmo.php" afin de le mettre à jour.
Bart (eedomus team)
 
Messages : 394
Inscription : 23 Sep 2013

Re: Support des produits connectés Legrand®

Messagepar Bart (eedomus team) » 01 Juin 2022 09:19

95wolf a écrit:Hello la team (@bart on se sent bien seul ...)

J'ai ce message d'erreur lorsque je fais lier à nouveau
## ERROR : Variable name [device_type_0004740000138975#1] must be a string with characters from [a-zA-Z0-9_]


Bonjour,

nous avons mis en place une modification du script pour gérer ce cas, si ce n'était pas OK pourriez vous ouvrir un ticket (comme ça nous aurions le code API du périphérique)
Bart (eedomus team)
 
Messages : 394
Inscription : 23 Sep 2013

Re: Support des produits connectés Legrand®

Messagepar Vinky » 01 Juin 2022 11:32

Bart (eedomus team) a écrit:
Vinky a écrit:NB : Voici le code modifié (@Connected Object : Je te laisse regarder pour éventuellement le mettre comme code officiel lors de l'ajout d'un périphérique)


Merci beaucoup pour le partage ! Le script a été publié (avec quelques retouches mineures), vous pouvez donc cliquer sur "Vérifier les mises à jour de legrand_netatmo.php" afin de le mettre à jour.


Merci pour l’info, content que ça serve. Avez-vous réussi à corrigé le souci de valeur des volets roulants ? (J’ai tenté un truc qui marche puis plus, j’ai dû refaire une contre modification à tort :P
Eedomus+
- Legrand/Netatmo (prises/interrupteurs/Volets/VMC) + Bubendorff via idiamant
- Fibaro (Lum./Ouverture/Détecteur)
- Clim Daikin
- Capteurs Aqara (Therm/Ouverture)
- Aeotec (Alarme/Détecteurs)
- Foscam (C2/2xC2M)
- Roborock S7
- Thermostat Nest
Vinky
 
Messages : 85
Inscription : 04 Mars 2021
Localisation : 69

Re: Support des produits connectés Legrand®

Messagepar Bart (eedomus team) » 01 Juin 2022 11:36

Nous pensons que oui, en utilisant :
$value = $m['current_position'];

Mais il faudra nous le confirmer, nous n'avons pas de module volet en ce moment dans notre labo
Bart (eedomus team)
 
Messages : 394
Inscription : 23 Sep 2013

Re: Support des produits connectés Legrand®

Messagepar 95wolf » 01 Juin 2022 15:02

Bart (eedomus team) a écrit:
95wolf a écrit:Hello la team (@bart on se sent bien seul ...)

J'ai ce message d'erreur lorsque je fais lier à nouveau
## ERROR : Variable name [device_type_0004740000138975#1] must be a string with characters from [a-zA-Z0-9_]


Bonjour,

nous avons mis en place une modification du script pour gérer ce cas, si ce n'était pas OK pourriez vous ouvrir un ticket (comme ça nous aurions le code API du périphérique)


Rebonjour Bart,

Le listing des devices fonctionne maintenant.
Par contre lorsque je teste cela n'allume ni n'éteint l'interrupteur correspondant (le script fonctionne par contre avec mes prises).

J'ouvre un ticket numéro 803520
Merci.
95wolf
 
Messages : 40
Inscription : 26 Nov 2021

Re: Support des produits connectés Legrand®

Messagepar Vinky » 01 Juin 2022 16:27

Bart (eedomus team) a écrit:Nous pensons que oui, en utilisant :
$value = $m['current_position'];

Mais il faudra nous le confirmer, nous n'avons pas de module volet en ce moment dans notre labo

Cela semble bien marcher.

J’avais pourtant fait comme ça initialement mais cela n’avait pas semblé fonctionner. Parfait si c’est le cas.

Merci pour la réactivité et le travail d’équipe :)
Eedomus+
- Legrand/Netatmo (prises/interrupteurs/Volets/VMC) + Bubendorff via idiamant
- Fibaro (Lum./Ouverture/Détecteur)
- Clim Daikin
- Capteurs Aqara (Therm/Ouverture)
- Aeotec (Alarme/Détecteurs)
- Foscam (C2/2xC2M)
- Roborock S7
- Thermostat Nest
Vinky
 
Messages : 85
Inscription : 04 Mars 2021
Localisation : 69

Re: Support des produits connectés Legrand®

Messagepar 95wolf » 01 Juin 2022 17:04

95wolf a écrit:
Bart (eedomus team) a écrit:
95wolf a écrit:Hello la team (@bart on se sent bien seul ...)

J'ai ce message d'erreur lorsque je fais lier à nouveau
## ERROR : Variable name [device_type_0004740000138975#1] must be a string with characters from [a-zA-Z0-9_]


Bonjour,

nous avons mis en place une modification du script pour gérer ce cas, si ce n'était pas OK pourriez vous ouvrir un ticket (comme ça nous aurions le code API du périphérique)


Rebonjour Bart,

Le listing des devices fonctionne maintenant.
Par contre lorsque je teste cela n'allume ni n'éteint l'interrupteur correspondant (le script fonctionne par contre avec mes prises).

J'ouvre un ticket numéro 803520
Merci.


Merci Bart cela fonctionne parfaitement pour mes interrupteurs doubles suite à ta modification.

J'ai ouvert un autre ticket 733617 pour mon radiateur qui ne fonctionne pas.

Merci encore, on va finir par peaufiner ce script plus rapidement que prévu sachant que normalement on aurait eu 2 ans avant que l'ancienne API ne soit complètement deprecated (merci Legrand).
95wolf
 
Messages : 40
Inscription : 26 Nov 2021

Re: Support des produits connectés Legrand®

Messagepar Vinky » 01 Juin 2022 17:08

95wolf a écrit:
Merci Bart cela fonctionne parfaitement pour mes interrupteurs doubles suite à ta modification.

J'ai ouvert un autre ticket 733617 pour mon radiateur qui ne fonctionne pas.

Merci encore, on va finir par peaufiner ce script plus rapidement que prévu sachant que normalement on aurait eu 2 ans avant que l'ancienne API ne soit complètement deprecated (merci Legrand).

Ce ne serait pas un souci de variable des fois ?

J’ai bien mon interrupteur de fonctionnel chez moi ? Si tu essai de créer un nouveau périphérique cela ne fonctionne pas non plus ? (Le miens n’est pas double, la subtilité est peut-être là)
Eedomus+
- Legrand/Netatmo (prises/interrupteurs/Volets/VMC) + Bubendorff via idiamant
- Fibaro (Lum./Ouverture/Détecteur)
- Clim Daikin
- Capteurs Aqara (Therm/Ouverture)
- Aeotec (Alarme/Détecteurs)
- Foscam (C2/2xC2M)
- Roborock S7
- Thermostat Nest
Vinky
 
Messages : 85
Inscription : 04 Mars 2021
Localisation : 69

Re: Support des produits connectés Legrand®

Messagepar 95wolf » 01 Juin 2022 17:11

Vinky a écrit:
95wolf a écrit:
Merci Bart cela fonctionne parfaitement pour mes interrupteurs doubles suite à ta modification.

J'ai ouvert un autre ticket 733617 pour mon radiateur qui ne fonctionne pas.

Merci encore, on va finir par peaufiner ce script plus rapidement que prévu sachant que normalement on aurait eu 2 ans avant que l'ancienne API ne soit complètement deprecated (merci Legrand).

Ce ne serait pas un souci de variable des fois ?

J’ai bien mon interrupteur de fonctionnel chez moi ? Si tu essai de créer un nouveau périphérique cela ne fonctionne pas non plus ? (Le miens n’est pas double, la subtilité est peut-être là)


Bart a effectivement fait des modifications sur les variables (remplacé # par -) et je crois aussi sur le script.
Pour info avec l'ancienne API ce type de périphérique double n'était pas géré.
95wolf
 
Messages : 40
Inscription : 26 Nov 2021

Re: Support des produits connectés Legrand®

Messagepar 95wolf » 01 Juin 2022 19:24

Vinky a écrit:
Bart (eedomus team) a écrit:
Vinky a écrit:NB : Voici le code modifié (@Connected Object : Je te laisse regarder pour éventuellement le mettre comme code officiel lors de l'ajout d'un périphérique)


Merci beaucoup pour le partage ! Le script a été publié (avec quelques retouches mineures), vous pouvez donc cliquer sur "Vérifier les mises à jour de legrand_netatmo.php" afin de le mettre à jour.


Merci pour l’info, content que ça serve. Avez-vous réussi à corrigé le souci de valeur des volets roulants ? (J’ai tenté un truc qui marche puis plus, j’ai dû refaire une contre modification à tort :P


Bonsoir Vinky,

Est ce que je lis bien qu'avec Eedomus je pourrais controler le % d'ouverture des volets ?

Actuellement en version du firmware 47, cette fonction n'est pas disponible depuis Home+ pour les interrupteurs filaires (cette fonction existe pour la version micromodules)

Merci.
95wolf
 
Messages : 40
Inscription : 26 Nov 2021

Re: Support des produits connectés Legrand®

Messagepar Vinky » 01 Juin 2022 19:35

Sauf si j’ai raté quelque chose, je ne pense pas. D’ailleurs l’information de la position exacte ne remonte pas.

Nous avons :

-1 : stop
0 - fermé
50 - partiel (non déclaré dans les valeurs par défaut, mais si tu ajoutes la valeur en non activable, tu auras la visualisation lorsqu’un volet est fermé partiellement)
100 - ouvert.

Après, une macro fait le job pour le partiel. : tu chronomètres le temps que met le volet à se fermer (ou s’ouvrir) et tu crées une macro : ouverture x%. C’est ce que j’ai fait pour que les volets se ferment partiellement lorsqu’il fait plein soleil sur les vitres et chaud. (C’est fiable à +/- 10cm donc plutôt pas mal)
Eedomus+
- Legrand/Netatmo (prises/interrupteurs/Volets/VMC) + Bubendorff via idiamant
- Fibaro (Lum./Ouverture/Détecteur)
- Clim Daikin
- Capteurs Aqara (Therm/Ouverture)
- Aeotec (Alarme/Détecteurs)
- Foscam (C2/2xC2M)
- Roborock S7
- Thermostat Nest
Vinky
 
Messages : 85
Inscription : 04 Mars 2021
Localisation : 69

Re: Support des produits connectés Legrand®

Messagepar 95wolf » 01 Juin 2022 19:38

Vinky a écrit:Sauf si j’ai raté quelque chose, je ne pense pas. D’ailleurs l’information de la position exacte ne remonte pas.

Nous avons :

-1 : stop
0 - fermé
50 - partiel (non déclaré dans les valeurs par défaut, mais si tu ajoutes la valeur en non activable, tu auras la visualisation lorsqu’un volet est fermé partiellement)
100 - ouvert.

Après, une macro fait le job pour le partiel. : tu chronomètres le temps que met le volet à se fermer (ou s’ouvrir) et tu crées une macro : ouverture x%. C’est ce que j’ai fait pour que les volets se ferment partiellement lorsqu’il fait plein soleil sur les vitres et chaud. (C’est fiable à +/- 10cm donc plutôt pas mal)


C'est clair merci Vinky
Ps : je viens de découvrir que cet état ne remonte pas correctement dans HomeKit d'Apple (volet ne répond pas)
95wolf
 
Messages : 40
Inscription : 26 Nov 2021

Re: Support des produits connectés Legrand®

Messagepar Vinky » 02 Juin 2022 07:07

Tu parles en général ou lorsque 'l'ouverture est partielle ?

Je viens de tester, hors ouverture partielle, aucun souci de mon côté.

As-tu essayé de redémarrer le serveur HomeKit de l'Eedomus ? Es-tu sûr que se sont les bons périphériques ? (est-ce que tu n'aurais pas créé des nouveaux et se sont les anciens qui seraient utilisés)

EDIT : Je viens de me rendre compte que je te raconte des bêtises, les volets, je les ai déclaré dans HomeKit directement via l'application Legrand et non pas pas par la box Eedomus.
Eedomus+
- Legrand/Netatmo (prises/interrupteurs/Volets/VMC) + Bubendorff via idiamant
- Fibaro (Lum./Ouverture/Détecteur)
- Clim Daikin
- Capteurs Aqara (Therm/Ouverture)
- Aeotec (Alarme/Détecteurs)
- Foscam (C2/2xC2M)
- Roborock S7
- Thermostat Nest
Vinky
 
Messages : 85
Inscription : 04 Mars 2021
Localisation : 69

Re: Support des produits connectés Legrand®

Messagepar 95wolf » 02 Juin 2022 08:23

Oui aucun lien avec Eedomus.
Possible que ce soit un bug chez moi car je n'utilise pas de concentrateur Apple, juste une connexion locale.
Mieux vaut ne pas poluer ce thread avec du Hors Sujet, je clos ce point c'était juste une remarque.

Vinky a écrit:Tu parles en général ou lorsque 'l'ouverture est partielle ?

Je viens de tester, hors ouverture partielle, aucun souci de mon côté.

As-tu essayé de redémarrer le serveur HomeKit de l'Eedomus ? Es-tu sûr que se sont les bons périphériques ? (est-ce que tu n'aurais pas créé des nouveaux et se sont les anciens qui seraient utilisés)

EDIT : Je viens de me rendre compte que je te raconte des bêtises, les volets, je les ai déclaré dans HomeKit directement via l'application Legrand et non pas pas par la box Eedomus.
95wolf
 
Messages : 40
Inscription : 26 Nov 2021

Re: Support des produits connectés Legrand®

Messagepar dommarion » 05 Juin 2022 11:37

Vinky a écrit:J'ai les 2 pour ma part.

J'ai réussi à les faire fonctionner (les volets via interrupteur LeGrand), pour ceux qui sont également ennuyé (en attendant que le support résolve le souci pour de bon) il faut remplacer la ligne 193 :

Code : Tout sélectionner
  if (substr($device_type, 0, 2) == 'NB')

par

Code : Tout sélectionner
  if (substr($device_type, 0, 2) == 'NB' || $device_type == 'NLV')

EDIT :

J'ai réussi à faire fonctionner également les scenarios :D :

Pour l'utiliser/exploiter :

1. Remplacer le code du script par celui-ci dessous.
2. Mettre en [VAR2] du périphérique le nom du scénario parmi les suivants:

  • home
  • away
  • wake_up
  • bedtime
  • custom_1
  • custom_2
  • custom_3
  • custom_4

3. Créer une valeur avec pour action :

Code : Tout sélectionner
&action=[RAW_VALUE]&sceneID=[VAR2]

Et cela fonctionne.

A noter que j'ai ajouté dans mon code :
  • les champs Home ID et Bridge ID qui sont très utiles en cas de dépannage/test.
  • Un petit libellé en complément des codes, ne pas hésiter à la compléter.
  • Récupération de l'état des volets (qui ne fonctionnait plus, mais encore en test, j'ai parfois des erreurs)

NB : Voici le code modifié (@Connected Object : Je te laisse regarder pour éventuellement le mettre comme code officiel lors de l'ajout d'un périphérique) :

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


$api_url = 'https://api.netatmo.com';

$CACHE_DURATION = 1; // minutes

// nettoyage d'éventuels codes précédents
if ($_GET['mode'] == 'verify' && $_GET['oauth_code'] != '')
{
  saveVariable('access_token', '');
  saveVariable('refresh_token', '');
}

// on reprend le dernier refresh_token seulement s'il correspond au même code
$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é
if ($access_token == '')
{
  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
  {
    $code = getArg('oauth_code');
 
    // 1ère utilisation aprés obtention du code
    $grant_type = 'authorization_code';
    $redirect_uri = 'https://secure.eedomus.com/sdk/plugins/legrand_netatmo/callback.php';
    //$scope = 'read_station';
    $postdata = 'grant_type='.$grant_type.'&code='.$code.'&redirect_uri='.$redirect_uri; //.'&scope='.$scope;
  }
 
  // https://api.netatmo.com/oauth2/token
  $response = httpQuery($api_url.'/oauth2/token', 'POST', $postdata, 'legrand_netatmo2_oauth');
  $params = sdk_json_decode($response);
  if ($params['error'] != '')
  {
    die("Erreur lors de l'authentification: <b>".$params['error'].'</b> (grant_type='.$grant_type.' '.$params['error_description'].'), 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']);
    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);
  }
}

$headers = array("Authorization: Bearer $access_token");

if ($_GET['mode'] == 'verify')
{
  $url = $api_url.'/api/homesdata';
  $result = httpQuery($url, 'GET', /*$post*/ NULL, 'legrand_netatmo_oauth', $headers);
 
  $ar = sdk_json_decode($result);
  //var_dump($url, $ar['body']);
  foreach ($ar['body']['homes'] as $p)
  {
    $html .= 'Domicile : <b>'.$p['name'].'</b><br>'; //  ('.$p['id'].')
    $home_id = $p['id'];
   
    foreach ($p['modules'] as $m)
    {
      if ($m['bridge'] != '')
      {
        $m['name'] = utf8_decode($m['name']);
        //$m['name'] = htmlentities($m['name'], ENT_COMPAT, "UTF-8");
       
        // http://www.eteks.com/tips/tip3.html
        $m['name'] = str_replace('\u00e0', '&agrave;', $m['name']);
        $m['name'] = str_replace('\u00e2', '&acirc;', $m['name']);
        $m['name'] = str_replace('\u00e4', '&auml;', $m['name']);
        $m['name'] = str_replace('\u00e7', '&ccedil;', $m['name']);
        $m['name'] = str_replace('\u00e8', '&egrave;', $m['name']);
        $m['name'] = str_replace('\u00e9', '&eacute;', $m['name']);
        $m['name'] = str_replace('\u00ea', '&ecirc;', $m['name']);
        $m['name'] = str_replace('\u00eb', '&euml;', $m['name']);
        $m['name'] = str_replace('\u00ee', '&icirc;', $m['name']);
        $m['name'] = str_replace('\u00ef', '&iuml;', $m['name']);
        $m['name'] = str_replace('\u00f4', '&ocirc;', $m['name']);
        $m['name'] = str_replace('\u00f6', '&ouml;', $m['name']);
        $m['name'] = str_replace('\u00f9', '&ugrave;', $m['name']);
        $m['name'] = str_replace('\u00fb', '&ucirc;', $m['name']);
        $m['name'] = str_replace('\u00fc', '&uuml;', $m['name']);
         
        $clean_module_id = str_replace(':', '', $m['id']);
        saveVariable('device_type_'.$clean_module_id, $m['type']);

        saveVariable('home_'.$clean_module_id, $home_id);
        saveVariable('bridge_'.$clean_module_id, $m['bridge']);

       
        // Traduction code
        // Début ajout Vinky
        $list = array("NBS","NLP","NLT","NLV","NLF","NLM","NLLF","NLPM","NLFN","NLPT","NBR");
        $newlist = array("Volet Battant Bubendorff (NBS)","Prise (NLP)","Interrupteur (NLT)","Volet (NLV)","Lumière (NLF)","Micromodule lumière (NLM)","Ventillation (NLLF)","Prise mobile (NLPM)","Lumière avec Neutre NLFN","Télérupteur (NLPT)","Volet roulant Bubendorff (NBR)");
        $m['type'] = str_replace($list,$newlist,$m['type']);
        // Fin ajout Vinky
        $html .= '<span style="margin-left: 60px;">Périphérique de type <b>"'.$m['type'].'"</b> : <b>'.$m['name'].'</b>, identifiant : <input style="background-color: #DDD;" type="text" value="'.$m['id'].'" onclick="this.select();" readonly></span><br>';
      }
    }
  }

  ?><!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 "Votre compte <b>Legrand&reg; with Netatmo</b> est maintenant associé à eedomus.";
  echo '<br>';
  echo '<br>';
  echo "Voici vos identifiants domiciles et périphériques :";
  echo '<br>';
  echo '<br>';
  echo '<span><b>Home ID : </b><input style="background-color: #DDD;" type="text" value="'.$home_id.'" onclick="this.select();" readonly></span><br>';
  // Début ajout Vinky
  $bridge_id = loadVariable('bridge_'.$clean_module_id);
  echo '<span><b>Bridge ID : </b><input style="background-color: #DDD;" type="text" value="'.$bridge_id.'" onclick="this.select();" readonly></span><br>';
  echo '<br>';
  // Fin ajout Vinky
  echo $html;
  die();
}


$module_id = getArg('module_id');
$clean_module_id = str_replace(':', '', $module_id);
$home_id = loadVariable('home_'.$clean_module_id);
$bridge_id = loadVariable('bridge_'.$clean_module_id);

if ($_GET['action'] != '')
{
  $device_type = loadVariable('device_type_'.$clean_module_id);

  if ($device_type == 'automation')
  {
    // -1 = shutter stop
    if ($_GET['action'] >= -1 && $_GET['action'] <= 100)
    {
      // https://portal.developer.legrand.com/docs/services/59e9ad7f8bda9e0b3caea28c/operations/setautomationstatus
      $post = '{ "ids": [ "string" ], "level": '.$_GET['action'].' }';
    }
    else
    {
      echo "Unsupported action value for automation [".$_GET['action']."]";
      die();
    }
  }
  else
  {
    if ($_GET['action'] > 0)
    {
      $verb = 'on';
      $action_json = 'true';
    }
    else if ($_GET['action'] <= 0)
    {
      $verb = 'on';
      $action_json = 'false';
    }
    else
    {
      echo "Unsupported action value [".$_GET['action']."]";
      die();
    }
  }
 
  $headers[] = 'Content-Type: application/json';

 
  // Bubendorff shutters
  // NBG (gateway)
  // NBR (roller shutter)
  // NBO (orientable shutter)
  // NBS (swing shutter)
  // roller : target_position
 
  if (substr($device_type, 0, 2) == 'NB' || $device_type == 'NLV') // Modif Vinky
  {
    $verb = 'target_position';
    $action_json = $_GET['action'];
  }
  else if ($device_type == 'NLF')
  {
    $more_action = ', "brightness": '.($_GET['action']*1);
  }
 
  // scenario :
  // Début ajout Vinky
  if(isset($_GET['sceneID']))
  {
    $sceneID = $_GET['sceneID'];
    $post = '{"home": { "id": "'.$home_id.'", "modules": [ { "id": "'.$bridge_id.'", "scenario": "'.$sceneID.'"} ] } }'; 
  }
  else
  // Fin ajout Vinky
  {
    $post = '{"home": { "id": "'.$home_id.'", "modules": [ { "id": "'.$module_id.'", "'.$verb.'": '.$action_json.', "bridge": "'.$bridge_id.'" '.$more_action.'} ] } }';

  }

  $url = $api_url.'/api/setstate';
  saveVariable('last_xml_success_'.$home_id, 0); // force cache expiration
  $result = httpQuery($url, 'POST', $post, 'legrand_netatmo2_oauth', $headers, $use_cookies = false, $ignore_errors = false);
  die($result);
}

$last_xml_success = loadVariable('last_xml_success_'.$home_id);
if ((time() - $last_xml_success) / 60 < $CACHE_DURATION)
{
  sdk_header('text/xml');
  $cached_xml = loadVariable('cached_xml_'.$home_id);
  echo $cached_xml;
  die();
}


$cached_xml = '<?xml version="1.0" encoding="utf8" ?>';
$cached_xml .= '<legrand>';
$cached_xml .= '<cached>0</cached>';

// Get all home's modules status
$url = $api_url.'/api/homestatus?home_id='.$home_id;
$result = httpQuery($url, 'GET', /*$post*/ NULL, 'legrand_netatmo2_oauth', $headers);
//var_dump($result);
$ar = sdk_json_decode($result);
if ($ar["errors"] != '' || $ar["statusCode"] == 403)
{
  // { "statusCode": 403, "message": "Out of call volume quota. Quota will be replenished in 15:09:04." }
  // ex: {"errors":[{"userMessage":"","internalMessage":"gateway unreachable","code":41}]}
  die($result);
}

foreach ($ar['body']['home']['modules'] as $id => $m)
{
 
  if ($m['on'] !== '' || $m['level'] !== '')
  {
   
    if ($m['on'] == true)
    {
      if ($m['level'] > 0) // dimmers
      {
        $value = $m['level'];
      }
      else
      {
        $value = 100;
      }
    }
    else
    {
      if ($m['level'] > 0) // automations
      {
        $value = $m['level'];
      }
      else
      {
        $value = 0;
      }
    }
    // Début ajout Vinky
    if ($m['type'] == 'NLV' || $m['type'] == 'NBS' ) //Volets
  {
        $value = $m[2];
  }
    // Fin ajout Vinky
    $clean_module_id = str_replace(':', '', $m['id']);
    if ($m['type'] != '')
    {
      saveVariable('device_type_'.$clean_module_id, $m['type']);
    }
    // consumption pour la rétrocompatibilité avec l'ancienne API
    $xml_content .= '<device id="'.$m['id'].'"><value>'.$value.'</value><type>'.$m['type'].'</type><reachable>'.$m['reachable'].'</reachable><power>'.$m['power'].'</power><consumption>'.$m['power'].'</consumption></device>';
  }
}

// permet d'avoir une mise en forme plus lisible dans un browser
sdk_header('text/xml');
// XML de sortie

$cached_xml .= $xml_content;
$cached_xml .= '</legrand>';
echo $cached_xml;

$cached_xml = str_replace('<cached>0</cached>', '<cached>1</cached>', $cached_xml);
if ($xml_content != '') // non vide
{
  saveVariable('cached_xml_'.$home_id, $cached_xml);
  saveVariable('last_xml_success_'.$home_id, time());
}
?>

Merci Vinky pour ce travail. Il semblerait que la version publiée ne prenne pas en compte les modifications qui avaint été faites sur les équimepents legrand (remote, heater) ainsi que la gestion du compteur et autre modifications.
Pourrais tu reprendre le script que je t'avais envoyé et que tu avais adapté, car il contenait beaucoup de modifications qui semblent non intégrées dans le nouveau script.
Encore merci pour ta contribution.
dommarion
OpenWeather|Phases soleil|HeatzyV2|Concaténateur|HP Yamaha|SomfyV3|Epson|Seuils n étages|Baie 2 vantaux|Deezer|Intégrale|Authorization Digest|TV Philips|SmartThings|fonction PHP|Tuya Smartlife|CozyTouch2|mySMS
dommarion
 
Messages : 579
Inscription : 28 Déc 2020

Re: Support des produits connectés Legrand®

Messagepar Vinky » 05 Juin 2022 12:05

dommarion a écrit:Merci Vinky pour ce travail. Il semblerait que la version publiée ne prenne pas en compte les modifications qui avaint été faites sur les équimepents legrand (remote, heater) ainsi que la gestion du compteur et autre modifications.
Pourrais tu reprendre le script que je t'avais envoyé et que tu avais adapté, car il contenait beaucoup de modifications qui semblent non intégrées dans le nouveau script.
Encore merci pour ta contribution.
dommarion

Dommarion : En fait, c’est l’équipe Eedomus qui a mis à jour le script en utilisant le nouvelle api netatmo. (Ils semblent en avoir profité pour revoir le code et le fonctionnement). Je n’ai fait que le compléter pour y rajouter la gestion des scénarios et des volets roulants.

N’ayant pas les périphériques que tu évoques, le plus efficace étant que tu les rajoutes dans le script. L’équipe semble apporté les ajouts proposés au script officiel. Pour le compteur de requête, tu peux voir pour le rajouter si tu le souhaites au passage.
Eedomus+
- Legrand/Netatmo (prises/interrupteurs/Volets/VMC) + Bubendorff via idiamant
- Fibaro (Lum./Ouverture/Détecteur)
- Clim Daikin
- Capteurs Aqara (Therm/Ouverture)
- Aeotec (Alarme/Détecteurs)
- Foscam (C2/2xC2M)
- Roborock S7
- Thermostat Nest
Vinky
 
Messages : 85
Inscription : 04 Mars 2021
Localisation : 69

PrécédentSuivant

Retour vers Nouveautés & Annonces

Qui est en ligne ?

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