node-red-contrib-huemagic 3.0.0 → 4.0.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (138) hide show
  1. package/README.md +764 -603
  2. package/examples/Hue Bridge.json +189 -35
  3. package/examples/Hue Brightness.json +124 -14
  4. package/examples/Hue Buttons.json +88 -0
  5. package/examples/Hue Group.json +575 -63
  6. package/examples/Hue Light.json +805 -58
  7. package/examples/Hue Magic.json +69 -24
  8. package/examples/Hue Motion.json +110 -42
  9. package/examples/Hue Rules.json +105 -37
  10. package/examples/Hue Scene.json +145 -28
  11. package/examples/Hue Temperature.json +124 -14
  12. package/huemagic/animations/019-christmas.json +30 -0
  13. package/huemagic/animations/020-superhero.json +56 -0
  14. package/huemagic/animations/021-neoncity.json +52 -0
  15. package/huemagic/animations/previews/006-fireplace.gif +0 -0
  16. package/huemagic/animations/previews/013-strobo.gif +0 -0
  17. package/huemagic/animations/previews/014-randomrainbow.gif +0 -0
  18. package/huemagic/animations/previews/016-milkyway.gif +0 -0
  19. package/huemagic/animations/previews/018-forest.gif +0 -0
  20. package/huemagic/animations/previews/019-christmas.gif +0 -0
  21. package/huemagic/animations/previews/020-superhero.gif +0 -0
  22. package/huemagic/animations/previews/021-neoncity.gif +0 -0
  23. package/huemagic/hue-bridge-config.html +105 -61
  24. package/huemagic/hue-bridge-config.js +631 -319
  25. package/huemagic/hue-bridge.html +41 -21
  26. package/huemagic/hue-bridge.js +190 -396
  27. package/huemagic/hue-brightness.html +127 -59
  28. package/huemagic/hue-brightness.js +111 -55
  29. package/huemagic/hue-buttons.html +197 -0
  30. package/huemagic/hue-buttons.js +158 -0
  31. package/huemagic/hue-group.html +137 -66
  32. package/huemagic/hue-group.js +387 -403
  33. package/huemagic/hue-light.html +132 -64
  34. package/huemagic/hue-light.js +544 -378
  35. package/huemagic/hue-magic.html +36 -20
  36. package/huemagic/hue-magic.js +49 -27
  37. package/huemagic/hue-motion.html +127 -59
  38. package/huemagic/hue-motion.js +105 -101
  39. package/huemagic/hue-rules.html +121 -50
  40. package/huemagic/hue-rules.js +89 -63
  41. package/huemagic/hue-scene.html +95 -114
  42. package/huemagic/hue-scene.js +64 -95
  43. package/huemagic/hue-temperature.html +127 -59
  44. package/huemagic/hue-temperature.js +120 -56
  45. package/huemagic/icons/hue-bridge.png +0 -0
  46. package/huemagic/icons/hue-bridge.svg +3 -0
  47. package/huemagic/icons/hue-brightness.png +0 -0
  48. package/huemagic/icons/hue-brightness.svg +11 -0
  49. package/huemagic/icons/hue-buttons.png +0 -0
  50. package/huemagic/icons/hue-buttons.svg +4 -0
  51. package/huemagic/icons/hue-group.png +0 -0
  52. package/huemagic/icons/hue-group.svg +12 -0
  53. package/huemagic/icons/hue-light.png +0 -0
  54. package/huemagic/icons/hue-light.svg +3 -0
  55. package/huemagic/icons/hue-magic.png +0 -0
  56. package/huemagic/icons/hue-magic.svg +3 -0
  57. package/huemagic/icons/hue-motion.png +0 -0
  58. package/huemagic/icons/hue-motion.svg +9 -0
  59. package/huemagic/icons/hue-rules.png +0 -0
  60. package/huemagic/icons/hue-rules.svg +4 -0
  61. package/huemagic/icons/hue-scene.png +0 -0
  62. package/huemagic/icons/hue-scene.svg +5 -0
  63. package/huemagic/icons/hue-temperature.png +0 -0
  64. package/huemagic/icons/hue-temperature.svg +7 -0
  65. package/huemagic/locales/de/hue-bridge-config.html +17 -12
  66. package/huemagic/locales/de/hue-bridge-config.json +7 -5
  67. package/huemagic/locales/de/hue-bridge.html +64 -145
  68. package/huemagic/locales/de/hue-bridge.json +6 -17
  69. package/huemagic/locales/de/hue-brightness.html +50 -50
  70. package/huemagic/locales/de/hue-brightness.json +6 -5
  71. package/huemagic/locales/de/hue-buttons.html +58 -0
  72. package/huemagic/locales/de/{hue-button.json → hue-buttons.json} +7 -11
  73. package/huemagic/locales/de/hue-group.html +46 -122
  74. package/huemagic/locales/de/hue-group.json +5 -5
  75. package/huemagic/locales/de/hue-light.html +68 -116
  76. package/huemagic/locales/de/hue-light.json +5 -5
  77. package/huemagic/locales/de/hue-magic.html +65 -57
  78. package/huemagic/locales/de/hue-magic.json +2 -1
  79. package/huemagic/locales/de/hue-motion.html +47 -50
  80. package/huemagic/locales/de/hue-motion.json +5 -5
  81. package/huemagic/locales/de/hue-rules.html +68 -73
  82. package/huemagic/locales/de/hue-rules.json +5 -2
  83. package/huemagic/locales/de/hue-scene.html +23 -32
  84. package/huemagic/locales/de/hue-scene.json +5 -2
  85. package/huemagic/locales/de/hue-temperature.html +51 -48
  86. package/huemagic/locales/de/hue-temperature.json +6 -5
  87. package/huemagic/locales/en-US/hue-bridge-config.html +17 -12
  88. package/huemagic/locales/en-US/hue-bridge-config.json +5 -3
  89. package/huemagic/locales/en-US/hue-bridge.html +64 -145
  90. package/huemagic/locales/en-US/hue-bridge.json +5 -16
  91. package/huemagic/locales/en-US/hue-brightness.html +50 -50
  92. package/huemagic/locales/en-US/hue-brightness.json +5 -2
  93. package/huemagic/locales/en-US/hue-buttons.html +58 -0
  94. package/huemagic/locales/en-US/{hue-button.json → hue-buttons.json} +6 -4
  95. package/huemagic/locales/en-US/hue-group.html +46 -122
  96. package/huemagic/locales/en-US/hue-group.json +4 -2
  97. package/huemagic/locales/en-US/hue-light.html +68 -116
  98. package/huemagic/locales/en-US/hue-light.json +4 -2
  99. package/huemagic/locales/en-US/hue-magic.html +65 -57
  100. package/huemagic/locales/en-US/hue-magic.json +3 -1
  101. package/huemagic/locales/en-US/hue-motion.html +47 -50
  102. package/huemagic/locales/en-US/hue-motion.json +4 -2
  103. package/huemagic/locales/en-US/hue-rules.html +68 -73
  104. package/huemagic/locales/en-US/hue-rules.json +5 -2
  105. package/huemagic/locales/en-US/hue-scene.html +23 -32
  106. package/huemagic/locales/en-US/hue-scene.json +5 -2
  107. package/huemagic/locales/en-US/hue-temperature.html +51 -48
  108. package/huemagic/locales/en-US/hue-temperature.json +5 -2
  109. package/huemagic/utils/api.js +290 -0
  110. package/huemagic/utils/color.js +382 -0
  111. package/{utils → huemagic/utils}/merge.js +4 -6
  112. package/huemagic/utils/messages.js +447 -0
  113. package/package.json +9 -15
  114. package/examples/Hue Button.json +0 -40
  115. package/examples/Hue Switch.json +0 -40
  116. package/examples/Hue Tap.json +0 -40
  117. package/huemagic/hue-button.html +0 -132
  118. package/huemagic/hue-button.js +0 -143
  119. package/huemagic/hue-switch.html +0 -132
  120. package/huemagic/hue-switch.js +0 -163
  121. package/huemagic/hue-tap.html +0 -132
  122. package/huemagic/hue-tap.js +0 -123
  123. package/huemagic/icons/hue-button.png +0 -0
  124. package/huemagic/icons/hue-switch.png +0 -0
  125. package/huemagic/icons/hue-tap.png +0 -0
  126. package/huemagic/locales/de/hue-button.html +0 -64
  127. package/huemagic/locales/de/hue-switch.html +0 -64
  128. package/huemagic/locales/de/hue-switch.json +0 -35
  129. package/huemagic/locales/de/hue-tap.html +0 -55
  130. package/huemagic/locales/de/hue-tap.json +0 -27
  131. package/huemagic/locales/en-US/hue-button.html +0 -64
  132. package/huemagic/locales/en-US/hue-switch.html +0 -64
  133. package/huemagic/locales/en-US/hue-switch.json +0 -35
  134. package/huemagic/locales/en-US/hue-tap.html +0 -55
  135. package/huemagic/locales/en-US/hue-tap.json +0 -27
  136. package/utils/color.js +0 -9
  137. package/utils/messages.js +0 -658
  138. package/utils/rgb.js +0 -188
