PHILLIPS HUE

De knowledge
Révision datée du 5 décembre 2024 à 14:09 par Jpinon (discussion | contributions)
(diff) ← Version précédente | Voir la version actuelle (diff) | Version suivante → (diff)
Aller à la navigation Aller à la recherche
PHILLIPS HUE LOGO.png

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:

HUE-BRIDGE-MAC.png

La "petite maison" c'est si j'ai bien compris le symbole Apple Home?

Dans mon routeur je vois une entrée :

Mac-hue-routeur.png

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.

Exemple-arp.png

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 :

MAC-phillips-lighting.png

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 :

Hue-debug-console.png

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:

Gamut PHILLIPS.png

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

Hue gamut purple.png

Les valeurs affichées sont:

Purple-to-xy.png

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