node-red-contrib-knx-ultimate 6.3.0 → 6.3.2
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 +10 -0
- package/LICENSE +1 -1
- package/nodes/hue-config.js +3 -9
- package/nodes/knxUltimate-config.js +2 -2
- package/nodes/knxUltimateAI.html +2 -2
- package/nodes/knxUltimateHueLight.js +6 -4
- package/nodes/matter-config.js +3 -9
- package/nodes/matterbridge-config.js +3 -9
- package/nodes/plugins/knxUltimateAI-vue/assets/app.js +4 -3
- package/nodes/plugins/knxUltimateAI-vue/assets/chunk-index.es.js +5 -5
- package/nodes/plugins/knxUltimateAI-vue/assets/chunk-jspdf.es.min.js +58 -57
- package/nodes/plugins/knxUltimateAI-vue/assets/chunk-purify.es.js +3 -3
- package/nodes/plugins/knxUltimateViewer-vue/assets/app.js +2 -1
- package/nodes/utils/hueControllerProfiles/runtime/light.js +6 -4
- package/nodes/utils/sysLogger.js +65 -15
- package/package.json +14 -12
package/CHANGELOG.md
CHANGED
|
@@ -6,6 +6,16 @@
|
|
|
6
6
|
|
|
7
7
|
# CHANGELOG
|
|
8
8
|
|
|
9
|
+
**Version 6.3.2** - August 2026<br/>
|
|
10
|
+
|
|
11
|
+
- Fixed stop issue in dimme-up.<br/>
|
|
12
|
+
|
|
13
|
+
**Version 6.3.1** - August 2026<br/>
|
|
14
|
+
|
|
15
|
+
- Updated dependencies, including the security-fixed jsPDF release.<br/>
|
|
16
|
+
- Replaced `node-color-log` with Winston, shared with the KNXUltimate engine.<br/>
|
|
17
|
+
- **Documentation language navigation**: fixed localized homepage links returning `404` on GitHub Pages because they incorrectly included a trailing slash.<br/>
|
|
18
|
+
|
|
9
19
|
**Version 6.3.0** - August 2026<br/>
|
|
10
20
|
|
|
11
21
|
- **HUE Controller**: unified device-first workflow for all supported Hue API v2 resources, with automatic type detection and legacy-node migration.<br/>
|
package/LICENSE
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
MIT License
|
|
2
2
|
|
|
3
|
-
Copyright (c) 2019 Massimo Saccani
|
|
3
|
+
Copyright (c) 2019 Massimo Saccani (maxsupergiovane@icloud.com)
|
|
4
4
|
|
|
5
5
|
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
6
|
of this software and associated documentation files (the "Software"), to deal
|
package/nodes/hue-config.js
CHANGED
|
@@ -5,6 +5,7 @@
|
|
|
5
5
|
/* eslint-disable no-inner-declarations */
|
|
6
6
|
/* eslint-disable max-len */
|
|
7
7
|
const cloneDeep = require('lodash/cloneDeep')
|
|
8
|
+
const LoggerClass = require('./utils/sysLogger')
|
|
8
9
|
const {
|
|
9
10
|
HUE_CONTROLLER_RESOURCE_TYPES,
|
|
10
11
|
buildHueControllerResourceCatalog
|
|
@@ -12,14 +13,6 @@ const {
|
|
|
12
13
|
// const classHUE = require("./utils/hueEngine").classHUE;
|
|
13
14
|
const hueColorConverter = require('./utils/colorManipulators/hueColorConverter')
|
|
14
15
|
|
|
15
|
-
// 10/09/2024 Setup the color logger
|
|
16
|
-
loggerSetup = (options) => {
|
|
17
|
-
const clog = require('node-color-log').createNamedLogger(options.setPrefix)
|
|
18
|
-
clog.setLevel(options.loglevel)
|
|
19
|
-
clog.setDate(() => (new Date()).toLocaleString())
|
|
20
|
-
return clog
|
|
21
|
-
}
|
|
22
|
-
|
|
23
16
|
module.exports = (RED) => {
|
|
24
17
|
function hueConfig (config) {
|
|
25
18
|
RED.nodes.createNode(this, config)
|
|
@@ -33,7 +26,7 @@ module.exports = (RED) => {
|
|
|
33
26
|
node.pendingHueResourceReload = null
|
|
34
27
|
node.activeHueIdentifySessions = new Map()
|
|
35
28
|
try {
|
|
36
|
-
node.sysLogger =
|
|
29
|
+
node.sysLogger = new LoggerClass({ loglevel: node.loglevel, setPrefix: 'hue-config.js' })
|
|
37
30
|
} catch (error) { console.log(error.stack) }
|
|
38
31
|
node.name = config.name === undefined || config.name === '' ? node.host : config.name
|
|
39
32
|
|
|
@@ -798,6 +791,7 @@ module.exports = (RED) => {
|
|
|
798
791
|
|
|
799
792
|
node.on('close', (done) => {
|
|
800
793
|
try {
|
|
794
|
+
node.sysLogger?.destroy()
|
|
801
795
|
node.sysLogger = null
|
|
802
796
|
node.nodeClients = []
|
|
803
797
|
node.closeConnection()
|
|
@@ -2755,8 +2755,8 @@ module.exports = (RED) => {
|
|
|
2755
2755
|
} catch (error) { /* empty */ }
|
|
2756
2756
|
node.nodeClients = [] // 05/04/2022 Nullify
|
|
2757
2757
|
try {
|
|
2758
|
-
|
|
2759
|
-
|
|
2758
|
+
node.sysLogger?.destroy()
|
|
2759
|
+
node.sysLogger = null
|
|
2760
2760
|
} catch (error) { /* empty */ }
|
|
2761
2761
|
done()
|
|
2762
2762
|
})
|
package/nodes/knxUltimateAI.html
CHANGED
|
@@ -115,7 +115,7 @@
|
|
|
115
115
|
|
|
116
116
|
<script type="text/javascript">
|
|
117
117
|
RED.nodes.registerType('knxUltimateAI', {
|
|
118
|
-
category: "KNX Ultimate",
|
|
118
|
+
category: "KNX Ultimate AI",
|
|
119
119
|
color: '#FF9800',
|
|
120
120
|
defaults: {
|
|
121
121
|
server: { type: "knxUltimate-config", required: true },
|
|
@@ -875,4 +875,4 @@
|
|
|
875
875
|
</div>
|
|
876
876
|
</div>
|
|
877
877
|
</div>
|
|
878
|
-
</script>
|
|
878
|
+
</script>
|
|
@@ -750,7 +750,9 @@ module.exports = function (RED) {
|
|
|
750
750
|
let numStep = 10 // Steps from 0 to 100 by 10
|
|
751
751
|
const extendedConf = {}
|
|
752
752
|
|
|
753
|
-
|
|
753
|
+
// DPT 3.x uses data/step-code 0 for BREAK. The direction bit may be
|
|
754
|
+
// either 0 ($00) or 1 ($08), so it must not be part of this check.
|
|
755
|
+
if (_KNXbrightness_Direction === 0) {
|
|
754
756
|
// STOP DIM
|
|
755
757
|
if (node.timerStepDim !== undefined) clearInterval(node.timerStepDim)
|
|
756
758
|
node.brightnessStep = null
|
|
@@ -835,7 +837,7 @@ module.exports = function (RED) {
|
|
|
835
837
|
// 23/23/2023 after many attempts to use dimming_delta function of the HueApeV2, loosing days of my life, without a decent success, will use the standard dimming calculations
|
|
836
838
|
// i decide to go to the "step brightness" way.
|
|
837
839
|
try {
|
|
838
|
-
if (_KNXbrightness_DirectionTunableWhite === 0
|
|
840
|
+
if (_KNXbrightness_DirectionTunableWhite === 0) {
|
|
839
841
|
// STOP DIM
|
|
840
842
|
if (node.timerStepDimTunableWhite !== undefined) clearInterval(node.timerStepDimTunableWhite)
|
|
841
843
|
node.brightnessStepTunableWhite = null
|
|
@@ -909,7 +911,7 @@ module.exports = function (RED) {
|
|
|
909
911
|
// After many attempts to use dimming_delta function of the HueApiV2, loosing days of my life, without a decent success, will use the standard dimming calculations
|
|
910
912
|
// i decide to go to the "step brightness" way.
|
|
911
913
|
try {
|
|
912
|
-
if (_KNXbrightness_DirectionHSV_H === 0
|
|
914
|
+
if (_KNXbrightness_DirectionHSV_H === 0) {
|
|
913
915
|
// STOP DIM
|
|
914
916
|
if (node.timerStepDimHSV_H !== undefined) clearInterval(node.timerStepDimHSV_H)
|
|
915
917
|
node.deleteHueStateQueue() // Clear dimming queue.
|
|
@@ -997,7 +999,7 @@ module.exports = function (RED) {
|
|
|
997
999
|
// After many attempts to use dimming_delta function of the HueApiV2, loosing days of my life, without a decent success, will use the standard dimming calculations
|
|
998
1000
|
// i decide to go to the "step brightness" way.
|
|
999
1001
|
try {
|
|
1000
|
-
if (_KNXbrightness_DirectionHSV_S === 0
|
|
1002
|
+
if (_KNXbrightness_DirectionHSV_S === 0) {
|
|
1001
1003
|
// STOP DIM
|
|
1002
1004
|
if (node.timerStepDimHSV_S !== undefined) clearInterval(node.timerStepDimHSV_S)
|
|
1003
1005
|
node.deleteHueStateQueue() // Clear dimming queue.
|
package/nodes/matter-config.js
CHANGED
|
@@ -1,17 +1,10 @@
|
|
|
1
1
|
/* eslint-disable max-len */
|
|
2
2
|
const path = require('path')
|
|
3
|
+
const LoggerClass = require('./utils/sysLogger')
|
|
3
4
|
const { exportMatterStorage, importMatterStorage } = require('./utils/matterStorageBackup')
|
|
4
5
|
const matterPackageVersion = require('@matter/main').version
|
|
5
6
|
const { Specification } = require('@matter/model')
|
|
6
7
|
|
|
7
|
-
// 10/09/2024 Setup the color logger
|
|
8
|
-
const loggerSetup = (options) => {
|
|
9
|
-
const clog = require('node-color-log').createNamedLogger(options.setPrefix)
|
|
10
|
-
clog.setLevel(options.loglevel)
|
|
11
|
-
clog.setDate(() => (new Date()).toLocaleString())
|
|
12
|
-
return clog
|
|
13
|
-
}
|
|
14
|
-
|
|
15
8
|
module.exports = (RED) => {
|
|
16
9
|
function matterConfig (config) {
|
|
17
10
|
RED.nodes.createNode(this, config)
|
|
@@ -30,7 +23,7 @@ module.exports = (RED) => {
|
|
|
30
23
|
message: 'Waiting for commissioning to start.'
|
|
31
24
|
}
|
|
32
25
|
try {
|
|
33
|
-
node.sysLogger =
|
|
26
|
+
node.sysLogger = new LoggerClass({ loglevel: node.loglevel, setPrefix: 'matter-config.js' })
|
|
34
27
|
} catch (error) { console.log(error.stack) }
|
|
35
28
|
node.name = config.name === undefined || config.name === '' ? 'Matter Controller' : config.name
|
|
36
29
|
node.fabricLabel = config.fabricLabel === undefined || config.fabricLabel === '' ? 'KNX-Ultimate' : config.fabricLabel
|
|
@@ -378,6 +371,7 @@ module.exports = (RED) => {
|
|
|
378
371
|
try {
|
|
379
372
|
if (node.matterManager !== null) await node.matterManager.close()
|
|
380
373
|
node.matterManager = null
|
|
374
|
+
node.sysLogger?.destroy()
|
|
381
375
|
node.sysLogger = null
|
|
382
376
|
done()
|
|
383
377
|
} catch (error) {
|
|
@@ -1,17 +1,10 @@
|
|
|
1
1
|
/* eslint-disable max-len */
|
|
2
2
|
const path = require('path')
|
|
3
|
+
const LoggerClass = require('./utils/sysLogger')
|
|
3
4
|
const { exportMatterStorage, importMatterStorage } = require('./utils/matterStorageBackup')
|
|
4
5
|
const matterPackageVersion = require('@matter/main').version
|
|
5
6
|
const { Specification } = require('@matter/model')
|
|
6
7
|
|
|
7
|
-
// 10/09/2024 Setup the color logger
|
|
8
|
-
const loggerSetup = (options) => {
|
|
9
|
-
const clog = require('node-color-log').createNamedLogger(options.setPrefix)
|
|
10
|
-
clog.setLevel(options.loglevel)
|
|
11
|
-
clog.setDate(() => (new Date()).toLocaleString())
|
|
12
|
-
return clog
|
|
13
|
-
}
|
|
14
|
-
|
|
15
8
|
// The running Matter servers, keyed by config node id. Kept OUTSIDE the node lifecycle:
|
|
16
9
|
// a re-deploy must NOT restart the Matter server, otherwise the paired controllers
|
|
17
10
|
// resume their session without re-reading the structure and never see device changes.
|
|
@@ -26,7 +19,7 @@ module.exports = (RED) => {
|
|
|
26
19
|
node.loglevel = config.loglevel !== undefined ? config.loglevel : 'error'
|
|
27
20
|
node.sysLogger = null
|
|
28
21
|
try {
|
|
29
|
-
node.sysLogger =
|
|
22
|
+
node.sysLogger = new LoggerClass({ loglevel: node.loglevel, setPrefix: 'matterbridge-config.js' })
|
|
30
23
|
} catch (error) { console.log(error.stack) }
|
|
31
24
|
|
|
32
25
|
node.name = config.name === undefined || config.name === '' ? 'Matter Bridge' : config.name
|
|
@@ -258,6 +251,7 @@ module.exports = (RED) => {
|
|
|
258
251
|
} catch (error) { /* empty */ }
|
|
259
252
|
node.matterBridge = null
|
|
260
253
|
node.deviceClients.clear()
|
|
254
|
+
node.sysLogger?.destroy()
|
|
261
255
|
node.sysLogger = null
|
|
262
256
|
done()
|
|
263
257
|
})()
|