@@ -6,9 +6,19 @@ module.exports = function(RED)
6
6
  {
7
7
  RED.nodes.createNode(this, config);
8
8
 
9
- var scope = this;
10
- let bridge = RED.nodes.getNode(config.bridge);
11
- let { HueSceneMessage } = require('../utils/messages');
9
+ const scope = this;
10
+ const bridge = RED.nodes.getNode(config.bridge);
11
+
12
+ // GET TARGET WIRED GROUPS
13
+ this.targetGroups = {};
14
+ for (var w = scope.wires[0].length - 1; w >= 0; w--)
15
+ {
16
+ let oneWiredNode = RED.nodes.getNode(scope.wires[0][w]);
17
+ if(oneWiredNode && oneWiredNode.type == "hue-group" && oneWiredNode.exportedConfig && oneWiredNode.exportedConfig.groupid && oneWiredNode.exportedConfig.groupid.length > 1)
18
+ {
19
+ this.targetGroups[oneWiredNode.exportedConfig.groupid] = true;
20
+ }
21
+ }
12
22
 
13
23
  //
14
24
  // CHECK CONFIG
@@ -22,122 +32,81 @@ module.exports = function(RED)
22
32
  // ENABLE SCENE
23
33
  this.on('input', function(msg, send, done)
24
34
  {
25
- // Node-RED < 1.0
26
- send = send || function() { scope.send.apply(scope,arguments); }
35
+ // REDEFINE SEND AND DONE IF NOT AVAILABLE
36
+ done = done || function() { scope.done.apply(scope,arguments); }
27
37
 
28
- var groupID = config.groupid;
29
- var sceneDef = config.sceneid;
38
+ // TARGET GROUP & SCENE
39
+ const groupIDS = (typeof msg.payload != 'undefined' && typeof msg.payload.group != 'undefined') ? msg.payload.group : [];
40
+ const sceneDef = (typeof msg.payload != 'undefined' && typeof msg.payload.scene != 'undefined') ? msg.payload.scene : config.sceneid;
30
41
 
31
- // PASSED SCENE NAME?
32
- if(typeof msg.payload === 'string' || msg.payload instanceof String)
33
- {
34
- sceneDef = msg.payload;
35
- }
36
- else
37
- {
38
- groupID = (typeof msg.payload != 'undefined' && typeof msg.payload.group != 'undefined') ? msg.payload.group : groupID;
39
- sceneDef = (typeof msg.payload != 'undefined' && typeof msg.payload.scene != 'undefined') ? msg.payload.scene : sceneDef;
40
- }
42
+ // PREPARE TARGET GROUPS
43
+ let copyOfTargetGroups = Object.keys(scope.targetGroups);
44
+ if(typeof groupIDS == 'string') { copyOfTargetGroups.push(groupIDS); }
45
+ else if(typeof groupIDS == 'object') { copyOfTargetGroups.concat(groupIDS); }
46
+ else { return false; }
41
47
 
42
- if(config.sceneid)
43
- {
44
- bridge.client.scenes.getById(config.sceneid)
45
- .then(scene => {
46
- scope.proceedSceneAction(scene, groupID, send, done);
47
- });
48
- }
49
- else if(sceneDef)
50
- {
51
- bridge.client.scenes.getAll()
52
- .then(scenes => {
53
- for (var scene of scenes)
54
- {
55
- if(scene.id == sceneDef)
56
- {
57
- scope.proceedSceneAction(scene, groupID, send, done);
58
- break;
59
- }
60
- else if(scene.name == sceneDef)
61
- {
62
- scope.proceedSceneAction(scene, groupID, send, done);
63
- break;
64
- }
65
- }
66
- });
67
- }
68
- else
48
+ // CREATE PATCH
49
+ let patchObject = {};
50
+
51
+ // NO SCENE?
52
+ if(!sceneDef)
69
53
  {
70
54
  // ERROR
71
55
  this.status({fill: "red", shape: "ring", text: "hue-scene.node.no-id"});
56
+ scope.error("Scene ID not found");
57
+ return false;
72
58
  }
73
- });
74
59
 
75
-
76
- //
77
- // PROCEED SCENE ACTION
78
- this.proceedSceneAction = function(scene, applyOnGroup = false, send, done)
79
- {
80
- // CHECK IF SCENE SHOULD BE APPLIED TO A GROUP
81
- if(applyOnGroup)
60
+ // RECALL ON GROUP? -> USE API v1
61
+ if(copyOfTargetGroups.length > 0)
82
62
  {
83
- var groupID = parseInt(applyOnGroup);
84
- bridge.client.groups.getById(groupID)
85
- .then(group =>
86
- {
87
- group.on = true;
88
- group.scene = scene;
89
- return bridge.client.groups.save(group);
90
- })
91
- .then(groupInfo =>
63
+ let targetSceneID = bridge.resources[sceneDef].id_v1.replace("/scenes/", "");
64
+
65
+ // SEND STATUS
66
+ scope.status({fill: "blue", shape: "dot", text: "hue-scene.node.recalled-on-group"})
67
+
68
+ // FIND GROUP AND RECALL SCENE
69
+ for (var g = copyOfTargetGroups.length - 1; g >= 0; g--)
92
70
  {
93
- // SEND STATUS
94
- scope.status({fill: "blue", shape: "dot", text: "hue-scene.node.recalled-on-group"});
71
+ let targetGroup = bridge.get("group", copyOfTargetGroups[g]);
95
72
 
96
- // SEND MESSAGE
97
- if(!config.skipevents)
73
+ if(targetGroup)
98
74
  {
99
- var hueScene = new HueSceneMessage(scene);
100
- send(hueScene.msg);
75
+ bridge.patch("group", targetGroup.info.idV1 + "/action", { "scene": targetSceneID }, 1)
76
+ .catch(function(errors) {
77
+ scope.error(errors);
78
+ });
101
79
  }
102
- if(done) { done(); }
80
+ }
103
81
 
104
- // RESET STATUS AFTER 3 SEC
105
- setTimeout(function() {
106
- scope.status({});
107
- }, 3000);
108
- })
109
- .catch(error => {
110
- scope.error(error, msg);
111
- if(done) { done(error); }
112
- });
82
+ // RESET STATUS AFTER 2 SECONDS
83
+ setTimeout(function() {
84
+ scope.status({});
85
+ }, 2000);
113
86
  }
114
87
  else
115
88
  {
116
- // RECALL A SCENE
117
- bridge.client.scenes.recall(scene)
118
- .then(recalledScene => {
119
- // SEND STATUS
120
- scope.status({fill: "blue", shape: "dot", text: "hue-scene.node.recalled"});
89
+ // RECALL SCENE
90
+ patchObject["recall"] = { status: "active" };
121
91
 
122
- // SEND MESSAGE
123
- if(!config.skipevents)
124
- {
125
- var hueScene = new HueSceneMessage(scene);
126
- send(hueScene.msg);
127
- }
92
+ // CHANGE NODE UI STATE
93
+ scope.status({fill: "grey", shape: "ring", text: "hue-scene.node.command"});
94
+
95
+ // PATCH!
96
+ bridge.patch("scene", sceneDef, patchObject)
97
+ .then(function()
98
+ {
99
+ scope.status({fill: "blue", shape: "dot", text: "hue-scene.node.recalled"});
128
100
  if(done) { done(); }
129
101
 
130
- // RESET STATUS AFTER 3 SEC
102
+ // RESET STATUS AFTER 1 SECOND
131
103
  setTimeout(function() {
132
104
  scope.status({});
133
- }, 3000);
105
+ }, 1000);
134
106
  })
135
- .catch(error => {
136
- scope.error(error, msg);
137
- if(done) { done(error); }
138
- });
107
+ .catch(function(errors) { scope.error(errors); });
139
108
  }
140
- }
109
+ });
141
110
  }
