LogicMachine Forum
Getting data from Philips Hue Outdoor Motion Sensor - Printable Version

+- LogicMachine Forum (https://forum.logicmachine.net)
+-- Forum: LogicMachine eco-system (https://forum.logicmachine.net/forumdisplay.php?fid=1)
+--- Forum: Scripting (https://forum.logicmachine.net/forumdisplay.php?fid=8)
+--- Thread: Getting data from Philips Hue Outdoor Motion Sensor (/showthread.php?tid=3995)



Getting data from Philips Hue Outdoor Motion Sensor - Odd Egil Aasheim - 14.04.2022

Hi.

Just bought this outdoor sensor from Philips, but struggeling to get some data out where it can be used.
I don't want to do something directly inside the Hue system, but to extract data.

The device does not come up in http://<ipadress>/api/<userid>/lights along with my other lamps/led's.
Instead it is visible http://<ipadress>/api/<userid>/sensors

Therefore I tried to modify the user.hue script by adding a section for sensors to search and get data from them.
So far so good.
This is a snippet from the user.hue script where I have duplicated the code, but renamed the original code from i.e function searchHueLights() to function searchHueSensors() and so on.
So "function" 2 and 4 below is new regarding the sensors


Code:
-- function 1 existing huesearch function searchHueLights()   local response = {}   body_searchHueLights= ''   -- Set username for LogicMachine   socket.http.request({   url = "http://"..ip_add.."/api/"..user.."/lights",   method = 'POST',         sink = ltn12.sink.table(response),   headers = {           ['content-length'] = #body_searchHueLights,           ['content-type'] = 'application/json',   },           source = ltn12.source.string(body_searchHueLights),   })   return response end -- function 2 new huesearch function searchHueSensors()   local response = {}   body_searchHueSensors= ''   -- Set username for LogicMachine   socket.http.request({   url = "http://"..ip_add.."/api/"..user.."/sensors",   method = 'POST',         sink = ltn12.sink.table(response),   headers = {           ['content-length'] = #body_searchHueSensors,           ['content-type'] = 'application/json',   },           source = ltn12.source.string(body_searchHueSensors),   })   return response end -- function 3 existing hue datacollection function getHueLights()   local response = {}   body_searchHueLights= ''   -- Set username for LogicMachine   socket.http.request({   url = "http://"..ip_add.."/api/"..user.."/lights",   method = 'GET',         sink = ltn12.sink.table(response),   headers = {           ['content-length'] = #body_searchHueLights,           ['content-type'] = 'application/json',   },           source = ltn12.source.string(body_searchHueLights),   })   return response end -- function 4 new hue datacollection function getHueSensors()   local response = {}   body_searchHueSensors= ''   -- Set username for LogicMachine   socket.http.request({   url = "http://"..ip_add.."/api/"..user.."/sensors",   method = 'GET',         sink = ltn12.sink.table(response),   headers = {           ['content-length'] = #body_searchHueSensors,           ['content-type'] = 'application/json',   },           source = ltn12.source.string(body_searchHueSensors),   })   return response end

By using this code I then can make a new script for searching
Code:
require('user.hue') -- get bridge to search for new lights result = searchHueLights() log(result)
the log showing that the search is started.

And a new script for reading data
Code:
require('user.hue') -- get all sensordata from bridge result = getHueSensors() log(result)
I get a looooong string, but how can i break it up into the pieces that I want?

 Output from Log window, (it all comes in one long line in the log window starting with * string: {...   ) 
Code:
Read Hue devices 14.04.2022 17:50:36 * table: [1]   * string: {"1":{"state":{"daylight":null,"lastupdated":"none"},"config":{"on":true,"configured":false,"sunriseoffset":30,"sunsetoffset":-30},"name":"Daylight","type":"Daylight","modelid":"PHDL00","manufacturername":"Signify Netherlands B.V.","swversion":"1.0"},"2":{"state":{"presence":false,"lastupdated":"2022-04-14T15:29:10"},"swupdate":{"state":"noupdates","lastinstall":"2022-04-13T18:57:32"},"config":{"on":true,"battery":100,"reachable":true,"alert":"none","sensitivity":2,"sensitivitymax":4,"ledindication":false,"usertest":false,"pending":[]},"name":"OutdoorSensor","type":"ZLLPresence","modelid":"SML004","manufacturername":"Signify Netherlands B.V.","productname":"Hue outdoor motion sensor","swversion":"2.53.6","uniqueid":"00:17:88:01:0b:d1:3a:b5-02-0406","capabilities":{"certified":true,"primary":true}},"3":{"state":{"lightlevel":7186,"dark":true,"daylight":false,"lastupdated":"2022-04-14T15:50:23"},"swupdate":{"state":"noupdates","lastinstall":"2022-04-13T18:57:32"},"config":{"on":true,"battery":100,"reachable":true,"alert":"none","tholddark":16000,"tholdoffset":7000,"ledindication":false,"usertest":false,"pending":[]},"name":"Hue outdoor light sensor 1","type":"ZLLLightLevel","modelid":"SML004","manufacturername":"Signify Netherlands B.V.","productname":"Hue outdoor light sensor","swversion":"2.53.6","uniqueid":"00:17:88:01:0b:d1:3a:b5-02-0400","capabilities":{"certified":true,"primary":false}},"4":{"state":{"temperature":2410,"lastupdated":"2022-04-14T15:48:19"},"swupdate":{"state":"noupdates","lastinstall":"2022-04-13T18:57:32"},"config":{"on":true,"battery":100,"reachable":true,"alert":"none","ledindication":false,"usertest":false,"pending":[]},"name":"Hue outdoor temp. sensor 1","type":"ZLLTemperature","modelid":"SML004","manufacturername":"Signify Netherlands B.V.","productname":"Hue outdoor temp. sensor","swversion":"2.53.6","uniqueid":"00:17:88:01:0b:d1:3a:b5-02-0402","capabilities":{"certified":true,"primary":false}}}

Let's say that I'm interested in the lightlevel and temperature
I can't find the fomat to extract the data for now.
Any thoughts how to extract?


RE: Getting data from Philips Hue Outdoor Motion Sensor - pioneersteffen - 14.04.2022

Hi,

funny thing I just started working on the same topic today. :-)

I got it working for the motion state:

1.) Add the following code to the hue user library script:

Code:
-- function get data from sensors function getHueSensors()   local response = {}   body_searchHueSensors= ''   -- Set username for LogicMachine   socket.http.request({   url = "http://"..ip_add.."/api/"..user.."/sensors",   method = 'GET',         sink = ltn12.sink.table(response),   headers = {           ['content-length'] = #body_searchHueSensors,           ['content-type'] = 'application/json',   },           source = ltn12.source.string(body_searchHueSensors),   })   return response end

2.) Implement a resident script (example for motion):

Code:
addressmapping = {   -- Name                  -- Presence FB          ['Hue motion 1'] = {state = '47/2/6', statevalue = ''}, } -- Use logging logging = true require('user.hue') require('json')   reply = getHueSensors()   mysensors = json.pdecode(reply[1])   for _, item in pairs(mysensors) do     -- Check if sensor is found by bridge otherwise it make no sense to send commands     if item.config.reachable == true then       -- On/Off       name = addressmapping[item.name]       if name then         addr = addressmapping[item.name]['state']         if addr and addr ~= '' then           currentvalue = addressmapping[item.name]['statevalue']           if currentvalue ~= item.state.presence then             grp.update(addr, item.state.presence)             addressmapping[item.name]['statevalue'] = item.state.presence             if logging == true then               log('sensor ' .. item.name .. ' state is: ' .. tostring(item.state.presence))             end           end         end       end      end   end

If you want to have the temperature just looking for the name inside the json e.g. = Hue outdoors temp. sensor 1" and change: "item.state.presence" to "item.state.temperature". This is working I tested it. Due to I just want to have the motion state I didn't implemented it.

To get the json "readable" I used: https://jsonformatter.org/json-parser

I hope this is helping you.

Best Regards
Steffen


RE: Getting data from Philips Hue Outdoor Motion Sensor - admin - 19.04.2022

In getHueSensors you need to replace return response with return table.concat(response)
Then replace mysensors = json.pdecode(reply[1]) with mysensors = json.pdecode(reply)

Otherwise your script will start failing if the response becomes larger.