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 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
@@ -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 = loggerSetup({ loglevel: node.loglevel, setPrefix: 'hue-config.js' })
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
- if (node.sysLogger !== null) node.sysLogger = null
2759
- loggerEngine.destroy()
2758
+ node.sysLogger?.destroy()
2759
+ node.sysLogger = null
2760
2760
  } catch (error) { /* empty */ }
2761
2761
  done()
2762
2762
  })
@@ -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
- if (_KNXbrightness_Direction === 0 && _KNXaction === 0) {
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 && _KNXaction === 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 && _KNXaction === 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 && _KNXaction === 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.
@@ -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 = loggerSetup({ loglevel: node.loglevel, setPrefix: 'matter-config.js' })
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 = loggerSetup({ loglevel: node.loglevel, setPrefix: 'matterbridge-config.js' })
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
  })()