node-red-contrib-knx-ultimate 1.3.14 → 1.3.15

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,11 @@
4
4
 
5
5
  <br/>
6
6
  <p>
7
+ <b>Version 1.3.15</b> - Januar 2022<br/>
8
+ - 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
+ - KNXEngine: corrected Curve Crypto in KNX-Secure (KNX Secure is not enabled yet!).<br/>
10
+ </p>
11
+ <p>
7
12
  <b>Version 1.3.14</b> - 26 December 2021<br/>
8
13
  - KNXEngine: ACK management: the not acknowledged message will be re-transmitted once, then the connection will be dropped, as per KNX specs.<br/>
9
14
  - KNXEngine: ACK management: the telegram's queue to be sent to the KNX BUS will be paused during the ACK waiting.<br/>
@@ -17,7 +17,7 @@ const ipAddressHelper = require("./util/ipAddressHelper");
17
17
  const KNXAddress = require("./protocol/KNXAddress").KNXAddress;
18
18
  const KNXDataBuffer = require("./protocol/KNXDataBuffer").KNXDataBuffer;
19
19
  const DPTLib = require('./dptlib');
20
- const secureKeyring = require("./KNXsecureKeyring.js");
20
+ const KNXsecureKeyring = require("./KNXsecureKeyring.js");
21
21
  //const lodash = require("lodash");
22
22
 
23
23
  var STATE;
@@ -74,7 +74,8 @@ const optionsDefaults = {
74
74
  loglevel: "info",
75
75
  localEchoInTunneling: true,
76
76
  localIPAddress: "",
77
- interface: ""
77
+ interface: "",
78
+ jKNXSecureKeyring: {}
78
79
  };
79
80
 
80
81
  class KNXClient extends EventEmitter {
@@ -92,7 +93,7 @@ class KNXClient extends EventEmitter {
92
93
  this._localPort = null;
93
94
  this._peerHost = this._options.ipAddr;
94
95
  this._peerPort = this._options.ipPort;
95
- this._timer = null;
96
+ this._connectionTimeoutTimer = null;
96
97
  this._heartbeatFailures = 0;
97
98
  this.max_HeartbeatFailures = 3;
98
99
  this._heartbeatTimer = null;
@@ -101,6 +102,7 @@ class KNXClient extends EventEmitter {
101
102
  this._processInboundMessage = this._processInboundMessage.bind(this);
102
103
  this._clientSocket = null;
103
104
  this.sysLogger = null;
105
+ this.jKNXSecureKeyring = this._options.jKNXSecureKeyring; // 28/12/2021 Contains the Keyring JSON object
104
106
  try {
105
107
  this.sysLogger = require("./KnxLog.js").get({ loglevel: this._options.loglevel }); // 08/04/2021 new logger to adhere to the loglevel selected in the config-window
106
108
  } catch (error) {
@@ -179,7 +181,7 @@ class KNXClient extends EventEmitter {
179
181
  get channelID() {
180
182
  return this._channelID;
181
183
  }
182
- // Transform the plain value "data" into a KNXDataBuffer. The datapoints without "null" are SixBits
184
+ // 16/12/2021 Transform the plain value "data" into a KNXDataBuffer. The datapoints without "null" are SixBits
183
185
  // dataPointsSixBits = {
184
186
  // DPT1,
185
187
  // DPT2,
@@ -280,7 +282,7 @@ class KNXClient extends EventEmitter {
280
282
  } catch (error) {
281
283
  if (this.sysLogger !== undefined && this.sysLogger !== null) this.sysLogger.error("Sending KNX packet: Send UDP Catch error: " + error.message + " " + typeof (knxPacket) + " seqCounter:" + knxPacket.seqCounter);
282
284
  try {
283
- //this.emit(KNXClientEvents.error, error);
285
+ this.emit(KNXClientEvents.error, error);
284
286
  } catch (error) {
285
287
  }
286
288
 
@@ -293,15 +295,12 @@ class KNXClient extends EventEmitter {
293
295
  if (this.sysLogger !== undefined && this.sysLogger !== null) this.sysLogger.error("Sending KNX packet: Send TCP sending error: " + err.message || "Undef error");
294
296
  this.emit(KNXClientEvents.error, err);
295
297
  }
296
-
297
298
  });
298
299
  } catch (error) {
299
300
  if (this.sysLogger !== undefined && this.sysLogger !== null) this.sysLogger.error("Sending KNX packet: Send TCP Catch error: " + error.message || "Undef error");
300
301
  try {
301
- //this.emit(KNXClientEvents.error, error);
302
- } catch (error) {
303
- }
304
-
302
+ this.emit(KNXClientEvents.error, error);
303
+ } catch (error) {}
305
304
  }
306
305
  }
307
306
  }
