smart-nodes 0.4.27 → 0.4.29

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 (53) hide show
  1. package/CHANGELOG.md +13 -0
  2. package/README.md +11 -1
  3. package/compare/compare.js +68 -53
  4. package/compare/locales/de-DE/compare.html +4 -0
  5. package/compare/locales/en-US/compare.html +4 -0
  6. package/counter/counter.js +11 -0
  7. package/counter/locales/de-DE/counter.html +4 -0
  8. package/counter/locales/en-US/counter.html +4 -0
  9. package/delay/delay.js +7 -0
  10. package/delay/locales/de-DE/delay.html +4 -0
  11. package/delay/locales/en-US/delay.html +4 -0
  12. package/examples/mode-selector.json +225 -0
  13. package/examples/mode-selector.png +0 -0
  14. package/forwarder/forwarder.js +40 -26
  15. package/forwarder/locales/de-DE/forwarder.html +4 -0
  16. package/forwarder/locales/en-US/forwarder.html +4 -0
  17. package/heating-curve/heating-curve.js +8 -0
  18. package/heating-curve/locales/de-DE/heating-curve.html +4 -0
  19. package/heating-curve/locales/en-US/heating-curve.html +4 -0
  20. package/hysteresis/hysteresis.js +10 -0
  21. package/hysteresis/locales/de-DE/hysteresis.html +4 -0
  22. package/hysteresis/locales/en-US/hysteresis.html +4 -0
  23. package/light/light.js +22 -2
  24. package/light/locales/de-DE/light.html +5 -0
  25. package/light/locales/en-US/light.html +5 -0
  26. package/logic/logic.js +0 -1
  27. package/mixing-valve/locales/de-DE/mixing-valve.html +6 -2
  28. package/mixing-valve/locales/de-DE/mixing-valve.json +4 -0
  29. package/mixing-valve/locales/en-US/mixing-valve.html +6 -2
  30. package/mixing-valve/locales/en-US/mixing-valve.json +4 -0
  31. package/mixing-valve/mixing-valve.html +60 -22
  32. package/mixing-valve/mixing-valve.js +264 -25
  33. package/mode-selector/locales/de-DE/mode-selector.html +32 -0
  34. package/mode-selector/locales/de-DE/mode-selector.json +11 -0
  35. package/mode-selector/locales/en-US/mode-selector.html +32 -0
  36. package/mode-selector/locales/en-US/mode-selector.json +11 -0
  37. package/mode-selector/mode-selector.html +158 -0
  38. package/mode-selector/mode-selector.js +133 -0
  39. package/package.json +2 -1
  40. package/scene/locales/de-DE/scene.html +4 -0
  41. package/scene/locales/en-US/scene.html +4 -0
  42. package/scene/scene.html +0 -1
  43. package/scene/scene.js +9 -0
  44. package/scheduler/locales/de-DE/scheduler.html +4 -0
  45. package/scheduler/locales/en-US/scheduler.html +4 -0
  46. package/scheduler/scheduler.js +6 -0
  47. package/shutter/locales/de-DE/shutter.html +5 -0
  48. package/shutter/locales/en-US/shutter.html +5 -0
  49. package/shutter/shutter.js +7 -0
  50. package/shutter-complex/locales/de-DE/shutter-complex.html +5 -0
  51. package/shutter-complex/locales/en-US/shutter-complex.html +5 -0
  52. package/shutter-complex/shutter-complex.js +11 -0
  53. package/smart_helper.js +8 -0
package/CHANGELOG.md CHANGED
@@ -197,3 +197,16 @@
197
197
  ## Version 0.4.27:
198
198
 
199
199
  - Fixed central node.
200
+
201
+ ## Version 0.4.28:
202
+
203
+ - Added on and off topic to mixing-valve.
204
+
205
+ ## Version 0.4.29:
206
+
207
+ - Improved light control percentage status text.
208
+ - Fixed logic node when common outputs is configured but one value is set to "send nothing".
209
+ - Mixing valve can now output as percentage directly or with open/close impulses.
210
+ - Mixing valve tries to guess the best position, when getting enabled.
211
+ - Added debug topic to all nodes, to see current values.
212
+ - Added new node "mode-selector".
package/README.md CHANGED
@@ -219,5 +219,15 @@ This node countes up and down within a specified range.
219
219
  ### **Features:**
