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/>
@@ -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
- console.log("BANANA OH! getConnectionStatus Timeout", this._heartbeatFailures, "su", this.max_HeartbeatFailures);
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
- this._setDisconnected();
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
- this.emit(KNXClientEvents.error, e);
957
- this._setDisconnected();
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
- const npduLength = buffer.readUInt8(offset++);
110
- const tpci = buffer.readUInt8(offset++);
111
- const apci = buffer.readUInt8(offset++);
112
- const data = npduLength > 1 ? buffer.slice(offset, offset + npduLength - 1) : null;
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 the end of the year. I'm collecting money to buy a KNX Secure Router. You can help me by clicking here [![Donate via PayPal](https://img.shields.io/badge/Donate-PayPal-blue.svg?style=flat-square)](https://www.paypal.me/techtoday)
41
+ KNX-Secure is under development and **should** be ready by mid 2022. You can help me by clicking here [![Donate via PayPal](https://img.shields.io/badge/Donate-PayPal-blue.svg?style=flat-square)](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
- node.setAllClientsStatus("Connected", "green", "Wait for telegrams.")
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.15",
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",