node-red-contrib-knx-ultimate 6.3.11 → 6.3.13

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.
Files changed (44) hide show
  1. package/CHANGELOG.md +9 -0
  2. package/examples/Matter Controller - Semantic Flow Input.json +1 -1
  3. package/nodes/icons/node-matter-bridge-icon.svg +2 -2
  4. package/nodes/icons/node-matter-controller-icon.svg +2 -2
  5. package/nodes/icons/node-matter-icon.svg +1 -1
  6. package/nodes/knxUltimateHueController.html +23 -10
  7. package/nodes/knxUltimateMatterBridge.html +4 -4
  8. package/nodes/knxUltimateMatterControllerDevice.html +3 -3
  9. package/nodes/locales/de/knxUltimateHueController.html +3 -1
  10. package/nodes/locales/de/knxUltimateHueController.json +3 -0
  11. package/nodes/locales/de/knxUltimateMatterBridge.html +0 -2
  12. package/nodes/locales/de/knxUltimateMatterBridge.json +1 -1
  13. package/nodes/locales/de/knxUltimateMatterControllerDevice.html +0 -2
  14. package/nodes/locales/de/matterbridge-config.html +1 -3
  15. package/nodes/locales/en/knxUltimateHueController.json +3 -0
  16. package/nodes/locales/en/knxUltimateMatterBridge.html +0 -2
  17. package/nodes/locales/en/knxUltimateMatterBridge.json +1 -1
  18. package/nodes/locales/en/knxUltimateMatterControllerDevice.html +0 -2
  19. package/nodes/locales/en/matterbridge-config.html +1 -3
  20. package/nodes/locales/es/knxUltimateHueController.html +50 -50
  21. package/nodes/locales/es/knxUltimateHueController.json +4 -1
  22. package/nodes/locales/es/knxUltimateMatterBridge.html +0 -2
  23. package/nodes/locales/es/knxUltimateMatterBridge.json +1 -1
  24. package/nodes/locales/es/knxUltimateMatterControllerDevice.html +0 -2
  25. package/nodes/locales/es/matterbridge-config.html +1 -3
  26. package/nodes/locales/fr/knxUltimateHueController.html +45 -45
  27. package/nodes/locales/fr/knxUltimateHueController.json +4 -1
  28. package/nodes/locales/fr/knxUltimateMatterBridge.html +0 -2
  29. package/nodes/locales/fr/knxUltimateMatterBridge.json +1 -1
  30. package/nodes/locales/fr/knxUltimateMatterControllerDevice.html +0 -2
  31. package/nodes/locales/fr/matterbridge-config.html +1 -3
  32. package/nodes/locales/it/knxUltimateHueController.html +1 -1
  33. package/nodes/locales/it/knxUltimateHueController.json +3 -0
  34. package/nodes/locales/it/knxUltimateMatterBridge.html +0 -2
  35. package/nodes/locales/it/knxUltimateMatterBridge.json +1 -1
  36. package/nodes/locales/it/knxUltimateMatterControllerDevice.html +0 -2
  37. package/nodes/locales/it/matterbridge-config.html +1 -3
  38. package/nodes/locales/zh-CN/knxUltimateHueController.json +3 -0
  39. package/nodes/locales/zh-CN/knxUltimateMatterBridge.html +0 -2
  40. package/nodes/locales/zh-CN/knxUltimateMatterBridge.json +1 -1
  41. package/nodes/locales/zh-CN/knxUltimateMatterControllerDevice.html +0 -2
  42. package/nodes/locales/zh-CN/matterbridge-config.html +1 -3
  43. package/package.json +1 -1
  44. package/resources/hueControllerProfiles.js +33 -17
package/CHANGELOG.md CHANGED
@@ -6,6 +6,15 @@
6
6
 
7
7
  # CHANGELOG
8
8
 
