Nouvel API HUE V2

Discussion et échanges de scripts pour la box eedomus

Nouvel API HUE V2

Messagepar soundfab » 15 Nov 2021 22:20

Bonsoir , croyez-vous qu'eedomus se mettra à jour avec le control des lumières via leur nouvelle API.
https://blog.encausse.net/2021/11/14/new-hue-api-v2/

Merci à tous , Cordialement Soundfab.
soundfab
 
Messages : 127
Inscription : 27 Nov 2017

Re: Nouvel API HUE V2

Messagepar gabvoir » 22 Déc 2021 15:02

Bonjour,
Au vue des capacités de cette nouvelle API V2 ca ne serait pas du luxe !
https://developers.meethue.com/develop/hue-api-v2/
Elle permettrait notamment d'éditer les scènes dynamiques, récupérer les capteurs avancé des motion sensor (température, lumière) et aussi récupérer en direct l'état des accessoires (bouton appuyé, mouvement détecté), enregistrer la box dans l'évènement HUE pour ne pas être obligé de faire du polling.
Ca serait franchement une grosse avancé pour la box.
Home assistant profite déjà de cette API V2, je suis à 2 doigts de changer de box domotique :cry:
gabvoir
 
Messages : 192
Inscription : 24 Juin 2015

Re: Nouvel API HUE V2

Messagepar Caronesse » 20 Sep 2023 19:42

Bonsoir à tous, je ne créer pas de nouveau sujet, la nouvelle api hue v2 prend en charge la température du hue Motion sensor, cependant quand je crée celui ci, cela ne fonctionne pas, erreur valeur lue non numérique… quelqu’un a une soluce ?
Eedomus plus et rfxcom, philips hue x60, arrosage, coupure eau et détec fuite, alarme, détec présence/ouverture, 7 volets roulant, chauff élec x6, poêle Pellet netatmo, 3 cam netatmo, iRobot roomba et bravajet, tout gérer sur eedomus (HomeKit Et Google)
Caronesse
 
Messages : 67
Inscription : 02 Fév 2019

Re: Nouvel API HUE V2

Messagepar Caronesse » 25 Sep 2023 05:21

Personne ?
Eedomus plus et rfxcom, philips hue x60, arrosage, coupure eau et détec fuite, alarme, détec présence/ouverture, 7 volets roulant, chauff élec x6, poêle Pellet netatmo, 3 cam netatmo, iRobot roomba et bravajet, tout gérer sur eedomus (HomeKit Et Google)
Caronesse
 
Messages : 67
Inscription : 02 Fév 2019

Re: Nouvel API HUE V2

Messagepar Yann74 » 05 Nov 2023 13:22

Bonjour,

recherche mon plugin 'Plugin Philips Hue V2' dans le store.

https://secure.eedomus.com/pages/doc.ph ... d#produits

c'est déjà intégré
Philips Hue, Netatmo Caméra et Météo, Qubino fi pilote, Zlinky_TIC
Yann74
 
Messages : 26
Inscription : 21 Mai 2022

Re: Nouvel API HUE V2

Messagepar Fab » 08 Mars 2025 23:32

Bonjour,

Je rencontre un problème avec l'API. Quand je cherche à lister les périphériques, j'ai :

Empty reply from server

Pour l'historique, je l'ai installé il y quelques mois, la liste s'est affichée correctement, je l'ai d'ailleurs enregistrée en PDF. Mais ensuite ça c'est mal passée, du coup j'ai supprimé. Depuis j'y suis revenu plusieurs fois, mais impossible de relister les périphériques, sachant que j'en ai des nouveaux.

Par contre, pour vérifier sur l'API fonctionne, j'ai ajouté un plug dont j'avais l'identifiant, et cela fonctionne.

Le problème c'est de ne plus avoir la liste et je ne comprends pas. Pour info j'ai un autre logiciel qui permet de se connecter aussi au hub et qui me renvoi la liste sans problème (mais c'est évidemment pas les même identifiants)

Merci de votre aide
Fab
 
Messages : 26
Inscription : 09 Fév 2022

Re: Nouvel API HUE V2

Messagepar Razor » 22 Juil 2025 17:28

Bonjour,

j'utilise ce très pratique outil. Merci!
est il fonctionnel avec l'api "Toogle" .. problème chez moi

Merci
EEDOMUS+ / RFXcom / IPX800 / Objets ZWAVE (75) / ZIGATE + 70 objets Zigbee / Onduleur APC / ZIBASE 1 (de-commissionnée)/ Controleur Zwave ACT Homepro ZCS201 **
Razor
 
Messages : 155
Inscription : 11 Déc 2015

Re: Nouvel API HUE V2

Messagepar Fab » 09 Déc 2025 00:27

Bonsoir,

Je désespère et tourne en rond sur l'API V2. A force de désespoir, j'ai fini, par erreur, par supprimer le compte sur account.philips-hue qui me liait au bridge sur l'ancienne API, qui fonctionnait par adresse IP. Du coup plus rien ne fonctionne et je ne trouve pas comment recréer un compte (je pense impossible vu que ça n'existe plus sur le store).

J'avais pas mal de règles dont d'importantes qui géraient l'extinction auto dont une surtout suite à le reprise du courant (coupure détectée par mon onduleur). Coupure de courant qui arrive fréquemment sur ma commune