142
111
 
143
112
  RED.nodes.registerType("hue-scene", HueScene);
@@ -1,32 +1,34 @@
1
1
  <script type="text/x-red" data-template-name="hue-temperature">
2
2
  <div class="form-row">
3
3
  <label for="node-input-name"><i class="fa fa-tag"></i> <span data-i18n="hue-temperature.config.name"></span></label>
4
- <input type="text" id="node-input-name" data-i18n="[placeholder]hue-temperature.config.input-name">
4
+ <input type="text" id="node-input-name" data-i18n="[placeholder]hue-temperature.config.input-name" style="width: calc(100% - 105px)">
5
5
  </div>
6
6
  <div class="form-row">
7
7
  <label for="node-input-bridge"><i class="fa fa-server"></i> Bridge</label>
8
- <input type="text" id="node-input-bridge">
8
+ <input type="text" id="node-input-bridge" style="width: calc(100% - 105px)">
9
9
  </div>
10
10
  <div class="form-row">
11
11
  <label for="node-input-sensorid"><i class="fa fa-thermometer-three-quarters"></i> <span data-i18n="hue-temperature.config.sensor"></span></label>
12
- <div style="display: inline-block; position: relative; width: 70%; height: 20px;">
13
- <div style="position: absolute; left: 0px; right: 40px;">
14
- <input type="text" id="node-input-sensorid" placeholder="1" style="width: 100%"/>
12
+ <div style="display: inline-flex; width: calc(100% - 105px)">
13
+ <div id="input-select-toggle" style="flex-grow: 1;">
14
+ <input type="text" id="node-input-sensorid" placeholder="00000000-0000-0000-0000-000000000000" style="width: 100%"/>
15
15
  </div>