9
+ **Version 6.3.13** - August 2026<br/>
10
+
11
+ - **Matter**: promoted Matter Controller, Matter Bridge and Expose KNX to Matter from BETA to production-ready status; removed BETA labels and experimental warnings from the palette, editor help, examples and multilingual documentation while retaining pairing, backup and endpoint-structure safety guidance.<br/>
12
+ - **Matter visual identity**: changed the Matter node background to the official Matter Day color (`#F3FFFF`) and the controller/bridge icon artwork to Matter Night (`#131926`) for readable, standards-aligned palette and canvas presentation.<br/>
13
+
14
+ **Version 6.3.12** - August 2026<br/>
15
+
16
+ - **HUE Controller**: completed the EN, IT, DE, FR, ES and zh-CN editor translations, including Light Level, Locate, Light mapping labels, mapping placeholders, error messages and tutorial links; the embedded profiles and dynamic device labels now follow Node-RED's active locale instead of a potentially stale page-language attribute. Corrected French/Spanish Hue and KNX terminology and realigned the localized help and wiki documentation.<br/>
17
+
9
18
  **Version 6.3.11** - August 2026<br/>
10
19
 
11
20
  - **Matter Controller**: fixed KNX GA mapping tabs being hidden by transient empty KNX/Matter config-selector values during Node-RED 5 editor initialization; saved gateways now remain selected until the user explicitly changes them.<br/>
@@ -4,7 +4,7 @@
4
4
  "type": "tab",
5
5
  "label": "Matter Controller - Flow input",
6
6
  "disabled": false,
7
- "info": "Example of the semantic msg.payload = { function, value } contract for Control Matter from KNX (BETA).\n\nAfter importing:\n1. Open the example Matter Controller node.\n2. Select your existing Matter Controller configuration and a commissioned non-light endpoint.\n3. Enable Node Input/Output PINs.\n4. In the Flow input section shown below the PIN selector, use only the Inject nodes matching functions advertised by the device.\n\nThis example creates no matter-config and sends no command automatically."
7
+ "info": "Example of the semantic msg.payload = { function, value } contract for Control Matter from KNX.\n\nAfter importing:\n1. Open the example Matter Controller node.\n2. Select your existing Matter Controller configuration and a commissioned non-light endpoint.\n3. Enable Node Input/Output PINs.\n4. In the Flow input section shown below the PIN selector, use only the Inject nodes matching functions advertised by the device.\n\nThis example creates no matter-config and sends no command automatically."
8
8
  },