220
220
 
221
221
  - Define min, max and step values.
222
- - Set to a specific value
222
+ - Set to a specific value.
223
223
  - Increment and decrement by default or by a given value.
224
+
225
+ ## 18. Mode Selector
226
+
227
+ This node can define multiple modes which stores the last selected mode persitent.
228
+
229
+ ### **Features:**
230
+
231
+ - Define custom modes.
232
+ - The first mode is the default on first start.
233
+ - Save last mode persistent and resend it at start, if wanted.
@@ -80,70 +80,85 @@ module.exports = function (RED)
80
80
  {
81
81
  helper.log(node, "handle topic:", msg);
82
82
 
83
- // Check if topic has a valid value
84
- let real_topic_number = helper.getTopicNumber(msg.topic);
85
- if (real_topic_number == null || real_topic_number < 1 || real_topic_number > 2)
83
+ switch (msg.topic)
86
84
  {
87
- helper.warn(this, "Topic has to be 1 or 2, sended: " + msg.topic);
88
- return;
89
- }
85
+ case "debug":
86
+ helper.nodeDebug(node, {
87
+ node_settings,
88
+ comparator,
89
+ out_true,
90
+ out_false,
91
+ send_only_change,
92
+ });
93
+ break;
94
+
95
+ default:
96
+ // Check if topic has a valid value
97
+ let real_topic_number = helper.getTopicNumber(msg.topic);
98
+ if (real_topic_number == null || real_topic_number < 1 || real_topic_number > 2)
99
+ {
100
+ helper.warn(this, "Topic has to be 1 or 2, sended: " + msg.topic);
101
+ return;
102
+ }
90
103
 
91
- // check if payload has a valid value
92
- let num = parseFloat(msg.payload);
93
- if (Number.isNaN(num))
94
- {
95
- helper.warn(this, "Payload has to be numeric: " + msg.payload);
96
- return;
97
- }
104
+ // check if payload has a valid value
105
+ let num = parseFloat(msg.payload);
106
+ if (Number.isNaN(num))
107
+ {
108
+ helper.warn(this, "Payload has to be numeric: " + msg.payload);
109
+ return;
110
+ }
98
111
 
99
- // Save new value
100
- node_settings.values[real_topic_number - 1] = num;
112
+ // Save new value
113
+ node_settings.values[real_topic_number - 1] = num;
101
114
 
102
- let result = getResult();
115
+ let result = getResult();
103
116
 
104
- helper.log(node, "getResult:", result, node_settings);
117
+ helper.log(node, "getResult:", result, node_settings);
105
118
 
106
- let out_msg = null;
119
+ let out_msg = null;
107
120
 
108
- if (result != null)
109
- {
110
- // Get custom output message
111
- if (result)
112
- {
113
- if (out_true !== null)
114
- out_msg = helper.cloneObject(out_true);
115
- }
116
- else
117
- {
118
- if (out_false !== null)
119
- out_msg = helper.cloneObject(out_false);
120
- }
121
-
122
- if (out_msg !== null)
123
- {
124
- // Overwrite automatic values, if not already defined
125
- if (typeof out_msg.payload === "undefined")
126
- out_msg.payload = result;
127
-
128
- if (typeof out_msg.comparator === "undefined")
129
- out_msg.comparator = comparator;
130
-
131
- // Separate outputs if needed
132
- if (outputs == 2)
121
+ if (result != null)
133
122
  {
123
+ // Get custom output message
134
124
  if (result)
135
- out_msg = [out_msg, null];
125
+ {
126
+ if (out_true !== null)
127
+ out_msg = helper.cloneObject(out_true);
128
+ }
136
129
  else
137
- out_msg = [null, out_msg];
130
+ {
131
+ if (out_false !== null)
132
+ out_msg = helper.cloneObject(out_false);
133
+ }
134
+
135
+ if (out_msg !== null)
136
+ {
137
+ // Overwrite automatic values, if not already defined
138
+ if (typeof out_msg.payload === "undefined")
139
+ out_msg.payload = result;
140
+
141
+ if (typeof out_msg.comparator === "undefined")
142
+ out_msg.comparator = comparator;
143
+
144
+ // Separate outputs if needed
145
+ if (outputs == 2)
146
+ {
147
+ if (result)
148
+ out_msg = [out_msg, null];
149
+ else
150
+ out_msg = [null, out_msg];
151
+ }
152
+
153
+ // Send only if needed
154
+ if (send_only_change == false || node_settings.last_result != result)
155
+ node.send(out_msg);
156
+ }
157
+
158
+ node_settings.last_result = result;
159
+ node_settings.last_message = out_msg;
138
160
  }
139
-
140
- // Send only if needed
141
- if (send_only_change == false || node_settings.last_result != result)
142
- node.send(out_msg);
143
- }
144
-
145
- node_settings.last_result = result;
146
- node_settings.last_message = out_msg;
161
+ break;
147
162
  }
148
163
  }