Ca fait des mois à intervalle régulier que je me penche sur la V2 mais rien n'y fait. Ce qui m'arrive : lorsque que créé le premier périphérique, je clic sur le lien pour me connecter au hub => OK cela fonctionne car si je supprime le compte sur hue, je vois bien qu'il m'en créé un nouveau et j'ai la page HTML qui confirme que le lien est fait et me demande de fermer la page

Je vois aussi dans les jours qui suivent que l'eedomus utilise le compte (dernière utilisation affichée sur le site de philips et je vois bien qu'il y a des accès réguliers)

Par contre si je cherche à afficher les produits connectés pour avoir les identifiants, j'ai invariablement la réponse sur une page HTML : 1

En espérant trouver de l'aide, je vous remercie par avance
Fab
 
Messages : 26
Inscription : 09 Fév 2022

Re: Nouvel API HUE V2

Messagepar Fab » 31 Jan 2026 01:57

Hello,

je suis le seul à rencontrer des problèmes sur l'APi Hue ? Je désespère car j'ai plusieurs dizaines de règles dont certaines étaient de l'ordre de la sécurité, que j'ai besoin de renforcer (beaucoup de vol en ce moment dans ma campagne, les voisins sont visités un à un)

Dans ma config initiale qui marchait très bien c'était une version plus ancienne encore que les deux dispos sur le store, qui fonctionnait avec l'IP. La V1 a fonctionné chez moi en //, la V2 a fonctionné la première fois que je l'ai testé sur une ampoule. Depuis plus rien. J'arrive à lier le pont mais après il ne trouve plus les périph en V2. En V1 il y a une erreur de certificat.
Fab
 
Messages : 26
Inscription : 09 Fév 2022

Re: Nouvel API HUE V2

Messagepar gabvoir » 08 Fév 2026 00:43

Salut à tous,
Je suis passé sur un bridge pro, du coup j'en ai profité pour testé cette api V2. De mon côté aucun problème.
Simplement j'ai du mettre à jour le script du plugin afin de prendre en charge les zones et leurs scène. En fait tout était déjà géré suffisait simplement de les afficher sur la page qui liste les périphériques.
Voilà le code pour ceux que ca peut intéressé.
Code : Tout sélectionner
<?php

/**
Couleurs des icones:
rouge : #FF0000
orange : #FF7400
vert : #01AD1B
bleu : #000FFF

Liste des actions:
1. reset : topology (hueDatas) and debug infos.
2. debug : ON/OFF debug mode
3. debugInfos : dump the traces debugInfos 
4. hueDatas : dump the traces debugInfos 
5. link_helper : connect to the Philips Hub
6. topology : update the var hueDatas, aka a cache with the identifiers and capacities (light, power, etc..)
7. getState : get the state for a device
8. setSate : set the state for a device
9. topology_helper : display an html page with the attached devices.
**/

$html = '<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
<title>hue and eedomus</title>