9
9
  {
10
10
  "id": "matter_semantic_instructions",
@@ -1,6 +1,6 @@
1
1
  <?xml version="1.0" encoding="UTF-8"?>
2
2
  <svg width="40" height="60" viewBox="0 0 40 60" xmlns="http://www.w3.org/2000/svg" role="img" aria-label="Matter Bridge">
3
- <text x="20" y="21" fill="#ffffff" text-anchor="middle" font-family="Arial, sans-serif" font-size="20" font-weight="700" textLength="38" lengthAdjust="spacingAndGlyphs">mat</text>
3
+ <text x="20" y="21" fill="#131926" text-anchor="middle" font-family="Arial, sans-serif" font-size="20" font-weight="700" textLength="38" lengthAdjust="spacingAndGlyphs">mat</text>
4
4
  <path d="M 37 34 H 12 V 29 L 2 38 L 12 47 V 42 H 25"
5
- fill="none" stroke="#ffffff" stroke-width="2.6" stroke-linecap="round" stroke-linejoin="round"/>
5
+ fill="none" stroke="#131926" stroke-width="2.6" stroke-linecap="round" stroke-linejoin="round"/>
6
6
  </svg>
@@ -1,6 +1,6 @@
1
1
  <?xml version="1.0" encoding="UTF-8"?>
2
2
  <svg width="40" height="60" viewBox="0 0 40 60" xmlns="http://www.w3.org/2000/svg" role="img" aria-label="Matter Controller">
3
- <text x="20" y="21" fill="#ffffff" text-anchor="middle" font-family="Arial, sans-serif" font-size="20" font-weight="700" textLength="38" lengthAdjust="spacingAndGlyphs">mat</text>
3
+ <text x="20" y="21" fill="#131926" text-anchor="middle" font-family="Arial, sans-serif" font-size="20" font-weight="700" textLength="38" lengthAdjust="spacingAndGlyphs">mat</text>
4
4
  <path d="M 3 34 H 28 V 29 L 38 38 L 28 47 V 42 H 15"
5
- fill="none" stroke="#ffffff" stroke-width="2.6" stroke-linecap="round" stroke-linejoin="round"/>
5
+ fill="none" stroke="#131926" stroke-width="2.6" stroke-linecap="round" stroke-linejoin="round"/>
6
6
  </svg>
@@ -1,6 +1,6 @@
1
1
  <?xml version="1.0" encoding="UTF-8"?>
2
2
  <svg width="40" height="60" viewBox="0 0 40 60" xmlns="http://www.w3.org/2000/svg">
3
- <g fill="#ffffff" stroke="none">
3
+ <g fill="#131926" stroke="none">
4
4
  <circle cx="20" cy="30" r="4.5"/>
5
5
  <g id="matterArrow">
6
6
  <rect x="18.4" y="9" width="3.2" height="11"/>
@@ -254,11 +254,18 @@
254
254
  `);
255
255
  };
256
256
 
257
- const migrationText = (node, key, fallback, values) => {
257
+ const controllerMessage = (key, values) => {
258
258
  try {
259
- const translated = node._(`knxUltimateHueController.${key}`, values);
260
- if (translated && translated !== `knxUltimateHueController.${key}`) return translated;
259
+ const messageKey = `node-red-contrib-knx-ultimate/knxUltimateHueController:knxUltimateHueController.${key}`;
260
+ const translated = RED._(messageKey, values);
261
+ if (translated && translated !== messageKey) return translated;
261
262
  } catch (error) { /* empty */ }
263
+ return undefined;
264
+ };
265
+
266
+ const migrationText = (_node, key, fallback, values) => {
267
+ const translated = controllerMessage(key, values);
268
+ if (translated) return translated;
262
269
  return fallback;
263
270
  };
264
271
 
@@ -318,7 +325,13 @@
318
325
  icon: 'node-hue-icon.svg',
319
326
  label() {
320
327
  const profile = PROFILE_TYPES[this.hueControllerType] || PROFILE_TYPES.light;
321
- return this.name || `HUE Controller · ${profile.label}`;
328
+ let typeLabel = profile.label;
329
+ try {
330
+ const translationKey = `node-red-contrib-knx-ultimate/knxUltimateHueController:knxUltimateHueController.types.${this.hueControllerType || 'light'}`;
331
+ const translated = RED._(translationKey);
332
+ if (translated && translated !== translationKey) typeLabel = translated;
333
+ } catch (error) { /* use catalog fallback */ }
334
+ return this.name || `HUE Controller · ${typeLabel}`;
322
335
  },
323
336
  paletteLabel: 'HUE Controller',
324
337
  oneditprepare() {
@@ -435,10 +448,8 @@
435
448
  };
436
449
 
437
450
  const controllerText = (key, fallback) => {
438
- try {
439
- const translated = controllerNode._(`knxUltimateHueController.${key}`);
440
- if (translated && translated !== `knxUltimateHueController.${key}`) return translated;
441
- } catch (error) { /* empty */ }
451
+ const translated = controllerMessage(key);
452
+ if (translated) return translated;
442
453
  return fallback;
443
454
  };
444
455
 
@@ -710,7 +721,9 @@
710
721
  $container.toggleClass('hue-controller-light-profile', controllerType === 'light');
711
722
 
712
723
  if (!definition || !template) {
713
- $container.html('<div class="hue-controller-editor-error">The selected Hue editor is unavailable. Restart Node-RED after updating the package.</div>');
724
+ $container.html($('<div class="hue-controller-editor-error"></div>').text(
725
+ controllerText('editor_unavailable', 'The selected Hue editor is unavailable. Restart Node-RED after updating the package.')
726
+ ));
714
727
  return;
715
728
  }
716
729
 
@@ -967,7 +980,7 @@
967
980
  <script type="text/html" data-template-name="knxUltimateHueController">
968
981
  <div class="form-row" style="margin-bottom:14px;">
969
982
  <span style="color:#ff0000"><i class="fa fa-youtube"></i></span>&nbsp;
970
- <a target="_blank" rel="noopener noreferrer" href="https://www.youtube.com/playlist?list=PL9Yh1bjbLAYrU8PsVhW4xzEug2WtVFv3E"><b>KNX-Ultimate video tutorials (YouTube playlist)</b></a>
983
+ <a target="_blank" rel="noopener noreferrer" href="https://www.youtube.com/playlist?list=PL9Yh1bjbLAYrU8PsVhW4xzEug2WtVFv3E"><b data-i18n="knxUltimateHueController.tutorials_link"></b></a>
971
984
  </div>
972
985
  <div class="form-row" id="hue-controller-migrate-legacy-flow-row" style="display:none; margin-bottom:14px;">
973
986
  <a class="hue-legacy-migration-video" href="https://youtu.be/f0Evf2QFI7c" target="_blank" rel="noopener noreferrer" style="display:inline-flex; align-items:center; gap:5px; margin-right:10px;" data-i18n="[title]knxUltimateHueController.migration_video_title">
@@ -118,15 +118,15 @@
118
118
 
119
119
  RED.nodes.registerType('knxUltimateMatterBridge', {
120
120
  category: 'KNX Ultimate Matter',
121
- color: '#8FE3D4',
121
+ color: '#F3FFFF',
122
122
  defaults: gaDefaults,
123
123
  inputs: 0,
124
124
  outputs: 0,
125
125
  icon: 'node-matter-bridge-icon.svg',
126
126
  label() {
127
- return this.name || 'Expose KNX to Matter (BETA)';
127
+ return this.name || 'Expose KNX to Matter';
128
128
  },
129
- paletteLabel: 'Expose KNX to Matter (BETA)',
129
+ paletteLabel: 'Expose KNX to Matter',
130
130
  oneditprepare() {
131
131
  try { RED.sidebar.show('help'); } catch (error) { /* empty */ }
132
132
  const node = this;
@@ -632,7 +632,7 @@
632
632
  </script>
633
633
 
634
634
  <script type="text/markdown" data-help-name="knxUltimateMatterBridge">
635
- Exposes **one KNX device as a Matter device**. This node is in **BETA**.
635
+ Exposes **one KNX device as a Matter device**.
636
636
 
637
637
  Point it to a **Matter Bridge** configuration node (the actual bridge, paired once by Alexa/Google Home/Apple Home), pick the device type, give it the name the assistant will use, and fill the group addresses.
638
638
 
@@ -10,7 +10,7 @@
10
10
 
11
11
  RED.nodes.registerType("knxUltimateMatterControllerDevice", {
12
12
  category: "KNX Ultimate Matter",
13
- color: "#8FE3D4",
13
+ color: "#F3FFFF",
14
14
  defaults: {
15
15
  //buttonState: {value: true},
16
16
  server: { type: "knxUltimate-config", required: false },
@@ -142,9 +142,9 @@
142
142
  outputs: 0,
143
143
  icon: "node-matter-controller-icon.svg",
144
144
  label: function () {
145
- return this.name || this.matterDeviceName || "Control Matter from KNX (BETA)";
145
+ return this.name || this.matterDeviceName || "Control Matter from KNX";
146
146
  },
147
- paletteLabel: "Control Matter from KNX (BETA)",
147
+ paletteLabel: "Control Matter from KNX",
148
148
  oneditprepare: function () {
149
149
  // Go to the help panel
150
150
  try {
@@ -1,5 +1,5 @@
1
1
  <script type="text/markdown" data-help-name="knxUltimateHueController">
2
- <p><a href="https://www.youtube.com/playlist?list=PL9Yh1bjbLAYrU8PsVhW4xzEug2WtVFv3E" target="_blank" rel="noopener noreferrer"><strong>KNX-Ultimate video tutorials (YouTube playlist)</strong></a> Sehen Sie sich vor dem Start die <a href="https://youtu.be/f0Evf2QFI7c" target="_blank" rel="noopener noreferrer">Videoanleitung auf YouTube</a> an.</p>
2
+ <p><a href="https://www.youtube.com/playlist?list=PL9Yh1bjbLAYrU8PsVhW4xzEug2WtVFv3E" target="_blank" rel="noopener noreferrer"><strong>KNX-Ultimate-Videotutorials (YouTube-Playlist)</strong></a> Sehen Sie sich vor dem Start die <a href="https://youtu.be/f0Evf2QFI7c" target="_blank" rel="noopener noreferrer">Videoanleitung auf YouTube</a> an.</p>
3
3
  <p><strong>HUE Controller</strong> ist der einheitliche Knoten für Hue-API-v2-Ressourcen.</p>
4
4
  <p>Wählen Sie ein Hue-Gerät oder eine Hue-Ressource. HUE Controller erkennt den Gerätetyp automatisch und öffnet den passenden Editor für KNX-Zuordnungen, Verhalten und Node-Anschlüsse.</p>
5
5
  <p>Geräteauswahl, Aktualisierung und erkannter Typ stehen wie beim Matter Controller in derselben kompakten Zeile.</p>
@@ -154,6 +154,8 @@ Die Tabelle **Hue-native Effekte** ordnet KNX-Werte den vom Bridge gemeldeten Ef
154
154
  | Night lighting | Nacht-Profil (Farbe oder Temperatur/Helligkeit) |
155
155
  | Day/Night | GA zur Umschaltung Tag/Nacht (_true_ = Tag, _false_ = Nacht) |
156
156
  | Invert Day/Night | Wert der Tag/Nacht-GA invertieren |
157
+ | Status beim Start lesen | Status beim Start lesen und bei Start/Wiederverbindung als Ereignis auf den KNX-Bus senden (Standard: „Nein“) |
158
+ | Tagmodus erzwingen | Der Tagmodus kann durch schnelles Aus- und Einschalten dieser Leuchte oder aller Leuchtenknoten aktiviert werden. |
157
159
  | Node I/O pins | Ein/Ausblenden der Eingangs/Ausgangs-Pins; Input folgt HUE API v2 (z. B. <code>msg.on = { on: true }</code>) |
158
160
 
159
161
  Hinweis: Start/Stop-Dimmen im KNX-Modus wird über die üblichen Start/Stop-Telegramme gesteuert.
@@ -4,6 +4,9 @@
4
4
  "hue_bridge": "Hue Bridge"
5
5
  },
6
6
  "knxUltimateHueController": {
7
+ "locale": "de",
8
+ "tutorials_link": "KNX-Ultimate-Videotutorials (YouTube-Playlist)",
9
+ "editor_unavailable": "Der ausgewählte Hue-Editor ist nicht verfügbar. Starten Sie Node-RED nach der Paketaktualisierung neu.",
7
10
  "device_function": "Gerätefunktion",
8
11
  "hue_device": "Hue-Gerät",
9
12
  "hue_device_placeholder": "Hue-Gerät oder -Ressource suchen",
@@ -1,6 +1,4 @@
1
1
  <script type="text/markdown" data-help-name="knxUltimateMatterBridge">
2
- > Dieser Node ist in **BETA**: Er funktioniert, aber Details können sich zwischen Releases noch ändern.
3
-
4
2
  ## Übersicht
5
3
 
6
4
  Jeder Expose KNX to Matter Node stellt **ein KNX-Gerät als Matter-Gerät** bereit: Die gekoppelten Controller (Alexa, Google Home, Apple Home...) sehen es mit dem von dir vergebenen Namen — bereit für App- und Sprachsteuerung. Verweise ihn auf einen **Matter Bridge**-Konfigurations-Node (die eigentliche Bridge, einmal gekoppelt - der Kopplungs-QR-Code lebt dort) und füge beliebig viele Device-Nodes hinzu, überall in deinen Flows.
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "knxUltimateMatterBridge": {
3
- "title": "Expose KNX to Matter (BETA)",
3
+ "title": "Expose KNX to Matter",
4
4
  "bridge_name": "Name der Matter-Bridge",
5
5
  "port": "Port",
6
6
  "devices_help": "Füge die KNX-Geräte hinzu, die über Matter bereitgestellt werden sollen. Der \"Name\" ist der, den Alexa/Google/Apple anzeigen und für Sprachbefehle verwenden. Befehls-GA = wird geschrieben, wenn der Assistent einen Befehl sendet; Status-GA = wird vom Bus gelesen, um die App aktuell zu halten.",
@@ -1,6 +1,4 @@
1
1
  <script type="text/markdown" data-help-name="knxUltimateMatterControllerDevice">
2
- > Dieser Knoten ist **BETA**: das Verhalten kann sich ändern, während die Matter-Implementierung weiter verfeinert wird.
3
-
4
2
  Dieser Knoten steuert einen bereits gekoppelten Matter-Endpunkt über KNX. Wähle das Matter-Gerät aus; der Editor erkennt die Fähigkeiten des Endpunkts und zeigt nur die passenden KNX-Zuordnungen.
5
3
 
6
4
  Ein Klick oder Fokus auf das Matter-Gerätefeld öffnet immer die vollständige Liste der gekoppelten Endpunkte, auch wenn bereits ein Gerät ausgewählt ist. Beim Tippen wird die Liste weiterhin gefiltert.
@@ -1,7 +1,5 @@
1
1
  <script type="text/markdown" data-help-name="matterbridge-config">
2
- # Matter Bridge (BETA)
3
-
4
- > Dieser Node ist in **BETA**: Er funktioniert, aber Details können sich zwischen Releases noch ändern.
2
+ # Matter Bridge
5
3
 
6
4
  ## Übersicht
7
5
 
@@ -4,6 +4,9 @@
4
4
  "hue_bridge": "Hue Bridge"
5
5
  },
6
6
  "knxUltimateHueController": {
7
+ "locale": "en",
8
+ "tutorials_link": "KNX-Ultimate video tutorials (YouTube playlist)",
9
+ "editor_unavailable": "The selected Hue editor is unavailable. Restart Node-RED after updating the package.",
7
10
  "device_function": "Device function",
8
11
  "hue_device": "Hue device",
9
12
  "hue_device_placeholder": "Search your Hue device or resource",
@@ -1,6 +1,4 @@
1
1
  <script type="text/markdown" data-help-name="knxUltimateMatterBridge">
2
- > This node is in **BETA**: it works, but details may still change between releases.
3
-
4
2
  ## Overview
5
3
 
6
4
  Each Expose KNX to Matter node exposes **one KNX device as a Matter device**: the paired controllers (Alexa, Google Home, Apple Home...) see it, with the name you typed, ready for app and voice control. Point it to a **Matter Bridge** configuration node (the actual bridge, paired once - the pairing QR code lives there) and add as many device nodes as you want, anywhere in your flows.
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "knxUltimateMatterBridge": {
3
- "title": "Expose KNX to Matter (BETA)",
3
+ "title": "Expose KNX to Matter",
4
4
  "bridge_name": "Matter bridge name",
5
5
  "port": "Port",
6
6
  "devices_help": "Add the KNX devices to expose on Matter. The \"Name\" is what Alexa/Google/Apple will show and use for voice commands. Command GA = written when the assistant sends a command; Status GA = read from the bus to keep the app updated.",
@@ -1,6 +1,4 @@
1
1
  <script type="text/markdown" data-help-name="knxUltimateMatterControllerDevice">
2
- > This node is in **BETA**: behaviour can change while the Matter implementation is refined.
3
-
4
2
  This node controls a commissioned Matter endpoint from KNX. Select the Matter device and the editor detects its capabilities, then shows only the KNX mappings that make sense for that endpoint.
5
3
 
6
4
  Clicking or focusing the Matter device field always opens the complete commissioned endpoint list, even when a device is already selected. Typing continues to filter it.
@@ -1,7 +1,5 @@
1
1
  <script type="text/markdown" data-help-name="matterbridge-config">
2
- # Matter Bridge (BETA)
3
-
4
- > This node is in **BETA**: it works, but details may still change between releases.
2
+ # Matter Bridge
5
3
 
6
4
  ## Overview
7
5