16
- <a id="node-config-input-scan-temp-sensors" class="editor-button" style="position: absolute; right: 0px; top: 0px;">
16
+ <button id="node-config-input-scan-temp-sensors" type="button" class="red-ui-button" style="margin-left: 10px;">
17
17
  <i class="fa fa-search"></i>
18
- </a>
18
+ </button>
19
19
  </div>
20
20
  </div>
21
- <div class="form-row">
22
- <label for="node-input-skipevents"><i class="fa fa-sign-out"></i> <span data-i18n="hue-temperature.config.skipevents"></span></label>
23
- <input type="checkbox" id="node-input-skipevents" style="display:inline-block; width:22px; vertical-align:baseline;"><span data-i18n="hue-temperature.config.skipevents-node"></span>
24
- </label>
21
+ <div class="form-row" style="margin-top: 30px">
22
+ <div style="display: inline-flex; width: calc(100% - 105px)">
23
+ <input type="checkbox" id="node-input-skipevents" style="flex: 15px;">
24
+ <span data-i18n="hue-temperature.config.skipevents-node" style="width: 100%; margin-left: 10px;"></span>
25
+ </div>
25
26
  </div>
26
27
  <div class="form-row">
27
- <label for="node-input-universalevents"><i class="fa fa-bullhorn"></i> <span data-i18n="hue-temperature.config.universalevents"></span></label>
28
- <input type="checkbox" id="node-input-universalevents" style="display:inline-block; width:22px; vertical-align:baseline;"><span data-i18n="hue-temperature.config.universalevents-node"></span>
29
- </label>
28
+ <div style="display: inline-flex; width: calc(100% - 105px)">
29
+ <input type="checkbox" id="node-input-initevents" style="flex: 15px;">
30
+ <span data-i18n="hue-temperature.config.sendinitevents-node" style="width: 100%; margin-left: 10px;"></span>
31
+ </div>
30
32
  </div>
