mirror of
				https://github.com/node-red/node-red-nodes.git
				synced 2025-03-01 10:37:43 +00:00 
			
		
		
		
	Reorganise/de-duplicate Philips Hue node
This commit is contained in:
		| @@ -13,7 +13,6 @@ | ||||
|   See the License for the specific language governing permissions and | ||||
|   limitations under the License. | ||||
|  | ||||
|  | ||||
| --> | ||||
|  | ||||
| <script type="text/x-red" data-template-name="Discover"> | ||||
| @@ -29,25 +28,27 @@ | ||||
|  | ||||
| <!-- Next, some simple help text is provided for the node.                   --> | ||||
| <script type="text/x-red" data-help-name="Discover"> | ||||
|     <p>This node looks for a Philips Hue Bridge in the local network.</p><p> The node has 2 outputs, the first one contains the IP address of the first discovered bridge and the second one the lights registered to that bridge (in JSON format).</p> <p>To use the node you need to have obtained a valid auth token (or username) from your Philips Hue Bridge. Read <a href="http://developers.meethue.com/gettingstarted.html" target="_blank">here</a> on how to do this.</p> | ||||
|     <p>This node looks for a Philips Hue Bridge in the local network.</p> | ||||
|     <p> The node has 2 outputs, the first one contains the IP address of the first discovered bridge and the second one the lights registered to that bridge (in JSON format).</p> | ||||
|     <p>To use the node you need to have obtained a valid auth token (or username) from your Philips Hue Bridge. Read <a href="http://developers.meethue.com/gettingstarted.html" target="_blank">here</a> on how to do this.</p> | ||||
| </script> | ||||
|  | ||||
| <!-- Finally, the node type is registered along with all of its properties   --> | ||||
| <script type="text/javascript"> | ||||
|     RED.nodes.registerType('Discover',{ | ||||
|         category: 'advanced-input',      // the palette category | ||||
|         category: 'advanced-input', | ||||
|         color:"#EFEFEF", | ||||
|         defaults: {             // defines the editable properties of the node | ||||
|             name: {value:""},   //  along with default values. | ||||
|         defaults: { | ||||
|             name: {value:""}, | ||||
|             username: {value:"", required:true} | ||||
|         }, | ||||
|         inputs:1,                // set the number of inputs - only 0 or 1 | ||||
|         outputs:2,               // set the number of outputs - 0 to n | ||||
|         icon: "huediscover.png",    // set the icon (held in public/icons) | ||||
|         label: function() {      // sets the default label contents | ||||
|             return this.name||this.topic||"Discover"; | ||||
|         inputs:1, | ||||
|         outputs:2, | ||||
|         icon: "hue.png", | ||||
|         label: function() { | ||||
|             return this.name||"Discover"; | ||||
|         }, | ||||
|         labelStyle: function() { // sets the class to apply to the label | ||||
|         labelStyle: function() { | ||||
|             return this.name?"node_label_italic":""; | ||||
|         } | ||||
|     }); | ||||
|   | ||||
| @@ -13,7 +13,6 @@ | ||||
|   See the License for the specific language governing permissions and | ||||
|   limitations under the License. | ||||
|  | ||||
|  | ||||
| --> | ||||
|  | ||||
| <script type="text/x-red" data-template-name="HueNode"> | ||||
| @@ -57,23 +56,23 @@ | ||||
| <!-- Finally, the node type is registered along with all of its properties   --> | ||||
| <script type="text/javascript"> | ||||
|     RED.nodes.registerType('HueNode',{ | ||||
|         category: 'advanced-input',      // the palette category | ||||
|         category: 'advanced-input', | ||||
|         color:"#EFEFEF", | ||||
|         defaults: {             // defines the editable properties of the node | ||||
|             name: {value:""},   //  along with default values. | ||||
|         defaults: { | ||||
|             name: {value:""}, | ||||
|             username: {value:"", required:true}, | ||||
|             discovery_mode: {value: "", required:false}, | ||||
|             lamp_id: {value:"", required:false}, | ||||
|             color: {value:"EBF5FF"}, | ||||
|             lamp_status:{} | ||||
|         }, | ||||
|         inputs:1,                // set the number of inputs - only 0 or 1 | ||||
|         outputs:1,               // set the number of outputs - 0 to n | ||||
|         icon: "huemanage.png",    // set the icon (held in public/icons) | ||||
|         label: function() {      // sets the default label contents | ||||
|             return this.name||this.topic||"HueNode"; | ||||
|         inputs:1, | ||||
|         outputs:1, | ||||
|         icon: "hue.png", | ||||
|         label: function() { | ||||
|             return this.name||"HueNode"; | ||||
|         }, | ||||
|         labelStyle: function() { // sets the class to apply to the label | ||||
|         labelStyle: function() { | ||||
|             return this.name?"node_label_italic":""; | ||||
|         } | ||||
|     }); | ||||
|   | ||||
| @@ -18,18 +18,13 @@ | ||||
|  * limitations under the License. | ||||
|  **/ | ||||
|  | ||||
|  | ||||
| //Require node-hue-api | ||||
| var hue = require("node-hue-api"); | ||||
| var HueApi = require("node-hue-api").HueApi; | ||||
|  | ||||
| // Require main module | ||||
| var RED = require(process.env.NODE_RED_HOME+"/red/red"); | ||||
|  | ||||
| //store the IP address of the Hue Gateway | ||||
| var gw_ipaddress = ""; | ||||
|  | ||||
|  | ||||
| var username, lamp_status, lamp_id, color; | ||||
|  | ||||
| function hexToRgb(hex) { | ||||
| @@ -41,84 +36,73 @@ function hexToRgb(hex) { | ||||
|     } : null; | ||||
| } | ||||
|  | ||||
|  | ||||
| // The main node definition - most things happen in here | ||||
| function HueNode(n) { | ||||
|     // Create a RED node | ||||
|     RED.nodes.createNode(this,n); | ||||
|  | ||||
|     var node = this; | ||||
|  | ||||
|     //get parameters from user | ||||
|     this.username = n.username; | ||||
|     this.lamp_status = n.lamp_status; | ||||
|     this.lamp_id = n.lamp_id; | ||||
|     this.color = n.color; | ||||
|     | ||||
|     var node = this; | ||||
|  | ||||
|     // 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){ | ||||
|             //set the lamp status | ||||
|             //first locate the Hue gateway: | ||||
|             hue.locateBridges(function(err, result) { | ||||
|         //set the lamp status | ||||
|         //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; | ||||
|                  | ||||
|             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(); | ||||
|                 //set light status | ||||
|                 var api = new HueApi(this.gw_ipaddress, node.username); | ||||
|                 var lightState = hue.lightState; | ||||
|                 var state = lightState.create(); | ||||
|  | ||||
|                     var status; | ||||
|                     if(msg.payload=="ALERT"){ | ||||
|                         status = "ALERT"; | ||||
|                     } | ||||
|                     else if(node.lamp_status=="ON" || msg.payload=="ON") status = "ON"; | ||||
|                     else if(node.lamp_status=="OFF" || msg.payload=="OFF") status = "OFF"; | ||||
|                 var status; | ||||
|                 if(msg.payload=="ALERT"){ | ||||
|                     status = "ALERT"; | ||||
|                 } | ||||
|                 else if(node.lamp_status=="ON" || msg.payload=="ON") status = "ON"; | ||||
|                 else if(node.lamp_status=="OFF" || msg.payload=="OFF") status = "OFF"; | ||||
|  | ||||
|  | ||||
|                     if(status=="ALERT") { | ||||
|                         api.setLightState(node.lamp_id, state.alert()).then(displayResult).fail(displayError).done(); | ||||
|                     } | ||||
|                     else if(status=="ON") { | ||||
|                         if(node.color==null) { | ||||
|                             api.setLightState(node.lamp_id, state.on().rgb(hexToRgb(msg.topic).r,hexToRgb(msg.topic).g,hexToRgb(msg.topic).b)).then(displayResult).fail(displayError).done(); | ||||
|                         } | ||||
|                         else { | ||||
|                             api.setLightState(node.lamp_id, state.on().rgb(hexToRgb(node.color).r,hexToRgb(node.color).g,hexToRgb(node.color).b)).then(displayResult).fail(displayError).done(); | ||||
|                         } | ||||
|                 if(status=="ALERT") { | ||||
|                     api.setLightState(node.lamp_id, state.alert()).then(displayResult).fail(displayError).done(); | ||||
|                 } | ||||
|                 else if(status=="ON") { | ||||
|                     if(node.color==null) { | ||||
|                         api.setLightState(node.lamp_id, state.on().rgb(hexToRgb(msg.topic).r,hexToRgb(msg.topic).g,hexToRgb(msg.topic).b)).then(displayResult).fail(displayError).done(); | ||||
|                     } | ||||
|                     else { | ||||
|                         api.setLightState(node.lamp_id, state.off()).then(displayResult).fail(displayError).done(); | ||||
|                         api.setLightState(node.lamp_id, state.on().rgb(hexToRgb(node.color).r,hexToRgb(node.color).g,hexToRgb(node.color).b)).then(displayResult).fail(displayError).done(); | ||||
|                     } | ||||
|  | ||||
|                     msg2.payload = 'Light with ID: '+node.lamp_id+ ' was set to '+status; | ||||
|                     node.send(msg2); | ||||
|                 } | ||||
|                 else { | ||||
|                     //bridge not found: | ||||
|                     var msg = {}; | ||||
|                     msg.payload = "Bridge not found!"; | ||||
|                     node.send(msg); | ||||
|                     api.setLightState(node.lamp_id, state.off()).then(displayResult).fail(displayError).done(); | ||||
|                 } | ||||
|  | ||||
|             }); | ||||
|     }); | ||||
|                 msg2.payload = 'Light with ID: '+node.lamp_id+ ' was set to '+status; | ||||
|                 node.send(msg2); | ||||
|             } | ||||
|             else { | ||||
|                 //bridge not found: | ||||
|                 var msg = {}; | ||||
|                 msg.payload = "Bridge not found!"; | ||||
|                 node.send(msg); | ||||
|             } | ||||
|  | ||||
|         }); | ||||
|     }); | ||||
|  | ||||
|     this.on("close", function() { | ||||
|         // Called when the node is shutdown - eg on redeploy. | ||||
| @@ -137,9 +121,6 @@ var displayError = function(err) { | ||||
|     console.error(err); | ||||
| }; | ||||
|  | ||||
|  | ||||
|  | ||||
|  | ||||
| // Register the node by name. This must be called before overriding any of the | ||||
| // Node functions. | ||||
| RED.nodes.registerType("HueNode",HueNode); | ||||
| RED.nodes.registerType("HueNode",HueNode); | ||||
|   | ||||
| Before Width: | Height: | Size: 8.7 KiB After Width: | Height: | Size: 8.7 KiB | 
| @@ -1,54 +0,0 @@ | ||||
| <!-- | ||||
|   Copyright 2013 Charalampos Doukas. | ||||
|  | ||||
|   Licensed under the Apache License, Version 2.0 (the "License"); | ||||
|   you may not use this file except in compliance with the License. | ||||
|   You may obtain a copy of the License at | ||||
|  | ||||
|   http://www.apache.org/licenses/LICENSE-2.0 | ||||
|  | ||||
|   Unless required by applicable law or agreed to in writing, software | ||||
|   distributed under the License is distributed on an "AS IS" BASIS, | ||||
|   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | ||||
|   See the License for the specific language governing permissions and | ||||
|   limitations under the License. | ||||
|  | ||||
|  | ||||
| --> | ||||
|  | ||||
| <script type="text/x-red" data-template-name="Discover"> | ||||
| <div class="form-row"> | ||||
|     <label for="node-input-username"><i class="icon-tag"></i> Username:</label> | ||||
|     <input type="text" id="node-input-username" placeholder="username"> | ||||
|   </div> | ||||
|   <div class="form-row"> | ||||
|     <label for="node-input-name"><i class="icon-tag"></i> Name</label> | ||||
|     <input type="text" id="node-input-name" placeholder="Name"> | ||||
|   </div> | ||||
| </script> | ||||
|  | ||||
| <!-- Next, some simple help text is provided for the node.                   --> | ||||
| <script type="text/x-red" data-help-name="Discover"> | ||||
|     <p>This node looks for a Philips Hue Bridge in the local network.</p><p> The node has 2 outputs, the first one contains the IP address of the first discovered bridge and the second one the lights registered to that bridge (in JSON format).</p> <p>To use the node you need to have obtained a valid auth token (or username) from your Philips Hue Bridge. Read <a href="http://developers.meethue.com/gettingstarted.html" target="_blank">here</a> on how to do this.</p> | ||||
| </script> | ||||
|  | ||||
| <!-- Finally, the node type is registered along with all of its properties   --> | ||||
| <script type="text/javascript"> | ||||
|     RED.nodes.registerType('Discover',{ | ||||
|         category: 'advanced-input',      // the palette category | ||||
|         color:"#EFEFEF", | ||||
|         defaults: {             // defines the editable properties of the node | ||||
|             name: {value:""},   //  along with default values. | ||||
|             username: {value:"", required:true} | ||||
|         }, | ||||
|         inputs:1,                // set the number of inputs - only 0 or 1 | ||||
|         outputs:2,               // set the number of outputs - 0 to n | ||||
|         icon: "philipshue.png",    // set the icon (held in public/icons) | ||||
|         label: function() {      // sets the default label contents | ||||
|             return this.name||this.topic||"Discover"; | ||||
|         }, | ||||
|         labelStyle: function() { // sets the class to apply to the label | ||||
|             return this.name?"node_label_italic":""; | ||||
|         } | ||||
|     }); | ||||
| </script> | ||||
| @@ -1,105 +0,0 @@ | ||||
| /** | ||||
|  * philips_hue.js | ||||
|  * Basic functionality for accessing a Philips Hue wireless Lamp | ||||
|  * Allows for bridge/gateway detection and light scanning. | ||||
|  * Requires node-hue-api https://github.com/peter-murray/node-hue-api | ||||
|  * Copyright 2013 Charalampos Doukas - @BuildingIoT | ||||
|  * | ||||
|  * Licensed under the Apache License, Version 2.0 (the "License"); | ||||
|  * you may not use this file except in compliance with the License. | ||||
|  * You may obtain a copy of the License at | ||||
|  * | ||||
|  * http://www.apache.org/licenses/LICENSE-2.0 | ||||
|  * | ||||
|  * Unless required by applicable law or agreed to in writing, software | ||||
|  * distributed under the License is distributed on an "AS IS" BASIS, | ||||
|  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | ||||
|  * See the License for the specific language governing permissions and | ||||
|  * limitations under the License. | ||||
|  **/ | ||||
|  | ||||
|  | ||||
| //Require node-hue-api | ||||
| var hue = require("node-hue-api"); | ||||
| var HueApi = require("node-hue-api").HueApi; | ||||
|  | ||||
| // Require main module | ||||
| var RED = require(process.env.NODE_RED_HOME+"/red/red"); | ||||
|  | ||||
| //store the IP address of the Hue Gateway | ||||
| var gw_ipaddress = ""; | ||||
|  | ||||
| var username; | ||||
|  | ||||
| // The main node definition - most things happen in here | ||||
| function HueNodeDiscovery(n) { | ||||
|     // Create a RED node | ||||
|     RED.nodes.createNode(this,n); | ||||
|  | ||||
|     var node = this; | ||||
|  | ||||
|     //get username from user input | ||||
|     this.username = n.username; | ||||
|     | ||||
|  | ||||
|     // Store local copies of the node configuration (as defined in the .html) | ||||
|     this.topic = n.topic; | ||||
|  | ||||
|     this.on("input", function(msg){ | ||||
|          | ||||
|         //start with detecting the IP address of the Hue gateway in the local network: | ||||
|         hue.locateBridges(function(err, result) { | ||||
|             var msg = {}; | ||||
|             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; | ||||
|                 msg.payload = this.gw_ipaddress; | ||||
|  | ||||
|                 //get light info: | ||||
|                 var api = new HueApi(this.gw_ipaddress, node.username); | ||||
|                 api.lights(function(err, lights) { | ||||
|                     var msg2 = {}; | ||||
|                     if (err) throw err; | ||||
|                     var lights_discovered = JSON.stringify(lights, null, 2); | ||||
|                     msg2.topic = "Lights"; | ||||
|                     msg2.payload = lights_discovered; | ||||
|                     node.send([msg, msg2]); | ||||
|  | ||||
|                 }); | ||||
|             } | ||||
|             else { | ||||
|                 //bridge not found: | ||||
|                 var msg = {}; | ||||
|                 msg.payload = "Bridge not found!"; | ||||
|                 node.send(msg); | ||||
|             } | ||||
|  | ||||
|         }); | ||||
|  | ||||
|     }); | ||||
|  | ||||
|  | ||||
|     this.on("close", function() { | ||||
|         // Called when the node is shutdown - eg on redeploy. | ||||
|         // Allows ports to be closed, connections dropped etc. | ||||
|         // eg: this.client.disconnect(); | ||||
|     }); | ||||
|  | ||||
|  } | ||||
|  | ||||
|  //hue debugging on the output: | ||||
|  var displayResult = function(result) { | ||||
|     console.log(result); | ||||
| }; | ||||
|  | ||||
| var displayError = function(err) { | ||||
|     console.error(err); | ||||
| }; | ||||
|  | ||||
|  | ||||
|  | ||||
| // Register the node by name. This must be called before overriding any of the | ||||
| // Node functions. | ||||
| RED.nodes.registerType("Discover",HueNodeDiscovery); | ||||
										
											Binary file not shown.
										
									
								
							| Before Width: | Height: | Size: 9.2 KiB | 
| @@ -1,80 +0,0 @@ | ||||
| <!-- | ||||
|   Copyright 2013 Charalampos Doukas. | ||||
|  | ||||
|   Licensed under the Apache License, Version 2.0 (the "License"); | ||||
|   you may not use this file except in compliance with the License. | ||||
|   You may obtain a copy of the License at | ||||
|  | ||||
|   http://www.apache.org/licenses/LICENSE-2.0 | ||||
|  | ||||
|   Unless required by applicable law or agreed to in writing, software | ||||
|   distributed under the License is distributed on an "AS IS" BASIS, | ||||
|   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | ||||
|   See the License for the specific language governing permissions and | ||||
|   limitations under the License. | ||||
|  | ||||
|  | ||||
| --> | ||||
|  | ||||
| <script type="text/x-red" data-template-name="HueNode"> | ||||
|   <div class="form-row"> | ||||
|      <label for="node-input-topic"><i class="icon-tasks"></i>Hue App Username:</label> | ||||
|      <input type="text" id="node-input-username" placeholder="username"> | ||||
|   </div> | ||||
|  | ||||
|   <div class="form-row"> | ||||
|     <label for="node-input-name"><i class="icon-tag"></i>Lamp ID:</label> | ||||
|     <input type="text" id="node-input-lamp_id" placeholder="lamp_id"> | ||||
|   </div> | ||||
|  | ||||
|   <div class="form-row"> | ||||
|     <label for="node-input-name"><i class="icon-tag"></i>Lamp Status:</label> | ||||
|     <select id="node-input-lamp_status" placeholder="lamp_status"> | ||||
|     <option value="AUTO">AUTO</option> | ||||
|     <option value="ON">ON</option> | ||||
|     <option value="OFF">OFF</option> | ||||
|     </select> | ||||
|   </div> | ||||
|  | ||||
|   <div class="form-row"> | ||||
|     <label for="node-input-color"><i class="icon-tag"></i>Select color:</label> | ||||
|     <input type="text" id="node-input-color" placeholder="color"> | ||||
|   </div> | ||||
|  | ||||
|   <div class="form-row"> | ||||
|     <label for="node-input-name"><i class="icon-tag"></i> Name</label> | ||||
|     <input type="text" id="node-input-name" placeholder="Name"> | ||||
|   </div> | ||||
| </script> | ||||
|  | ||||
| <!-- Next, some simple help text is provided for the node.                   --> | ||||
| <script type="text/x-red" data-help-name="HueNode"> | ||||
|     <p>This node implements some basic functionality for managing a Philips Hue wireless Lamp system.</p> | ||||
|     <p>To use it you need to have obtained a valid auth token (or username) from your Philips Hue Bridge. Read <a href="http://developers.meethue.com/gettingstarted.html" target="_blank">here</a> on how to do this.</p> | ||||
|     <p>You can enter the ID (1, 2, ...) of a Lamp and turn it ON or OFF and also set its color. </p><p>By setting the status to AUTO, you can set the ON/OFF status as a message payload (e.g., msg.payload="ON") and the color through the message topic (e.g., msg.topic="EBF5FF") on the node input. Please note, in case you use both, the status selection overides the msg.payload!</p><p>Also, if you pass something like msg.payload="ALERT" the Lamp will flash once.</p> | ||||
| </script> | ||||
|  | ||||
| <!-- Finally, the node type is registered along with all of its properties   --> | ||||
| <script type="text/javascript"> | ||||
|     RED.nodes.registerType('HueNode',{ | ||||
|         category: 'advanced-input',      // the palette category | ||||
|         color:"#EFEFEF", | ||||
|         defaults: {             // defines the editable properties of the node | ||||
|             name: {value:""},   //  along with default values. | ||||
|             username: {value:"", required:true}, | ||||
|             discovery_mode: {value: "", required:false}, | ||||
|             lamp_id: {value:"", required:false}, | ||||
|             color: {value:"EBF5FF"}, | ||||
|             lamp_status:{} | ||||
|         }, | ||||
|         inputs:1,                // set the number of inputs - only 0 or 1 | ||||
|         outputs:1,               // set the number of outputs - 0 to n | ||||
|         icon: "hue.png",    // set the icon (held in public/icons) | ||||
|         label: function() {      // sets the default label contents | ||||
|             return this.name||this.topic||"HueNode"; | ||||
|         }, | ||||
|         labelStyle: function() { // sets the class to apply to the label | ||||
|             return this.name?"node_label_italic":""; | ||||
|         } | ||||
|     }); | ||||
| </script> | ||||
| @@ -1,145 +0,0 @@ | ||||
| /** | ||||
|  * philips_hue.js | ||||
|  * Basic functionality for accessing and contolling a Philips Hue wireless Lamp | ||||
|  * Allows for bridge/gateway and light scanning, as well as Light ON/OFF/ALERT status update | ||||
|  * Requires node-hue-api https://github.com/peter-murray/node-hue-api | ||||
|  * Copyright 2013 Charalampos Doukas - @BuildingIoT | ||||
|  * | ||||
|  * Licensed under the Apache License, Version 2.0 (the "License"); | ||||
|  * you may not use this file except in compliance with the License. | ||||
|  * You may obtain a copy of the License at | ||||
|  * | ||||
|  * http://www.apache.org/licenses/LICENSE-2.0 | ||||
|  * | ||||
|  * Unless required by applicable law or agreed to in writing, software | ||||
|  * distributed under the License is distributed on an "AS IS" BASIS, | ||||
|  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | ||||
|  * See the License for the specific language governing permissions and | ||||
|  * limitations under the License. | ||||
|  **/ | ||||
|  | ||||
|  | ||||
| //Require node-hue-api | ||||
| var hue = require("node-hue-api"); | ||||
| var HueApi = require("node-hue-api").HueApi; | ||||
|  | ||||
| // Require main module | ||||
| var RED = require(process.env.NODE_RED_HOME+"/red/red"); | ||||
|  | ||||
| //store the IP address of the Hue Gateway | ||||
| var gw_ipaddress = ""; | ||||
|  | ||||
|  | ||||
| var username, lamp_status, lamp_id, color; | ||||
|  | ||||
| function hexToRgb(hex) { | ||||
|     var result = /^#?([a-f\d]{2})([a-f\d]{2})([a-f\d]{2})$/i.exec(hex); | ||||
|     return result ? { | ||||
|         r: parseInt(result[1], 16), | ||||
|         g: parseInt(result[2], 16), | ||||
|         b: parseInt(result[3], 16) | ||||
|     } : null; | ||||
| } | ||||
|  | ||||
|  | ||||
| // The main node definition - most things happen in here | ||||
| function HueNode(n) { | ||||
|     // Create a RED node | ||||
|     RED.nodes.createNode(this,n); | ||||
|  | ||||
|     var node = this; | ||||
|  | ||||
|     //get parameters from user | ||||
|     this.username = n.username; | ||||
|     this.lamp_status = n.lamp_status; | ||||
|     this.lamp_id = n.lamp_id; | ||||
|     this.color = n.color; | ||||
|     | ||||
|  | ||||
|     // 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){ | ||||
|             //set the lamp status | ||||
|             //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; | ||||
|                     if(msg.payload=="ALERT"){ | ||||
|                         status = "ALERT"; | ||||
|                     } | ||||
|                     else if(node.lamp_status=="ON" || msg.payload=="ON") status = "ON"; | ||||
|                     else if(node.lamp_status=="OFF" || msg.payload=="OFF") status = "OFF"; | ||||
|  | ||||
|  | ||||
|                     if(status=="ALERT") { | ||||
|                         api.setLightState(node.lamp_id, state.alert()).then(displayResult).fail(displayError).done(); | ||||
|                     } | ||||
|                     else if(status=="ON") { | ||||
|                         if(node.color==null) { | ||||
|                             api.setLightState(node.lamp_id, state.on().rgb(hexToRgb(msg.topic).r,hexToRgb(msg.topic).g,hexToRgb(msg.topic).b)).then(displayResult).fail(displayError).done(); | ||||
|                         } | ||||
|                         else { | ||||
|                             api.setLightState(node.lamp_id, state.on().rgb(hexToRgb(node.color).r,hexToRgb(node.color).g,hexToRgb(node.color).b)).then(displayResult).fail(displayError).done(); | ||||
|                         } | ||||
|                     } | ||||
|                     else { | ||||
|                         api.setLightState(node.lamp_id, state.off()).then(displayResult).fail(displayError).done(); | ||||
|                     } | ||||
|  | ||||
|                     msg2.payload = 'Light with ID: '+node.lamp_id+ ' was set to '+status; | ||||
|                     node.send(msg2); | ||||
|                 } | ||||
|                 else { | ||||
|                     //bridge not found: | ||||
|                     var msg = {}; | ||||
|                     msg.payload = "Bridge not found!"; | ||||
|                     node.send(msg); | ||||
|                 } | ||||
|  | ||||
|             }); | ||||
|     }); | ||||
|  | ||||
|  | ||||
|     this.on("close", function() { | ||||
|         // Called when the node is shutdown - eg on redeploy. | ||||
|         // Allows ports to be closed, connections dropped etc. | ||||
|         // eg: this.client.disconnect(); | ||||
|     }); | ||||
|  | ||||
|  } | ||||
|  | ||||
|  //hue debugging on the output: | ||||
|  var displayResult = function(result) { | ||||
|     console.log(result); | ||||
| }; | ||||
|  | ||||
| var displayError = function(err) { | ||||
|     console.error(err); | ||||
| }; | ||||
|  | ||||
|  | ||||
|  | ||||
|  | ||||
| // Register the node by name. This must be called before overriding any of the | ||||
| // Node functions. | ||||
| RED.nodes.registerType("HueNode",HueNode); | ||||
		Reference in New Issue
	
	Block a user