smart-nodes 0.3.36 → 0.4.0

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 (116) hide show
  1. package/CHANGELOG.md +62 -0
  2. package/README.md +35 -17
  3. package/central/central.html +27 -24
  4. package/central/central.js +84 -26
  5. package/central/locales/de-DE/central.html +10 -0
  6. package/central/locales/de-DE/central.json +14 -0
  7. package/central/locales/en-US/central.html +10 -0
  8. package/central/locales/en-US/central.json +14 -0
  9. package/compare/compare.html +64 -87
  10. package/compare/compare.js +69 -29
  11. package/compare/locales/de-DE/compare.html +36 -0
  12. package/compare/locales/de-DE/compare.json +35 -0
  13. package/compare/locales/en-US/compare.html +36 -0
  14. package/compare/locales/en-US/compare.json +35 -0
  15. package/counter/counter.html +70 -72
  16. package/counter/counter.js +43 -20
  17. package/counter/locales/de-DE/counter.html +48 -0
  18. package/counter/locales/de-DE/counter.json +21 -0
  19. package/counter/locales/en-US/counter.html +48 -0
  20. package/counter/locales/en-US/counter.json +21 -0
  21. package/delay/delay.html +30 -102
  22. package/delay/delay.js +63 -20
  23. package/delay/locales/de-DE/delay.html +71 -0
  24. package/delay/locales/de-DE/delay.json +19 -0
  25. package/delay/locales/en-US/delay.html +76 -0
  26. package/delay/locales/en-US/delay.json +19 -0
  27. package/forwarder/forwarder.html +11 -42
  28. package/forwarder/forwarder.js +59 -18
  29. package/forwarder/locales/de-DE/forwarder.html +32 -0
  30. package/forwarder/locales/de-DE/forwarder.json +15 -0
  31. package/forwarder/locales/en-US/forwarder.html +32 -0
  32. package/forwarder/locales/en-US/forwarder.json +15 -0
  33. package/heating-curve/heating-curve.html +10 -51
  34. package/heating-curve/heating-curve.js +38 -13
  35. package/heating-curve/locales/de-DE/heating-curve.html +38 -0
  36. package/heating-curve/locales/de-DE/heating-curve.json +12 -0
  37. package/heating-curve/locales/en-US/heating-curve.html +38 -0
  38. package/heating-curve/locales/en-US/heating-curve.json +12 -0
  39. package/hysteresis/hysteresis.html +49 -69
  40. package/hysteresis/hysteresis.js +94 -68
  41. package/hysteresis/locales/de-DE/hysteresis.html +36 -0
  42. package/hysteresis/locales/de-DE/hysteresis.json +27 -0
  43. package/hysteresis/locales/en-US/hysteresis.html +36 -0
  44. package/hysteresis/locales/en-US/hysteresis.json +27 -0
  45. package/light/light.html +250 -0
  46. package/{light-control/light-control.js → light/light.js} +151 -32
  47. package/light/locales/de-DE/light.html +149 -0
  48. package/light/locales/de-DE/light.json +24 -0
  49. package/light/locales/en-US/light.html +148 -0
  50. package/light/locales/en-US/light.json +24 -0
  51. package/logic/locales/de-DE/logic.html +12 -0
  52. package/logic/locales/de-DE/logic.json +26 -0
  53. package/logic/locales/en-US/logic.html +12 -0
  54. package/logic/locales/en-US/logic.json +26 -0
  55. package/logic/logic.html +48 -64
  56. package/logic/logic.js +63 -29
  57. package/long-press/locales/de-DE/long-press.html +5 -0
  58. package/long-press/locales/de-DE/long-press.json +13 -0
  59. package/long-press/locales/en-US/long-press.html +5 -0
  60. package/long-press/locales/en-US/long-press.json +13 -0
  61. package/{long-press-control/long-press-control.html → long-press/long-press.html} +10 -14
  62. package/long-press/long-press.js +163 -0
  63. package/mixing-valve/locales/de-DE/mixing-valve.html +65 -0
  64. package/mixing-valve/locales/de-DE/mixing-valve.json +19 -0
  65. package/mixing-valve/locales/en-US/mixing-valve.html +66 -0
  66. package/mixing-valve/locales/en-US/mixing-valve.json +19 -0
  67. package/mixing-valve/mixing-valve.html +27 -93
  68. package/mixing-valve/mixing-valve.js +87 -61
  69. package/multi-press/locales/de-DE/multi-press.html +5 -0
  70. package/multi-press/locales/de-DE/multi-press.json +12 -0
  71. package/multi-press/locales/en-US/multi-press.html +5 -0
  72. package/multi-press/locales/en-US/multi-press.json +12 -0
  73. package/{multi-press-control/multi-press-control.html → multi-press/multi-press.html} +9 -13
  74. package/{multi-press-control/multi-press-control.js → multi-press/multi-press.js} +53 -5
  75. package/package.json +7 -7
  76. package/persistence.js +1 -0
  77. package/scene/locales/de-DE/scene.html +105 -0
  78. package/scene/locales/de-DE/scene.json +21 -0
  79. package/scene/locales/en-US/scene.html +107 -0
  80. package/scene/locales/en-US/scene.json +20 -0
  81. package/{scene-control/scene-control.html → scene/scene.html} +30 -132
  82. package/{scene-control/scene-control.js → scene/scene.js} +76 -26
  83. package/scheduler/locales/de-DE/scheduler.html +30 -0
  84. package/scheduler/locales/de-DE/scheduler.json +21 -0
  85. package/scheduler/locales/en-US/scheduler.html +30 -0
  86. package/scheduler/locales/en-US/scheduler.json +21 -0
  87. package/scheduler/scheduler.html +34 -64
  88. package/scheduler/scheduler.js +85 -53
  89. package/shutter/locales/de-DE/shutter.html +127 -0
  90. package/shutter/locales/de-DE/shutter.json +11 -0
  91. package/shutter/locales/en-US/shutter.html +133 -0
  92. package/shutter/locales/en-US/shutter.json +11 -0
  93. package/{shutter-control/shutter-control.html → shutter/shutter.html} +7 -133
  94. package/{shutter-control/shutter-control.js → shutter/shutter.js} +116 -56
  95. package/shutter-complex/locales/de-DE/shutter-complex.html +120 -0
  96. package/shutter-complex/locales/de-DE/shutter-complex.json +20 -0
  97. package/shutter-complex/locales/en-US/shutter-complex.html +120 -0
  98. package/shutter-complex/locales/en-US/shutter-complex.json +20 -0
  99. package/{shutter-complex-control/shutter-complex-control.html → shutter-complex/shutter-complex.html} +36 -140
  100. package/shutter-complex/shutter-complex.js +578 -0
  101. package/smart_helper.js +52 -9
  102. package/statistic/locales/de-DE/statistic.html +10 -0
  103. package/statistic/locales/de-DE/statistic.json +29 -0
  104. package/statistic/locales/en-US/statistic.html +10 -0
  105. package/statistic/locales/en-US/statistic.json +29 -0
  106. package/statistic/statistic.html +38 -43
  107. package/statistic/statistic.js +57 -28
  108. package/text-exec/locales/de-DE/text-exec.html +18 -0
  109. package/text-exec/locales/de-DE/text-exec.json +7 -0
  110. package/text-exec/locales/en-US/text-exec.html +18 -0
  111. package/text-exec/locales/en-US/text-exec.json +7 -0
  112. package/text-exec/text-exec.html +9 -25
  113. package/text-exec/text-exec.js +43 -2
  114. package/light-control/light-control.html +0 -363
  115. package/long-press-control/long-press-control.js +0 -76
  116. package/shutter-complex-control/shutter-complex-control.js +0 -442
