node-red-contrib-knx-ultimate 5.2.2 → 5.2.3

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,13 @@
6
6
 
7
7
  # CHANGELOG
8
8
 
9
+ **Version 5.2.3** - July 2026<br/>
10
+
11
+ - **MQTT / Home Assistant bridge — Entity name format**: new selector to reshape the names exposed to Home Assistant. The ETS import builds each name with the group-address path first (e.g. `(Lights->Ground floor) Living room`); now you can choose *As imported from ETS* (default), *Name first* (`Living room (Lights->Ground floor)`), *Name only* (`Living room`) or *Name + group address* (`Living room (0/1/2)`). Changing it only updates the friendly name (the `unique_id`/`object_id` stay stable, so existing entities are not duplicated).<br/>
12
+ - The group-address list in the editor now previews the chosen format **live**: pick a format and every row is re-labelled instantly, exactly as it will appear in Home Assistant, without reloading the list or losing the expose / read-only ticks.<br/>
13
+ - Entity names are sanitized before publishing: ASCII control characters are stripped and runs of whitespace collapsed (ETS exports sometimes lose an accented character and leave a double space, e.g. `Velocità vento` → `Velocit vento`), and a name that would be empty falls back to the group address.<br/>
14
+ - **Documentation**: node help and the online IoT-Bridge page updated for the new option in all six languages (EN/IT/DE/FR/ES/zh-CN).<br/>
15
+
9
16
  **Version 5.2.2** - July 2026<br/>
10
17
 
11
18
  - New **Matter Bridge (BETA)**: exposes **KNX group addresses as Matter devices**. Alexa, Google Home, Apple Home (or any Matter controller) commission the bridge once — via QR code or 11-digit manual code shown in the editor — and see all your KNX devices with the names you typed, ready for app and voice control. It is the opposite direction of the Matter Device node introduced in 5.1.0.<br/>
@@ -12,7 +12,7 @@
12
12
  readOnDeploy: { value: true },
13
13
  acceptFlowInput: { value: true },
14
14
  mappings: { value: [] },
15
- nodeMode: { value: 'iot' },
15
+ nodeMode: { value: 'homeassistant' },
16
16
  haBusMode: { value: 'standalone' },
17
17
  inputs: { value: 1 },
18
18
  outputs: { value: 2 },
@@ -20,6 +20,7 @@
20
20
  mqttBaseTopic: { value: 'knx-ultimate' },
21
21
  mqttDiscovery: { value: true },
22
22
  mqttDiscoveryPrefix: { value: 'homeassistant' },
23
+ mqttNameFormat: { value: 'full' },
23
24
  mqttCustomEntities: { value: [] },
24
25
  mqttExposedGAs: { value: [] },
25
26
  mqttReadOnlyGAs: { value: [] },
@@ -327,6 +328,41 @@
327
328
  const readOnlySet = new Set(Array.isArray(node.mqttReadOnlyGAs) ? node.mqttReadOnlyGAs : []);
328
329
  const exposeConfigured = node.mqttExposeConfigured === true;
329
330
 
