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
@@ -0,0 +1,24 @@
1
+ {
2
+ "light": {
3
+ "ui": {
4
+ "name": "Name",
5
+ "text": "Text",
6
+ "controlled_by_words": "This node can be controlled using the words entered. Multiple words are separated by a comma.",
7
+ "time_on": "Time On",
8
+ "alarm_on": "Alarm On",
9
+ "alarm_off": "Alarm Off",
10
+ "controlled_by_central": "This block is controlled by the following central blocks:",
11
+
12
+ "milliseconds": "Milliseconds",
13
+ "seconds": "Seconds",
14
+ "minutes": "Minutes",
15
+ "hours": "Hours",
16
+
17
+ "no_action": "No action",
18
+ "turn_on": "Turn on",
19
+ "turn_off": "Turn off",
20
+ "last_state": "Last state",
21
+ "last_sended_state": "Last sent state"
22
+ }
23
+ }
24
+ }
@@ -0,0 +1,12 @@
1
+ <script type="text/html" data-help-name="smart_logic">
2
+ <p>Dieser Knoten bietet verschiedene Logikoperationen, wie AND, OR und XOR an.</p>
3
+ <p>Alle Eingänge, sowie der Ausgang lassen sich gezielt invertieren, womit weitere komplexe Logiken abgebildet werden können.</p>
4
+ <p>Um beispielsweise eine NOT Logik zu erstellen, wird die Anzahl der Eingänge auf 1 gesetzt, die Logik auf AND oder OR und der Ausgang invertiert.</p>
5
+ <p>
6
+ <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/>
7
+ Diese Node verwendet nur den Teil <code>nummer</code>. <code>name</code> und <code>#</code> sind dabei optional.
8
+ </p>
9
+ <p>
10
+ <strong>Hinweis:</strong> <code>msg.payload</code> wird automatisch auf das Logik-Ergebnis gesetzt, sofern es nicht bereits in der Konfiguration gesetzt wurde.
11
+ </p>
12
+ </script>
@@ -0,0 +1,26 @@
1
+ {
2
+ "logic": {
3
+ "ui": {
4
+ "name": "Name",
5
+ "logic": "Logik",
6
+ "inputs": "Eingänge",
7
+ "invert": "Invertieren",
8
+ "output": "Ausgang",
9
+ "output_messages": "Ausgangsnachrichten",
10
+ "true": "Wahr",
11
+ "false": "Falsch",
12
+ "send": "Senden",
13
+ "outputs": "Ausgänge",
14
+ "note": "Hinweis:",
15
+ "note_text": "<code>msg.payload</code> wird automatisch auf das Logik-Ergebnis gesetzt,<br/>sofern es nicht bereits hier in der Konfiguration gesetzt wurde.",
16
+ "system_start": "Systemstart",
17
+ "save_state": "Zustand speichern",
18
+ "send_after_start": "Letze Nachricht 10 Sekunden nach dem Start senden",
19
+
20
+ "send_only_change": "Nur bei Änderung",
21
+ "always": "Immer",
22
+ "common_output": "Gemeinsamer Ausgang",
23
+ "separate_output": "Separate Ausgänge"
24
+ }
25
+ }
26
+ }
@@ -0,0 +1,12 @@
1
+ <script type="text/html" data-help-name="smart_logic">
2
+ <p>This node offers various logic operations, such as AND, OR and XOR.</p>
3
+ <p>All inputs and the output can be specifically inverted, which can be used to map further complex logic.</p>
4
+ <p>For example, to create a NOT logic, the number of inputs is set to 1, the logic to AND or OR and the output is inverted.</p>
5
+ <p>
6
+ <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 />
7
+ This node only uses the <code>number</code> part. <code>name</code> and <code>#</code> are optional.
8
+ </p>
9
+ <p>
10
+ <strong>Note:</strong> <code>msg.payload</code> is automatically set to the logic result if it has not already been set in the configuration.
11
+ </p>
12
+ </script>
@@ -0,0 +1,26 @@
1
+ {
2
+ "logic": {
3
+ "ui": {
4
+ "name": "Name",
5
+ "logic": "Logic",
6
+ "inputs": "Inputs",
7
+ "invert": "Invert",
8
+ "output": "Output",
9
+ "output_messages": "Output messages",
10
+ "true": "True",
11
+ "false": "False",
12
+ "send": "Send",
13
+ "outputs": "Outputs",
14
+ "note": "Note:",
15
+ "note_text": "<code>msg.payload</code> is automatically set to the logic result<br/>if it has not already been set here in the configuration.",
16
+ "system_start": "System start",
17
+ "save_state": "Save state",
18
+ "send_after_start": "Send last message 10 seconds after start",
19
+
20
+ "send_only_change": "Only on change",
21
+ "always": "Always",
22
+ "common_output": "Common output",
23
+ "separate_output": "Separate outputs"
24
+ }
25
+ }
26
+ }
package/logic/logic.html CHANGED
@@ -31,17 +31,18 @@
31
31
  },
