node-red-contrib-knx-ultimate 1.3.45 → 1.3.48
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 +14 -0
- package/KNXEngine/dptlib/dpt1.js +9 -2
- package/KNXEngine/dptlib/dpt10.js +1 -1
- package/KNXEngine/dptlib/dpt11.js +1 -1
- package/KNXEngine/dptlib/dpt12.js +1 -1
- package/KNXEngine/dptlib/dpt14.js +1 -1
- package/KNXEngine/dptlib/dpt16.js +1 -1
- package/KNXEngine/dptlib/dpt18.js +1 -1
- package/KNXEngine/dptlib/dpt19.js +1 -1
- package/KNXEngine/dptlib/dpt2.js +1 -1
- package/KNXEngine/dptlib/dpt20.js +1 -1
- package/KNXEngine/dptlib/dpt213.js +1 -1
- package/KNXEngine/dptlib/dpt22.js +1 -1
- package/KNXEngine/dptlib/dpt222.js +1 -1
- package/KNXEngine/dptlib/dpt232.js +1 -1
- package/KNXEngine/dptlib/dpt237.js +1 -1
- package/KNXEngine/dptlib/dpt238.js +1 -1
- package/KNXEngine/dptlib/dpt251.js +1 -1
- package/KNXEngine/dptlib/dpt3.js +1 -1
- package/KNXEngine/dptlib/dpt4.js +1 -1
- package/KNXEngine/dptlib/dpt7.js +1 -1
- package/KNXEngine/dptlib/dpt9.js +1 -1
- package/KNXEngine/dptlib/dpt999.js +1 -1
- package/KNXEngine/dptlib/index.js +1 -1
- package/KNXEngine/protocol/KNXSecureSessionRequest.js +1 -1
- package/README.md +1 -1
- package/nodes/knxUltimate-config.html +24 -7
- package/nodes/knxUltimate-config.js +43 -28
- package/nodes/locales/de/knxUltimate-config.json +1 -1
- package/nodes/locales/en-US/knxUltimate-config.json +1 -1
- package/nodes/locales/it/knxUltimate-config.json +1 -1
- package/nodes/locales/zh-CN/knxUltimate-config.json +1 -1
- package/package.json +5 -4
package/CHANGELOG.md
CHANGED
|
@@ -6,6 +6,20 @@
|
|
|
6
6
|
|
|
7
7
|
# CHANGELOG
|
|
8
8
|
|
|
9
|
+
<p>
|
|
10
|
+
<b>Version 1.3.48</b> - August 2022<br/>
|
|
11
|
+
- Fixed old "new Buffer" call. It's deprecated and may not work with new node.js versions.<br/>
|
|
12
|
+
</p>
|
|
13
|
+
<p>
|
|
14
|
+
<b>Version 1.3.47</b> - August 2022<br/>
|
|
15
|
+
- Temporary hide KNX Secure TAB from the config window. It will appear again when KNX Secure will be ready.<br/>
|
|
16
|
+
</p>
|
|
17
|
+
<p>
|
|
18
|
+
<b>Version 1.3.46</b> - July 2022<br/>
|
|
19
|
+
- NEW: Added hostname DNS resolution in Config Gateway IP. Now you can put an IP or an hostname in the IP gateway's field.<br />
|
|
20
|
+
- NEW: Added Datapoint 1.024 Day/Night.<br />
|
|
21
|
+
- Now the procol in the config node gateways is only suggested. You can choose the protocol by yourself.<br />
|
|
22
|
+
</p>
|
|
9
23
|
<p>
|
|
10
24
|
<b>Version 1.3.45</b> - June 2022<br/>
|
|
11
25
|
- NEW: pass msg.resetRBE = true to a device node, to reset both input and output RBE filter on that particular node.<br />
|
package/KNXEngine/dptlib/dpt1.js
CHANGED
|
@@ -9,10 +9,10 @@ exports.formatAPDU = function(value) {
|
|
|
9
9
|
var f = parseFloat(value);
|
|
10
10
|
if (!isNaN(f) && isFinite(value)) {
|
|
11
11
|
// numeric values (in native and string form) are truthy if NOT zero
|
|
12
|
-
return
|
|
12
|
+
return Buffer.from([Boolean(f) ? 1 : 0]);
|
|
13
13
|
} else {
|
|
14
14
|
// non-numeric value truthiness is Boolean true or the string 'true'.
|
|
15
|
-
return
|
|
15
|
+
return Buffer.from([(value == true || value == 'true') ? 1 : 0]);
|
|
16
16
|
}
|
|
17
17
|
}
|
|
18
18
|
|
|
@@ -192,6 +192,13 @@ exports.subtypes = {
|
|
|
192
192
|
"enc" : { 0 : "only move Up/Down mode (shutter)", 1 : "move Up/Down + StepStop mode (blind)" }
|
|
193
193
|
},
|
|
194
194
|
|
|
195
|
+
// 1.024 day/night
|
|
196
|
+
"024" : { "use" : "G",
|
|
197
|
+
"name" : "Day/Night",
|
|
198
|
+
"desc" : "day/night",
|
|
199
|
+
"enc" : { 0 : "Day", 1 : "Night" }
|
|
200
|
+
},
|
|
201
|
+
|
|
195
202
|
// 1.100 cooling/heating ---FIXME---
|
|
196
203
|
"100" : { "use" : "???",
|
|
197
204
|
"name" : "Heat/Cool",
|
|
@@ -15,7 +15,7 @@ var timeRegexp = /(\d{1,2}):(\d{1,2}):(\d{1,2})/;
|
|
|
15
15
|
// Always 8-bit aligned.
|
|
16
16
|
|
|
17
17
|
exports.formatAPDU = function (value) {
|
|
18
|
-
var apdu_data =
|
|
18
|
+
var apdu_data = Buffer.alloc(3);
|
|
19
19
|
var dow, hour, minute, second;
|
|
20
20
|
// day of week. NOTE: JS Sunday = 0
|
|
21
21
|
switch (typeof value) {
|
|
@@ -13,7 +13,7 @@ const knxLog = require('./../KnxLog');
|
|
|
13
13
|
exports.formatAPDU = function (value) {
|
|
14
14
|
if (!value || typeof value != 'number')
|
|
15
15
|
knxLog.get().error('DPT12: Must supply a number value');
|
|
16
|
-
var apdu_data =
|
|
16
|
+
var apdu_data = Buffer.alloc(4);
|
|
17
17
|
apdu_data.writeUIntBE(value, 0, 4);
|
|
18
18
|
return apdu_data;
|
|
19
19
|
}
|
|
@@ -27,7 +27,7 @@ const knxLog = require('./../KnxLog');
|
|
|
27
27
|
exports.formatAPDU = function (value) {
|
|
28
28
|
if (!value) knxLog.get().warn("DPT18: cannot write null value");
|
|
29
29
|
else {
|
|
30
|
-
var apdu_data =
|
|
30
|
+
var apdu_data = Buffer.alloc(1);
|
|
31
31
|
if (typeof value == 'object' &&
|
|
32
32
|
value.hasOwnProperty("save_recall") &&
|
|
33
33
|
value.hasOwnProperty("scenenumber")) {
|
|
@@ -18,7 +18,7 @@ exports.formatAPDU = function (value) {
|
|
|
18
18
|
else {
|
|
19
19
|
// Sunday is 0 in Javascript, but 7 in KNX.
|
|
20
20
|
var day = (value.getDay() === 0) ? 7 : value.getDay();
|
|
21
|
-
var apdu_data =
|
|
21
|
+
var apdu_data = Buffer.alloc(8);
|
|
22
22
|
apdu_data[0] = value.getFullYear() - 1900;
|
|
23
23
|
apdu_data[1] = value.getMonth() + 1;
|
|
24
24
|
apdu_data[2] = value.getDate();
|
package/KNXEngine/dptlib/dpt2.js
CHANGED
|
@@ -10,7 +10,7 @@ const knxLog = require('./../KnxLog');
|
|
|
10
10
|
//
|
|
11
11
|
// FIXME: help needed
|
|
12
12
|
exports.formatAPDU = function (value) {
|
|
13
|
-
var apdu_data =
|
|
13
|
+
var apdu_data = Buffer.alloc(1);
|
|
14
14
|
apdu_data[0] = value;
|
|
15
15
|
knxLog.get().debug('./knx/src/dpt20.js : input value = ' + value + ' apdu_data = ' + apdu_data);
|
|
16
16
|
return apdu_data;
|
|
@@ -69,7 +69,7 @@ function GetFloat(_value0, _value1) {
|
|
|
69
69
|
// 07/01/2021 Supergiovane
|
|
70
70
|
// Send to BUS
|
|
71
71
|
exports.formatAPDU = function (value) {
|
|
72
|
-
var apdu_data =
|
|
72
|
+
var apdu_data = Buffer.alloc(8); // 4 x 2 bytes
|
|
73
73
|
|
|
74
74
|
if (typeof value == 'object' &&
|
|
75
75
|
value.hasOwnProperty('Comfort') && value.Comfort >= -272 && value.Comfort <= 655.34 &&
|
|
@@ -81,7 +81,7 @@ function GetFloat(_value0, _value1) {
|
|
|
81
81
|
// 08/09/2020 Supergiovane
|
|
82
82
|
// Send to BUS
|
|
83
83
|
exports.formatAPDU = function (value) {
|
|
84
|
-
var apdu_data =
|
|
84
|
+
var apdu_data = Buffer.alloc(6); // 3 x 2 bytes
|
|
85
85
|
|
|
86
86
|
if (typeof value == 'object' &&
|
|
87
87
|
value.hasOwnProperty('Comfort') && value.Comfort >= -273 && value.Comfort <= 670760 &&
|
|
@@ -21,7 +21,7 @@ exports.formatAPDU = function (value) {
|
|
|
21
21
|
} else {
|
|
22
22
|
knxLog.get().error("DPT232: Must supply an value {red:0-255, green:0-255, blue:0-255}");
|
|
23
23
|
}
|
|
24
|
-
return
|
|
24
|
+
return Buffer.from([
|
|
25
25
|
Math.floor(value.red),
|
|
26
26
|
Math.floor(value.green),
|
|
27
27
|
Math.floor(value.blue)]);
|
|
@@ -35,7 +35,7 @@ exports.formatAPDU = function (value) {
|
|
|
35
35
|
// MSB
|
|
36
36
|
let MSB = "00000" + (value.convertorError === false ? "0" : "1") + (value.ballastFailure === false ? "0" : "1") + (value.lampFailure === false ? "0" : "1");
|
|
37
37
|
|
|
38
|
-
var bufferTotal =
|
|
38
|
+
var bufferTotal = Buffer.alloc(2)
|
|
39
39
|
bufferTotal[0] = parseInt(MSB, 2);
|
|
40
40
|
bufferTotal[1] = parseInt(LSB, 2);
|
|
41
41
|
return bufferTotal;
|
|
@@ -10,7 +10,7 @@ const knxLog = require('./../KnxLog');
|
|
|
10
10
|
//
|
|
11
11
|
// DPT5 is the only (AFAIK) DPT with scalar datatypes (5.001 and 5.003)
|
|
12
12
|
exports.formatAPDU = function(value) {
|
|
13
|
-
var apdu_data =
|
|
13
|
+
var apdu_data = Buffer.alloc(1);
|
|
14
14
|
apdu_data[0] = value;
|
|
15
15
|
knxLog.get().trace('dpt238.js : input value = ' + value + ' apdu_data = ' + apdu_data);
|
|
16
16
|
return apdu_data;
|
|
@@ -34,7 +34,7 @@ exports.formatAPDU = function (value) {
|
|
|
34
34
|
}
|
|
35
35
|
var bitVal= parseInt("0000" + value.mR + value.mG + value.mB + value.mW, 2) ;
|
|
36
36
|
|
|
37
|
-
return
|
|
37
|
+
return Buffer.from([
|
|
38
38
|
Math.floor(value.red),
|
|
39
39
|
Math.floor(value.green),
|
|
40
40
|
Math.floor(value.blue),
|
package/KNXEngine/dptlib/dpt3.js
CHANGED
|
@@ -11,7 +11,7 @@ const knxLog = require('./../KnxLog');
|
|
|
11
11
|
exports.formatAPDU = function(value) {
|
|
12
12
|
if (!value) knxLog.get().warn("DPT3: cannot write null value");
|
|
13
13
|
else {
|
|
14
|
-
var apdu_data =
|
|
14
|
+
var apdu_data = Buffer.alloc(1);
|
|
15
15
|
if (typeof value == 'object' &&
|
|
16
16
|
value.hasOwnProperty('decr_incr') &&
|
|
17
17
|
value.hasOwnProperty('data')) {
|
package/KNXEngine/dptlib/dpt4.js
CHANGED
|
@@ -15,7 +15,7 @@ exports.formatAPDU = function (value) {
|
|
|
15
15
|
if (typeof value == 'string') {
|
|
16
16
|
var apdu_data = value.charCodeAt(0);
|
|
17
17
|
if (apdu_data > 255) knxLog.get().warn("DPT4: must supply an ASCII character");
|
|
18
|
-
return
|
|
18
|
+
return Buffer.from([apdu_data]);
|
|
19
19
|
}
|
|
20
20
|
else knxLog.get().warn("DPT4: Must supply a character or string");
|
|
21
21
|
}
|
package/KNXEngine/dptlib/dpt7.js
CHANGED
|
@@ -12,7 +12,7 @@ const util = require('util');
|
|
|
12
12
|
const knxLog = require('./../KnxLog');
|
|
13
13
|
|
|
14
14
|
exports.formatAPDU = function (value) {
|
|
15
|
-
var apdu_data =
|
|
15
|
+
var apdu_data = Buffer.alloc(2);
|
|
16
16
|
if (!isFinite(value)) {
|
|
17
17
|
knxLog.get().warn("DPT7: cannot write non-numeric or undefined value");
|
|
18
18
|
} else {
|
package/KNXEngine/dptlib/dpt9.js
CHANGED
|
@@ -34,7 +34,7 @@ function frexp(value) {
|
|
|
34
34
|
}
|
|
35
35
|
|
|
36
36
|
exports.formatAPDU = function (value) {
|
|
37
|
-
var apdu_data =
|
|
37
|
+
var apdu_data = Buffer.alloc(2);
|
|
38
38
|
if (!isFinite(value)) {
|
|
39
39
|
knxLog.get().warn("DPT9: cannot write non-numeric or undefined value");
|
|
40
40
|
} else {
|
|
@@ -22,7 +22,7 @@ exports.formatAPDU = function (value) {
|
|
|
22
22
|
if (typeof value != 'string' || value.length < 10) knxLog.get().warn("Must supply an HEX string value of 10 bytes. Please don't add '$' nor '0x' Example 12340000000000000000")
|
|
23
23
|
else {
|
|
24
24
|
value = value.toUpperCase().replace(/\$/g, "").replace(/0X/g, "").replace(/ /g, ""); // Remove the $ and 0x
|
|
25
|
-
var apdu_data =
|
|
25
|
+
var apdu_data = Buffer.alloc(10);
|
|
26
26
|
var i = 0;
|
|
27
27
|
var iSlice = 2;
|
|
28
28
|
for (let index = 0; index < value.length; index += iSlice) {
|
|
@@ -55,7 +55,7 @@ dpts.populateAPDU = function (value, apdu, dptid) {
|
|
|
55
55
|
var dpt = dpts.resolve(dptid || 'DPT1');
|
|
56
56
|
var nbytes = Math.ceil(dpt.basetype.bitlength / 8);
|
|
57
57
|
//apdu.data = new Buffer(nbytes); // 14/09/2020 Supregiovane: Deprecated. Replaced with below.
|
|
58
|
-
apdu.data =
|
|
58
|
+
apdu.data = Buffer.alloc(nbytes);
|
|
59
59
|
apdu.bitlength = dpt.basetype && dpt.basetype.bitlength || 1;
|
|
60
60
|
var tgtvalue = value;
|
|
61
61
|
// get the raw APDU data for the given JS value
|
|
@@ -15,7 +15,7 @@ class KNXSecureSessionRequest extends KNXPacket.KNXPacket {
|
|
|
15
15
|
super(KNXConstants.KNX_CONSTANTS.SECURE_SESSION_REQUEST, hpaiData.length + 32);
|
|
16
16
|
this.cri = cri;
|
|
17
17
|
this.hpaiData = hpaiData;
|
|
18
|
-
this.diffieHellmanClientPublicValue =
|
|
18
|
+
this.diffieHellmanClientPublicValue = Buffer.alloc(32);
|
|
19
19
|
|
|
20
20
|
// Send the DH curve as well
|
|
21
21
|
// 02/01/2022 SONO ARRIVATO QUI get the authentication password from the first tunnel of the interface
|
package/README.md
CHANGED
|
@@ -49,7 +49,7 @@ msg.payload = {red:255, green:200, blue:30} // Put some colors in our life
|
|
|
49
49
|
## VOLUNTEER NEEDED FOR KNX SECURE
|
|
50
50
|
|
|
51
51
|
**************************************************
|
|
52
|
-
KNX-Secure is under development
|
|
52
|
+
KNX-Secure is under development.<br/>
|
|
53
53
|
I need volunteer helping in development of KNX Secure.<br/>
|
|
54
54
|
High knowledge of cryptography and KNX is needed.
|
|
55
55
|
**************************************************
|
|
@@ -55,7 +55,10 @@
|
|
|
55
55
|
}
|
|
56
56
|
|
|
57
57
|
// Auto set protocol based on IP
|
|
58
|
+
|
|
58
59
|
$("#node-config-input-host").on('focusout', function () {
|
|
60
|
+
let suggestedProtocol = "";
|
|
61
|
+
// 11/07/2022 only if the previous value was undefined, automatic set the protocol
|
|
59
62
|
if ($("#node-config-input-host").val().startsWith("224.") ||
|
|
60
63
|
$("#node-config-input-host").val().startsWith("225.") ||
|
|
61
64
|
$("#node-config-input-host").val().startsWith("232.") ||
|
|
@@ -63,10 +66,24 @@
|
|
|
63
66
|
$("#node-config-input-host").val().startsWith("234.") ||
|
|
64
67
|
$("#node-config-input-host").val().startsWith("235.") ||
|
|
65
68
|
$("#node-config-input-host").val().startsWith("239.")) {
|
|
66
|
-
|
|
69
|
+
suggestedProtocol = "Multicast.";
|
|
67
70
|
} else {
|
|
68
|
-
|
|
71
|
+
suggestedProtocol = "TunnelUDP or TunnelTCP (if the interface is KNX-Secure).";
|
|
69
72
|
}
|
|
73
|
+
var myNotification = RED.notify("The suggested protocol based on your input, is " + suggestedProtocol,
|
|
74
|
+
{
|
|
75
|
+
modal: false,
|
|
76
|
+
fixed: false,
|
|
77
|
+
type: 'info',
|
|
78
|
+
buttons: [
|
|
79
|
+
{
|
|
80
|
+
text: "Ok",
|
|
81
|
+
click: function (e) {
|
|
82
|
+
myNotification.close();
|
|
83
|
+
}
|
|
84
|
+
}]
|
|
85
|
+
})
|
|
86
|
+
|
|
70
87
|
});
|
|
71
88
|
|
|
72
89
|
$.getJSON('knxUltimateETHInterfaces', (data) => {
|
|
@@ -216,11 +233,11 @@
|
|
|
216
233
|
</div>
|
|
217
234
|
|
|
218
235
|
<div class="form-row">
|
|
219
|
-
<label for="node-config-input-host" style="width:
|
|
236
|
+
<label for="node-config-input-host" style="width: 110px">
|
|
220
237
|
<i class="fa fa-server"></i>
|
|
221
238
|
<span data-i18n="knxUltimate-config.properties.host"></span>
|
|
222
239
|
</label>
|
|
223
|
-
<input type="text" id="node-config-input-host" style="width:
|
|
240
|
+
<input type="text" id="node-config-input-host" style="width: 120px"><data-i18n="[Title]knxUltimate-config.properties.host_info" style="margin-left:5px;">
|
|
224
241
|
|
|
225
242
|
<label for="node-config-input-port" style="margin-left:5px; width:35px;">
|
|
226
243
|
<span data-i18n="knxUltimate-config.properties.port"></span>
|
|
@@ -236,7 +253,7 @@
|
|
|
236
253
|
|
|
237
254
|
<!-- KNX Secure / Unsecure tabbed selector-->
|
|
238
255
|
<!-- <div id="tabsMain" style="display: none;"> -->
|
|
239
|
-
|
|
256
|
+
<!-- <div id="tabsMain">
|
|
240
257
|
<ul>
|
|
241
258
|
<li><a href="#unsecureKNX"><i class="fa fa-circle-o"></i> <span data-i18n="knxUltimate-config.properties.unsecureKNX"></span></a></li>
|
|
242
259
|
<li><a href="#SecureKNX"><i class="fa fa-shield"></i> <span data-i18n="knxUltimate-config.properties.secureKNX"></span></a></li>
|
|
@@ -247,7 +264,7 @@
|
|
|
247
264
|
</div>
|
|
248
265
|
<div id="SecureKNX" style="margin: 5px 5px 5px 5px;" >
|
|
249
266
|
<p>
|
|
250
|
-
<p>WARNING:
|
|
267
|
+
<p>WARNING: KNX SECURE IS STILL UNDER DEVELOPMENT</p>
|
|
251
268
|
<div class="form-row">
|
|
252
269
|
<i class="fa fa-youtube"></i>
|
|
253
270
|
<a href="https://youtu.be/OpR7ZQTlMRU" target="_blank">
|
|
@@ -264,7 +281,7 @@
|
|
|
264
281
|
</div>
|
|
265
282
|
</p>
|
|
266
283
|
</div>
|
|
267
|
-
</div>
|
|
284
|
+
</div> -->
|
|
268
285
|
|
|
269
286
|
<div class="form-tips" style="margin-top:11px">
|
|
270
287
|
<span data-i18n="knxUltimate-config.advanced.tiphost"></span>
|
|
@@ -164,7 +164,9 @@ return msg;`, "helplink": "https://github.com/Supergiovane/node-red-contrib-knx-
|
|
|
164
164
|
node.hostProtocol = "TunnelUDP"; // 20/03/2022 Default
|
|
165
165
|
node.knxConnection = null; // 20/03/2022 Default
|
|
166
166
|
// 15/12/2021
|
|
167
|
-
|
|
167
|
+
|
|
168
|
+
// 05/12/2021 Set the protocol (this is undefined if coming from ild versions
|
|
169
|
+
if (config.hostProtocol === undefined) {
|
|
168
170
|
// Auto set protocol based on IP
|
|
169
171
|
if (node.host.startsWith("224.") ||
|
|
170
172
|
node.host.startsWith("225.") ||
|
|
@@ -175,14 +177,10 @@ return msg;`, "helplink": "https://github.com/Supergiovane/node-red-contrib-knx-
|
|
|
175
177
|
node.host.startsWith("239.")) {
|
|
176
178
|
node.hostProtocol = "Multicast";
|
|
177
179
|
} else {
|
|
180
|
+
// 11/07/2022
|
|
178
181
|
node.hostProtocol = "TunnelUDP";
|
|
179
182
|
}
|
|
180
183
|
if (node.sysLogger !== undefined && node.sysLogger !== null) node.sysLogger.info("IP Protocol auto adapded to " + node.hostProtocol + ", based on IP " + node.host);
|
|
181
|
-
}
|
|
182
|
-
|
|
183
|
-
// 05/12/2021 Set the protocol (this is undefined if coming from ild versions
|
|
184
|
-
if (config.hostProtocol === undefined) {
|
|
185
|
-
node.adaptProtocolBasedOnIP();
|
|
186
184
|
} else {
|
|
187
185
|
node.hostProtocol = config.hostProtocol;
|
|
188
186
|
}
|
|
@@ -609,9 +607,7 @@ return msg;`, "helplink": "https://github.com/Supergiovane/node-red-contrib-knx-
|
|
|
609
607
|
if (typeof _iPort !== "undefined" && _iPort !== 0) node.port = _iPort;
|
|
610
608
|
if (typeof _sPhysicalAddress !== "undefined" && _sPhysicalAddress !== "") node.physAddr = _sPhysicalAddress;
|
|
611
609
|
if (typeof _sBindToEthernetInterface !== "undefined") node.KNXEthInterface = _sBindToEthernetInterface;
|
|
612
|
-
if (_Protocol
|
|
613
|
-
node.adaptProtocolBasedOnIP();
|
|
614
|
-
} else { node.hostProtocol = _Protocol; }
|
|
610
|
+
if (typeof _Protocol !== "undefined") node.hostProtocol = _Protocol;
|
|
615
611
|
|
|
616
612
|
if (node.sysLogger !== undefined && node.sysLogger !== null) node.sysLogger.info("Node's main config setting has been changed. New config: IP " + node.host + " Port " + node.port + " PhysicalAddress " + node.physAddr + " BindToInterface " + node.KNXEthInterface);
|
|
617
613
|
|
|
@@ -682,6 +678,35 @@ return msg;`, "helplink": "https://github.com/Supergiovane/node-red-contrib-knx-
|
|
|
682
678
|
jKNXSecureKeyring: node.jKNXSecureKeyring,
|
|
683
679
|
localIPAddress: "" // Riempito da KNXEngine
|
|
684
680
|
};
|
|
681
|
+
// 11/07/2022 Test if the IP is a valid one or is a DNS Name
|
|
682
|
+
if (node.host.toUpperCase() !== "EMULATE") {
|
|
683
|
+
switch (net.isIP(node.host)) {
|
|
684
|
+
case 0:
|
|
685
|
+
// Invalid IP, resolve the DNS name.
|
|
686
|
+
let dns = require("dns-sync");
|
|
687
|
+
let resolvedIP = null;
|
|
688
|
+
try {
|
|
689
|
+
resolvedIP = dns.resolve(node.host);
|
|
690
|
+
} catch (error) {
|
|
691
|
+
throw new Error("net.isIP: INVALID IP OR DNS NAME. Error checking the Gateway Host in Config node. " + error.message);
|
|
692
|
+
}
|
|
693
|
+
if (resolvedIP === null || net.isIP(resolvedIP) === 0) {
|
|
694
|
+
// Error in resolving DNS Name
|
|
695
|
+
if (node.sysLogger !== undefined && node.sysLogger !== null) node.sysLogger.error("knxUltimate-config: net.isIP: INVALID IP OR DNS NAME. Check the Gateway Host in Config node " + node.name + " " + node.host);
|
|
696
|
+
throw new Error("net.isIP: INVALID IP OR DNS NAME. Check the Gateway Host in Config node.");
|
|
697
|
+
}
|
|
698
|
+
if (node.sysLogger !== undefined && node.sysLogger !== null) node.sysLogger.info("knxUltimate-config: net.isIP: The gateway is not specified as IP. The DNS resolver pointed me to the IP " + node.host + ", in Config node " + node.name);
|
|
699
|
+
node.knxConnectionProperties.ipAddr = resolvedIP;
|
|
700
|
+
case 4:
|
|
701
|
+
// It's an IPv4
|
|
702
|
+
break;
|
|
703
|
+
case 6:
|
|
704
|
+
// It's an IPv6
|
|
705
|
+
break;
|
|
706
|
+
default:
|
|
707
|
+
break;
|
|
708
|
+
}
|
|
709
|
+
}
|
|
685
710
|
|
|
686
711
|
if (node.KNXEthInterface !== "Auto") {
|
|
687
712
|
var sIfaceName = "";
|
|
@@ -706,7 +731,13 @@ return msg;`, "helplink": "https://github.com/Supergiovane/node-red-contrib-knx-
|
|
|
706
731
|
|
|
707
732
|
node.initKNXConnection = () => {
|
|
708
733
|
|
|
709
|
-
|
|
734
|
+
try {
|
|
735
|
+
node.setKnxConnectionProperties(); //28/12/2021 Added
|
|
736
|
+
} catch (error) {
|
|
737
|
+
if (node.sysLogger !== undefined && node.sysLogger !== null) node.sysLogger.error("knxUltimate-config: setKnxConnectionProperties: " + error.message);
|
|
738
|
+
if (node.linkStatus !== "disconnected") node.Disconnect();
|
|
739
|
+
return;
|
|
740
|
+
}
|
|
710
741
|
|
|
711
742
|
// 12/08/2021 Avoid start connection if there are no knx-ultimate nodes linked to this gateway
|
|
712
743
|
// At start, initKNXConnection is already called only if the gateway has clients, but in the successive calls from the error handler, this check is not done.
|
|
@@ -742,22 +773,6 @@ return msg;`, "helplink": "https://github.com/Supergiovane/node-red-contrib-knx-
|
|
|
742
773
|
|
|
743
774
|
|
|
744
775
|
try {
|
|
745
|
-
// 01/12/2020 Test if the IP is a valid one
|
|
746
|
-
switch (net.isIP(node.host)) {
|
|
747
|
-
case 0:
|
|
748
|
-
// Invalid IP
|
|
749
|
-
if (node.sysLogger !== undefined && node.sysLogger !== null) node.sysLogger.error("knxUltimate-config: net.isIP: INVALID IP. Check the IP in Config node " + node.name);
|
|
750
|
-
throw ("INVALID IP. Check the IP in Config node.");
|
|
751
|
-
case 4:
|
|
752
|
-
// It's an IPv4
|
|
753
|
-
break;
|
|
754
|
-
case 6:
|
|
755
|
-
// It's an IPv6
|
|
756
|
-
break;
|
|
757
|
-
default:
|
|
758
|
-
break;
|
|
759
|
-
}
|
|
760
|
-
|
|
761
776
|
// Unsetting handlers if node.knxConnection was existing
|
|
762
777
|
try {
|
|
763
778
|
if (node.knxConnection !== null && node.knxConnection !== undefined) {
|
|
@@ -839,10 +854,10 @@ return msg;`, "helplink": "https://github.com/Supergiovane/node-red-contrib-knx-
|
|
|
839
854
|
}
|
|
840
855
|
|
|
841
856
|
} catch (error) {
|
|
842
|
-
if (node.sysLogger !== undefined && node.sysLogger !== null) node.sysLogger.error("KNXUltimate-config: Error in instantiating knxConnection " + error.message + "
|
|
857
|
+
if (node.sysLogger !== undefined && node.sysLogger !== null) node.sysLogger.error("KNXUltimate-config: Error in instantiating knxConnection " + error.message + " Node " + node.name);
|
|
843
858
|
node.linkStatus = "disconnected";
|
|
844
859
|
// 21/03/2022 fixed possible memory leak. Previously was setTimeout without "let t = ".
|
|
845
|
-
let t = setTimeout(() => node.setAllClientsStatus("Error in instantiating knxConnection " + error, "red", "Error"), 200);
|
|
860
|
+
let t = setTimeout(() => node.setAllClientsStatus("Error in instantiating knxConnection " + error.message, "red", "Error"), 200);
|
|
846
861
|
}
|
|
847
862
|
|
|
848
863
|
};
|
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
"properties": {
|
|
4
4
|
"helplink" : " <i class=\"fa fa-question-circle\"></i> <a target=\"_blank\" href=\"https://github.com/Supergiovane/node-red-contrib-knx-ultimate/wiki/de-1.-Gateway-configuration\"><u>Hilfe Konfiguration</u></a>",
|
|
5
5
|
"title": "KNX/IP Gateway Konfiguration",
|
|
6
|
-
"host": "IP",
|
|
6
|
+
"host": "IP/Hostname",
|
|
7
7
|
"host_info": "Als Standard IP wird die Multicast Addresse von KNX/IP verwendet (224.0.23.12)",
|
|
8
8
|
"port": "Port",
|
|
9
9
|
"port_info": "Als Standard Port wird der Port von KNX/IP verwendet (3671)",
|
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
"properties": {
|
|
4
4
|
"helplink" : " <i class=\"fa fa-question-circle\"></i> <a target=\"_blank\" href=\"https://github.com/Supergiovane/node-red-contrib-knx-ultimate/wiki/1.-Gateway-configuration\"><u>Help for configuration</u></a>",
|
|
5
5
|
"title": "KNX/IP Gateway Configuration",
|
|
6
|
-
"host": "IP",
|
|
6
|
+
"host": "IP/Hostname",
|
|
7
7
|
"host_info": "Default setting is the Multicast address of KNX/IP (224.0.23.12)",
|
|
8
8
|
"port": "Port",
|
|
9
9
|
"port_info": "Default Setting is the Port of KNX/IP (3671)",
|
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
"properties": {
|
|
4
4
|
"helplink" : " <i class=\"fa fa-question-circle\"></i> <a target=\"_blank\" href=\"https://github.com/Supergiovane/node-red-contrib-knx-ultimate/wiki/it-1.-Gateway-configuration\"><u>Aiuto per configurazione</u></a>",
|
|
5
5
|
"title": "Interfaccia KNX/IP",
|
|
6
|
-
"host": "IP",
|
|
6
|
+
"host": "IP/Hostname",
|
|
7
7
|
"host_info": "Di default è impostato l'indirizzo multicast del router KNX/IP (224.0.23.12)",
|
|
8
8
|
"port": "Porta",
|
|
9
9
|
"port_info": "Di default è impostata la porta de router KNX/IP (3671)",
|
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
"properties": {
|
|
4
4
|
"helplink" : " <i class=\"fa fa-question-circle\"></i> <a target=\"_blank\" href=\"https://github.com/Supergiovane/node-red-contrib-knx-ultimate/wiki/cn-1.-Gateway-configuration\"><u>配置帮助文档</u></a>",
|
|
5
5
|
"title": "KNX/IP 网关配置",
|
|
6
|
-
"host": "网关 IP",
|
|
6
|
+
"host": "网关 IP/Hostname",
|
|
7
7
|
"host_info": "默认设置为 KNX/IP 的组播地址 (224.0.23.12)",
|
|
8
8
|
"port": "端口号",
|
|
9
9
|
"port_info": "默认设置为 KNX/IP (3671)",
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "node-red-contrib-knx-ultimate",
|
|
3
|
-
"version": "1.3.
|
|
3
|
+
"version": "1.3.48",
|
|
4
4
|
"description": "Control your KNX intallation via Node-Red! Single Node KNX IN/OUT with optional ETS group address importer. Easy to use and highly configurable.",
|
|
5
5
|
"dependencies": {
|
|
6
6
|
"mkdirp": "1.0.4",
|
|
@@ -9,9 +9,10 @@
|
|
|
9
9
|
"binary-protocol": "0.0.0",
|
|
10
10
|
"log-driver": "1.2.7",
|
|
11
11
|
"lodash": "4.17.21",
|
|
12
|
-
"path": "
|
|
13
|
-
"crypto-js": "
|
|
14
|
-
"xml2js": "
|
|
12
|
+
"path": "0.12.7",
|
|
13
|
+
"crypto-js": "4.1.1",
|
|
14
|
+
"xml2js": "0.4.23",
|
|
15
|
+
"dns-sync":"0.2.1"
|
|
15
16
|
},
|
|
16
17
|
"node-red": {
|
|
17
18
|
"nodes": {
|