331
+ // Mirror of formatEntityName() in lib/mqtt-bridge.js so the preview here matches
332
+ // exactly what gets published to Home Assistant (control chars stripped, whitespace
333
+ // collapsed, ETS path reshaped per the chosen format).
334
+ function sanitizeGaName(value) {
335
+ return String(value == null ? '' : value)
336
+ .replace(/[\u0000-\u001f\u007f]/g, ' ')
337
+ .replace(/\s+/g, ' ')
338
+ .trim();
339
+ }
340
+ function formatGaName(raw, ga, format) {
341
+ const full = sanitizeGaName(raw);
342
+ if (full === '') return ga;
343
+ if (!format || format === 'full') return full;
344
+ const m = full.match(/^\(([^)]*)\)\s*(.*)$/);
345
+ const path = m ? m[1].trim() : '';
346
+ const name = m ? (m[2].trim() || ga) : full;
347
+ let result;
348
+ switch (format) {
349
+ case 'name-first': result = path ? (name + ' (' + path + ')') : name; break;
350
+ case 'name-only': result = name; break;
351
+ case 'name-ga': result = name + ' (' + ga + ')'; break;
352
+ default: result = full;
353
+ }
354
+ return sanitizeGaName(result) || ga;
355
+ }
356
+ // Re-label every GA row from its stored raw name using the currently selected format.
357
+ function applyGaNameFormat() {
358
+ const fmt = $('#node-input-mqttNameFormat').val() || 'full';
359
+ $('#mqtt-ga-list .mqtt-ga-name').each(function () {
360
+ const span = $(this);
361
+ const text = formatGaName(span.data('raw'), span.data('ga'), fmt);
362
+ span.text(text).attr('title', text);
363
+ });
364
+ }
365
+
330
366
  function updateGaCount() {
331
367
  const total = $('#mqtt-ga-list input.mqtt-ga-cb').length;
332
368
  const sel = $('#mqtt-ga-list input.mqtt-ga-cb:checked').length;
@@ -359,7 +395,9 @@
359
395
  const cb = $('<input/>', { type: 'checkbox', class: 'mqtt-ga-cb', value: item.ga, style: 'width:auto; margin:0; flex:0 0 auto;' }).appendTo(row);
360
396
  cb.prop('checked', exposeConfigured ? savedSet.has(item.ga) : true);
361
397
  $('<span/>').css({ flex: '0 0 auto', fontFamily: 'monospace', minWidth: '64px' }).text(item.ga).appendTo(row);
362
- $('<span/>').css({ flex: '1 1 auto', minWidth: '0', overflow: 'hidden', textOverflow: 'ellipsis', whiteSpace: 'nowrap', color: '#444' }).attr('title', item.devicename || '').text(item.devicename || '').appendTo(row);
398
+ // Keep the raw ETS name + GA on the element so applyGaNameFormat() can
399
+ // re-label it live when the "Entity name format" select changes.
400
+ $('<span/>').addClass('mqtt-ga-name').css({ flex: '1 1 auto', minWidth: '0', overflow: 'hidden', textOverflow: 'ellipsis', whiteSpace: 'nowrap', color: '#444' }).data('raw', item.devicename || '').data('ga', item.ga).appendTo(row);
363
401
  $('<span/>').css({ flex: '0 0 auto', color: '#888', fontSize: '11px' }).text('DPT' + (item.dpt || '')).appendTo(row);
364
402
  // Read-only toggle: expose the GA to HA but never accept commands back to KNX.
365
403
  const roLabel = $('<label/>').css({ flex: '0 0 auto', display: 'flex', alignItems: 'center', gap: '3px', margin: '0', fontSize: '11px', color: '#888', cursor: 'pointer' }).appendTo(row);
@@ -374,6 +412,7 @@
374
412
  });
375
413
  });
376
414
  $('#mqtt-ga-list input.mqtt-ga-cb').on('change', updateGaCount);
415
+ applyGaNameFormat();
377
416
  updateGaCount();