149
164
 
@@ -14,6 +14,10 @@
14
14
  </tr>
15
15
  </thead>
16
16
  <tbody>
17
+ <tr>
18
+ <td><code>debug</code></td>
19
+ <td>Gibt aktuelle Node Einstellungen im Debug Fenster aus.</td>
20
+ </tr>
17
21
  <tr>
18
22
  <td><code>1</code></td>
19
23
  <td>Setzt den linken zu vergleichenden Wert</td>
@@ -14,6 +14,10 @@
14
14
  </tr>
15
15
  </thead>
16
16
  <tbody>
17
+ <tr>
18
+ <td><code>debug</code></td>
19
+ <td>Outputs current node settings in the debug window.</td>
20
+ </tr>
17
21
  <tr>
18
22
  <td><code>1</code></td>
19
23
  <td>Sets the left value to compare</td>
@@ -74,6 +74,17 @@ module.exports = function (RED)
74
74
  let temp_value;
75
75
  switch (real_topic)
76
76
  {
77
+ case "debug":
78
+ helper.nodeDebug(node, {
79
+ node_settings,
80
+ start,
81
+ step,
82
+ min,
83
+ max,
84
+ out_message,
85
+ });
86
+ break;
87
+
77
88
  case "set_min":
78
89
  min = parseFloat(msg.payload);
79
90
  break;
@@ -18,6 +18,10 @@
18
18
  </tr>
19
19
  </thead>
20
20
  <tbody>
21
+ <tr>
22
+ <td><code>debug</code></td>
23
+ <td>Gibt aktuelle Node Einstellungen im Debug Fenster aus.</td>
24
+ </tr>
21
25
  <tr>
22
26
  <td><code>set_min</code></td>
23
27
  <td>Überschreibt den eingestellten Min-Wert mit <code>msg.payload</code>.</td>
@@ -18,6 +18,10 @@
18
18
  </tr>
19
19
  </thead>
20
20
  <tbody>
21
+ <tr>
22
+ <td><code>debug</code></td>
23
+ <td>Outputs current node settings in the debug window.</td>
24
+ </tr>
21
25
  <tr>
22
26
  <td><code>set_min</code></td>
23
27
  <td>Overwrites the set min value with <code>msg.payload</code>.</td>
package/delay/delay.js CHANGED
@@ -111,6 +111,13 @@ module.exports = function (RED)
111
111
 
112
112
  switch (real_topic)
113
113
  {
114
+ case "debug":
115
+ helper.nodeDebug(node, {
116
+ node_settings,
117
+ delay_only_on_change,
118
+ });
119
+ break;
120
+
114
121
  case "set_delay_on":
115
122
  node_settings.on_delay_ms = helper.getTimeInMsFromString(msg.payload);
116
123
  node.status({ fill: "yellow", shape: "ring", text: helper.getCurrentTimeForStatus() + ": " + "New on delay: " + helper.formatMsToStatus(node_settings.on_delay_ms) });
@@ -15,6 +15,10 @@
15
15
  </tr>
16
16
  </thead>
17
17
  <tbody>
18
+ <tr>
19
+ <td><code>debug</code></td>
20
+ <td>Gibt aktuelle Node Einstellungen im Debug Fenster aus.</td>
21
+ </tr>
18
22
  <tr>
19
23
  <td><code>set_delay_on</code></td>
20
24
  <td>Setzt die Einschaltverzögerung auf die in <code>msg.payload</code> angegebene Zeit.</td>
@@ -15,6 +15,10 @@
15
15
  </tr>
16
16
  </thead>
17
17
  <tbody>
18
+ <tr>
19
+ <td><code>debug</code></td>
20
+ <td>Outputs current node settings in the debug window.</td>
21
+ </tr>
18
22
  <tr>
19
23
  <td><code>set_delay_on</code></td>
20
24
  <td>Sets the on delay to the time specified in <code>msg.payload</code>.</td>
@@ -0,0 +1,225 @@
1
+ [
2
+ {
3
+ "id": "b33aca888f9ec037",
4
+ "type": "smart_mode-selector",
5
+ "z": "e5afc2ee2cd84f5f",
6
+ "name": "",
7
+ "outputs": 3,
8
+ "mode_items": [
9
+ {
10
+ "name": "OFF"
11
+ },
12
+ {
13
+ "name": "COOL"
14
+ },
15
+ {
16
+ "name": "HEAT"
17
+ }
18
+ ],
19
+ "resend_on_start": true,
20
+ "x": 420,
21
+ "y": 160,
22
+ "wires": [
23
+ [
24
+ "81ee5e80db7748e6"
25
+ ],
26
+ [
27
+ "d3ee3b38834ce6d1"
28
+ ],
29
+ [
30
+ "183f10a05472b8ce"
31
+ ]
32
+ ]
33
+ },
34
+ {
35
+ "id": "cacd2123f498db13",
36
+ "type": "inject",
37
+ "z": "e5afc2ee2cd84f5f",
38
+ "name": "",
39
+ "props": [
40
+ {
41
+ "p": "topic",
42
+ "vt": "str"
43
+ }
44
+ ],
45
+ "repeat": "",
46
+ "crontab": "",
47
+ "once": false,
48
+ "onceDelay": 0.1,
49
+ "topic": "refresh",
50
+ "x": 110,
51
+ "y": 80,
52
+ "wires": [
53
+ [
54
+ "b33aca888f9ec037"
55
+ ]
56
+ ]
57
+ },
58
+ {
59
+ "id": "a4517f2fe26a78a3",
60
+ "type": "inject",
61
+ "z": "e5afc2ee2cd84f5f",
62
+ "name": "",
63
+ "props": [
64
+ {
65
+ "p": "topic",
66
+ "vt": "str"
67
+ },
68
+ {
69
+ "p": "payload"
70
+ }
71
+ ],
72
+ "repeat": "",
73
+ "crontab": "",
74
+ "once": false,
75
+ "onceDelay": 0.1,
76
+ "topic": "set_mode",
77
+ "payload": "OFF",
78
+ "payloadType": "str",
79
+ "x": 140,
80
+ "y": 140,
81
+ "wires": [
82
+ [
83
+ "b33aca888f9ec037"
84
+ ]
85
+ ]
86
+ },
87
+ {
88
+ "id": "d616bfb55d4b2e05",
89
+ "type": "inject",
90
+ "z": "e5afc2ee2cd84f5f",
91
+ "name": "",
92
+ "props": [
93
+ {
94
+ "p": "topic",
95
+ "vt": "str"
96
+ },
97
+ {
98
+ "p": "payload"
99
+ }
100
+ ],
101
+ "repeat": "",
102
+ "crontab": "",
103
+ "once": false,
104
+ "onceDelay": 0.1,
105
+ "topic": "set_mode",
106
+ "payload": "HEAT",
107
+ "payloadType": "str",
108
+ "x": 140,
109
+ "y": 200,
110
+ "wires": [
111
+ [
112
+ "b33aca888f9ec037"
113
+ ]
114
+ ]
115
+ },
116
+ {
117
+ "id": "34ec6475a0112da8",
118
+ "type": "inject",
119
+ "z": "e5afc2ee2cd84f5f",
120
+ "name": "",
121
+ "props": [
122
+ {
123
+ "p": "topic",
124
+ "vt": "str"
125
+ },
126
+ {
127
+ "p": "payload"
128
+ }
129
+ ],
130
+ "repeat": "",
131
+ "crontab": "",
132
+ "once": false,
133
+ "onceDelay": 0.1,
134
+ "topic": "set_mode",
135
+ "payload": "COOL",
136
+ "payloadType": "str",
137
+ "x": 140,
138
+ "y": 260,
139
+ "wires": [
140
+ [
141
+ "b33aca888f9ec037"
142
+ ]
143
+ ]
144
+ },
145
+ {
146
+ "id": "81ee5e80db7748e6",
147
+ "type": "debug",
148
+ "z": "e5afc2ee2cd84f5f",
149
+ "name": "debug 23",
150
+ "active": true,
151
+ "tosidebar": true,
152
+ "console": false,
153
+ "tostatus": false,
154
+ "complete": "true",
155
+ "targetType": "full",
156
+ "statusVal": "",
157
+ "statusType": "auto",
158
+ "x": 720,
159
+ "y": 120,
160
+ "wires": []
161
+ },
162
+ {
163
+ "id": "d3ee3b38834ce6d1",
164
+ "type": "debug",
165
+ "z": "e5afc2ee2cd84f5f",
166
+ "name": "debug 49",
167
+ "active": true,
168
+ "tosidebar": true,
169
+ "console": false,
170
+ "tostatus": false,
171
+ "complete": "true",
172
+ "targetType": "full",
173
+ "statusVal": "",
174
+ "statusType": "auto",
175
+ "x": 720,
176
+ "y": 160,
177
+ "wires": []
178
+ },
179
+ {
180
+ "id": "183f10a05472b8ce",
181
+ "type": "debug",
182
+ "z": "e5afc2ee2cd84f5f",
183
+ "name": "debug 50",
184
+ "active": true,
185
+ "tosidebar": true,
186
+ "console": false,
187
+ "tostatus": false,
188
+ "complete": "true",
189
+ "targetType": "full",
190
+ "statusVal": "",
191
+ "statusType": "auto",
192
+ "x": 720,
193
+ "y": 200,
194
+ "wires": []
195
+ },
196
+ {
197
+ "id": "4e7b09d07c9debda",
198
+ "type": "inject",
199
+ "z": "e5afc2ee2cd84f5f",
200
+ "name": "",
201
+ "props": [
202
+ {
203
+ "p": "topic",
204
+ "vt": "str"
205
+ },
206
+ {
207
+ "p": "payload"
208
+ }
209
+ ],
210
+ "repeat": "",
211
+ "crontab": "",
212
+ "once": false,
213
+ "onceDelay": 0.1,
214
+ "topic": "set_mode",
215
+ "payload": "INVALID",
216
+ "payloadType": "str",
217
+ "x": 150,
218
+ "y": 320,
219
+ "wires": [
220
+ [
221
+ "b33aca888f9ec037"
222
+ ]
223
+ ]
224
+ }
225
+ ]
Binary file
@@ -93,38 +93,52 @@ module.exports = function (RED)
93
93
  else if (real_topic == "disable" || (real_topic == "set_state" && !msg.payload))
94
94
  new_state = false;
95
95
 
96
- // Already the correct state
97
- if (new_state != null && node_settings.enabled == new_state)
98
- return;
99
-
100
- switch (new_state)
96
+ switch (real_topic)
101
97
  {
102
- case true:
103
- case false:
104
- node_settings.enabled = new_state;
105
-
106
- if (node_settings.enabled && forward_last_on_enable && node_settings.last_message != null && !node_settings.last_msg_was_sended)
107
- {
108
- node.send(helper.cloneObject(node_settings.last_message));
109
- node_settings.last_msg_was_sended = true;
110
- }
111
-
112
- setStatus();
98
+ case "debug":
99
+ helper.nodeDebug(node, {
100
+ node_settings,
101
+ forward_true,
102
+ forward_false,
103
+ forward_last_on_enable,
104
+ });
113
105
  break;
114
106
 
115
107
  default:
116
- // Forward if enabled or forced
117
- if (node_settings.enabled || (forward_true && msg.payload) || (forward_false && !msg.payload))
118
- {
119
- node.send(helper.cloneObject(msg));
120
- node_settings.last_msg_was_sended = true;
121
- }
122
- else
108
+ // Already the correct state
109
+ if (new_state != null && node_settings.enabled == new_state)
110
+ return;
111
+
112
+ switch (new_state)
123
113
  {
124
- node_settings.last_msg_was_sended = false;
114
+ case true:
115
+ case false:
116
+ node_settings.enabled = new_state;
117
+
118
+ if (node_settings.enabled && forward_last_on_enable && node_settings.last_message != null && !node_settings.last_msg_was_sended)
119
+ {
120
+ node.send(helper.cloneObject(node_settings.last_message));
121
+ node_settings.last_msg_was_sended = true;
122
+ }
123
+
124
+ setStatus();
125
+ break;
126
+
127
+ default:
128
+ // Forward if enabled or forced
129
+ if (node_settings.enabled || (forward_true && msg.payload) || (forward_false && !msg.payload))
130
+ {
131
+ node.send(helper.cloneObject(msg));
132
+ node_settings.last_msg_was_sended = true;
133
+ }
134
+ else
135
+ {
136
+ node_settings.last_msg_was_sended = false;
137
+ }
138
+
139
+ node_settings.last_message = helper.cloneObject(msg);
140
+ break;
125
141
  }
126
-
127
- node_settings.last_message = helper.cloneObject(msg);
128
142
  break;
129
143
  }
130
144
  }
@@ -14,6 +14,10 @@
14
14
  </tr>
15
15
  </thead>
16
16
  <tbody>
17
+ <tr>
18
+ <td><code>debug</code></td>
19
+ <td>Gibt aktuelle Node Einstellungen im Debug Fenster aus.</td>
20
+ </tr>
17
21
  <tr>
18
22
  <td><code>enable</code></td>
19
23
  <td>Aktiviert das Weiterleiten.</td>
@@ -14,6 +14,10 @@
14
14
  </tr>
15
15
  </thead>
16
16
  <tbody>
17
+ <tr>
18
+ <td><code>debug</code></td>
19
+ <td>Outputs current node settings in the debug window.</td>
20
+ </tr>
17
21
  <tr>
18
22
  <td><code>enable</code></td>
19
23
  <td>Enables forwarding.</td>
@@ -71,6 +71,14 @@ module.exports = function (RED)
71
71
  let real_topic = helper.getTopicName(msg.topic);
72
72
  switch (real_topic)
73
73
  {
74
+ case "debug":
75
+ helper.nodeDebug(node, {
76
+ node_settings,
77
+ slope,
78
+ offset,
79
+ });
80
+ break;
81
+
74
82
  case "room_setpoint":
75
83
  let new_setpoint = parseFloat(msg.payload);
76
84
  if (isNaN(new_setpoint) && !isFinite(new_setpoint))
@@ -16,6 +16,10 @@
16
16
  </tr>
17
17
  </thead>
18
18
  <tbody>
19
+ <tr>
20
+ <td><code>debug</code></td>
21
+ <td>Gibt aktuelle Node Einstellungen im Debug Fenster aus.</td>
22
+ </tr>
19
23
  <tr>
20
24
  <td><code>room_setpoint</code></td>
21
25
  <td>Überschreibt die Raum-Solltemperatur.</td>
@@ -16,6 +16,10 @@
16
16
  </tr>
17
17
  </thead>
18
18
  <tbody>
19
+ <tr>
20
+ <td><code>debug</code></td>
21
+ <td>Outputs current node settings in the debug window.</td>
22
+ </tr>
19
23
  <tr>
20
24
  <td><code>room_setpoint</code></td>
21
25
  <td>Overwrites the room setpoint temperature.</td>
@@ -111,6 +111,16 @@ module.exports = function (RED)
111
111
 
112
112
  switch (real_topic)
113
113
  {
114
+ case "debug":
115
+ helper.nodeDebug(node, {
116
+ node_settings,
117
+ out_higher,
118
+ out_lower,
119
+ send_only_change,
120
+ mode,
121
+ });
122
+ break;
123
+
114
124
  case "setpoint":
115
125
  node_settings.setpoint = value;
116
126
  break;