PHILLIPS HUE
Trouver l'IP du bridge.
Il y a une chose à savoir avant: l'adresse IP du bridge HUE.
Au dos du bridge on a un étiquette avec une tera floppée de de logos et de chiffres. Il faut trouver une étiquette qui ressemble à ça:
La "petite maison" c'est si j'ai bien compris le symbole Apple Home?
Dans mon routeur je vois une entrée :
Le chiffre d'en haut (a gauche en haut de la petite maison) sur l'étiquette du bridge HUE est la fin de l'adresse MAC que l'on peut voir côté routeur. L'IP est donnée dessous. Ici c'est 192.168.0.18. (Oui j'ai un routeur TP-link derrière une Freebox configurée en bridge)
Un autre solution est d'utiliser la commande arp.
On retrouve que mon adresse mac qui se termine par 3b19 est bien 192.168.0.18
On peut aussi utiliser un decodeur d'adresses mac. Par exemple : https://macaddress.io/
On lui donne la MAC et il réponds :
Pas de doute c'est la bonne adresse!
Par la suite cette IP sera désignée par hue-bridge
.
Dans un navigateur si on teste http://hue-bridge on a une page qui s'affiche et donne toutes les licences utilisée par le soft du bridge.
On constate que le Bridge Philips Hue est une petite linux-box avec nginx, openssl ... il y a même un client MQTT ssl Mosquitto !
Connexion
Test
Pour une utilisation plus subtile on utilisera curl
, un librairie python ou même des sockets en C mais pour les tests on a une jolie console de debug sur le serveur web:
http://hue-bridge/debug/clip.html
On a une jolie page :
Si on teste avec l'URL :
GET /api/config
On récupère la configuration du bridge:
{
"name": "Hue Bridge",
"datastoreversion": "172",
"swversion": "1967054020",
"apiversion": "1.67.0",
"mac": "--:--:--:--:3b:09",
"bridgeid": "------------3B09",
"factorynew": false,
"replacesbridgeid": null,
"modelid": "BSB002",
"starterkitid": ""
}
L'adresse MAC est confirmée là aussi!
Récupérer un token
Par défaut tout le monde ne peut pas se connecter à un bridge HUE, Normal!
Le mécanisme est un classique "push button to pair".
On doit donner un nom à l'appareil client. On choisit ici TEST_CLIENT
.
Pour obtenir le token on doit faire :
POST /api
Avec les données :
{"devicetype":"my_hue_app#davtest"}
On récupère la réponse :
[
{
"error": {
"type": 101,
"address": "",
"description": "link button not pressed"
}
}
]
Logique il faut appuyer sur le bouton et on a quelques secondes pour lancer la commande de nouveau.
Et on relance le même POST
[
{
"success": {
"username": "Z3L********6OQtHo-fcUE9O******jWQNwffHgg"
}
}
]
On récupère un "username"
.
On le note bien précieusement! C'est lui qui nous permettra l'accès.
Dans la suite on désignera ce token user par username
.
Récupérer la configuration
On peut récupérer la configuration du pont HUE avec l'URL :
GET /api/username/config
Attention la réponse est longue.
{
"name": "Hue Bridge",
"zigbeechannel": 15,
"bridgeid": "------------3B09",
"mac": "--:--:--:--:3b:09",
"dhcp": true,
"ipaddress": "192.168.0.18",
"netmask": "255.255.255.0",
"gateway": "192.168.0.1",
"proxyaddress": "none",
"proxyport": 0,
"UTC": "2024-12-02T19:24:10",
"localtime": "2024-12-02T20:24:10",
"timezone": "Europe/Paris",
"modelid": "BSB002",
"datastoreversion": "172",
"swversion": "1967054020",
"apiversion": "1.67.0",
"swupdate2": {
"checkforupdate": false,
"lastchange": "2024-11-21T06:58:12",
"bridge": {
"state": "noupdates",
"lastinstall": "2024-10-25T12:05:18"
},
"state": "transferring",
"autoinstall": {
"updatetime": "T14:00:00",
"on": true
}
},
"linkbutton": false,
"portalservices": true,
"analyticsconsent": true,
"portalconnection": "disconnected",
"portalstate": {
"signedon": false,
"incoming": false,
"outgoing": false,
"communication": "disconnected"
},
"internetservices": {
"internet": "connected",
"remoteaccess": "connected",
"time": "connected",
"swupdate": "connected"
},
"factorynew": false,
"replacesbridgeid": null,
"starterkitid": "",
"backup": {
"status": "idle",
"errorcode": 0
},
"whitelist": {
"498********72-49f0-8faa-cad6******fae1gr": {
"last use date": "2024-12-01T21:39:24",
"create date": "2024-02-15T21:17:54",
"name": "Hue#SM-S918B"
},
"Z3L********6OQtHo-fcUE9O******jWQNwffHgg": {
"last use date": "2024-12-02T19:24:10",
"create date": "2024-12-02T19:18:50",
"name": "my_hue_app#davtest"
}
}
}
Lignes 2 à 31 le statut du bridge.
Ligne 32 l'état du bouton "link" : false
le bridge n'est pas en mode appariement, true
il est en mode appariement.
Lignes 33 à 41, je ne sais pas!
Lignes 42 à 47 la connectivité internet.
Lignes 48 à 54... je ne sais pas non plus.
Lignes 55 à 67 la liste blanche des tokens autorisés. La sécurité est donc assez limité. On a un accès une fois on a acces a TOUS les tokens. On est tous root !
Commande de la lumière
Liste des luminaires
GET /api/username/lights
Nous donne la liste de tous les luminaires connectés au bridge. C'est un objet JSON du style :
{
"1": {
"state": {
"on": true,
"bri": 254,
"alert": "none",
"mode": "homeautomation",
"reachable": true
},
"swupdate": {
"state": "noupdates",
"lastinstall": "2024-05-22T12:15:38"
},
"type": "Dimmable light",
"name": "Plafonier",
"modelid": "LWB010",
"manufacturername": "Signify Netherlands B.V.",
"productname": "Hue white lamp",
"capabilities": {
"certified": true,
"control": {
"mindimlevel": 2000,
"maxlumen": 806
},
"streaming": {
"renderer": false,
"proxy": false
}
},
"config": {
"archetype": "classicbulb",
"function": "mixed",
"direction": "omnidirectional",
"startup": {
"mode": "safety",
"configured": true
}
},
"uniqueid": "00:17:88:01:02:fe:4f:c4-0b",
"swversion": "1.116.3",
"swconfigid": "7C1E5567",
"productid": "Philips-LWB010-1-A19DLv4"
},
...
}
Ici je n'ai donné qu'un seul luminaire mais la suite consiste en des objets "2"
:, "3:"
....
En détail sur l'exemple ci dessus:
Ligne 3 à 9:
"state": {
"on": true,
"bri": 254,
"alert": "none",
"mode": "homeautomation",
"reachable": true
}
L'état du luminaire avec dans l'ordre : allumé, brillance au max, pas d'alertes, mode "homeautomation" et à l'état joignable.
Lignes 10 à 43: beaucoup d'informations.
Allumer/eteindre
On fait un "PUT" sur le "light"
Pour allumer:
PUT /api/username/lights/1/state
Avec les data:
{"on":true}
Qui nous réponds:
[
{
"success": {
"/lights/1/state/on": true
}
}
]
Pour éteindre c'est la même chose avec:
{"on":false}
Luminosité
De la même façon un PUT peut changer la luminosité (briance)
PUT /api/username/lights/1/state
avec
{"bri":128}
Pour régler la luminosité a 50% (de 0 à 255) Dans le cas d'un liminaire "couleur" on a un state du genre:
"state": {
on": true,
"bri": 254,
"hue": 0,
"sat": 204,
"effect": "none",
"xy": [
0.4578,
0.4101
],
"ct": 370,
"alert": "select",
"colormode": "ct",
"mode": "homeautomation",
"reachable": false
}
avec hue (teinte) et sat (saturation)
Couleurs définies en "xy"
Pour définir une couleur avec le plus de justesse possible Phillips nous propose un réglage assez subtil basé sur le "gamut" PHILLIPS:
On le trouve sur : https://viereck.ch/hue-xy-rgb/
Pour l'utiliser on clique sur une couleur et on a en haut les valeurs X et Y du gamut Phillips a donner dans la commande.
Si je choisis un beau violet
Les valeurs affichées sont:
Donc avec la commande
PUT /api/username/lights/1/state
et les données :
{"xy":[0.475,0.387],"bri":254}
On est supposé avoir un beau violet. Bon... pour ma part je n'ai pas acheté une ampoule PHILLIPS mais innr:
"type": "Extended color light",
"modelid": "RB 185 C",
"manufacturername": "innr",
"productname": "Extended color light",
Le gamut innr n'a pas l'air d'être le même.... La lampe innr nous donne :
"capabilities": {
"certified": false,
"control": {
"colorgamuttype": "other",
"colorgamut": [
[0.7,0.3],
[0.11,0.82],
[0.12,0.08]
],
"ct": {
"min": 153,
"max": 500
}
On peut en dire que:
- La lampe n'est pas certifiée PHILLIPS
- Le gamut est
"other"
(donc pas standard) - Les trois points de
"colorgamut"
sont la valeur[x,y]
de rouge vert et bleu. C'est à peu près ça si on teste. - les températures de couleurs "ct" vont de 153 (froid) à 500 (chaud).
Exemples en bash
On écrit un script qui allume et éteint le luminaire 8
#!/usr/bin/bash
source setenv.sh
echo "Switch ON"
curl -X PUT -d '{"on":true}' -s http://${HUE_BRIDGE}/api/${USERNAME}/lights/8/state > /dev/null
sleep 1
echo "Switch OFF"
curl -X PUT -d '{"on":false}' -s http://${HUE_BRIDGE}/api/${USERNAME}/lights/8/state > /dev/null
Dans setenv.sh on fixe les valeurs de HUE_BRIDGE
(l'IP du bridge) et USERNAME
.
Le script allume la lumière une seconde et l'éteint.
Si on veut tester toutes les couleurs d'une LED RGB
#!/usr/bin/bash
source setenv.sh
curl -X PUT -d '{"on":true}' -s http://${HUE_BRIDGE}/api/${USERNAME}/lights/8/state > /dev/null
for ((i=7;i<=65535;i+=500))
do
echo $i
curl -X PUT -d "{\"hue\":$i}" -s http://${HUE_BRIDGE}/api/${USERNAME}/lights/8/state > /dev/null
done
curl -X PUT -d '{"on":false}' -s http://${HUE_BRIDGE}/api/${USERNAME}/lights/8/state > /dev/null