HUE motion sensor temperature to InfluxDB
Last night, I was broswing my HUE app, and I saw that my motion sensor did send temperature information.
So, I instantly wanted to add this input temperature to my Grafana dashboard.
HUE API
I've read the introduction about token generation on the official philips hue documentation : https://developers.meethue.com/develop/get-started-2/
Discovery
To automate the process of token generation OR if you don't know the IP address of your bridge, you wan surf on this page : https://discovery.meethue.com/ but you need to be on the same network as your hue bridge (or with m-dns rules).
As you can see, the answer is a JSON format (I've hidden the bridge ID) and the internalipaddress is 192.168.100.50 (IOT VLAN in my case). It also works with curl / wget / others broswers :
You can test it by browsing the IP address
Token generation
Before I read the documentation, in my mind : the application needed to initiate the token generation before pressing the link button on the bridge, but ... The application doesn't need to initiate anything before, you need to send a token generation request, after pressing the link button.
The API URL is ... /api (👍 philips) and, the second path in the URL must be the token. If you send a fake / wrong token you'll have the message
You need to send a JSON encoded POST request with the device type you "need" to process the token registration. It can be anything. Philips hue documentation exemple :
{"devicetype":"my_hue_app#iphone peter"}
So, I prepared the JSON encoded POST request with CURL, then I pressed my bridge link, and immediatly AFTER I ran this CURL command
curl -d '{"devicetype":"test#monitor01"}' -H "Content-Type: application/json" -X POST http://192.168.100.50/api
The request response is simple : the status (success), and our username (which is actually a token). Keep it securely. If you don't run the command fast enough, you'll have this error
List all sensors
Now, we have the IP address of the hue bridge and a functionnal token, we could list all sensors by sending this request
curl http://192.168.100.50/api/YOURTOKENHERE/sensors
It's JSON format and could easily by parsed by using jq command, a simple pipe to jq will display the informations in a JSON conventionnal reading format, this will help to understand the structure and will be used after to extract the datas.
curl http://192.168.100.50/api/YOURTOKENHERE/sensors|jq
As you can see, there is an ID and a name, you can scroll until you find the sensor you need.
Also, you can use this command to only extract the ID and the name
curl -s http://192.168.100.50/api/YOURTOKENHERE/sensors|jq -r 'keys[] as $k| "\($k) \(.[$k].name)"'
As you can see I have a lot of sensors, but a sensor is not a full device, it's just a sensor. For exemple, the motion sensor create a least this sensors :
- The motion sensor (5 in my previous list)
- The temperature sensor (4 in my previous list)
- The ambiant light sensor (6 in in my previous list)
Use a sensor
Now that we have spotted all the sensors we need (4 for temperature and 6 for lux) we want to display all the informations contained by the sensor. The request is simple (jq is only for human reading purpose) :
curl http://192.168.100.50/api/YOURTOKENHERE/sensors/4|jq
We see
- The temperature (in celcius and that need to be divided by 100, I guess a int to float trick)
- The battery level
- The name
We have all the informations we want, it's extraction time ! As mentionned earlier, I will be using JQ :
curl http://192.168.100.50/api/YOURTOKENHERE/sensors/6|jq .state
It's keeps all the state part
And finally
curl http://192.168.100.50/api/YOURTOKENHERE/sensors/6|jq .state.temperature
2454 (so 24.54 °C).
Everything in a script
The final script temp-hue.sh, I used the -s parameter to prevent curl to display the request status, and I do use bc to calculated the float value
#!/bin/bash
token="YOURTOKENHERE"
ip_bridge="192.168.100.50"
temp=$(curl -s "http://$ip_bridge/api/$token/sensors/4"|jq .state.temperature)
temp=$(echo "scale=2;$temp / 100"|bc)
lux=$(curl -s "http://$ip_bridge/api/$token/sensors/6"|jq .state.lightlevel)
echo "philips-hue,device=capteur-salon temperature=$temp,lux=$lux"
And ... The telegraf input exec
Then the owner and execution flag for the script file
And finally service telegraf restart
Now I switched to my grafana dashboard and created a dashboard to visualize the new incoming data
If you have any question, please react on https://www.reddit.com/r/homelab/comments/cxmy9r/philips_hue_temperature_monitoring_grafana/