@@ -529,8 +528,8 @@ class KNXClient extends EventEmitter {
529
528
  if (this._clientSocket == null) {
530
529
  throw new Error('No client socket defined');
531
530
  }
532
- this._timer = setTimeout(() => {
533
- this._timer = null;
531
+ this._connectionTimeoutTimer = setTimeout(() => {
532
+ this._connectionTimeoutTimer = null;
534
533
  }, 1000 * KNXConstants.KNX_CONSTANTS.DEVICE_CONFIGURATION_REQUEST_TIMEOUT);
535
534
  this._awaitingResponseType = KNXConstants.KNX_CONSTANTS.DESCRIPTION_RESPONSE;
536
535
  this._sendDescriptionRequestMessage(host, port);
@@ -554,7 +553,7 @@ class KNXClient extends EventEmitter {
554
553
  this._numFailedTelegramACK = 0; // 25/12/2021 Reset the failed ACK counter
555
554
  this._clearToSend = true; // 26/12/2021 allow to send
556
555
 
557
- if (this._timer !== null) clearTimeout(this._timer);
556
+ if (this._connectionTimeoutTimer !== null) clearTimeout(this._connectionTimeoutTimer);
558
557
 
559
558
  // Emit connecting
560
559
  this.emit(KNXClientEvents.connecting, this._options);
@@ -564,8 +563,8 @@ class KNXClient extends EventEmitter {
564
563
 
565
564
  // Unicast, need to explicitly create the connection
566
565
  const timeoutError = new Error(`Connection timeout to ${this._peerHost}:${this._peerPort}`);
567
- this._timer = setTimeout(() => {
568
- this._timer = null;
566
+ this._connectionTimeoutTimer = setTimeout(() => {
567
+ this._connectionTimeoutTimer = null;
569
568
  try {
570
569
  this.emit(KNXClientEvents.error, timeoutError);
571
570
  } catch (error) {
@@ -588,7 +587,7 @@ class KNXClient extends EventEmitter {
588
587
  // }, 1000 * KNXConstants.KNX_CONSTANTS.CONNECT_REQUEST_TIMEOUT);
589
588
  conn._awaitingResponseType = KNXConstants.KNX_CONSTANTS.CONNECT_RESPONSE;
590
589
  conn._clientTunnelSeqNumber = 0;
591
- if (conn._options.isSecureKNXEnabled) conn._sendSecureSessionRequestMessage(new TunnelCRI.TunnelCRI(knxLayer));
590
+ if (conn._options.isSecureKNXEnabled) conn._sendSecureSessionRequestMessage(new TunnelCRI.TunnelCRI(knxLayer), conn.jKNXSecureKeyring);
592
591
  });
593
592
 
594
593
  } else {
@@ -637,14 +636,11 @@ class KNXClient extends EventEmitter {
637
636
  }
638
637
  this.stopHeartBeat();
639
638
  this._connectionState = STATE.DISCONNECTING;
640
- this._timer = setTimeout(() => {
641
- this._timer = null;
642
- }, 1000 * KNXConstants.KNX_CONSTANTS.CONNECT_REQUEST_TIMEOUT);
643
639
  this._awaitingResponseType = KNXConstants.KNX_CONSTANTS.DISCONNECT_RESPONSE;
644
640
  this._sendDisconnectRequestMessage(this._channelID);
645
- this._timerTimeoutSendDisconnectRequestMessage = setTimeout(() => {
641
+ //this._timerTimeoutSendDisconnectRequestMessage = setTimeout(() => {
646
642
  this._setDisconnected();
647
- }, 1000 * KNXConstants.KNX_CONSTANTS.CONNECT_REQUEST_TIMEOUT);
643
+ //}, 1000 * KNXConstants.KNX_CONSTANTS.CONNECT_REQUEST_TIMEOUT);
648
644
  }
649
645
  isConnected() {
650
646
  return this._connectionState === STATE.CONNECTED;
@@ -652,7 +648,7 @@ class KNXClient extends EventEmitter {
652
648
  _setDisconnected() {
653
649
  if (this._timerTimeoutSendDisconnectRequestMessagetimer !== null) clearTimeout(this._timerTimeoutSendDisconnectRequestMessagetimer);
654
650
  this._timerTimeoutSendDisconnectRequestMessage = null;
655
- if (this._timer !== null) clearTimeout(this._timer);
651
+ if (this._connectionTimeoutTimer !== null) clearTimeout(this._connectionTimeoutTimer);
656
652
  if (this._tunnelReqTimer !== null) clearTimeout(this._tunnelReqTimer);
657
653
  this.stopHeartBeat();
658
654
  this._connectionState = STATE.DISCONNECTED;
@@ -694,9 +690,9 @@ class KNXClient extends EventEmitter {
694
690
  }
695
691
  return this._clientTunnelSeqNumber;
696
692
  }
697
- _keyFromCEMIMessage(cEMIMessage) {
698
- return cEMIMessage.dstAddress.toString();
699
- }
693
+ // _keyFromCEMIMessage(cEMIMessage) {
694
+ // return cEMIMessage.dstAddress.toString();
695
+ // }
700
696
  _setTimerWaitingForACK(knxTunnelingRequest) {
701
697
  const timeoutErr = new errors.RequestTimeoutError(`RequestTimeoutError seqCounter:${knxTunnelingRequest.seqCounter}, DestAddr:${knxTunnelingRequest.cEMIMessage.dstAddress.toString() || "Non definito"}, AckRequested:${knxTunnelingRequest.cEMIMessage.control.ack}, timed out waiting telegram acknowledge by ${this._options.ipAddr || "No Peer host detected"}`);
702
698
  if (this._tunnelReqTimer !== null) clearTimeout(this._tunnelReqTimer);
@@ -764,8 +760,8 @@ class KNXClient extends EventEmitter {
764
760
  }
765
761
  else if (knxHeader.service_type === KNXConstants.KNX_CONSTANTS.CONNECT_RESPONSE) {
766
762
  if (this._connectionState === STATE.CONNECTING) {
767
- if (this._timer !== null) clearTimeout(this._timer);
768
- this._timer = null;
763
+ if (this._connectionTimeoutTimer !== null) clearTimeout(this._connectionTimeoutTimer);
764
+ this._connectionTimeoutTimer = null;
769
765
  const knxConnectResponse = knxMessage;
770
766
  if (knxConnectResponse.status !== KNXConstants.ConnectionStatus.E_NO_ERROR) {
771
767
  try {
@@ -942,7 +938,7 @@ class KNXClient extends EventEmitter {
942
938
  }
943
939
  }
944
940
  else {
945
- if (this._timer !== null) clearTimeout(this._timer);
941
+ if (this._connectionTimeoutTimer !== null) clearTimeout(this._connectionTimeoutTimer);
946
942
  }
947
943
  }
948
944
  try {
@@ -969,7 +965,6 @@ class KNXClient extends EventEmitter {
969
965
  this.send(KNXProtocol.KNXProtocol.newKNXDescriptionRequest(new HPAI.HPAI(this._options.localIPAddress)));
970
966
  }
971
967
  _sendSearchRequestMessage() {
972
- console.log('_sendSearchRequestMessage', this._options.localIPAddress, this._localPort);
973
968
  this.send(KNXProtocol.KNXProtocol.newKNXSearchRequest(new HPAI.HPAI(this._options.localIPAddress, this._localPort)), KNXConstants.KNX_CONSTANTS.KNX_PORT, KNXConstants.KNX_CONSTANTS.KNX_IP);
974
969
  }
975
970
  _sendConnectRequestMessage(cri) {
@@ -984,9 +979,9 @@ class KNXClient extends EventEmitter {
984
979
  _sendDisconnectResponseMessage(channelID, status = KNXConstants.ConnectionStatus.E_NO_ERROR) {
985
980
  this.send(KNXProtocol.KNXProtocol.newKNXDisconnectResponse(channelID, status));
986
981
  }
987
- _sendSecureSessionRequestMessage(cri) {
982
+ _sendSecureSessionRequestMessage(cri, jKNXSecureKeyring) {
988
983
  let oHPAI = new HPAI.HPAI("0.0.0.0", 0, this._options.hostProtocol === "TunnelTCP" ? KNXConstants.KNX_CONSTANTS.IPV4_TCP : KNXConstants.KNX_CONSTANTS.IPV4_UDP);
989
- this.send(KNXProtocol.KNXProtocol.newKNXSecureSessionRequest(cri, oHPAI));
984
+ this.send(KNXProtocol.KNXProtocol.newKNXSecureSessionRequest(cri, oHPAI, jKNXSecureKeyring));
990
985
  }
991
986
  }
992
987
 
@@ -22,7 +22,7 @@ const HPAI = require("./HPAI");
22
22
 
23
23
  class KNXProtocol {
24
24
  static parseMessage(buffer) {
25
-
25
+
26
26
  const knxHeader = KNXHeader.KNXHeader.createFromBuffer(buffer);
27
27
  const knxData = buffer.slice(knxHeader.headerLength);
28
28
  let knxMessage;
@@ -98,8 +98,8 @@ class KNXProtocol {
98
98
  static newKNXRoutingIndication(cEMIMessage) { // 18/12/2021
99
99
  return new KNXRoutingIndication.KNXRoutingIndication(cEMIMessage);
100
100
  }
101
- static newKNXSecureSessionRequest(cri, hpaiData = HPAI.HPAI.NULLHPAI) {
102
- return new KNXSecureSessionRequest.KNXSecureSessionRequest(cri, hpaiData);
101
+ static newKNXSecureSessionRequest(cri, hpaiData = HPAI.HPAI.NULLHPAI, jKNXSecureKeyring) {
102
+ return new KNXSecureSessionRequest.KNXSecureSessionRequest(cri, hpaiData, jKNXSecureKeyring);
103
103
  }
104
104
  }
105
105
  exports.KNXProtocol = KNXProtocol;
@@ -10,7 +10,7 @@ const HPAI = require("./HPAI");
10
10
  const CRIFactory = __importDefault(require("./CRIFactory"));
11
11
 
12
12
  class KNXSecureSessionRequest extends KNXPacket.KNXPacket {
13
- constructor(cri, hpaiData = HPAI.HPAI.NULLHPAI) {
13
+ constructor(cri, hpaiData = HPAI.HPAI.NULLHPAI, _jKNXSecureKeyring = {}) {
14
14
  //super(KNXConstants.KNX_CONSTANTS.SECURE_SESSION_REQUEST, hpaiControl.length + hpaiData.length + cri.length + 32);
15
15
  super(KNXConstants.KNX_CONSTANTS.SECURE_SESSION_REQUEST, hpaiData.length + 32);
16
16
  this.cri = cri;
@@ -18,16 +18,20 @@ class KNXSecureSessionRequest extends KNXPacket.KNXPacket {
18
18
  this.diffieHellmanClientPublicValue = new Buffer.alloc(32);
19
19
 
20
20
  // Send the DH curve as well
21
- let _key = ".!Pea332";
21
+ // 02/01/2022 SONO ARRIVATO QUI get the authentication password from the first tunnel of the interface
22
+ let authenticationPassword = _jKNXSecureKeyring.Devices[0].authenticationPassword;
23
+ //authenticationPassword = authenticationPassword.length === 0 ? new byte[16] : authenticationPassword;
24
+ authenticationPassword = authenticationPassword.length === 0 ? "00000000000000000000000000000000" : authenticationPassword;
25
+ let _key = authenticationPassword;
22
26
  _key = _key + new Array((32 + 1) - _key.length).join("\0");
23
- let ALICE_PRIV = Buffer.from(_key).toString("hex");
24
- let alicePriv = Uint8Array.from(Buffer.from(ALICE_PRIV, 'hex'));
27
+
28
+ let authenticationPasswordHEX = Buffer.from(_key).toString("hex");
29
+ let authenticationPasswordUint8Array = Uint8Array.from(Buffer.from(authenticationPasswordHEX, 'hex'));
25
30
  let Curve25519 = require('./../Curve25519');
26
31
  try {
27
- let secret = Curve25519.generateKeyPair(alicePriv);
28
- //console.log('BANANA Secret:', Buffer.from(secret).toString('hex'))
29
- let hexString = "f0c143e363147dc64913d736978042ef748ba448aa6ce2a1dab5ddecca919455";
30
- secret.public = Uint8Array.from(hexString.match(/.{1,2}/g).map(byte => parseInt(byte, 16)));
32
+ let secret = Curve25519.generateKeyPair(authenticationPasswordUint8Array);
33
+ //let hexString = "f0c143e363147dc64913d736978042ef748ba448aa6ce2a1dab5ddecca919455";
34
+ //secret.public = Uint8Array.from(hexString.match(/.{1,2}/g).map(byte => parseInt(byte, 16)));
31
35
  this.diffieHellmanClientPublicValue = Buffer.from(secret.public).toString('hex');
32
36
 
33
37
  } catch (error) {
package/README.md CHANGED
@@ -27,8 +27,8 @@ payload = {red:255, green:200, blue:30} // Put some colors in our life
27
27
  * **SCENE CONTROLLER node** [here](https://github.com/Supergiovane/node-red-contrib-knx-ultimate/wiki/SceneController-Configuration), The scene controller node can act as a real scene controller, with recall and save of the current scene.
28
28
  * **WATCHDOG node** [here](https://github.com/Supergiovane/node-red-contrib-knx-ultimate/wiki/7.-WatchDog-Configuration), allows notification (Email, Twitter, Telegram, Alexa, Siri, Sonos -with sonospollytts node- and so on) of KNX Bus connection errors, automatic or manual switchover to a backup KNX/IP router if the primary fails and allows you to programmatically change the config-node directly from a msg flow. It also can force the disconnection and connection of the selected Gateway from the KNX BUS.
29
29
  * **LOGGER node** [here](https://github.com/Supergiovane/node-red-contrib-knx-ultimate/wiki/Logger-Configuration), creates an XML diagnostic file, compatible with ETS. You can open it with ETS for diagnostic pourposes. Node: the Logger currently doesn't record the telegrams coming from KNX-Ultimate if you use a **KNX/IP Interface**.
30
- * **GLOBAL CONTEXT node** [here](https://github.com/Supergiovane/node-red-contrib-knx-ultimate/wiki/SampleGlobalContextNode), exposes the group addresses to a Global Context variable, to be used in function nodes.
31
- * **ALERTER node** [here](https://github.com/Supergiovane/node-red-contrib-knx-ultimate/wiki/SampleAlerter). With the Alerter node you can signal to a display or to the node-red-contrib-tts-ultimate node (audio feedback), whenever the selected devices are alerted, i.e. they have payload **true**.
30
+ * **GLOBAL CONTEXT node** [here](https://github.com/Supergiovane/node-red-contrib-knx-ultimate/wiki/GlobalVariable), exposes the group addresses to a Global Context variable, to be used in function nodes.
31
+ * **ALERTER node** [here](https://github.com/Supergiovane/node-red-contrib-knx-ultimate/wiki/Alerter-Configuration). With the Alerter node you can signal to a display or to the node-red-contrib-tts-ultimate node (audio feedback), whenever the selected devices are alerted, i.e. they have payload **true**.
32
32
 
33
33
 
34
34
  ## CHANGELOG
@@ -228,14 +228,15 @@
228
228
  <input type="text" id="node-config-input-port" style="width: 55px"><data-i18n="[Title]knxUltimate-config.properties.port_info" style="margin-left:5px;">
229
229
 
230
230
  <select id="node-config-input-hostProtocol" style="margin-left:10px; width:140px;">
231
- <option value="TunnelUDP" >Tunnel UDP (KNX Unsecure)</option>
232
- <option value="Multicast" >Multicast (KNX Unsecure)</option>
233
- <!-- KNXSECUREDAATTIVARE <option value="TunnelTCP" >Tunnel TCP (KNX Secure)</option> -->
231
+ <option value="TunnelUDP" >Tunnel UDP</option>
232
+ <option value="Multicast" >Multicast</option>
233
+ <option value="TunnelTCP" >Tunnel TCP</option>
234
234
  </select>
235
235
  </div>
236
236
 
237
237
  <!-- KNX Secure / Unsecure tabbed selector-->
238
- <div id="tabsMain" style="display: none;">
238
+ <!-- <div id="tabsMain" style="display: none;"> -->
239
+ <div id="tabsMain">
239
240
  <ul>
240
241
  <li><a href="#unsecureKNX"><i class="fa fa-circle-o"></i>&nbsp;<span data-i18n="knxUltimate-config.properties.unsecureKNX"></span></a></li>
241
242
  <li><a href="#SecureKNX"><i class="fa fa-shield"></i>&nbsp;<span data-i18n="knxUltimate-config.properties.secureKNX"></span></a></li>
@@ -259,18 +260,17 @@
259
260
  </div>
260
261
  <div class="form-row">
261
262
  <label for="node-config-input-keyringFilePassword"><i class="fa fa-shield"></i> Password</label>
262
- <input type="password" id="node-config-input-keyringFilePassword" style="width:200px;">
263
-
263
+ <input type="password" id="node-config-input-keyringFilePassword" style="width:200px;">
264
264
  </div>
265
265
  </p>
266
266
  </div>
267
267
  </div>
268
268
 
269
- <div class="form-tips" style="margin-top:11px">
269
+ <div class="form-tips" style="margin-top:11px">
270
270
  <span data-i18n="knxUltimate-config.advanced.tiphost"></span>
271
271
  </div>
272
272
 
273
- <br/>
273
+ <br/>
274
274
  <div class="form-row">
275
275
  <label for="node-config-input-KNXEthInterface" style="width: 200px">
276
276
  <i class="fa fa-wifi"></i>
@@ -151,6 +151,7 @@ return msg;`, "helplink": "https://github.com/Supergiovane/node-red-contrib-knx-
151
151
  node.timerKNXUltimateCheckState = null; // 08/10/2021 Check the state. If not connected and autoreconnect is true, retrig the connetion attempt.
152
152
  node.lockHandleTelegramQueue = false; // 12/11/2021 Lock sending telegrams if node disconnected or if already handling the queue
153
153
  node.knxConnectionProperties = null; // Retains the connection properties
154
+ node.allowLauch_initKNXConnection = true; // See the node.timerKNXUltimateCheckState function
154
155
 
155
156
  // 15/12/2021
156
157
  node.adaptProtocolBasedOnIP = () => {
@@ -192,7 +193,7 @@ return msg;`, "helplink": "https://github.com/Supergiovane/node-red-contrib-knx-
192
193
  try {
193
194
  (async () => {
194
195
  if (node.knxSecureSelected) {
195
- node.jKNXSecureKeyring = await knx.KNXSecureKeyring.load(node.keyringFileXML, node.credentials.keyringFilePassword);
196
+ node.jKNXSecureKeyring = await knx.KNXSecureKeyring.keyring.load(node.keyringFileXML, node.credentials.keyringFilePassword);
196
197
  RED.log.info("KNX-Secure: Keyring for ETS proj " + node.jKNXSecureKeyring.ETSProjectName + ", created by " + node.jKNXSecureKeyring.ETSCreatedBy + " on " + node.jKNXSecureKeyring.ETSCreated + " succesfully validated with provided password, using node " + node.name || node.id);
197
198
  } else {
198
199
  RED.log.info("KNX-Unsecure: connection to insecure interface/router using node " + node.name || node.id);
@@ -412,7 +413,6 @@ return msg;`, "helplink": "https://github.com/Supergiovane/node-red-contrib-knx-
412
413
  if (node.timerDoInitialRead !== null) clearTimeout(node.timerDoInitialRead); // 17/02/2020 Stop the initial read timer
413
414
  try {
414
415
  if (node.knxConnection !== null) node.knxConnection.Disconnect();
415
- if (node.knxConnection !== null) node.knxConnection.removeAllListeners();
416
416
  } catch (error) { }
417
417
 
418
418
  node.telegramsQueue = []; // 02/01/2020 clear the telegram queue
@@ -571,7 +571,7 @@ return msg;`, "helplink": "https://github.com/Supergiovane/node-red-contrib-knx-
571
571
 
572
572
  try {
573
573
  node.Disconnect();
574
- node.setKnxConnectionProperties();
574
+ // node.setKnxConnectionProperties(); // 28/12/2021 Commented
575
575
  node.setAllClientsStatus("CONFIG", "yellow", "KNXUltimage-config:setGatewayConfig: disconnected by new setting...");
576
576
  if (node.sysLogger !== undefined && node.sysLogger !== null) node.sysLogger.debug("KNXUltimage-config:setGatewayConfig: disconnected by setGatewayConfig. AutoReconnect = " + oldReconnect);
577
577
  } catch (error) { }
@@ -618,6 +618,7 @@ return msg;`, "helplink": "https://github.com/Supergiovane/node-red-contrib-knx-
618
618
  // loglevel: "info",
619
619
  // localEchoInTunneling: true,
620
620
  // localIPAddress: "",
621
+ // jKNXSecureKeyring: node.jKNXSecureKeyring
621
622
  // interface: ""
622
623
  // };
623
624
 
@@ -632,6 +633,7 @@ return msg;`, "helplink": "https://github.com/Supergiovane/node-red-contrib-knx-
632
633
  localEchoInTunneling: node.localEchoInTunneling, // 14/03/2020 local echo in tunneling mode (see API Supergiovane)
633
634
  hostProtocol: node.hostProtocol,
634
635
  isSecureKNXEnabled: node.knxSecureSelected,
636
+ jKNXSecureKeyring: node.jKNXSecureKeyring,
635
637
  localIPAddress: "" // Riempito da KNXEngine
636
638
  };
637
639
 
@@ -654,10 +656,12 @@ return msg;`, "helplink": "https://github.com/Supergiovane/node-red-contrib-knx-
654
656
  if (node.sysLogger !== undefined && node.sysLogger !== null) node.sysLogger.info("KNXUltimate-config: Bind KNX Bus to interface (Auto). Node " + node.name);
655
657
  }
656
658
  }
657
- node.setKnxConnectionProperties();
659
+ //node.setKnxConnectionProperties(); 28/12/2021 Commented
658
660
 
659
661
  node.initKNXConnection = () => {
660
662
 
663
+ node.setKnxConnectionProperties(); //28/12/2021 Added
664
+
661
665
  // 12/08/2021 Avoid start connection if there are no knx-ultimate nodes linked to this gateway
662
666
  // 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.
663
667
  if (node.nodeClients.length === 0) {
@@ -684,6 +688,7 @@ return msg;`, "helplink": "https://github.com/Supergiovane/node-red-contrib-knx-
684
688
  }
685
689
 
686
690
  try {
691
+ // 02/01/2022 This is important to free the tunnel in case of hard disconnection.
687
692
  node.Disconnect();
688
693
  } catch (error) {
689
694
  //console.log(error)
@@ -707,38 +712,28 @@ return msg;`, "helplink": "https://github.com/Supergiovane/node-red-contrib-knx-
707
712
  break;
708
713
  }
709
714
 
710
- // node.knxConnectionProperties must be:
711
- // const optionsDefaults = {
712
- // physAddr: '15.15.200',
713
- // connectionKeepAliveTimeout: KNXConstants.KNX_CONSTANTS.CONNECTION_ALIVE_TIME,
714
- // ipAddr: "224.0.23.12",
715
- // ipPort: 3671,
716
- // hostProtocol: "TunnelUDP", // TunnelUDP, TunnelTCP, Multicast
717
- // isSecureKNXEnabled: false,
718
- // suppress_ack_ldatareq: false,
719
- // loglevel: "info",
720
- // localEchoInTunneling: true,
721
- // localIPAddress: "",
722
- // interface: ""
723
- // };
724
- node.knxConnection = new knx.KNXClient(node.knxConnectionProperties);
725
-
726
- // Unsetting handlers
715
+ // Unsetting handlers if node.knxConnection was existing
727
716
  try {
728
- node.knxConnection.removeAllListeners();
717
+ if (node.knxConnection !== null && node.knxConnection !== undefined) {
718
+ if (node.sysLogger !== undefined && node.sysLogger !== null) node.sysLogger.debug("knxUltimate-config: removing old handlers. Node " + node.name);
719
+ node.knxConnection.removeAllListeners();
720
+ }
729
721
  } catch (error) {
730
722
  console.log("BANANA ERRORINO", error);
731
723
  }
732
724
 
725
+ node.knxConnection = new knx.KNXClient(node.knxConnectionProperties);
726
+
727
+
733
728
  // Setting handlers
734
729
  // ######################################
735
730
  node.knxConnection.on(knx.KNXClient.KNXClientEvents.indication, handleBusEvents);
736
731
  node.knxConnection.on(knx.KNXClient.KNXClientEvents.error, err => {
737
732
  saveExposedGAs(); // 13/12/2021 save the current values of GA payload
738
- node.setAllClientsStatus("Disconnected by " + (err.message === undefined ? err : err.message), "red", "");
739
733
  node.telegramsQueue = [];
740
734
  node.linkStatus = "disconnected";
741
- if (node.sysLogger !== undefined && node.sysLogger !== null) node.sysLogger.error("knxUltimate-config: Disconnected by " + (err.message === undefined ? err : err.message));
735
+ node.setAllClientsStatus("Disconnected by error " + (err.message === undefined ? err : err.message), "red", "");
736
+ if (node.sysLogger !== undefined && node.sysLogger !== null) node.sysLogger.error("knxUltimate-config: Disconnected by: " + (err.message === undefined ? err : err.message));
742
737
  });
743
738
  // Call discoverCB when a knx gateway has been discovered.
744
739
  node.knxConnection.on(knx.KNXClient.KNXClientEvents.discover, info => {
@@ -750,6 +745,7 @@ return msg;`, "helplink": "https://github.com/Supergiovane/node-red-contrib-knx-
750
745
  node.telegramsQueue = [];
751
746
  if (node.linkStatus !== "disconnected") {
752
747
  node.linkStatus = "disconnected";
748
+ node.setAllClientsStatus("Disconnected by event: " + info || "", "red", "");
753
749
  if (node.sysLogger !== undefined && node.sysLogger !== null) node.sysLogger.warn("knxUltimate-config: Disconnected event %s", info);
754
750
  }
755
751
  });
@@ -757,13 +753,13 @@ return msg;`, "helplink": "https://github.com/Supergiovane/node-red-contrib-knx-
757
753
  if (node.sysLogger !== undefined && node.sysLogger !== null) node.sysLogger.debug("knxUltimate-config: KNXClient socket closed.");
758
754
  });
759
755
  node.knxConnection.on(knx.KNXClient.KNXClientEvents.connected, info => {
760
- if (node.sysLogger !== undefined && node.sysLogger !== null) node.sysLogger.info("knxUltimate-config: Connected to %o", info);
761
756
  node.telegramsQueue = []; // 01/10/2020 Supergiovane: clear the telegram queue
762
757
  node.linkStatus = "connected";
763
758
  // Start the timer to do initial read.
764
759
  if (node.timerDoInitialRead !== null) clearTimeout(node.timerDoInitialRead);
765
760
  node.timerDoInitialRead = setTimeout(DoInitialReadFromKNXBusOrFile, 6000); // 17/02/2020 Do initial read of all nodes requesting initial read
766
- node.setAllClientsStatus(node.linkStatus.charAt(0).toUpperCase() + node.linkStatus.slice(1) || "", "green", "Wait for telegrams.")
761
+ node.setAllClientsStatus("Connected", "green", "Wait for telegrams.")
762
+ if (node.sysLogger !== undefined && node.sysLogger !== null) node.sysLogger.info("knxUltimate-config: Connected to %o", info);
767
763
  });
768
764
  node.knxConnection.on(knx.KNXClient.KNXClientEvents.connecting, info => {
769
765
  node.telegramsQueue = []; // 01/10/2020 Supergiovane: clear the telegram queue
@@ -776,7 +772,6 @@ return msg;`, "helplink": "https://github.com/Supergiovane/node-red-contrib-knx-
776
772
  // ######################################
777
773
 
778
774
  node.setAllClientsStatus("Connecting... ", "grey", "");
779
- if (node.sysLogger !== undefined && node.sysLogger !== null) node.sysLogger.info("knxUltimate-config: connecting... " + node.name);
780
775
  if (node.sysLogger !== undefined && node.sysLogger !== null) node.sysLogger.info("knxUltimate-config: perform websocket connection on " + node.name);
781
776
  try {
782
777
  if (node.sysLogger !== undefined && node.sysLogger !== null) node.sysLogger.info("KNXUltimate-config: Connecting... " + node.name);
@@ -1102,7 +1097,7 @@ return msg;`, "helplink": "https://github.com/Supergiovane/node-red-contrib-knx-
1102
1097
  node.lockHandleTelegramQueue = false; // Unlock the function
1103
1098
  if (node.telegramsQueue.length > 0) {
1104
1099
  if (node.sysLogger !== undefined && node.sysLogger !== null) node.sysLogger.warn("knxUltimate-config: handleTelegramQueue: the KNXEngine is busy or is waiting for a telegram ACK with seqNumner " + node.knxConnection._getSeqNumber() + ". Delay handling queue.");
1105
- }
1100
+ }
1106
1101
  return;
1107
1102
  }
1108
1103
 
@@ -1752,8 +1747,25 @@ return msg;`, "helplink": "https://github.com/Supergiovane/node-red-contrib-knx-
1752
1747
  if (node.sysLogger !== undefined && node.sysLogger !== null) node.sysLogger.info("KNXUltimate-config: Autoconnection: " + (node.autoReconnect === false ? "no." : "yes") + " Node " + node.name);
1753
1748
  if (node.timerKNXUltimateCheckState !== null) clearInterval(node.timerKNXUltimateCheckState);
1754
1749
  node.timerKNXUltimateCheckState = setInterval(() => {
1755
- if (node.linkStatus === "disconnected" && node.autoReconnect) node.initKNXConnection();
1756
- }, 10000);
1750
+ // If the node is disconnected, wait another cycle, then reconnects
1751
+ if (node.allowLauch_initKNXConnection && node.autoReconnect) {
1752
+ node.allowLauch_initKNXConnection = false;
1753
+ setTimeout(() => {
1754
+ node.setAllClientsStatus("Auto reconnect in progress...", "grey", "");
1755
+ }, 100);
1756
+ if (node.sysLogger !== undefined && node.sysLogger !== null) node.sysLogger.debug("knxUltimate-config: Auto Reconect by timerKNXUltimateCheckState in progress. node.LinkStatus:" + node.linkStatus + ", node.autoReconnect:" + node.autoReconnect);
1757
+ node.initKNXConnection();
1758
+ return;
1759
+ }
1760
+ if (node.linkStatus === "disconnected" && node.autoReconnect) {
1761
+ node.allowLauch_initKNXConnection = true; // Next cycle, launch initKNXConnection, so it pauses more and leave more time
1762
+ setTimeout(() => {
1763
+ node.setAllClientsStatus("Next cycle will reconnect...", "grey", "");
1764
+ }, 1000);
1765
+ if (node.sysLogger !== undefined && node.sysLogger !== null) node.sysLogger.debug("knxUltimate-config: Waiting next cycle to reconect. node.LinkStatus:" + node.linkStatus + ", node.autoReconnect:" + node.autoReconnect);
1766
+ //node.initKNXConnection();
1767
+ }
1768
+ }, 15000);
1757
1769
 
1758
1770
 
1759
1771
 
@@ -30,7 +30,7 @@
30
30
  label: function () {
31
31
  return (this.outputRBE == true ? "|rbe| " : "") + (this.name || this.topic || "KNX Device") + (this.inputRBE == true ? " |rbe|" : "")
32
32
  },
33
- paletteLabel: "KNX Device",
33
+ paletteLabel: "KNX DEVICE",
34
34
  // button: {
35
35
  // enabled: function() {
36
36
  // // return whether or not the button is enabled, based on the current
@@ -49,6 +49,15 @@
49
49
  var node = this;
50
50
  var oNodeServer = RED.nodes.node($("#node-input-server").val()); // Store the config-node
51
51
 
52
+ if (oNodeServer === undefined) {
53
+ // Show the DEPLOY FIRST message
54
+ $("#divDeployFirst").show();
55
+ $("#divMain").hide();
56
+ }else{
57
+ $("#divDeployFirst").hide();
58
+ $("#divMain").show();
59
+ }
60
+
52
61
  if (oNodeServer.knxSecureSelected) {
53
62
  $("#divknxsecure").show();
54
63
  } else {
@@ -363,230 +372,242 @@
363
372
  <br /><br />
364
373
 
365
374
  <label for="node-input-server">
366
- <span id="divknxsecure"><font color="green" size="4px"><i class="fa fa-shield" aria-hidden="true"></i></font></span>&nbsp;<span><i class="fa fa-circle-o" aria-hidden="true"></i></font></span>
375
+ <span id="divknxsecure">
376
+ <font color="green" size="4px"><i class="fa fa-shield" aria-hidden="true"></i></font>
377
+ </span>&nbsp;<span><i class="fa fa-circle-o" aria-hidden="true"></i></font></span>
367
378
  <span data-i18n="knxUltimate.properties.node-input-server"></span>
368
379
  </label>
369
380
  <input type="text" id="node-input-server" />
370
381
  </div>
371
- <div id="GAandDPT">
372
- <div class="form-row">
373
- <label for="node-input-topic">
374
- <img
375
- src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAwAAAAMCAYAAABWdVznAAAACXBIWXMAAB7CAAAewgFu0HU+AAAF6WlUWHRYTUw6Y29tLmFkb2JlLnhtcAAAAAAAPD94cGFja2V0IGJlZ2luPSLvu78iIGlkPSJXNU0wTXBDZWhpSHpyZVN6TlRjemtjOWQiPz4gPHg6eG1wbWV0YSB4bWxuczp4PSJhZG9iZTpuczptZXRhLyIgeDp4bXB0az0iQWRvYmUgWE1QIENvcmUgNS42LWMxNDggNzkuMTY0MDM2LCAyMDE5LzA4LzEzLTAxOjA2OjU3ICAgICAgICAiPiA8cmRmOlJERiB4bWxuczpyZGY9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkvMDIvMjItcmRmLXN5bnRheC1ucyMiPiA8cmRmOkRlc2NyaXB0aW9uIHJkZjphYm91dD0iIiB4bWxuczp4bXA9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC8iIHhtbG5zOmRjPSJodHRwOi8vcHVybC5vcmcvZGMvZWxlbWVudHMvMS4xLyIgeG1sbnM6cGhvdG9zaG9wPSJodHRwOi8vbnMuYWRvYmUuY29tL3Bob3Rvc2hvcC8xLjAvIiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RFdnQ9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZUV2ZW50IyIgeG1wOkNyZWF0b3JUb29sPSJBZG9iZSBQaG90b3Nob3AgMjEuMSAoTWFjaW50b3NoKSIgeG1wOkNyZWF0ZURhdGU9IjIwMjAtMDMtMjNUMTY6MjE6MDkrMDE6MDAiIHhtcDpNb2RpZnlEYXRlPSIyMDIwLTAzLTIzVDE2OjI4OjI3KzAxOjAwIiB4bXA6TWV0YWRhdGFEYXRlPSIyMDIwLTAzLTIzVDE2OjI4OjI3KzAxOjAwIiBkYzpmb3JtYXQ9ImltYWdlL3BuZyIgcGhvdG9zaG9wOkNvbG9yTW9kZT0iMyIgcGhvdG9zaG9wOklDQ1Byb2ZpbGU9InNSR0IgSUVDNjE5NjYtMi4xIiB4bXBNTTpJbnN0YW5jZUlEPSJ4bXAuaWlkOjc4M2I5OWIxLTkwMjYtNGQ2OC05N2FmLTRkM2E2ZWY4Zjk2OCIgeG1wTU06RG9jdW1lbnRJRD0ieG1wLmRpZDo4N2E3YTg0NS0xMDljLTRkMTMtOGEzOS04OWVhOTMyMDQ0ZWMiIHhtcE1NOk9yaWdpbmFsRG9jdW1lbnRJRD0ieG1wLmRpZDo4N2E3YTg0NS0xMDljLTRkMTMtOGEzOS04OWVhOTMyMDQ0ZWMiPiA8eG1wTU06SGlzdG9yeT4gPHJkZjpTZXE+IDxyZGY6bGkgc3RFdnQ6YWN0aW9uPSJjcmVhdGVkIiBzdEV2dDppbnN0YW5jZUlEPSJ4bXAuaWlkOjg3YTdhODQ1LTEwOWMtNGQxMy04YTM5LTg5ZWE5MzIwNDRlYyIgc3RFdnQ6d2hlbj0iMjAyMC0wMy0yM1QxNjoyMTowOSswMTowMCIgc3RFdnQ6c29mdHdhcmVBZ2VudD0iQWRvYmUgUGhvdG9zaG9wIDIxLjEgKE1hY2ludG9zaCkiLz4gPHJkZjpsaSBzdEV2dDphY3Rpb249InNhdmVkIiBzdEV2dDppbnN0YW5jZUlEPSJ4bXAuaWlkOjc4M2I5OWIxLTkwMjYtNGQ2OC05N2FmLTRkM2E2ZWY4Zjk2OCIgc3RFdnQ6d2hlbj0iMjAyMC0wMy0yM1QxNjoyODoyNyswMTowMCIgc3RFdnQ6c29mdHdhcmVBZ2VudD0iQWRvYmUgUGhvdG9zaG9wIDIxLjEgKE1hY2ludG9zaCkiIHN0RXZ0OmNoYW5nZWQ9Ii8iLz4gPC9yZGY6U2VxPiA8L3htcE1NOkhpc3Rvcnk+IDwvcmRmOkRlc2NyaXB0aW9uPiA8L3JkZjpSREY+IDwveDp4bXBtZXRhPiA8P3hwYWNrZXQgZW5kPSJyIj8+DGyPFQAAAE9JREFUKJG1UEEOACAIgub/v2yHalnJVoe4uIEKSgccJ9jroVmjA0+ujZtWku3DgZmgBiT4egN9CmmEAAfA/5HUW0OQu7dKmOCzmM3k9YYKZv8ZEZ/YgNsAAAAASUVORK5CYII="></img>
376
- <span data-i18n="knxUltimate.properties.node-input-topic"></span>
377
- </label>
378
- <input style="width:60%" type="text" id="node-input-topic" placeholder="Ex: 1/1/1" />
379
- </div>
380
- <div class="form-row">
381
- <label for="node-input-dpt">
382
- <img
383
- src="data:image/png;base64,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"></img>
384
- <span data-i18n="knxUltimate.properties.node-input-dpt"></span>
385
- </label>
386
- <select style="width:40%" id="node-input-dpt"></select>
387
- <span id="sampleCodeAccordionWebPage" style="color:red;" />
388
382
 
389
- </div>
390
- </div>
391
- <div class="form-row">
392
- <label for="node-input-name">
393
- <i class="fa fa-tag"></i>
394
- <span data-i18n="knxUltimate.properties.node-input-name"></span>
395
- </label>
396
- <input type="text" id="node-input-name" data-i18n="[placeholder]knxUltimate.properties.node-input-name" />
397
- </div>
398
- <div class="form-row" id="divTopic">
399
- <label for="node-input-outputtopic">
400
- <i class="fa fa-tasks"></i>
401
- <span data-i18n="knxUltimate.properties.node-input-outputtopic"></span>
402
- </label>
403
- <input type="text" id="node-input-outputtopic" data-i18n="[placeholder]knxUltimate.placeholder.leaveempty" />
404
- </div>
405
- <div class="form-row">
406
- <input type="checkbox" id="node-input-listenallga" style="display:inline-block; width:auto; vertical-align:top;" />
407
- <label style="width:auto" for="node-input-listenallga">
408
- <img
409
- src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAwAAAAMCAYAAABWdVznAAAACXBIWXMAAB7CAAAewgFu0HU+AAAFGmlUWHRYTUw6Y29tLmFkb2JlLnhtcAAAAAAAPD94cGFja2V0IGJlZ2luPSLvu78iIGlkPSJXNU0wTXBDZWhpSHpyZVN6TlRjemtjOWQiPz4gPHg6eG1wbWV0YSB4bWxuczp4PSJhZG9iZTpuczptZXRhLyIgeDp4bXB0az0iQWRvYmUgWE1QIENvcmUgNS42LWMxNDggNzkuMTY0MDM2LCAyMDE5LzA4LzEzLTAxOjA2OjU3ICAgICAgICAiPiA8cmRmOlJERiB4bWxuczpyZGY9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkvMDIvMjItcmRmLXN5bnRheC1ucyMiPiA8cmRmOkRlc2NyaXB0aW9uIHJkZjphYm91dD0iIiB4bWxuczp4bXA9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC8iIHhtbG5zOmRjPSJodHRwOi8vcHVybC5vcmcvZGMvZWxlbWVudHMvMS4xLyIgeG1sbnM6cGhvdG9zaG9wPSJodHRwOi8vbnMuYWRvYmUuY29tL3Bob3Rvc2hvcC8xLjAvIiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RFdnQ9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZUV2ZW50IyIgeG1wOkNyZWF0b3JUb29sPSJBZG9iZSBQaG90b3Nob3AgMjEuMSAoTWFjaW50b3NoKSIgeG1wOkNyZWF0ZURhdGU9IjIwMjAtMDMtMjNUMTY6MjM6MjMrMDE6MDAiIHhtcDpNb2RpZnlEYXRlPSIyMDIwLTAzLTIzVDE2OjI1OjM0KzAxOjAwIiB4bXA6TWV0YWRhdGFEYXRlPSIyMDIwLTAzLTIzVDE2OjI1OjM0KzAxOjAwIiBkYzpmb3JtYXQ9ImltYWdlL3BuZyIgcGhvdG9zaG9wOkNvbG9yTW9kZT0iMyIgcGhvdG9zaG9wOklDQ1Byb2ZpbGU9InNSR0IgSUVDNjE5NjYtMi4xIiB4bXBNTTpJbnN0YW5jZUlEPSJ4bXAuaWlkOmJmNGM3NWVjLTIwNGYtNGY1YS05YTMxLTQ5NTU5YWJmZDE4NSIgeG1wTU06RG9jdW1lbnRJRD0ieG1wLmRpZDpiZjRjNzVlYy0yMDRmLTRmNWEtOWEzMS00OTU1OWFiZmQxODUiIHhtcE1NOk9yaWdpbmFsRG9jdW1lbnRJRD0ieG1wLmRpZDpiZjRjNzVlYy0yMDRmLTRmNWEtOWEzMS00OTU1OWFiZmQxODUiPiA8eG1wTU06SGlzdG9yeT4gPHJkZjpTZXE+IDxyZGY6bGkgc3RFdnQ6YWN0aW9uPSJjcmVhdGVkIiBzdEV2dDppbnN0YW5jZUlEPSJ4bXAuaWlkOmJmNGM3NWVjLTIwNGYtNGY1YS05YTMxLTQ5NTU5YWJmZDE4NSIgc3RFdnQ6d2hlbj0iMjAyMC0wMy0yM1QxNjoyMzoyMyswMTowMCIgc3RFdnQ6c29mdHdhcmVBZ2VudD0iQWRvYmUgUGhvdG9zaG9wIDIxLjEgKE1hY2ludG9zaCkiLz4gPC9yZGY6U2VxPiA8L3htcE1NOkhpc3Rvcnk+IDwvcmRmOkRlc2NyaXB0aW9uPiA8L3JkZjpSREY+IDwveDp4bXBtZXRhPiA8P3hwYWNrZXQgZW5kPSJyIj8+nhtLUgAAAE9JREFUKJG1UMsOACAIgub//7IdqvVQtjrExU1EEQLuiGCvgTNgl5D74MmVZPu4wIxQAgm+/sDec2VhgQPgf0sq1unjMlYJE/3MZrvy+kMFZQkZEWfC7ikAAAAASUVORK5CYII="></img>
410
- <span data-i18n="knxUltimate.properties.node-input-listenallga"></span>
411
- </label>
412
- <!-- <div id="helpallga">Some Content Here</div> -->
413
- </div>
414
-
415
- <div id="sampleCodeAccordion">
416
- <h3><i class="fa fa-code"></i>&nbsp;<span data-i18n="knxUltimate.advanced.Sample"></span></h3>
417
- <div style="height:180px;min-height:150px;padding:5px;">
418
- <div style="height:80%;width:100%;padding:0px;" class="node-text-editor" id="example-editor"></div>
419
- </div>
420
- </div>
383
+ <div id="divMain">
421
384
 
422
- <div id="advancedOptionsAccordion">
423
- <h3><i class="fa fa-braille"></i>&nbsp;<span data-i18n="knxUltimate.advanced.Advancedoptions"></span></h3>
424
- <div class="form-row" style="padding:10px">
425
- <div class="form-row">
426
- <label style="width:230px" for="node-input-passthrough">
427
- <i class="fa fa-long-arrow-right"></i>
428
- <span data-i18n="knxUltimate.properties.node-input-passthrough"></span>
429
- </label>
430
- <select style="width:92px" id="node-input-passthrough">
431
- <option value="no" data-i18n="knxUltimate.selectlists.passthrough_No"></option>
432
- <option value="yes" data-i18n="knxUltimate.selectlists.passthrough_Leave"></option>
433
- <option value="yesownprop" data-i18n="knxUltimate.selectlists.passthrough_OwnProp"></option>
434
- </select>
435
- </div>
436
- <br />
385
+ <div id="GAandDPT">
437
386
  <div class="form-row">
438
- <dt>
439
- <i class="fa fa-arrow-right"></i>|
440
- <span data-i18n="knxUltimate.advanced.OUTPUT"></span>
441
- </dt>
442
- </div>
443
- <div class="form-row">
444
- &nbsp;&nbsp;<label for="node-input-outputtype">
445
- <i class="fa fa-paper-plane-o"></i>
446
- <span data-i18n="knxUltimate.properties.node-input-outputtype"></span>
447
- </label>
448
- <select id="node-input-outputtype">
449
- <option value="write" data-i18n="knxUltimate.selectlists.Output_write"></option>
450
- <option value="response" data-i18n="knxUltimate.selectlists.Output_response"></option>
451
- <option value="read" data-i18n="knxUltimate.selectlists.Output_read"></option>
452
- <option value="update" data-i18n="knxUltimate.selectlists.Output_update"></option>
453
- </select>
454
- </div>
455
- <div class="form-row" id="divOutputRBE">
456
- &nbsp;&nbsp;<input type="checkbox" id="node-input-outputRBE"
457
- style="display:inline-block; width:auto; vertical-align:top;" />
458
- <label style="width:85%" for="node-input-outputRBE">
459
- <i class="fa fa-filter"></i>
460
- <span data-i18n="knxUltimate.properties.node-input-outputRBE"></span>
387
+ <label for="node-input-topic">
388
+ <img
389
+ src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAwAAAAMCAYAAABWdVznAAAACXBIWXMAAB7CAAAewgFu0HU+AAAF6WlUWHRYTUw6Y29tLmFkb2JlLnhtcAAAAAAAPD94cGFja2V0IGJlZ2luPSLvu78iIGlkPSJXNU0wTXBDZWhpSHpyZVN6TlRjemtjOWQiPz4gPHg6eG1wbWV0YSB4bWxuczp4PSJhZG9iZTpuczptZXRhLyIgeDp4bXB0az0iQWRvYmUgWE1QIENvcmUgNS42LWMxNDggNzkuMTY0MDM2LCAyMDE5LzA4LzEzLTAxOjA2OjU3ICAgICAgICAiPiA8cmRmOlJERiB4bWxuczpyZGY9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkvMDIvMjItcmRmLXN5bnRheC1ucyMiPiA8cmRmOkRlc2NyaXB0aW9uIHJkZjphYm91dD0iIiB4bWxuczp4bXA9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC8iIHhtbG5zOmRjPSJodHRwOi8vcHVybC5vcmcvZGMvZWxlbWVudHMvMS4xLyIgeG1sbnM6cGhvdG9zaG9wPSJodHRwOi8vbnMuYWRvYmUuY29tL3Bob3Rvc2hvcC8xLjAvIiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RFdnQ9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZUV2ZW50IyIgeG1wOkNyZWF0b3JUb29sPSJBZG9iZSBQaG90b3Nob3AgMjEuMSAoTWFjaW50b3NoKSIgeG1wOkNyZWF0ZURhdGU9IjIwMjAtMDMtMjNUMTY6MjE6MDkrMDE6MDAiIHhtcDpNb2RpZnlEYXRlPSIyMDIwLTAzLTIzVDE2OjI4OjI3KzAxOjAwIiB4bXA6TWV0YWRhdGFEYXRlPSIyMDIwLTAzLTIzVDE2OjI4OjI3KzAxOjAwIiBkYzpmb3JtYXQ9ImltYWdlL3BuZyIgcGhvdG9zaG9wOkNvbG9yTW9kZT0iMyIgcGhvdG9zaG9wOklDQ1Byb2ZpbGU9InNSR0IgSUVDNjE5NjYtMi4xIiB4bXBNTTpJbnN0YW5jZUlEPSJ4bXAuaWlkOjc4M2I5OWIxLTkwMjYtNGQ2OC05N2FmLTRkM2E2ZWY4Zjk2OCIgeG1wTU06RG9jdW1lbnRJRD0ieG1wLmRpZDo4N2E3YTg0NS0xMDljLTRkMTMtOGEzOS04OWVhOTMyMDQ0ZWMiIHhtcE1NOk9yaWdpbmFsRG9jdW1lbnRJRD0ieG1wLmRpZDo4N2E3YTg0NS0xMDljLTRkMTMtOGEzOS04OWVhOTMyMDQ0ZWMiPiA8eG1wTU06SGlzdG9yeT4gPHJkZjpTZXE+IDxyZGY6bGkgc3RFdnQ6YWN0aW9uPSJjcmVhdGVkIiBzdEV2dDppbnN0YW5jZUlEPSJ4bXAuaWlkOjg3YTdhODQ1LTEwOWMtNGQxMy04YTM5LTg5ZWE5MzIwNDRlYyIgc3RFdnQ6d2hlbj0iMjAyMC0wMy0yM1QxNjoyMTowOSswMTowMCIgc3RFdnQ6c29mdHdhcmVBZ2VudD0iQWRvYmUgUGhvdG9zaG9wIDIxLjEgKE1hY2ludG9zaCkiLz4gPHJkZjpsaSBzdEV2dDphY3Rpb249InNhdmVkIiBzdEV2dDppbnN0YW5jZUlEPSJ4bXAuaWlkOjc4M2I5OWIxLTkwMjYtNGQ2OC05N2FmLTRkM2E2ZWY4Zjk2OCIgc3RFdnQ6d2hlbj0iMjAyMC0wMy0yM1QxNjoyODoyNyswMTowMCIgc3RFdnQ6c29mdHdhcmVBZ2VudD0iQWRvYmUgUGhvdG9zaG9wIDIxLjEgKE1hY2ludG9zaCkiIHN0RXZ0OmNoYW5nZWQ9Ii8iLz4gPC9yZGY6U2VxPiA8L3htcE1NOkhpc3Rvcnk+IDwvcmRmOkRlc2NyaXB0aW9uPiA8L3JkZjpSREY+IDwveDp4bXBtZXRhPiA8P3hwYWNrZXQgZW5kPSJyIj8+DGyPFQAAAE9JREFUKJG1UEEOACAIgub/v2yHalnJVoe4uIEKSgccJ9jroVmjA0+ujZtWku3DgZmgBiT4egN9CmmEAAfA/5HUW0OQu7dKmOCzmM3k9YYKZv8ZEZ/YgNsAAAAASUVORK5CYII="></img>
390
+ <span data-i18n="knxUltimate.properties.node-input-topic"></span>
461
391
  </label>
392
+ <input style="width:60%" type="text" id="node-input-topic" placeholder="Ex: 1/1/1" />
462
393
  </div>
463
- <br />
464
394
  <div class="form-row">
465
- <dt>
466
- |<i class="fa fa-arrow-right"></i>
467
- <span data-i18n="knxUltimate.advanced.INPUT"></span>
468
- </dt>
469
- </div>
470
- <div class="form-row" id="divNode-input-initialread">
471
- &nbsp;&nbsp;<label style="width:70%" for="node-input-initialread">
472
- <i class="fa fa-question-circle-o"></i>
473
- <span data-i18n="knxUltimate.properties.node-input-initialread"></span>
395
+ <label for="node-input-dpt">
396
+ <img
397
+ src="data:image/png;base64,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"></img>
398
+ <span data-i18n="knxUltimate.properties.node-input-dpt"></span>
474
399
  </label>
475
- <select style="width:100px" id="node-input-initialread">
476
- <option value=0 data-i18n="knxUltimate.properties.node-input-initialread0"></option>
477
- <option value=1 data-i18n="knxUltimate.properties.node-input-initialread1"></option>
478
- <option value=2 data-i18n="knxUltimate.properties.node-input-initialread2"></option>
479
- <option value=3 data-i18n="knxUltimate.properties.node-input-initialread3"></option>
480
- </select>
400
+ <select style="width:40%" id="node-input-dpt"></select>
401
+ <span id="sampleCodeAccordionWebPage" style="color:red;" />
481
402
 
482
403
  </div>
483
- <div class="form-row" id="divInputRBE">
484
- &nbsp;&nbsp;<input type="checkbox" id="node-input-inputRBE"
485
- style="display:inline-block; width:auto; vertical-align:top;" />
486
- <label style="width:85%" for="node-input-inputRBE">
487
- <i class="fa fa-filter"></i>
488
- <span data-i18n="knxUltimate.properties.node-input-inputRBE"></span>
489
- </label>
490
- </div>
491
- <div class="form-row">
492
- &nbsp;&nbsp;<input type="checkbox" id="node-input-notifywrite"
493
- style="display:inline-block; width:auto; vertical-align:top;" />
494
- <label style="width:85%" for="node-input-notifywrite">
495
- <i class="fa fa-sign-in"></i>
496
- <span data-i18n="knxUltimate.properties.node-input-notifywrite"></span>
497
- </label>
498
- </div>
499
- <div class="form-row">
500
- &nbsp;&nbsp;<input type="checkbox" id="node-input-notifyresponse"
501
- style="display:inline-block; width:auto; vertical-align:top;" />
502
- <label style="width:85%" for="node-input-notifyresponse">
503
- <i class="fa fa-sign-in"></i>
504
- <span data-i18n="knxUltimate.properties.node-input-notifyresponse"></span>
505
- </label>
506
- </div>
507
- <div class="form-row">
508
- &nbsp;&nbsp;<input type="checkbox" id="node-input-notifyreadrequest"
509
- style="display:inline-block; width:auto; vertical-align:top;" />
510
- <label style="width:85%" for="node-input-notifyreadrequest">
511
- <i class="fa fa-sign-in"></i>
512
- <span data-i18n="knxUltimate.properties.node-input-notifyreadrequest"></span>
513
- </label>
514
- </div>
404
+ </div>
405
+ <div class="form-row">
406
+ <label for="node-input-name">
407
+ <i class="fa fa-tag"></i>
408
+ <span data-i18n="knxUltimate.properties.node-input-name"></span>
409
+ </label>
410
+ <input type="text" id="node-input-name" data-i18n="[placeholder]knxUltimate.properties.node-input-name" />
411
+ </div>
412
+ <div class="form-row" id="divTopic">
413
+ <label for="node-input-outputtopic">
414
+ <i class="fa fa-tasks"></i>
415
+ <span data-i18n="knxUltimate.properties.node-input-outputtopic"></span>
416
+ </label>
417
+ <input type="text" id="node-input-outputtopic" data-i18n="[placeholder]knxUltimate.placeholder.leaveempty" />
418
+ </div>
419
+ <div class="form-row">
420
+ <input type="checkbox" id="node-input-listenallga" style="display:inline-block; width:auto; vertical-align:top;" />
421
+ <label style="width:auto" for="node-input-listenallga">
422
+ <img
423
+ src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAwAAAAMCAYAAABWdVznAAAACXBIWXMAAB7CAAAewgFu0HU+AAAFGmlUWHRYTUw6Y29tLmFkb2JlLnhtcAAAAAAAPD94cGFja2V0IGJlZ2luPSLvu78iIGlkPSJXNU0wTXBDZWhpSHpyZVN6TlRjemtjOWQiPz4gPHg6eG1wbWV0YSB4bWxuczp4PSJhZG9iZTpuczptZXRhLyIgeDp4bXB0az0iQWRvYmUgWE1QIENvcmUgNS42LWMxNDggNzkuMTY0MDM2LCAyMDE5LzA4LzEzLTAxOjA2OjU3ICAgICAgICAiPiA8cmRmOlJERiB4bWxuczpyZGY9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkvMDIvMjItcmRmLXN5bnRheC1ucyMiPiA8cmRmOkRlc2NyaXB0aW9uIHJkZjphYm91dD0iIiB4bWxuczp4bXA9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC8iIHhtbG5zOmRjPSJodHRwOi8vcHVybC5vcmcvZGMvZWxlbWVudHMvMS4xLyIgeG1sbnM6cGhvdG9zaG9wPSJodHRwOi8vbnMuYWRvYmUuY29tL3Bob3Rvc2hvcC8xLjAvIiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RFdnQ9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZUV2ZW50IyIgeG1wOkNyZWF0b3JUb29sPSJBZG9iZSBQaG90b3Nob3AgMjEuMSAoTWFjaW50b3NoKSIgeG1wOkNyZWF0ZURhdGU9IjIwMjAtMDMtMjNUMTY6MjM6MjMrMDE6MDAiIHhtcDpNb2RpZnlEYXRlPSIyMDIwLTAzLTIzVDE2OjI1OjM0KzAxOjAwIiB4bXA6TWV0YWRhdGFEYXRlPSIyMDIwLTAzLTIzVDE2OjI1OjM0KzAxOjAwIiBkYzpmb3JtYXQ9ImltYWdlL3BuZyIgcGhvdG9zaG9wOkNvbG9yTW9kZT0iMyIgcGhvdG9zaG9wOklDQ1Byb2ZpbGU9InNSR0IgSUVDNjE5NjYtMi4xIiB4bXBNTTpJbnN0YW5jZUlEPSJ4bXAuaWlkOmJmNGM3NWVjLTIwNGYtNGY1YS05YTMxLTQ5NTU5YWJmZDE4NSIgeG1wTU06RG9jdW1lbnRJRD0ieG1wLmRpZDpiZjRjNzVlYy0yMDRmLTRmNWEtOWEzMS00OTU1OWFiZmQxODUiIHhtcE1NOk9yaWdpbmFsRG9jdW1lbnRJRD0ieG1wLmRpZDpiZjRjNzVlYy0yMDRmLTRmNWEtOWEzMS00OTU1OWFiZmQxODUiPiA8eG1wTU06SGlzdG9yeT4gPHJkZjpTZXE+IDxyZGY6bGkgc3RFdnQ6YWN0aW9uPSJjcmVhdGVkIiBzdEV2dDppbnN0YW5jZUlEPSJ4bXAuaWlkOmJmNGM3NWVjLTIwNGYtNGY1YS05YTMxLTQ5NTU5YWJmZDE4NSIgc3RFdnQ6d2hlbj0iMjAyMC0wMy0yM1QxNjoyMzoyMyswMTowMCIgc3RFdnQ6c29mdHdhcmVBZ2VudD0iQWRvYmUgUGhvdG9zaG9wIDIxLjEgKE1hY2ludG9zaCkiLz4gPC9yZGY6U2VxPiA8L3htcE1NOkhpc3Rvcnk+IDwvcmRmOkRlc2NyaXB0aW9uPiA8L3JkZjpSREY+IDwveDp4bXBtZXRhPiA8P3hwYWNrZXQgZW5kPSJyIj8+nhtLUgAAAE9JREFUKJG1UMsOACAIgub//7IdqvVQtjrExU1EEQLuiGCvgTNgl5D74MmVZPu4wIxQAgm+/sDec2VhgQPgf0sq1unjMlYJE/3MZrvy+kMFZQkZEWfC7ikAAAAASUVORK5CYII="></img>
424
+ <span data-i18n="knxUltimate.properties.node-input-listenallga"></span>
425
+ </label>
426
+ <!-- <div id="helpallga">Some Content Here</div> -->
427
+ </div>
515
428
 
516
- <div id="divnotifyreadrequestautoreact">
517
- <dd>
518
- <div class="form-row">
519
- &nbsp;&nbsp;<input type="checkbox" id="node-input-notifyreadrequestalsorespondtobus"
520
- style="display:inline-block; width:auto; vertical-align:top;" />
521
- <label style="width:85%" for="node-input-notifyreadrequestalsorespondtobus">
522
- <span data-i18n="knxUltimate.properties.node-input-notifyreadrequestalsorespondtobus"></span>
523
- </label>
524
- </div>
525
- <div class="form-row">
526
- &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<label style="width:auto">
527
- <span
528
- data-i18n="knxUltimate.properties.node-input-notifyreadrequestalsorespondtobusdefaultvalueifnotinitialized"></span>
529
- </label>
530
- <input style="width:auto" type="text"
531
- id="node-input-notifyreadrequestalsorespondtobusdefaultvalueifnotinitialized"
532
- data-i18n="[placeholder]knxUltimate.placeholder.notifyreadrequestalsorespondtobusdefaultvalueifnotinitialized" />
533
- </div>
534
- </dd>
429
+ <div id="sampleCodeAccordion">
430
+ <h3><i class="fa fa-code"></i>&nbsp;<span data-i18n="knxUltimate.advanced.Sample"></span></h3>
431
+ <div style="height:180px;min-height:150px;padding:5px;">
432
+ <div style="height:80%;width:100%;padding:0px;" class="node-text-editor" id="example-editor"></div>
535
433
  </div>
536
434
  </div>
537
- </div>
538
435
 
539
- <div id="formatValueAccordion">
540
- <h3><i class="fa fa-list-ol"></i>&nbsp;<span data-i18n="knxUltimate.advanced.Formatting"></span></h3>
541
- <div class="form-row" style="padding:10px">
542
- <div class="form-row">
543
- <dt>
544
- <i class="fa fa-sort-numeric-asc"></i>
545
- <span data-i18n="knxUltimate.advanced.NUMERICVALUES"></span>
546
- </dt>
436
+ <div id="advancedOptionsAccordion">
437
+ <h3><i class="fa fa-braille"></i>&nbsp;<span data-i18n="knxUltimate.advanced.Advancedoptions"></span></h3>
438
+ <div class="form-row" style="padding:10px">
439
+ <div class="form-row">
440
+ <label style="width:230px" for="node-input-passthrough">
441
+ <i class="fa fa-long-arrow-right"></i>
442
+ <span data-i18n="knxUltimate.properties.node-input-passthrough"></span>
443
+ </label>
444
+ <select style="width:92px" id="node-input-passthrough">
445
+ <option value="no" data-i18n="knxUltimate.selectlists.passthrough_No"></option>
446
+ <option value="yes" data-i18n="knxUltimate.selectlists.passthrough_Leave"></option>
447
+ <option value="yesownprop" data-i18n="knxUltimate.selectlists.passthrough_OwnProp"></option>
448
+ </select>
449
+ </div>
450
+ <br />
451
+ <div class="form-row">
452
+ <dt>
453
+ <i class="fa fa-arrow-right"></i>|
454
+ <span data-i18n="knxUltimate.advanced.OUTPUT"></span>
455
+ </dt>
456
+ </div>
457
+ <div class="form-row">
458
+ &nbsp;&nbsp;<label for="node-input-outputtype">
459
+ <i class="fa fa-paper-plane-o"></i>
460
+ <span data-i18n="knxUltimate.properties.node-input-outputtype"></span>
461
+ </label>
462
+ <select id="node-input-outputtype">
463
+ <option value="write" data-i18n="knxUltimate.selectlists.Output_write"></option>
464
+ <option value="response" data-i18n="knxUltimate.selectlists.Output_response"></option>
465
+ <option value="read" data-i18n="knxUltimate.selectlists.Output_read"></option>
466
+ <option value="update" data-i18n="knxUltimate.selectlists.Output_update"></option>
467
+ </select>
468
+ </div>
469
+ <div class="form-row" id="divOutputRBE">
470
+ &nbsp;&nbsp;<input type="checkbox" id="node-input-outputRBE"
471
+ style="display:inline-block; width:auto; vertical-align:top;" />
472
+ <label style="width:85%" for="node-input-outputRBE">
473
+ <i class="fa fa-filter"></i>
474
+ <span data-i18n="knxUltimate.properties.node-input-outputRBE"></span>
475
+ </label>
476
+ </div>
477
+ <br />
478
+ <div class="form-row">
479
+ <dt>
480
+ |<i class="fa fa-arrow-right"></i>
481
+ <span data-i18n="knxUltimate.advanced.INPUT"></span>
482
+ </dt>
483
+ </div>
484
+ <div class="form-row" id="divNode-input-initialread">
485
+ &nbsp;&nbsp;<label style="width:70%" for="node-input-initialread">
486
+ <i class="fa fa-question-circle-o"></i>
487
+ <span data-i18n="knxUltimate.properties.node-input-initialread"></span>
488
+ </label>
489
+ <select style="width:100px" id="node-input-initialread">
490
+ <option value=0 data-i18n="knxUltimate.properties.node-input-initialread0"></option>
491
+ <option value=1 data-i18n="knxUltimate.properties.node-input-initialread1"></option>
492
+ <option value=2 data-i18n="knxUltimate.properties.node-input-initialread2"></option>
493
+ <option value=3 data-i18n="knxUltimate.properties.node-input-initialread3"></option>
494
+ </select>
495
+
496
+ </div>
497
+ <div class="form-row" id="divInputRBE">
498
+ &nbsp;&nbsp;<input type="checkbox" id="node-input-inputRBE"
499
+ style="display:inline-block; width:auto; vertical-align:top;" />
500
+ <label style="width:85%" for="node-input-inputRBE">
501
+ <i class="fa fa-filter"></i>
502
+ <span data-i18n="knxUltimate.properties.node-input-inputRBE"></span>
503
+ </label>
504
+ </div>
505
+ <div class="form-row">
506
+ &nbsp;&nbsp;<input type="checkbox" id="node-input-notifywrite"
507
+ style="display:inline-block; width:auto; vertical-align:top;" />
508
+ <label style="width:85%" for="node-input-notifywrite">
509
+ <i class="fa fa-sign-in"></i>
510
+ <span data-i18n="knxUltimate.properties.node-input-notifywrite"></span>
511
+ </label>
512
+ </div>
513
+ <div class="form-row">
514
+ &nbsp;&nbsp;<input type="checkbox" id="node-input-notifyresponse"
515
+ style="display:inline-block; width:auto; vertical-align:top;" />
516
+ <label style="width:85%" for="node-input-notifyresponse">
517
+ <i class="fa fa-sign-in"></i>
518
+ <span data-i18n="knxUltimate.properties.node-input-notifyresponse"></span>
519
+ </label>
520
+ </div>
521
+ <div class="form-row">
522
+ &nbsp;&nbsp;<input type="checkbox" id="node-input-notifyreadrequest"
523
+ style="display:inline-block; width:auto; vertical-align:top;" />
524
+ <label style="width:85%" for="node-input-notifyreadrequest">
525
+ <i class="fa fa-sign-in"></i>
526
+ <span data-i18n="knxUltimate.properties.node-input-notifyreadrequest"></span>
527
+ </label>
528
+ </div>
529
+
530
+ <div id="divnotifyreadrequestautoreact">
531
+ <dd>
532
+ <div class="form-row">
533
+ &nbsp;&nbsp;<input type="checkbox" id="node-input-notifyreadrequestalsorespondtobus"
534
+ style="display:inline-block; width:auto; vertical-align:top;" />
535
+ <label style="width:85%" for="node-input-notifyreadrequestalsorespondtobus">
536
+ <span data-i18n="knxUltimate.properties.node-input-notifyreadrequestalsorespondtobus"></span>
537
+ </label>
538
+ </div>
539
+ <div class="form-row">
540
+ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<label style="width:auto">
541
+ <span
542
+ data-i18n="knxUltimate.properties.node-input-notifyreadrequestalsorespondtobusdefaultvalueifnotinitialized"></span>
543
+ </label>
544
+ <input style="width:auto" type="text"
545
+ id="node-input-notifyreadrequestalsorespondtobusdefaultvalueifnotinitialized"
546
+ data-i18n="[placeholder]knxUltimate.placeholder.notifyreadrequestalsorespondtobusdefaultvalueifnotinitialized" />
547
+ </div>
548
+ </dd>
549
+ </div>
547
550
  </div>
551
+ </div>
548
552
 
549
- <div class="form-row">
550
- <label style="width:30%" for="node-input-formatmultiplyvalue">
551
- <i class="fa fa-calculator"></i>
552
- <span data-i18n="knxUltimate.properties.node-input-formatmultiplyvalue"></span>
553
- </label>
554
- <select style="width:65%" id="node-input-formatmultiplyvalue">
555
- <option value=1 data-i18n="knxUltimate.selectlists.Multiply_leave"></option>
556
- <option value=0.001 data-i18n="knxUltimate.selectlists.Multiply_divide1000"></option>
557
- <option value=0.01 data-i18n="knxUltimate.selectlists.Multiply_divide100"></option>
558
- <option value=0.1 data-i18n="knxUltimate.selectlists.Multiply_divide10"></option>
559
- <option value=10 data-i18n="knxUltimate.selectlists.Multiply_multiply10"></option>
560
- <option value=100 data-i18n="knxUltimate.selectlists.Multiply_multiply100"></option>
561
- <option value=1000 data-i18n="knxUltimate.selectlists.Multiply_multiply1000"></option>
562
- </select>
563
- </div>
564
- <div class="form-row">
565
- <label style="width:30%" for="node-input-formatdecimalsvalue">
566
- <i class="fa fa-expand"></i>
567
- <span data-i18n="knxUltimate.properties.node-input-formatdecimalsvalue"></span>
568
- </label>
569
- <select style="width:65%" id="node-input-formatdecimalsvalue">
570
- <option value=999 data-i18n="knxUltimate.selectlists.Decimals_leave"></option>
571
- <option value=0 data-i18n="knxUltimate.selectlists.Decimals_roundint"></option>
572
- <option value=1 data-i18n="knxUltimate.selectlists.Decimals_round1"></option>
573
- <option value=2 data-i18n="knxUltimate.selectlists.Decimals_round2"></option>
574
- <option value=3 data-i18n="knxUltimate.selectlists.Decimals_round3"></option>
575
- <option value=4 data-i18n="knxUltimate.selectlists.Decimals_round4"></option>
576
- </select>
577
- </div>
578
- <div class="form-row">
579
- <label style="width:30%" for="node-input-formatnegativevalue">
580
- <i class="fa fa-minus-circle"></i>
581
- <span data-i18n="knxUltimate.properties.node-input-formatnegativevalue"></span>
582
- </label>
583
- <select style="width:65%" id="node-input-formatnegativevalue">
584
- <option value="leave" data-i18n="knxUltimate.selectlists.Negatives_leave"></option>
585
- <option value="zero" data-i18n="knxUltimate.selectlists.Negatives_zero"></option>
586
- <option value="abs" data-i18n="knxUltimate.selectlists.Negatives_abs"></option>
587
- </select>
553
+ <div id="formatValueAccordion">
554
+ <h3><i class="fa fa-list-ol"></i>&nbsp;<span data-i18n="knxUltimate.advanced.Formatting"></span></h3>
555
+ <div class="form-row" style="padding:10px">
556
+ <div class="form-row">
557
+ <dt>
558
+ <i class="fa fa-sort-numeric-asc"></i>
559
+ <span data-i18n="knxUltimate.advanced.NUMERICVALUES"></span>
560
+ </dt>
561
+ </div>
562
+
563
+ <div class="form-row">
564
+ <label style="width:30%" for="node-input-formatmultiplyvalue">
565
+ <i class="fa fa-calculator"></i>
566
+ <span data-i18n="knxUltimate.properties.node-input-formatmultiplyvalue"></span>
567
+ </label>
568
+ <select style="width:65%" id="node-input-formatmultiplyvalue">
569
+ <option value=1 data-i18n="knxUltimate.selectlists.Multiply_leave"></option>
570
+ <option value=0.001 data-i18n="knxUltimate.selectlists.Multiply_divide1000"></option>
571
+ <option value=0.01 data-i18n="knxUltimate.selectlists.Multiply_divide100"></option>
572
+ <option value=0.1 data-i18n="knxUltimate.selectlists.Multiply_divide10"></option>
573
+ <option value=10 data-i18n="knxUltimate.selectlists.Multiply_multiply10"></option>
574
+ <option value=100 data-i18n="knxUltimate.selectlists.Multiply_multiply100"></option>
575
+ <option value=1000 data-i18n="knxUltimate.selectlists.Multiply_multiply1000"></option>
576
+ </select>
577
+ </div>
578
+ <div class="form-row">
579
+ <label style="width:30%" for="node-input-formatdecimalsvalue">
580
+ <i class="fa fa-expand"></i>
581
+ <span data-i18n="knxUltimate.properties.node-input-formatdecimalsvalue"></span>
582
+ </label>
583
+ <select style="width:65%" id="node-input-formatdecimalsvalue">
584
+ <option value=999 data-i18n="knxUltimate.selectlists.Decimals_leave"></option>
585
+ <option value=0 data-i18n="knxUltimate.selectlists.Decimals_roundint"></option>
586
+ <option value=1 data-i18n="knxUltimate.selectlists.Decimals_round1"></option>
587
+ <option value=2 data-i18n="knxUltimate.selectlists.Decimals_round2"></option>
588
+ <option value=3 data-i18n="knxUltimate.selectlists.Decimals_round3"></option>
589
+ <option value=4 data-i18n="knxUltimate.selectlists.Decimals_round4"></option>
590
+ </select>
591
+ </div>
592
+ <div class="form-row">
593
+ <label style="width:30%" for="node-input-formatnegativevalue">
594
+ <i class="fa fa-minus-circle"></i>
595
+ <span data-i18n="knxUltimate.properties.node-input-formatnegativevalue"></span>
596
+ </label>
597
+ <select style="width:65%" id="node-input-formatnegativevalue">
598
+ <option value="leave" data-i18n="knxUltimate.selectlists.Negatives_leave"></option>
599
+ <option value="zero" data-i18n="knxUltimate.selectlists.Negatives_zero"></option>
600
+ <option value="abs" data-i18n="knxUltimate.selectlists.Negatives_abs"></option>
601
+ </select>
602
+ </div>
588
603
  </div>
589
604
  </div>
590
605
  </div>
606
+
607
+ <div id ="divDeployFirst">
608
+ <div class="form-tips" style="margin-top:11px">
609
+ <span data-i18n="knxUltimate.deployfirst"></span>
610
+ </div>
611
+ </div>
591
612
  <br /><br />
592
613
  </script>
@@ -49,7 +49,7 @@ module.exports = function (RED) {
49
49
  var _dpt = (typeof dpt == "undefined" || dpt == "") ? "" : " DPT" + dpt;
50
50
  node.status({ fill: fill, shape: shape, text: _GA + payload + ((node.listenallga && node.server.statusDisplayDeviceNameWhenALL) === true ? " " + _devicename : "") + (node.server.statusDisplayDataPoint === true ? _dpt : "") + (node.server.statusDisplayLastUpdate === true ? " (" + dDate.getDate() + ", " + dDate.toLocaleTimeString() + ")" : "") + " " + text });
51
51
  // 16/02/2020 signal errors to the server
52
- if (fill.toUpperCase() == "RED") {
52
+ if (fill.toUpperCase() === "RED") {
53
53
  if (node.server) {
54
54
  var oError = { nodeid: node.id, topic: node.outputtopic, devicename: _devicename, GA: _GA, text: text };
55
55
  node.server.reportToWatchdogCalledByKNXUltimateNode(oError);
@@ -54,7 +54,7 @@ module.exports = function (RED) {
54
54
  node.formatdecimalsvalue = 999;
55
55
  node.writeExecutionInterval = config.writeExecutionInterval === undefined ? 1000 : config.writeExecutionInterval;
56
56
 
57
- node.exposeAsVariable = config.exposeAsVariable !== undefined ? config.exposeAsVariable : "exposeAsVariableREADONLY"; // Should expose the Group Addresses to the Global Variable?
57
+ node.exposeAsVariable = config.exposeAsVariable !== undefined ? config.exposeAsVariable : "exposeAsVariableREADONLY"; // Should expose the Group Addresses to the Global Context?
58
58
  node.exposedGAs = [];
59
59
  node.timerExposedGAs = null;
60
60
 
@@ -39,7 +39,7 @@
39
39
  "tiphost": "Schreiben Sie EMULATE anstelle der IP-Adresse, um ein Gateway zu simulieren (das Gateway stellt keine Verbindung zum KNX-BUS her).",
40
40
  "delaybetweentelegrams": "Verzögerung zwischen jedem Telegramm (in Millisekunden)",
41
41
  "delaybetweentelegramsfurtherdelayREAD" : "und weitere Verzögerung nur zwischen -lese- Telegrammen multiplizieren",
42
- "exposeAsVariable" : "Als global Variable verfügbar machen",
42
+ "exposeAsVariable" : "Als global Context Variable verfügbar machen",
43
43
  "exposeAsVariableNO" : "Nein",
44
44
  "exposeAsVariableREADONLY" : "Nur Lesen",
45
45
  "exposeAsVariableREADWRITE" : "Lesen/Schreiben"
@@ -1,5 +1,6 @@
1
1
  {
2
2
  "knxUltimate": {
3
+ "deployfirst": "BITTE ERSTELLEN DEIN ERSTES GATEWAY, DANN DEPLOY, DANN ÖFFNEN DIESES FENSTER WIEDER.",
3
4
  "helplink" : "&nbsp<i class=\"fa fa-question-circle\"></i>&nbsp<a target=\"_blank\" href=\"https://github.com/Supergiovane/node-red-contrib-knx-ultimate/wiki/de-2.-Node-Configuration\"><u>Hilfe Konfiguration</u></a>",
4
5
  "title": "KNX Gerät",
5
6
  "properties": {
@@ -1,5 +1,6 @@
1
1
  {
2
2
  "knxUltimate": {
3
+ "deployfirst": "PLEASE CREATE YOUR FIRST GATEWAY, THEN DEPLOY, THEN REOPEN THIS WINDOW.",
3
4
  "helplink" : "&nbsp<i class=\"fa fa-question-circle\"></i>&nbsp<a target=\"_blank\" href=\"https://github.com/Supergiovane/node-red-contrib-knx-ultimate/wiki/2.-Node-Configuration\"><u>Help for configuration</u></a>",
4
5
  "title": "KNX Device",
5
6
  "properties": {
@@ -1,5 +1,6 @@
1
1
  {
2
2
  "knxUltimate": {
3
+ "deployfirst": "PRIMA DI PROCEDERE DEVI CREARE IL TUO PRIMO GATEWAY, POI ESEGUIRE IL DEPLOY E POI RIAPRIRE QUESTA FINESTRA.",
3
4
  "helplink" : "&nbsp<i class=\"fa fa-question-circle\"></i>&nbsp<a target=\"_blank\" href=\"https://github.com/Supergiovane/node-red-contrib-knx-ultimate/wiki/it-2.-Node-Configuration\"><u>Aiuto per configurazione</u></a>",
4
5
  "title": "Dispositivo KNX",
5
6
  "properties": {
@@ -1,5 +1,6 @@
1
1
  {
2
2
  "knxUltimate": {
3
+ "deployfirst": "请创建您的第一个网关,然后进行部署,然后重新打开此窗口。",
3
4
  "helplink" : "&nbsp<i class=\"fa fa-question-circle\"></i>&nbsp<a target=\"_blank\" href=\"https://github.com/Supergiovane/node-red-contrib-knx-ultimate/wiki/cn-2.-Node-Configuration\"><u>配置帮助文档</u></a>",
4
5
  "title": "KNX 设备节点",
5
6
  "properties": {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "node-red-contrib-knx-ultimate",
3
- "version": "1.3.14",
3
+ "version": "1.3.15",
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",