smart-nodes 0.3.37 → 0.4.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 +67 -0
- package/README.md +35 -17
- package/central/central.html +26 -12
- package/central/central.js +84 -26
- package/central/locales/de-DE/central.json +1 -4
- package/central/locales/en-US/central.json +0 -3
- package/compare/compare.html +40 -24
- package/compare/compare.js +69 -29
- package/compare/locales/de-DE/compare.json +5 -7
- package/compare/locales/en-US/compare.json +18 -8
- package/counter/counter.html +64 -17
- package/counter/counter.js +43 -20
- package/counter/locales/de-DE/counter.json +6 -9
- package/counter/locales/en-US/counter.json +12 -16
- package/delay/delay.html +18 -88
- 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 +39 -14
- 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 +43 -65
- package/hysteresis/hysteresis.js +94 -69
- 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-control/light-control.html → light/light.html} +34 -144
- 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 +27 -40
- 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 +15 -79
- 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} +18 -121
- 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} +30 -133
- package/shutter-complex/shutter-complex.js +578 -0
- package/smart_helper.js +61 -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 +32 -36
- package/statistic/statistic.js +58 -29
- 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/long-press-control/long-press-control.js +0 -76
- package/shutter-complex-control/shutter-complex-control.js +0 -442
package/forwarder/forwarder.js
CHANGED
|
@@ -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
|
-
|
|
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
|
-
|
|
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 (
|
|
85
|
+
if (real_topic == "enable" || (real_topic == "set_state" && msg.payload))
|
|
42
86
|
new_state = true;
|
|
43
|
-
else if (
|
|
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
|
+
}
|
|
@@ -1,8 +1,6 @@
|
|
|
1
1
|
<script type="text/javascript">
|
|
2
2
|
(function ()
|
|
3
3
|
{
|
|
4
|
-
let node;
|
|
5
|
-
|
|
6
4
|
RED.nodes.registerType("smart_heating-curve", {
|
|
7
5
|
category: "Smart Nodes",
|
|
8
6
|
paletteLabel: "Heating Curve",
|
|
@@ -24,7 +22,7 @@
|
|
|
24
22
|
},
|
|
25
23
|
oneditprepare: function ()
|
|
26
24
|
{
|
|
27
|
-
node = this;
|
|
25
|
+
let node = this;
|
|
28
26
|
|
|
29
27
|
$("#node-input-room_setpoint")
|
|
30
28
|
.spinner({
|
|
@@ -278,69 +276,30 @@
|
|
|
278
276
|
|
|
279
277
|
<script type="text/html" data-template-name="smart_heating-curve">
|
|
280
278
|
<div class="form-row">
|
|
281
|
-
<label for="node-input-name"><i class="fa fa-tag"></i>
|
|
282
|
-
<input type="text" id="node-input-name"
|
|
279
|
+
<label for="node-input-name"><i class="fa fa-tag"></i> <span data-i18n="heating.ui.name"></span></label>
|
|
280
|
+
<input type="text" id="node-input-name" data-i18n="[placeholder]heating.ui.name" />
|
|
283
281
|
</div>
|
|
284
282
|
<div class="form-row">
|
|
285
|
-
<label for="node-input-room_setpoint"><i class="fa fa-thermometer-three-quarters"></i>
|
|
283
|
+
<label for="node-input-room_setpoint"><i class="fa fa-thermometer-three-quarters"></i> <span data-i18n="heating.ui.room_setpoint"></span></label>
|
|
286
284
|
<input id="node-input-room_setpoint" value="0" /> °C [15 - 25]
|
|
287
285
|
</div>
|
|
288
286
|
<div class="form-row">
|
|
289
|
-
<label for="node-input-slope"><i class="fa fa-expand"></i>
|
|
287
|
+
<label for="node-input-slope"><i class="fa fa-expand"></i> <span data-i18n="heating.ui.slope"></span></label>
|
|
290
288
|
<input id="node-input-slope" value="0" /> [0,05 - 4]
|
|
291
289
|
</div>
|
|
292
290
|
<div class="form-row">
|
|
293
|
-
<label for="node-input-offset"><i class="fa fa-arrows-v"></i>
|
|
291
|
+
<label for="node-input-offset"><i class="fa fa-arrows-v"></i> <span data-i18n="heating.ui.offset"></span></label>
|
|
294
292
|
<input id="node-input-offset" value="0" />
|
|
295
293
|
</div>
|
|
296
294
|
<div class="form-row">
|
|
297
|
-
<label for="node-input-
|
|
298
|
-
<input id="node-input-
|
|
295
|
+
<label for="node-input-flow_min"><i class="fa fa-arrow-down"></i> <span data-i18n="heating.ui.min_setpoint"></span></label>
|
|
296
|
+
<input id="node-input-flow_min" value="0" />
|
|
299
297
|
</div>
|
|
300
298
|
<div class="form-row">
|
|
301
|
-
<label for="node-input-
|
|
302
|
-
<input id="node-input-
|
|
299
|
+
<label for="node-input-flow_max"><i class="fa fa-arrow-up"></i> <span data-i18n="heating.ui.max_setpoint"></span></label>
|
|
300
|
+
<input id="node-input-flow_max" value="0" />
|
|
303
301
|
</div>
|
|
304
302
|
<div class="form-row">
|
|
305
303
|
<canvas id="heating-curve-diagram" width="450" height="300"></canvas>
|
|
306
304
|
</div>
|
|
307
|
-
</script>
|
|
308
|
-
|
|
309
|
-
<script type="text/html" data-help-name="smart_heating-curve">
|
|
310
|
-
<p>
|
|
311
|
-
Diese Node berechnet anhand den eingestellten Werten, die Vorlaufsolltemperatur. Diese kann verwendet werden um ein Mischventil anzusteuern.
|
|
312
|
-
</p>
|
|
313
|
-
<p>
|
|
314
|
-
<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/>
|
|
315
|
-
Diese Node verwendet nur den Teil <code>name</code>. <code>#</code> und <code>nummer</code> sind dabei optional.
|
|
316
|
-
</p>
|
|
317
|
-
<p>
|
|
318
|
-
Folgende topics werden akzeptiert:
|
|
319
|
-
<table>
|
|
320
|
-
<thead>
|
|
321
|
-
<tr>
|
|
322
|
-
<th>Topic</th>
|
|
323
|
-
<th>Beschreibung</th>
|
|
324
|
-
</tr>
|
|
325
|
-
</thead>
|
|
326
|
-
<tbody>
|
|
327
|
-
<tr>
|
|
328
|
-
<td><code>room_setpoint</code></td>
|
|
329
|
-
<td>Überschreibt die Raum-Solltemperatur.</td>
|
|
330
|
-
</tr>
|
|
331
|
-
<tr>
|
|
332
|
-
<td><code>flow_min</code></td>
|
|
333
|
-
<td>Überschreibt die minimale Vorlaufsolltemperatur.</td>
|
|
334
|
-
</tr>
|
|
335
|
-
<tr>
|
|
336
|
-
<td><code>flow_max</code></td>
|
|
337
|
-
<td>Überschreibt die maximale Vorlaufsolltemperatur.</td>
|
|
338
|
-
</tr>
|
|
339
|
-
<tr>
|
|
340
|
-
<td><code>temperature_outside</code></td>
|
|
341
|
-
<td>Setzt die aktuelle Außentemperatur.</td>
|
|
342
|
-
</tr>
|
|
343
|
-
</tbody>
|
|
344
|
-
</table>
|
|
345
|
-
</p>
|
|
346
305
|
</script>
|
|
@@ -7,11 +7,22 @@ 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
|
-
|
|
14
|
-
|
|
21
|
+
|
|
22
|
+
// #####################
|
|
23
|
+
// # persistent values #
|
|
24
|
+
// #####################
|
|
25
|
+
var node_settings = helper.cloneObject({
|
|
15
26
|
room_setpoint: config.room_setpoint,
|
|
16
27
|
flow_min: config.flow_min,
|
|
17
28
|
flow_max: config.flow_max,
|
|
@@ -19,17 +30,30 @@ module.exports = function (RED)
|
|
|
19
30
|
last_flow_temperature: null
|
|
20
31
|
}, smart_context.get(node.id));
|
|
21
32
|
|
|
22
|
-
|
|
33
|
+
|
|
34
|
+
// ##################
|
|
35
|
+
// # Dynamic config #
|
|
36
|
+
// ##################
|
|
23
37
|
let slope = config.slope;
|
|
24
38
|
let offset = config.offset;
|
|
25
39
|
|
|
26
|
-
// runtime values
|
|
27
40
|
|
|
41
|
+
// ##################
|
|
42
|
+
// # Runtime values #
|
|
43
|
+
// ##################
|
|
44
|
+
|
|
45
|
+
|
|
46
|
+
// ###############
|
|
47
|
+
// # Node events #
|
|
48
|
+
// ###############
|
|
28
49
|
node.on("input", function (msg)
|
|
29
50
|
{
|
|
30
51
|
handleTopic(msg);
|
|
52
|
+
|
|
31
53
|
sendResult();
|
|
32
54
|
setStatus();
|
|
55
|
+
|
|
56
|
+
smart_context.set(node.id, node_settings);
|
|
33
57
|
});
|
|
34
58
|
|
|
35
59
|
node.on("close", function ()
|
|
@@ -37,6 +61,11 @@ module.exports = function (RED)
|
|
|
37
61
|
});
|
|
38
62
|
|
|
39
63
|
|
|
64
|
+
// #####################
|
|
65
|
+
// # Private functions #
|
|
66
|
+
// #####################
|
|
67
|
+
|
|
68
|
+
// This is the main function which handles all topics that was received.
|
|
40
69
|
let handleTopic = msg =>
|
|
41
70
|
{
|
|
42
71
|
let real_topic = helper.getTopicName(msg.topic);
|
|
@@ -46,48 +75,44 @@ module.exports = function (RED)
|
|
|
46
75
|
let new_setpoint = parseFloat(msg.payload);
|
|
47
76
|
if (isNaN(new_setpoint) && !isFinite(new_setpoint))
|
|
48
77
|
{
|
|
49
|
-
//
|
|
78
|
+
// helper.warn(this, "Invalid payload: " + msg.payload);
|
|
50
79
|
return;
|
|
51
80
|
}
|
|
52
81
|
|
|
53
82
|
node_settings.room_setpoint = msg.payload;
|
|
54
|
-
smart_context.set(node.id, node_settings);
|
|
55
83
|
break;
|
|
56
84
|
|
|
57
85
|
case "temperature_outside":
|
|
58
86
|
let new_temp = parseFloat(msg.payload);
|
|
59
87
|
if (isNaN(new_temp) && !isFinite(new_temp))
|
|
60
88
|
{
|
|
61
|
-
//
|
|
89
|
+
// helper.warn(this, "Invalid payload: " + msg.payload);
|
|
62
90
|
return;
|
|
63
91
|
}
|
|
64
92
|
|
|
65
93
|
node_settings.temperature_outside = msg.payload;
|
|
66
|
-
smart_context.set(node.id, node_settings);
|
|
67
94
|
break;
|
|
68
95
|
|
|
69
96
|
case "flow_min":
|
|
70
97
|
let new_flow_min = parseFloat(msg.payload);
|
|
71
98
|
if (isNaN(new_flow_min) && !isFinite(new_flow_min))
|
|
72
99
|
{
|
|
73
|
-
//
|
|
100
|
+
// helper.warn(this, "Invalid payload: " + msg.payload);
|
|
74
101
|
return;
|
|
75
102
|
}
|
|
76
103
|
|
|
77
104
|
node_settings.flow_min = msg.payload;
|
|
78
|
-
smart_context.set(node.id, node_settings);
|
|
79
105
|
break;
|
|
80
106
|
|
|
81
107
|
case "flow_max":
|
|
82
108
|
let new_flow_max = parseFloat(msg.payload);
|
|
83
109
|
if (isNaN(new_flow_max) && !isFinite(new_flow_max))
|
|
84
110
|
{
|
|
85
|
-
//
|
|
111
|
+
// helper.warn(this, "Invalid payload: " + msg.payload);
|
|
86
112
|
return;
|
|
87
113
|
}
|
|
88
114
|
|
|
89
115
|
node_settings.flow_max = msg.payload;
|
|
90
|
-
smart_context.set(node.id, node_settings);
|
|
91
116
|
break;
|
|
92
117
|
|
|
93
118
|
default:
|
|
@@ -121,11 +146,11 @@ module.exports = function (RED)
|
|
|
121
146
|
|
|
122
147
|
let setStatus = () =>
|
|
123
148
|
{
|
|
124
|
-
node.status({ fill: "green", shape: "dot", text: helper.getCurrentTimeForStatus() + ": Out: " + node_settings.temperature_outside
|
|
149
|
+
node.status({ fill: "green", shape: "dot", text: helper.getCurrentTimeForStatus() + ": Out: " + node_settings.temperature_outside?.toFixed(1) + "°C, Flow: " + node_settings.last_flow_temperature?.toFixed(1) + "°C" });
|
|
125
150
|
}
|
|
126
151
|
|
|
127
152
|
if (node_settings.last_flow_temperature !== null)
|
|
128
|
-
setTimeout(sendResult,
|
|
153
|
+
setTimeout(sendResult, 10000);
|
|
129
154
|
|
|
130
155
|
setStatus();
|
|
131
156
|
}
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
<script type="text/html" data-help-name="smart_heating-curve">
|
|
2
|
+
<p>
|
|
3
|
+
Diese Node berechnet anhand den eingestellten Werten, die Vorlaufsolltemperatur. Diese kann verwendet werden um ein Mischventil anzusteuern.
|
|
4
|
+
</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>name</code>. <code>#</code> und <code>nummer</code> sind dabei optional.
|
|
8
|
+
</p>
|
|
9
|
+
<p>
|
|
10
|
+
Folgende topics werden akzeptiert:
|
|
11
|
+
<table>
|
|
12
|
+
<thead>
|
|
13
|
+
<tr>
|
|
14
|
+
<th>Topic</th>
|
|
15
|
+
<th>Beschreibung</th>
|
|
16
|
+
</tr>
|
|
17
|
+
</thead>
|
|
18
|
+
<tbody>
|
|
19
|
+
<tr>
|
|
20
|
+
<td><code>room_setpoint</code></td>
|
|
21
|
+
<td>Überschreibt die Raum-Solltemperatur.</td>
|
|
22
|
+
</tr>
|
|
23
|
+
<tr>
|
|
24
|
+
<td><code>flow_min</code></td>
|
|
25
|
+
<td>Überschreibt die minimale Vorlaufsolltemperatur.</td>
|
|
26
|
+
</tr>
|
|
27
|
+
<tr>
|
|
28
|
+
<td><code>flow_max</code></td>
|
|
29
|
+
<td>Überschreibt die maximale Vorlaufsolltemperatur.</td>
|
|
30
|
+
</tr>
|
|
31
|
+
<tr>
|
|
32
|
+
<td><code>temperature_outside</code></td>
|
|
33
|
+
<td>Setzt die aktuelle Außentemperatur.</td>
|
|
34
|
+
</tr>
|
|
35
|
+
</tbody>
|
|
36
|
+
</table>
|
|
37
|
+
</p>
|
|
38
|
+
</script>
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
<script type="text/html" data-help-name="smart_heating-curve">
|
|
2
|
+
<p>
|
|
3
|
+
This node calculates the target flow temperature based on the set values. This can be used to control a mixing valve.
|
|
4
|
+
</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 part <code>name</code>. <code>#</code> and <code>number</code> are optional.
|
|
8
|
+
</p>
|
|
9
|
+
<p>
|
|
10
|
+
The following topics are accepted:
|
|
11
|
+
<table>
|
|
12
|
+
<thead>
|
|
13
|
+
<tr>
|
|
14
|
+
<th>Topic</th>
|
|
15
|
+
<th>Description</th>
|
|
16
|
+
</tr>
|
|
17
|
+
</thead>
|
|
18
|
+
<tbody>
|
|
19
|
+
<tr>
|
|
20
|
+
<td><code>room_setpoint</code></td>
|
|
21
|
+
<td>Overwrites the room setpoint temperature.</td>
|
|
22
|
+
</tr>
|
|
23
|
+
<tr>
|
|
24
|
+
<td><code>flow_min</code></td>
|
|
25
|
+
<td>Overwrites the minimum flow setpoint temperature.</td>
|
|
26
|
+
</tr>
|
|
27
|
+
<tr>
|
|
28
|
+
<td><code>flow_max</code></td>
|
|
29
|
+
<td>Overwrites the maximum flow setpoint temperature.</td>
|
|
30
|
+
</tr>
|
|
31
|
+
<tr>
|
|
32
|
+
<td><code>temperature_outside</code></td>
|
|
33
|
+
<td>Sets the current outside temperature.</td>
|
|
34
|
+
</tr>
|
|
35
|
+
</tbody>
|
|
36
|
+
</table>
|
|
37
|
+
</p>
|
|
38
|
+
</script>
|