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.
- package/CHANGELOG.md +62 -0
- package/README.md +35 -17
- package/central/central.html +27 -24
- package/central/central.js +84 -26
- package/central/locales/de-DE/central.html +10 -0
- package/central/locales/de-DE/central.json +14 -0
- package/central/locales/en-US/central.html +10 -0
- package/central/locales/en-US/central.json +14 -0
- package/compare/compare.html +64 -87
- package/compare/compare.js +69 -29
- package/compare/locales/de-DE/compare.html +36 -0
- package/compare/locales/de-DE/compare.json +35 -0
- package/compare/locales/en-US/compare.html +36 -0
- package/compare/locales/en-US/compare.json +35 -0
- package/counter/counter.html +70 -72
- package/counter/counter.js +43 -20
- package/counter/locales/de-DE/counter.html +48 -0
- package/counter/locales/de-DE/counter.json +21 -0
- package/counter/locales/en-US/counter.html +48 -0
- package/counter/locales/en-US/counter.json +21 -0
- package/delay/delay.html +30 -102
- package/delay/delay.js +63 -20
- package/delay/locales/de-DE/delay.html +71 -0
- package/delay/locales/de-DE/delay.json +19 -0
- package/delay/locales/en-US/delay.html +76 -0
- package/delay/locales/en-US/delay.json +19 -0
- package/forwarder/forwarder.html +11 -42
- package/forwarder/forwarder.js +59 -18
- package/forwarder/locales/de-DE/forwarder.html +32 -0
- package/forwarder/locales/de-DE/forwarder.json +15 -0
- package/forwarder/locales/en-US/forwarder.html +32 -0
- package/forwarder/locales/en-US/forwarder.json +15 -0
- package/heating-curve/heating-curve.html +10 -51
- package/heating-curve/heating-curve.js +38 -13
- package/heating-curve/locales/de-DE/heating-curve.html +38 -0
- package/heating-curve/locales/de-DE/heating-curve.json +12 -0
- package/heating-curve/locales/en-US/heating-curve.html +38 -0
- package/heating-curve/locales/en-US/heating-curve.json +12 -0
- package/hysteresis/hysteresis.html +49 -69
- package/hysteresis/hysteresis.js +94 -68
- package/hysteresis/locales/de-DE/hysteresis.html +36 -0
- package/hysteresis/locales/de-DE/hysteresis.json +27 -0
- package/hysteresis/locales/en-US/hysteresis.html +36 -0
- package/hysteresis/locales/en-US/hysteresis.json +27 -0
- package/light/light.html +250 -0
- package/{light-control/light-control.js → light/light.js} +151 -32
- package/light/locales/de-DE/light.html +149 -0
- package/light/locales/de-DE/light.json +24 -0
- package/light/locales/en-US/light.html +148 -0
- package/light/locales/en-US/light.json +24 -0
- package/logic/locales/de-DE/logic.html +12 -0
- package/logic/locales/de-DE/logic.json +26 -0
- package/logic/locales/en-US/logic.html +12 -0
- package/logic/locales/en-US/logic.json +26 -0
- package/logic/logic.html +48 -64
- package/logic/logic.js +63 -29
- package/long-press/locales/de-DE/long-press.html +5 -0
- package/long-press/locales/de-DE/long-press.json +13 -0
- package/long-press/locales/en-US/long-press.html +5 -0
- package/long-press/locales/en-US/long-press.json +13 -0
- package/{long-press-control/long-press-control.html → long-press/long-press.html} +10 -14
- package/long-press/long-press.js +163 -0
- package/mixing-valve/locales/de-DE/mixing-valve.html +65 -0
- package/mixing-valve/locales/de-DE/mixing-valve.json +19 -0
- package/mixing-valve/locales/en-US/mixing-valve.html +66 -0
- package/mixing-valve/locales/en-US/mixing-valve.json +19 -0
- package/mixing-valve/mixing-valve.html +27 -93
- package/mixing-valve/mixing-valve.js +87 -61
- package/multi-press/locales/de-DE/multi-press.html +5 -0
- package/multi-press/locales/de-DE/multi-press.json +12 -0
- package/multi-press/locales/en-US/multi-press.html +5 -0
- package/multi-press/locales/en-US/multi-press.json +12 -0
- package/{multi-press-control/multi-press-control.html → multi-press/multi-press.html} +9 -13
- package/{multi-press-control/multi-press-control.js → multi-press/multi-press.js} +53 -5
- package/package.json +7 -7
- package/persistence.js +1 -0
- package/scene/locales/de-DE/scene.html +105 -0
- package/scene/locales/de-DE/scene.json +21 -0
- package/scene/locales/en-US/scene.html +107 -0
- package/scene/locales/en-US/scene.json +20 -0
- package/{scene-control/scene-control.html → scene/scene.html} +30 -132
- package/{scene-control/scene-control.js → scene/scene.js} +76 -26
- package/scheduler/locales/de-DE/scheduler.html +30 -0
- package/scheduler/locales/de-DE/scheduler.json +21 -0
- package/scheduler/locales/en-US/scheduler.html +30 -0
- package/scheduler/locales/en-US/scheduler.json +21 -0
- package/scheduler/scheduler.html +34 -64
- package/scheduler/scheduler.js +85 -53
- package/shutter/locales/de-DE/shutter.html +127 -0
- package/shutter/locales/de-DE/shutter.json +11 -0
- package/shutter/locales/en-US/shutter.html +133 -0
- package/shutter/locales/en-US/shutter.json +11 -0
- package/{shutter-control/shutter-control.html → shutter/shutter.html} +7 -133
- package/{shutter-control/shutter-control.js → shutter/shutter.js} +116 -56
- package/shutter-complex/locales/de-DE/shutter-complex.html +120 -0
- package/shutter-complex/locales/de-DE/shutter-complex.json +20 -0
- package/shutter-complex/locales/en-US/shutter-complex.html +120 -0
- package/shutter-complex/locales/en-US/shutter-complex.json +20 -0
- package/{shutter-complex-control/shutter-complex-control.html → shutter-complex/shutter-complex.html} +36 -140
- package/shutter-complex/shutter-complex.js +578 -0
- package/smart_helper.js +52 -9
- package/statistic/locales/de-DE/statistic.html +10 -0
- package/statistic/locales/de-DE/statistic.json +29 -0
- package/statistic/locales/en-US/statistic.html +10 -0
- package/statistic/locales/en-US/statistic.json +29 -0
- package/statistic/statistic.html +38 -43
- package/statistic/statistic.js +57 -28
- package/text-exec/locales/de-DE/text-exec.html +18 -0
- package/text-exec/locales/de-DE/text-exec.json +7 -0
- package/text-exec/locales/en-US/text-exec.html +18 -0
- package/text-exec/locales/en-US/text-exec.json +7 -0
- package/text-exec/text-exec.html +9 -25
- package/text-exec/text-exec.js +43 -2
- package/light-control/light-control.html +0 -363
- package/long-press-control/long-press-control.js +0 -76
- package/shutter-complex-control/shutter-complex-control.js +0 -442
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
<script type="text/html" data-help-name="smart_scheduler">
|
|
2
|
+
<p>
|
|
3
|
+
This node sends the corresponding messages to the output at the specified times.
|
|
4
|
+
</p>
|
|
5
|
+
<p>
|
|
6
|
+
The following topics are accepted:
|
|
7
|
+
<table>
|
|
8
|
+
<thead>
|
|
9
|
+
<tr>
|
|
10
|
+
<th>Topic</th>
|
|
11
|
+
<th>Description</th>
|
|
12
|
+
</tr>
|
|
13
|
+
</thead>
|
|
14
|
+
<tbody>
|
|
15
|
+
<tr>
|
|
16
|
+
<td><code>enable</code></td>
|
|
17
|
+
<td>Enables the scheduler.</td>
|
|
18
|
+
</tr>
|
|
19
|
+
<tr>
|
|
20
|
+
<td><code>disable</code></td>
|
|
21
|
+
<td>Disables the scheduler.</td>
|
|
22
|
+
</tr>
|
|
23
|
+
<tr>
|
|
24
|
+
<td><code>set_state</code></td>
|
|
25
|
+
<td>Enables the scheduler if <code>msg.payload = true</code> or disables the scheduler if <code>msg.payload = false</code>.</td>
|
|
26
|
+
</tr>
|
|
27
|
+
</tbody>
|
|
28
|
+
</table>
|
|
29
|
+
</p>
|
|
30
|
+
</script>
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
{
|
|
2
|
+
"scheduler": {
|
|
3
|
+
"ui": {
|
|
4
|
+
"name": "Name",
|
|
5
|
+
"scheduler_enabled": "Scheduler enabled",
|
|
6
|
+
"schedules": "Schedules",
|
|
7
|
+
|
|
8
|
+
"system_start": "System start",
|
|
9
|
+
"save_state": "Save state",
|
|
10
|
+
"send_after_start": "Send last message 10 seconds after start",
|
|
11
|
+
|
|
12
|
+
"monday": "Monday",
|
|
13
|
+
"tuesday": "Tuesday",
|
|
14
|
+
"wednesday": "Wednesday",
|
|
15
|
+
"thursday": "Thursday",
|
|
16
|
+
"friday": "Friday",
|
|
17
|
+
"saturday": "Saturday",
|
|
18
|
+
"sunday": "Sunday"
|
|
19
|
+
}
|
|
20
|
+
}
|
|
21
|
+
}
|
package/scheduler/scheduler.html
CHANGED
|
@@ -1,31 +1,3 @@
|
|
|
1
|
-
<script type="text/html" data-template-name="smart_scheduler">
|
|
2
|
-
<div class="form-row">
|
|
3
|
-
<label for="node-input-name"><i class="fa fa-tag"></i> <span data-i18n="node-red:common.label.name"></span></label>
|
|
4
|
-
<input type="text" id="node-input-name" data-i18n="[placeholder]node-red:common.label.name" />
|
|
5
|
-
</div>
|
|
6
|
-
<div class="form-row">
|
|
7
|
-
<label for="node-input-enabled"></label>
|
|
8
|
-
<input type="checkbox" id="node-input-enabled" style="width: 20px;" />
|
|
9
|
-
<label for="node-input-enabled" style="width: 200px;">Scheduler aktiviert</label>
|
|
10
|
-
</div>
|
|
11
|
-
<div class="form-row" style="margin-bottom: 2px;">
|
|
12
|
-
<p class="text-center"><i class="fa fa-list"></i> <strong>Schedules</strong></p>
|
|
13
|
-
</div>
|
|
14
|
-
<div class="form-row node-scheduler-schedules-row">
|
|
15
|
-
<ol id="node-scheduler-schedules"></ol>
|
|
16
|
-
</div>
|
|
17
|
-
<hr/>
|
|
18
|
-
<h4 style="margin: 0.5rem 0;">Systemstart</h4>
|
|
19
|
-
<div class="form-row">
|
|
20
|
-
<input type="checkbox" id="node-input-save_state" style="width: 20px;" />
|
|
21
|
-
<label for="node-input-save_state" style="width: calc(100% - 30px);">Zustand speichern</label>
|
|
22
|
-
</div>
|
|
23
|
-
<div class="form-row" id="resend_on_start_row">
|
|
24
|
-
<input type="checkbox" id="node-input-resend_on_start" style="width: 20px;" />
|
|
25
|
-
<label for="node-input-resend_on_start" style="width: calc(100% - 30px);">Letze Nachricht 10 Sekunden nach dem Start senden</label>
|
|
26
|
-
</div>
|
|
27
|
-
</script>
|
|
28
|
-
|
|
29
1
|
<script type="text/html" data-template-scheduler-row="">
|
|
30
2
|
<div>
|
|
31
3
|
<div style="display: inline-block; width: 30px; margin-left: 10px;">
|
|
@@ -224,13 +196,13 @@
|
|
|
224
196
|
default: "",
|
|
225
197
|
multiple: true,
|
|
226
198
|
options: [
|
|
227
|
-
{ value: "1", label: "
|
|
228
|
-
{ value: "2", label: "
|
|
229
|
-
{ value: "3", label: "
|
|
230
|
-
{ value: "4", label: "
|
|
231
|
-
{ value: "5", label: "
|
|
232
|
-
{ value: "6", label: "
|
|
233
|
-
{ value: "0", label: "
|
|
199
|
+
{ value: "1", label: node._("scheduler.ui.monday") },
|
|
200
|
+
{ value: "2", label: node._("scheduler.ui.tuesday") },
|
|
201
|
+
{ value: "3", label: node._("scheduler.ui.wednesday") },
|
|
202
|
+
{ value: "4", label: node._("scheduler.ui.thursday") },
|
|
203
|
+
{ value: "5", label: node._("scheduler.ui.friday") },
|
|
204
|
+
{ value: "6", label: node._("scheduler.ui.saturday") },
|
|
205
|
+
{ value: "0", label: node._("scheduler.ui.sunday") }
|
|
234
206
|
],
|
|
235
207
|
},
|
|
236
208
|
],
|
|
@@ -296,6 +268,7 @@
|
|
|
296
268
|
oneditsave: function ()
|
|
297
269
|
{
|
|
298
270
|
let node = this;
|
|
271
|
+
|
|
299
272
|
node.schedules = [];
|
|
300
273
|
|
|
301
274
|
let scheduleList = $("#node-scheduler-schedules");
|
|
@@ -327,33 +300,30 @@
|
|
|
327
300
|
});
|
|
328
301
|
</script>
|
|
329
302
|
|
|
330
|
-
<script type="text/html" data-
|
|
331
|
-
<
|
|
332
|
-
|
|
333
|
-
<
|
|
334
|
-
|
|
335
|
-
|
|
336
|
-
|
|
337
|
-
|
|
338
|
-
|
|
339
|
-
|
|
340
|
-
|
|
341
|
-
|
|
342
|
-
|
|
343
|
-
|
|
344
|
-
|
|
345
|
-
|
|
346
|
-
|
|
347
|
-
|
|
348
|
-
|
|
349
|
-
|
|
350
|
-
|
|
351
|
-
|
|
352
|
-
|
|
353
|
-
|
|
354
|
-
|
|
355
|
-
|
|
356
|
-
</table>
|
|
357
|
-
</p>
|
|
358
|
-
</p>
|
|
303
|
+
<script type="text/html" data-template-name="smart_scheduler">
|
|
304
|
+
<div class="form-row">
|
|
305
|
+
<label for="node-input-name"><i class="fa fa-tag"></i> <span data-i18n="scheduler.ui.name"></span></label>
|
|
306
|
+
<input type="text" id="node-input-name" data-i18n="[placeholder]scheduler.ui.name" />
|
|
307
|
+
</div>
|
|
308
|
+
<div class="form-row">
|
|
309
|
+
<label for="node-input-enabled"></label>
|
|
310
|
+
<input type="checkbox" id="node-input-enabled" style="width: 20px;" />
|
|
311
|
+
<label for="node-input-enabled" style="width: 200px;" data-i18n="scheduler.ui.scheduler_enabled"></label>
|
|
312
|
+
</div>
|
|
313
|
+
<div class="form-row" style="margin-bottom: 2px;">
|
|
314
|
+
<p class="text-center"><i class="fa fa-list"></i> <strong data-i18n="scheduler.ui.schedules"></strong></p>
|
|
315
|
+
</div>
|
|
316
|
+
<div class="form-row node-scheduler-schedules-row">
|
|
317
|
+
<ol id="node-scheduler-schedules"></ol>
|
|
318
|
+
</div>
|
|
319
|
+
<hr/>
|
|
320
|
+
<h4 style="margin: 0.5rem 0;" data-i18n="scheduler.ui.system_start"></h4>
|
|
321
|
+
<div class="form-row">
|
|
322
|
+
<input type="checkbox" id="node-input-save_state" style="width: 20px;" />
|
|
323
|
+
<label for="node-input-save_state" style="width: calc(100% - 30px);" data-i18n="scheduler.ui.save_state"></label>
|
|
324
|
+
</div>
|
|
325
|
+
<div class="form-row" id="resend_on_start_row">
|
|
326
|
+
<input type="checkbox" id="node-input-resend_on_start" style="width: 20px;" />
|
|
327
|
+
<label for="node-input-resend_on_start" style="width: calc(100% - 30px);" data-i18n="scheduler.ui.send_after_start"></label>
|
|
328
|
+
</div>
|
|
359
329
|
</script>
|
package/scheduler/scheduler.js
CHANGED
|
@@ -7,29 +7,52 @@ module.exports = function (RED)
|
|
|
7
7
|
const node = this;
|
|
8
8
|
RED.nodes.createNode(node, config);
|
|
9
9
|
|
|
10
|
+
|
|
11
|
+
// ###################
|
|
12
|
+
// # Class constants #
|
|
13
|
+
// ###################
|
|
14
|
+
|
|
15
|
+
|
|
16
|
+
// #######################
|
|
17
|
+
// # Global help objects #
|
|
18
|
+
// #######################
|
|
10
19
|
const smart_context = require("../persistence.js")(RED);
|
|
11
20
|
const helper = require("../smart_helper.js");
|
|
12
21
|
|
|
22
|
+
|
|
23
|
+
// #####################
|
|
24
|
+
// # persistent values #
|
|
25
|
+
// #####################
|
|
13
26
|
var node_settings = {
|
|
14
27
|
enabled: config.enabled,
|
|
15
|
-
|
|
28
|
+
last_message: null,
|
|
16
29
|
};
|
|
17
30
|
|
|
31
|
+
|
|
32
|
+
// load or delete saved values
|
|
18
33
|
if (config.save_state)
|
|
19
|
-
{
|
|
20
|
-
// load old saved values
|
|
21
34
|
node_settings = Object.assign(node_settings, smart_context.get(node.id));
|
|
22
|
-
}
|
|
23
35
|
else
|
|
24
|
-
{
|
|
25
|
-
// delete old saved values
|
|
26
36
|
smart_context.del(node.id);
|
|
27
|
-
}
|
|
28
37
|
|
|
38
|
+
|
|
39
|
+
// ##################
|
|
40
|
+
// # Dynamic config #
|
|
41
|
+
// ##################
|
|
42
|
+
|
|
43
|
+
|
|
44
|
+
// ##################
|
|
45
|
+
// # Runtime values #
|
|
46
|
+
// ##################
|
|
47
|
+
|
|
48
|
+
// Here the setTimeout return value is stored when the next timeout should happen
|
|
29
49
|
let timeout = null;
|
|
50
|
+
|
|
51
|
+
// This is date when the next event schould be raised
|
|
30
52
|
let nextEvent = null;
|
|
31
53
|
|
|
32
|
-
|
|
54
|
+
|
|
55
|
+
// Initially prepare schedules config object
|
|
33
56
|
setTimeout(() =>
|
|
34
57
|
{
|
|
35
58
|
for (let i = 0; i < config.schedules.length; i++)
|
|
@@ -47,48 +70,17 @@ module.exports = function (RED)
|
|
|
47
70
|
}, 1000);
|
|
48
71
|
|
|
49
72
|
|
|
73
|
+
// ###############
|
|
74
|
+
// # Node events #
|
|
75
|
+
// ###############
|
|
50
76
|
node.on("input", function (msg)
|
|
51
77
|
{
|
|
52
|
-
|
|
53
|
-
{
|
|
54
|
-
case "enable":
|
|
55
|
-
if (node_settings.enabled)
|
|
56
|
-
return;
|
|
57
|
-
|
|
58
|
-
node_settings.enabled = true;
|
|
59
|
-
if (config.save_state)
|
|
60
|
-
smart_context.set(node.id, node_settings);
|
|
61
|
-
break;
|
|
62
|
-
|
|
63
|
-
case "disable":
|
|
64
|
-
if (!node_settings.enabled)
|
|
65
|
-
return;
|
|
66
|
-
|
|
67
|
-
node_settings.enabled = false;
|
|
68
|
-
if (config.save_state)
|
|
69
|
-
smart_context.set(node.id, node_settings);
|
|
70
|
-
break;
|
|
71
|
-
|
|
72
|
-
case "set_state":
|
|
73
|
-
if (node_settings.enabled == !!msg.payload)
|
|
74
|
-
return;
|
|
75
|
-
|
|
76
|
-
node_settings.enabled = !!msg.payload;
|
|
77
|
-
if (config.save_state)
|
|
78
|
-
smart_context.set(node.id, node_settings);
|
|
79
|
-
break;
|
|
80
|
-
|
|
81
|
-
default:
|
|
82
|
-
return;
|
|
83
|
-
}
|
|
84
|
-
|
|
85
|
-
if (node_settings.enabled)
|
|
86
|
-
initTimeouts();
|
|
87
|
-
else
|
|
88
|
-
clearTimeouts();
|
|
78
|
+
handleTopic(msg);
|
|
89
79
|
|
|
90
80
|
setStatus();
|
|
91
|
-
|
|
81
|
+
|
|
82
|
+
if (config.save_state)
|
|
83
|
+
smart_context.set(node.id, node_settings);
|
|
92
84
|
});
|
|
93
85
|
|
|
94
86
|
node.on("close", function ()
|
|
@@ -100,6 +92,33 @@ module.exports = function (RED)
|
|
|
100
92
|
}
|
|
101
93
|
});
|
|
102
94
|
|
|
95
|
+
|
|
96
|
+
// #####################
|
|
97
|
+
// # Private functions #
|
|
98
|
+
// #####################
|
|
99
|
+
|
|
100
|
+
// This is the main function which handles all topics that was received.
|
|
101
|
+
let handleTopic = msg =>
|
|
102
|
+
{
|
|
103
|
+
let real_topic = helper.getTopicName(msg.topic);
|
|
104
|
+
|
|
105
|
+
if (real_topic == "set_state")
|
|
106
|
+
real_topic = (!!msg.payload) ? "enable" : "disable";
|
|
107
|
+
|
|
108
|
+
switch (real_topic)
|
|
109
|
+
{
|
|
110
|
+
case "enable":
|
|
111
|
+
node_settings.enabled = true;
|
|
112
|
+
initNextTimeout();
|
|
113
|
+
break;
|
|
114
|
+
|
|
115
|
+
case "disable":
|
|
116
|
+
node_settings.enabled = false;
|
|
117
|
+
break;
|
|
118
|
+
}
|
|
119
|
+
}
|
|
120
|
+
|
|
121
|
+
// calculate which event should occur nect
|
|
103
122
|
let initNextTimeout = () =>
|
|
104
123
|
{
|
|
105
124
|
let minIndex = null;
|
|
@@ -120,16 +139,28 @@ module.exports = function (RED)
|
|
|
120
139
|
return;
|
|
121
140
|
}
|
|
122
141
|
|
|
142
|
+
// Stop timeout if any
|
|
143
|
+
if (timeout != null)
|
|
144
|
+
{
|
|
145
|
+
clearTimeout(timeout);
|
|
146
|
+
timeout = null;
|
|
147
|
+
}
|
|
148
|
+
|
|
123
149
|
nextEvent = config.schedules[minIndex].nextEvent;
|
|
124
150
|
let waitTime = nextEvent.getTime() - (new Date()).getTime();
|
|
125
|
-
timeout = setTimeout(
|
|
151
|
+
timeout = setTimeout(() =>
|
|
152
|
+
{
|
|
153
|
+
timeout = null;
|
|
154
|
+
raiseEvent(minIndex);
|
|
155
|
+
}, waitTime);
|
|
126
156
|
}
|
|
127
157
|
|
|
158
|
+
// calculates the next time when the scheduled i-th entry should run.
|
|
128
159
|
let calcNextEvent = i =>
|
|
129
160
|
{
|
|
130
161
|
const schedule = config.schedules[i];
|
|
131
162
|
|
|
132
|
-
// If no day is checked
|
|
163
|
+
// If no day is checked it is never raised
|
|
133
164
|
if (!schedule.days || schedule.days.length == 0)
|
|
134
165
|
return null;
|
|
135
166
|
|
|
@@ -174,7 +205,7 @@ module.exports = function (RED)
|
|
|
174
205
|
schedule.second
|
|
175
206
|
);
|
|
176
207
|
|
|
177
|
-
//
|
|
208
|
+
// helper.log({
|
|
178
209
|
// i,
|
|
179
210
|
// findNextDay,
|
|
180
211
|
// nextEvent
|
|
@@ -183,6 +214,7 @@ module.exports = function (RED)
|
|
|
183
214
|
return nextEvent;
|
|
184
215
|
}
|
|
185
216
|
|
|
217
|
+
// Send the i-th entry to the output
|
|
186
218
|
let raiseEvent = i =>
|
|
187
219
|
{
|
|
188
220
|
const schedule = config.schedules[i];
|
|
@@ -191,8 +223,8 @@ module.exports = function (RED)
|
|
|
191
223
|
return;
|
|
192
224
|
|
|
193
225
|
timeout = null;
|
|
194
|
-
node.send(schedule.message);
|
|
195
|
-
node_settings.
|
|
226
|
+
node.send(helper.cloneObject(schedule.message));
|
|
227
|
+
node_settings.last_message = schedule.message;
|
|
196
228
|
|
|
197
229
|
if (config.save_state)
|
|
198
230
|
smart_context.set(node.id, node_settings);
|
|
@@ -233,11 +265,11 @@ module.exports = function (RED)
|
|
|
233
265
|
}
|
|
234
266
|
}
|
|
235
267
|
|
|
236
|
-
if (config.save_state && config.resend_on_start && node_settings.
|
|
268
|
+
if (config.save_state && config.resend_on_start && node_settings.last_message != null)
|
|
237
269
|
{
|
|
238
270
|
setTimeout(() =>
|
|
239
271
|
{
|
|
240
|
-
node.send(node_settings.
|
|
272
|
+
node.send(helper.cloneObject(node_settings.last_message));
|
|
241
273
|
}, 10000);
|
|
242
274
|
}
|
|
243
275
|
}
|
|
@@ -0,0 +1,127 @@
|
|
|
1
|
+
|
|
2
|
+
<script type="text/html" data-help-name="smart_shutter-control">
|
|
3
|
+
<p>
|
|
4
|
+
<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/>
|
|
5
|
+
Diese Node verwendet nur den Teil <code>name</code>. <code>#</code> und <code>nummer</code> sind dabei optional.
|
|
6
|
+
</p>
|
|
7
|
+
<p>
|
|
8
|
+
Diese Node steuert Rollladen oder Jalousien.
|
|
9
|
+
Es gibt 3 Ausgänge die angesteuert werden können:
|
|
10
|
+
<ol>
|
|
11
|
+
<li><b>Auf/Ab:</b> <code>msg.payload = false</code> lässt den Rollladen nach oben fahren und <code>msg.payload = true</code> lässt den Rollladen nach unten fahren.</li>
|
|
12
|
+
<li><b>Stop:</b> <code>msg.payload = true</code> lässt den Rollladen stoppen.</li>
|
|
13
|
+
<li><b>Position:</b> <code>msg.payload = 42</code> Lässt den Rollladen auf 42% fahren.</li>
|
|
14
|
+
</ol>
|
|
15
|
+
Die Ausgänge sind den jeweiligen KNX Gruppenadressen zuzuordnen.
|
|
16
|
+
</p>
|
|
17
|
+
<p>
|
|
18
|
+
Diese Node erwartet folgende Topics als Eingang:<br/>
|
|
19
|
+
<table>
|
|
20
|
+
<thead>
|
|
21
|
+
<tr>
|
|
22
|
+
<th>Topic</th>
|
|
23
|
+
<th>Beschreibung</th>
|
|
24
|
+
<th>msg.payload == false wird ignoriert</th>
|
|
25
|
+
</tr>
|
|
26
|
+
</thead>
|
|
27
|
+
<tbody>
|
|
28
|
+
<tr>
|
|
29
|
+
<td><code>status</code> oder <code>status_position</code></td>
|
|
30
|
+
<td>
|
|
31
|
+
Meldet der Node die aktuelle Position.
|
|
32
|
+
Dadurch kann die Node feststellen in welche Richtung ein Rollladen als letztes gefahren ist.
|
|
33
|
+
Dies wird für das topic <b>toggle</b> benötigt um die nächste Laufrichtung bei einer 1-Tasten Bedienung zu ermitteln.
|
|
34
|
+
</td>
|
|
35
|
+
</tr>
|
|
36
|
+
<tr>
|
|
37
|
+
<td><code>up_down</code></td>
|
|
38
|
+
<td>
|
|
39
|
+
Nimmt einen Befehl von Home Assistant entgegen um informiert zu werden ob der Rollladen läuft und in welche Richtung.<br/>
|
|
40
|
+
<strong>Wichtig:</strong> Dieses Topic startet den Rollladen <u>nicht</u>, da die Gruppenadresse direkt mit dem Jalousiemodul verbunden sein muss.
|
|
41
|
+
</td>
|
|
42
|
+
<td>Nein</td>
|
|
43
|
+
</tr>
|
|
44
|
+
<tr>
|
|
45
|
+
<td><code>short_up_down</code></td>
|
|
46
|
+
<td>
|
|
47
|
+
Sendet bei <code>msg.payload = false</code> einen kurzen Hochfahrbefehl und bei <code>msg.payload = true</code> einen kurzen Runterfahrbefehl.<br/>
|
|
48
|
+
Es wird dabei die im Baustein hinterlegte Zeit verwendet. Diese kann aber durch setzen von <code>msg.time_on = 1500</code> oder <code>msg.time_on = "1.5s"</code> einmalig überschrieben werden.
|
|
49
|
+
</td>
|
|
50
|
+
<td>Nein</td>
|
|
51
|
+
</tr>
|
|
52
|
+
<tr>
|
|
53
|
+
<td><code>up</code></td>
|
|
54
|
+
<td>Sendet einen Hochfahrbefehl, falls der Rollladen nicht bereits nach oben fährt. Ggf. wird vorher noch ein Stop-Befehl gesendet.</td>
|
|
55
|
+
<td>Ja</td>
|
|
56
|
+
</tr>
|
|
57
|
+
<tr>
|
|
58
|
+
<td><code>up_stop</code></td>
|
|
59
|
+
<td>Sendet abwechselnd einen Stop- und einen Hochfahrbefehl.</td>
|
|
60
|
+
<td>Ja</td>
|
|
61
|
+
</tr>
|
|
62
|
+
<tr>
|
|
63
|
+
<td><code>down</code></td>
|
|
64
|
+
<td>Sendet einen Runterfahrbefehl, falls der Rollladen nicht bereits nach unten fährt. Ggf. wird vorher noch ein Stop-Befehl gesendet.</td>
|
|
65
|
+
<td>Ja</td>
|
|
66
|
+
</tr>
|
|
67
|
+
<tr>
|
|
68
|
+
<td><code>down_stop</code></td>
|
|
69
|
+
<td>Sendet abwechselnd einen Stop- und einen Runterfahrbefehl.</td>
|
|
70
|
+
<td>Ja</td>
|
|
71
|
+
</tr>
|
|
72
|
+
<tr>
|
|
73
|
+
<td><code>stop</code></td>
|
|
74
|
+
<td>Sendet einen Stopbefehl.</td>
|
|
75
|
+
<td>Ja</td>
|
|
76
|
+
</tr>
|
|
77
|
+
<tr>
|
|
78
|
+
<td><code>position</code></td>
|
|
79
|
+
<td>Sendet einen Positionsbefehl. <code>msg.payload</code> sollte ein Wert zwischen 0 (offen) und 100 (geschlossen) haben.</td>
|
|
80
|
+
<td>Nein</td>
|
|
81
|
+
</tr>
|
|
82
|
+
<tr>
|
|
83
|
+
<td><code>toggle</code> (default)</td>
|
|
84
|
+
<td>Schaltet den Rollladen abwechselnd auf hoch, stop, runter, stop.</td>
|
|
85
|
+
<td>Ja</td>
|
|
86
|
+
</tr>
|
|
87
|
+
</tbody>
|
|
88
|
+
</table>
|
|
89
|
+
</p>
|
|
90
|
+
<p>
|
|
91
|
+
Diese Node verwaltet keine Laufzeit für den Rollladen selbst. Diese muss über ETS für den Ausgang konfiguriert werden.
|
|
92
|
+
Es ist jedoch möglich, den Rollladen nach einer definierten Zeit automatisch abzuschalten.
|
|
93
|
+
Es ist jedoch möglich, den Rollladen nach einer definierten Zeit automatisch abzuschalten.
|
|
94
|
+
Beispiel: <code>msg = { "topic": "up", "time_on": 5000 }</code> oder <code>msg = { "topic": "up", "time_on": "5s" }</code><br/>
|
|
95
|
+
Diese Nachricht lässt den Rollladen für 5000 Millisekunden / 5 Sekunden nach oben fahren. Sollte es sich um eine Jalousie halten, werden die Lamellen entsprechend gedreht.
|
|
96
|
+
Als Einheit für die Zeit können folgende Werte verwendet werden:
|
|
97
|
+
<table>
|
|
98
|
+
<thead>
|
|
99
|
+
<tr>
|
|
100
|
+
<th>Einheit</th>
|
|
101
|
+
<th>Beschreibung</th>
|
|
102
|
+
</tr>
|
|
103
|
+
</thead>
|
|
104
|
+
<tbody>
|
|
105
|
+
<tr>
|
|
106
|
+
<td><code>ms</code> (default)</td>
|
|
107
|
+
<td>Millisekunden</td>
|
|
108
|
+
</tr>
|
|
109
|
+
<tr>
|
|
110
|
+
<td><code>s</code> oder <code>sec</code></td>
|
|
111
|
+
<td>Sekunden</td>
|
|
112
|
+
</tr>
|
|
113
|
+
<tr>
|
|
114
|
+
<td><code>m</code> oder <code>min</code></td>
|
|
115
|
+
<td>Mintun.</td>
|
|
116
|
+
</tr>
|
|
117
|
+
<tr>
|
|
118
|
+
<td><code>h</code></td>
|
|
119
|
+
<td>Stunden</td>
|
|
120
|
+
</tr>
|
|
121
|
+
</tbody>
|
|
122
|
+
</table>
|
|
123
|
+
</p>
|
|
124
|
+
<p>
|
|
125
|
+
Die Angabe einer Zeit funktioniert nicht mit dem topic <b>position</b>.
|
|
126
|
+
</p>
|
|
127
|
+
</script>
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
{
|
|
2
|
+
"shutter": {
|
|
3
|
+
"ui": {
|
|
4
|
+
"name": "Name",
|
|
5
|
+
"text": "Text",
|
|
6
|
+
"controlled_by_words": "Diese Node kann über die eingegebenen Wörter gesteuert werden. Mehrere Wörter werden durch ein Komma getrennt.",
|
|
7
|
+
"time_short": "Zeit kurz",
|
|
8
|
+
"controlled_by_central": "Dieser Baustein wird von folgenden Zentralbausteinen gesteuert:"
|
|
9
|
+
}
|
|
10
|
+
}
|
|
11
|
+
}
|