node-red-contrib-knx-ultimate 8.0.6 → 8.1.1

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,9 +6,17 @@
6
6
 
7
7
  # CHANGELOG
8
8
 
9
+ **Version 8.1.1** - October 2026
10
+
11
+ - Updated the KNX engine to `knxultimate` 6.2.1.
12
+
13
+ **Version 8.1.0** - October 2026
14
+
15
+ - Updated the KNX engine to `knxultimate` 6.2.0.
16
+
9
17
  **Version 8.0.6** - September 2026
10
18
 
11
- - Updated the KNX engine to `knxultimate` 6.0.8 to restore reception of authenticated Data Secure status telegrams from gateways such as Apricum that omit the outer KNX/IP wrapper.
19
+ - Updated the KNX engine to `knxultimate` 6.0.8 to restore reception of authenticated Data Secure status telegrams from gateways such as Apricum/MDT that omit the outer KNX/IP wrapper.
12
20
  - Secure status nodes now update after group writes while MAC validation and replay protection remain enabled.
13
21
 
14
22
  **Version 8.0.5** - September 2026
package/docs/README.md CHANGED
@@ -4,6 +4,7 @@ The site uses GitHub Pages/Jekyll and keeps the existing URLs and six languages:
4
4
 
5
5
  - `docs/_data/knx8.json`: translated home-page content and version notices.
6
6
  - `docs/_includes/homepage/content.html`: shared home-page structure.
7
+ - `docs/_data/homepage-community.json` and `docs/_includes/homepage/community.html`: partners, community links and translated Made in Italy/KNX acknowledgements, with logos in `docs/assets/community/`.
7
8
  - `docs/wiki/`: node reference, getting started, migration and examples. Use the same `translation_key` for translations and preserve existing `permalink` values.
8
9
  - `scripts/wiki-menu.json`: navigation source. `npm run docs:prepare` regenerates `docs/_data/wiki-nav.json` and copies the package examples to `docs/examples/`.
9
10
  - `examples/`: the maintained importable flows. The copies in `docs/examples/` are generated and ignored by Git.
@@ -12,14 +13,14 @@ The old HUE and Matter pages are version 7 references, marked by `legacy_package
12
13
 
13
14
  ## Local preview
14
15
 
15
- Install the Ruby/Jekyll dependencies from `docs/Gemfile`, then run from the repository root with `jekyll` available on PATH:
16
+ Install the Ruby/Jekyll dependencies from `docs/Gemfile`, then run from the repository root with `ruby` available on PATH:
16
17
 
17
18
  ```sh
18
19
  npm run docs:build
19
20
  npm run docs:serve
20
21
  ```
21
22
 
22
- Open `http://127.0.0.1:4000/node-red-contrib-knx-ultimate/`. The preview uses the same Liquid templates as the real site.
23
+ Open `http://127.0.0.1:4000/node-red-contrib-knx-ultimate/`. The preview uses the same Liquid templates as the real site. The scripts locate Jekyll through RubyGems, so the gem executable directory does not need to be on PATH. `docs:serve:norl` uses the same launcher.
23
24
 
24
25
  `npm run wiki:refresh` imports help for the current Device, Gateway, Viewer, IoT Bridge and routing nodes. It preserves page metadata and archive notices. Getting started, migration, Utility overview/function references and examples are maintained directly in `docs/wiki/`.
25
26
 
@@ -32,6 +32,19 @@ try { NODE_VERSION = require('../package.json').version } catch (e) { /* empty *
32
32
  let KNX_ENGINE_VERSION = 'unknown'
33
33
  try { KNX_ENGINE_VERSION = require('knxultimate/package.json').version } catch (e) { /* empty */ }
34
34
 
35
+ // Returns the group service of a bus telegram, or null when it is not one:
36
+ // transport control TPDUs (T_Connect, T_Disconnect, T_ACK, T_NAK: TPCI only, no APCI)
37
+ // and point-to-point telegrams (cEMI Ctrl2 address type 0 = individual destination).
38
+ const getGroupServiceEvent = (cEMIMessage) => {
39
+ const npdu = cEMIMessage?.npdu
40
+ if (!npdu || npdu.isTransportControl === true) return null
41
+ if (cEMIMessage.control?.addressType === 0) return null
42
+ if (npdu.isGroupRead) return 'GroupValue_Read'
43
+ if (npdu.isGroupResponse) return 'GroupValue_Response'
44
+ if (npdu.isGroupWrite) return 'GroupValue_Write'
45
+ return null
46
+ }
47
+
35
48
  // DATAPONT MANIPULATION HELPERS