32
32
  oneditprepare: function ()
33
33
  {
34
+ let node = this;
35
+
34
36
  $("#node-input-logic").typedInput({
35
- types: [
36
- {
37
- default: "AND",
38
- options: [
39
- { value: "AND", label: "AND" },
40
- { value: "OR", label: "OR" },
41
- { value: "XOR", label: "XOR" }
42
- ],
43
- },
44
- ],
37
+ types: [{
38
+ value: "logic",
39
+ default: "AND",
40
+ options: [
41
+ { value: "AND", label: "AND" },
42
+ { value: "OR", label: "OR" },
43
+ { value: "XOR", label: "XOR" }
44
+ ],
45
+ }],
45
46
  });
46
47
 
47
48
  $("#node-input-logic_inputs").spinner({
@@ -61,12 +62,11 @@
61
62
 
62
63
  $("#node-input-inverts")
63
64
  .typedInput({
64
- types: [
65
- {
66
- multiple: true,
67
- options: []
68
- },
69
- ],
65
+ types: [{
66
+ value: "inverts",
67
+ multiple: true,
68
+ options: []
69
+ }],
70
70
  });
71
71
  refreshInverts(this.logic_inputs);
72
72
  $("#node-input-inverts").typedInput("value", this.inverts);
@@ -75,8 +75,8 @@
75
75
  $("#node-input-out_true").typedInput({
76
76
  type: "json",
77
77
  types: ["json", {
78
- value: "null",
79
- label: "Nichts senden",
78
+ value: "NOTHING",
79
+ label: node._("logic.ui.send_nothing"),
80
80
  icon: "fa fa-times",
81
81
  hasValue: false,
82
82
  }],
@@ -86,8 +86,8 @@
86
86
  $("#node-input-out_false").typedInput({
87
87
  type: "json",
88
88
  types: ["json", {
89
- value: "null",
90
- label: "Nichts senden",
89
+ value: "NOTING",
90
+ label: node._("logic.ui.send_nothing"),
91
91
  icon: "fa fa-times",
92
92
  hasValue: false,
93
93
  }],
@@ -97,10 +97,10 @@
97
97
  $("#node-input-send_only_change").typedInput({
98
98
  type: "bool",
99
99
  types: [{
100
- value: "1",
100
+ value: "send_only_change",
101
101
  options: [
102
- { value: "true", label: "Nur bei Änderung" },
103
- { value: "false", label: "Immer" },
102
+ { value: "true", label: node._("logic.ui.send_only_change") },
103
+ { value: "false", label: node._("logic.ui.always") },
104
104
  ]
105
105
  }]
106
106
  });
@@ -108,16 +108,15 @@
108
108
  $("#node-input-outputs").typedInput({
109
109
  type: "num",
110
110
  types: [{
111
- value: "1",
111
+ value: "outputs",
112
112
  options: [
113
- { value: "1", label: "Gemeinsamer Ausgang" },
114
- { value: "2", label: "Separate Ausgänge" },
113
+ { value: "1", label: node._("logic.ui.common_output") },
114
+ { value: "2", label: node._("logic.ui.separate_output") },
115
115
  ]
116
116
  }]
117
117
  });
118
118
 
119
119
 
120
-
121
120
  $("#node-input-save_state").on("change", ev =>
122
121
  {
123
122
  if (ev.target.checked)
@@ -143,12 +142,11 @@
143
142
  }
144
143
 
145
144
  $("#node-input-inverts")
146
- .typedInput('types', [
147
- {
148
- multiple: true,
149
- options: options
150
- },
151
- ]);
145
+ .typedInput("types", [{
146
+ value: "inverts",
147
+ multiple: true,
148
+ options: options
149
+ }]);
152
150
 
153
151
  $("#node-input-inverts").typedInput("value", newValues.join(","));
154
152
  }
@@ -156,72 +154,58 @@
156
154
 
157
155
  <script type="text/html" data-template-name="smart_logic">
158
156
  <div class="form-row">
159
- <label for="node-input-name"><i class="fa fa-tag"></i> Name</label>
160
- <input type="text" id="node-input-name" placeholder="Name" />
157
+ <label for="node-input-name"><i class="fa fa-tag"></i> <span data-i18n="logic.ui.name"></span></label>
158
+ <input type="text" id="node-input-name" data-i18n="[placeholder]logic.ui.name" />
161
159
  </div>
162
160
  <div class="form-row">
163
- <label for="node-input-logic"><i class="fa fa-microchip"></i> Logik</label>
161
+ <label for="node-input-logic"><i class="fa fa-microchip"></i> <span data-i18n="logic.ui.logic"></span></label>
164
162
  <input id="node-input-logic" />
165
163
  </div>
166
164
  <div class="form-row">
167
- <label for="node-input-logic_inputs"><i class="fa fa-hashtag"></i> Eingänge</label>
165
+ <label for="node-input-logic_inputs"><i class="fa fa-hashtag"></i> <span data-i18n="logic.ui.inputs"></span></label>
168
166
  <input id="node-input-logic_inputs" />
169
167
  </div>
170
168
  <div class="form-row">
171
- <label for="node-input-inverts"><i class="fa fa-circle-o"></i> Invertieren</label>
169
+ <label for="node-input-inverts"><i class="fa fa-circle-o"></i> <span data-i18n="logic.ui.invert"></span></label>
172
170
  <input id="node-input-inverts" />
173
171
  </div>
174
172
  <div class="form-row">
175
- <label for="node-input-invert_output"><i class="fa fa-circle-o"></i> Ausgang</label>
173
+ <label for="node-input-invert_output"><i class="fa fa-circle-o"></i> <span data-i18n="logic.ui.output"></span></label>
176
174
  <input type="checkbox" id="node-input-invert_output" style="width: unset; margin: 0;" />
177
- <label for="node-input-invert_output">&nbsp;Invertieren</label>
175
+ <label for="node-input-invert_output" data-i18n="logic.ui.invert"></label>
178
176
  </div>
179
177
  <hr/>
180
- <h4 style="margin: 0.5rem 0;">Ausgangsnachrichten</h4>
178
+ <h4 style="margin: 0.5rem 0;" data-i18n="logic.ui.output_messages"></h4>
181
179
  <div class="form-row">
182
- <label for="node-input-out_true"><i class="fa fa-check-circle"></i> Wahr</label>
180
+ <label for="node-input-out_true"><i class="fa fa-check-circle"></i> <span data-i18n="logic.ui.true"></span></label>
183
181
  <input type="text" id="node-input-out_true"/>
184
182
  <input type="hidden" id="node-input-out_true_type">
185
183
  </div>
186
184
  <div class="form-row">
187
- <label for="node-input-out_false"><i class="fa fa-times-circle"></i> Falsch</label>
185
+ <label for="node-input-out_false"><i class="fa fa-times-circle"></i> <span data-i18n="logic.ui.false"></span></label>
188
186
  <input type="text" id="node-input-out_false" />
189
187
  <input type="hidden" id="node-input-out_false_type">
190
188
  </div>
191
189
  <div class="form-row">
192
- <label for="node-input-send_only_change"><i class="fa fa-repeat"></i> Senden</label>
190
+ <label for="node-input-send_only_change"><i class="fa fa-repeat"></i> <span data-i18n="logic.ui.send"></span></label>
193
191
  <input id="node-input-send_only_change" />
194
192
  </div>
195
193
  <div class="form-row">
196
- <label for="node-input-outputs"><i class="fa fa-hashtag"></i> Ausgänge</label>
194
+ <label for="node-input-outputs"><i class="fa fa-hashtag"></i> <span data-i18n="logic.ui.outputs"></span></label>
197
195
  <input id="node-input-outputs" />
198
196
  </div>
199
197
  <div class="form-row">
200
- <div><strong>Hinweis:</strong></div>
201
- <div><code>msg.payload</code> wird automatisch auf das Logik-Ergebnis gesetzt,</div>
202
- <div>sofern es nicht bereits hier in der Konfiguration gesetzt wurde.</div>
198
+ <div><strong data-i18n="logic.ui.note"></strong></div>
199
+ <div data-i18n="[html]logic.ui.note_text"></div>
203
200
  </div>
204
201
  <hr/>
205
- <h4 style="margin: 0.5rem 0;">Systemstart</h4>
202
+ <h4 style="margin: 0.5rem 0;" data-i18n="logic.ui.system_start"></h4>
206
203
  <div class="form-row">
207
204
  <input type="checkbox" id="node-input-save_state" style="width: 20px;" />
208
- <label for="node-input-save_state" style="width: calc(100% - 30px);">Zustand speichern</label>
205
+ <label for="node-input-save_state" style="width: calc(100% - 30px);" data-i18n="logic.ui.save_state"></label>
209
206
  </div>
210
207
  <div class="form-row" id="resend_on_start_row">
211
208
  <input type="checkbox" id="node-input-resend_on_start" style="width: 20px;" />
212
- <label for="node-input-resend_on_start" style="width: calc(100% - 30px);">Letze Nachricht 10 Sekunden nach dem Start senden</label>
209
+ <label for="node-input-resend_on_start" style="width: calc(100% - 30px);" data-i18n="logic.ui.send_after_start"></label>
213
210
  </div>
214
- </script>
215
-
216
- <script type="text/html" data-help-name="smart_logic">
217
- <p>Dieser Knoten bietet verschiedene Logikoperationen, wie AND, OR und XOR an.</p>
218
- <p>Alle Eingänge, sowie der Ausgang lassen sich gezielt invertieren, womit weitere komplexe Logiken abgebildet werden können.</p>
219
- <p>Um beispielsweise eine NOT Logik zu erstellen, wird die Anzahl der Eingänge auf 1 gesetzt, die Logik auf AND oder OR und der Ausgang invertiert.</p>
220
- <p>
221
- <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/>
222
- Diese Node verwendet nur den Teil <code>nummer</code>. <code>name</code> und <code>#</code> sind dabei optional.
223
- </p>
224
- <p>
225
- <strong>Hinweis:</strong> <code>msg.payload</code> wird automatisch auf das Logik-Ergebnis gesetzt, sofern es nicht bereits in der Konfiguration gesetzt wurde.
226
- </p>
227
211
  </script>
package/logic/logic.js CHANGED
@@ -7,28 +7,38 @@ module.exports = function (RED)
7
7
  const node = this;
8
8
  RED.nodes.createNode(node, config);
9
9
 
10
+ // ###################
11
+ // # Class constants #
12
+ // ###################
13
+
14
+
15
+ // #######################
16
+ // # Global help objects #
17
+ // #######################
10
18
  const smart_context = require("../persistence.js")(RED);
11
19
  const helper = require("../smart_helper.js");
12
20
 
13
- // persistant values
21
+
22
+ // #####################
23
+ // # persistent values #
24
+ // #####################
14
25
  var node_settings = {
15
26
  input_states: Array.from({ length: config.logic_inputs }).fill(false),
16
27
  last_result: null,
17
28
  last_message: null,
18
29
  };
19
30
 
31
+
32
+ // load or delete saved values
20
33
  if (config.save_state)
21
- {
22
- // load old saved values
23
34
  node_settings = Object.assign(node_settings, smart_context.get(node.id));
24
- }
25
35
  else
26
- {
27
- // delete old saved values
28
36
  smart_context.del(node.id);
29
- }
30
37
 
31
- // dynamic config
38
+
39
+ // ##################
40
+ // # Dynamic config #
41
+ // ##################
32
42
  let logic = config.logic;
33
43
  let out_true = helper.evaluateNodeProperty(RED, config.out_true, config.out_true_type || "json");
34
44
  let out_false = helper.evaluateNodeProperty(RED, config.out_false, config.out_false_type || "json");
@@ -38,29 +48,59 @@ module.exports = function (RED)
38
48
  let send_only_change = helper.evaluateNodeProperty(RED, config.send_only_change, "bool");
39
49
  let outputs = helper.evaluateNodeProperty(RED, config.outputs, "num");
40
50
 
41
- // runtime values
42
51
 
52
+ // ##################
53
+ // # Runtime values #
54
+ // ##################
55
+
56
+
57
+ // ###############
58
+ // # Node events #
59
+ // ###############
43
60
  node.on("input", function (msg)
44
61
  {
45
- if (typeof msg.topic === "undefined")
46
- {
47
- node.error("Topic not set");
48
- return;
49
- }
50
- let input = helper.getTopicNumber(msg.topic);
62
+ handleTopic(msg);
63
+
64
+ setStatus();
65
+
66
+ if (config.save_state)
67
+ smart_context.set(node.id, node_settings);
68
+ });
51
69
 
52
- if (input == null || input < 1 || input > logic_inputs)
70
+ node.on("close", function ()
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
+ helper.log("handle topic:");
83
+ helper.log(msg);
84
+
85
+ let real_topic_number = helper.getTopicNumber(msg.topic);
86
+
87
+ if (real_topic_number == null || real_topic_number < 1 || real_topic_number > logic_inputs)
53
88
  {
54
89
  node.error("Topic has to be >= 1 and <= " + logic_inputs + ", send: " + msg.topic);
55
90
  return;
56
91
  }
57
92
 
58
- if (inverts.includes(input))
59
- node_settings.input_states[input - 1] = !msg.payload;
93
+ if (inverts.includes(real_topic_number))
94
+ node_settings.input_states[real_topic_number - 1] = !msg.payload;
60
95
  else
61
- node_settings.input_states[input - 1] = !!msg.payload; // !! => Convert to boolean
96
+ node_settings.input_states[real_topic_number - 1] = !!msg.payload; // !! => Convert to boolean
62
97
 
63
98
  let result = getResult();
99
+
100
+ helper.log("getResult:");
101
+ helper.log(result);
102
+ helper.log(node_settings);
103
+
64
104
  let out_msg = null;
65
105
 
66
106
  setStatus();
@@ -72,12 +112,12 @@ module.exports = function (RED)
72
112
  if (result)
73
113
  {
74
114
  if (out_true !== null)
75
- out_msg = Object.assign({}, out_true);
115
+ out_msg = helper.cloneObject(out_true);
76
116
  }
77
117
  else
78
118
  {
79
119
  if (out_false !== null)
80
- out_msg = Object.assign({}, out_false);
120
+ out_msg = helper.cloneObject(out_false);
81
121
  }
82
122
 
83
123
  if (out_msg !== null)
@@ -103,13 +143,7 @@ module.exports = function (RED)
103
143
  node_settings.last_result = result;
104
144
  node_settings.last_message = out_msg;
105
145
 
106
- if (config.save_state)
107
- smart_context.set(node.id, node_settings);
108
- });
109
-
110
- node.on("close", function ()
111
- {
112
- });
146
+ }
113
147
 
114
148
  let getResult = () =>
115
149
  {
@@ -187,7 +221,7 @@ module.exports = function (RED)
187
221
  {
188
222
  setTimeout(() =>
189
223
  {
190
- node.send(node_settings.last_message);
224
+ node.send(helper.cloneObject(node_settings.last_message));
191
225
  }, 10000);
192
226
  }
193
227
 
@@ -0,0 +1,5 @@
1
+ <script type="text/html" data-help-name="smart_long-press-control">
2
+ <p>Diese Node kann unterscheiden, wie lange ein Taster gedrückt wurde. Die Zeit, ab wann ein Tastendruck als lang gilt, kann in den Eigenschaften der Node eingestellt werden.</p>
3
+ <p>Ein langer Tastendruck wird sofort ausgelöst, wenn die maximal Zeit überschritten wurde.</p>
4
+ <p>Die Node misst die Zeit zwischen <code>msg.payload = true;</code> und <code>msg.payload = false;</code> und gibt eine entsprechende Nachricht aus.</p>
5
+ </script>
@@ -0,0 +1,13 @@
1
+ {
2
+ "long-press": {
3
+ "ui": {
4
+ "name": "Name",
5
+ "time_for_long": "Zeit für lang",
6
+ "time_for_long_placeholder": "Zeit in ms für einen langen Druck",
7
+ "milliseconds": "Millisekunden",
8
+ "output_messages": "Ausgangsnachrichten",
9
+ "short": "Kurz",
10
+ "long": "Lang"
11
+ }
12
+ }
13
+ }
@@ -0,0 +1,5 @@
1
+ <script type="text/html" data-help-name="smart_long-press-control">
2
+ <p>This node can distinguish how long a button has been pressed. The time from which a button press is considered long can be set in the properties of the node.</p>
3
+ <p>A long button press is triggered immediately if the maximum time has been exceeded.</p>
4
+ <p>The node measures the time between <code>msg.payload = true;</code> and <code>msg.payload = false;</code> and outputs a corresponding message.</p>
5
+ </script>
@@ -0,0 +1,13 @@
1
+ {
2
+ "long-press": {
3
+ "ui": {
4
+ "name": "Name",
5
+ "time_for_long": "Time for long",
6
+ "time_for_long_placeholder": "Time in ms for a long press",
7
+ "milliseconds": "Milliseconds",
8
+ "output_messages": "Output messages",
9
+ "short": "Short",
10
+ "long": "Long"
11
+ }
12
+ }
13
+ }
@@ -19,6 +19,8 @@
19
19
  },
20
20
  oneditprepare: function ()
21
21
  {
22
+ let node = this;
23
+
22
24
  $("#node-input-long_press_ms").spinner({
23
25
  min: 1,
24
26
  change: function (event, ui)
@@ -47,28 +49,22 @@
47
49
 
48
50
  <script type="text/html" data-template-name="smart_long-press-control">
49
51
  <div class="form-row">
50
- <label for="node-input-name"><i class="fa fa-tag"></i> Name</label>
51
- <input type="text" id="node-input-name" placeholder="Name" />
52
+ <label for="node-input-name"><i class="fa fa-tag"></i> <span data-i18n="long-press.ui.name"></span></label>
53
+ <input type="text" id="node-input-name" data-i18n="[placeholder]long-press.ui.name" />
52
54
  </div>
53
55
  <div class="form-row">
54
- <label for="node-input-long_press_ms"><i class="fa fa-clock-o"></i> Zeit für lang</label>
55
- <input id="node-input-long_press_ms" placeholder="Zeit in ms für einen langen Druck" />
56
- <span> Millisekunden</span>
56
+ <label for="node-input-long_press_ms"><i class="fa fa-clock-o"></i><span data-i18n="long-press.ui.time_for_long"></span></label>
57
+ <input id="node-input-long_press_ms" data-i18n="[placeholder]long-press.ui.time_for_long_placeholder" />
58
+ <span data-i18n="long-press.ui.milliseconds"></span>
57
59
  </div>
58
60
  <hr/>
59
- <h4 style="margin: 0.5rem 0;">Ausgangsnachrichten</h4>
61
+ <h4 style="margin: 0.5rem 0;" data-i18n="long-press.ui.output_messages"></h4>
60
62
  <div class="form-row">
61
- <label for="node-input-short"><i class="fa fa-hand-o-up"></i> Kurz</label>
63
+ <label for="node-input-short"><i class="fa fa-hand-o-up"></i> <span data-i18n="long-press.ui.short"></span></label>
62
64
  <input type="text" id="node-input-short" />
63
65
  </div>
64
66
  <div class="form-row">
65
- <label for="node-input-long"><i class="fa fa-hand-o-up"></i> Lang</label>
67
+ <label for="node-input-long"><i class="fa fa-hand-o-up"></i> <span data-i18n="long-press.ui.long"></span></label>
66
68
  <input type="text" id="node-input-long" />
67
69
  </div>
68
- </script>
69
-
70
- <script type="text/html" data-help-name="smart_long-press-control">
71
- <p>Diese Node kann unterscheiden, wie lange ein Taster gedrückt wurde. Die Zeit, ab wann ein Tastendruck als lang gilt, kann in den Eigenschaften der Node eingestellt werden.</p>
72
- <p>Ein langer Tastendruck wird sofort ausgelöst, wenn die maximal Zeit überschritten wurde.</p>
73
- <p>Die Node misst die Zeit zwischen <code>msg.payload = true;</code> und <code>msg.payload = false;</code> und gibt eine entsprechende Nachricht aus.</p>
74
70
  </script>