From 0a5b184dad4ca1d946145e93877f1c7193f9b911 Mon Sep 17 00:00:00 2001 From: dceejay Date: Thu, 29 Jan 2015 16:41:06 +0000 Subject: [PATCH] Allow hue lamp to specify IP manually... for those cases where discovery doesn't... --- hardware/hue/104-hue_manage.html | 11 ++- hardware/hue/104-hue_manage.js | 137 ++++++++++++++++--------------- 2 files changed, 83 insertions(+), 65 deletions(-) diff --git a/hardware/hue/104-hue_manage.html b/hardware/hue/104-hue_manage.html index 99950970..c5c364c1 100644 --- a/hardware/hue/104-hue_manage.html +++ b/hardware/hue/104-hue_manage.html @@ -17,6 +17,7 @@ --> @@ -77,6 +85,7 @@ username: {value:"", required:true}, discovery_mode: {value: "", required:false}, lamp_id: {value:"", required:false}, + ip_address: {value:"", required:false}, color: {value:"EBF5FF"}, brightness: {value:"100"}, lamp_status:{} diff --git a/hardware/hue/104-hue_manage.js b/hardware/hue/104-hue_manage.js index 9d1374f2..5f79fcc4 100644 --- a/hardware/hue/104-hue_manage.js +++ b/hardware/hue/104-hue_manage.js @@ -41,6 +41,69 @@ function hexToRgb(hex) { } : null; } +function setLights(node, myMsg) { + + var msg2 = {}; + msg2.topic = this.topic; + + //set light status + var api = new HueApi(node.gw_ipaddress, node.username); + var lightState = hue.lightState; + var state = lightState.create(); + + var status; + var lamp = -1; + + //check for AUTO status (lamp settings set through node input) + if(node.lamp_status=="AUTO") { + var color; + var brightness; + + //get lamp id from msg.lamp: + lamp = myMsg.lamp; + + //get brightness: + brightness = myMsg.brightness; + + //get colour either from msg.color or msg.topic + if(myMsg.color!=null && myMsg.color.length>0) { + color = myMsg.color; + } + else if(myMsg.topic!=null && myMsg.topic.length>0) { + color = myMsg.topic; + } + + + //check the payload for on/off/alert: + //case of ALERT: + if(myMsg.payload=="ALERT" || myMsg.payload=="alert"){ + api.setLightState(lamp, state.alert()).then(displayResult).fail(displayError).done(); + } + + //case of ON: + if(myMsg.payload=="ON" || myMsg.payload=="on") { + api.setLightState(lamp, state.on().rgb(hexToRgb(color).r,hexToRgb(color).g,hexToRgb(color).b).brightness(brightness)).then(displayResult).fail(displayError).done(); + } + else { + api.setLightState(lamp, state.off()).then(displayResult).fail(displayError).done(); + } + + } + else { + //set lamp according to node settings + if(node.lamp_status=="ON") + api.setLightState(node.lamp_id, state.on().rgb(hexToRgb(node.color).r,hexToRgb(node.color).g,hexToRgb(node.color).b).brightness(node.brightness)).then(displayResult).fail(displayError).done(); + else + api.setLightState(node.lamp_id, state.off()).then(displayResult).fail(displayError).done(); + } + + if(lamp!=-1) + msg2.payload = 'Light with ID: '+lamp+ ' was set to '+myMsg.payload; + else + msg2.payload = 'Light with ID: '+node.lamp_id+ ' was set to '+node.lamp_status; + node.send(msg2); +} + // The main node definition - most things happen in here function HueNode(n) { @@ -53,89 +116,34 @@ function HueNode(n) { this.username = n.username; this.lamp_status = n.lamp_status; this.lamp_id = n.lamp_id; + this.gw_ipaddress = n.ip_address; this.color = n.color; this.brightness = n.brightness; - // Store local copies of the node configuration (as defined in the .html) this.topic = n.topic; - + var msg = {}; - + msg.topic = this.topic; this.on("input", function(msg){ var myMsg = msg; - //set the lamp status + //set the lamp status + if (this.gw_ipaddress) { + setLights(node, myMsg); + } else { //first locate the Hue gateway: hue.locateBridges(function(err, result) { - var msg2 = {}; - msg2.topic = this.topic; + if (err) throw err; //check for found bridges if(result[0]!=null) { //save the IP address of the 1st bridge found this.gw_ipaddress = result[0].ipaddress; - - - //set light status - var api = new HueApi(this.gw_ipaddress, node.username); - var lightState = hue.lightState; - var state = lightState.create(); - - var status; - var lamp = -1; - - //check for AUTO status (lamp settings set through node input) - if(node.lamp_status=="AUTO") { - var color; - var brightness; - - //get lamp id from msg.lamp: - lamp = myMsg.lamp; - - //get brightness: - brightness = myMsg.brightness; - - //get colour either from msg.color or msg.topic - if(myMsg.color!=null && myMsg.color.length>0) { - color = myMsg.color; - } - else if(myMsg.topic!=null && myMsg.topic.length>0) { - color = myMsg.topic; - } - - - //check the payload for on/off/alert: - //case of ALERT: - if(myMsg.payload=="ALERT" || myMsg.payload=="alert"){ - api.setLightState(lamp, state.alert()).then(displayResult).fail(displayError).done(); - } - - //case of ON: - if(myMsg.payload=="ON" || myMsg.payload=="on") { - api.setLightState(lamp, state.on().rgb(hexToRgb(color).r,hexToRgb(color).g,hexToRgb(color).b).brightness(brightness)).then(displayResult).fail(displayError).done(); - } - else { - api.setLightState(lamp, state.off()).then(displayResult).fail(displayError).done(); - } - - } - else { - //set lamp according to node settings - if(node.lamp_status=="ON") - api.setLightState(node.lamp_id, state.on().rgb(hexToRgb(node.color).r,hexToRgb(node.color).g,hexToRgb(node.color).b).brightness(node.brightness)).then(displayResult).fail(displayError).done(); - else - api.setLightState(node.lamp_id, state.off()).then(displayResult).fail(displayError).done(); - } - - if(lamp!=-1) - msg2.payload = 'Light with ID: '+lamp+ ' was set to '+myMsg.payload; - else - msg2.payload = 'Light with ID: '+node.lamp_id+ ' was set to '+node.lamp_status; - node.send(msg2); + setLights(node, myMsg); } else { //bridge not found: @@ -145,6 +153,7 @@ function HueNode(n) { } }); + } });