node-red-contrib-knx-ultimate 6.0.11 → 6.1.0
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 +11 -3
- package/nodes/knxUltimateHueLight.html +1 -5
- package/nodes/knxUltimateMatterControllerDevice.html +584 -47
- package/nodes/knxUltimateMatterControllerDevice.js +37 -0
- package/nodes/locales/de/knxUltimateMatterBridge.html +0 -2
- package/nodes/locales/de/knxUltimateMatterControllerDevice.html +23 -3
- package/nodes/locales/de/knxUltimateMatterControllerDevice.json +39 -1
- package/nodes/locales/de/matter-config.html +11 -1
- package/nodes/locales/de/matter-config.json +12 -0
- package/nodes/locales/en/knxUltimateMatterBridge.html +0 -2
- package/nodes/locales/en/knxUltimateMatterControllerDevice.html +23 -3
- package/nodes/locales/en/knxUltimateMatterControllerDevice.json +39 -1
- package/nodes/locales/en/matter-config.html +11 -1
- package/nodes/locales/en/matter-config.json +12 -0
- package/nodes/locales/es/knxUltimateMatterBridge.html +0 -2
- package/nodes/locales/es/knxUltimateMatterControllerDevice.html +23 -3
- package/nodes/locales/es/knxUltimateMatterControllerDevice.json +39 -1
- package/nodes/locales/es/matter-config.html +11 -1
- package/nodes/locales/es/matter-config.json +12 -0
- package/nodes/locales/fr/knxUltimateMatterBridge.html +0 -2
- package/nodes/locales/fr/knxUltimateMatterControllerDevice.html +23 -3
- package/nodes/locales/fr/knxUltimateMatterControllerDevice.json +47 -1
- package/nodes/locales/fr/matter-config.html +11 -1
- package/nodes/locales/fr/matter-config.json +12 -0
- package/nodes/locales/it/knxUltimateMatterBridge.html +0 -2
- package/nodes/locales/it/knxUltimateMatterControllerDevice.html +23 -3
- package/nodes/locales/it/knxUltimateMatterControllerDevice.json +39 -1
- package/nodes/locales/it/matter-config.html +11 -1
- package/nodes/locales/it/matter-config.json +12 -0
- package/nodes/locales/zh-CN/knxUltimateMatterBridge.html +0 -2
- package/nodes/locales/zh-CN/knxUltimateMatterControllerDevice.html +23 -3
- package/nodes/locales/zh-CN/knxUltimateMatterControllerDevice.json +47 -1
- package/nodes/locales/zh-CN/matter-config.html +11 -1
- package/nodes/locales/zh-CN/matter-config.json +12 -0
- package/nodes/matter-config.html +215 -23
- package/nodes/matter-config.js +53 -6
- package/nodes/utils/matterControllerCommandGate.js +47 -0
- package/nodes/utils/matterControllerProfiles/doorLock.js +19 -4
- package/nodes/utils/matterControllerProfiles/fan.js +0 -1
- package/nodes/utils/matterControllerProfiles/index.js +3 -1
- package/nodes/utils/matterControllerProfiles/mappedEndpoint.js +32 -15
- package/nodes/utils/matterControllerProfiles/switch.js +0 -1
- package/nodes/utils/matterControllerProfiles/thermostat.js +0 -1
- package/nodes/utils/matterControllerProfiles/universal.js +462 -0
- package/nodes/utils/matterControllerProfiles/windowCovering.js +0 -1
- package/nodes/utils/matterControllerSemanticInput.js +212 -0
- package/nodes/utils/matterEngine.mjs +120 -17
- package/package.json +1 -1
- package/resources/matterQrScanner.js +98 -0
- package/resources/zxing-browser-0.2.0.min.js +1 -0
- package/resources/zxing-browser-LICENSE.txt +21 -0
|
@@ -10,8 +10,34 @@ const hueColorConverter = require('./utils/colorManipulators/hueColorConverter')
|
|
|
10
10
|
const { createLightEngine } = require('./utils/lightEngines')
|
|
11
11
|
const { hueStateToCanonical, matterEventToHuePatch } = require('./utils/lightEngines/matterHueShim')
|
|
12
12
|
const { setupMatterControllerProfile } = require('./utils/matterControllerProfiles')
|
|
13
|
+
const { setupMatterControllerCommandGate } = require('./utils/matterControllerCommandGate')
|
|
14
|
+
|
|
15
|
+
let matterCommandGateEndpointRegistered = false
|
|
13
16
|
|
|
14
17
|
module.exports = function (RED) {
|
|
18
|
+
if (!matterCommandGateEndpointRegistered) {
|
|
19
|
+
RED.httpAdmin.post('/KNXUltimateMatterControllerEnable', RED.auth.needsPermission('matter-config.write'), (req, res) => {
|
|
20
|
+
try {
|
|
21
|
+
const nodeId = String(req.body?.nodeId || '').trim()
|
|
22
|
+
if (nodeId === '') {
|
|
23
|
+
res.status(400).json({ error: 'Missing Matter Controller node id' })
|
|
24
|
+
return
|
|
25
|
+
}
|
|
26
|
+
const targetNode = RED.nodes.getNode(nodeId)
|
|
27
|
+
if (!targetNode || typeof targetNode.clearMatterCommandBlock !== 'function') {
|
|
28
|
+
// New or not-yet-deployed editor nodes have no runtime counterpart.
|
|
29
|
+
res.json({ status: 'not-deployed', cleared: false })
|
|
30
|
+
return
|
|
31
|
+
}
|
|
32
|
+
const cleared = targetNode.clearMatterCommandBlock('editor')
|
|
33
|
+
res.json({ status: 'ok', cleared })
|
|
34
|
+
} catch (error) {
|
|
35
|
+
res.status(500).json({ error: error.message || 'Unable to enable Matter commands' })
|
|
36
|
+
}
|
|
37
|
+
})
|
|
38
|
+
matterCommandGateEndpointRegistered = true
|
|
39
|
+
}
|
|
40
|
+
|
|
15
41
|
function knxUltimateMatterControllerDevice (config) {
|
|
16
42
|
RED.nodes.createNode(this, config)
|
|
17
43
|
const node = this
|
|
@@ -20,6 +46,7 @@ module.exports = function (RED) {
|
|
|
20
46
|
node.matterNodeId = config.matterNodeId !== undefined ? String(config.matterNodeId) : ''
|
|
21
47
|
node.matterEndpointId = config.matterEndpointId !== undefined ? Number(config.matterEndpointId) : 1
|
|
22
48
|
node.matterDeviceName = config.matterDeviceName !== undefined ? String(config.matterDeviceName) : ''
|
|
49
|
+
setupMatterControllerCommandGate(node)
|
|
23
50
|
|
|
24
51
|
let matterCapabilities = {}
|
|
25
52
|
try { matterCapabilities = JSON.parse(config.matterDeviceCapabilities || '{}') } catch (error) { /* empty */ }
|
|
@@ -45,6 +72,7 @@ module.exports = function (RED) {
|
|
|
45
72
|
hueManager: {
|
|
46
73
|
writeHueQueueAdd: (_lightID, _state, _operation) => {
|
|
47
74
|
try {
|
|
75
|
+
if (node.matterCommandBlocked === true) return
|
|
48
76
|
if (!node.lightEngine) return
|
|
49
77
|
const patch = hueStateToCanonical(_state)
|
|
50
78
|
if (!patch) return
|
|
@@ -217,6 +245,7 @@ module.exports = function (RED) {
|
|
|
217
245
|
fill, shape, text, payload
|
|
218
246
|
}) => {
|
|
219
247
|
try {
|
|
248
|
+
if (node.matterCommandBlocked === true) return
|
|
220
249
|
if (node.currentHUEDevice?.on?.on === true) { fill = 'blue'; shape = 'dot' } else { fill = 'blue'; shape = 'ring' };
|
|
221
250
|
if (payload === undefined) payload = ''
|
|
222
251
|
const dDate = new Date()
|
|
@@ -228,6 +257,7 @@ module.exports = function (RED) {
|
|
|
228
257
|
// Compatibility callback used to update the Matter node status.
|
|
229
258
|
node.setNodeStatusHue = ({ fill, shape, text, payload }) => {
|
|
230
259
|
try {
|
|
260
|
+
if (node.matterCommandBlocked === true) return
|
|
231
261
|
if (node.currentHUEDevice?.on?.on === true) { fill = 'blue'; shape = 'dot' } else { fill = 'blue'; shape = 'ring' };
|
|
232
262
|
if (payload === undefined) payload = ''
|
|
233
263
|
const dDate = new Date()
|
|
@@ -238,6 +268,7 @@ module.exports = function (RED) {
|
|
|
238
268
|
}
|
|
239
269
|
|
|
240
270
|
node.writeHueState = function writeHueState (_state) {
|
|
271
|
+
if (node.matterCommandBlocked === true) return
|
|
241
272
|
const defaultOperation = node.isGrouped_light === false ? 'setLight' : 'setGroupedLight'
|
|
242
273
|
const isGroupedLightOff = node.isGrouped_light === true && node.currentHUEDevice?.on?.on === false
|
|
243
274
|
const stateKeys = _state && typeof _state === 'object' ? Object.keys(_state) : []
|
|
@@ -330,6 +361,7 @@ module.exports = function (RED) {
|
|
|
330
361
|
// Compatibility callback invoked by the Matter controller adapter.
|
|
331
362
|
node.handleSend = (msg) => {
|
|
332
363
|
if (!msg || !msg.knx || !isConfiguredKNXGA(msg.knx.destination)) return
|
|
364
|
+
if (node.matterCommandBlocked === true) return
|
|
333
365
|
if (node.currentHUEDevice === undefined && node.serverHue.linkStatus === 'connected') {
|
|
334
366
|
node.setNodeStatusHue({
|
|
335
367
|
fill: 'yellow',
|
|
@@ -1671,6 +1703,11 @@ module.exports = function (RED) {
|
|
|
1671
1703
|
}
|
|
1672
1704
|
|
|
1673
1705
|
node.on('input', (msg, send, done) => {
|
|
1706
|
+
if (node.matterCommandBlocked === true) {
|
|
1707
|
+
const error = new Error(node.matterCommandBlockReason || 'Matter device unavailable')
|
|
1708
|
+
if (done) done(error); else node.error(error, msg)
|
|
1709
|
+
return
|
|
1710
|
+
}
|
|
1674
1711
|
try {
|
|
1675
1712
|
const state = RED.util.cloneMessage(msg)
|
|
1676
1713
|
node.writeHueState(state)
|
|
@@ -1,6 +1,4 @@
|
|
|
1
1
|
<script type="text/markdown" data-help-name="knxUltimateMatterControllerDevice">
|
|
2
|
-
# Control Matter from KNX (BETA)
|
|
3
|
-
|
|
4
2
|
> Dieser Knoten ist **BETA**: das Verhalten kann sich ändern, während die Matter-Implementierung weiter verfeinert wird.
|
|
5
3
|
|
|
6
4
|
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.
|
|
@@ -21,9 +19,31 @@ Er ersetzt die unveröffentlichten getrennten Matter-Controller-Nodes und behäl
|
|
|
21
19
|
| Sensoren | Sensor-Endpunkte zeigen ihre Mess-/Status-GA nur bei Unterstützung: Temperatur, Feuchte, Helligkeit, Präsenz, Kontakt und Batterie. |
|
|
22
20
|
| Read at startup | Veröffentlicht den gecachten Matter-Wert beim Deploy/Start oder wenn sich das Gerät erneut verbindet. |
|
|
23
21
|
| Update local state from KNX write | Aktualisiert den lokalen Matter/KNX-Cache, wenn ein Telegramm auf eine konfigurierte KNX-GA geschrieben wird. |
|
|
24
|
-
| Node Input/Output PINs | Zeigt Node-RED-Eingangs-/Ausgangspins.
|
|
22
|
+
| Node Input/Output PINs | Zeigt Node-RED-Eingangs-/Ausgangspins. Nicht-Licht-Endpunkte akzeptieren das einfache `{function,value}`-Format und die erweiterten Matter-Felder; der Ausgang sendet Statusupdates. |
|
|
23
|
+
|
|
24
|
+
## Flow-Eingang
|
|
25
|
+
|
|
26
|
+
Öffne bei einem ausgewählten Nicht-Licht-Endpunkt den Tab **Flow-Eingang**. Der Tab wird aus der angekündigten Endpunktstruktur aufgebaut und zeigt kopierbare Beispiele, die Endpoint ID sowie alle lesbaren/schreibbaren Attribute und akzeptierten Befehle. Er bleibt auch verfügbar, wenn der Knoten ohne KNX-Gateway nur im Flow verwendet wird.
|
|
27
|
+
|
|
28
|
+
Einfache Schreibvorgänge verwenden `msg.payload = {function:"position",value:35}`. Ohne `value` wird ein unterstützter Zustand gelesen, zum Beispiel `{function:"temperature"}`; die Ausgabe verwendet verständliche Einheiten und enthält Rohdetails in `msg.matter`. Funktionen wie `onoff`, `level`, `position`, `open`, `close`, `stop`, Sollwerte, Lüfter und Sensoren erscheinen nur bei Unterstützung. Türschlösser akzeptieren `{function:"lock",value:true|false}`.
|
|
29
|
+
|
|
30
|
+
Die bisherigen erweiterten Eingaben bleiben gültig: `msg.clusterId` mit `msg.command`/`msg.args` oder `msg.attribute` und optional `msg.value`. Node ID und Endpoint ID sind bereits im Knoten ausgewählt.
|
|
31
|
+
|
|
32
|
+
## Universeller Modus
|
|
33
|
+
|
|
34
|
+
Wähle **Universeller Modus**, um alle Geräte zu überwachen. Der Node hat immer einen Eingang und einen Ausgang und verwendet keine Endpunkt-Zuordnungen. Ein KNX-Gateway ist optional und wird nur für die Alarm-/Text-GAs des Batteriemonitors benötigt.
|
|
35
|
+
|
|
36
|
+
Der **Universelle Batteriemonitor** speichert den vollständigen Batteriestatus. Optionale KNX-GAs senden den Sammelalarm als DPT 1.005 und wechseln alle 2 Sekunden die Gerätenamen als DPT 16.001. `{payload:{action:"getAllBatteries"}}` liefert das Cache-Inventar.
|
|
37
|
+
|
|
38
|
+
Ausgaben enthalten den Rohwert in `msg.payload` und Routingdaten in `msg.matter` (`source`, `nodeId`, `endpointId`, `clusterId`, Attribut-/Ereignisname). Eingaben verwenden `msg.nodeId`, `msg.endpointId`, `msg.clusterId` und entweder `msg.command` mit `msg.args` oder `msg.attribute`; `msg.value` schreibt, ohne `msg.value` wird gelesen. Die Felder können auch unter `msg.matter` stehen.
|
|
39
|
+
|
|
40
|
+
Beispiele: `{nodeId:"100",endpointId:1,clusterId:6,command:"on",args:{}}` schaltet ein; `{nodeId:"100",endpointId:1,clusterId:47,attribute:"batPercentRemaining"}` liest die Batterie. Batteriewerte bleiben in Matter-Halbprozenteinheiten und können in einem Function-Node durch zwei geteilt werden.
|
|
25
41
|
|
|
26
42
|
## Verhalten
|
|
27
43
|
|
|
28
44
|
Der Knoten pflegt einen lokalen Cache aus Matter-Updates und KNX-Schreibtelegrammen, beantwortet KNX-Leseanfragen aus diesem Cache und kann Werte beim Start lesen/ausgeben. Er hört nur auf konfigurierte Gruppenadressen, daher wird fremder KNX-Verkehr ignoriert.
|
|
45
|
+
|
|
46
|
+
Befehle laufen pro gekoppeltem Gerät in einer eigenen geordneten Warteschlange. Ein offline befindliches, zeitüberschreitendes oder entferntes Gerät kann daher andere Matter-Geräte mit derselben KNX-Gruppenadresse nicht verzögern. Verweist ein Node weiterhin auf ein entferntes Gerät, wird der Befehl sofort abgewiesen und **Device no longer commissioned** rot angezeigt; wähle ein gültiges Matter-Gerät oder entferne den verwaisten Controller-Node.
|
|
47
|
+
|
|
48
|
+
Ein Fehler wegen eines nicht verfügbaren Geräts bleibt verriegelt: weitere KNX- und Flow-Befehle werden ignoriert und können den roten Status nicht überschreiben. Der Node wird automatisch wieder aktiv, sobald dieses Matter-Gerät `connected` meldet; auch das Öffnen des Node-Editors löst die Verriegelung für einen manuellen Neuversuch.
|
|
29
49
|
</script>
|
|
@@ -11,6 +11,28 @@
|
|
|
11
11
|
"node-input-hueLight": "Matter-Gerät",
|
|
12
12
|
"paletteLabel": "Control Matter from KNX",
|
|
13
13
|
"no_devices": "Keine Matter-Geräte gefunden. Matter-Controller prüfen und aktualisieren.",
|
|
14
|
+
"input_help_label": "Flow-Eingang",
|
|
15
|
+
"input_help_pin_hint": "Aktiviere die Ein-/Ausgangs-PINs des Knotens, bevor du diese Nachrichten sendest.",
|
|
16
|
+
"input_help_endpoint": "Ausgewählter Endpunkt",
|
|
17
|
+
"input_help_endpoint_hint": "Der Knoten kennt Node ID und Endpoint ID bereits; einfache Nachrichten benötigen sie nicht.",
|
|
18
|
+
"input_help_simple_title": "Einfache Nachrichten",
|
|
19
|
+
"input_help_simple_hint": "Diese Funktionen verwenden verständliche Einheiten und werden in den Matter-Cluster, Befehl oder das Attribut des ausgewählten Endpunkts übersetzt.",
|
|
20
|
+
"input_help_advanced_title": "Erweiterte Matter-Details",
|
|
21
|
+
"input_help_advanced_hint": "Es werden nur angekündigte Attribute und Befehle aufgelistet. Schreibbeispiele verwenden 0 als Platzhalter; Befehlsargumente müssen eventuell an den Matter-Datentyp angepasst werden.",
|
|
22
|
+
"input_help_operation": "Operation",
|
|
23
|
+
"input_help_function": "Funktion",
|
|
24
|
+
"input_help_target": "Matter-Ziel",
|
|
25
|
+
"input_help_message": "Nachricht",
|
|
26
|
+
"input_help_read": "Lesen",
|
|
27
|
+
"input_help_write": "Schreiben",
|
|
28
|
+
"input_help_command": "Befehl",
|
|
29
|
+
"input_help_copy": "Kopieren",
|
|
30
|
+
"input_help_copied": "Nachricht kopiert",
|
|
31
|
+
"input_help_no_simple": "Dieser Endpunkt besitzt keine bekannte einfache Eingangsfunktion.",
|
|
32
|
+
"input_help_no_structure": "Die Matter-Struktur ist nicht verfügbar. Aktualisiere die Geräteliste, während der Endpunkt online ist.",
|
|
33
|
+
"input_functions": {
|
|
34
|
+
"onoff": "Ein / Aus", "level": "Stufe", "position": "Rollladenposition", "tiltposition": "Lamellenposition", "open": "Öffnen", "close": "Schließen", "stop": "Stopp", "setpoint": "Heizsollwert", "coolingsetpoint": "Kühlsollwert", "currenttemp": "Aktuelle Temperatur", "fanspeed": "Lüftergeschwindigkeit", "temperature": "Temperatur", "humidity": "Luftfeuchtigkeit", "illuminance": "Beleuchtungsstärke", "occupancy": "Belegung", "contact": "Kontakt", "battery": "Batterie", "activepower": "Wirkleistung", "importedenergy": "Bezogene Energie", "identify": "Identifizieren", "lock": "Verriegeln", "unlock": "Entriegeln"
|
|
35
|
+
},
|
|
14
36
|
"tabs": {
|
|
15
37
|
"switch": "Schalten",
|
|
16
38
|
"dim": "Dimmen",
|
|
@@ -92,7 +114,23 @@
|
|
|
92
114
|
"matter_controller": "Matter-Controller",
|
|
93
115
|
"matter_device": "Matter-Gerät",
|
|
94
116
|
"device_type": "Gerätetyp",
|
|
95
|
-
"matter_section": "Matter-Gerät"
|
|
117
|
+
"matter_section": "Matter-Gerät",
|
|
118
|
+
"controller_mode": "Modus",
|
|
119
|
+
"single_mode": "Einzelnes Gerät",
|
|
120
|
+
"universal_mode": "Universeller Modus (alle Matter-Geräte)",
|
|
121
|
+
"universal_mode_description": "Alle mit diesem Controller verbundenen Matter-Geräte überwachen und steuern. Der universelle Modus funktioniert ohne KNX-Zuordnungen.",
|
|
122
|
+
"universal_service": "Dienst",
|
|
123
|
+
"universal_service_battery_monitor": "Universeller Batteriemonitor",
|
|
124
|
+
"universal_service_all_events": "Alle Matter-Ereignisse",
|
|
125
|
+
"universal_battery_threshold": "Schwelle für niedrigen Batteriestand",
|
|
126
|
+
"universal_low_battery_ga": "GA Batteriealarm",
|
|
127
|
+
"universal_low_battery_text_ga": "GA Gerätename",
|
|
128
|
+
"universal_battery_only_low": "Nur niedrige Batteriestände ausgeben",
|
|
129
|
+
"universal_emit_initial": "Anfänglichen Batterie-Snapshot ausgeben",
|
|
130
|
+
"universal_include_raw": "Rohes Matter-Ereignis einschließen",
|
|
131
|
+
"universal_mode_status": "Universeller Matter-Modus",
|
|
132
|
+
"universal_mode_locate_disabled": "„Suchen“ ist im universellen Modus nicht verfügbar.",
|
|
133
|
+
"universal_controller_name": "Universeller Matter-Controller"
|
|
96
134
|
},
|
|
97
135
|
"common": {
|
|
98
136
|
"ga": "GA",
|
|
@@ -11,7 +11,11 @@ Der Controller kommuniziert mit den Geräten über das **IP-Netzwerk** (WLAN, Et
|
|
|
11
11
|
|
|
12
12
|
1. Zuerst diesen Konfigurations-Node **deployen** (der Controller muss laufen).
|
|
13
13
|
2. Den Node erneut öffnen und den **Kopplungscode** eingeben: entweder den 11-stelligen manuellen Code (z.B. `3497-011-2332`) oder den QR-Code-Inhalt (`MT:....`).
|
|
14
|
-
3.
|
|
14
|
+
3. Bei einem manuell eingegebenen Code auf **KOPPELN** klicken. Ein mit **Webcam** oder **Bild** gelesener QR-Code startet die Kopplung automatisch. Die Kommissionierung kann bis zu einer Minute dauern.
|
|
15
|
+
|
|
16
|
+
Statt den QR-Payload einzutippen, klicke auf **Webcam**, um ihn live zu scannen, oder auf **Bild**, um ihn aus einem lokalen Foto zu lesen. Sowohl normale dunkle QR-Codes auf hellem Grund als auch invertierte weiße Codes auf dunklem Grund werden unterstützt. Die Dekodierung erfolgt vollständig im Browser; nach dem Lesen eines gültigen Matter-QR-Codes füllt der Editor das Kopplungscode-Feld und startet die Kopplung sofort. Gib den optionalen Gerätenamen vor dem Scannen ein. Ein manuell eingegebener Code startet weiterhin erst mit **KOPPELN**. Der Live-Zugriff auf die Webcam setzt voraus, dass der Editor über HTTPS oder von `localhost` geöffnet wurde; andernfalls erklärt der Editor die Einschränkung und das Laden eines Bildes bleibt verfügbar.
|
|
17
|
+
|
|
18
|
+
Während der Kommissionierung überdeckt ein blockierender Wartebildschirm den Editor und verhindert weitere Klicks, bis der Vorgang erfolgreich abgeschlossen wird oder fehlschlägt.
|
|
15
19
|
|
|
16
20
|
Wenn das Gerät fabrikneu ist und nur Bluetooth-Kommissionierung unterstützt, kopple es zuerst mit der Hersteller-App oder einem anderen Matter-Controller (Alexa, Google Home, Apple Home) und nutze dann dessen Funktion **"mit weiterem Hub teilen"**, um einen neuen Kopplungscode für KNX-Ultimate zu erzeugen. So tritt das Gerät mehreren Fabrics gleichzeitig bei.
|
|
17
21
|
|
|
@@ -26,4 +30,10 @@ Mit **Exportieren** wird eine vollständige Sicherung dieser Controller-Instanz
|
|
|
26
30
|
## Ein Gerät entfernen
|
|
27
31
|
|
|
28
32
|
Nutze den Papierkorb-Button in der Liste der gekoppelten Geräte. Der Controller versucht, das Gerät sauber zu dekommissionieren; ist es nicht erreichbar, wird es trotzdem aus der Fabric entfernt (danach kann ein Werksreset des Geräts nötig sein).
|
|
33
|
+
|
|
34
|
+
Die Liste enthält eine Zeile für jeden Node, der derzeit in der Matter-Fabric dieses Controllers gespeichert ist. Node-IDs sind innerhalb dieser Fabric eindeutig; Endpunkte eines einzelnen kommissionierten Bridges werden nicht als separate Geräte aufgeführt. Die Statusspalte zeigt an, ob ein Node verbunden, getrennt, in Wiederverbindung oder auf Geräteerkennung wartend ist.
|
|
35
|
+
|
|
36
|
+
Der Controller hält die Befehlsreihenfolge für jedes gekoppelte Gerät getrennt. Ein langsames, offline befindliches oder entferntes Gerät kann Befehle für andere Geräte nicht blockieren. Controller-Gerätenodes, die weiterhin auf eine entfernte Node ID verweisen, weisen neue Befehle sofort ab und zeigen **Device no longer commissioned** an.
|
|
37
|
+
|
|
38
|
+
Wird ein Gerät nicht verfügbar, bleiben seine Controller-Nodes gesperrt und ignorieren weitere Befehle, bis dieses Gerät erneut `connected` meldet. Die Wiederherstellung erfolgt automatisch; auch das Öffnen des Geräte-Node-Editors löst die Sperre für einen manuellen Neuversuch.
|
|
29
39
|
</script>
|
|
@@ -9,6 +9,18 @@
|
|
|
9
9
|
"pairing_code": "Kopplungscode",
|
|
10
10
|
"pairing_name": "Gerätename",
|
|
11
11
|
"pair_button": "KOPPELN",
|
|
12
|
+
"qr_acquire": "QR-Code lesen",
|
|
13
|
+
"qr_scan_camera": "Webcam",
|
|
14
|
+
"qr_scan_image": "Bild",
|
|
15
|
+
"qr_stop_camera": "Kamera stoppen",
|
|
16
|
+
"qr_camera_insecure": "Der Browser kann die Webcam nicht verwenden, weil der Node-RED-Editor nicht über HTTPS oder localhost geöffnet ist. Öffne ihn über HTTPS oder verwende Bild.",
|
|
17
|
+
"qr_camera_unsupported": "Dieser Browser kann nicht auf eine Webcam zugreifen. Verwende einen unterstützten Browser oder lade ein Bild.",
|
|
18
|
+
"qr_camera_permission_denied": "Die Webcam-Berechtigung wurde verweigert. Erlaube den Kamerazugriff im Browser oder lade ein Bild.",
|
|
19
|
+
"qr_camera_failed": "Die Webcam konnte nicht gestartet werden",
|
|
20
|
+
"qr_image_failed": "Im ausgewählten Bild wurde kein lesbarer QR-Code gefunden",
|
|
21
|
+
"qr_invalid_matter": "Der QR-Code ist kein Matter-Kopplungscode (MT:…).",
|
|
22
|
+
"qr_found": "Matter-QR-Code gelesen. Die Kopplung startet automatisch.",
|
|
23
|
+
"qr_decoder_unavailable": "Der QR-Decoder konnte nicht geladen werden.",
|
|
12
24
|
"devices_title": "Gekoppelte Geräte",
|
|
13
25
|
"col_name": "Name",
|
|
14
26
|
"col_product": "Produkt",
|
|
@@ -1,6 +1,4 @@
|
|
|
1
1
|
<script type="text/markdown" data-help-name="knxUltimateMatterControllerDevice">
|
|
2
|
-
# Control Matter from KNX (BETA)
|
|
3
|
-
|
|
4
2
|
> This node is in **BETA**: behaviour can change while the Matter implementation is refined.
|
|
5
3
|
|
|
6
4
|
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.
|
|
@@ -21,9 +19,31 @@ It replaces the unpublished per-device Matter controller nodes and keeps the ful
|
|
|
21
19
|
| Sensors | Sensor endpoints expose their measurement/status GA only when supported: temperature, humidity, illuminance, occupancy, contact and battery. |
|
|
22
20
|
| Read at startup | Publishes the cached Matter value at deploy/startup or when the device reconnects. |
|
|
23
21
|
| Update local state from KNX write | Updates the local Matter/KNX cache when a telegram is written on a configured KNX GA. |
|
|
24
|
-
| Node Input/Output PINs | Shows Node-RED input/output pins.
|
|
22
|
+
| Node Input/Output PINs | Shows Node-RED input/output pins. Non-light endpoints accept the simple `{function,value}` contract below as well as the advanced Matter fields; output emits state updates. The selection is preserved when the editor is reopened. |
|
|
23
|
+
|
|
24
|
+
## Flow input
|
|
25
|
+
|
|
26
|
+
For a selected non-light endpoint, open the **Flow input** tab in the editor. The tab is built from the endpoint's advertised structure and provides copyable examples, the selected Endpoint ID, every readable/writable attribute and every accepted command. It remains available when the node is used only by a flow without a KNX gateway.
|
|
27
|
+
|
|
28
|
+
Simple writes use `msg.payload = {function:"position",value:35}`. Omit `value` to read a supported state, for example `{function:"temperature"}`; the output uses human units and includes raw routing details in `msg.matter`. Supported functions include `onoff`, `level`, `position`, `tiltposition`, `open`, `close`, `stop`, `setpoint`, `coolingsetpoint`, `currenttemp`, `fanspeed`, sensor readings and `identify`, but only when advertised by that endpoint. Door Lock accepts `{function:"lock",value:true|false}`.
|
|
29
|
+
|
|
30
|
+
Existing advanced inputs remain valid: use top-level `msg.clusterId` plus `msg.command`/`msg.args`, or `msg.attribute` with optional `msg.value`. Node ID and Endpoint ID are already selected by the node; `msg.endpointId` is only an optional override.
|
|
31
|
+
|
|
32
|
+
## Universal Mode
|
|
33
|
+
|
|
34
|
+
Select **Universal Mode** in the **Mode** selector to receive every attribute report, cluster event and device initialization from this Matter controller. It always has one input and one output and does not use endpoint mappings. A KNX gateway is optional and is used only by the Battery Monitor alarm/text GAs.
|
|
35
|
+
|
|
36
|
+
The **Universal Battery Monitor** scans all endpoints for Power Source, emits an initial snapshot, and caches complete normalized battery state. The optional KNX GAs publish an aggregate alarm as DPT 1.005 and cycle low-battery device names every 2 seconds as DPT 16.001. Send `{payload:{action:"getAllBatteries"}}` to retrieve the cached inventory.
|
|
37
|
+
|
|
38
|
+
Outputs carry the raw value in `msg.payload` and routing details in `msg.matter` (`source`, `nodeId`, `endpointId`, `clusterId`, attribute/event name). Inputs use `msg.nodeId`, `msg.endpointId`, `msg.clusterId` and either `msg.command` with `msg.args`, or `msg.attribute`; add `msg.value` to write, omit it to read. The selectors may also be nested under `msg.matter`.
|
|
39
|
+
|
|
40
|
+
Examples: `{nodeId:"100",endpointId:1,clusterId:6,command:"on",args:{}}` turns On; `{nodeId:"100",endpointId:1,clusterId:47,attribute:"batPercentRemaining"}` reads battery. Battery reports remain in raw Matter half-percent units; divide by two in a Function node when a percentage is needed.
|
|
25
41
|
|
|
26
42
|
## Behaviour
|
|
27
43
|
|
|
28
44
|
The node keeps a local cache from Matter updates and KNX writes, answers KNX read requests from that cache, and can emit/read values at startup. Only the configured group addresses are listened to, so unrelated KNX traffic is ignored.
|
|
45
|
+
|
|
46
|
+
Commands are scheduled in a separate ordered lane for each commissioned device. An offline, timing-out or removed device therefore cannot delay other Matter devices that use the same KNX group address. A node that still references a removed device rejects the command immediately and shows **Device no longer commissioned** in red; select a valid Matter device or remove the stale Controller node.
|
|
47
|
+
|
|
48
|
+
An unavailable-device error is latched: further KNX and flow commands are ignored and cannot overwrite the red status. The node resumes automatically as soon as that Matter device reports `connected`; opening the node editor also clears the latch to allow a manual retry.
|
|
29
49
|
</script>
|
|
@@ -11,6 +11,28 @@
|
|
|
11
11
|
"node-input-hueLight": "Matter device",
|
|
12
12
|
"paletteLabel": "Control Matter from KNX",
|
|
13
13
|
"no_devices": "No Matter devices found. Check the Matter controller and click refresh.",
|
|
14
|
+
"input_help_label": "Flow input",
|
|
15
|
+
"input_help_pin_hint": "Enable the node input/output PINs before sending these messages.",
|
|
16
|
+
"input_help_endpoint": "Selected endpoint",
|
|
17
|
+
"input_help_endpoint_hint": "The node already knows the Node ID and Endpoint ID, so the simple messages do not need them.",
|
|
18
|
+
"input_help_simple_title": "Simple messages",
|
|
19
|
+
"input_help_simple_hint": "These functions use human units and are translated to the Matter cluster, command or attribute shown by the selected endpoint.",
|
|
20
|
+
"input_help_advanced_title": "Advanced Matter details",
|
|
21
|
+
"input_help_advanced_hint": "Only advertised attributes and commands are listed. Attribute write examples use 0 as a placeholder; command arguments may need to be adapted to the Matter data type.",
|
|
22
|
+
"input_help_operation": "Operation",
|
|
23
|
+
"input_help_function": "Function",
|
|
24
|
+
"input_help_target": "Matter target",
|
|
25
|
+
"input_help_message": "Message",
|
|
26
|
+
"input_help_read": "Read",
|
|
27
|
+
"input_help_write": "Write",
|
|
28
|
+
"input_help_command": "Command",
|
|
29
|
+
"input_help_copy": "Copy",
|
|
30
|
+
"input_help_copied": "Message copied",
|
|
31
|
+
"input_help_no_simple": "This endpoint has no known simple input functions.",
|
|
32
|
+
"input_help_no_structure": "The Matter structure is unavailable. Refresh the device list while the endpoint is online.",
|
|
33
|
+
"input_functions": {
|
|
34
|
+
"onoff": "On / Off", "level": "Level", "position": "Cover position", "tiltposition": "Cover tilt", "open": "Open", "close": "Close", "stop": "Stop", "setpoint": "Heating setpoint", "coolingsetpoint": "Cooling setpoint", "currenttemp": "Current temperature", "fanspeed": "Fan speed", "temperature": "Temperature", "humidity": "Humidity", "illuminance": "Illuminance", "occupancy": "Occupancy", "contact": "Contact", "battery": "Battery", "activepower": "Active power", "importedenergy": "Imported energy", "identify": "Identify", "lock": "Lock", "unlock": "Unlock"
|
|
35
|
+
},
|
|
14
36
|
"tabs": {
|
|
15
37
|
"switch": "Switch",
|
|
16
38
|
"dim": "Dim",
|
|
@@ -92,7 +114,23 @@
|
|
|
92
114
|
"matter_controller": "Matter controller",
|
|
93
115
|
"matter_device": "Matter device",
|
|
94
116
|
"device_type": "Device type",
|
|
95
|
-
"matter_section": "Matter device"
|
|
117
|
+
"matter_section": "Matter device",
|
|
118
|
+
"controller_mode": "Mode",
|
|
119
|
+
"single_mode": "Single device",
|
|
120
|
+
"universal_mode": "Universal Mode (all Matter devices)",
|
|
121
|
+
"universal_mode_description": "Listen to and control all Matter devices connected to this controller. Universal Mode works without KNX mappings.",
|
|
122
|
+
"universal_service": "Service",
|
|
123
|
+
"universal_service_battery_monitor": "Universal Battery Monitor",
|
|
124
|
+
"universal_service_all_events": "All Matter events",
|
|
125
|
+
"universal_battery_threshold": "Low battery threshold",
|
|
126
|
+
"universal_low_battery_ga": "Low battery alarm GA",
|
|
127
|
+
"universal_low_battery_text_ga": "Low battery device GA",
|
|
128
|
+
"universal_battery_only_low": "Emit only low batteries",
|
|
129
|
+
"universal_emit_initial": "Emit initial battery snapshot",
|
|
130
|
+
"universal_include_raw": "Include raw Matter event",
|
|
131
|
+
"universal_mode_status": "Universal Matter mode",
|
|
132
|
+
"universal_mode_locate_disabled": "Locate is unavailable in Universal Mode.",
|
|
133
|
+
"universal_controller_name": "Matter Universal Controller"
|
|
96
134
|
},
|
|
97
135
|
"common": {
|
|
98
136
|
"ga": "GA",
|
|
@@ -11,7 +11,11 @@ The controller talks to the devices over the **IP network** (WiFi, Ethernet, or
|
|
|
11
11
|
|
|
12
12
|
1. **Deploy** this configuration node first (the controller must be running).
|
|
13
13
|
2. Open the node again and enter the **pairing code**: either the 11-digit manual code (e.g. `3497-011-2332`) or the QR code content (`MT:....`).
|
|
14
|
-
3.
|
|
14
|
+
3. For a manually entered code, click **PAIR**. A QR read with **Webcam** or **Image** starts pairing automatically. Commissioning can take up to a minute.
|
|
15
|
+
|
|
16
|
+
Instead of typing the QR payload, click **Webcam** to scan it live or **Image** to read it from a local picture. Both standard dark-on-light and inverted white-on-dark QR codes are supported. Decoding takes place entirely in the browser; after a valid Matter QR is read, the editor fills the pairing-code field and immediately starts pairing. Enter the optional device name before scanning if desired. A manually typed code still starts only when you click **PAIR**. Live webcam access requires the editor to be opened over HTTPS or from `localhost`; when that is not possible, the editor explains the limitation and image loading remains available.
|
|
17
|
+
|
|
18
|
+
While commissioning is in progress, a blocking wait panel covers the editor and prevents further clicks until the operation succeeds or fails.
|
|
15
19
|
|
|
16
20
|
If the device is brand new and only supports Bluetooth commissioning, first pair it with its vendor app or another Matter controller (Alexa, Google Home, Apple Home), then use that controller's **"share / pair with another hub"** function to generate a new pairing code for KNX-Ultimate. This way the device joins multiple fabrics at once.
|
|
17
21
|
|
|
@@ -26,4 +30,10 @@ Use **Export** to download a complete backup of this controller instance. It inc
|
|
|
26
30
|
## Removing a device
|
|
27
31
|
|
|
28
32
|
Use the trash button in the commissioned devices list. The controller tries to decommission the device properly; if it is unreachable, it is removed from the fabric anyway (a factory reset of the device may then be needed).
|
|
33
|
+
|
|
34
|
+
The list contains one row for every node currently stored in this controller's Matter fabric. Node IDs are unique within that fabric; endpoints exposed by one commissioned bridge are not listed as separate devices. The state column reports whether each node is connected, disconnected, reconnecting or waiting for discovery.
|
|
35
|
+
|
|
36
|
+
The controller keeps command order separately for each commissioned device. A slow, offline or removed device cannot block commands for other devices. Controller device nodes that still reference a removed Node ID reject new commands immediately and display **Device no longer commissioned**.
|
|
37
|
+
|
|
38
|
+
When a device becomes unavailable, its Controller nodes stay blocked and ignore further commands until that device reports `connected` again. Recovery is automatic; opening the device-node editor also clears the block for a manual retry.
|
|
29
39
|
</script>
|
|
@@ -9,6 +9,18 @@
|
|
|
9
9
|
"pairing_code": "Pairing code",
|
|
10
10
|
"pairing_name": "Device name",
|
|
11
11
|
"pair_button": "PAIR",
|
|
12
|
+
"qr_acquire": "Read QR code",
|
|
13
|
+
"qr_scan_camera": "Webcam",
|
|
14
|
+
"qr_scan_image": "Image",
|
|
15
|
+
"qr_stop_camera": "Stop camera",
|
|
16
|
+
"qr_camera_insecure": "The browser cannot use the webcam because the Node-RED editor is not open over HTTPS or localhost. Reopen it over HTTPS, or use Image.",
|
|
17
|
+
"qr_camera_unsupported": "This browser cannot access a webcam. Use a supported browser or load an image.",
|
|
18
|
+
"qr_camera_permission_denied": "Webcam permission was denied. Allow camera access in the browser, or load an image.",
|
|
19
|
+
"qr_camera_failed": "Unable to start the webcam",
|
|
20
|
+
"qr_image_failed": "No readable QR code was found in the selected image",
|
|
21
|
+
"qr_invalid_matter": "The QR code is not a Matter pairing code (MT:…).",
|
|
22
|
+
"qr_found": "Matter QR code read. Pairing starts automatically.",
|
|
23
|
+
"qr_decoder_unavailable": "The QR decoder could not be loaded.",
|
|
12
24
|
"devices_title": "Commissioned devices",
|
|
13
25
|
"col_name": "Name",
|
|
14
26
|
"col_product": "Product",
|
|
@@ -1,6 +1,4 @@
|
|
|
1
1
|
<script type="text/markdown" data-help-name="knxUltimateMatterControllerDevice">
|
|
2
|
-
# Control Matter from KNX (BETA)
|
|
3
|
-
|
|
4
2
|
> Este nodo está en **BETA**: el comportamiento puede cambiar mientras se mejora la implementación Matter.
|
|
5
3
|
|
|
6
4
|
Este nodo controla desde KNX un endpoint Matter ya emparejado. Selecciona el dispositivo Matter y el editor detecta sus capacidades, mostrando solo las asignaciones KNX coherentes con ese endpoint.
|
|
@@ -21,9 +19,31 @@ Sustituye a los nodos Matter separados no publicados y conserva toda la UI de lu
|
|
|
21
19
|
| Sensores | Los endpoints de sensor muestran su GA de medida/estado solo cuando está soportado: temperatura, humedad, iluminancia, ocupación, contacto y batería. |
|
|
22
20
|
| Read at startup | Publica el valor Matter en caché al desplegar/iniciar o cuando el dispositivo se reconecta. |
|
|
23
21
|
| Update local state from KNX write | Actualiza la caché local Matter/KNX cuando se escribe un telegrama en una GA KNX configurada. |
|
|
24
|
-
| Node Input/Output PINs | Muestra pines de entrada/salida Node-RED.
|
|
22
|
+
| Node Input/Output PINs | Muestra pines de entrada/salida Node-RED. Los endpoints que no son luces aceptan el formato simple `{function,value}` y los campos Matter avanzados; la salida emite estados. |
|
|
23
|
+
|
|
24
|
+
## Entrada del flow
|
|
25
|
+
|
|
26
|
+
Para un endpoint que no sea una luz, abre la pestaña **Entrada del flow**. La pestaña se construye con la estructura anunciada y muestra ejemplos copiables, el Endpoint ID, todos los atributos legibles/escribibles y los comandos aceptados. Sigue disponible cuando el nodo se usa solo desde el flow, sin gateway KNX.
|
|
27
|
+
|
|
28
|
+
Una escritura simple usa `msg.payload = {function:"position",value:35}`. Omite `value` para leer un estado, por ejemplo `{function:"temperature"}`; la salida usa unidades comprensibles e incluye los detalles raw en `msg.matter`. Las funciones `onoff`, `level`, `position`, `open`, `close`, `stop`, consignas, ventilador y sensores solo aparecen si el endpoint las anuncia. Una cerradura acepta `{function:"lock",value:true|false}`.
|
|
29
|
+
|
|
30
|
+
Las entradas avanzadas siguen siendo válidas: `msg.clusterId` con `msg.command`/`msg.args`, o `msg.attribute` y el `msg.value` opcional. El Node ID y el Endpoint ID ya están seleccionados en el nodo.
|
|
31
|
+
|
|
32
|
+
## Modo universal
|
|
33
|
+
|
|
34
|
+
Selecciona **Modo universal** para supervisar todos los dispositivos. Siempre tiene una entrada y una salida y no usa mapeos de endpoint. El gateway KNX es opcional y solo se utiliza para las GA de alarma/texto del monitor.
|
|
35
|
+
|
|
36
|
+
El **Monitor universal de baterías** conserva el estado completo. Las GA KNX opcionales publican la alarma global como DPT 1.005 y alternan cada 2 segundos los dispositivos como DPT 16.001. `{payload:{action:"getAllBatteries"}}` devuelve el inventario.
|
|
37
|
+
|
|
38
|
+
La salida contiene el valor raw en `msg.payload` y el enrutamiento en `msg.matter` (`source`, `nodeId`, `endpointId`, `clusterId`, nombre de atributo/evento). La entrada usa `msg.nodeId`, `msg.endpointId`, `msg.clusterId` y `msg.command` con `msg.args`, o `msg.attribute`; añade `msg.value` para escribir y omítelo para leer. Los campos también pueden estar bajo `msg.matter`.
|
|
39
|
+
|
|
40
|
+
Ejemplos: `{nodeId:"100",endpointId:1,clusterId:6,command:"on",args:{}}` enciende; `{nodeId:"100",endpointId:1,clusterId:47,attribute:"batPercentRemaining"}` lee la batería. La batería permanece en unidades Matter raw de medio porcentaje; divídela entre dos en un nodo Function.
|
|
25
41
|
|
|
26
42
|
## Comportamiento
|
|
27
43
|
|
|
28
44
|
El nodo mantiene una caché local con actualizaciones Matter y escrituras KNX, responde lecturas KNX desde esa caché y puede emitir/leer valores al inicio. Solo escucha las direcciones de grupo configuradas, por lo que ignora el tráfico KNX no relacionado.
|
|
45
|
+
|
|
46
|
+
Los comandos se ejecutan en una cola ordenada independiente para cada dispositivo emparejado. Por tanto, un dispositivo sin conexión, agotado por tiempo de espera o eliminado no puede retrasar otros dispositivos Matter que utilicen la misma dirección de grupo KNX. Un nodo que aún referencia un dispositivo eliminado rechaza el comando inmediatamente y muestra **Device no longer commissioned** en rojo; selecciona un dispositivo Matter válido o elimina el nodo Controller huérfano.
|
|
47
|
+
|
|
48
|
+
El error de dispositivo no disponible queda enclavado: los siguientes comandos KNX y flow se ignoran y no pueden sobrescribir el estado rojo. El nodo se reanuda automáticamente en cuanto ese dispositivo Matter informa `connected`; abrir el editor del nodo también libera el bloqueo para permitir un reintento manual.
|
|
29
49
|
</script>
|
|
@@ -11,6 +11,28 @@
|
|
|
11
11
|
"node-input-hueLight": "Dispositivo Matter",
|
|
12
12
|
"paletteLabel": "Control Matter from KNX",
|
|
13
13
|
"no_devices": "No se encontraron dispositivos Matter. Comprueba el controlador Matter y actualiza.",
|
|
14
|
+
"input_help_label": "Entrada del flow",
|
|
15
|
+
"input_help_pin_hint": "Activa los pines de entrada/salida del nodo antes de enviar estos mensajes.",
|
|
16
|
+
"input_help_endpoint": "Endpoint seleccionado",
|
|
17
|
+
"input_help_endpoint_hint": "El nodo ya conoce el Node ID y el Endpoint ID; los mensajes simples no los necesitan.",
|
|
18
|
+
"input_help_simple_title": "Mensajes simples",
|
|
19
|
+
"input_help_simple_hint": "Estas funciones usan unidades comprensibles y se traducen al clúster, comando o atributo Matter del endpoint seleccionado.",
|
|
20
|
+
"input_help_advanced_title": "Detalles Matter avanzados",
|
|
21
|
+
"input_help_advanced_hint": "Solo se muestran atributos y comandos anunciados. Los ejemplos de escritura usan 0 como marcador; los argumentos de los comandos pueden requerir adaptación al tipo Matter.",
|
|
22
|
+
"input_help_operation": "Operación",
|
|
23
|
+
"input_help_function": "Función",
|
|
24
|
+
"input_help_target": "Destino Matter",
|
|
25
|
+
"input_help_message": "Mensaje",
|
|
26
|
+
"input_help_read": "Lectura",
|
|
27
|
+
"input_help_write": "Escritura",
|
|
28
|
+
"input_help_command": "Comando",
|
|
29
|
+
"input_help_copy": "Copiar",
|
|
30
|
+
"input_help_copied": "Mensaje copiado",
|
|
31
|
+
"input_help_no_simple": "Este endpoint no tiene funciones de entrada simples conocidas.",
|
|
32
|
+
"input_help_no_structure": "La estructura Matter no está disponible. Actualiza la lista de dispositivos mientras el endpoint esté en línea.",
|
|
33
|
+
"input_functions": {
|
|
34
|
+
"onoff": "Encender / Apagar", "level": "Nivel", "position": "Posición de persiana", "tiltposition": "Inclinación de persiana", "open": "Abrir", "close": "Cerrar", "stop": "Detener", "setpoint": "Consigna de calefacción", "coolingsetpoint": "Consigna de refrigeración", "currenttemp": "Temperatura actual", "fanspeed": "Velocidad del ventilador", "temperature": "Temperatura", "humidity": "Humedad", "illuminance": "Iluminancia", "occupancy": "Ocupación", "contact": "Contacto", "battery": "Batería", "activepower": "Potencia activa", "importedenergy": "Energía importada", "identify": "Identificar", "lock": "Bloquear", "unlock": "Desbloquear"
|
|
35
|
+
},
|
|
14
36
|
"tabs": {
|
|
15
37
|
"switch": "Cambiar",
|
|
16
38
|
"dim": "Oscuro",
|
|
@@ -92,7 +114,23 @@
|
|
|
92
114
|
"matter_controller": "Controlador Matter",
|
|
93
115
|
"matter_device": "Dispositivo Matter",
|
|
94
116
|
"device_type": "Tipo de dispositivo",
|
|
95
|
-
"matter_section": "Dispositivo Matter"
|
|
117
|
+
"matter_section": "Dispositivo Matter",
|
|
118
|
+
"controller_mode": "Modo",
|
|
119
|
+
"single_mode": "Dispositivo individual",
|
|
120
|
+
"universal_mode": "Modo universal (todos los dispositivos Matter)",
|
|
121
|
+
"universal_mode_description": "Escucha y controla todos los dispositivos Matter conectados a este controlador. El modo universal funciona sin mapeos KNX.",
|
|
122
|
+
"universal_service": "Servicio",
|
|
123
|
+
"universal_service_battery_monitor": "Monitor universal de baterías",
|
|
124
|
+
"universal_service_all_events": "Todos los eventos Matter",
|
|
125
|
+
"universal_battery_threshold": "Umbral de batería baja",
|
|
126
|
+
"universal_low_battery_ga": "GA alarma de batería",
|
|
127
|
+
"universal_low_battery_text_ga": "GA nombre del dispositivo",
|
|
128
|
+
"universal_battery_only_low": "Emitir solo baterías bajas",
|
|
129
|
+
"universal_emit_initial": "Emitir instantánea inicial de baterías",
|
|
130
|
+
"universal_include_raw": "Incluir evento Matter raw",
|
|
131
|
+
"universal_mode_status": "Modo Matter universal",
|
|
132
|
+
"universal_mode_locate_disabled": "Localizar no está disponible en el modo universal.",
|
|
133
|
+
"universal_controller_name": "Controlador Matter universal"
|
|
96
134
|
},
|
|
97
135
|
"common": {
|
|
98
136
|
"ga": "Georgia",
|
|
@@ -11,7 +11,11 @@ El controlador se comunica con los dispositivos a través de la **red IP** (WiFi
|
|
|
11
11
|
|
|
12
12
|
1. Haz primero el **deploy** de este nodo de configuración (el controlador debe estar en ejecución).
|
|
13
13
|
2. Vuelve a abrir el nodo e introduce el **código de emparejamiento**: el código manual de 11 dígitos (p.ej. `3497-011-2332`) o el contenido del código QR (`MT:....`).
|
|
14
|
-
3.
|
|
14
|
+
3. Para un código escrito manualmente, pulsa **EMPAREJAR**. Un QR leído con **Webcam** o **Imagen** inicia automáticamente el emparejamiento. El comisionado puede tardar hasta un minuto.
|
|
15
|
+
|
|
16
|
+
En lugar de escribir el payload QR, pulsa **Webcam** para escanearlo en directo o **Imagen** para leerlo desde una foto local. Se admiten tanto los códigos QR estándar oscuros sobre fondo claro como los invertidos blancos sobre fondo oscuro. La decodificación se realiza íntegramente en el navegador; tras leer un QR Matter válido, el editor rellena el campo del código e inicia inmediatamente el emparejamiento. Introduce antes el nombre opcional del dispositivo si lo deseas. Un código escrito manualmente sigue iniciándose solo al pulsar **EMPAREJAR**. El acceso en directo a la webcam requiere que el editor se abra mediante HTTPS o desde `localhost`; si no es posible, el editor explica la limitación y la carga de imágenes sigue disponible.
|
|
17
|
+
|
|
18
|
+
Durante el comisionado, un panel de espera bloqueante cubre el editor e impide más clics hasta que la operación finaliza correctamente o con un error.
|
|
15
19
|
|
|
16
20
|
Si el dispositivo es nuevo de fábrica y solo admite emparejamiento por Bluetooth, emparéjalo primero con la app del fabricante o con otro controlador Matter (Alexa, Google Home, Apple Home) y usa después su función **"compartir / emparejar con otro hub"** para generar un nuevo código para KNX-Ultimate. Así el dispositivo se une a varias fabrics a la vez.
|
|
17
21
|
|
|
@@ -26,4 +30,10 @@ Usa **Exportar** para descargar una copia completa de esta instancia del control
|
|
|
26
30
|
## Eliminar un dispositivo
|
|
27
31
|
|
|
28
32
|
Usa el botón de la papelera en la lista de dispositivos emparejados. El controlador intenta retirar el dispositivo correctamente; si no está accesible, se elimina igualmente de la fabric (puede ser necesario un reset de fábrica del dispositivo).
|
|
33
|
+
|
|
34
|
+
La lista contiene una fila por cada nodo almacenado actualmente en la fabric Matter de este controlador. Los Node ID son únicos dentro de esa fabric; los endpoints expuestos por un único bridge comisionado no se muestran como dispositivos separados. La columna de estado indica si cada nodo está conectado, desconectado, reconectando o esperando ser descubierto.
|
|
35
|
+
|
|
36
|
+
El controlador conserva por separado el orden de comandos de cada dispositivo emparejado. Un dispositivo lento, sin conexión o eliminado no puede bloquear los comandos destinados a otros dispositivos. Los nodos Controller que aún referencian un Node ID eliminado rechazan inmediatamente los nuevos comandos y muestran **Device no longer commissioned**.
|
|
37
|
+
|
|
38
|
+
Cuando un dispositivo deja de estar disponible, sus nodos Controller permanecen bloqueados e ignoran los comandos posteriores hasta que ese dispositivo vuelve a informar `connected`. La recuperación es automática; abrir el editor del nodo de dispositivo también libera el bloqueo para un reintento manual.
|
|
29
39
|
</script>
|
|
@@ -9,6 +9,18 @@
|
|
|
9
9
|
"pairing_code": "Código de emparejamiento",
|
|
10
10
|
"pairing_name": "Nombre del dispositivo",
|
|
11
11
|
"pair_button": "EMPAREJAR",
|
|
12
|
+
"qr_acquire": "Leer código QR",
|
|
13
|
+
"qr_scan_camera": "Webcam",
|
|
14
|
+
"qr_scan_image": "Imagen",
|
|
15
|
+
"qr_stop_camera": "Detener cámara",
|
|
16
|
+
"qr_camera_insecure": "El navegador no puede usar la webcam porque el editor de Node-RED no está abierto mediante HTTPS o localhost. Vuelve a abrirlo con HTTPS o usa Imagen.",
|
|
17
|
+
"qr_camera_unsupported": "Este navegador no puede acceder a una webcam. Usa un navegador compatible o carga una imagen.",
|
|
18
|
+
"qr_camera_permission_denied": "Se denegó el permiso para usar la webcam. Permite el acceso a la cámara en el navegador o carga una imagen.",
|
|
19
|
+
"qr_camera_failed": "No se pudo iniciar la webcam",
|
|
20
|
+
"qr_image_failed": "No se encontró ningún código QR legible en la imagen seleccionada",
|
|
21
|
+
"qr_invalid_matter": "El código QR no es un código de emparejamiento Matter (MT:…).",
|
|
22
|
+
"qr_found": "Código QR Matter leído. El emparejamiento comienza automáticamente.",
|
|
23
|
+
"qr_decoder_unavailable": "No se pudo cargar el lector de códigos QR.",
|
|
12
24
|
"devices_title": "Dispositivos emparejados",
|
|
13
25
|
"col_name": "Nombre",
|
|
14
26
|
"col_product": "Producto",
|
|
@@ -1,6 +1,4 @@
|
|
|
1
1
|
<script type="text/markdown" data-help-name="knxUltimateMatterControllerDevice">
|
|
2
|
-
# Control Matter from KNX (BETA)
|
|
3
|
-
|
|
4
2
|
> Ce nœud est en **BETA** : le comportement peut changer pendant l amélioration de l'implémentation Matter.
|
|
5
3
|
|
|
6
4
|
Ce nœud contrôle depuis KNX un endpoint Matter déjà appairé. Sélectionnez l'appareil Matter et l'éditeur détecte ses capacités, puis affiche uniquement les mappings KNX adaptés à cet endpoint.
|
|
@@ -21,9 +19,31 @@ Il remplace les nœuds Matter séparés non publiés et conserve toute l'UI lumi
|
|
|
21
19
|
| Capteurs | Les endpoints capteur affichent leur GA de mesure/état uniquement si elle est supportée : température, humidité, éclairement, occupation, contact et batterie. |
|
|
22
20
|
| Read at startup | Publie la valeur Matter en cache au déploiement/démarrage ou quand le périphérique se reconnecte. |
|
|
23
21
|
| Update local state from KNX write | Met à jour le cache local Matter/KNX lorsqu'un télégramme est écrit sur une GA KNX configurée. |
|
|
24
|
-
| Node Input/Output PINs | Affiche les pins entrée/sortie Node-RED.
|
|
22
|
+
| Node Input/Output PINs | Affiche les pins entrée/sortie Node-RED. Les endpoints autres que lumière acceptent le format simple `{function,value}` et les champs Matter avancés ; la sortie émet les états. |
|
|
23
|
+
|
|
24
|
+
## Entrée du flow
|
|
25
|
+
|
|
26
|
+
Pour un endpoint autre que lumière, ouvrez l'onglet **Entrée du flow**. L'onglet est construit depuis la structure annoncée et affiche des exemples copiables, l'Endpoint ID, tous les attributs lisibles/inscriptibles et toutes les commandes acceptées. Il reste disponible lorsque le nœud est utilisé uniquement par le flow, sans passerelle KNX.
|
|
27
|
+
|
|
28
|
+
Une écriture simple utilise `msg.payload = {function:"position",value:35}`. Omettez `value` pour lire un état, par exemple `{function:"temperature"}` ; la sortie utilise des unités lisibles et place les détails bruts dans `msg.matter`. Les fonctions `onoff`, `level`, `position`, `open`, `close`, `stop`, consignes, ventilateur et capteurs ne sont proposées que si l'endpoint les annonce. Une serrure accepte `{function:"lock",value:true|false}`.
|
|
29
|
+
|
|
30
|
+
Les entrées avancées restent valides : `msg.clusterId` avec `msg.command`/`msg.args`, ou `msg.attribute` et éventuellement `msg.value`. Le Node ID et l'Endpoint ID sont déjà sélectionnés dans le nœud.
|
|
31
|
+
|
|
32
|
+
## Mode universel
|
|
33
|
+
|
|
34
|
+
Sélectionnez **Mode universel** pour surveiller tous les appareils. Le nœud possède toujours une entrée et une sortie et n'utilise pas les mappings d'un endpoint. La passerelle KNX est optionnelle et sert uniquement aux GA alarme/texte du moniteur.
|
|
35
|
+
|
|
36
|
+
Le **Moniteur universel de batteries** conserve l'état complet. Les GA KNX optionnelles publient l'alarme globale en DPT 1.005 et font défiler les appareils toutes les 2 secondes en DPT 16.001. `{payload:{action:"getAllBatteries"}}` renvoie l'inventaire.
|
|
37
|
+
|
|
38
|
+
La sortie place la valeur brute dans `msg.payload` et le routage dans `msg.matter` (`source`, `nodeId`, `endpointId`, `clusterId`, nom d'attribut/événement). L'entrée utilise `msg.nodeId`, `msg.endpointId`, `msg.clusterId` et soit `msg.command` avec `msg.args`, soit `msg.attribute`; ajoutez `msg.value` pour écrire, omettez-le pour lire. Ces champs peuvent aussi être placés sous `msg.matter`.
|
|
39
|
+
|
|
40
|
+
Exemples : `{nodeId:"100",endpointId:1,clusterId:6,command:"on",args:{}}` allume ; `{nodeId:"100",endpointId:1,clusterId:47,attribute:"batPercentRemaining"}` lit la batterie. La batterie reste dans l'unité Matter brute par demi-pourcent ; divisez par deux dans un nœud Function.
|
|
25
41
|
|
|
26
42
|
## Comportement
|
|
27
43
|
|
|
28
44
|
Le nœud garde un cache local depuis les mises à jour Matter et les écritures KNX, répond aux lectures KNX depuis ce cache et peut émettre/lire les valeurs au démarrage. Il n'écoute que les adresses de groupe configurées, donc le trafic KNX non lié est ignoré.
|
|
45
|
+
|
|
46
|
+
Les commandes utilisent une file ordonnée séparée pour chaque appareil appairé. Un appareil hors ligne, en délai dépassé ou supprimé ne peut donc pas retarder les autres appareils Matter qui utilisent la même adresse de groupe KNX. Un nœud qui référence encore un appareil supprimé refuse immédiatement la commande et affiche **Device no longer commissioned** en rouge ; sélectionnez un appareil Matter valide ou supprimez le nœud Controller orphelin.
|
|
47
|
+
|
|
48
|
+
Une erreur d'appareil indisponible reste verrouillée : les commandes KNX et flow suivantes sont ignorées et ne peuvent pas remplacer l'état rouge. Le nœud reprend automatiquement dès que cet appareil Matter signale `connected` ; l'ouverture de l'éditeur du nœud libère également le verrou pour permettre un nouvel essai manuel.
|
|
29
49
|
</script>
|