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
package/delay/delay.js CHANGED
@@ -9,9 +9,22 @@ module.exports = function (RED)
9
9
  const node = this;
10
10
  RED.nodes.createNode(node, config);
11
11
 
12
+
13
+ // ###################
14
+ // # Class constants #
15
+ // ###################
16
+
17
+
18
+ // #######################
19
+ // # Global help objects #
20
+ // #######################
12
21
  const smart_context = require("../persistence.js")(RED);
13
22
  const helper = require("../smart_helper.js");
14
23
 
24
+
25
+ // #####################
26
+ // # persistent values #
27
+ // #####################
15
28
  var node_settings = {
16
29
  on_delay_ms: helper.getTimeInMs(config.on_delay, config.on_delay_unit),
17
30
  off_delay_ms: helper.getTimeInMs(config.off_delay, config.off_delay_unit),
@@ -45,16 +58,58 @@ module.exports = function (RED)
45
58
  smart_context.del(node.id);
46
59
  }
47
60
 
48
- // dynamic config
61
+
62
+ // ##################
63
+ // # Dynamic config #
64
+ // ##################
49
65
  let delay_only_on_change = config.delay_only_on_change;
50
66
 
51
- // runtime values
67
+
68
+ // ##################
69
+ // # Runtime values #
70
+ // ##################
71
+
72
+ // Here the setTimeout return value is stored to send the delayed message.
52
73
  let timeout = null;
74
+
75
+ // Saves the next payload that needs to be send.
76
+ // This is used to avoid restarting the timeout for the same payload.
53
77
  let next_payload = null;
54
78
 
79
+
80
+ // ###############
81
+ // # Node events #
82
+ // ###############
55
83
  node.on("input", function (msg)
56
84
  {
57
- switch (msg.topic)
85
+ handleTopic(msg);
86
+
87
+ // setStatus();
88
+
89
+ if (config.save_state)
90
+ smart_context.set(node.id, node_settings);
91
+ });
92
+
93
+ node.on("close", function ()
94
+ {
95
+ if (timeout != null)
96
+ {
97
+ clearTimeout(timeout);
98
+ timeout = null;
99
+ }
100
+ });
101
+
102
+
103
+ // #####################
104
+ // # Private functions #
105
+ // #####################
106
+
107
+ // This is the main function which handles all topics that was received.
108
+ let handleTopic = msg =>
109
+ {
110
+ let real_topic = helper.getTopicName(msg.topic);
111
+
112
+ switch (real_topic)
58
113
  {
59
114
  case "set_delay_on":
60
115
  node_settings.on_delay_ms = helper.getTimeInMsFromString(msg.payload);
@@ -85,16 +140,7 @@ module.exports = function (RED)
85
140
  send(msg);
86
141
  break;
87
142
  }
88
- });
89
-
90
- node.on("close", function ()
91
- {
92
- if (timeout != null)
93
- {
94
- clearTimeout(timeout);
95
- timeout = null;
96
- }
97
- });
143
+ }
98
144
 
99
145
  let send = msg =>
100
146
  {
@@ -144,10 +190,7 @@ module.exports = function (RED)
144
190
  node.status({ fill: "yellow", shape: "dot", text: helper.getCurrentTimeForStatus() + ": " + "Sended " + getMessageStatusText(msg) });
145
191
  node_settings.last_message = helper.cloneObject(msg);
146
192
 
147
- if (config.save_state)
148
- smart_context.set(node.id, node_settings);
149
-
150
- node.send(msg);
193
+ node.send(node_settings.last_message);
151
194
  return;
152
195
  }
153
196
 
@@ -159,10 +202,10 @@ module.exports = function (RED)
159
202
  node.status({ fill: "yellow", shape: "dot", text: helper.getCurrentTimeForStatus() + ": " + "Sended " + getMessageStatusText(msg) });
160
203
  node_settings.last_message = helper.cloneObject(msg);
161
204
 
205
+ node.send(node_settings.last_message);
206
+
162
207
  if (config.save_state)
163
208
  smart_context.set(node.id, node_settings);
164
-
165
- node.send(msg);
166
209
  }, delay_ms);
167
210
  }
168
211
 
