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 +5 -0
- package/KNXEngine/KNXClient.js +26 -31
- package/KNXEngine/protocol/KNXProtocol.js +3 -3
- package/KNXEngine/protocol/KNXSecureSessionRequest.js +12 -8
- package/README.md +2 -2
- package/nodes/knxUltimate-config.html +8 -8
- package/nodes/knxUltimate-config.js +42 -30
- package/nodes/knxUltimate.html +225 -204
- package/nodes/knxUltimate.js +1 -1
- package/nodes/knxUltimateGlobalContext.js +1 -1
- package/nodes/locales/de/knxUltimate-config.json +1 -1
- package/nodes/locales/de/knxUltimate.json +1 -0
- package/nodes/locales/en-US/knxUltimate.json +1 -0
- package/nodes/locales/it/knxUltimate.json +1 -0
- package/nodes/locales/zh-CN/knxUltimate.json +1 -0
- package/package.json +1 -1
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/>
|
package/KNXEngine/KNXClient.js
CHANGED
|
@@ -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
|
|
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.
|
|
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
|
-
|
|
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
|
-
|
|
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.
|
|
533
|
-
this.
|
|
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.
|
|
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.
|
|
568
|
-
this.
|
|
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.
|
|
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
|
-
|
|
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.
|
|
768
|
-
this.
|
|
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.
|
|
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
|
-
|
|
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
|
-
|
|
24
|
-
let
|
|
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(
|
|
28
|
-
//
|
|
29
|
-
|
|
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/
|
|
31
|
-
* **ALERTER node** [here](https://github.com/Supergiovane/node-red-contrib-knx-ultimate/wiki/
|
|
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
|
|
232
|
-
<option value="Multicast" >Multicast
|
|
233
|
-
|
|
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> <span data-i18n="knxUltimate-config.properties.unsecureKNX"></span></a></li>
|
|
241
242
|
<li><a href="#SecureKNX"><i class="fa fa-shield"></i> <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
|
-
|
|
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
|
-
|
|
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.
|
|
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.
|
|
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
|
-
|
|
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(
|
|
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
|
-
|
|
1756
|
-
|
|
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
|
|
package/nodes/knxUltimate.html
CHANGED
|
@@ -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
|
|
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"
|
|
375
|
+
<span id="divknxsecure">
|
|
376
|
+
<font color="green" size="4px"><i class="fa fa-shield" aria-hidden="true"></i></font>
|
|
377
|
+
</span> <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
|
-
|
|
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> <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="
|
|
423
|
-
<h3><i class="fa fa-braille"></i> <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
|
-
<
|
|
439
|
-
<
|
|
440
|
-
|
|
441
|
-
|
|
442
|
-
</div>
|
|
443
|
-
<div class="form-row">
|
|
444
|
-
<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
|
-
<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
|
-
<
|
|
466
|
-
|
|
467
|
-
|
|
468
|
-
|
|
469
|
-
</div>
|
|
470
|
-
<div class="form-row" id="divNode-input-initialread">
|
|
471
|
-
<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:
|
|
476
|
-
|
|
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
|
-
|
|
484
|
-
|
|
485
|
-
|
|
486
|
-
<
|
|
487
|
-
|
|
488
|
-
|
|
489
|
-
|
|
490
|
-
|
|
491
|
-
|
|
492
|
-
|
|
493
|
-
|
|
494
|
-
<
|
|
495
|
-
|
|
496
|
-
|
|
497
|
-
|
|
498
|
-
|
|
499
|
-
<
|
|
500
|
-
|
|
501
|
-
|
|
502
|
-
|
|
503
|
-
|
|
504
|
-
|
|
505
|
-
|
|
506
|
-
|
|
507
|
-
<div class="form-row">
|
|
508
|
-
<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
|
-
|
|
517
|
-
|
|
518
|
-
|
|
519
|
-
|
|
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
|
-
<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> <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="
|
|
540
|
-
|
|
541
|
-
|
|
542
|
-
|
|
543
|
-
|
|
544
|
-
|
|
545
|
-
|
|
546
|
-
|
|
436
|
+
<div id="advancedOptionsAccordion">
|
|
437
|
+
<h3><i class="fa fa-braille"></i> <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
|
+
<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
|
+
<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
|
+
<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
|
+
<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
|
+
<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
|
+
<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
|
+
<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
|
+
<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
|
+
<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
|
-
|
|
550
|
-
|
|
551
|
-
|
|
552
|
-
|
|
553
|
-
|
|
554
|
-
|
|
555
|
-
|
|
556
|
-
|
|
557
|
-
|
|
558
|
-
|
|
559
|
-
|
|
560
|
-
<
|
|
561
|
-
|
|
562
|
-
|
|
563
|
-
|
|
564
|
-
|
|
565
|
-
|
|
566
|
-
|
|
567
|
-
|
|
568
|
-
|
|
569
|
-
|
|
570
|
-
|
|
571
|
-
|
|
572
|
-
|
|
573
|
-
|
|
574
|
-
|
|
575
|
-
<
|
|
576
|
-
|
|
577
|
-
|
|
578
|
-
|
|
579
|
-
|
|
580
|
-
|
|
581
|
-
|
|
582
|
-
|
|
583
|
-
|
|
584
|
-
|
|
585
|
-
|
|
586
|
-
|
|
587
|
-
</
|
|
553
|
+
<div id="formatValueAccordion">
|
|
554
|
+
<h3><i class="fa fa-list-ol"></i> <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>
|
package/nodes/knxUltimate.js
CHANGED
|
@@ -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()
|
|
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
|
|
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" : " <i class=\"fa fa-question-circle\"></i> <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" : " <i class=\"fa fa-question-circle\"></i> <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" : " <i class=\"fa fa-question-circle\"></i> <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" : " <i class=\"fa fa-question-circle\"></i> <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.
|
|
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",
|