378
417
  }).fail(function () {
379
418
  list.empty().append($('<div/>').css('color', '#c0392b').text(node._('knxUltimateIoTBridge.ha.csv_error')));
@@ -395,6 +434,8 @@
395
434
 
396
435
  buildGaList();
397
436
  $('#node-input-server').on('change', buildGaList);
437
+ // Live-preview the entity naming: re-label the list when the format select changes.
438
+ $('#node-input-mqttNameFormat').on('change', applyGaNameFormat);
398
439
  } catch (error) { }
399
440
 
400
441
  // Home Assistant composite entities (cover / climate): editable list.
@@ -675,6 +716,19 @@
675
716
  <label for="node-input-mqttDiscoveryPrefix" data-i18n="knxUltimateIoTBridge.ha.discovery_prefix"></label>
676
717
  <input type="text" id="node-input-mqttDiscoveryPrefix" placeholder="homeassistant" />
677
718
  </div>
719
+ <div class="form-row ha-mode-row">
720
+ <label for="node-input-mqttNameFormat" data-i18n="knxUltimateIoTBridge.ha.name_format"></label>
721
+ <select id="node-input-mqttNameFormat" style="width:70%;">
722
+ <option value="full" data-i18n="knxUltimateIoTBridge.ha.name_format_full"></option>
723
+ <option value="name-first" data-i18n="knxUltimateIoTBridge.ha.name_format_name_first"></option>
724
+ <option value="name-only" data-i18n="knxUltimateIoTBridge.ha.name_format_name_only"></option>
725
+ <option value="name-ga" data-i18n="knxUltimateIoTBridge.ha.name_format_name_ga"></option>
726
+ </select>
727
+ </div>
728
+ <div class="form-row ha-mode-row" style="margin-top:-4px;">
729
+ <label style="width:auto;">&nbsp;</label>
730
+ <span style="font-size:11px; color:#888;" data-i18n="knxUltimateIoTBridge.ha.name_format_hint"></span>
731
+ </div>
678
732
  <div class="form-row ha-mode-row" id="rowMqttGaSelect">
679
733
  <label style="width:auto; font-weight:600;" data-i18n="knxUltimateIoTBridge.ha.exposed_gas"></label>
680
734
  <div style="margin:4px 0; display:flex; gap:6px; align-items:center;">
@@ -733,6 +787,9 @@ Native MQTT bridge with Home Assistant discovery. Every group address imported i
733
787
 
734
788
  Requires an MQTT broker reachable by both Node-RED and Home Assistant, with the MQTT integration enabled in HA. Entities appear under a device named after this node.
735
789
 
790
+ ### Entity name format
791
+ The ETS import builds each name with the group-address path first, e.g. `(Lights->Ground floor) Living room`. The **Entity name format** selector controls how the Home Assistant entity names are built: *As imported from ETS* (default), *Name first* (`Living room (Lights->Ground floor)`), *Name only* (`Living room`) or *Name + group address* (`Living room (0/1/2)`).
792
+
736
793
  ### KNX bus connection
737
794
  Choose how the node exchanges telegrams with KNX:
738
795
 
@@ -51,6 +51,9 @@ module.exports = function (RED) {
51
51
  node.mqttBaseTopic = typeof config.mqttBaseTopic === 'string' && config.mqttBaseTopic.trim() !== '' ? config.mqttBaseTopic.trim() : 'knx-ultimate'
52
52
  node.mqttDiscovery = config.mqttDiscovery !== false && config.mqttDiscovery !== 'false'
53
53
  node.mqttDiscoveryPrefix = typeof config.mqttDiscoveryPrefix === 'string' && config.mqttDiscoveryPrefix.trim() !== '' ? config.mqttDiscoveryPrefix.trim() : 'homeassistant'
54
+ // Entity name format for the exposed GAs: 'full' (ETS path + name, as imported),
55
+ // 'name-first' (name first, path after), 'name-only' (path removed), 'name-ga' (name + GA).
56
+ node.mqttNameFormat = typeof config.mqttNameFormat === 'string' && config.mqttNameFormat.trim() !== '' ? config.mqttNameFormat.trim() : 'full'
54
57
  node.mqttCustomEntities = Array.isArray(config.mqttCustomEntities) ? config.mqttCustomEntities : []
55
58
  // Group addresses to expose as simple entities. Once the user curates the list
56
59
  // (mqttExposeConfigured), only the listed GAs are exposed; otherwise all imported GAs are.
@@ -180,6 +183,7 @@ module.exports = function (RED) {
180
183
  baseTopic: node.mqttBaseTopic,
181
184
  discovery: node.mqttDiscovery,
182
185
  discoveryPrefix: node.mqttDiscoveryPrefix,
186
+ nameFormat: node.mqttNameFormat,
183
187
  username: node.credentials ? node.credentials.mqttUsername : undefined,
184
188
  password: node.credentials ? node.credentials.mqttPassword : undefined,
185
189
  groupAddresses: (node.serverKNX && Array.isArray(node.serverKNX.csv)) ? node.serverKNX.csv : [],
@@ -48,6 +48,45 @@ function normalizeGa (ga) {
48
48
  return typeof ga === 'string' ? ga.trim() : ''
49
49
  }
50
50
 
51
+ // Clean up an entity name for Home Assistant: strip ASCII control characters and collapse
52
+ // runs of whitespace (ETS exports sometimes lose an accented char and leave a double space,
53
+ // e.g. "Velocità vento" -> "Velocit vento"). This keeps the friendly name and the entity_id
54
+ // HA derives from it tidy, and never lets an all-blank/control-only string through.
55
+ function sanitizeEntityName (value) {
56
+ return String(value == null ? '' : value)
57
+ // eslint-disable-next-line no-control-regex
58
+ .replace(/[\u0000-\u001f\u007f]/g, ' ')
59
+ .replace(/\s+/g, ' ')
60
+ .trim()
61
+ }
62
+
63
+ // ETS imports (CSV and ESF) build devicename as "(Main group->Middle group) GA name":
64
+ // the group-address path first, then the actual GA name. Reshape it according to the
65
+ // entity-name format chosen by the user for Home Assistant.
66
+ function formatEntityName (raw, ga, format) {
67
+ const full = sanitizeEntityName(raw)
68
+ if (full === '') return ga
69
+ if (!format || format === 'full') return full
70
+ const match = full.match(/^\(([^)]*)\)\s*(.*)$/)
71
+ const path = match ? match[1].trim() : ''
72
+ const name = match ? (match[2].trim() || ga) : full
73
+ let result
74
+ switch (format) {
75
+ case 'name-first':
76
+ result = path ? `${name} (${path})` : name
77
+ break
78
+ case 'name-only':
79
+ result = name
80
+ break
81
+ case 'name-ga':
82
+ result = `${name} (${ga})`
83
+ break
84
+ default:
85
+ result = full
86
+ }
87
+ return sanitizeEntityName(result) || ga
88
+ }
89
+
51
90
  function toFiniteNumber (value, fallback) {
52
91
  const n = Number(value)
53
92
  return Number.isFinite(n) ? n : fallback
@@ -69,6 +108,9 @@ function createMqttBridge (options) {
69
108
  const discoveryPrefix = (typeof opts.discoveryPrefix === 'string' && opts.discoveryPrefix.trim()) || 'homeassistant'
70
109
  const username = typeof opts.username === 'string' && opts.username ? opts.username : undefined
71
110
  const password = typeof opts.password === 'string' && opts.password ? opts.password : undefined
111
+ // How simple per-GA entity names are built from the ETS devicename: 'full' (as imported),
112
+ // 'name-first' (GA name first, path after), 'name-only' (path stripped), 'name-ga' (name + GA).
113
+ const nameFormat = typeof opts.nameFormat === 'string' && opts.nameFormat ? opts.nameFormat : 'full'
72
114
 
73
115
  // Source per-GA entities: [{ ga, dpt, devicename }]
74
116
  const sourceGAs = Array.isArray(opts.groupAddresses) ? opts.groupAddresses : []
@@ -325,7 +367,7 @@ function createMqttBridge (options) {
325
367
  : map.domain
326
368
  const slug = uniqueSlug(baseSlug)
327
369
  const uniqueId = `${deviceId}_${slug}`
328
- const name = (typeof entry.devicename === 'string' && entry.devicename.trim()) ? entry.devicename.trim() : ga
370
+ const name = formatEntityName(entry.devicename, ga, nameFormat)
329
371
  const stateTopic = `${root}/${slug}/state`
330
372
  const commandTopic = `${root}/${slug}/set`
331
373
 
@@ -16,6 +16,7 @@ Eine native MQTT-Bridge mit Home-Assistant-Discovery. Benötigt einen MQTT-Broke
16
16
  - *Flow-Nachrichten* — der Knoten zeigt einen Eingangs- und einen Ausgangs-Pin. Verbinden Sie den Ausgang eines KNXUltimate-Knotens im **Universal**-Modus mit dem Eingangs-Pin (KNX-Bus → MQTT) und den Ausgangs-Pin mit dem Eingang eines weiteren KNXUltimate-Knotens im **Universal**-Modus (MQTT → KNX-Bus).
17
17
  - **Broker-URL / Benutzername / Passwort** — Verbindung zu Ihrem MQTT-Broker.
18
18
  - **Basis-Topic / Discovery-Präfix** — Root-Topic für Status-/Befehls-Topics und das HA-Discovery-Präfix (Standard `homeassistant`).
19
+ - **Format des Entitätsnamens** — wie die Namen der Home-Assistant-Entitäten aus dem ETS-Import gebildet werden, dessen Namen mit dem Gruppenpfad beginnen, z. B. `(Licht->Erdgeschoss) Wohnzimmer`. Wählen Sie *Wie aus ETS importiert* (Standard), *Name zuerst* (`Wohnzimmer (Licht->Erdgeschoss)`), *Nur der Name* (`Wohnzimmer`) oder *Name + Gruppenadresse* (`Wohnzimmer (0/1/2)`).
19
20
  - **Bereitzustellende Gruppenadressen** — jede im KNX-Gateway importierte Adresse (ETS-Liste) wird mit einem Kontrollkästchen angezeigt. Angehakte Adressen werden als Home-Assistant-Entitäten veröffentlicht, automatisch nach dem DPT typisiert (switch, sensor, binary_sensor, number, text). Verwenden Sie das Filterfeld und die Schaltflächen *Alle auswählen* / *Keine auswählen*. Standardmäßig sind alle Adressen ausgewählt. Jede Zeile hat zudem eine Option **Nur lesen**: eine schreibgeschützte Adresse wird weiterhin an Home Assistant veröffentlicht (ihr Status bleibt sichtbar), akzeptiert aber nie Befehle zurück auf den KNX-Bus (switch werden zu binary_sensor, number zu sensor). Die Schaltflächen *Nur lesen setzen* / *Nur lesen entfernen* wenden dies auf alle aktuell angezeigten Adressen an.
20
21
  - **Rollläden & Thermostate** — fassen mehrere Adressen zu einer Entität zusammen:
21
22
  - *Rollladen*: Auf/Ab-GA (1.008), optionale Stopp-GA (1.007), optionale Positions-GA Befehl/Status (5.001). *Position invertieren* bildet die KNX-Konvention (0% = offen) auf Home Assistant (100% = offen) ab.
@@ -22,6 +22,12 @@
22
22
  "base_topic": "Basis-Topic",
23
23
  "discovery": "Home-Assistant-Discovery veröffentlichen",
24
24
  "discovery_prefix": "Discovery-Präfix",
25
+ "name_format": "Format des Entitätsnamens",
26
+ "name_format_full": "Wie aus ETS importiert: (Hauptgruppe->Mittelgruppe) Name",
27
+ "name_format_name_first": "Name zuerst: Name (Hauptgruppe->Mittelgruppe)",
28
+ "name_format_name_only": "Nur der Name (ETS-Gruppenpfad entfernen)",
29
+ "name_format_name_ga": "Name + Gruppenadresse: Name (1/2/3)",
30
+ "name_format_hint": "Wie die Namen der Home-Assistant-Entitäten aus den importierten ETS-Namen gebildet werden, die mit dem Gruppenpfad beginnen.",
25
31
  "hint": "Erfordert einen MQTT-Broker, der sowohl von Node-RED als auch von Home Assistant erreichbar ist, mit aktivierter MQTT-Integration in HA. Die Entitäten erscheinen unter einem Gerät mit dem Namen dieses Knotens. KNX-Buswerte werden an MQTT veröffentlicht und beschreibbare Datenpunkte akzeptieren Befehle von Home Assistant.",
26
32
  "exposed_gas": "Bereitzustellende Gruppenadressen",
27
33
  "exposed_gas_hint": "Wähle die Gruppenadressen aus, die an Home Assistant veröffentlicht werden sollen. Standardmäßig sind alle importierten Adressen ausgewählt. Von einem Rollladen/Thermostat (unten) verwendete Adressen werden dort behandelt und müssen hier nicht ausgewählt werden.",
@@ -16,6 +16,7 @@ A native MQTT bridge with Home Assistant discovery. It needs an MQTT broker reac
16
16
  - *Flow messages* — the node exposes an input pin and an output pin. Wire the output of a KNXUltimate node in **Universal** mode to the input (KNX bus → MQTT) and the output pin to the input of another KNXUltimate node in **Universal** mode (MQTT → KNX bus).
17
17
  - **Broker URL / Username / Password** — connection to your MQTT broker.
18
18
  - **Base topic / Discovery prefix** — root topic for state/command topics and the HA discovery prefix (default `homeassistant`).
19
+ - **Entity name format** — how the Home Assistant entity names are built from the ETS import, whose names start with the group-address path, e.g. `(Lights->Ground floor) Living room`. Choose *As imported from ETS* (default), *Name first* (`Living room (Lights->Ground floor)`), *Name only* (`Living room`) or *Name + group address* (`Living room (0/1/2)`).
19
20
  - **Group addresses to expose** — every address imported in the KNX gateway (ETS list) is shown with a checkbox. Ticked addresses are published as Home Assistant entities, typed automatically from the DPT (switch, sensor, binary_sensor, number, text). Use the filter box and the *Select all* / *Select none* buttons. By default all addresses are selected. Each row also has a **Read only** toggle: a read-only address is still published to Home Assistant (its state stays visible) but never accepts commands back to the KNX bus (switches become binary_sensors, numbers become sensors). The *Set read only* / *Clear read only* buttons apply it to all currently shown addresses.
20
21
  - **Covers & Thermostats** — group several addresses into one entity:
21
22
  - *Cover*: Up/Down GA (1.008), optional Stop GA (1.007), optional Set/Status position GA (5.001). *Invert position* maps the KNX convention (0% = open) to Home Assistant (100% = open).
@@ -22,6 +22,12 @@
22
22
  "base_topic": "Base topic",
23
23
  "discovery": "Publish Home Assistant discovery",
24
24
  "discovery_prefix": "Discovery prefix",
25
+ "name_format": "Entity name format",
26
+ "name_format_full": "As imported from ETS: (Main group->Middle group) Name",
27
+ "name_format_name_first": "Name first: Name (Main group->Middle group)",
28
+ "name_format_name_only": "Name only (remove the ETS group path)",
29
+ "name_format_name_ga": "Name + group address: Name (1/2/3)",
30
+ "name_format_hint": "How the Home Assistant entity names are built from the imported ETS names, which start with the group-address path.",
25
31
  "hint": "Requires an MQTT broker reachable by both Node-RED and Home Assistant, with the MQTT integration enabled in HA. Entities appear under a device named after this node. KNX bus values are published to MQTT and writable datapoints accept commands from Home Assistant.",
26
32
  "exposed_gas": "Group addresses to expose",
27
33
  "exposed_gas_hint": "Tick the group addresses you want to publish to Home Assistant. By default every imported address is selected. Addresses used by a cover/thermostat below are handled there and don't need to be ticked here.",
@@ -16,6 +16,7 @@ Un puente MQTT nativo con descubrimiento de Home Assistant. Requiere un broker M
16
16
  - *Mensajes de flujo* — el nodo muestra un pin de entrada y uno de salida. Conecta la salida de un nodo KNXUltimate en modo **Universal** al pin de entrada (bus KNX → MQTT) y el pin de salida a la entrada de otro nodo KNXUltimate en modo **Universal** (MQTT → bus KNX).
17
17
  - **URL del broker / Usuario / Contraseña** — conexión a tu broker MQTT.
18
18
  - **Topic base / Prefijo de descubrimiento** — topic raíz para los topics de estado/comando y el prefijo de descubrimiento de HA (predeterminado `homeassistant`).
19
+ - **Formato del nombre de entidad** — cómo se construyen los nombres de las entidades de Home Assistant a partir de la importación ETS, cuyos nombres empiezan por la ruta de grupos, p. ej. `(Luces->Planta baja) Salón`. Elige *Como se importó de ETS* (predeterminado), *Nombre primero* (`Salón (Luces->Planta baja)`), *Solo el nombre* (`Salón`) o *Nombre + dirección de grupo* (`Salón (0/1/2)`).
19
20
  - **Direcciones de grupo a exponer** — cada dirección importada en la pasarela KNX (lista ETS) se muestra con una casilla. Las direcciones marcadas se publican como entidades de Home Assistant, tipadas automáticamente a partir del DPT (switch, sensor, binary_sensor, number, text). Usa el filtro y los botones *Seleccionar todo* / *Deseleccionar todo*. Por defecto están todas seleccionadas. Cada fila tiene además una opción **Solo lectura**: una dirección de solo lectura se sigue publicando en Home Assistant (su estado permanece visible) pero nunca acepta comandos de vuelta al bus KNX (los switch pasan a binary_sensor y los number a sensor). Los botones *Marcar solo lectura* / *Quitar solo lectura* la aplican a todas las direcciones mostradas actualmente.
20
21
  - **Persianas y termostatos** — agrupan varias direcciones en una sola entidad:
21
22
  - *Persiana*: GA subir/bajar (1.008), GA stop opcional (1.007), GA posición comando/estado opcional (5.001). *Invertir posición* asigna la convención KNX (0% = abierto) a Home Assistant (100% = abierto).
@@ -22,6 +22,12 @@
22
22
  "base_topic": "Topic base",
23
23
  "discovery": "Publicar descubrimiento de Home Assistant",
24
24
  "discovery_prefix": "Prefijo de descubrimiento",
25
+ "name_format": "Formato del nombre de entidad",
26
+ "name_format_full": "Como se importó de ETS: (Grupo principal->Grupo intermedio) Nombre",
27
+ "name_format_name_first": "Nombre primero: Nombre (Grupo principal->Grupo intermedio)",
28
+ "name_format_name_only": "Solo el nombre (eliminar la ruta ETS)",
29
+ "name_format_name_ga": "Nombre + dirección de grupo: Nombre (1/2/3)",
30
+ "name_format_hint": "Cómo se construyen los nombres de las entidades de Home Assistant a partir de los nombres importados de ETS, que empiezan por la ruta de grupos.",
25
31
  "hint": "Requiere un broker MQTT accesible tanto por Node-RED como por Home Assistant, con la integración MQTT activada en HA. Las entidades aparecen bajo un dispositivo con el nombre de este nodo. Los valores del bus KNX se publican en MQTT y los datapoints escribibles aceptan comandos desde Home Assistant.",
26
32
  "exposed_gas": "Direcciones de grupo a exponer",
27
33
  "exposed_gas_hint": "Marca las direcciones de grupo que quieres publicar en Home Assistant. Por defecto están todas seleccionadas. Las direcciones usadas por una persiana/termostato (abajo) se gestionan allí y no necesitan marcarse aquí.",
@@ -16,6 +16,7 @@ Une passerelle MQTT native avec découverte Home Assistant. Nécessite un broker
16
16
  - *Messages de flux* — le nœud affiche une broche d'entrée et une de sortie. Reliez la sortie d'un nœud KNXUltimate en mode **Universel** à la broche d'entrée (bus KNX → MQTT) et la broche de sortie à l'entrée d'un autre nœud KNXUltimate en mode **Universel** (MQTT → bus KNX).
17
17
  - **URL du broker / Nom d'utilisateur / Mot de passe** — connexion à votre broker MQTT.
18
18
  - **Topic de base / Préfixe de découverte** — topic racine pour les topics d'état/commande et le préfixe de découverte HA (par défaut `homeassistant`).
19
+ - **Format du nom d'entité** — comment les noms des entités Home Assistant sont construits à partir de l'import ETS, dont les noms commencent par le chemin des groupes, p. ex. `(Lumières->Rez-de-chaussée) Salon`. Choisissez *Tel qu'importé d'ETS* (par défaut), *Nom d'abord* (`Salon (Lumières->Rez-de-chaussée)`), *Nom seul* (`Salon`) ou *Nom + adresse de groupe* (`Salon (0/1/2)`).
19
20
  - **Adresses de groupe à exposer** — chaque adresse importée dans la passerelle KNX (liste ETS) est affichée avec une case à cocher. Les adresses cochées sont publiées comme entités Home Assistant, typées automatiquement d'après le DPT (switch, sensor, binary_sensor, number, text). Utilisez le champ de filtre et les boutons *Tout sélectionner* / *Tout désélectionner*. Par défaut, toutes les adresses sont sélectionnées. Chaque ligne dispose aussi d'une option **Lecture seule** : une adresse en lecture seule est toujours publiée vers Home Assistant (son état reste visible) mais n'accepte jamais de commandes vers le bus KNX (les switch deviennent des binary_sensor et les number des sensor). Les boutons *Activer lecture seule* / *Retirer lecture seule* l'appliquent à toutes les adresses actuellement affichées.
20
21
  - **Volets et thermostats** — regroupent plusieurs adresses en une seule entité :
21
22
  - *Volet* : GA montée/descente (1.008), GA stop optionnelle (1.007), GA position commande/état optionnelle (5.001). *Inverser la position* fait correspondre la convention KNX (0% = ouvert) à Home Assistant (100% = ouvert).
@@ -22,6 +22,12 @@
22
22
  "base_topic": "Topic de base",
23
23
  "discovery": "Publier la découverte Home Assistant",
24
24
  "discovery_prefix": "Préfixe de découverte",
25
+ "name_format": "Format du nom d'entité",
26
+ "name_format_full": "Tel qu'importé d'ETS : (Groupe principal->Groupe intermédiaire) Nom",
27
+ "name_format_name_first": "Nom d'abord : Nom (Groupe principal->Groupe intermédiaire)",
28
+ "name_format_name_only": "Nom seul (supprimer le chemin ETS)",
29
+ "name_format_name_ga": "Nom + adresse de groupe : Nom (1/2/3)",
30
+ "name_format_hint": "Comment les noms des entités Home Assistant sont construits à partir des noms importés d'ETS, qui commencent par le chemin des groupes.",
25
31
  "hint": "Nécessite un broker MQTT accessible à la fois par Node-RED et Home Assistant, avec l'intégration MQTT activée dans HA. Les entités apparaissent sous un appareil portant le nom de ce nœud. Les valeurs du bus KNX sont publiées sur MQTT et les points de données inscriptibles acceptent les commandes de Home Assistant.",
26
32
  "exposed_gas": "Adresses de groupe à exposer",
27
33
  "exposed_gas_hint": "Cochez les adresses de groupe à publier vers Home Assistant. Par défaut, toutes les adresses importées sont sélectionnées. Les adresses utilisées par un volet/thermostat (ci-dessous) y sont gérées et n'ont pas besoin d'être cochées ici.",
@@ -16,6 +16,7 @@ Un bridge MQTT nativo con discovery di Home Assistant. Richiede un broker MQTT r
16
16
  - *Messaggi di flow* — il nodo mostra un PIN di ingresso e uno di uscita. Collega l'uscita di un nodo KNXUltimate in modalità **Universale** al PIN di ingresso (bus KNX → MQTT) e il PIN di uscita all'ingresso di un altro nodo KNXUltimate in modalità **Universale** (MQTT → bus KNX).
17
17
  - **URL broker / Nome utente / Password** — connessione al tuo broker MQTT.
18
18
  - **Topic di base / Prefisso discovery** — topic radice per i topic di stato/comando e il prefisso discovery di HA (predefinito `homeassistant`).
19
+ - **Formato nome entità** — come costruire i nomi delle entità Home Assistant a partire dall'import ETS, i cui nomi iniziano con il percorso dei gruppi, es. `(Luci->Piano terra) Soggiorno`. Scegli *Come importato da ETS* (predefinito), *Prima il nome* (`Soggiorno (Luci->Piano terra)`), *Solo il nome* (`Soggiorno`) oppure *Nome + indirizzo di gruppo* (`Soggiorno (0/1/2)`).
19
20
  - **Indirizzi di gruppo da esporre** — ogni indirizzo importato nel gateway KNX (lista ETS) è elencato con una checkbox. Gli indirizzi spuntati vengono pubblicati come entità Home Assistant, tipizzate automaticamente dal DPT (switch, sensor, binary_sensor, number, text). Usa il filtro e i pulsanti *Seleziona tutti* / *Deseleziona tutti*. Per impostazione predefinita sono tutti selezionati. Ogni riga ha inoltre un'opzione **Sola lettura**: un indirizzo in sola lettura viene comunque pubblicato su Home Assistant (lo stato resta visibile) ma non accetta mai comandi verso il bus KNX (gli switch diventano binary_sensor, i number diventano sensor). I pulsanti *Imposta sola lettura* / *Togli sola lettura* la applicano a tutti gli indirizzi attualmente mostrati.
20
21
  - **Tapparelle e Termostati** — raggruppano più indirizzi in un'unica entità:
21
22
  - *Tapparella*: GA su/giù (1.008), GA stop opzionale (1.007), GA posizione comando/stato opzionale (5.001). *Inverti posizione* mappa la convenzione KNX (0% = aperto) su Home Assistant (100% = aperto).
@@ -22,6 +22,12 @@
22
22
  "base_topic": "Topic di base",
23
23
  "discovery": "Pubblica discovery Home Assistant",
24
24
  "discovery_prefix": "Prefisso discovery",
25
+ "name_format": "Formato nome entità",
26
+ "name_format_full": "Come importato da ETS: (Gruppo principale->Gruppo intermedio) Nome",
27
+ "name_format_name_first": "Prima il nome: Nome (Gruppo principale->Gruppo intermedio)",
28
+ "name_format_name_only": "Solo il nome (rimuovi il percorso ETS)",
29
+ "name_format_name_ga": "Nome + indirizzo di gruppo: Nome (1/2/3)",
30
+ "name_format_hint": "Come costruire i nomi delle entità Home Assistant a partire dai nomi importati da ETS, che iniziano con il percorso dei gruppi.",
25
31
  "hint": "Richiede un broker MQTT raggiungibile sia da Node-RED che da Home Assistant, con l'integrazione MQTT attiva in HA. Le entità compaiono sotto un dispositivo con il nome di questo nodo. I valori dal bus KNX vengono pubblicati su MQTT e i datapoint scrivibili accettano comandi da Home Assistant.",
26
32
  "exposed_gas": "Indirizzi di gruppo da esporre",
27
33
  "exposed_gas_hint": "Spunta gli indirizzi di gruppo che vuoi pubblicare su Home Assistant. Per impostazione predefinita sono tutti selezionati. Gli indirizzi usati da una tapparella/termostato qui sotto vengono gestiti lì e non serve spuntarli qui.",
@@ -16,6 +16,7 @@
16
16
  - *流消息* — 节点显示一个输入端口和一个输出端口。将一个**通用**模式的 KNXUltimate 节点的输出连接到输入端口(KNX 总线 → MQTT),并将输出端口连接到另一个**通用**模式 KNXUltimate 节点的输入(MQTT → KNX 总线)。
17
17
  - **Broker URL / 用户名 / 密码** — 连接到你的 MQTT broker。
18
18
  - **基础主题 / 自动发现前缀** — 状态/命令主题的根主题以及 HA 自动发现前缀(默认 `homeassistant`)。
19
+ - **实体名称格式** — 如何根据 ETS 导入生成 Home Assistant 实体名称;ETS 导入的名称以组地址路径开头,例如 `(灯光->一层) 客厅`。可选择 *按 ETS 导入原样*(默认)、*名称在前*(`客厅 (灯光->一层)`)、*仅名称*(`客厅`)或 *名称 + 组地址*(`客厅 (0/1/2)`)。
19
20
  - **要暴露的组地址** — KNX 网关中导入的每个地址(ETS 列表)都带有一个复选框。勾选的地址会作为 Home Assistant 实体发布,并根据 DPT 自动分类(switch、sensor、binary_sensor、number、text)。可使用筛选框和*全选* / *全不选*按钮。默认全部选中。每一行还有一个**只读**开关:只读地址仍会发布到 Home Assistant(状态保持可见),但绝不接受回写到 KNX 总线的命令(switch 变为 binary_sensor,number 变为 sensor)。*设为只读* / *取消只读*按钮会将其应用到当前显示的所有地址。
20
21
  - **卷帘与温控器** — 将多个地址组合成一个实体:
21
22
  - *卷帘*:上/下 GA (1.008)、可选停止 GA (1.007)、可选位置 设置/状态 GA (5.001)。*反转位置* 将 KNX 约定(0% = 打开)映射到 Home Assistant(100% = 打开)。
@@ -22,6 +22,12 @@
22
22
  "base_topic": "基础主题",
23
23
  "discovery": "发布 Home Assistant 自动发现",
24
24
  "discovery_prefix": "自动发现前缀",
25
+ "name_format": "实体名称格式",
26
+ "name_format_full": "按 ETS 导入原样:(主组->中间组) 名称",
27
+ "name_format_name_first": "名称在前:名称 (主组->中间组)",
28
+ "name_format_name_only": "仅名称(移除 ETS 组路径)",
29
+ "name_format_name_ga": "名称 + 组地址:名称 (1/2/3)",
30
+ "name_format_hint": "如何根据 ETS 导入的名称生成 Home Assistant 实体名称;ETS 导入的名称以组地址路径开头。",
25
31
  "hint": "需要一个 Node-RED 和 Home Assistant 都能访问的 MQTT broker,并在 HA 中启用 MQTT 集成。实体会出现在以该节点命名的设备下。KNX 总线的值会发布到 MQTT,可写的数据点接受来自 Home Assistant 的命令。",
26
32
  "exposed_gas": "要暴露的组地址",
27
33
  "exposed_gas_hint": "勾选要发布到 Home Assistant 的组地址。默认全部选中。被下方卷帘/温控器使用的地址会在那里处理,无需在此勾选。",
package/package.json CHANGED
@@ -3,7 +3,7 @@
3
3
  "engines": {
4
4
  "node": ">=20.18.1"
5
5
  },
6
- "version": "5.2.2",
6
+ "version": "5.2.3",
7
7
  "description": "Control your KNX and KNX Secure intallation via Node-Red! A bunch of KNX nodes, with integrated Philips HUE control, ETS group address importer, KNX AI for diagnosticsand KNX routing between interfaces. Easy to use and highly configurable.",
8
8
  "files": [
9
9
  "nodes/",