@@ -1,363 +0,0 @@
1
- <script type="text/javascript">
2
- (function ()
3
- {
4
- let treeList;
5
- let candidateNodesCount = 0;
6
- let flows = [];
7
- let flowMap = {};
8
-
9
- function onEditPrepare(node, targetTypes)
10
- {
11
- if (!node.links)
12
- node.links = [];
13
-
14
- const activeSubflow = RED.nodes.subflow(node.z);
15
-
16
- treeList = $("<div>")
17
- .css({ width: "100%", height: "100%" })
18
- .appendTo(".node-input-link-row")
19
- .treeList({ autoSelect: false })
20
- .on("treelistitemmouseover", function (e, item)
21
- {
22
- if (item.node)
23
- {
24
- item.node.highlighted = true;
25
- item.node.dirty = true;
26
- RED.view.redraw();
27
- }
28
- })
29
- .on("treelistitemmouseout", function (e, item)
30
- {
31
- if (item.node)
32
- {
33
- item.node.highlighted = false;
34
- item.node.dirty = true;
35
- RED.view.redraw();
36
- }
37
- });
38
-
39
- flows = [];
40
- flowMap = {};
41
-
42
- if (activeSubflow)
43
- {
44
- flowMap[activeSubflow.id] = {
45
- id: activeSubflow.id,
46
- class: "red-ui-palette-header",
47
- label: "Subflow : " + (activeSubflow.name || activeSubflow.id),
48
- expanded: true,
49
- children: []
50
- };
51
- flows.push(flowMap[activeSubflow.id]);
52
- }
53
- else
54
- {
55
- RED.nodes.eachWorkspace(function (ws)
56
- {
57
- if (!ws.disabled)
58
- {
59
- flowMap[ws.id] = {
60
- id: ws.id,
61
- class: "red-ui-palette-header",
62
- label: (ws.label || ws.id) + (node.z === ws.id ? " *" : ""),
63
- expanded: true,
64
- children: []
65
- };
66
- flows.push(flowMap[ws.id]);
67
- }
68
- });
69
- }
70
-
71
- setTimeout(function ()
72
- {
73
- treeList.treeList("show", node.z);
74
- }, 100);
75
- }
76
-
77
- function initTreeList(node, targetTypes)
78
- {
79
- candidateNodesCount = 0;
80
- for (const key in flowMap)
81
- {
82
- flowMap[key].children = [];
83
- }
84
-
85
- let candidateNodes = [];
86
-
87
- targetTypes.forEach(function (targetType)
88
- {
89
- candidateNodes = candidateNodes.concat(RED.nodes.filterNodes({ type: targetType }));
90
- });
91
-
92
- candidateNodes.forEach(function (n)
93
- {
94
- if (flowMap[n.z])
95
- {
96
- const isChecked = (node.links.indexOf(n.id) !== -1) || (n.links || []).indexOf(node.id) !== -1;
97
- if (isChecked)
98
- {
99
- flowMap[n.z].children.push({
100
- id: n.id,
101
- node: n,
102
- label: n.name || n.id,
103
- selected: false,
104
- checkbox: false,
105
- radio: false
106
- });
107
- candidateNodesCount++;
108
- }
109
- }
110
- });
111
-
112
- for (const key in flowMap)
113
- {
114
- flowMap[key].children.sort((a, b) => a.label.localeCompare(b.label));
115
- }
116
-
117
- const flowsFiltered = flows.filter(function (f) { return f.children.length > 0 });
118
- treeList.treeList("empty");
119
- treeList.treeList("data", flowsFiltered);
120
- }
121
-
122
- function resizeNodeList()
123
- {
124
- var rows = $("#dialog-form>div:not(.node-input-link-row)");
125
- var height = $("#dialog-form").height();
126
- for (var i = 0; i < rows.length; i++)
127
- {
128
- height -= $(rows[i]).outerHeight(true);
129
- }
130
- var editorRow = $("#dialog-form>div.node-input-link-row");
131
- height -= (parseInt(editorRow.css("marginTop")) + parseInt(editorRow.css("marginBottom")));
132
- $(".node-input-link-row").css("height", height + "px");
133
- }
134
-
135
- RED.nodes.registerType("smart_light-control", {
136
- category: "Smart Nodes",
137
- paletteLabel: "Light control",
138
- color: "#C882FF",
139
- defaults: {
140
- name: { value: "" },
141
- exec_text_names: { value: "" },
142
- max_time_on: { value: "0" },
143
- max_time_on_unit: { value: "s" },
144
- alarm_action: { value: 'NOTHING' }, // NOTHING | ON | OFF
145
- links: { value: [], type: "smart_central-control[]" }
146
- },
147
- inputs: 1,
148
- outputs: 1,
149
- icon: "font-awesome/fa-lightbulb-o",
150
- label: function ()
151
- {
152
- return this.name || "Light control";
153
- },
154
- oneditprepare: function ()
155
- {
156
- let node = this;
157
- onEditPrepare(this, ["smart_central-control"]);
158
- initTreeList(node, ["smart_central-control"]);
159
-
160
- $("#node-input-icon")
161
- .css("max-width", "10rem")
162
- .typedInput({
163
- types: [
164
- {
165
- default: "light",
166
- options: [
167
- { value: "light", label: "Licht" },
168
- { value: "outlet", label: "Steckdose" }
169
- ],
170
- },
171
- ],
172
- });
173
-
174
- $("#node-input-max_time_on")
175
- .spinner({
176
- min: 0,
177
- change: function (event, ui)
178
- {
179
- var value = parseInt(this.value);
180
- value = isNaN(value) ? 0 : value;
181
- value = Math.max(value, parseInt($(this).attr("aria-valuemin")));
182
- // value = Math.min(value, parseInt($(this).attr("aria-valuemax")));
183
- if (value !== this.value) $(this).spinner("value", value);
184
- },
185
- }).css("max-width", "4rem");
186
-
187
- $("#node-input-max_time_on_unit")
188
- .css("max-width", "10rem")
189
- .typedInput({
190
- types: [
191
- {
192
- default: "s",
193
- options: [
194
- { value: "ms", label: "Millisekunden" },
195
- { value: "s", label: "Sekunden" },
196
- { value: "min", label: "Minuten" },
197
- { value: "h", label: "Stunden" },
198
- ],
199
- },
200
- ],
201
- });
202
-
203
- $("#node-input-alarm_action").typedInput({
204
- types: [
205
- {
206
- default: "NOTHING",
207
- options: [
208
- { value: "NOTHING", label: "Keine Aktion" },
209
- { value: "ON", label: "Einschalten" },
210
- { value: "OFF", label: "Ausschalten" }
211
- ],
212
- },
213
- ],
214
- });
215
- },
216
- onadd: function ()
217
- {
218
- this.links = [];
219
- },
220
- oneditresize: resizeNodeList
221
- });
222
- })();
223
- </script>
224
-
225
- <script type="text/html" data-template-name="smart_light-control">
226
- <div class="form-row">
227
- <label for="node-input-name"><i class="fa fa-tag"></i> Name</label>
228
- <input type="text" id="node-input-name" placeholder="Name" />
229
- </div>
230
- <div class="form-row">
231
- <label for="node-input-exec_text_names"><i class="fa fa-comments-o"></i> Text</label>
232
- <input id="node-input-exec_text_names" type="text" />
233
- <div style="max-width: 450px;">Diese Node kann über die eingegebenen Wörter gesteuert werden. Mehrere Wörter werden durch ein Komma getrennt.</div>
234
- </div>
235
- <div class="form-row">
236
- <label for="node-input-max_time_on"><i class="fa fa-clock-o"></i> Zeit Ein</label>
237
- <input id="node-input-max_time_on" value="0" />
238
- <input id="node-input-max_time_on_unit" />
239
- </div>
240
- <div class="form-row">
241
- <label for="node-input-alarm_action"><i class="fa fa-exclamation-triangle"></i> Alarm Aktion</label>
242
- <input id="node-input-alarm_action"/>
243
- </div>
244
- <span><i class="fa fa-link"></i> Dieser Baustein wird von folgenden Zentralbausteinen gesteuert:</span>
245
- <div class="form-row node-input-link-row node-input-link-rows"></div>
246
- </script>
247
-
248
- <script type="text/html" data-help-name="smart_light-control">
249
- <p>
250
- Diese Node steuert einen Ausgang. Dies kann ein Licht, eine Steckdose oder ähnliches sein.
251
- Als Ausgang wird immer <code>msg.payload = true</code> oder <code>msg.payload = false</code> gesendet um den Ausgang ein-, bzw. auszuschalten.
252
- </p>
253
- <p>
254
- <b>Hinweis:</b> Smart Nodes verwenden Topics im Format <code>name#nummer</code>, damit können verschiedene Smart Nodes mit dem gleichen Topic angesteuert werden.<br/>
255
- Diese Node verwendet nur den Teil <code>name</code>. <code>#</code> und <code>nummer</code> sind dabei optional.
256
- </p>
257
- <p>
258
- Folgende topics werden akzeptiert:
259
- <table>
260
- <thead>
261
- <tr>
262
- <th>Topic</th>
263
- <th>Beschreibung</th>
264
- <th>msg.payload == false wird ignoriert</th>
265
- </tr>
266
- </thead>
267
- <tbody>
268
- <tr>
269
- <td><code>status</code></td>
270
- <td>
271
- Gibt über <code>msg.payload = true</code> oder <code>msg.payload = false</code> den aktuellen Status des Ausgangs an.<br/>
272
- Bei einem Wechsel von ausgeschaltet nach eingeschaltet wird die Zeitmessung für die hinterlegte, bzw. mitgesendete Zeit gestartet, sofern vorhanden.
273
- </td>
274
- <td>Nein</td>
275
- </tr>
276
- <tr>
277
- <td><code>on</code></td>
278
- <td>Schaltet den Ausgang ein und startet die Zeitmessung für die hinterlegte, bzw. mitgesendete Zeit gestartet, sofern vorhanden.</td>
279
- <td>Ja</td>
280
- </tr>
281
- <tr>
282
- <td><code>off</code></td>
283
- <td>Schaltet den Ausgang aus.</td>
284
- <td>Ja</td>
285
- </tr>
286
- <tr>
287
- <td><code>set</code></td>
288
- <td>
289
- Schaltet den Ausgang bei <code>msg.payload = true</code> ein und bei <code>msg.payload = false</code> aus.<br/>
290
- Bei einem Wechsel von ausgeschaltet nach eingeschaltet wird die Zeitmessung für die hinterlegte, bzw. mitgesendete Zeit gestartet, sofern vorhanden.
291
- </td>
292
- <td>Nein</td>
293
- </tr>
294
- <tr>
295
- <td><code>set_permanent</code></td>
296
- <td>
297
- Schaltet den Ausgang bei <code>msg.payload = true</code> dauerhaft ein und bei <code>msg.payload = false</code> aus.<br/>
298
- Es wird dabei keine Zeitmessung gestartet.
299
- </td>
300
- <td>Nein</td>
301
- </tr>
302
- <tr>
303
- <td><code>motion</code></td>
304
- <td>
305
- Schaltet den Ausgang bei <code>msg.payload = true</code> ein ohne eine Zeitmessung.<br/>
306
- Bei <code>msg.payload = false</code> wird die Zeitmessung für die hinterlegte, bzw. mitgesendete Zeit gestartet, sofern vorhanden.<br/>
307
- Ist keine Zeit angegeben oder hinterlegt, schaltet sich der Ausgang sofort aus.
308
- </td>
309
- <td>Nein</td>
310
- </tr>
311
- <tr>
312
- <td><code>alarm</code></td>
313
- <td>Setzt den aktuellen Alarmzustand auf den Wert von <code>msg.payload</code> und löst die entsprechende Aktion aus.</td>
314
- <td>Nein</td>
315
- </tr>
316
- <tr>
317
- <td><code>toggle</code> (default)</td>
318
- <td>
319
- Schaltet den Ausgang abwechselnd ein und aus.<br/>
320
- Bei einem Wechsel von ausgeschaltet nach eingeschaltet wird die Zeitmessung für die hinterlegte, bzw. mitgesendete Zeit gestartet, sofern vorhanden.
321
- </td>
322
- <td>Ja</td>
323
- </tr>
324
- </tbody>
325
- </table>
326
- </p>
327
- <p>
328
- Diese Node hat eine einstellbare Maximallaufzeit, bevor der Ausgang automatisch wieder ausgeschalten wird.
329
- Diese Zeitmessung wird wie in der Tabelle oben verwendet.
330
- Die eingestellte Zeit kann gezielt überschrieben werden.
331
- Beispiel: <code>msg = { "topic": "on", "time_on": 5000 }</code> oder <code>msg = { "topic": "on", "time_on": "5s" }</code><br/>
332
- Diese Nachricht schaltet das Licht für 5000 Millisekunden / 5 Sekunden an und anschließend wieder aus.
333
- Die nächste Nachricht ohne <code>time_on</code> Angabe verwendet wieder die voreingestellte Zeit.
334
- Ist die Zeit auf 0 eingestellt, wird das Licht <b>nicht</b> automatisch ausgeschalten.<br/>
335
- Als Einheit für die Zeit können folgende Werte verwendet werden:
336
- <table>
337
- <thead>
338
- <tr>
339
- <th>Einheit</th>
340
- <th>Beschreibung</th>
341
- </tr>
342
- </thead>
343
- <tbody>
344
- <tr>
345
- <td><code>ms</code> (default)</td>
346
- <td>Millisekunden</td>
347
- </tr>
348
- <tr>
349
- <td><code>s</code> oder <code>sec</code></td>
350
- <td>Sekunden</td>
351
- </tr>
352
- <tr>
353
- <td><code>m</code> oder <code>min</code></td>
354
- <td>Mintun.</td>
355
- </tr>
356
- <tr>
357
- <td><code>h</code></td>
358
- <td>Stunden</td>
359
- </tr>
360
- </tbody>
361
- </table>
362
- </p>
363
- </script>
@@ -1,76 +0,0 @@
1
- module.exports = function (RED)
2
- {
3
- "use strict";
4
-
5
- function LongPressControlNode(config)
6
- {
7
- const node = this;
8
- RED.nodes.createNode(node, config);
9
-
10
- const helper = require("../smart_helper.js");
11
-
12
- // dynamic config
13
- let long_press_ms = parseInt(config.long_press_ms || 1000, 10);
14
- let short = helper.evaluateNodeProperty(RED, config.short, "json");
15
- let long = helper.evaluateNodeProperty(RED, config.long, "json");
16
-
17
- // runtime values
18
- let on_time = null;
19
- let max_time_on_timeout = null;
20
-
21
- node.status({});
22
-
23
- node.on("input", function (msg)
24
- {
25
- if (msg.payload)
26
- {
27
- node.status({ fill: "yellow", shape: "ring", text: helper.getCurrentTimeForStatus() + ": Wait for button release..." });
28
- on_time = Date.now();
29
- startAutoLongPress();
30
- }
31
- else if (on_time != null)
32
- {
33
- const pressTime = Date.now() - on_time;
34
- on_time = null;
35
-
36
- // Stop if any timeout is set
37
- stopAutoOff();
38
-
39
- if (pressTime < long_press_ms)
40
- {
41
- node.status({ fill: "green", shape: "dot", text: helper.getCurrentTimeForStatus() + ": Last was short" });
42
- if (short)
43
- node.send([short, null]);
44
- }
45
- else
46
- {
47
- node.status({ fill: "green", shape: "dot", text: helper.getCurrentTimeForStatus() + ": Last was long" });
48
- if (long)
49
- node.send([null, long]);
50
- }
51
- }
52
- });
53
-
54
- let startAutoLongPress = () =>
55
- {
56
- stopAutoOff();
57
- max_time_on_timeout = setTimeout(() =>
58
- {
59
- on_time = null;
60
- node.status({ fill: "green", shape: "dot", text: helper.getCurrentTimeForStatus() + ": Last was long" });
61
- node.send([null, long]);
62
- }, long_press_ms);
63
- };
64
-
65
- let stopAutoOff = () =>
66
- {
67
- if (max_time_on_timeout != null)
68
- {
69
- clearTimeout(max_time_on_timeout);
70
- max_time_on_timeout = null;
71
- }
72
- };
73
- }
74
-
75
- RED.nodes.registerType("smart_long-press-control", LongPressControlNode);
76
- }