36
49
  // ####################
37
50
  const sortBy = (field) => (a, b) => {
@@ -1399,18 +1412,20 @@ module.exports = (RED) => {
1399
1412
  return
1400
1413
  }
1401
1414
 
1402
- let _evt = null
1403
- if (_datagram.cEMIMessage.npdu.isGroupRead) _evt = 'GroupValue_Read'
1404
- if (_datagram.cEMIMessage.npdu.isGroupResponse) _evt = 'GroupValue_Response'
1405
- if (_datagram.cEMIMessage.npdu.isGroupWrite) _evt = 'GroupValue_Write'
1406
-
1407
1415
  let _src = null
1408
1416
  _src = _datagram.cEMIMessage.srcAddress.toString()
1409
1417
 
1410
1418
  let _dest = null
1411
1419
  _dest = _datagram.cEMIMessage.dstAddress.toString()
1412
1420
 
1413
- if (_evt === null || _src === null || _dest === null) {
1421
+ // Point-to-point and transport control telegrams (e.g. an ETS device scan) are valid, but not for us
1422
+ const _evt = getGroupServiceEvent(_datagram.cEMIMessage)
1423
+ if (_evt === null) {
1424
+ node.sysLogger?.debug(`HandleBusEvent: ignored non group telegram src=${_src} dest=${_dest}`)
1425
+ return
1426
+ }
1427
+
1428
+ if (_src === null || _dest === null) {
1414
1429
  node.sysLogger?.warn(`HandleBusEvent: unable to parse telegram, ignored (evt=${_evt || 'n/a'} src=${_src || 'n/a'} dest=${_dest || 'n/a'})`)
1415
1430
  return
1416
1431
  };
@@ -2754,5 +2769,6 @@ module.exports = (RED) => {
2754
2769
  }
2755
2770
 
2756
2771
  module.exports.__test = {
2757
- resolveHostAddress
2772
+ resolveHostAddress,
2773
+ getGroupServiceEvent
2758
2774
  }
package/package.json CHANGED
@@ -3,7 +3,7 @@
3
3
  "engines": {
4
4
  "node": ">=20.18.1"
5
5
  },
6
- "version": "8.0.6",
6
+ "version": "8.1.1",
7
7
  "description": "KNX integration for Node-RED with KNX/IP and KNX Secure, ETS import, routing, diagnostics, automation utilities, MQTT and Modbus adapters. Optional Hue Ultimate and Matter Ultimate packages connect through the KNX gateway.",
8
8
  "files": [
9
9
  "nodes/",
@@ -19,7 +19,7 @@
19
19
  "scripts/check-legacy-flows.js"
20
20
  ],
21
21
  "dependencies": {
22
- "knxultimate": "6.0.8",
22
+ "knxultimate": "6.2.1",
23
23
  "lodash": "4.18.1",
24
24
  "mqtt": "^5.15.2",
25
25
  "ping": "0.4.4",
@@ -97,8 +97,8 @@
97
97
  "docs:sync": "node scripts/export-wiki-to-pages.js",
98
98
  "wiki:refresh": "npm run wiki:help-export && node scripts/generate-wiki-navbar.js && node scripts/prepare-wiki-pages.js && npm run docs:sync",
99
99
  "docs:prepare": "node scripts/generate-wiki-navbar.js && node scripts/prepare-docs.js",
100
- "docs:build": "npm run docs:prepare && jekyll build --source docs --destination docs/_site",
101
- "docs:serve": "npm run docs:prepare && jekyll serve --source docs --destination docs/_site --host 127.0.0.1",
100
+ "docs:build": "npm run docs:prepare && ruby -e \"load Gem.bin_path('jekyll', 'jekyll')\" -- build --source docs --destination docs/_site",
101
+ "docs:serve": "npm run docs:prepare && ruby -e \"load Gem.bin_path('jekyll', 'jekyll')\" -- serve --source docs --destination docs/_site --host 127.0.0.1",
102
102
  "docs:serve:norl": "npm run docs:serve",
103
103
  "knx-utility:generate": "node scripts/generate-knx-utility-profiles.js",
104
104
  "knx-utility:check": "node scripts/generate-knx-utility-profiles.js --check",
@@ -113,4 +113,4 @@
113
113
  "marked": "^14.1.0",
114
114
  "js-yaml": "4.3.2"
115
115
  }
116
- }
116
+ }