node-red-contrib-knx-ultimate 3.2.9 → 3.2.11
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 +8 -0
- package/KNXUltimateDebugLog.txt +49 -0
- package/nodes/commonFunctions.js +18 -1
- package/nodes/hue-config.html +10 -0
- package/nodes/hue-config.js +3 -4
- package/nodes/knxUltimate-config copy.html +10 -0
- package/nodes/knxUltimate-config.html +28 -13
- package/nodes/knxUltimate-config.js +55 -63
- package/nodes/knxUltimate.html +15 -0
- package/nodes/knxUltimate.js +22 -28
- package/nodes/knxUltimateAlerter.html +10 -0
- package/nodes/knxUltimateAutoResponder.html +15 -0
- package/nodes/knxUltimateAutoResponder.js +4 -9
- package/nodes/knxUltimateGarageDoorBarrierOpener.html +15 -0
- package/nodes/knxUltimateGlobalContext.html +15 -0
- package/nodes/knxUltimateHATranslator.html +10 -0
- package/nodes/knxUltimateHueBattery.html +15 -0
- package/nodes/knxUltimateHueButton.html +15 -0
- package/nodes/knxUltimateHueContactSensor.html +15 -0
- package/nodes/knxUltimateHueLight.html +19 -0
- package/nodes/knxUltimateHueLightSensor.html +15 -0
- package/nodes/knxUltimateHueMotion.html +15 -0
- package/nodes/knxUltimateHueScene.html +15 -0
- package/nodes/knxUltimateHueScene.js +4 -11
- package/nodes/knxUltimateHueTapDial.html +15 -0
- package/nodes/knxUltimateHueTemperatureSensor.html +15 -0
- package/nodes/knxUltimateHueZigbeeConnectivity.html +15 -0
- package/nodes/knxUltimateHuedevice_software_update.html +15 -0
- package/nodes/knxUltimateLoadControl.html +10 -0
- package/nodes/knxUltimateLoadControl.js +4 -8
- package/nodes/knxUltimateLogger.html +10 -0
- package/nodes/knxUltimateSceneController.html +10 -0
- package/nodes/knxUltimateSceneController.js +5 -8
- package/nodes/knxUltimateViewer.html +15 -0
- package/nodes/knxUltimateWatchDog.html +10 -0
- package/nodes/utils/hueEngine.js +11 -22
- package/nodes/utils/sysLogger.js +101 -18
- package/package.json +1 -1
|
@@ -10,7 +10,7 @@ const _ = require("lodash");
|
|
|
10
10
|
const knx = require("knxultimate");
|
|
11
11
|
//const dptlib = require('knxultimate').dptlib;
|
|
12
12
|
const dptlib = require('knxultimate').dptlib;
|
|
13
|
-
|
|
13
|
+
const loggerClass = require('./utils/sysLogger')
|
|
14
14
|
// const { Server } = require('http')
|
|
15
15
|
const payloadRounder = require("./utils/payloadManipulation");
|
|
16
16
|
|
|
@@ -53,14 +53,6 @@ const toConcattedSubtypes = (acc, baseType) => {
|
|
|
53
53
|
};
|
|
54
54
|
// ####################
|
|
55
55
|
|
|
56
|
-
// 10/09/2024 Setup the color logger
|
|
57
|
-
loggerSetup = (options) => {
|
|
58
|
-
let clog = require("node-color-log").createNamedLogger(options.setPrefix);
|
|
59
|
-
clog.setLevel(options.loglevel);
|
|
60
|
-
clog.setDate(() => (new Date()).toLocaleString());
|
|
61
|
-
return clog;
|
|
62
|
-
}
|
|
63
|
-
|
|
64
56
|
|
|
65
57
|
module.exports = (RED) => {
|
|
66
58
|
function knxUltimateConfigNode(config) {
|
|
@@ -85,7 +77,7 @@ module.exports = (RED) => {
|
|
|
85
77
|
if (node.loglevel === 'silent') node.loglevel = 'disable'; // Backward compatibility
|
|
86
78
|
node.sysLogger = null; // 20/03/2022 Default
|
|
87
79
|
try {
|
|
88
|
-
node.sysLogger =
|
|
80
|
+
node.sysLogger = new loggerClass({ loglevel: node.loglevel, setPrefix: node.type + " <" + (node.name || node.id || '') + ">" });
|
|
89
81
|
} catch (error) { console.log(error.stack) }
|
|
90
82
|
// 12/11/2021 Connect at start delay
|
|
91
83
|
node.autoReconnect = true; // 20/03/2022 Default
|
|
@@ -169,7 +161,7 @@ module.exports = (RED) => {
|
|
|
169
161
|
}
|
|
170
162
|
})();
|
|
171
163
|
} catch (error) {
|
|
172
|
-
if (node.sysLogger !== undefined && node.sysLogger !== null) node.sysLogger.error("
|
|
164
|
+
if (node.sysLogger !== undefined && node.sysLogger !== null) node.sysLogger.error("KNX Secure: error parsing the keyring XML: " + error.message);
|
|
173
165
|
node.jKNXSecureKeyring = null;
|
|
174
166
|
node.knxSecureSelected = false;
|
|
175
167
|
const t = setTimeout(() => node.setAllClientsStatus("Error", "red", "KNX Secure " + error.message), 2000); // 21/03/2022 fixed possible memory leak. Previously was setTimeout without "let t = ".
|
|
@@ -192,12 +184,12 @@ module.exports = (RED) => {
|
|
|
192
184
|
}
|
|
193
185
|
}
|
|
194
186
|
if (!setupDirectory(node.userDir)) {
|
|
195
|
-
if (node.sysLogger !== undefined && node.sysLogger !== null) node.sysLogger.error("
|
|
187
|
+
if (node.sysLogger !== undefined && node.sysLogger !== null) node.sysLogger.error("Unable to set up MAIN directory: " + node.userDir);
|
|
196
188
|
}
|
|
197
189
|
if (!setupDirectory(path.join(node.userDir, "knxpersistvalues"))) {
|
|
198
|
-
if (node.sysLogger !== undefined && node.sysLogger !== null) node.sysLogger.error("
|
|
190
|
+
if (node.sysLogger !== undefined && node.sysLogger !== null) node.sysLogger.error("Unable to set up cache directory: " + path.join(node.userDir, "knxpersistvalues"));
|
|
199
191
|
} else {
|
|
200
|
-
if (node.sysLogger !== undefined && node.sysLogger !== null) node.sysLogger.info("
|
|
192
|
+
if (node.sysLogger !== undefined && node.sysLogger !== null) node.sysLogger.info("payload cache set to " + path.join(node.userDir, "knxpersistvalues"));
|
|
201
193
|
}
|
|
202
194
|
|
|
203
195
|
function saveExposedGAs() {
|
|
@@ -205,10 +197,10 @@ module.exports = (RED) => {
|
|
|
205
197
|
try {
|
|
206
198
|
if (node.exposedGAs.length > 0) {
|
|
207
199
|
fs.writeFileSync(sFile, JSON.stringify(node.exposedGAs));
|
|
208
|
-
if (node.sysLogger !== undefined && node.sysLogger !== null) node.sysLogger.info("
|
|
200
|
+
if (node.sysLogger !== undefined && node.sysLogger !== null) node.sysLogger.info("wrote peristent values to the file " + sFile);
|
|
209
201
|
}
|
|
210
202
|
} catch (err) {
|
|
211
|
-
if (node.sysLogger !== undefined && node.sysLogger !== null) node.sysLogger.error("
|
|
203
|
+
if (node.sysLogger !== undefined && node.sysLogger !== null) node.sysLogger.error("unable to write peristent values to the file " + sFile + " " + err.message);
|
|
212
204
|
}
|
|
213
205
|
}
|
|
214
206
|
function loadExposedGAs() {
|
|
@@ -217,7 +209,7 @@ module.exports = (RED) => {
|
|
|
217
209
|
node.exposedGAs = JSON.parse(fs.readFileSync(sFile, "utf8"));
|
|
218
210
|
} catch (err) {
|
|
219
211
|
node.exposedGAs = [];
|
|
220
|
-
if (node.sysLogger !== undefined && node.sysLogger !== null) node.sysLogger.error("
|
|
212
|
+
if (node.sysLogger !== undefined && node.sysLogger !== null) node.sysLogger.error("unable to read peristent file " + sFile + " " + err.message);
|
|
221
213
|
}
|
|
222
214
|
}
|
|
223
215
|
|
|
@@ -285,9 +277,9 @@ module.exports = (RED) => {
|
|
|
285
277
|
if (node.linkStatus !== "connected") return; // 29/08/2019 If not connected, exit
|
|
286
278
|
loadExposedGAs(); // 04/04/2021 load the current values of GA payload
|
|
287
279
|
try {
|
|
288
|
-
if (node.sysLogger !== undefined && node.sysLogger !== null) node.sysLogger.info("
|
|
280
|
+
if (node.sysLogger !== undefined && node.sysLogger !== null) node.sysLogger.info("Loaded saved GA values", node.exposedGAs.length);
|
|
289
281
|
} catch (error) { }
|
|
290
|
-
if (node.sysLogger !== undefined && node.sysLogger !== null) node.sysLogger.info("
|
|
282
|
+
if (node.sysLogger !== undefined && node.sysLogger !== null) node.sysLogger.info("Do DoInitialReadFromKNXBusOrFile");
|
|
291
283
|
try {
|
|
292
284
|
const readHistory = [];
|
|
293
285
|
|
|
@@ -343,7 +335,7 @@ module.exports = (RED) => {
|
|
|
343
335
|
dpt: _oClient.dpt,
|
|
344
336
|
devicename: _oClient.devicename || "",
|
|
345
337
|
});
|
|
346
|
-
if (node.sysLogger !== undefined && node.sysLogger !== null) node.sysLogger.error("
|
|
338
|
+
if (node.sysLogger !== undefined && node.sysLogger !== null) node.sysLogger.error("DoInitialReadFromKNXBusOrFile: Datapoint may have been changed, remove the value from persist file of " + _oClient.topic + " Devicename " + _oClient.name + " Currend DPT " + _oClient.dpt + " Node.id " + _oClient.id);
|
|
347
339
|
} else {
|
|
348
340
|
if (_oClient.notifyresponse) _oClient.handleSend(msg);
|
|
349
341
|
}
|
|
@@ -351,7 +343,7 @@ module.exports = (RED) => {
|
|
|
351
343
|
if (_oClient.initialread === 3) {
|
|
352
344
|
// Not found, issue a READ to the bus
|
|
353
345
|
if (!readHistory.includes(_oClient.topic)) {
|
|
354
|
-
if (node.sysLogger !== undefined && node.sysLogger !== null) node.sysLogger.debug("
|
|
346
|
+
if (node.sysLogger !== undefined && node.sysLogger !== null) node.sysLogger.debug("DoInitialReadFromKNXBusOrFile 3: sent read request to GA " + _oClient.topic);
|
|
355
347
|
_oClient.setNodeStatus({
|
|
356
348
|
fill: "grey",
|
|
357
349
|
shape: "dot",
|
|
@@ -403,7 +395,7 @@ module.exports = (RED) => {
|
|
|
403
395
|
nodecallerid: element.id,
|
|
404
396
|
});
|
|
405
397
|
readHistory.push(element.ga);
|
|
406
|
-
if (node.sysLogger !== undefined && node.sysLogger !== null) node.sysLogger.debug("
|
|
398
|
+
if (node.sysLogger !== undefined && node.sysLogger !== null) node.sysLogger.debug("DoInitialReadFromKNXBusOrFile from Universal Node: sent read request to GA " + element.ga);
|
|
407
399
|
}
|
|
408
400
|
}
|
|
409
401
|
} else {
|
|
@@ -416,7 +408,7 @@ module.exports = (RED) => {
|
|
|
416
408
|
nodecallerid: _oClient.id,
|
|
417
409
|
});
|
|
418
410
|
readHistory.push(_oClient.topic);
|
|
419
|
-
if (node.sysLogger !== undefined && node.sysLogger !== null) node.sysLogger.debug("
|
|
411
|
+
if (node.sysLogger !== undefined && node.sysLogger !== null) node.sysLogger.debug("DoInitialReadFromKNXBusOrFile: sent read request to GA " + _oClient.topic);
|
|
420
412
|
}
|
|
421
413
|
}
|
|
422
414
|
});
|
|
@@ -548,12 +540,12 @@ module.exports = (RED) => {
|
|
|
548
540
|
if (resolvedIP === null || net.isIP(resolvedIP) === 0) {
|
|
549
541
|
// Error in resolving DNS Name
|
|
550
542
|
if (node.sysLogger !== undefined && node.sysLogger !== null) node.sysLogger.error(
|
|
551
|
-
"
|
|
543
|
+
"net.isIP: INVALID IP OR DNS NAME. Check the Gateway Host in Config node " + node.name + " " + node.host,
|
|
552
544
|
);
|
|
553
545
|
throw new Error("net.isIP: INVALID IP OR DNS NAME. Check the Gateway Host in Config node.");
|
|
554
546
|
}
|
|
555
547
|
if (node.sysLogger !== undefined && node.sysLogger !== null) node.sysLogger.info(
|
|
556
|
-
"
|
|
548
|
+
"net.isIP: The gateway is not specified as IP. The DNS resolver pointed me to the IP " +
|
|
557
549
|
node.host +
|
|
558
550
|
", in Config node " +
|
|
559
551
|
node.name,
|
|
@@ -573,11 +565,11 @@ module.exports = (RED) => {
|
|
|
573
565
|
let sIfaceName = "";
|
|
574
566
|
if (node.KNXEthInterface === "Manual") {
|
|
575
567
|
sIfaceName = node.KNXEthInterfaceManuallyInput;
|
|
576
|
-
if (node.sysLogger !== undefined && node.sysLogger !== null) node.sysLogger.info("
|
|
568
|
+
if (node.sysLogger !== undefined && node.sysLogger !== null) node.sysLogger.info("Bind KNX Bus to interface : " + sIfaceName + " (Interface's name entered by hand). Node " + node.name);
|
|
577
569
|
} else {
|
|
578
570
|
sIfaceName = node.KNXEthInterface;
|
|
579
571
|
if (node.sysLogger !== undefined && node.sysLogger !== null) node.sysLogger.info(
|
|
580
|
-
"
|
|
572
|
+
"Bind KNX Bus to interface : " + sIfaceName + " (Interface's name selected from dropdown list). Node " + node.name,
|
|
581
573
|
);
|
|
582
574
|
}
|
|
583
575
|
node.knxConnectionProperties.interface = sIfaceName;
|
|
@@ -586,7 +578,7 @@ module.exports = (RED) => {
|
|
|
586
578
|
try {
|
|
587
579
|
delete node.knxConnectionProperties.interface;
|
|
588
580
|
} catch (error) { }
|
|
589
|
-
if (node.sysLogger !== undefined && node.sysLogger !== null) node.sysLogger.info("
|
|
581
|
+
if (node.sysLogger !== undefined && node.sysLogger !== null) node.sysLogger.info("Bind KNX Bus to interface (Auto). Node " + node.name);
|
|
590
582
|
}
|
|
591
583
|
};
|
|
592
584
|
// node.setKnxConnectionProperties(); 28/12/2021 Commented
|
|
@@ -595,7 +587,7 @@ module.exports = (RED) => {
|
|
|
595
587
|
try {
|
|
596
588
|
node.setKnxConnectionProperties(); // 28/12/2021 Added
|
|
597
589
|
} catch (error) {
|
|
598
|
-
if (node.sysLogger !== undefined && node.sysLogger !== null) node.sysLogger.error("
|
|
590
|
+
if (node.sysLogger !== undefined && node.sysLogger !== null) node.sysLogger.error("setKnxConnectionProperties: " + error.message);
|
|
599
591
|
if (node.linkStatus !== "disconnected") await node.Disconnect();
|
|
600
592
|
return;
|
|
601
593
|
}
|
|
@@ -604,7 +596,7 @@ module.exports = (RED) => {
|
|
|
604
596
|
// 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.
|
|
605
597
|
if (node.nodeClients.length === 0) {
|
|
606
598
|
try {
|
|
607
|
-
if (node.sysLogger !== undefined && node.sysLogger !== null) node.sysLogger.info("
|
|
599
|
+
if (node.sysLogger !== undefined && node.sysLogger !== null) node.sysLogger.info("No nodes linked to this gateway " + node.name);
|
|
608
600
|
try {
|
|
609
601
|
if (node.linkStatus !== "disconnected") await node.Disconnect();
|
|
610
602
|
} catch (error) { }
|
|
@@ -624,7 +616,7 @@ module.exports = (RED) => {
|
|
|
624
616
|
try {
|
|
625
617
|
if (node.knxConnection !== null && node.knxConnection !== undefined) {
|
|
626
618
|
await node.knxConnection.Disconnect();
|
|
627
|
-
if (node.sysLogger !== undefined && node.sysLogger !== null) node.sysLogger.debug("
|
|
619
|
+
if (node.sysLogger !== undefined && node.sysLogger !== null) node.sysLogger.debug("removing old handlers. Node " + node.name);
|
|
628
620
|
node.knxConnection.removeAllListeners();
|
|
629
621
|
}
|
|
630
622
|
} catch (error) {
|
|
@@ -639,20 +631,20 @@ module.exports = (RED) => {
|
|
|
639
631
|
node.knxConnection.on(knx.KNXClientEvents.indication, handleBusEvents);
|
|
640
632
|
node.knxConnection.on(knx.KNXClientEvents.error, (err) => {
|
|
641
633
|
try {
|
|
642
|
-
if (node.sysLogger !== undefined && node.sysLogger !== null) node.sysLogger.error("
|
|
634
|
+
if (node.sysLogger !== undefined && node.sysLogger !== null) node.sysLogger.error("received KNXClientEvents.error: " + (err.message === undefined ? err : err.message));
|
|
643
635
|
} catch (error) {
|
|
644
636
|
}
|
|
645
637
|
// 31/03/2022 Don't care about some errors
|
|
646
638
|
if (err.message !== undefined && (err.message === "ROUTING_LOST_MESSAGE" || err.message === "ROUTING_BUSY")) {
|
|
647
639
|
if (node.sysLogger !== undefined && node.sysLogger !== null) node.sysLogger.error(
|
|
648
|
-
"
|
|
640
|
+
"KNXClientEvents.error: " +
|
|
649
641
|
(err.message === undefined ? err : err.message) +
|
|
650
642
|
" consider DECREASING the transmission speed, by increasing the telegram's DELAY in the gateway configuration node!",
|
|
651
643
|
);
|
|
652
644
|
return;
|
|
653
645
|
}
|
|
654
646
|
node.Disconnect("Disconnected by error " + (err.message === undefined ? err : err.message), "red");
|
|
655
|
-
if (node.sysLogger !== undefined && node.sysLogger !== null) node.sysLogger.error("
|
|
647
|
+
if (node.sysLogger !== undefined && node.sysLogger !== null) node.sysLogger.error("Disconnected by: " + (err.message === undefined ? err : err.message));
|
|
656
648
|
});
|
|
657
649
|
// Call discoverCB when a knx gateway has been discovered.
|
|
658
650
|
// node.knxConnection.on(knx.KNXClientEvents.discover, info => {
|
|
@@ -662,12 +654,12 @@ module.exports = (RED) => {
|
|
|
662
654
|
node.knxConnection.on(knx.KNXClientEvents.disconnected, (info) => {
|
|
663
655
|
if (node.linkStatus !== "disconnected") {
|
|
664
656
|
node.linkStatus = "disconnected";
|
|
665
|
-
if (node.sysLogger !== undefined && node.sysLogger !== null) node.sysLogger.warn("
|
|
657
|
+
if (node.sysLogger !== undefined && node.sysLogger !== null) node.sysLogger.warn("Disconnected event %s", info);
|
|
666
658
|
node.Disconnect("Disconnected by event: " + info || "", "red"); // 11/03/2022
|
|
667
659
|
}
|
|
668
660
|
});
|
|
669
661
|
node.knxConnection.on(knx.KNXClientEvents.close, (info) => {
|
|
670
|
-
if (node.sysLogger !== undefined && node.sysLogger !== null) node.sysLogger.debug("
|
|
662
|
+
if (node.sysLogger !== undefined && node.sysLogger !== null) node.sysLogger.debug("KNXClient socket closed.");
|
|
671
663
|
node.linkStatus = "disconnected";
|
|
672
664
|
});
|
|
673
665
|
node.knxConnection.on(knx.KNXClientEvents.connected, (info) => {
|
|
@@ -680,35 +672,35 @@ module.exports = (RED) => {
|
|
|
680
672
|
try {
|
|
681
673
|
DoInitialReadFromKNXBusOrFile();
|
|
682
674
|
} catch (error) {
|
|
683
|
-
if (node.sysLogger !== undefined && node.sysLogger !== null) node.sysLogger.error("
|
|
675
|
+
if (node.sysLogger !== undefined && node.sysLogger !== null) node.sysLogger.error("DoInitialReadFromKNXBusOrFile " + error.stack);
|
|
684
676
|
}
|
|
685
677
|
}, 1000); // 17/02/2020 Do initial read of all nodes requesting initial read
|
|
686
678
|
const t = setTimeout(() => {
|
|
687
679
|
// 21/03/2022 fixed possible memory leak. Previously was setTimeout without "let t = ".
|
|
688
680
|
node.setAllClientsStatus("Connected.", "green", "On duty.");
|
|
689
681
|
}, 500);
|
|
690
|
-
if (node.sysLogger !== undefined && node.sysLogger !== null) node.sysLogger.info("
|
|
682
|
+
if (node.sysLogger !== undefined && node.sysLogger !== null) node.sysLogger.info("Connected to %o", info);
|
|
691
683
|
});
|
|
692
684
|
node.knxConnection.on(knx.KNXClientEvents.connecting, (info) => {
|
|
693
685
|
node.linkStatus = "connecting";
|
|
694
|
-
if (node.sysLogger !== undefined && node.sysLogger !== null) node.sysLogger.debug("
|
|
686
|
+
if (node.sysLogger !== undefined && node.sysLogger !== null) node.sysLogger.debug("Connecting to" + info.ipAddr || "");
|
|
695
687
|
node.setAllClientsStatus(info.ipAddr || "", "grey", "Connecting...");
|
|
696
688
|
});
|
|
697
689
|
// ######################################
|
|
698
690
|
|
|
699
691
|
node.setAllClientsStatus("Connecting... ", "grey", "");
|
|
700
|
-
if (node.sysLogger !== undefined && node.sysLogger !== null) node.sysLogger.info("
|
|
692
|
+
if (node.sysLogger !== undefined && node.sysLogger !== null) node.sysLogger.info("perform websocket connection on " + node.name);
|
|
701
693
|
try {
|
|
702
|
-
if (node.sysLogger !== undefined && node.sysLogger !== null) node.sysLogger.info("
|
|
694
|
+
if (node.sysLogger !== undefined && node.sysLogger !== null) node.sysLogger.info("Connecting... " + node.name);
|
|
703
695
|
node.knxConnection.Connect();
|
|
704
696
|
} catch (error) {
|
|
705
|
-
if (node.sysLogger !== undefined && node.sysLogger !== null) node.sysLogger.error("
|
|
697
|
+
if (node.sysLogger !== undefined && node.sysLogger !== null) node.sysLogger.error("node.knxConnection.Connect() " + node.name + ": " + error.message);
|
|
706
698
|
node.linkStatus = "disconnected";
|
|
707
699
|
throw error;
|
|
708
700
|
}
|
|
709
701
|
} catch (error) {
|
|
710
702
|
if (node.sysLogger !== undefined && node.sysLogger !== null) {
|
|
711
|
-
node.sysLogger.error("
|
|
703
|
+
node.sysLogger.error("Error in instantiating knxConnection " + error.stack + " Node " + node.name);
|
|
712
704
|
node.error("KNXUltimate-config: Error in instantiating knxConnection " + error.message + " Node " + node.name);
|
|
713
705
|
}
|
|
714
706
|
node.linkStatus = "disconnected";
|
|
@@ -745,7 +737,7 @@ module.exports = (RED) => {
|
|
|
745
737
|
const isRepeated = _datagram.cEMIMessage.control.repeat !== 1;
|
|
746
738
|
// 06/06/2021 Supergiovane: check if i can handle the telegrams with "Repeated" flag
|
|
747
739
|
if (node.ignoreTelegramsWithRepeatedFlag === true && isRepeated) {
|
|
748
|
-
if (node.sysLogger !== undefined && node.sysLogger !== null) node.sysLogger.warn("
|
|
740
|
+
if (node.sysLogger !== undefined && node.sysLogger !== null) node.sysLogger.warn("Ignored telegram with Repeated Flag " + _evt + " Src:" + _src + " Dest:" + _dest);
|
|
749
741
|
return;
|
|
750
742
|
}
|
|
751
743
|
|
|
@@ -1164,7 +1156,7 @@ module.exports = (RED) => {
|
|
|
1164
1156
|
// 26/12/2021 The KNXEngine is busy waiting for telegram's ACK. Strange.
|
|
1165
1157
|
if (!node.knxConnection.clearToSend) {
|
|
1166
1158
|
if (node.sysLogger !== undefined && node.sysLogger !== null) node.sysLogger.warn(
|
|
1167
|
-
"
|
|
1159
|
+
"handleTelegramQueue: the KNXEngine is busy or is waiting for a telegram ACK with seqNumner " +
|
|
1168
1160
|
node.knxConnection.getSeqNumber() +
|
|
1169
1161
|
". Delay handling queue. YOUR COMPUTER COULD BE TOO SLOW OR BUSY TO KEEP UP ADDED TELEGRAM TO COMMANDQUEUE. Len: 3",
|
|
1170
1162
|
);
|
|
@@ -1263,7 +1255,7 @@ module.exports = (RED) => {
|
|
|
1263
1255
|
try {
|
|
1264
1256
|
const oNode = RED.nodes.getNode(_oKNXMessage.nodecallerid); // 05/04/2022 Get the real node
|
|
1265
1257
|
if (node.sysLogger !== undefined && node.sysLogger !== null) node.sysLogger.error(
|
|
1266
|
-
"
|
|
1258
|
+
"node.knxConnection.write: Payload: " + _oKNXMessage.payload + " GA:" + _oKNXMessage.grpaddr + " DPT:" + _oKNXMessage.dpt + " " + error.stack
|
|
1267
1259
|
);
|
|
1268
1260
|
oNode.setNodeStatus({
|
|
1269
1261
|
fill: "red",
|
|
@@ -1398,7 +1390,7 @@ module.exports = (RED) => {
|
|
|
1398
1390
|
} catch (error) {
|
|
1399
1391
|
// Here comes if no datapoint has beeen found
|
|
1400
1392
|
if (node.sysLogger !== undefined && node.sysLogger !== null) node.sysLogger.error(
|
|
1401
|
-
"
|
|
1393
|
+
"buildInputMessage: Error returning from tryToFigureOutDataPointFromRawValue. Device " +
|
|
1402
1394
|
_srcGA +
|
|
1403
1395
|
" Destination " +
|
|
1404
1396
|
_destGA +
|
|
@@ -1423,7 +1415,7 @@ module.exports = (RED) => {
|
|
|
1423
1415
|
var dpt = dptlib.resolve(sInputDpt);
|
|
1424
1416
|
} catch (error) {
|
|
1425
1417
|
if (node.sysLogger !== undefined && node.sysLogger !== null) node.sysLogger.error(
|
|
1426
|
-
"
|
|
1418
|
+
"buildInputMessage: Error returning from dptlib.resolve(sInputDpt). Device " +
|
|
1427
1419
|
_srcGA +
|
|
1428
1420
|
" Destination " +
|
|
1429
1421
|
_destGA +
|
|
@@ -1449,7 +1441,7 @@ module.exports = (RED) => {
|
|
|
1449
1441
|
jsValue = dptlib.fromBuffer(_Rawvalue, dpt);
|
|
1450
1442
|
if (jsValue === null) {
|
|
1451
1443
|
if (node.sysLogger !== undefined && node.sysLogger !== null) node.sysLogger.error(
|
|
1452
|
-
"
|
|
1444
|
+
"buildInputMessage: received a wrong datagram form KNX BUS, from device " +
|
|
1453
1445
|
_srcGA +
|
|
1454
1446
|
" Destination " +
|
|
1455
1447
|
_destGA +
|
|
@@ -1469,7 +1461,7 @@ module.exports = (RED) => {
|
|
|
1469
1461
|
}
|
|
1470
1462
|
} catch (error) {
|
|
1471
1463
|
if (node.sysLogger !== undefined && node.sysLogger !== null) node.sysLogger.error(
|
|
1472
|
-
"
|
|
1464
|
+
"buildInputMessage: Error returning from DPT decoding. Device " +
|
|
1473
1465
|
_srcGA +
|
|
1474
1466
|
" Destination " +
|
|
1475
1467
|
_destGA +
|
|
@@ -1539,7 +1531,7 @@ module.exports = (RED) => {
|
|
|
1539
1531
|
|
|
1540
1532
|
return finalMessage;
|
|
1541
1533
|
} catch (error) {
|
|
1542
|
-
if (node.sysLogger !== undefined && node.sysLogger !== null) node.sysLogger.error("
|
|
1534
|
+
if (node.sysLogger !== undefined && node.sysLogger !== null) node.sysLogger.error("buildInputMessage error: " + error.message);
|
|
1543
1535
|
return errorMessage;
|
|
1544
1536
|
}
|
|
1545
1537
|
}
|
|
@@ -1552,8 +1544,8 @@ module.exports = (RED) => {
|
|
|
1552
1544
|
try {
|
|
1553
1545
|
_csvText = fs.readFileSync(sFileName, { encoding: "utf8" });
|
|
1554
1546
|
} catch (error) {
|
|
1555
|
-
if (node.sysLogger !== undefined && node.sysLogger !== null) node.sysLogger.error("
|
|
1556
|
-
node.error("
|
|
1547
|
+
if (node.sysLogger !== undefined && node.sysLogger !== null) node.sysLogger.error("ERROR: reading ETS file " + error.message);
|
|
1548
|
+
node.error("ERROR: reading ETS file " + error.message);
|
|
1557
1549
|
return;
|
|
1558
1550
|
}
|
|
1559
1551
|
}
|
|
@@ -1564,9 +1556,9 @@ module.exports = (RED) => {
|
|
|
1564
1556
|
const ajsonOutput = new Array(); // Array: qui va l'output totale con i nodi per node-red
|
|
1565
1557
|
|
|
1566
1558
|
if (_csvText == "") {
|
|
1567
|
-
if (node.sysLogger !== undefined && node.sysLogger !== null) node.sysLogger.info("
|
|
1559
|
+
if (node.sysLogger !== undefined && node.sysLogger !== null) node.sysLogger.info("no csv ETS found");
|
|
1568
1560
|
} else {
|
|
1569
|
-
if (node.sysLogger !== undefined && node.sysLogger !== null) node.sysLogger.info("
|
|
1561
|
+
if (node.sysLogger !== undefined && node.sysLogger !== null) node.sysLogger.info("csv ETS found !");
|
|
1570
1562
|
// 23/08/2019 Delete inwanted CRLF in the GA description
|
|
1571
1563
|
const sTemp = correctCRLFInCSV(_csvText);
|
|
1572
1564
|
|
|
@@ -1676,10 +1668,10 @@ module.exports = (RED) => {
|
|
|
1676
1668
|
const ajsonOutput = new Array(); // Array: qui va l'output totale con i nodi per node-red
|
|
1677
1669
|
|
|
1678
1670
|
if (_esfText === "") {
|
|
1679
|
-
if (node.sysLogger !== undefined && node.sysLogger !== null) node.sysLogger.info("
|
|
1671
|
+
if (node.sysLogger !== undefined && node.sysLogger !== null) node.sysLogger.info("no ESF found");
|
|
1680
1672
|
return;
|
|
1681
1673
|
} else {
|
|
1682
|
-
if (node.sysLogger !== undefined && node.sysLogger !== null) node.sysLogger.info("
|
|
1674
|
+
if (node.sysLogger !== undefined && node.sysLogger !== null) node.sysLogger.info("esf ETS found !");
|
|
1683
1675
|
// Read and decode the CSV in an Array containing: "group address", "DPT", "Device Name"
|
|
1684
1676
|
const fileGA = _esfText.split("\n");
|
|
1685
1677
|
let sGA = "";
|
|
@@ -1797,7 +1789,7 @@ module.exports = (RED) => {
|
|
|
1797
1789
|
}
|
|
1798
1790
|
|
|
1799
1791
|
// 08/10/2021 Every xx seconds, i check if the connection is up and running
|
|
1800
|
-
if (node.sysLogger !== undefined && node.sysLogger !== null) node.sysLogger.info("
|
|
1792
|
+
if (node.sysLogger !== undefined && node.sysLogger !== null) node.sysLogger.info("Autoconnection: " + (node.autoReconnect === false ? "no." : "yes") + " Node " + node.name);
|
|
1801
1793
|
if (node.timerKNXUltimateCheckState !== null) clearInterval(node.timerKNXUltimateCheckState);
|
|
1802
1794
|
node.timerKNXUltimateCheckState = setInterval(() => {
|
|
1803
1795
|
// If the node is disconnected, wait another cycle, then reconnects
|
|
@@ -1808,7 +1800,7 @@ module.exports = (RED) => {
|
|
|
1808
1800
|
node.setAllClientsStatus("Auto reconnect in progress...", "grey", "");
|
|
1809
1801
|
}, 100);
|
|
1810
1802
|
if (node.sysLogger !== undefined && node.sysLogger !== null) node.sysLogger.debug(
|
|
1811
|
-
"
|
|
1803
|
+
"Auto Reconect by timerKNXUltimateCheckState in progress. node.LinkStatus: " +
|
|
1812
1804
|
node.linkStatus +
|
|
1813
1805
|
", node.autoReconnect:" +
|
|
1814
1806
|
node.autoReconnect,
|
|
@@ -1823,7 +1815,7 @@ module.exports = (RED) => {
|
|
|
1823
1815
|
node.setAllClientsStatus("Retry connection", "grey", "");
|
|
1824
1816
|
}, 1000);
|
|
1825
1817
|
if (node.sysLogger !== undefined && node.sysLogger !== null) node.sysLogger.debug(
|
|
1826
|
-
"
|
|
1818
|
+
"Waiting next cycle to reconect. node.LinkStatus: " + node.linkStatus + ", node.autoReconnect:" + node.autoReconnect,
|
|
1827
1819
|
);
|
|
1828
1820
|
// node.initKNXConnection();
|
|
1829
1821
|
}
|
|
@@ -1831,7 +1823,7 @@ module.exports = (RED) => {
|
|
|
1831
1823
|
|
|
1832
1824
|
node.Disconnect = async (_sNodeStatus = "", _sColor = "grey") => {
|
|
1833
1825
|
if (node.linkStatus === "disconnected") {
|
|
1834
|
-
if (node.sysLogger !== undefined && node.sysLogger !== null) node.sysLogger.debug("
|
|
1826
|
+
if (node.sysLogger !== undefined && node.sysLogger !== null) node.sysLogger.debug("Disconnect: already not connected:" + node.linkStatus + ", node.autoReconnect:" + node.autoReconnect);
|
|
1835
1827
|
return;
|
|
1836
1828
|
}
|
|
1837
1829
|
node.linkStatus = "disconnected"; // 29/08/2019 signal disconnection
|
|
@@ -1840,12 +1832,12 @@ module.exports = (RED) => {
|
|
|
1840
1832
|
if (node.knxConnection !== null) await node.knxConnection.Disconnect();
|
|
1841
1833
|
} catch (error) {
|
|
1842
1834
|
if (node.sysLogger !== undefined && node.sysLogger !== null) node.sysLogger.debug(
|
|
1843
|
-
"
|
|
1835
|
+
"Disconnected: node.knxConnection.Disconnect() " + (error.message || "") + " , node.autoReconnect:" + node.autoReconnect,
|
|
1844
1836
|
);
|
|
1845
1837
|
}
|
|
1846
1838
|
node.setAllClientsStatus("Disconnected", _sColor, _sNodeStatus);
|
|
1847
1839
|
saveExposedGAs(); // 04/04/2021 save the current values of GA payload
|
|
1848
|
-
if (node.sysLogger !== undefined && node.sysLogger !== null) node.sysLogger.debug("
|
|
1840
|
+
if (node.sysLogger !== undefined && node.sysLogger !== null) node.sysLogger.debug("Disconnected, node.autoReconnect:" + node.autoReconnect);
|
|
1849
1841
|
};
|
|
1850
1842
|
|
|
1851
1843
|
node.on("close", async function (done) {
|
package/nodes/knxUltimate.html
CHANGED
|
@@ -57,6 +57,11 @@
|
|
|
57
57
|
// onclick: function() {}
|
|
58
58
|
// },
|
|
59
59
|
oneditprepare: function () {
|
|
60
|
+
// Go to the help panel
|
|
61
|
+
try {
|
|
62
|
+
RED.sidebar.show("help");
|
|
63
|
+
} catch (error) { }
|
|
64
|
+
|
|
60
65
|
|
|
61
66
|
var node = this;
|
|
62
67
|
var oNodeServer = RED.nodes.node($("#node-input-server").val()); // Store the config-node
|
|
@@ -398,6 +403,11 @@
|
|
|
398
403
|
|
|
399
404
|
},
|
|
400
405
|
oneditsave: function () {
|
|
406
|
+
// Return to the info tab
|
|
407
|
+
try {
|
|
408
|
+
RED.sidebar.show("info");
|
|
409
|
+
} catch (error) { }
|
|
410
|
+
|
|
401
411
|
var node = this;
|
|
402
412
|
this.sendMsgToKNXCode = this.sendMsgToKNXCodeEditor.getValue();
|
|
403
413
|
this.receiveMsgFromKNXCode = this.receiveMsgFromKNXCodeEditor.getValue();
|
|
@@ -445,6 +455,11 @@
|
|
|
445
455
|
|
|
446
456
|
},
|
|
447
457
|
oneditcancel: function () {
|
|
458
|
+
// Return to the info tab
|
|
459
|
+
try {
|
|
460
|
+
RED.sidebar.show("info");
|
|
461
|
+
} catch (error) { }
|
|
462
|
+
|
|
448
463
|
// 15/09/2020 Supergiovane, Detele the sample help editor
|
|
449
464
|
try {
|
|
450
465
|
node.sampleEditor.destroy();
|