31
33
  </script>
32
34
 
@@ -35,95 +37,161 @@
35
37
  category: 'HueMagic',
36
38
  color: '#1abc9c',
37
39
  defaults: {
38
- name: {value:""},
39
- bridge: {type: "hue-bridge", required: true},
40
- sensorid: {value:"", required: false, validate: function(id) {
41
- if(id.length < 1) { return true; }
42
- else if(!isNaN(id)) { return true; }
43
- else { return false; }
44
- }},
45
- skipevents: {value: false},
46
- universalevents: {value: false}
40
+ name: { value:"" },
41
+ bridge: { type: "hue-bridge", required: true },
42
+ sensorid: { value:"", required: false },
43
+ skipevents: { value: false },
44
+ initevents: { value: false }
47
45
  },
48
46
  inputs: 1,
49
47
  outputs: 1,
48
+ align: 'left',
49
+ icon: "hue-temperature.png",
50
+ label: function() {
51
+ return this.name || this._("hue-temperature.node.title");
52
+ },
53
+ paletteLabel: function() {
54
+ return this._("hue-temperature.node.title");
55
+ },
50
56
  inputLabels: function() {
51
57
  return this._("hue-temperature.node.input");
52
58
  },
53
59
  outputLabels: function() {
54
60
  return this._("hue-temperature.node.output");
55
61
  },