<style>
   html
   {
      background:#222;
      color: #fff;
      font-family: "proxima-nova","Helvetica Neue",Helvetica,Arial,sans-serif;
   }

   header, section {width: 100%; display: block;}
   header img, header h1 {display: inline; margin: 25px; vertical-align: middle;}
   section {margin-left: 25px;}
   form label, form input, form button {margin: 15px 0px; display: block;}
   a:link, a:visited { color: #0078e7; }
   a:hover { color: red; }

   fieldset
   {
      border: 0 none;
      margin: 0;
      padding: 0.35em 0 0.75em;
   }

   input[type="text"]
   {
      -moz-box-sizing: border-box;
      border: 1px solid #ccc;
      border-radius: 4px;
      box-shadow: 0 1px 3px #ddd inset;
      padding: 0.5em 0.6em;
   }

   button
   {
      font-size: 100%;
      padding: 0.5em 1em;
      text-decoration: none;
      -moz-user-select: none;
      cursor: pointer;
      line-height: normal;
      text-align: center;
      vertical-align: baseline;
      white-space: nowrap;
      border: 0 none rgba(0, 0, 0, 0);
      border-radius: 2px;
      background-color: #0078e7;
      color: #fff;
   }
</style>

</head>
<body>

<header>
   <img alt="Hue Personal Wireless Lighting" src="https://secure.eedomus.com/sdk/plugins/hue/hue-logo.png">
   <h1>Philips hue and eedomus</h1>
</header>';

$end = '</body></html>';


$hueDatas = loadVariable('hueDatas');

//API
$apiv2_resource = "/clip/v2/resource";

// remplace adresse mac et cle api par *** dans les traces  de debug.
function sdk_parse_encrypt($var, $encrypt)
{
   $result = null;
   foreach ($var  as $key => $val)
   {
      $keyencrypt = $key;
      $temp = $keyencrypt;
      $count = 0;
      $temp = str_replace(array_keys($encrypt), $encrypt, $keyencrypt, $count);
      if ($count)
         $keyencrypt = $temp;
            
      if (is_array($val))
      {
         $result[$keyencrypt] = sdk_parse_encrypt($val, $encrypt);
      }
      else
      {
         $count = 0;
         $valencrypt = $val;
         $temp = str_replace(array_keys($encrypt), $encrypt, $valencrypt, $count);
         if ($count)
            $valencrypt  = $temp;
         $result[$keyencrypt] =  $valencrypt;
      }      
   }
   return $result;
}

// affiche la variable $var
function sdk_print_debug($var, $bencrypt)
{
   if ($bencrypt || $bencrypt=="false")
   {
      $hueDatas = loadVariable('hueDatas');
      $encrypt_keys =  loadVariable('encrypt_keys');
      
      if (empty($encrypt_keys))
      {
         var_dump($var);
      }
      else
         var_dump (sdk_parse_encrypt($var, $encrypt_keys));
   }
   else
      var_dump($var);
}

// corrige les problemes d'encodage
function sdk_htmlentities($str)
{
   return htmlentities($str, ENT_QUOTES, "UTF-8");
   //preg_replace('/\\\\u([\da-fA-F]{4})/', '&#x\1;', $str);
}

// ajoute un trace de debug
function sdk_append_traces($key, $value, $time=null)
{
   $debug = loadVariable('debug');
   if ($debug=='on')
   {
      $debugInfos = loadVariable('debugInfos');
      if (is_null($time))
         $debugInfos[date("d-m-Y H:i:s",time())][$key]=$value;
      else if (array_key_exists($key, $debugInfos))
      {
         if (is_array($debugInfos[date("d-m-Y H:i:s",$time)][$key]))
            $debugInfos[date("d-m-Y H:i:s",$time)][$key][]=$value;
         else
         {
            $newvalue = array($debugInfos[date("d-m-Y H:i:s",$time)][$key], $value);
            $debugInfos[date("d-m-Y H:i:s",$time)][$key]=$newvalue;
         }
      }
      else
         $debugInfos[date("d-m-Y H:i:s",$time)][$key]=$value;
      saveVariable('debugInfos', $debugInfos);
   }
}

// à revoir pour utilisaion ou suppression
function sdk_check_connexion($hue_datas)
{
   $response = httpQuery('https://'.$hue_datas['ip'].$api_hue.$api_resource, 'GET');
   if (false == strpos($response, "Error"))
   {
      return true;
   }
   else
   {
      sdk_append_traces('sdk_check_connexion', $response);
      return false;
   }
}

function sdk_HSVtoRGBHue($iH, $S, $V)
{
   $H = $iH/65535*360;
   $s = $S/254   ;
    $v = $V/254;
    $C = $s*$v;
    $X = $C*(1-abs(fmod($H/60.0, 2)-1));
    $m = $v-$C;
    $r = $g = $b = 0;
   
   if($H >= 0 && $H < 60){
        $r = $C; $g = $X; $b = 0;
    }
    else if($H >= 60 && $H < 120){
        $r = $X; $g = $C; $b = 0;
    }
    else if($H >= 120 && $H < 180){
        $r = 0; $g = $C; $b = $X;
    }
    else if($H >= 180 && $H < 240){
        $r = 0; $g = $X; $b = $C;
    }
    else if($H >= 240 && $H < 300){
        $r = $X; $g = 0; $b = $C;
    }
    else{
        $r = $C; $g = 0; $b = $X;
    }
    $R = $r+$m;
    $G = $g+$m;
    $B = $b+$m;
   
   return array('r'=>round(100*$R), 'g'=>round(100*$G), 'b'=>round(100*$B));
}

$action = getArg('action');

switch ($action)
{
   case 'reset':
   {
      $mac = getArg('mac');
      saveVariable('debugInfos', array());
      saveVariable('hueDatas', array($mac=>array('key'=>$hueDatas[$mac]['key'])));
      echo "<xml><status>ok</status></xml";
      break;
   }
   case 'debug':
   {
      $arg = getArg('status', false);
         
      if ($arg === "off")
      {
         saveVariable('debug', 'off');
         saveVariable('debugInfos', array());
      }
      else if ($arg === "on")
         saveVariable('debug', 'on');

      $status = loadVariable('debug');
            
      echo '<xml><status>'.$status.'</status></xml>';
      break;
   }
   case "debugInfos":
   {
      $debugInfos = loadVariable('debugInfos');
      $bencrypt = getArg('encrypt', false, true);
      sdk_print_debug($debugInfos, $bencrypt);
      break;
   }
   case 'hueDatas':
{
   $bencrypt = getArg('encrypt', false, true);
   sdk_print_debug($hueDatas, $bencrypt);
   break;
}
   case 'link_helper':
{
   $mac= getArg('mac');
   $hue_bridge_ip = sdk_get_ip_from_ip_or_mac($mac);
   $hue_controller_id = $_GET['controller_id'];
   $post = '{"devicetype":"eedomus#pluginhue", "generateclientkey":true}';
   $response= httpQuery("https://$hue_bridge_ip/api", 'POST', $post);
   $json = sdk_json_decode($response);
   sdk_append_traces('link_helper_api_json', $json);
   
   if (array_key_exists('error', $json[0]))
   {
      if ($json[0]['error']['description']=== "link button not pressed")
      {
         // push button
         if ($json[0]['error']['description']=== "link button not pressed")
         {
            $exec = $_GET['exec'];
            $url_to_call = "http://localhost/script/?exec=$exec&action=link_helper&mac=$mac";
            if($hue_controller_id !== null)
               $url_to_call .= "&controller_id=$hue_controller_id";
            echo $html;
            echo '<section>';
            echo "<form>";
            echo "<fieldset>";
            echo "<input type=\"hidden\"  name=\"url\"  value=\"$url_to_call\">";
            if($hue_controller_id !== null)
               echo "<input type=\"hidden\"  name=\"controller_id\"  value=\"$hue_controller_id\">";
            echo "<label>Please press the button on the bridge and confirm.</label>";
            echo "<button type=\"submit\">Confirm</button>";
            echo "</fieldset>";
            echo "</form>";
            echo '</section>';
            echo $end;
         }   
      }
      else
      {
         echo $html;
         echo '<div>'.$json[0]['error']['description'].'</div>';
         echo $end;
      }
   }
   else
   {
      //store infos
      $hue_application_key = $json[0]['success']['username'];
      $hueDatas[$mac]['key'] = $hue_application_key;
      saveVariable('hueDatas', $hueDatas);
      $encrypt_keys = array($mac => "***", $hue_application_key => "***");
      saveVariable('encrypt_keys', $encrypt_keys);
      echo $html;
      echo "<div>Application linked with the hub. Close this window</div>";
      echo $end;
   }
   break;
}
case 'topology':
{
   $mac = getArg('mac');
   $hue_bridge_ip = sdk_get_ip_from_ip_or_mac($mac);
   $key = $hueDatas[$mac]['key'];
   
   // TO REMOVE
   $encrypt_keys = array($mac => "***", $key => "***");
   saveVariable('encrypt_keys', $encrypt_keys);
   //
   
   if (empty($key))
   {
      echo "<xml><status>-1</status></xml>";
      die();
   }
   
   $header = array("hue-application-key:".$hueDatas[$mac]['key']);
   
   $response= httpQuery('https://'.$hue_bridge_ip.$apiv2_resource, NULL, NULL, NULL,$header);
   $json_device = sdk_json_decode($response);
      
   if (is_null($json_device) || count($json_device['errors']))
   {
      $time = time();
      sdk_append_traces('topology_helper_devices_header', $header, $time);
      sdk_append_traces('topology_helper_devices_json', $json_device, $time);
      echo "<xml><status>0</status></xml>";
   }
   else
   {
      $types = array('grouped_light', 'device', 'zone', 'scene');
      foreach ($json_device['data'] as $device)
      {
         if (in_array($device['type'], $types))
         {
            $hueDatas[$mac]['devices'][$device['id']]['id_v2'] = $device['id'];
            $hueDatas[$mac]['devices'][$device['id']]['id_v1'] = $device['id_v1'];
            
            //Zones commit
            if (isset($device['metadata']['name'])) {
               $hueDatas[$mac]['devices'][$device['id']]['name'] = $device['metadata']['name'];
            }
            if (isset($device['children'])) {
               $hueDatas[$mac]['devices'][$device['id']]['children'] = $device['children'];
            }
            
            foreach ($device['services'] as $service)
            {
               $hueDatas[$mac]['devices'][$device['id']][$service['rtype']] = $service['rid'];
            }
         }
      }
      saveVariable('hueDatas', $hueDatas);
      echo "<xml><status>1</status></xml>";
   }
   
   break;
}
case 'getState':
{
   $mac = getArg('mac');
   $hue_bridge_ip = sdk_get_ip_from_ip_or_mac($mac);
   $id = getArg('id');
   $type = getArg('type');
   $time = time();
   $eeDevice = getArg('eedomus_controller_module_id');
   
   //$hueDatas = loadVariable('hueDatas');
   sdk_header('text/xml');

   sdk_append_traces('getState',$id,$time);
   sdk_append_traces('getState',$type,$time);
   
   if (array_key_exists($id,$hueDatas[$mac]['devices']))
   {
      sdk_append_traces('getState_device',$hueDatas[$mac]['devices'][$id],$time);
      $battery_state = null;
         
      if (array_key_exists('device_power', $hueDatas[$mac]['devices'][$id]))
      {
         $header_V2 = array('hue-application-key:'.$hueDatas[$mac]['key']);
         $url_V2 = 'https://'.$hue_bridge_ip.$apiv2_resource.'/device_power/'.$hueDatas[$mac]['devices'][$id]['device_power'];
         $response = httpQuery($url_V2, 'GET', NULL, NULL, $header_V2, false, false, $infos);
         $json = sdk_json_decode($response);
         $eeDevice = getArg('eedomus_controller_module_id');
         setBattery($eeDevice, $json['data'][0]['power_state']['battery_level']);
         $battery_state = $json['data'][0]['power_state']['battery_state'];      
      }
      switch ($type)
         {
            case 'light':
            {
               $url_V1 = 'https://'.$hue_bridge_ip.'/api/'.$hueDatas[$mac]['key'].$hueDatas[$mac]['devices'][$id]['id_v1'];
               $header_V2 = array('hue-application-key:'.$hueDatas[$mac]['key']);
               $url_V2 = 'https://'.$hue_bridge_ip.$apiv2_resource.'/'.$type.'/'.$hueDatas[$mac]['devices'][$id][$type];
               $json = httpQuery($url_V2, 'GET', NULL, NULL, $header_V2);
               $response = sdk_json_decode($json);
               sdk_append_traces('getState', $json, $time);
               // ERROR : ["responseV1"]=> string(94) "[{"error":{"type":2,"address":"/lights/14/state","description":"body contains invalid json"}}]"
               $status = ($response['data'][0]['on']['on'])?"on":"off";
               if ($response['data'][0]['mode']!=="normal")
                  $status = $response['data'][0]['mode'];
               else if($status=="on")
               {
                     $url_V1 = 'https://'.$hue_bridge_ip.'/api/'.$hueDatas[$mac]['key'].$hueDatas[$mac]['devices'][$id]['id_v1'];
                     $json = httpQuery($url_V1, 'GET');
                     $responseV1 = sdk_json_decode($json);
                     $rgb = sdk_HSVtoRGBHue($responseV1['state']['hue'], $responseV1['state']['sat'], $responseV1['state']['bri']);
                     $status_rgb=$rgb['r'].','.$rgb['g'].','.$rgb['b'];
                     $values = getPeriphValueList($eeDevice);
                     sdk_append_traces("status_rgb", $status_rgb, $time);
                     sdk_append_traces("values",$values, $time);
                     if (array_key_exists($status_rgb, $values))
                        $status = $status_rgb;
               }
               
               echo "<xml><status>$status</status></xml>";
               
               break;
            }
            case 'button':
            {
               $status = 'disconnected';
               if (isset($battery_state))
                  $status = $battery_state;
               echo "<xml><status>$status</status></xml>";
               break;
            }
            case 'temperature':
            {
               $header_V2 = array('hue-application-key:'.$hueDatas[$mac]['key']);
               $url_V2 = 'https://'.$hue_bridge_ip.$apiv2_resource.'/'.$type.'/'.$hueDatas[$mac]['devices'][$id][$type];
               $response = httpQuery($url_V2, 'GET', NULL, NULL, $header_V2, false, false, $infos);
               $json = sdk_json_decode($response);
               $temperature = -100;
               if ($json['data'][0]['enabled'] && $json['data'][0]['temperature']['temperature_valid'])
                  $temperature = $json['data'][0]['temperature']['temperature'];
               
               echo '<xml><temperature>'.$temperature.'</temperature></xml>';
               break;
            }
            case 'grouped_light':
            {
               $header_V2 = array('hue-application-key:'.$hueDatas[$mac]['key']);
               $url_V2 = 'https://'.$hue_bridge_ip.$apiv2_resource.'/'.$type.'/'.$hueDatas[$mac]['devices'][$id]['id_v2'];
               $json = httpQuery($url_V2, 'GET', NULL, NULL, $header_V2, false, false, $infos);
               $response = sdk_json_decode($json);
               sdk_append_traces('getState_url',$url_V2,$time);
               sdk_append_traces('getState_response',$response,$time);
               $status = ($response['data'][0]['on']['on'])?"on":"off";
               echo "<xml><status>$status</status></xml>";
               break;
            }
            case 'scene':
            {
               $header_V2 = array('hue-application-key:'.$hueDatas[$mac]['key']);
               $url_V2 = 'https://'.$hue_bridge_ip.$apiv2_resource.'/'.$type.'/'.$hueDatas[$mac]['devices'][$id]['id_v2'];
               $json = httpQuery($url_V2, 'GET', NULL, NULL, $header_V2, false, false, $infos);
               $response = sdk_json_decode($json);
               sdk_append_traces('getState_url',$url_V2,$time);
               sdk_append_traces('getState_response',$response,$time);
               $status = ($response['data'][0]['on']['on'])?"on":"off";
               echo "<xml><status>$status</status></xml>";
               break;
            }
            default:
            {
               echo "<xml><status>Unknow type</status></xml>";
            }
         }
   }
   else
      echo "<xml><status>Identifier not found.</status></xml>";
   
   break;
}
case 'setState':
{
   $actif = getArg('actif', false, true);
   if ($actif != true)
   {
      echo "unactive";
   }
   
   $type = getArg('type');
   $mac = getArg('mac');
   $hue_bridge_ip = sdk_get_ip_from_ip_or_mac($mac);
   $id = getArg('id');
   $time = time();
   $on = getArg('on', false, 'true'); /* V1-V2 : true, false */
   $bri = getArg('bri', false, null); /* V1-V2 : brightness */
   $hue = getArg('hue', false, null); /* V1 : color */
   $sat = getArg('sat', false, null); /* V1 : saturation */
   $alert = getArg('alert', false, null); /*V1 : select, lselect */
   $effect = getArg('effect', false, null); /* V1 : colorloop */
   $effects = getArg('effects', false, null); /* V2 - light : candle, fire */
   $scene = getArg('scene', false, null); /* V2 - group : identifier  */
   $isV1 = $isV2 = false;         
   
   if (isset($effects) || isset($scene))
   {
      $isV2  = true; /*$effects +($bri)* */
      // V2 : values between 0 and 100.
      if (isset($bri))
      {
         if ($bri<0)
            $bri = 0;
         else if ($bri>254)
            $bri = 254;
         
         $bri = round($bri/254*100);
      }
   }
   else
   {
      $isV1 = true;
      // V1 : values between 0 and 254.
      if (isset($bri))
      {
         if ($bri<0)
            $bri = 0;
         else if ($bri>254)
            $bri = 254;
      }
      if (isset($sat))
      {
         if ($sat<0)
            $sat = 0;
         else if ($sat>254)
            $sat = 254;
      }
   }   
   $isV1str = ($isV1==true)?"true":"false";
   $isV2str = ($isV2==true)?"true":"false";
   sdk_append_traces("V1", $isV1str, $time);
   sdk_append_traces("V2", $isV2str, $time);
   
   //$hueDatas = loadVariable('hueDatas');
   
   if (array_key_exists($id,$hueDatas[$mac]['devices']))
   {
      $postDatas = NULL;
            
      switch ($type)
      {
         case 'light':
         {
            if ($isV1)
            {
               $postDatas =  '{"on":'.$on;
               if (isset($bri))
                  $postDatas .= ', "bri":'.$bri;
               if (isset($hue))
                  $postDatas .= ', "hue":'.$hue;
               if (isset($sat))
                  $postDatas .= ', "sat":'.$sat;
               if (isset($alert))
                  $postDatas .= ', "alert":"'.$alert.'"';
               if (isset($effect))
                  $postDatas .= ', "effect":"'.$effect.'"';
               $postDatas .= "}";
               
               $urlV1 = 'https://'.$hue_bridge_ip.'/api/'.$hueDatas[$mac]['key'].$hueDatas[$mac]['devices'][$id]['id_v1'].'/state';
               $json = httpQuery($urlV1, "PUT", $postDatas);
               sdk_append_traces("datasV1", $postDatas, $time);
               sdk_append_traces("urlV1", $urlV1, $time);
               sdk_append_traces("responseV1", $json, $time);
                  
               echo ($on==="true")?'on':'off';
            }
            else if ($isV2)
            {
               $header_V2 = array('hue-application-key:'.$hueDatas[$mac]['key']);
               $postDatas =  '{"on":{"on":'.$on.'}}';
               $urlV2 = 'https://'.$hue_bridge_ip.$apiv2_resource.'/light/'.$hueDatas[$mac]['devices'][$id]['light'];
               $json = httpQuery($urlV2, "PUT", $postDatas,NULL, $header_V2);
               sdk_append_traces("postDatas.1", $postDatas, $time);
               sdk_append_traces("urlV2.1", $urlV2, $time);
               sdk_append_traces("responseV2.1", $json, $time);
               
               $postDatas =  '{"effects":{"effect":"'.$effects.'"}';
               if (isset($bri))
                  $postDatas .= ', "dimming":{"brightness":'.$bri.'}';
               $postDatas .= "}";               
               $json = httpQuery($urlV2, "PUT", $postDatas,NULL, $header_V2);
               
               sdk_append_traces("postDatas.2", $postDatas, $time);
               sdk_append_traces("urlV2.2", $urlV2, $time);
               sdk_append_traces("responseV2.2", $json, $time);
               echo ($on==="true")?'on':'off';
            }
            
            break;
         }
         case 'grouped_light':
         {
            if ($isV1)
            {
               $postDatas =  '{"on":'.$on;
               if (isset($bri))
                  $postDatas .= ', "bri":'.$bri;
               if (isset($hue))
                  $postDatas .= ', "hue":'.$hue;
               if (isset($sat))
                  $postDatas .= ', "sat":'.$sat;
               if (isset($alert))
                  $postDatas .= ', "alert":"'.$alert.'"';
               if (isset($effect))
                  $postDatas .= ', "effect":"'.$effect.'"';
               if (isset($scene))
                  $postDatas .= ', "scene":"'.$scene.'"';
               $postDatas .= "}";
               
               $urlV1 = 'https://'.$hue_bridge_ip.'/api/'.$hueDatas[$mac]['key'].$hueDatas[$mac]['devices'][$id]['id_v1'].'/action';
               $json = httpQuery($urlV1, "PUT", $postDatas);
               sdk_append_traces("datasV1", $postDatas, $time);
               sdk_append_traces("urlV1", $urlV1, $time);
               sdk_append_traces("responseV1", $json, $time);
                  
               echo ($on==="true")?'on':'off';
            }
            else if ($isV2)
            {
               //$postDatas =  '{"on":{"on":'.$on.'}';
               $postDatas = '{"recall":{"action":"active"';
               if (isset($bri))
                  $postDatas .= ', "dimming":{"brightness":'.$bri.'}';
               $postDatas .= "}}";
               
               $header_V2 = array('hue-application-key:'.$hueDatas[$mac]['key']);
               $urlV2 = 'https://'.$hue_bridge_ip.$apiv2_resource.'/scene/'.$scene;
               $json = httpQuery($urlV2, "PUT", $postDatas, NULL, $header_V2 );
               sdk_append_traces("datasV2", $postDatas, $time);
               sdk_append_traces("urlV2", $urlV2, $time);
               sdk_append_traces("responseV1", $json, $time);
                  
               echo ($on==="true")?'on':'off';
            }
            break;
         }
         default:
         {
            echo "ERROR : Type not supported";
         }
      }
   }
   else
      echo "ERROR : Identifier not found";
   break;
}
case 'topology_helper':
{
   $mac = getArg('mac');
   $hue_bridge_ip = sdk_get_ip_from_ip_or_mac($mac);
   //$hueDatas = loadVariable('hueDatas');
   
   $key = $hueDatas[$mac]['key'];
   if (empty($key))
   {
      echo  $html;
      echo "<div>Application is not linked to the Hub</div>";
      echo $end;
      die();
   }
   
   $header = array("hue-application-key:".$hueDatas[$mac]['key']);
   $response= httpQuery('https://'.$hue_bridge_ip.$apiv2_resource, NULL, NULL, NULL,$header);
   $json_resource = sdk_json_decode($response);
   
   $bridge_home = $rooms = $zones = $devices = $lights = $grouped_lights = $scenes = $zoneScenes = $device_powers = $motions = $temperatures = $buttons = array(); //Zones commit
   
   if (is_null($json_resource) || count($json_resource['errors']))
   {
      $time = time();
      sdk_append_traces('topology_helper_devices_header', $header, $time);
      sdk_append_traces('topology_helper_devices_json', $json_resource, $time);
      echo $html;
      echo "<div>ERROR : json_resource not retrieve</div>";
      echo $end;
   }
   else
   {
      foreach ($json_resource['data'] as $resource)
      {
         switch ($resource['type'])
         {
            case 'bridge_home':
            {
               $keys = array('children', 'services');
               foreach ($resource as $key => $values)
               {
                  if (in_array($key, $keys))
                  {
                     foreach ($values as $value)
                     {   
                        $bridge_home[$resource['id']][$key][$value['rtype']][] = $value['rid'];
                     }
                  }
               }
               break;
            }
            case 'room':
            {
               if (array_key_exists('metadata', $resource))
                  $rooms[$resource['id']]['name'] = $resource['metadata']['name'];
               
               $keys = array('children', 'services');
               foreach ($resource as $key => $values)
               {
                  if (in_array($key, $keys))
                  {
                     foreach ($values as $value)
                     {   
                        $rooms[$resource['id']][$key][$value['rtype']][] = $value['rid'];
                     }
                  }
               }
               break;
            }
            //Zones commit
            case 'zone':
            {
               if (array_key_exists('metadata', $resource))
                  $zones[$resource['id']]['name'] = $resource['metadata']['name'];
               
               if (array_key_exists('product_data', $resource))
                  $zones[$resource['id']]['product_name'] = $resource['product_data']['product_name'];

               $keys = array('children', 'services');
               foreach ($resource as $key => $values)
               {
                  if (in_array($key, $keys))
                  {
                     foreach ($values as $value)
                     {
                        $zones[$resource['id']][$key][$value['rtype']][] = $value['rid'];
                     }
                  }
               }
               break;
            }
            case 'device':
            {
               if (array_key_exists('metadata', $resource))
                  $devices[$resource['id']]['name'] = $resource['metadata']['name'];
               
               if (array_key_exists('product_data', $resource))
                  $devices[$resource['id']]['product_name'] = $resource['product_data']['product_name'];
               
               $keys = array('children', 'services');
               foreach ($resource as $key => $values)
               {
                  if (in_array($key, $keys))
                  {
                     foreach ($values as $value)
                     {   
                        $devices[$resource['id']][$key][$value['rtype']][] = $value['rid'];
                     }
                  }
               }
               break;
            }
            case 'light':
            {
               //Zones commit
               if (array_key_exists('owner', $resource))
                  $lights[$resource['id']] = $resource['owner']['rid'];
               break;
            }
            case 'grouped_light':
            {
               if (array_key_exists('owner', $resource))
                  $grouped_lights[$resource['id']]['owner'][$resource['owner']['rtype']] = $resource['owner']['rid'];
               break;
            }
            case 'scene':
            {
               if (array_key_exists('metadata', $resource))
                  $scenes[$resource['id']]['name'] = $resource['metadata']['name'];
               if (array_key_exists('group', $resource))
                  $scenes[$resource['id']][$resource['group']['rtype']] = $resource['group']['rid'];
               break;
            }
            case 'device_power':
            {
               break;
            }
            case 'motion':
            {
               break;
            }
            case 'temperature':
            {
               break;
            }
            case 'button':
            {
               break;
            }
         }
      }

      //Zones commit      
      foreach ($scenes as $sceneId => $scene)
      {
         if (isset($scene['zone']))
         {
            $zoneId = $scene['zone'];
            $zoneScenes[$zoneId][$sceneId] = $scene['name'];
         }
      }
      
   }
   
   $time = time();
   sdk_append_traces('topology_helper_bridge_home', $bridge_home, $time);
   sdk_append_traces('topology_helper_rooms', $rooms, $time);
   sdk_append_traces('topology_helper_zones', $zones, $time); //Zones commit
   sdk_append_traces('topology_helper_devices', $devices, $time);
   sdk_append_traces('topology_helper_grouped_lights', $grouped_lights, $time);
   sdk_append_traces('topology_helper_scenes', $scenes, $time);
      
      
   echo $html;
   
   $tags = array('grouped_light'=>'Groupe');
   foreach ($bridge_home as $bridge)
   {
      echo '<ul>';
      echo '<li><h1>Bridge :</h1></li>';   
      echo '<ul>';
      // Devices
      $count = sizeof($bridge['children']['device']);
      if ($count > 0)
         echo '<li><h2>Devices :</h2></li> <ul>';
      foreach   ($bridge['children']['device'] as $device )
      {
         echo '<li>'.sdk_htmlentities($devices[$device]['name']).' ('.$devices[$device]['product_name'].') => <b>'.$device.'</b></li>';
      }
      if ($count > 0)
         echo '</ul>';
      
      // Services
      $count = sizeof($bridge['services']);
      if ($count > 0)
         echo '<li><h2>Services :</h2></li>';
      
      foreach   ($bridge['services'] as $key => $service)
      {
         $count2 = sizeof($service);
         if ($count2 >0)
            echo '<ul>';
         foreach ($service as $value)
         {
            if (array_key_exists($key, $tags))
               echo '<li>'.$tags[$key].'  => <b>'.$value.'</b></li>';
            else
               echo '<li>'.$key.'  => <b>'.$value.'</b></li>';
         }
         if ($count2 >0)
            echo '</ul>';
      }

// Zones commit
if (!empty($zones))
{
    echo '<li><h2>Zones :</h2></li><ul>';

    foreach ($zones as $zoneId => $zone)
    {
        echo '<li><h3>'.sdk_htmlentities($zone['name']).'</h3>';
        echo '<ul>';
        if (isset($zone['children']['light']))
        {
            foreach ($zone['children']['light'] as $lightId)
         {
            $deviceId = isset($lights[$lightId]) ? $lights[$lightId] : null;
            if ($deviceId && isset($devices[$deviceId]))
               echo '<li>'. sdk_htmlentities($devices[$deviceId]['name']). ' ('.sdk_htmlentities($devices[$deviceId]['product_name']).') => <b>'.$lightId.'</b></li>';
            else
               echo '<li>Light => <b>'.$lightId.'</b></li>';
         }
        }
        if (isset($zone['services']['grouped_light'][0]))
            echo '<li>Grouped light => <b>'.$zone['services']['grouped_light'][0].'</b></li>';
      if (isset($zoneScenes[$zoneId]))
      {
         echo '<ul><li><h4>Scènes</h4></li><ul>';
         foreach ($zoneScenes[$zoneId] as $sceneId => $sceneName)
         {
            echo '<li>'.sdk_htmlentities($sceneName).' => <b>'.$sceneId.'</b></li>';
         }
         echo '</ul></ul>';
      }
        echo '</ul></li>';
    }
    echo '</ul>';
}

      
      $count = sizeof($bridge['children']['room']);
      if ($count >0)
         echo '<li><h2>'.sdk_htmlentities('Pièces :').'</h2></li> <ul>';
      foreach   ($bridge['children']['room'] as $room )
      {
         echo '<li><h3>'.sdk_htmlentities($rooms[$room]['name']).'</h3></li>';
            
         $count2 = sizeof($rooms[$room]['children']['device']);
         if ($count2 >0)
         {
            echo '<ul><li><h4>Produits</h4></li>';
            echo '<ul>';
         }
      
         foreach ($rooms[$room]['children']['device'] as $device)
         {
            echo '<li>'.sdk_htmlentities($devices[$device]['name']).' ('.$devices[$device]['product_name'].') => <b>'.$device.'</b></li>';
         }
         if ($count2 >0)
         {
            echo '</ul>';
            echo '</ul>';
         }
         
         $count2 = sizeof($rooms[$room]['services']);
         if ($count2 >0)
         {
            echo '<ul><li><h4>Groupes</h4></li>';
            echo '<ul>';
         }
         
         foreach ($rooms[$room]['services'] as $key => $service)
         {
            foreach ($service as $value)
            {
               if (array_key_exists($key, $tags))
                  echo '<li>'.$tags[$key].'  => <b>'.$value.'</b></li>';
               else
                  echo '<li>'.$key.'  => <b>'.$value.'</b></li>';
            }   
         }
         if ($count2 >0)
         {
            echo '</ul>';
            echo '</ul>';
         }
         
         /*$count2 = sizeof($scenes);
         if ($count2 >0)
         {
            echo '<ul><li><h4>'.sdk_htmlentities('Scènes:').'</h4></li>';
            echo '<ul>';
         }*/
         $hasScene  = false;
         foreach ($scenes as $key_scene => $scene)
         {
            if ($scene['room'] == $room)
            {
               if ($hasScene==false)
               {
                  $hasScene = true;
                  echo '<ul><li><h4>'.sdk_htmlentities('Scènes:').'</h4></li><ul>';
               }
               echo '<li>'.sdk_htmlentities($scene['name']).'  => <b>'.$key_scene.'</b></li>';
            }
         }
         if ($hasScene)
         {
            echo '</ul></ul>';
         }
         
      }
      if ($count > 0)
         echo '</ul>';
      
      echo '</ul>';
       echo '</ul>';      
   }   
   
   echo $end;
   break;
}
default:
{
   echo 'Action unknown';
}
}

?>
gabvoir
 
Messages : 192
Inscription : 24 Juin 2015


Retour vers Scripts & Périphériques du store

Qui est en ligne ?

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