smart-nodes 0.5.0 → 0.5.1
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 +5 -1
- package/forwarder/forwarder.js +7 -4
- package/forwarder/locales/de-DE/forwarder.html +2 -2
- package/forwarder/locales/en-US/forwarder.html +2 -2
- package/light/light.js +0 -1
- package/mixing-valve/locales/de-DE/mixing-valve.html +2 -2
- package/mixing-valve/locales/en-US/mixing-valve.html +2 -2
- package/mixing-valve/mixing-valve.html +41 -41
- package/mixing-valve/mixing-valve.js +7 -4
- package/mode-selector/locales/de-DE/mode-selector.json +1 -1
- package/mode-selector/locales/en-US/mode-selector.json +1 -1
- package/mode-selector/mode-selector.html +7 -7
- package/package.json +1 -1
- package/scheduler/locales/de-DE/scheduler.html +2 -2
- package/scheduler/locales/en-US/scheduler.html +2 -2
- package/scheduler/scheduler.js +6 -3
- package/statistic/locales/de-DE/statistic.html +1 -1
package/CHANGELOG.md
CHANGED
|
@@ -209,4 +209,8 @@
|
|
|
209
209
|
- Mixing valve can now output as percentage directly or with open/close impulses.
|
|
210
210
|
- Mixing valve tries to guess the best position, when getting enabled.
|
|
211
211
|
- Added debug topic to all nodes, to see current values.
|
|
212
|
-
- Added new node "mode-selector".
|
|
212
|
+
- Added new node "mode-selector".
|
|
213
|
+
|
|
214
|
+
## Version 0.5.1:
|
|
215
|
+
|
|
216
|
+
- To be more compatible, topic "set" is also possible instead of "set_state". Same for "set_inverted" instead of "set_state_inverted".
|
package/forwarder/forwarder.js
CHANGED
|
@@ -81,16 +81,19 @@ module.exports = function (RED)
|
|
|
81
81
|
{
|
|
82
82
|
let real_topic = helper.getTopicName(msg.topic);
|
|
83
83
|
|
|
84
|
-
if (real_topic
|
|
84
|
+
if (real_topic.startsWith("set_state"))
|
|
85
|
+
real_topic = real_topic.replace("set_state", "set");
|
|
86
|
+
|
|
87
|
+
if (real_topic == "set_inverted")
|
|
85
88
|
{
|
|
86
|
-
real_topic = "
|
|
89
|
+
real_topic = "set";
|
|
87
90
|
msg.payload = !msg.payload;
|
|
88
91
|
}
|
|
89
92
|
|
|
90
93
|
let new_state = null;
|
|
91
|
-
if (real_topic == "enable" || (real_topic == "
|
|
94
|
+
if (real_topic == "enable" || (real_topic == "set" && msg.payload))
|
|
92
95
|
new_state = true;
|
|
93
|
-
else if (real_topic == "disable" || (real_topic == "
|
|
96
|
+
else if (real_topic == "disable" || (real_topic == "set" && !msg.payload))
|
|
94
97
|
new_state = false;
|
|
95
98
|
|
|
96
99
|
switch (real_topic)
|
|
@@ -27,11 +27,11 @@
|
|
|
27
27
|
<td>Deaktiviert das Weiterleiten.</td>
|
|
28
28
|
</tr>
|
|
29
29
|
<tr>
|
|
30
|
-
<td><code>set_state</code></td>
|
|
30
|
+
<td><code>set</code> oder <code>set_state</code></td>
|
|
31
31
|
<td>Aktiviert das Weiterleiten, wenn <code>msg.payload = true</code> oder deaktiviert das Weiterleiten, wenn <code>msg.payload = false</code>.</td>
|
|
32
32
|
</tr>
|
|
33
33
|
<tr>
|
|
34
|
-
<td><code>set_state_inverted</code></td>
|
|
34
|
+
<td><code>set_inverted</code> oder <code>set_state_inverted</code></td>
|
|
35
35
|
<td>Aktiviert das Weiterleiten, wenn <code>msg.payload = false</code> oder deaktiviert das Weiterleiten, wenn <code>msg.payload = true</code>.</td>
|
|
36
36
|
</tr>
|
|
37
37
|
</tbody>
|
|
@@ -27,11 +27,11 @@
|
|
|
27
27
|
<td>Disables forwarding.</td>
|
|
28
28
|
</tr>
|
|
29
29
|
<tr>
|
|
30
|
-
<td><code>set_state</code></td>
|
|
30
|
+
<td><code>set</code> or <code>set_state</code></td>
|
|
31
31
|
<td>Enables forwarding if <code>msg.payload = true</code> or disables forwarding if <code>msg.payload = false</code>.</td>
|
|
32
32
|
</tr>
|
|
33
33
|
<tr>
|
|
34
|
-
<td><code>set_state_inverted</code></td>
|
|
34
|
+
<td><code>set_inverted</code> or <code>set_state_inverted</code></td>
|
|
35
35
|
<td>Enables forwarding if <code>msg.payload = false</code> or disables forwarding if <code>msg.payload = true</code>.</td>
|
|
36
36
|
</tr>
|
|
37
37
|
</tbody>
|
package/light/light.js
CHANGED
|
@@ -34,11 +34,11 @@
|
|
|
34
34
|
<td>Deaktiviert die Mischeransteuerung und fährt die Position an, die als Aus-Modus festgelegt ist.</td>
|
|
35
35
|
</tr>
|
|
36
36
|
<tr>
|
|
37
|
-
<td><code>set_state</code></td>
|
|
37
|
+
<td><code>set</code> oder <code>set_state</code></td>
|
|
38
38
|
<td>Aktiviert den Mischer, wenn <code>msg.payload = true</code> oder deaktiviert ihn, wenn <code>msg.payload = false</code>.</td>
|
|
39
39
|
</tr>
|
|
40
40
|
<tr>
|
|
41
|
-
<td><code>set_state_inverted</code></td>
|
|
41
|
+
<td><code>set_inverted</code> oder <code>set_state_inverted</code></td>
|
|
42
42
|
<td>Aktiviert den Mischer, wenn <code>msg.payload = false</code> oder deaktiviert ihn, wenn <code>msg.payload = true</code>.</td>
|
|
43
43
|
</tr>
|
|
44
44
|
<tr>
|
|
@@ -34,11 +34,11 @@
|
|
|
34
34
|
<td>Deactivates the mixer control and moves to the position that is set as the off mode.</td>
|
|
35
35
|
</tr>
|
|
36
36
|
<tr>
|
|
37
|
-
<td><code>set_state</code></td>
|
|
37
|
+
<td><code>set</code> or <code>set_state</code></td>
|
|
38
38
|
<td>Activates the mixing valve when <code>msg.payload = true</code> or deactivates it if <code>msg.payload = false</code>.</td>
|
|
39
39
|
</tr>
|
|
40
40
|
<tr>
|
|
41
|
-
<td><code>set_state_inverted</code></td>
|
|
41
|
+
<td><code>set_inverted</code> or <code>set_state_inverted</code></td>
|
|
42
42
|
<td>Activates the mixing valve when <code>msg.payload = false</code> or deactivates it if <code>msg.payload = true</code>.</td>
|
|
43
43
|
</tr>
|
|
44
44
|
<tr>
|
|
@@ -170,6 +170,33 @@
|
|
|
170
170
|
onEditPrepare(this, ["smart_central-control"]);
|
|
171
171
|
initTreeList(node, ["smart_central-control"]);
|
|
172
172
|
|
|
173
|
+
$("#node-input-output_mode")
|
|
174
|
+
.css("max-width", "70%")
|
|
175
|
+
.typedInput({
|
|
176
|
+
type: "num",
|
|
177
|
+
types: [{
|
|
178
|
+
value: "output_mode",
|
|
179
|
+
options: [
|
|
180
|
+
{ value: "OPEN_CLOSE", label: node._("mixing-valve.ui.open_close") },
|
|
181
|
+
{ value: "PERCENTAGE", label: node._("mixing-valve.ui.percentage") },
|
|
182
|
+
]
|
|
183
|
+
}]
|
|
184
|
+
});
|
|
185
|
+
|
|
186
|
+
$("#node-input-output_mode").on("change", function ()
|
|
187
|
+
{
|
|
188
|
+
if (this.value == "OPEN_CLOSE")
|
|
189
|
+
{
|
|
190
|
+
$(".only-open-close").show();
|
|
191
|
+
node.outputs = 3;
|
|
192
|
+
}
|
|
193
|
+
else
|
|
194
|
+
{
|
|
195
|
+
$(".only-open-close").hide();
|
|
196
|
+
node.outputs = 1;
|
|
197
|
+
}
|
|
198
|
+
});
|
|
199
|
+
|
|
173
200
|
$("#node-input-setpoint")
|
|
174
201
|
.css("max-width", "4rem")
|
|
175
202
|
.spinner({
|
|
@@ -240,49 +267,22 @@
|
|
|
240
267
|
}],
|
|
241
268
|
});
|
|
242
269
|
|
|
243
|
-
$("#node-input-output_mode")
|
|
244
|
-
.css("max-width", "70%")
|
|
245
|
-
.typedInput({
|
|
246
|
-
type: "num",
|
|
247
|
-
types: [{
|
|
248
|
-
value: "output_mode",
|
|
249
|
-
options: [
|
|
250
|
-
{ value: "OPEN_CLOSE", label: node._("mixing-valve.ui.open_close") },
|
|
251
|
-
{ value: "PERCENTAGE", label: node._("mixing-valve.ui.percentage") },
|
|
252
|
-
]
|
|
253
|
-
}]
|
|
254
|
-
});
|
|
255
|
-
|
|
256
|
-
$("#node-input-output_mode").on("change", function ()
|
|
257
|
-
{
|
|
258
|
-
if (this.value == "OPEN_CLOSE")
|
|
259
|
-
{
|
|
260
|
-
$(".only-open-close").show();
|
|
261
|
-
node.outputs = 3;
|
|
262
|
-
}
|
|
263
|
-
else
|
|
264
|
-
{
|
|
265
|
-
$(".only-open-close").hide();
|
|
266
|
-
node.outputs = 1;
|
|
267
|
-
}
|
|
268
|
-
});
|
|
269
|
-
|
|
270
270
|
|
|
271
271
|
$("#node-input-precision")
|
|
272
|
-
|
|
273
|
-
|
|
274
|
-
|
|
275
|
-
|
|
276
|
-
|
|
277
|
-
|
|
278
|
-
|
|
279
|
-
|
|
280
|
-
|
|
281
|
-
|
|
282
|
-
|
|
283
|
-
|
|
284
|
-
|
|
285
|
-
|
|
272
|
+
.css("max-width", "4rem")
|
|
273
|
+
.spinner({
|
|
274
|
+
min: 0.1,
|
|
275
|
+
max: 1.0,
|
|
276
|
+
step: 0.1,
|
|
277
|
+
change: function (event, ui)
|
|
278
|
+
{
|
|
279
|
+
var value = parseFloat(this.value);
|
|
280
|
+
value = isNaN(value) ? 0.0 : value;
|
|
281
|
+
value = Math.max(value, parseFloat($(this).attr("aria-valuemin")));
|
|
282
|
+
value = Math.min(value, parseFloat($(this).attr("aria-valuemax")));
|
|
283
|
+
if (value !== this.value) $(this).spinner("value", value);
|
|
284
|
+
},
|
|
285
|
+
});
|
|
286
286
|
|
|
287
287
|
$("#node-input-max_change_percent")
|
|
288
288
|
.css("max-width", "4rem")
|
|
@@ -148,13 +148,16 @@ module.exports = function (RED)
|
|
|
148
148
|
|
|
149
149
|
let real_topic = helper.getTopicName(msg.topic);
|
|
150
150
|
|
|
151
|
-
if (real_topic
|
|
151
|
+
if (real_topic.startsWith("set_state"))
|
|
152
|
+
real_topic = real_topic.replace("set_state", "set");
|
|
153
|
+
|
|
154
|
+
if (real_topic == "set_inverted")
|
|
152
155
|
{
|
|
153
|
-
real_topic = "
|
|
156
|
+
real_topic = "set";
|
|
154
157
|
msg.payload = !msg.payload;
|
|
155
158
|
}
|
|
156
159
|
|
|
157
|
-
if (real_topic == "
|
|
160
|
+
if (real_topic == "set")
|
|
158
161
|
real_topic = (!!msg.payload) ? "enable" : "disable";
|
|
159
162
|
|
|
160
163
|
switch (real_topic)
|
|
@@ -179,7 +182,7 @@ module.exports = function (RED)
|
|
|
179
182
|
case "enable":
|
|
180
183
|
if (node_settings.enabled)
|
|
181
184
|
{
|
|
182
|
-
|
|
185
|
+
helper.log(node, "Already enabled");
|
|
183
186
|
break;
|
|
184
187
|
}
|
|
185
188
|
|
|
@@ -81,7 +81,7 @@
|
|
|
81
81
|
.appendTo(row);
|
|
82
82
|
|
|
83
83
|
// Output name
|
|
84
|
-
var modeName = $("<input/>", { class: "node-input-prop-name", placeholder: node._("
|
|
84
|
+
var modeName = $("<input/>", { class: "node-input-prop-name", placeholder: node._("mode-selector.ui.name"), type: "text" })
|
|
85
85
|
.css("width", "90%")
|
|
86
86
|
.appendTo(row);
|
|
87
87
|
|
|
@@ -115,7 +115,7 @@
|
|
|
115
115
|
tabs.addTab({
|
|
116
116
|
id: "modes-tab-outputs",
|
|
117
117
|
iconClass: "fa fa-list-ol",
|
|
118
|
-
label: node._("
|
|
118
|
+
label: node._("mode-selector.ui.modes")
|
|
119
119
|
});
|
|
120
120
|
},
|
|
121
121
|
oneditsave: function ()
|
|
@@ -135,12 +135,12 @@
|
|
|
135
135
|
|
|
136
136
|
<script type="text/html" data-template-name="smart_mode-selector">
|
|
137
137
|
<div class="form-row">
|
|
138
|
-
<label for="node-input-name"><i class="fa fa-tag"></i> <span data-i18n="
|
|
139
|
-
<input type="text" id="node-input-name" data-i18n="[placeholder]
|
|
138
|
+
<label for="node-input-name"><i class="fa fa-tag"></i> <span data-i18n="mode-selector.ui.name"></span></label>
|
|
139
|
+
<input type="text" id="node-input-name" data-i18n="[placeholder]mode-selector.ui.name" />
|
|
140
140
|
</div>
|
|
141
141
|
<div class="form-row">
|
|
142
142
|
<input type="checkbox" id="node-input-update_only_changed_outputs" style="width: 20px;" />
|
|
143
|
-
<label for="node-input-update_only_changed_outputs" style="width: calc(100% - 30px);" data-i18n="
|
|
143
|
+
<label for="node-input-update_only_changed_outputs" style="width: calc(100% - 30px);" data-i18n="mode-selector.ui.update_only_changed_outputs"></label>
|
|
144
144
|
</div>
|
|
145
145
|
|
|
146
146
|
<div id="mode-selector-modes">
|
|
@@ -154,10 +154,10 @@
|
|
|
154
154
|
</div>
|
|
155
155
|
</div>
|
|
156
156
|
<hr/>
|
|
157
|
-
<h4 style="margin: 0.5rem 0;" data-i18n="
|
|
157
|
+
<h4 style="margin: 0.5rem 0;" data-i18n="mode-selector.ui.system_start"></h4>
|
|
158
158
|
<div class="form-row">
|
|
159
159
|
<input type="checkbox" id="node-input-resend_on_start" style="width: 20px;" />
|
|
160
|
-
<label for="node-input-resend_on_start" style="width: calc(100% - 30px);" data-i18n="
|
|
160
|
+
<label for="node-input-resend_on_start" style="width: calc(100% - 30px);" data-i18n="mode-selector.ui.send_after_start"></label>
|
|
161
161
|
</div>
|
|
162
162
|
|
|
163
163
|
</script>
|
package/package.json
CHANGED
|
@@ -25,11 +25,11 @@
|
|
|
25
25
|
<td>Deaktiviert den Scheduler.</td>
|
|
26
26
|
</tr>
|
|
27
27
|
<tr>
|
|
28
|
-
<td><code>set_state</code></td>
|
|
28
|
+
<td><code>set</code> oder <code>set_state</code></td>
|
|
29
29
|
<td>Aktiviert den Scheduler, wenn <code>msg.payload = true</code> oder deaktiviert den Scheduler, wenn <code>msg.payload = false</code>.</td>
|
|
30
30
|
</tr>
|
|
31
31
|
<tr>
|
|
32
|
-
<td><code>set_state_inverted</code></td>
|
|
32
|
+
<td><code>set_inverted</code> oder <code>set_state_inverted</code></td>
|
|
33
33
|
<td>Aktiviert den Scheduler, wenn <code>msg.payload = false</code> oder deaktiviert den Scheduler, wenn <code>msg.payload = true</code>.</td>
|
|
34
34
|
</tr>
|
|
35
35
|
</tbody>
|
|
@@ -25,11 +25,11 @@
|
|
|
25
25
|
<td>Disables the scheduler.</td>
|
|
26
26
|
</tr>
|
|
27
27
|
<tr>
|
|
28
|
-
<td><code>set_state</code></td>
|
|
28
|
+
<td><code>set</code> or <code>set_state</code></td>
|
|
29
29
|
<td>Enables the scheduler if <code>msg.payload = true</code> or disables the scheduler if <code>msg.payload = false</code>.</td>
|
|
30
30
|
</tr>
|
|
31
31
|
<tr>
|
|
32
|
-
<td><code>set_state_inverted</code></td>
|
|
32
|
+
<td><code>set_inverted</code> oder <code>set_state_inverted</code></td>
|
|
33
33
|
<td>Enables the scheduler if <code>msg.payload = false</code> or disables the scheduler if <code>msg.payload = true</code>.</td>
|
|
34
34
|
</tr>
|
|
35
35
|
</tbody>
|
package/scheduler/scheduler.js
CHANGED
|
@@ -102,13 +102,16 @@ module.exports = function (RED)
|
|
|
102
102
|
{
|
|
103
103
|
let real_topic = helper.getTopicName(msg.topic);
|
|
104
104
|
|
|
105
|
-
if (real_topic
|
|
105
|
+
if (real_topic.startsWith("set_state"))
|
|
106
|
+
real_topic = real_topic.replace("set_state", "set");
|
|
107
|
+
|
|
108
|
+
if (real_topic == "set_inverted")
|
|
106
109
|
{
|
|
107
|
-
real_topic = "
|
|
110
|
+
real_topic = "set";
|
|
108
111
|
msg.payload = !msg.payload;
|
|
109
112
|
}
|
|
110
113
|
|
|
111
|
-
if (real_topic == "
|
|
114
|
+
if (real_topic == "set")
|
|
112
115
|
real_topic = (!!msg.payload) ? "enable" : "disable";
|
|
113
116
|
|
|
114
117
|
switch (real_topic)
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
<script type="text/html" data-help-name="smart_statistic">
|
|
2
2
|
<p>Dieser Knoten berechnet das Minimum, Maximum, die Summe, die Differenz, den absoluten Wert, die absolute Differenz, den Durchschnitt sowie den gleitenden Mittelwert verschiedener Werte.</p>
|
|
3
3
|
<p>Jeder Wert muss mit einem eigenen Topic gesendet werden. Kommt ein zweiter Wert mit dem gleichen Topic, wird der entsprechende Wert überschrieben.</p>
|
|
4
|
-
<p>Im Falle von MIN, MAX und ABS wird das entsprechende Topic, welches mit den Werten kam, mit ausgegeben. Bei SUM, DIFF, AVG und MOV_AVG handelt es sich um kombinierte Ergebnisse, weshalb Topic hier immer nicht gesetzt ist.</p>
|
|
4
|
+
<p>Im Falle von MIN, MAX und ABS wird das entsprechende Topic, welches mit den Werten kam, mit ausgegeben. Bei SUM, DIFF, AVG und MOV_AVG handelt es sich um kombinierte Ergebnisse, weshalb das Topic hier immer nicht gesetzt ist.</p>
|
|
5
5
|
<p>Für den absoluten Wert sowie den gleitenden Mittelwert spielt das Topic keine Rolle, jeder Wert der empfangen wird, wird für die Berechnung verwendet.</p>
|
|
6
6
|
<p>
|
|
7
7
|
<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/>
|