@@ -185,7 +228,7 @@ module.exports = function (RED)
185
228
  setTimeout(() =>
186
229
  {
187
230
  node.status({ fill: "yellow", shape: "dot", text: helper.getCurrentTimeForStatus() + ": " + "Sended " + getMessageStatusText(node_settings.last_message) });
188
- node.send(node_settings.last_message);
231
+ node.send(helper.cloneObject(node_settings.last_message));
189
232
  }, 10000);
190
233
  }
191
234
  }
@@ -0,0 +1,71 @@
1
+ <script type="text/html" data-help-name="smart_delay">
2
+ <p>Diese Node kann dazu verwendet werden ein Ein- oder Ausschaltsignal zu verzögern.</p>
3
+ <p>Die Zeit 0 bedeutet keine Verögerung.</p>
4
+ <p>
5
+ <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/>
6
+ Diese Node verwendet nur den Teil <code>name</code>. <code>#</code> und <code>nummer</code> sind dabei optional.
7
+ </p>
8
+ <p>
9
+ Folgende topics werden akzeptiert:
10
+ <table>
11
+ <thead>
12
+ <tr>
13
+ <th>Topic</th>
14
+ <th>Beschreibung</th>
15
+ </tr>
16
+ </thead>
17
+ <tbody>
18
+ <tr>
19
+ <td><code>set_delay_on</code></td>
20
+ <td>Setzt die Einschaltverzögerung auf die in <code>msg.payload</code> angegebene Zeit.</td>
21
+ </tr>
22
+ <tr>
23
+ <td><code>set_delay_off</code></td>
24
+ <td>Setzt die Ausschaltverzögerung auf die in <code>msg.payload</code> angegebene Zeit.</td>
25
+ </tr>
26
+ <tr>
27
+ <td><code>set_delays</code></td>
28
+ <td>Setzt die Ein- und Ausschaltverzögerung auf die in <code>msg.payload</code> angegebene Zeit.</td>
29
+ </tr>
30
+ </tbody>
31
+ </table>
32
+ </p>
33
+ <p>
34
+ Beispiel: <code>msg = { "topic": "set_delay_on", "payload": 5000 }</code> oder <code>msg = { "topic": "set_delay_on", "payload": "5s" }</code><br/>
35
+ Diese Nachricht setzt die Einschaltverzögerung auf 5000 Millisekunden / 5 Sekunden.
36
+ Ist die Zeit auf 0 eingestellt, wird die Nachricht sofort weitergeleitet.<br/>
37
+ Als Einheit für die Zeit können folgende Werte verwendet werden:
38
+ <table>
39
+ <thead>
40
+ <tr>
41
+ <th>Einheit</th>
42
+ <th>Beschreibung</th>
43
+ </tr>
44
+ </thead>
45
+ <tbody>
46
+ <tr>
47
+ <td><code>ms</code> (default)</td>
48
+ <td>Millisekunden</td>
49
+ </tr>
50
+ <tr>
51
+ <td><code>s</code> oder <code>sec</code></td>
52
+ <td>Sekunden</td>
53
+ </tr>
54
+ <tr>
55
+ <td><code>m</code> oder <code>min</code></td>
56
+ <td>Mintun.</td>
57
+ </tr>
58
+ <tr>
59
+ <td><code>h</code></td>
60
+ <td>Stunden</td>
61
+ </tr>
62
+ </tbody>
63
+ </table>
64
+ </p>
65
+ <p>
66
+ Wenn die Checkbox <b>Nur verzögern, wenn sich <code>msg.payload</code> verändert hat.</b> aktiviert ist
67
+ und während dem Warten um ein Einschaltsignal weiterzuleiten ein Ausschaltsignal empfangen wird,
68
+ so wird das Senden des Einschaltsignals abgebrochen. Dies gilt auch für den umgekehrten Fall.<br/>
69
+ Ist die Checkbox nicht aktiviert, wird jede Nachricht verzögert, sofern nicht bereits eine Verzögerung für den gleichen <code>payload</code> aktiv ist.
70
+ </p>
71
+ </script>
@@ -0,0 +1,19 @@
1
+ {
2
+ "delay": {
3
+ "ui": {
4
+ "name": "Name",
5
+
6
+ "on_delay": "Einschalt- verzögerung",
7
+ "off_delay": "Ausschalt- verzögerung",
8
+ "delay_only_on_change": "Nur verzögern, wenn sich <code>msg.payload</code> verändert hat.",
9
+ "system_start": "Systemstart",
10
+ "save_state": "Zustand speichern",
11
+ "send_after_start": "Letze Nachricht 10 Sekunden nach dem Start senden",
12
+
13
+ "milliseconds": "Millisekunden",
14
+ "seconds": "Sekunden",
15
+ "minutes": "Minuten",
16
+ "hours": "Stunden"
17
+ }
18
+ }
19
+ }
@@ -0,0 +1,76 @@
1
+ <script type="text/html" data-help-name="smart_delay">
2
+ <p>This node can be used to delay an on or off signal.</p>
3
+ <p>The time 0 means no delay.</p>
4
+ <p>
5
+ <b>Note:</b> Smart Nodes use topics in the format <code>name#number</code>, so that different Smart Nodes can be controlled with the same topic.<br />
6
+ This node only uses the part <code>name</code>. <code>#</code> and <code>number</code> are optional.
7
+ </p>
8
+ <p>
9
+ The following topics are accepted:
10
+ <table>
11
+ <thead>
12
+ <tr>
13
+ <th>Topic</th>
14
+ <th>Description</th>
15
+ </tr>
16
+ </thead>
17
+ <tbody>
18
+ <tr>
19
+ <td><code>set_delay_on</code></td>
20
+ <td>Sets the on delay to the time specified in <code>msg.payload</code>.</td>
21
+ </tr>
22
+ <tr>
23
+ <td><code>set_delay_off</code></td>
24
+ <td>Sets the off delay to the time specified in <code>msg.payload</code>.</td>
25
+ </tr>
26
+ <tr>
27
+ <td><code>set_delays</code></td>
28
+ <td>Sets the on and off delay to the time specified in <code>msg.payload</code> Time.</td>
29
+ </tr>
30
+ </tbody>
31
+ </table>
32
+ </p>
33
+ <p>
34
+ Example: <code>msg = { "topic": "set_delay_on", "payload": 5000 }</code> or <code>msg = { "topic": "set_delay_on", "payload": "5s" }</code><br />
35
+ This message sets the power-on delay to 5000 milliseconds / 5 seconds.
36
+ If the time is set to 0, the message is forwarded immediately.<br />
37
+ The following values can be used as a unit for time:
38
+ <table>
39
+ <thead>
40
+ <tr>
41
+ <th>Unit</th>
42
+ <th>Description</th>
43
+ </tr>
44
+ </thead>
45
+ <tbody>
46
+ <tr>
47
+ <td><code>ms</code> (default)</td>
48
+ <td>Milliseconds</td>
49
+ </tr>
50
+ <tr>
51
+ <td><code>s</code> or <code>sec</code></td>
52
+ <td>Seconds</td>
53
+ </tr>
54
+ <tr>
55
+ <td><code>m</code> or <code>min</code></td>
56
+ <td>Mintun.</td>
57
+ </tr>
58
+ <tr>
59
+ <td><code>h</code></td>
60
+ <td>Hours</td>
61
+ </tr>
62
+ </tbody>
63
+
64
+ </table>
65
+
66
+ </p>
67
+
68
+ <p>
69
+ If the checkbox <b>Only delay if <code>msg.payload</code> has changed.</b> is activated
70
+ and a shutdown signal is received while waiting to forward a power-on signal,
71
+ the sending of the power-on signal is aborted. This also applies in the opposite case.<br />
72
+ If the checkbox is not activated, every message is delayed unless a delay is already active for the same
73
+ <code>payload</code>.
74
+
75
+ </p>
76
+ </script>
@@ -0,0 +1,19 @@
1
+ {
2
+ "delay": {
3
+ "ui": {
4
+ "name": "Name",
5
+
6
+ "on_delay": "Switch-on delay",
7
+ "off_delay": "Switch-off- delay",
8
+ "delay_only_on_change": "Only delay if <code>msg.payload</code> has changed.",
9
+ "system_start": "System start",
10
+ "save_state": "Save state",
11
+ "send_after_start": "Send last message 10 seconds after the start",
12
+
13
+ "milliseconds": "Milliseconds",
14
+ "seconds": "Seconds",
15
+ "minutes": "Minutes",
16
+ "hours": "Hours"
17
+ }
18
+ }
19
+ }
@@ -21,6 +21,8 @@
21
21
  },