56
- align: 'right',
57
- icon: "hue-temperature.png",
58
- paletteLabel: function() {
59
- return this._("hue-temperature.node.title");
60
- },
61
- label: function() {
62
- return this.name || this._("hue-temperature.node.title");
63
- },
64
62
  oneditprepare: function()
65
63
  {
66
- var scope = this;
64
+ const scope = this;
65
+ let options = [];
67
66
 
68
- function manualTemperatureSensorID()
67
+ function manualInput()
69
68
  {
69
+ // GET CURRENT SELECTED VALUE
70
70
  var current = $('#node-input-sensorid').val();
71
- $('#node-input-sensorid').replaceWith('<input type="text" id="node-input-sensorid" style="width: 100%"/>');
72
- $('#node-input-sensorid').val(current);
71
+
72
+ // REMOVE SELECT FIELD
73
+ $('#input-select-toggle').empty();
74
+
75
+ // CREATE NEW INPUT FIELD
76
+ $('#input-select-toggle').append('<input type="text" id="node-input-sensorid" placeholder="00000000-0000-0000-0000-000000000000" style="width: 100%" value="'+current+'" />');
77
+
78
+ // CHANGE BUTTON ICON
79
+ var button = $("#node-config-input-scan-temp-sensors");
80
+ var buttonIcon = button.find("i");
81
+ buttonIcon.removeClass("fa-pencil");
82
+ buttonIcon.addClass("fa-search");
73
83
  }
74
84
 
75
- function searchAndSelectTemperatureSensor()
85
+ function searchAndSelect()
76
86
  {
87
+ // GET CURRENT BRIDGE CONFIGURATION
88
+ var bridgeConfig = RED.nodes.node($('#node-input-bridge option:selected').val());
89
+ if(!bridgeConfig) { return false; }
90
+
91
+ // GET CURRENT SELECTED VALUE
77
92
  var current = $('#node-input-sensorid').val();
78
- $('#node-input-sensorid').replaceWith('<select id="node-input-sensorid" style="width: 100%"></select>');
79
- $('#node-input-sensorid').append('<option selected="selected" value="null">'+scope._("hue-temperature.config.searching")+'</option>');
80
93
 
81
- var bridgeConfig = RED.nodes.node($('#node-input-bridge option:selected').val());
82
- $.get('hue/sensors', {bridge: bridgeConfig.bridge, key: bridgeConfig.key, type: "ZLLTemperature"})
83
- .done( function(data) {
84
- var temperatureSensors = JSON.parse(data);
94
+ // TRIGGER SEARCHING NOTIFICATION
95
+ var notification = RED.notify(scope._("hue-temperature.config.searching"), { type: "compact", modal: true, fixed: true });
85
96
 
86
- if(temperatureSensors.length <= 0)
97
+ // GET THE SENSORS
98
+ $.get('hue/resources', { bridge: bridgeConfig.bridge, key: bridgeConfig.key, type: "temperature" })
99
+ .done( function(data) {
100
+ var allResources = JSON.parse(data);
101
+ if(allResources.length <= 0)
87
102
  {
88
- RED.notify(scope._("hue-temperature.config.none-found"), "error");
103
+ notification.close();
104
+ RED.notify(scope._("hue-temperature.config.none-found"), { type: "error" });
105
+ return false;
89
106
  }
90
107
 
91
- // RESET OPTIONS
92
- $('#node-input-sensorid').empty();
93
-
94
- // SET TEMPERATURE SENSORS AS OPTIONS
95
- temperatureSensors.forEach(function(sensor)
108
+ // SET OPTIONS
109
+ allResources.forEach(function(resource)
96
110
  {
97
- $('#node-input-sensorid').append('<option value="' + sensor.id + '">' + sensor.name + '</option>');
111
+ if(resource.model)
112
+ {
113
+ options[resource.id] = { value: resource.id, label: resource.name + " ("+resource.model+")" };
114
+ }
115
+ else
116
+ {
117
+ options[resource.id] = { value: resource.id, label: resource.name };
118
+ }
98
119
  });
99
120
 
100
121
  // SELECT CURRENT VALUE
101
- $('#node-input-sensorid').val(current);
122
+ $("#node-input-sensorid").typedInput({
123
+ types: [
124
+ {
125
+ value: current,
126
+ options: Object.values(options)
127
+ }
128
+ ]
129
+ });
130
+
131
+ // CHANGE BUTTON ICON
132
+ var button = $("#node-config-input-scan-temp-sensors");
133
+ var buttonIcon = button.find("i");
134
+ buttonIcon.removeClass("fa-search");
135
+ buttonIcon.addClass("fa-pencil");
136
+
137
+ // CLOSE SEARCH NOTIFICATION
138
+ notification.close();
102
139
  })
103
140
  .fail(function()
104
141
  {
142
+ notification.close();
105
143
  RED.notify(scope._("hue-temperature.config.unknown-error"), "error");
106
144
  });
107
145
  }
108
146
 
109
- $(document).on('change', '#node-input-sensorid', function()
147
+ // CHANGED SENSOR ID? -> REPLACE NAME (IF POSSIBLE)
148
+ $(document).on('change', '#node-input-sensorid', function(e)
110
149
  {
111
- var sensorName = $('#node-input-sensorid option:selected').text();
112
- if(sensorName.length > 0)
150
+ let currentSelectedOptionID = $(e.currentTarget).val();
151
+ let currentSelectedOptionValue = (currentSelectedOptionID.length > 0 && options[currentSelectedOptionID]) ? options[currentSelectedOptionID].label : false;
152
+
153
+ if(currentSelectedOptionValue !== false)
113
154
  {
114
- $('#node-input-name').val(sensorName);
155
+ $('#node-input-name').val(currentSelectedOptionValue.split(" (")[0]);
115
156
  }
116
157
  });
117
158
 
159
+ // TOGGLE SELECT/INPUT FIELD
118
160
  $('#node-config-input-scan-temp-sensors').click(function()
119
161
  {
120
- if($('#node-input-sensorid').prop("tagName") === "INPUT")
162
+ if($('#input-select-toggle').find(".red-ui-typedInput-container").length > 0)
163
+ {
164
+ manualInput();
165
+ }
166
+ else
121
167
  {
122
- searchAndSelectTemperatureSensor();
123
- } else {
124
- manualTemperatureSensorID();
168
+ searchAndSelect();
125
169
  }
126
170
  });
171
+ },
172
+ button: {
173
+ enabled: function() {
174
+ return (this.sensorid && this.sensorid.length > 1)
175
+ },
176
+ visible: function() {
177
+ return (this.sensorid && this.sensorid.length > 1)
178
+ },
179
+ onclick: function()
180
+ {
181
+ const node = this;
182
+ if(node.bridge)
183
+ {
184
+ $.ajax({
185
+ url: "inject/" + node.id,
186
+ type: "POST",
187
+ data: JSON.stringify({ __user_inject_props__: "status"}),
188
+ contentType: "application/json; charset=utf-8",
189
+ success: function (resp) {
190
+ RED.notify(node.name + ": " + node._("hue-temperature.node.statusmsg"), { type: "success", id: "status", timeout: 2000 });
191
+ }
192
+ });
193
+ }
194
+ }
127
195
  }
128
196
  });
129
197
  </script>