Forum eedomus
https://forum.eedomus.com/

Support des produits connectés Legrand®
https://forum.eedomus.com/viewtopic.php?f=11&t=7608
« Précédent  Page 12 sur 15  Suivant »
Auteur:  LouLouFactory [ 31 Mai 2022 21:38 ]
Sujet du message:  Re: Support des produits connectés Legrand®

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.
Auteur:  Vinky [ 31 Mai 2022 21:53 ]
Sujet du message:  Re: Support des produits connectés Legrand®

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());
}
?>
Auteur:  95wolf [ 01 Juin 2022 08:51 ]
Sujet du message:  Re: Support des produits connectés Legrand®

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.
Auteur:  Bart (eedomus team) [ 01 Juin 2022 08:59 ]
Sujet du message:  Re: Support des produits connectés Legrand®

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.
Auteur:  Bart (eedomus team) [ 01 Juin 2022 09:09 ]
Sujet du message:  Re: Support des produits connectés Legrand®

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.
Auteur:  Bart (eedomus team) [ 01 Juin 2022 09:19 ]
Sujet du message:  Re: Support des produits connectés Legrand®

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)
Auteur:  Vinky [ 01 Juin 2022 11:32 ]
Sujet du message:  Re: Support des produits connectés Legrand®

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
Auteur:  Bart (eedomus team) [ 01 Juin 2022 11:36 ]
Sujet du message:  Re: Support des produits connectés Legrand®

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
Auteur:  95wolf [ 01 Juin 2022 15:02 ]
Sujet du message:  Re: Support des produits connectés Legrand®

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.
Auteur:  Vinky [ 01 Juin 2022 16:27 ]
Sujet du message:  Re: Support des produits connectés Legrand®

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 :)
Auteur:  95wolf [ 01 Juin 2022 17:04 ]
Sujet du message:  Re: Support des produits connectés Legrand®

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).
Auteur:  Vinky [ 01 Juin 2022 17:08 ]
Sujet du message:  Re: Support des produits connectés Legrand®

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à)
Auteur:  95wolf [ 01 Juin 2022 17:11 ]
Sujet du message:  Re: Support des produits connectés Legrand®

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é.
Auteur:  95wolf [ 01 Juin 2022 19:24 ]
Sujet du message:  Re: Support des produits connectés Legrand®

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.
Auteur:  Vinky [ 01 Juin 2022 19:35 ]
Sujet du message:  Re: Support des produits connectés Legrand®

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)
Auteur:  95wolf [ 01 Juin 2022 19:38 ]
Sujet du message:  Re: Support des produits connectés Legrand®

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)
Auteur:  Vinky [ 02 Juin 2022 07:07 ]
Sujet du message:  Re: Support des produits connectés Legrand®

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.
Auteur:  95wolf [ 02 Juin 2022 08:23 ]
Sujet du message:  Re: Support des produits connectés Legrand®

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.
Auteur:  dommarion [ 05 Juin 2022 11:37 ]
Sujet du message:  Re: Support des produits connectés Legrand®

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
Auteur:  Vinky [ 05 Juin 2022 12:05 ]
Sujet du message:  Re: Support des produits connectés Legrand®

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.
Page 12 sur 15 Le fuseau horaire est UTC+1 heure