22
22
  oneditprepare: function ()
23
23
  {
24
+ let node = this;
25
+
24
26
  $("#node-input-save_state").on("change", ev =>
25
27
  {
26
28
  if (ev.target.checked)
@@ -35,66 +37,33 @@
35
37
 
36
38
  <script type="text/html" data-template-name="smart_forwarder">
37
39
  <div class="form-row">
38
- <label for="node-input-name"><i class="fa fa-tag"></i> Name</label>
39
- <input type="text" id="node-input-name" placeholder="Name" />
40
+ <label for="node-input-name"><i class="fa fa-tag"></i> <span data-i18n="forwarder.ui.name"></span></label>
41
+ <input type="text" id="node-input-name" data-i18n="[placeholder]forwarder.ui.name" />
40
42
  </div>
41
43
  <div class="form-row">
42
44
  <input type="checkbox" id="node-input-enabled" style="width: 20px;" />
43
- <span for="node-input-enabled" style="width: 200px;"> Aktiviert</span>
45
+ <label for="node-input-enabled" style="width: 200px;"> <span data-i18n="forwarder.ui.enabled"></span>
44
46
  </div>
45
47
  <div class="form-row">
46
48
  <input type="checkbox" id="node-input-forward_last_on_enable" style="width: 20px;" />
47
- <span for="node-input-forward_last_on_enable">Letzte nicht gesendete Nachricht senden, wenn die Node aktiviert wird.</span>
49
+ <label for="node-input-forward_last_on_enable" data-i18n="forwarder.ui.forward_last_on_enable"></label>
48
50
  </div>
49
51
  <div class="form-row">
50
52
  <input type="checkbox" id="node-input-always_forward_true" style="width: 20px;" />
51
- <span for="node-input-always_forward_true"><code>msg.payload = true</code> immer weiterleiten</span>
53
+ <label for="node-input-always_forward_true" data-i18n="[html]forwarder.ui.always_forward_true"></label>
52
54
  </div>
53
55
  <div class="form-row">
54
56
  <input type="checkbox" id="node-input-always_forward_false" style="width: 20px;" />
55
- <span for="node-input-always_forward_false"><code>msg.payload = false</code> immer weiterleiten</span>
57
+ <label for="node-input-always_forward_false" data-i18n="[html]forwarder.ui.always_forward_false"></label>
56
58
  </div>
57
59
  <hr/>
58
- <h4 style="margin: 0.5rem 0;">Systemstart</h4>
60
+ <h4 style="margin: 0.5rem 0;" data-i18n="forwarder.ui.system_start"></h4>
59
61
  <div class="form-row">
60
62
  <input type="checkbox" id="node-input-save_state" style="width: 20px;" />
61
- <label for="node-input-save_state" style="width: calc(100% - 30px);">Zustand speichern</label>
63
+ <label for="node-input-save_state" style="width: calc(100% - 30px);" data-i18n="forwarder.ui.save_state"></label>
62
64
  </div>
63
65
  <div class="form-row" id="resend_on_start_row">
64
66
  <input type="checkbox" id="node-input-resend_on_start" style="width: 20px;" />
65
- <label for="node-input-resend_on_start" style="width: calc(100% - 30px);">Letze Nachricht 10 Sekunden nach dem Start senden</label>
67
+ <label for="node-input-resend_on_start" style="width: calc(100% - 30px);" data-i18n="forwarder.ui.send_after_start"></label>
66
68
  </div>
67
- </script>
68
-
69
- <script type="text/html" data-help-name="smart_forwarder">
70
- <p>Diese Node leitet eine Nachricht weiter, wenn er enabled wurde oder das dauerhafte Weiterleiten für die Nachricht aktiviert ist.</p>
71
- <p>
72
- <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/>
73
- Diese Node verwendet nur den Teil <code>name</code>. <code>#</code> und <code>nummer</code> sind dabei optional.
74
- </p>
75
- <p>
76
- Folgende topics werden akzeptiert:
77
- <table>
78
- <thead>
79
- <tr>
80
- <th>Topic</th>
81
- <th>Beschreibung</th>
82
- </tr>
83
- </thead>
84
- <tbody>
85
- <tr>
86
- <td><code>enable</code></td>
87
- <td>Aktiviert das Weiterleiten.</td>
88
- </tr>
89
- <tr>
90
- <td><code>disable</code></td>
91
- <td>Deaktiviert das Weiterleiten.</td>
92
- </tr>
93
- <tr>
94
- <td><code>set_state</code></td>
95
- <td>Aktiviert das Weiterleiten, wenn <code>msg.payload = true</code> oder deaktiviert das Weiterleiten, wenn <code>msg.payload = false</code>.</td>
96
- </tr>
97
- </tbody>
98
- </table>
99
- </p>
100
69
  </script>
@@ -7,40 +7,84 @@ 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
  last_msg_was_sended: true
17
30
  };
18
31
 
32
+ // load or delete saved values
19
33
  if (config.save_state)
20
- {
21
- // load old saved values
22
34
  node_settings = Object.assign(node_settings, smart_context.get(node.id));
23
- }
24
35
  else
25
- {
26
- // delete old saved values
27
36
  smart_context.del(node.id);
28
- }
29
37
 
30
- // dynamic config
38
+
39
+ // ##################
40
+ // # Dynamic config #
41
+ // ##################
31
42
  let forward_true = config.always_forward_true;
32
43
  let forward_false = config.always_forward_false;
33
44
  let forward_last_on_enable = config.forward_last_on_enable;
34
45
 
35
- // runtime values
46
+
47
+ // ##################
48
+ // # Runtime values #
49
+ // ##################
36
50
 
37
51
 
52
+ // ###############
53
+ // # Node events #
54
+ // ###############
38
55
  node.on("input", function (msg)
39
56
  {
57
+ handleTopic(msg);
58
+
59
+ setStatus();
60
+
61
+ if (config.save_state)
62
+ smart_context.set(node.id, node_settings);
63
+ });
64
+
65
+ node.on("close", function ()
66
+ {
67
+ if (timeout != null)
68
+ {
69
+ clearTimeout(timeout);
70
+ timeout = null;
71
+ }
72
+ });
73
+
74
+
75
+ // #####################
76
+ // # Private functions #
77
+ // #####################
78
+
79
+ // This is the main function which handles all topics that was received.
80
+ let handleTopic = msg =>
81
+ {
82
+ let real_topic = helper.getTopicName(msg.topic);
83
+
40
84
  let new_state = null;
41
- if (msg.topic == "enable" || (msg.topic == "set_state" && msg.payload))
85
+ if (real_topic == "enable" || (real_topic == "set_state" && msg.payload))
42
86
  new_state = true;
43
- else if (msg.topic == "disable" || (msg.topic == "set_state" && !msg.payload))
87
+ else if (real_topic == "disable" || (real_topic == "set_state" && !msg.payload))
44
88
  new_state = false;
45
89
 
46
90
  // Already the correct state
@@ -53,12 +97,9 @@ module.exports = function (RED)
53
97
  case false:
54
98
  node_settings.enabled = new_state;
55
99
 
56
- if (config.save_state)
57
- smart_context.set(node.id, node_settings);
58
-
59
100
  if (node_settings.enabled && forward_last_on_enable && node_settings.last_message != null && !node_settings.last_msg_was_sended)
60
101
  {
61
- node.send(node_settings.last_message);
102
+ node.send(helper.cloneObject(node_settings.last_message));
62
103
  node_settings.last_msg_was_sended = true;
63
104
  }
64
105
 
@@ -69,7 +110,7 @@ module.exports = function (RED)
69
110
  // Forward if enabled or forced
70
111
  if (node_settings.enabled || (forward_true && msg.payload) || (forward_false && !msg.payload))
71
112
  {
72
- node.send(msg);
113
+ node.send(helper.cloneObject(msg));
73
114
  node_settings.last_msg_was_sended = true;
74
115
  }
75
116
  else
@@ -77,10 +118,10 @@ module.exports = function (RED)
77
118
  node_settings.last_msg_was_sended = false;
78
119
  }
79
120
 
80
- node_settings.last_message = helper.cloneObject(msg);;
121
+ node_settings.last_message = helper.cloneObject(msg);
81
122
  break;
82
123
  }
83
- });
124
+ }
84
125
 
