node-red-contrib-knx-ultimate 1.3.15 → 1.3.16
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
CHANGED
|
@@ -4,6 +4,12 @@
|
|
|
4
4
|
|
|
5
5
|
<br/>
|
|
6
6
|
<p>
|
|
7
|
+
<b>Version 1.3.16</b> - Januar 2022<br/>
|
|
8
|
+
- KNXEngine: there are some weird KNX gateways out there, either sending malformed header or CEMI messages. Now KNX-Ultimate will simply ignore these bad messages. Prior, it was disconnecting.<br/>
|
|
9
|
+
- KNXEngine: KNX-Secure packets are silently discarded for now, until KNX Secure will be ready.<br/>
|
|
10
|
+
- KNXEngine: added more logs to for troubleshooting pourposes.<br/>
|
|
11
|
+
</p>
|
|
12
|
+
<p>
|
|
7
13
|
<b>Version 1.3.15</b> - Januar 2022<br/>
|
|
8
14
|
- KNXEngine: better handling of disconnection in UDP mode, allowing very old grandpa KNX/IP interfaces enough time to understand what's happening, avoiding it to go crazy.<br/>
|
|
9
15
|
- KNXEngine: corrected Curve Crypto in KNX-Secure (KNX Secure is not enabled yet!).<br/>
|
package/KNXEngine/KNXClient.js
CHANGED
|
@@ -300,7 +300,7 @@ class KNXClient extends EventEmitter {
|
|
|
300
300
|
if (this.sysLogger !== undefined && this.sysLogger !== null) this.sysLogger.error("Sending KNX packet: Send TCP Catch error: " + error.message || "Undef error");
|
|
301
301
|
try {
|
|
302
302
|
this.emit(KNXClientEvents.error, error);
|
|
303
|
-
} catch (error) {}
|
|
303
|
+
} catch (error) { }
|
|
304
304
|
}
|
|
305
305
|
}
|
|
306
306
|
}
|
|
@@ -612,7 +612,7 @@ class KNXClient extends EventEmitter {
|
|
|
612
612
|
this._heartbeatTimer = setTimeout(() => {
|
|
613
613
|
this._heartbeatTimer = null;
|
|
614
614
|
try {
|
|
615
|
-
|
|
615
|
+
if (this.sysLogger !== undefined && this.sysLogger !== null) this.sysLogger.error("KNXClient: getConnectionStatus Timeout " + this._heartbeatFailures + " out of " + this.max_HeartbeatFailures);
|
|
616
616
|
//this.emit(KNXClientEvents.error, timeoutError);
|
|
617
617
|
} catch (error) {
|
|
618
618
|
}
|
|
@@ -639,7 +639,7 @@ class KNXClient extends EventEmitter {
|
|
|
639
639
|
this._awaitingResponseType = KNXConstants.KNX_CONSTANTS.DISCONNECT_RESPONSE;
|
|
640
640
|
this._sendDisconnectRequestMessage(this._channelID);
|
|
641
641
|
//this._timerTimeoutSendDisconnectRequestMessage = setTimeout(() => {
|
|
642
|
-
|
|
642
|
+
this._setDisconnected();
|
|
643
643
|
//}, 1000 * KNXConstants.KNX_CONSTANTS.CONNECT_REQUEST_TIMEOUT);
|
|
644
644
|
}
|
|
645
645
|
isConnected() {
|
|
@@ -717,7 +717,6 @@ class KNXClient extends EventEmitter {
|
|
|
717
717
|
_processInboundMessage(msg, rinfo) {
|
|
718
718
|
|
|
719
719
|
try {
|
|
720
|
-
|
|
721
720
|
// Composing debug string
|
|
722
721
|
try {
|
|
723
722
|
if (this.sysLogger !== undefined && this.sysLogger !== null) {
|
|
@@ -730,6 +729,9 @@ class KNXClient extends EventEmitter {
|
|
|
730
729
|
}
|
|
731
730
|
} catch (error) { }
|
|
732
731
|
|
|
732
|
+
// BUGFIXING https://github.com/Supergiovane/node-red-contrib-knx-ultimate/issues/162
|
|
733
|
+
//msg = Buffer.from("0610053000102900b06011fe11150080","hex");
|
|
734
|
+
|
|
733
735
|
const { knxHeader, knxMessage } = KNXProtocol.KNXProtocol.parseMessage(msg);
|
|
734
736
|
|
|
735
737
|
// 26/12/2021 ROUTING LOST MESSAGE OR BUSY
|
|
@@ -950,11 +952,12 @@ class KNXClient extends EventEmitter {
|
|
|
950
952
|
}
|
|
951
953
|
catch (e) {
|
|
952
954
|
try {
|
|
953
|
-
if (this.sysLogger !== undefined && this.sysLogger !== null) this.sysLogger.error("Received KNX packet: Error processing inbound message: " + e.message + " " + sProcessInboundLog + " ChannelID:" + this._channelID + " Host:" + this._options.ipAddr + ":" + this._options.ipPort);
|
|
955
|
+
if (this.sysLogger !== undefined && this.sysLogger !== null) this.sysLogger.error("Received KNX packet: Error processing inbound message: " + e.message + " " + sProcessInboundLog + " ChannelID:" + this._channelID + " Host:" + this._options.ipAddr + ":" + this._options.ipPort + ". This means that KNX-Ultimate received a malformed Header or CEMI message from your KNX Gateway.");
|
|
954
956
|
} catch (error) { }
|
|
955
957
|
try {
|
|
956
|
-
|
|
957
|
-
this.
|
|
958
|
+
// 05/01/2022 Avoid disconnecting, because there are many bugged knx gateways out there!
|
|
959
|
+
//this.emit(KNXClientEvents.error, e);
|
|
960
|
+
//this._setDisconnected();
|
|
958
961
|
} catch (error) { }
|
|
959
962
|
|
|
960
963
|
}
|
|
@@ -20,15 +20,18 @@ class KNXHeader {
|
|
|
20
20
|
}
|
|
21
21
|
static createFromBuffer(buffer, offset = 0) {
|
|
22
22
|
if (buffer.length < KNXConstants.KNX_CONSTANTS.HEADER_SIZE_10) {
|
|
23
|
+
if (sysLogger !== undefined && sysLogger !== null) sysLogger.error("KNXHeader: createFromBuffer: incomplete buffer. Buffer length: " + buffer.length + " expected HEADER_SIZE_10 equals to " + KNXConstants.KNX_CONSTANTS.HEADER_SIZE_10);
|
|
23
24
|
throw new Error('Incomplete buffer');
|
|
24
25
|
}
|
|
25
26
|
const header_length = buffer.readUInt8(offset);
|
|
26
27
|
if (header_length !== KNXConstants.KNX_CONSTANTS.HEADER_SIZE_10) {
|
|
28
|
+
if (sysLogger !== undefined && sysLogger !== null) sysLogger.error("KNXHeader: createFromBuffer: invalid header_length. header_length: " + header_length + " expected HEADER_SIZE_10 equals to " + KNXConstants.KNX_CONSTANTS.HEADER_SIZE_10);
|
|
27
29
|
throw new Error(`Invalid buffer length ${header_length}`);
|
|
28
30
|
}
|
|
29
31
|
offset += 1;
|
|
30
32
|
const version = buffer.readUInt8(offset);
|
|
31
33
|
if (version !== KNXConstants.KNX_CONSTANTS.KNXNETIP_VERSION_10) {
|
|
34
|
+
if (sysLogger !== undefined && sysLogger !== null) sysLogger.error("KNXHeader: createFromBuffer: Unknown header version. Version: " + version + " expected KNXNETIP_VERSION_10 to " + KNXConstants.KNX_CONSTANTS.KNXNETIP_VERSION_10);
|
|
32
35
|
throw new Error(`Unknown version ${version}`);
|
|
33
36
|
}
|
|
34
37
|
offset += 1;
|
|
@@ -17,6 +17,7 @@ const KNXTunnelingRequest = require("./KNXTunnelingRequest");
|
|
|
17
17
|
const KNXTunnelingAck = require("./KNXTunnelingAck");
|
|
18
18
|
const KNXRoutingIndication = require("./KNXRoutingIndication"); // 07/12/2021
|
|
19
19
|
const KNXSecureSessionRequest = require("./KNXSecureSessionRequest"); // 07/12/2021
|
|
20
|
+
const sysLogger = require("./../KnxLog.js").get(); // 08/04/2021 new logger to adhere to the loglevel selected in the config-window
|
|
20
21
|
|
|
21
22
|
const HPAI = require("./HPAI");
|
|
22
23
|
|
|
@@ -3,6 +3,9 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
3
3
|
exports.NPDU = void 0;
|
|
4
4
|
const CEMIConstants = require("./CEMIConstants");
|
|
5
5
|
const KNXDataBuffer = require("../KNXDataBuffer");
|
|
6
|
+
const sysLogger = require("./../../KnxLog.js").get(); // 08/04/2021 new logger to adhere to the loglevel selected in the config-window
|
|
7
|
+
|
|
8
|
+
|
|
6
9
|
class NPDU {
|
|
7
10
|
constructor(_tpci = 0x0, _apci = 0x0, _data = null) {
|
|
8
11
|
this._tpci = _tpci;
|
|
@@ -45,7 +48,7 @@ class NPDU {
|
|
|
45
48
|
if (!(data instanceof KNXDataBuffer.KNXDataBuffer)) {
|
|
46
49
|
throw new Error('Invalid data Buffer');
|
|
47
50
|
}
|
|
48
|
-
|
|
51
|
+
|
|
49
52
|
if (data.sixBits() && data.length === 1 && data.value.readUInt8(0) < 0x3F) {
|
|
50
53
|
this.apci = (this.apci & 0xC0) | data.value.readUInt8(0);
|
|
51
54
|
this._data = null;
|
|
@@ -104,12 +107,34 @@ class NPDU {
|
|
|
104
107
|
}
|
|
105
108
|
static createFromBuffer(buffer, offset = 0) {
|
|
106
109
|
if (offset > buffer.length) {
|
|
110
|
+
if (sysLogger !== undefined && sysLogger !== null) sysLogger.error("NPDU: createFromBuffer: offset out of buffer range ");
|
|
107
111
|
throw new Error(`offset ${offset} out of buffer range ${buffer.length}`);
|
|
108
112
|
}
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
+
let npduLength = null;
|
|
114
|
+
let tpci = null;
|
|
115
|
+
let apci = null;
|
|
116
|
+
let data = null;
|
|
117
|
+
|
|
118
|
+
try {
|
|
119
|
+
npduLength = buffer.readUInt8(offset++);
|
|
120
|
+
} catch (error) {
|
|
121
|
+
if (sysLogger !== undefined && sysLogger !== null) sysLogger.error("NPDU: createFromBuffer: error npduLength: " + error.message);
|
|
122
|
+
}
|
|
123
|
+
try {
|
|
124
|
+
tpci = buffer.readUInt8(offset++);
|
|
125
|
+
} catch (error) {
|
|
126
|
+
if (sysLogger !== undefined && sysLogger !== null) sysLogger.error("NPDU: createFromBuffer: error tpci: " + error.message);
|
|
127
|
+
}
|
|
128
|
+
try {
|
|
129
|
+
apci = buffer.readUInt8(offset++);
|
|
130
|
+
} catch (error) {
|
|
131
|
+
if (sysLogger !== undefined && sysLogger !== null) sysLogger.error("NPDU: createFromBuffer: error apci: " + error.message);
|
|
132
|
+
}
|
|
133
|
+
try {
|
|
134
|
+
data = npduLength > 1 ? buffer.slice(offset, offset + npduLength - 1) : null;
|
|
135
|
+
} catch (error) {
|
|
136
|
+
if (sysLogger !== undefined && sysLogger !== null) sysLogger.error("NPDU: createFromBuffer: error data: " + error.message);
|
|
137
|
+
}
|
|
113
138
|
return new NPDU(tpci, apci, data == null ? null : new KNXDataBuffer.KNXDataBuffer(data));
|
|
114
139
|
}
|
|
115
140
|
toBuffer() {
|
package/README.md
CHANGED
|
@@ -38,7 +38,7 @@ payload = {red:255, green:200, blue:30} // Put some colors in our life
|
|
|
38
38
|
|
|
39
39
|
## KNX SECURE
|
|
40
40
|
|
|
41
|
-
KNX-Secure is under development and **should** be ready by
|
|
41
|
+
KNX-Secure is under development and **should** be ready by mid 2022. You can help me by clicking here [](https://www.paypal.me/techtoday)
|
|
42
42
|
|
|
43
43
|
## HELP, SAMPLES, TROUBLESHOOT, WIKI, FAQ, BEST PRACTICES
|
|
44
44
|
|
|
@@ -758,7 +758,9 @@ return msg;`, "helplink": "https://github.com/Supergiovane/node-red-contrib-knx-
|
|
|
758
758
|
// Start the timer to do initial read.
|
|
759
759
|
if (node.timerDoInitialRead !== null) clearTimeout(node.timerDoInitialRead);
|
|
760
760
|
node.timerDoInitialRead = setTimeout(DoInitialReadFromKNXBusOrFile, 6000); // 17/02/2020 Do initial read of all nodes requesting initial read
|
|
761
|
-
|
|
761
|
+
setTimeout(() => {
|
|
762
|
+
node.setAllClientsStatus("Connected.", "green", "On duty.")
|
|
763
|
+
}, 500);
|
|
762
764
|
if (node.sysLogger !== undefined && node.sysLogger !== null) node.sysLogger.info("knxUltimate-config: Connected to %o", info);
|
|
763
765
|
});
|
|
764
766
|
node.knxConnection.on(knx.KNXClient.KNXClientEvents.connecting, info => {
|
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.16",
|
|
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
|
"fs": "0.0.1-security",
|