85
126
  let setStatus = () =>
86
127
  {
@@ -94,7 +135,7 @@ module.exports = function (RED)
94
135
  {
95
136
  setTimeout(() =>
96
137
  {
97
- node.send(node_settings.last_message);
138
+ node.send(helper.cloneObject(node_settings.last_message));
98
139
  }, 10000);
99
140
  }
100
141
 
@@ -0,0 +1,32 @@
1
+ <script type="text/html" data-help-name="smart_forwarder">
2
+ <p>Diese Node leitet eine Nachricht weiter, wenn er enabled wurde oder das dauerhafte Weiterleiten für die Nachricht aktiviert ist.</p>
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
+ Folgende topics werden akzeptiert:
9
+ <table>
10
+ <thead>
11
+ <tr>
12
+ <th>Topic</th>
13
+ <th>Beschreibung</th>
14
+ </tr>
15
+ </thead>
16
+ <tbody>
17
+ <tr>
18
+ <td><code>enable</code></td>
19
+ <td>Aktiviert das Weiterleiten.</td>
20
+ </tr>
21
+ <tr>
22
+ <td><code>disable</code></td>
23
+ <td>Deaktiviert das Weiterleiten.</td>
24
+ </tr>
25
+ <tr>
26
+ <td><code>set_state</code></td>
27
+ <td>Aktiviert das Weiterleiten, wenn <code>msg.payload = true</code> oder deaktiviert das Weiterleiten, wenn <code>msg.payload = false</code>.</td>
28
+ </tr>
29
+ </tbody>
30
+ </table>
31
+ </p>
32
+ </script>
@@ -0,0 +1,15 @@
1
+ {
2
+ "forwarder": {
3
+ "ui": {
4
+ "name": "Name",
5
+ "enabled": "Aktiviert",
6
+ "forward_last_on_enable": "Letzte nicht gesendete Nachricht senden, wenn die Node aktiviert wird.",
7
+ "always_forward_true": "Leite <code>msg.payload = true</code> immer weiter.",
8
+ "always_forward_false": "Leite <code>msg.payload = false</code> immer weiter.",
9
+
10
+ "system_start": "Systemstart",
11
+ "save_state": "Zustand speichern",
12
+ "send_after_start": "Letze Nachricht 10 Sekunden nach dem Start senden"
13
+ }
14
+ }
15
+ }
@@ -0,0 +1,32 @@
1
+ <script type="text/html" data-help-name="smart_forwarder">
2
+ <p>This node forwards a message if it has been enabled or if permanent forwarding is activated for the message.</p>
3
+ <p>
4
+ <b>Note:</b> Smart nodes use topics in the format <code>name#number</code>, so that different smart nodes can be controlled with the same topic.<br />
5
+ This node only uses the part <code>name</code>. <code>#</code> and <code>number</code> are optional.
6
+ </p>
7
+ <p>
8
+ The following topics are accepted:
9
+ <table>
10
+ <thead>
11
+ <tr>
12
+ <th>Topic</th>
13
+ <th>Description</th>
14
+ </tr>
15
+ </thead>
16
+ <tbody>
17
+ <tr>
18
+ <td><code>enable</code></td>
19
+ <td>Enables forwarding.</td>
20
+ </tr>
21
+ <tr>
22
+ <td><code>disable</code></td>
23
+ <td>Disables forwarding.</td>
24
+ </tr>
25
+ <tr>
26
+ <td><code>set_state</code></td>
27
+ <td>Enables forwarding if <code>msg.payload = true</code> or disables forwarding if <code>msg.payload = false</code>.</td>
28
+ </tr>
29
+ </tbody>
30
+ </table>
31
+ </p>
32
+ </script>
@@ -0,0 +1,15 @@
1
+ {
2
+ "forwarder": {
3
+ "ui": {
4
+ "name": "Name",
5
+ "enabled": "Enabled",
6
+ "forward_last_on_enable": "Send last unsent message when node is activated.",
7
+ "always_forward_true": "Always forward <code>msg.payload = true</code> .",
8
+ "always_forward_false": "Always forward <code>msg.payload = false</code> .",
9
+
10
+ "system_start": "System start",
11
+ "save_state": "Save state",
12
+ "send_after_start": "Send last message 10 seconds after the start"
13
+ }
14
+ }
15
+ }