node-red-contrib-knx-ultimate 6.1.0 → 6.1.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +6 -0
- package/examples/Matter Controller - Semantic Flow Input.json +248 -0
- package/nodes/knxUltimateMatterBridge.html +144 -11
- package/nodes/knxUltimateMatterControllerDevice.html +80 -55
- package/nodes/locales/de/knxUltimateMatterBridge.html +1 -1
- package/nodes/locales/de/knxUltimateMatterBridge.json +14 -0
- package/nodes/locales/de/knxUltimateMatterControllerDevice.html +2 -2
- package/nodes/locales/de/knxUltimateMatterControllerDevice.json +2 -1
- package/nodes/locales/en/knxUltimateMatterBridge.html +1 -1
- package/nodes/locales/en/knxUltimateMatterBridge.json +14 -0
- package/nodes/locales/en/knxUltimateMatterControllerDevice.html +2 -2
- package/nodes/locales/en/knxUltimateMatterControllerDevice.json +2 -1
- package/nodes/locales/es/knxUltimateMatterBridge.html +1 -1
- package/nodes/locales/es/knxUltimateMatterBridge.json +14 -0
- package/nodes/locales/es/knxUltimateMatterControllerDevice.html +2 -2
- package/nodes/locales/es/knxUltimateMatterControllerDevice.json +2 -1
- package/nodes/locales/fr/knxUltimateMatterBridge.html +1 -1
- package/nodes/locales/fr/knxUltimateMatterBridge.json +14 -0
- package/nodes/locales/fr/knxUltimateMatterControllerDevice.html +2 -2
- package/nodes/locales/fr/knxUltimateMatterControllerDevice.json +2 -1
- package/nodes/locales/it/knxUltimateMatterBridge.html +1 -1
- package/nodes/locales/it/knxUltimateMatterBridge.json +14 -0
- package/nodes/locales/it/knxUltimateMatterControllerDevice.html +2 -2
- package/nodes/locales/it/knxUltimateMatterControllerDevice.json +2 -1
- package/nodes/locales/zh-CN/knxUltimateMatterBridge.html +1 -1
- package/nodes/locales/zh-CN/knxUltimateMatterBridge.json +14 -0
- package/nodes/locales/zh-CN/knxUltimateMatterControllerDevice.html +2 -2
- package/nodes/locales/zh-CN/knxUltimateMatterControllerDevice.json +2 -1
- package/package.json +1 -1
package/CHANGELOG.md
CHANGED
|
@@ -6,6 +6,11 @@
|
|
|
6
6
|
|
|
7
7
|
# CHANGELOG
|
|
8
8
|
|
|
9
|
+
**Version 6.1.1** - July 2026<br/>
|
|
10
|
+
|
|
11
|
+
- **Control Matter from KNX — contextual flow PIN help**: **Node Input/Output PINs** now reveals the capability-driven **Flow input** section directly below the selector instead of adding a separate editor tab. The section remains hidden while the pins are disabled. Light endpoints now receive contextual, copyable examples for their supported top-level `msg.on`, `msg.dimming`, `msg.color_temperature` and `msg.color` contracts, while non-light endpoints retain their advertised simple and advanced Matter examples.<br/>
|
|
12
|
+
- **Matter Bridge — contextual flow PIN help**: **Node Input/Output PINs** now sits outside the editor tabs and, when enabled, reveals a contextual **Flow input/output** section directly below it. Copyable Flow → Matter and Matter → Flow examples are filtered to the selected device type, covering lights, covers, thermostats, fans, sensors, alarms and the flow-only robot vacuum while documenting only the message contracts already accepted or emitted by the runtime.<br/>
|
|
13
|
+
|
|
9
14
|
**Version 6.1.0** - July 2026<br/>
|
|
10
15
|
|
|
11
16
|
- **Matter Controller — QR pairing-code reader**: the pairing editor can now fill the existing `MT:…` field by scanning a QR code with the local webcam or reading it from a selected image, including inverted white-on-dark QR codes used by some device web interfaces. Decoding remains entirely in the browser and never uploads the image or video; after a valid QR is read, pairing starts automatically, while manually typed codes still require **PAIR**. The optional device name is positioned before the scanner, the decoded code remains visible underneath it and fabric backup controls have moved to the bottom of the editor. A prominent blocking progress overlay prevents further editor interactions until commissioning succeeds or fails. When live camera access is unavailable because the editor is not open over HTTPS/`localhost`, permission was denied or the browser lacks camera support, the editor explains the reason and keeps image loading available.<br/>
|
|
@@ -17,6 +22,7 @@
|
|
|
17
22
|
- **Matter editor/help cleanup**: decorative animated light icons and duplicate localized help headings were removed from the Matter Controller, Matter Bridge and shared light editor where applicable.<br/>
|
|
18
23
|
- **Matter Bridge — editor tab orientation**: the device editor now uses the same left-hand vertical tab layout as Matter Controller, keeping Mappings and Advanced options visually consistent without changing saved configuration.<br/>
|
|
19
24
|
- **Control Matter from KNX — simple flow input and capability help**: non-light endpoints now accept the same human-readable `msg.payload = { function, value }` contract used by Matter Bridge. The selected node and endpoint are implicit; percentages, temperatures and measurements use human units, while omitting `value` reads a supported state. A capability-driven **Flow input** tab, consistent with the node's existing editor tabs, replaces the modal help button and provides copyable simple examples plus every advertised readable/writable attribute, command, cluster ID and advanced message. It remains available for flow-only nodes without a KNX gateway. Existing top-level `clusterId`/`command`/`attribute` inputs remain compatible, and Door Lock also accepts `{function:"lock",value:true|false}`.<br/>
|
|
25
|
+
- **Examples — Matter semantic flow input**: added an importable, non-destructive Matter Controller example with manual Inject nodes for On/Off, level, cover position, thermostat setpoint, temperature read and Identify. It deliberately creates no `matter-config`, sends nothing automatically and directs users to select an existing fabric/endpoint and use only functions advertised in the **Flow input** tab.<br/>
|
|
20
26
|
- **Control Matter from KNX — dedicated controller profiles**: Window Covering (`0x0102`), Thermostat (`0x0201`), Fan Control (`0x0202`) and Switch (`0x003B`) endpoints are now selected into explicit capability-driven profiles instead of the anonymous mapped fallback. They share the guarded mapping lifecycle while presenting semantic canvas status; Switch initial/long/multi-press events are filtered to the selected endpoint and exposed on the optional flow output. Simple actuators and sensors remain on the generic mapped profile.<br/>
|
|
21
27
|
- **Control Matter from KNX — flow attribute reads and persistent Door Lock status**: mapped endpoints now use an unambiguous top-level flow contract: `msg.clusterId` plus `msg.attribute` reads an attribute, `msg.value` makes it an attribute write, and `msg.command` plus `msg.args` invokes a command. Reads return the value in `msg.payload`, may force a remote request with `msg.requestFromRemote = true`, and accept numeric attribute ID `0`. Door Lock nodes now retain their last `locked`/`unlocked` canvas status when generic Matter or KNX notifications arrive.<br/>
|
|
22
28
|
|
|
@@ -0,0 +1,248 @@
|
|
|
1
|
+
[
|
|
2
|
+
{
|
|
3
|
+
"id": "matter_semantic_tab",
|
|
4
|
+
"type": "tab",
|
|
5
|
+
"label": "Matter Controller - Flow input",
|
|
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."
|
|
8
|
+
},
|
|
9
|
+
{
|
|
10
|
+
"id": "matter_semantic_instructions",
|
|
11
|
+
"type": "comment",
|
|
12
|
+
"z": "matter_semantic_tab",
|
|
13
|
+
"name": "1. Open the Controller, select matter-config + endpoint, then enable the flow PINs",
|
|
14
|
+
"info": "The Inject nodes are alternative examples: one endpoint normally does not support every function shown. Use only functions listed in the Controller node's Flow input section.",
|
|
15
|
+
"x": 520,
|
|
16
|
+
"y": 60,
|
|
17
|
+
"wires": []
|
|
18
|
+
},
|
|
19
|
+
{
|
|
20
|
+
"id": "matter_semantic_supported",
|
|
21
|
+
"type": "comment",
|
|
22
|
+
"z": "matter_semantic_tab",
|
|
23
|
+
"name": "2. Trigger only Inject nodes supported by the selected endpoint",
|
|
24
|
+
"info": "No Inject is configured to run automatically. Reads omit value; writes include value.",
|
|
25
|
+
"x": 340,
|
|
26
|
+
"y": 110,
|
|
27
|
+
"wires": []
|
|
28
|
+
},
|
|
29
|
+
{
|
|
30
|
+
"id": "matter_semantic_on",
|
|
31
|
+
"type": "inject",
|
|
32
|
+
"z": "matter_semantic_tab",
|
|
33
|
+
"name": "On: {onoff, true}",
|
|
34
|
+
"props": [
|
|
35
|
+
{
|
|
36
|
+
"p": "payload",
|
|
37
|
+
"v": "{\"function\":\"onoff\",\"value\":true}",
|
|
38
|
+
"vt": "json"
|
|
39
|
+
}
|
|
40
|
+
],
|
|
41
|
+
"repeat": "",
|
|
42
|
+
"crontab": "",
|
|
43
|
+
"once": false,
|
|
44
|
+
"onceDelay": 0.1,
|
|
45
|
+
"topic": "",
|
|
46
|
+
"x": 190,
|
|
47
|
+
"y": 180,
|
|
48
|
+
"wires": [
|
|
49
|
+
[
|
|
50
|
+
"matter_semantic_controller"
|
|
51
|
+
]
|
|
52
|
+
]
|
|
53
|
+
},
|
|
54
|
+
{
|
|
55
|
+
"id": "matter_semantic_off",
|
|
56
|
+
"type": "inject",
|
|
57
|
+
"z": "matter_semantic_tab",
|
|
58
|
+
"name": "Off: {onoff, false}",
|
|
59
|
+
"props": [
|
|
60
|
+
{
|
|
61
|
+
"p": "payload",
|
|
62
|
+
"v": "{\"function\":\"onoff\",\"value\":false}",
|
|
63
|
+
"vt": "json"
|
|
64
|
+
}
|
|
65
|
+
],
|
|
66
|
+
"repeat": "",
|
|
67
|
+
"crontab": "",
|
|
68
|
+
"once": false,
|
|
69
|
+
"onceDelay": 0.1,
|
|
70
|
+
"topic": "",
|
|
71
|
+
"x": 190,
|
|
72
|
+
"y": 230,
|
|
73
|
+
"wires": [
|
|
74
|
+
[
|
|
75
|
+
"matter_semantic_controller"
|
|
76
|
+
]
|
|
77
|
+
]
|
|
78
|
+
},
|
|
79
|
+
{
|
|
80
|
+
"id": "matter_semantic_level",
|
|
81
|
+
"type": "inject",
|
|
82
|
+
"z": "matter_semantic_tab",
|
|
83
|
+
"name": "Level 50%",
|
|
84
|
+
"props": [
|
|
85
|
+
{
|
|
86
|
+
"p": "payload",
|
|
87
|
+
"v": "{\"function\":\"level\",\"value\":50}",
|
|
88
|
+
"vt": "json"
|
|
89
|
+
}
|
|
90
|
+
],
|
|
91
|
+
"repeat": "",
|
|
92
|
+
"crontab": "",
|
|
93
|
+
"once": false,
|
|
94
|
+
"onceDelay": 0.1,
|
|
95
|
+
"topic": "",
|
|
96
|
+
"x": 180,
|
|
97
|
+
"y": 280,
|
|
98
|
+
"wires": [
|
|
99
|
+
[
|
|
100
|
+
"matter_semantic_controller"
|
|
101
|
+
]
|
|
102
|
+
]
|
|
103
|
+
},
|
|
104
|
+
{
|
|
105
|
+
"id": "matter_semantic_position",
|
|
106
|
+
"type": "inject",
|
|
107
|
+
"z": "matter_semantic_tab",
|
|
108
|
+
"name": "Cover position 35%",
|
|
109
|
+
"props": [
|
|
110
|
+
{
|
|
111
|
+
"p": "payload",
|
|
112
|
+
"v": "{\"function\":\"position\",\"value\":35}",
|
|
113
|
+
"vt": "json"
|
|
114
|
+
}
|
|
115
|
+
],
|
|
116
|
+
"repeat": "",
|
|
117
|
+
"crontab": "",
|
|
118
|
+
"once": false,
|
|
119
|
+
"onceDelay": 0.1,
|
|
120
|
+
"topic": "",
|
|
121
|
+
"x": 190,
|
|
122
|
+
"y": 330,
|
|
123
|
+
"wires": [
|
|
124
|
+
[
|
|
125
|
+
"matter_semantic_controller"
|
|
126
|
+
]
|
|
127
|
+
]
|
|
128
|
+
},
|
|
129
|
+
{
|
|
130
|
+
"id": "matter_semantic_setpoint",
|
|
131
|
+
"type": "inject",
|
|
132
|
+
"z": "matter_semantic_tab",
|
|
133
|
+
"name": "Setpoint 21,5 °C",
|
|
134
|
+
"props": [
|
|
135
|
+
{
|
|
136
|
+
"p": "payload",
|
|
137
|
+
"v": "{\"function\":\"setpoint\",\"value\":21.5}",
|
|
138
|
+
"vt": "json"
|
|
139
|
+
}
|
|
140
|
+
],
|
|
141
|
+
"repeat": "",
|
|
142
|
+
"crontab": "",
|
|
143
|
+
"once": false,
|
|
144
|
+
"onceDelay": 0.1,
|
|
145
|
+
"topic": "",
|
|
146
|
+
"x": 190,
|
|
147
|
+
"y": 380,
|
|
148
|
+
"wires": [
|
|
149
|
+
[
|
|
150
|
+
"matter_semantic_controller"
|
|
151
|
+
]
|
|
152
|
+
]
|
|
153
|
+
},
|
|
154
|
+
{
|
|
155
|
+
"id": "matter_semantic_temperature",
|
|
156
|
+
"type": "inject",
|
|
157
|
+
"z": "matter_semantic_tab",
|
|
158
|
+
"name": "Read temperature",
|
|
159
|
+
"props": [
|
|
160
|
+
{
|
|
161
|
+
"p": "payload",
|
|
162
|
+
"v": "{\"function\":\"temperature\"}",
|
|
163
|
+
"vt": "json"
|
|
164
|
+
}
|
|
165
|
+
],
|
|
166
|
+
"repeat": "",
|
|
167
|
+
"crontab": "",
|
|
168
|
+
"once": false,
|
|
169
|
+
"onceDelay": 0.1,
|
|
170
|
+
"topic": "",
|
|
171
|
+
"x": 190,
|
|
172
|
+
"y": 430,
|
|
173
|
+
"wires": [
|
|
174
|
+
[
|
|
175
|
+
"matter_semantic_controller"
|
|
176
|
+
]
|
|
177
|
+
]
|
|
178
|
+
},
|
|
179
|
+
{
|
|
180
|
+
"id": "matter_semantic_identify",
|
|
181
|
+
"type": "inject",
|
|
182
|
+
"z": "matter_semantic_tab",
|
|
183
|
+
"name": "Identify",
|
|
184
|
+
"props": [
|
|
185
|
+
{
|
|
186
|
+
"p": "payload",
|
|
187
|
+
"v": "{\"function\":\"identify\"}",
|
|
188
|
+
"vt": "json"
|
|
189
|
+
}
|
|
190
|
+
],
|
|
191
|
+
"repeat": "",
|
|
192
|
+
"crontab": "",
|
|
193
|
+
"once": false,
|
|
194
|
+
"onceDelay": 0.1,
|
|
195
|
+
"topic": "",
|
|
196
|
+
"x": 170,
|
|
197
|
+
"y": 480,
|
|
198
|
+
"wires": [
|
|
199
|
+
[
|
|
200
|
+
"matter_semantic_controller"
|
|
201
|
+
]
|
|
202
|
+
]
|
|
203
|
+
},
|
|
204
|
+
{
|
|
205
|
+
"id": "matter_semantic_controller",
|
|
206
|
+
"type": "knxUltimateMatterControllerDevice",
|
|
207
|
+
"z": "matter_semantic_tab",
|
|
208
|
+
"server": "",
|
|
209
|
+
"serverMatter": "",
|
|
210
|
+
"matterControllerMode": "single",
|
|
211
|
+
"universalService": "batteryMonitor",
|
|
212
|
+
"matterNodeId": "",
|
|
213
|
+
"matterEndpointId": 1,
|
|
214
|
+
"matterDeviceName": "",
|
|
215
|
+
"matterDeviceCapabilities": "",
|
|
216
|
+
"matterMappings": "[]",
|
|
217
|
+
"name": "SELECT A MATTER ENDPOINT",
|
|
218
|
+
"readStatusAtStartup": "no",
|
|
219
|
+
"enableNodePINS": "yes",
|
|
220
|
+
"updateLocalStateFromKNXWrite": true,
|
|
221
|
+
"inputs": 1,
|
|
222
|
+
"outputs": 1,
|
|
223
|
+
"x": 570,
|
|
224
|
+
"y": 330,
|
|
225
|
+
"wires": [
|
|
226
|
+
[
|
|
227
|
+
"matter_semantic_debug"
|
|
228
|
+
]
|
|
229
|
+
]
|
|
230
|
+
},
|
|
231
|
+
{
|
|
232
|
+
"id": "matter_semantic_debug",
|
|
233
|
+
"type": "debug",
|
|
234
|
+
"z": "matter_semantic_tab",
|
|
235
|
+
"name": "Complete Matter response",
|
|
236
|
+
"active": true,
|
|
237
|
+
"tosidebar": true,
|
|
238
|
+
"console": false,
|
|
239
|
+
"tostatus": true,
|
|
240
|
+
"complete": "true",
|
|
241
|
+
"targetType": "full",
|
|
242
|
+
"statusVal": "payload",
|
|
243
|
+
"statusType": "auto",
|
|
244
|
+
"x": 850,
|
|
245
|
+
"y": 330,
|
|
246
|
+
"wires": []
|
|
247
|
+
}
|
|
248
|
+
]
|
|
@@ -67,6 +67,28 @@
|
|
|
67
67
|
robotvacuum: [] // Flow-only: no GA fields, controlled via the node PINs
|
|
68
68
|
};
|
|
69
69
|
const TYPE_ORDER = ['onofflight', 'dimmablelight', 'rgblight', 'colortemperaturelight', 'onoffplug', 'windowcovering', 'thermostat', 'fan', 'temperaturesensor', 'humiditysensor', 'lightsensor', 'occupancysensor', 'contactsensor', 'smokecoalarm', 'waterleakdetector', 'airqualitysensor', 'robotvacuum'];
|
|
70
|
+
const FLOW_HELP = {
|
|
71
|
+
onofflight: { input: [['onoff', true]], output: [['onoff', true]] },
|
|
72
|
+
onoffplug: { input: [['onoff', true]], output: [['onoff', true]] },
|
|
73
|
+
dimmablelight: { input: [['onoff', true], ['level', 50]], output: [['onoff', true], ['level', 50]] },
|
|
74
|
+
rgblight: { input: [['onoff', true], ['level', 50], ['rgb', { red: 255, green: 80, blue: 20 }]], output: [['onoff', true], ['level', 50], ['rgb', { red: 255, green: 80, blue: 20 }]] },
|
|
75
|
+
colortemperaturelight: { input: [['onoff', true], ['level', 50], ['colortemp', 3000]], output: [['onoff', true], ['level', 50], ['colortemp', 3000]] },
|
|
76
|
+
temperaturesensor: { input: [['temperature', 21.5]], output: [] },
|
|
77
|
+
humiditysensor: { input: [['humidity', 45]], output: [] },
|
|
78
|
+
lightsensor: { input: [['illuminance', 500]], output: [] },
|
|
79
|
+
occupancysensor: { input: [['occupancy', true]], output: [] },
|
|
80
|
+
contactsensor: { input: [['contact', true]], output: [] },
|
|
81
|
+
windowcovering: { input: [['position', 35]], output: [['updown', false], ['position', 35], ['stop', true]] },
|
|
82
|
+
thermostat: { input: [['currenttemp', 21.5], ['setpoint', 21], ['coolingsetpoint', 24]], output: [['setpoint', 21], ['coolingsetpoint', 24]] },
|
|
83
|
+
smokecoalarm: { input: [['smoke', true], ['co', true]], output: [] },
|
|
84
|
+
waterleakdetector: { input: [['leak', true]], output: [] },
|
|
85
|
+
airqualitysensor: { input: [['co2', 850]], output: [] },
|
|
86
|
+
fan: { input: [['fanspeed', 60]], output: [['fanspeed', 60]] },
|
|
87
|
+
robotvacuum: {
|
|
88
|
+
input: [['rvcstate', 'charging'], ['rvcmode', 'idle']],
|
|
89
|
+
output: [['rvccommand', 'gohome'], ['rvccommand', 'pause'], ['rvccommand', 'resume'], ['rvcmode', 'cleaning']]
|
|
90
|
+
}
|
|
91
|
+
};
|
|
70
92
|
|
|
71
93
|
// Every GA/DPT key across all types, used to declare the node defaults.
|
|
72
94
|
const ALL_KEYS = [];
|
|
@@ -167,6 +189,25 @@
|
|
|
167
189
|
border-top: 1px solid #ccc;
|
|
168
190
|
margin: 8px 0;
|
|
169
191
|
}
|
|
192
|
+
.matter-bridge-flow-help-table {
|
|
193
|
+
width: 100%;
|
|
194
|
+
border-collapse: collapse;
|
|
195
|
+
margin-bottom: 12px;
|
|
196
|
+
}
|
|
197
|
+
.matter-bridge-flow-help-table th,
|
|
198
|
+
.matter-bridge-flow-help-table td {
|
|
199
|
+
border-bottom: 1px solid #ddd;
|
|
200
|
+
padding: 7px 6px;
|
|
201
|
+
text-align: left;
|
|
202
|
+
vertical-align: top;
|
|
203
|
+
}
|
|
204
|
+
.matter-bridge-flow-help-table code {
|
|
205
|
+
white-space: pre-wrap;
|
|
206
|
+
word-break: break-word;
|
|
207
|
+
}
|
|
208
|
+
.matter-bridge-flow-help-copy {
|
|
209
|
+
white-space: nowrap;
|
|
210
|
+
}
|
|
170
211
|
</style>`);
|
|
171
212
|
}
|
|
172
213
|
const $tabs = $('#mb-tabs');
|
|
@@ -217,6 +258,9 @@
|
|
|
217
258
|
const $commandAdvancedRows = $('.mb-command-advanced-row');
|
|
218
259
|
const $dimmerAdvancedRows = $('.mb-dimmer-advanced-row');
|
|
219
260
|
const $coverAdvancedRows = $('.mb-cover-advanced-row');
|
|
261
|
+
const $pinSelect = $('#node-input-enableNodePINS');
|
|
262
|
+
const $flowHelp = $('#matter-bridge-flow-help');
|
|
263
|
+
const $nameInput = $('#node-input-name');
|
|
220
264
|
const gaInputs = {};
|
|
221
265
|
|
|
222
266
|
function createLabeledField(row, element, options = {}) {
|
|
@@ -272,6 +316,51 @@
|
|
|
272
316
|
gaInputs[key] = { wrapper, $ga, $dpt, $labelSpan };
|
|
273
317
|
});
|
|
274
318
|
|
|
319
|
+
const inputMessageCode = (fn, value) => `msg.payload = ${JSON.stringify({ function: fn, value }, null, 2)};\nreturn msg;`;
|
|
320
|
+
const outputMessageCode = (fn, value) => JSON.stringify({
|
|
321
|
+
topic: ($nameInput.val() || node.name || 'Matter device').toString(),
|
|
322
|
+
payload: value,
|
|
323
|
+
matter: { fn, value }
|
|
324
|
+
}, null, 2);
|
|
325
|
+
const appendFlowHelpRow = ($body, fn, code) => {
|
|
326
|
+
const $row = $('<tr></tr>');
|
|
327
|
+
$('<td><code></code></td>').find('code').text(fn).end().appendTo($row);
|
|
328
|
+
$('<td><code></code></td>').find('code').text(code).end().appendTo($row);
|
|
329
|
+
$('<td></td>').append(
|
|
330
|
+
$('<button type="button" class="red-ui-button matter-bridge-flow-help-copy"><i class="fa fa-copy"></i></button>')
|
|
331
|
+
.attr('title', node._('knxUltimateMatterBridge.flow_help.copy') || 'Copy')
|
|
332
|
+
.data('copy-text', code)
|
|
333
|
+
).appendTo($row);
|
|
334
|
+
$body.append($row);
|
|
335
|
+
};
|
|
336
|
+
const copyFlowHelpText = (value) => {
|
|
337
|
+
const copied = () => RED.notify(node._('knxUltimateMatterBridge.flow_help.copied') || 'Message copied', 'success');
|
|
338
|
+
if (navigator.clipboard && typeof navigator.clipboard.writeText === 'function') {
|
|
339
|
+
navigator.clipboard.writeText(value).then(copied).catch(() => {
|
|
340
|
+
const $temporary = $('<textarea></textarea>').val(value).appendTo('body').select();
|
|
341
|
+
try { document.execCommand('copy'); copied(); } finally { $temporary.remove(); }
|
|
342
|
+
});
|
|
343
|
+
return;
|
|
344
|
+
}
|
|
345
|
+
const $temporary = $('<textarea></textarea>').val(value).appendTo('body').select();
|
|
346
|
+
try { document.execCommand('copy'); copied(); } finally { $temporary.remove(); }
|
|
347
|
+
};
|
|
348
|
+
const renderFlowHelp = () => {
|
|
349
|
+
const examples = FLOW_HELP[$type.val()] || { input: [], output: [] };
|
|
350
|
+
const $inputBody = $('#matter-bridge-flow-help-input-body').empty();
|
|
351
|
+
const $outputBody = $('#matter-bridge-flow-help-output-body').empty();
|
|
352
|
+
examples.input.forEach(([fn, value]) => appendFlowHelpRow($inputBody, fn, inputMessageCode(fn, value)));
|
|
353
|
+
examples.output.forEach(([fn, value]) => appendFlowHelpRow($outputBody, fn, outputMessageCode(fn, value)));
|
|
354
|
+
$('#matter-bridge-flow-help-input-empty').toggle(examples.input.length === 0);
|
|
355
|
+
$('#matter-bridge-flow-help-output-empty').toggle(examples.output.length === 0);
|
|
356
|
+
$('#matter-bridge-flow-help-output-table').toggle(examples.output.length > 0);
|
|
357
|
+
};
|
|
358
|
+
const updateFlowHelpVisibility = () => {
|
|
359
|
+
const visible = $pinSelect.val() === 'yes';
|
|
360
|
+
$flowHelp.toggle(visible);
|
|
361
|
+
if (visible) renderFlowHelp();
|
|
362
|
+
};
|
|
363
|
+
|
|
275
364
|
function updateTypePresentation() {
|
|
276
365
|
const selected = $type.val();
|
|
277
366
|
const active = TYPE_FIELDS[selected] || [];
|
|
@@ -295,6 +384,7 @@
|
|
|
295
384
|
$commandAdvancedRows.toggle(hasCommand);
|
|
296
385
|
$dimmerAdvancedRows.toggle(hasLevel);
|
|
297
386
|
$coverAdvancedRows.toggle(isCover);
|
|
387
|
+
updateFlowHelpVisibility();
|
|
298
388
|
}
|
|
299
389
|
$type.on('change', updateTypePresentation);
|
|
300
390
|
updateTypePresentation();
|
|
@@ -312,7 +402,15 @@
|
|
|
312
402
|
$('#node-input-coverUpdateMode').val(node.coverUpdateMode || 'optimistic');
|
|
313
403
|
$('#node-input-coverStatusTimeoutMs').val(node.coverStatusTimeoutMs === undefined ? 3000 : node.coverStatusTimeoutMs);
|
|
314
404
|
$('#node-input-readStatusAtStartup').val(node.readStatusAtStartup || 'yes');
|
|
315
|
-
$
|
|
405
|
+
$pinSelect.val(node.enableNodePINS || 'no');
|
|
406
|
+
$pinSelect.on('change.knxUltimateMatterBridge', updateFlowHelpVisibility);
|
|
407
|
+
$nameInput.on('change.knxUltimateMatterBridge input.knxUltimateMatterBridge', () => {
|
|
408
|
+
if ($flowHelp.is(':visible')) renderFlowHelp();
|
|
409
|
+
});
|
|
410
|
+
$flowHelp.off('click.knxUltimateMatterBridge').on('click.knxUltimateMatterBridge', '.matter-bridge-flow-help-copy', function () {
|
|
411
|
+
copyFlowHelpText($(this).data('copy-text') || '');
|
|
412
|
+
});
|
|
413
|
+
updateFlowHelpVisibility();
|
|
316
414
|
},
|
|
317
415
|
oneditsave() {
|
|
318
416
|
try { RED.sidebar.show('info'); } catch (error) { /* empty */ }
|
|
@@ -479,18 +577,52 @@
|
|
|
479
577
|
</select>
|
|
480
578
|
</div>
|
|
481
579
|
|
|
482
|
-
<div class="form-row">
|
|
483
|
-
<label for="node-input-enableNodePINS" style="width:260px;">
|
|
484
|
-
<i class="fa fa-code"></i> <span data-i18n="knxUltimateMatterBridge.node_pins"></span>
|
|
485
|
-
</label>
|
|
486
|
-
<select id="node-input-enableNodePINS" style="width:220px;">
|
|
487
|
-
<option value="no" data-i18n="knxUltimateMatterBridge.node_pins_hide"></option>
|
|
488
|
-
<option value="yes" data-i18n="knxUltimateMatterBridge.node_pins_show"></option>
|
|
489
|
-
</select>
|
|
490
|
-
</div>
|
|
491
580
|
</div>
|
|
492
581
|
</div>
|
|
493
582
|
|
|
583
|
+
<div class="form-row" style="margin-top:12px;">
|
|
584
|
+
<label for="node-input-enableNodePINS" style="width:260px;">
|
|
585
|
+
<i class="fa fa-code"></i> <span data-i18n="knxUltimateMatterBridge.node_pins"></span>
|
|
586
|
+
</label>
|
|
587
|
+
<select id="node-input-enableNodePINS" style="width:220px;">
|
|
588
|
+
<option value="no" data-i18n="knxUltimateMatterBridge.node_pins_hide"></option>
|
|
589
|
+
<option value="yes" data-i18n="knxUltimateMatterBridge.node_pins_show"></option>
|
|
590
|
+
</select>
|
|
591
|
+
</div>
|
|
592
|
+
|
|
593
|
+
<div id="matter-bridge-flow-help" style="display:none; width:900px; margin-top:12px;">
|
|
594
|
+
<h4><i class="fa fa-code"></i> <span data-i18n="knxUltimateMatterBridge.flow_help.title"></span></h4>
|
|
595
|
+
<p data-i18n="knxUltimateMatterBridge.flow_help.intro"></p>
|
|
596
|
+
|
|
597
|
+
<h4 data-i18n="knxUltimateMatterBridge.flow_help.input_title"></h4>
|
|
598
|
+
<p data-i18n="knxUltimateMatterBridge.flow_help.input_hint"></p>
|
|
599
|
+
<table class="matter-bridge-flow-help-table">
|
|
600
|
+
<thead>
|
|
601
|
+
<tr>
|
|
602
|
+
<th data-i18n="knxUltimateMatterBridge.flow_help.function"></th>
|
|
603
|
+
<th data-i18n="knxUltimateMatterBridge.flow_help.message"></th>
|
|
604
|
+
<th></th>
|
|
605
|
+
</tr>
|
|
606
|
+
</thead>
|
|
607
|
+
<tbody id="matter-bridge-flow-help-input-body"></tbody>
|
|
608
|
+
</table>
|
|
609
|
+
<p id="matter-bridge-flow-help-input-empty" style="display:none;" data-i18n="knxUltimateMatterBridge.flow_help.no_input"></p>
|
|
610
|
+
|
|
611
|
+
<h4 data-i18n="knxUltimateMatterBridge.flow_help.output_title"></h4>
|
|
612
|
+
<p data-i18n="knxUltimateMatterBridge.flow_help.output_hint"></p>
|
|
613
|
+
<table id="matter-bridge-flow-help-output-table" class="matter-bridge-flow-help-table">
|
|
614
|
+
<thead>
|
|
615
|
+
<tr>
|
|
616
|
+
<th data-i18n="knxUltimateMatterBridge.flow_help.function"></th>
|
|
617
|
+
<th data-i18n="knxUltimateMatterBridge.flow_help.message"></th>
|
|
618
|
+
<th></th>
|
|
619
|
+
</tr>
|
|
620
|
+
</thead>
|
|
621
|
+
<tbody id="matter-bridge-flow-help-output-body"></tbody>
|
|
622
|
+
</table>
|
|
623
|
+
<p id="matter-bridge-flow-help-output-empty" style="display:none;" data-i18n="knxUltimateMatterBridge.flow_help.no_output"></p>
|
|
624
|
+
</div>
|
|
625
|
+
|
|
494
626
|
<br/>
|
|
495
627
|
<br/>
|
|
496
628
|
<br/>
|
|
@@ -518,7 +650,8 @@ The advanced compatibility options are intentionally type-specific:
|
|
|
518
650
|
|
|
519
651
|
The **KNX gateway is optional**: without it, enable the node PINs and drive the device from the flow.
|
|
520
652
|
|
|
521
|
-
|
|
653
|
+
The PIN selector sits outside the tabs. Enabling it reveals a contextual **Flow input/output**
|
|
654
|
+
section directly below, with copyable examples filtered to the selected device type:
|
|
522
655
|
|
|
523
656
|
- input: `msg.payload = { function: "onoff", value: true }` updates the Matter state without the KNX bus
|
|
524
657
|
- output: every command from a Matter controller is forwarded as `msg` (topic = device name, payload = value, `msg.matter` = raw command)
|
|
@@ -274,7 +274,7 @@
|
|
|
274
274
|
const $refreshDevicesButton = $(".hue-refresh-devices");
|
|
275
275
|
const $locateDeviceButton = $(".hue-locate-device");
|
|
276
276
|
const $hueDevicesLoading = $(".hue-devices-loading");
|
|
277
|
-
const $inputHelpPanel = $("#
|
|
277
|
+
const $inputHelpPanel = $("#matter-flow-input-help");
|
|
278
278
|
const UNIVERSAL_NODE_ID = '__UNIVERSAL__';
|
|
279
279
|
const isUniversalMode = () => $matterControllerModeInput.val() === 'universal';
|
|
280
280
|
$matterControllerModeInput.val(node.matterControllerMode || 'single');
|
|
@@ -921,9 +921,25 @@
|
|
|
921
921
|
const caps = getEffectiveMatterCapabilities();
|
|
922
922
|
const structure = inputStructureFor(caps);
|
|
923
923
|
const endpointId = structure ? structure.endpointId : Number($matterEndpointInput.val() || node.matterEndpointId || 1);
|
|
924
|
+
const isMatterLight = !caps.profile;
|
|
924
925
|
$('#matter-input-help-endpoint').text(String(endpointId));
|
|
925
926
|
const $simpleBody = $('#matter-input-help-simple-body').empty();
|
|
926
|
-
if (
|
|
927
|
+
if (isMatterLight) {
|
|
928
|
+
const writeLabel = node._('knxUltimateMatterControllerDevice.input_help_write') || 'Write';
|
|
929
|
+
if (caps.onOff !== false) {
|
|
930
|
+
appendInputHelpRow($simpleBody, writeLabel, node._('knxUltimateMatterControllerDevice.input_functions.on') || 'On', 'msg.on = { on: true };\nreturn msg;');
|
|
931
|
+
appendInputHelpRow($simpleBody, writeLabel, node._('knxUltimateMatterControllerDevice.input_functions.off') || 'Off', 'msg.on = { on: false };\nreturn msg;');
|
|
932
|
+
}
|
|
933
|
+
if (caps.level !== false) {
|
|
934
|
+
appendInputHelpRow($simpleBody, writeLabel, node._('knxUltimateMatterControllerDevice.input_functions.brightness') || 'Brightness', 'msg.dimming = { brightness: 50 };\nreturn msg;');
|
|
935
|
+
}
|
|
936
|
+
if (caps.colorTemperature === true) {
|
|
937
|
+
appendInputHelpRow($simpleBody, writeLabel, node._('knxUltimateMatterControllerDevice.input_functions.color_temperature') || 'Colour temperature', 'msg.color_temperature = { mirek: 370 };\nreturn msg;');
|
|
938
|
+
}
|
|
939
|
+
if (caps.color === true) {
|
|
940
|
+
appendInputHelpRow($simpleBody, writeLabel, node._('knxUltimateMatterControllerDevice.input_functions.xy_color') || 'XY colour', 'msg.color = { xy: { x: 0.675, y: 0.322 } };\nreturn msg;');
|
|
941
|
+
}
|
|
942
|
+
} else if (caps.profile === 'doorLock') {
|
|
927
943
|
if (caps.lockDoor !== false) appendInputHelpRow($simpleBody, node._('knxUltimateMatterControllerDevice.input_help_write') || 'Write', node._('knxUltimateMatterControllerDevice.input_functions.lock') || 'Lock', functionCode({ function: 'lock', value: true }));
|
|
928
944
|
if (caps.unlockDoor !== false) appendInputHelpRow($simpleBody, node._('knxUltimateMatterControllerDevice.input_help_write') || 'Write', node._('knxUltimateMatterControllerDevice.input_functions.unlock') || 'Unlock', functionCode({ function: 'lock', value: false }));
|
|
929
945
|
} else {
|
|
@@ -949,9 +965,19 @@
|
|
|
949
965
|
});
|
|
950
966
|
}
|
|
951
967
|
$('#matter-input-help-simple-empty').toggle($simpleBody.children().length === 0);
|
|
968
|
+
$('#matter-input-help-simple-hint').attr(
|
|
969
|
+
'data-i18n',
|
|
970
|
+
isMatterLight
|
|
971
|
+
? 'knxUltimateMatterControllerDevice.input_help_light_hint'
|
|
972
|
+
: 'knxUltimateMatterControllerDevice.input_help_simple_hint'
|
|
973
|
+
).text(node._(
|
|
974
|
+
isMatterLight
|
|
975
|
+
? 'knxUltimateMatterControllerDevice.input_help_light_hint'
|
|
976
|
+
: 'knxUltimateMatterControllerDevice.input_help_simple_hint'
|
|
977
|
+
) || '');
|
|
952
978
|
|
|
953
979
|
const $advancedBody = $('#matter-input-help-advanced-body').empty();
|
|
954
|
-
if (structure) {
|
|
980
|
+
if (structure && !isMatterLight) {
|
|
955
981
|
structure.clusters.forEach((cluster) => {
|
|
956
982
|
(cluster.attributes || []).forEach((attribute) => {
|
|
957
983
|
const prefix = `${cluster.name || 'Cluster'} (${cluster.id}) · ${attribute.name} (${attribute.id})`;
|
|
@@ -967,6 +993,7 @@
|
|
|
967
993
|
});
|
|
968
994
|
}
|
|
969
995
|
$('#matter-input-help-advanced-empty').toggle($advancedBody.children().length === 0);
|
|
996
|
+
$('#matter-input-help-advanced-details').toggle(!isMatterLight);
|
|
970
997
|
};
|
|
971
998
|
const copyInputHelpText = (text) => {
|
|
972
999
|
const copied = () => RED.notify(node._('knxUltimateMatterControllerDevice.input_help_copied') || 'Message copied', 'success');
|
|
@@ -985,11 +1012,6 @@
|
|
|
985
1012
|
});
|
|
986
1013
|
$tabs.addClass('hue-vertical-tabs');
|
|
987
1014
|
$tabs.tabs(); // Tabs gestione KNX
|
|
988
|
-
$tabs.off('tabsactivate.matterInputHelp').on('tabsactivate.matterInputHelp', (event, ui) => {
|
|
989
|
-
if (ui && ui.newPanel && ui.newPanel.attr('id') === 'tabs-input') {
|
|
990
|
-
renderInputHelp();
|
|
991
|
-
}
|
|
992
|
-
});
|
|
993
1015
|
$tabs.find('ul').addClass('ui-tabs-nav');
|
|
994
1016
|
$tabs.find('li').removeClass('ui-corner-top').addClass('ui-corner-left');
|
|
995
1017
|
$universalTabs.addClass('hue-vertical-tabs');
|
|
@@ -1300,7 +1322,6 @@
|
|
|
1300
1322
|
setMatterTabVisible('tabs-3', !isUniversal && knxSelected && supportsTemperature);
|
|
1301
1323
|
setMatterTabVisible('tabs-4', !isUniversal && knxSelected && supportsColor);
|
|
1302
1324
|
setMatterTabVisible('tabs-mapped', !isUniversal && knxSelected && isMapped);
|
|
1303
|
-
setMatterTabVisible('tabs-input', !isUniversal && hasHueDevice && (isMapped || isDoorLock));
|
|
1304
1325
|
setMatterTabVisible('tabs-6', !isUniversal && knxSelected && hasHueDevice);
|
|
1305
1326
|
$('#matter-universal-description').toggle(isUniversal);
|
|
1306
1327
|
$pinSelect.val(isUniversal ? 'yes' : $pinSelect.val()).prop('disabled', isUniversal);
|
|
@@ -1316,7 +1337,9 @@
|
|
|
1316
1337
|
$('#matter-door-lock-pin-required').toggle(isDoorLock && caps.requirePinForRemoteOperation === true);
|
|
1317
1338
|
$('#matter-mapped-profile').toggle(isMapped);
|
|
1318
1339
|
if (isMapped) renderMappedProfile(caps.mappedTargets || []);
|
|
1319
|
-
|
|
1340
|
+
const showInputHelp = !isUniversal && hasHueDevice && $pinSelect.val() === 'yes';
|
|
1341
|
+
$inputHelpPanel.toggle(showInputHelp);
|
|
1342
|
+
if (showInputHelp) renderInputHelp();
|
|
1320
1343
|
$('#matter-selected-device-type-value').text(deviceTypeDisplay);
|
|
1321
1344
|
$('#matter-selected-device-type').toggle(hasHueDevice && deviceTypeDisplay !== '');
|
|
1322
1345
|
try { $tabs.tabs('refresh'); } catch (error) { /* empty */ }
|
|
@@ -1440,6 +1463,7 @@
|
|
|
1440
1463
|
});
|
|
1441
1464
|
|
|
1442
1465
|
$hueDeviceInput.on('change.knxUltimateMatterControllerDevice input.knxUltimateMatterControllerDevice', updateTabsVisibility);
|
|
1466
|
+
$pinSelect.on('change.knxUltimateMatterControllerDevice', updateTabsVisibility);
|
|
1443
1467
|
|
|
1444
1468
|
if (($deviceNameInput.val() || '').trim() !== '') {
|
|
1445
1469
|
applyHueDevicesPlaceholder(true);
|
|
@@ -2134,7 +2158,6 @@
|
|
|
2134
2158
|
<li><a href="#tabs-3"><i class="fa-solid fa-temperature-quarter"></i> <span data-i18n="knxUltimateMatterControllerDevice.tabs.tunable_white"></span></a></li>
|
|
2135
2159
|
<li><a href="#tabs-4"><i class="fa-solid fa-palette"></i> <span data-i18n="knxUltimateMatterControllerDevice.tabs.rgb_hsv"></span></a></li>
|
|
2136
2160
|
<li><a href="#tabs-mapped"><i class="fa-solid fa-list-check"></i> <span data-i18n="knxUltimateMatterControllerDevice.tabs.mappings"></span></a></li>
|
|
2137
|
-
<li><a href="#tabs-input"><i class="fa-solid fa-code"></i> <span data-i18n="knxUltimateMatterControllerDevice.input_help_label"></span></a></li>
|
|
2138
2161
|
<li><a href="#tabs-6"><i class="fa-solid fa-code-merge"></i> <span data-i18n="knxUltimateMatterControllerDevice.tabs.behaviour"></span></a></li>
|
|
2139
2162
|
</ul>
|
|
2140
2163
|
<div id="tabs-mapped">
|
|
@@ -2142,46 +2165,6 @@
|
|
|
2142
2165
|
<div id="matter-mapped-profile-body"></div>
|
|
2143
2166
|
</div>
|
|
2144
2167
|
</div>
|
|
2145
|
-
<div id="tabs-input">
|
|
2146
|
-
<p class="form-tips" data-i18n="knxUltimateMatterControllerDevice.input_help_pin_hint"></p>
|
|
2147
|
-
<p>
|
|
2148
|
-
<strong data-i18n="knxUltimateMatterControllerDevice.input_help_endpoint"></strong>:
|
|
2149
|
-
<code id="matter-input-help-endpoint"></code>.
|
|
2150
|
-
<span data-i18n="knxUltimateMatterControllerDevice.input_help_endpoint_hint"></span>
|
|
2151
|
-
</p>
|
|
2152
|
-
<h4 data-i18n="knxUltimateMatterControllerDevice.input_help_simple_title"></h4>
|
|
2153
|
-
<p data-i18n="knxUltimateMatterControllerDevice.input_help_simple_hint"></p>
|
|
2154
|
-
<table class="matter-input-help-table">
|
|
2155
|
-
<thead>
|
|
2156
|
-
<tr>
|
|
2157
|
-
<th data-i18n="knxUltimateMatterControllerDevice.input_help_operation"></th>
|
|
2158
|
-
<th data-i18n="knxUltimateMatterControllerDevice.input_help_function"></th>
|
|
2159
|
-
<th data-i18n="knxUltimateMatterControllerDevice.input_help_message"></th>
|
|
2160
|
-
<th></th>
|
|
2161
|
-
</tr>
|
|
2162
|
-
</thead>
|
|
2163
|
-
<tbody id="matter-input-help-simple-body"></tbody>
|
|
2164
|
-
</table>
|
|
2165
|
-
<p id="matter-input-help-simple-empty" style="display:none;" data-i18n="knxUltimateMatterControllerDevice.input_help_no_simple"></p>
|
|
2166
|
-
<details>
|
|
2167
|
-
<summary><strong data-i18n="knxUltimateMatterControllerDevice.input_help_advanced_title"></strong></summary>
|
|
2168
|
-
<p data-i18n="knxUltimateMatterControllerDevice.input_help_advanced_hint"></p>
|
|
2169
|
-
<div class="matter-input-help-advanced">
|
|
2170
|
-
<table class="matter-input-help-table">
|
|
2171
|
-
<thead>
|
|
2172
|
-
<tr>
|
|
2173
|
-
<th data-i18n="knxUltimateMatterControllerDevice.input_help_operation"></th>
|
|
2174
|
-
<th data-i18n="knxUltimateMatterControllerDevice.input_help_target"></th>
|
|
2175
|
-
<th data-i18n="knxUltimateMatterControllerDevice.input_help_message"></th>
|
|
2176
|
-
<th></th>
|
|
2177
|
-
</tr>
|
|
2178
|
-
</thead>
|
|
2179
|
-
<tbody id="matter-input-help-advanced-body"></tbody>
|
|
2180
|
-
</table>
|
|
2181
|
-
<p id="matter-input-help-advanced-empty" style="display:none;" data-i18n="knxUltimateMatterControllerDevice.input_help_no_structure"></p>
|
|
2182
|
-
</div>
|
|
2183
|
-
</details>
|
|
2184
|
-
</div>
|
|
2185
2168
|
<div id="tabs-1">
|
|
2186
2169
|
<p>
|
|
2187
2170
|
<div class="form-row">
|
|
@@ -2623,6 +2606,46 @@
|
|
|
2623
2606
|
<option value="yes" data-i18n="knxUltimateMatterControllerDevice.node_pins_show"></option>
|
|
2624
2607
|
</select>
|
|
2625
2608
|
</div>
|
|
2609
|
+
<div id="matter-flow-input-help" style="display:none; width:900px; margin-top:12px;">
|
|
2610
|
+
<h4><i class="fa-solid fa-code"></i> <span data-i18n="knxUltimateMatterControllerDevice.input_help_label"></span></h4>
|
|
2611
|
+
<p>
|
|
2612
|
+
<strong data-i18n="knxUltimateMatterControllerDevice.input_help_endpoint"></strong>:
|
|
2613
|
+
<code id="matter-input-help-endpoint"></code>.
|
|
2614
|
+
<span data-i18n="knxUltimateMatterControllerDevice.input_help_endpoint_hint"></span>
|
|
2615
|
+
</p>
|
|
2616
|
+
<h4 data-i18n="knxUltimateMatterControllerDevice.input_help_simple_title"></h4>
|
|
2617
|
+
<p id="matter-input-help-simple-hint" data-i18n="knxUltimateMatterControllerDevice.input_help_simple_hint"></p>
|
|
2618
|
+
<table class="matter-input-help-table">
|
|
2619
|
+
<thead>
|
|
2620
|
+
<tr>
|
|
2621
|
+
<th data-i18n="knxUltimateMatterControllerDevice.input_help_operation"></th>
|
|
2622
|
+
<th data-i18n="knxUltimateMatterControllerDevice.input_help_function"></th>
|
|
2623
|
+
<th data-i18n="knxUltimateMatterControllerDevice.input_help_message"></th>
|
|
2624
|
+
<th></th>
|
|
2625
|
+
</tr>
|
|
2626
|
+
</thead>
|
|
2627
|
+
<tbody id="matter-input-help-simple-body"></tbody>
|
|
2628
|
+
</table>
|
|
2629
|
+
<p id="matter-input-help-simple-empty" style="display:none;" data-i18n="knxUltimateMatterControllerDevice.input_help_no_simple"></p>
|
|
2630
|
+
<details id="matter-input-help-advanced-details">
|
|
2631
|
+
<summary><strong data-i18n="knxUltimateMatterControllerDevice.input_help_advanced_title"></strong></summary>
|
|
2632
|
+
<p data-i18n="knxUltimateMatterControllerDevice.input_help_advanced_hint"></p>
|
|
2633
|
+
<div class="matter-input-help-advanced">
|
|
2634
|
+
<table class="matter-input-help-table">
|
|
2635
|
+
<thead>
|
|
2636
|
+
<tr>
|
|
2637
|
+
<th data-i18n="knxUltimateMatterControllerDevice.input_help_operation"></th>
|
|
2638
|
+
<th data-i18n="knxUltimateMatterControllerDevice.input_help_target"></th>
|
|
2639
|
+
<th data-i18n="knxUltimateMatterControllerDevice.input_help_message"></th>
|
|
2640
|
+
<th></th>
|
|
2641
|
+
</tr>
|
|
2642
|
+
</thead>
|
|
2643
|
+
<tbody id="matter-input-help-advanced-body"></tbody>
|
|
2644
|
+
</table>
|
|
2645
|
+
<p id="matter-input-help-advanced-empty" style="display:none;" data-i18n="knxUltimateMatterControllerDevice.input_help_no_structure"></p>
|
|
2646
|
+
</div>
|
|
2647
|
+
</details>
|
|
2648
|
+
</div>
|
|
2626
2649
|
</div>
|
|
2627
2650
|
|
|
2628
2651
|
<br/>
|
|
@@ -2647,9 +2670,11 @@ optional flow output; simpler endpoints continue through the generic mapped fall
|
|
|
2647
2670
|
|
|
2648
2671
|
**Flow input**
|
|
2649
2672
|
|
|
2650
|
-
|
|
2651
|
-
|
|
2652
|
-
|
|
2673
|
+
Enable **Node Input/Output PINs** to reveal the **Flow input** section directly below
|
|
2674
|
+
the selector. Lights show copyable examples for supported top-level properties such as
|
|
2675
|
+
`msg.on`, `msg.dimming`, `msg.color_temperature` and `msg.color`. For non-light
|
|
2676
|
+
endpoints the section shows the selected endpoint, all advertised readable/writable
|
|
2677
|
+
attributes and all accepted commands.
|
|
2653
2678
|
|
|
2654
2679
|
Use `msg.payload = {function:"position", value:35}` for a simple write. Omit `value`
|
|
2655
2680
|
to read a supported state, for example `{function:"temperature"}`. Values use human
|
|
@@ -2779,7 +2804,7 @@ _Basic Matter effects_
|
|
|
2779
2804
|
| Read status at startup | Read the Matter endpoint status at Node-RED startup or full deploy and send it to the KNX bus. |
|
|
2780
2805
|
| KNX Brightness Status | Updates the KNX brightness status whenever the Matter light switches ON/OFF. It can send 0% while OFF and restore the previous value when ON, or leave the brightness status unchanged. |
|
|
2781
2806
|
| Update local cached Matter state from KNX bus writes | When enabled, KNX writes immediately update the local Matter-state cache without waiting for the endpoint report. Disable it if the cache should follow only real Matter reports. |
|
|
2782
|
-
| Node Input/Output PINs |
|
|
2807
|
+
| Node Input/Output PINs | Reveals the **Flow input** section below the selector. Lights use the supported top-level state properties shown there (`msg.on`, `msg.dimming`, `msg.color_temperature`, `msg.color`). Mapped endpoints use `msg.payload = {function,value}` or the advanced Matter selectors. Door Lock accepts both `msg.payload = true/false` and `{function:"lock",value:true/false}`. |
|
|
2783
2808
|
| Switch on behaviour | It sets the behaviour of your lights when switched on. You can choose from differents behaviours.<br/> **Select color: ** the light will be switched on with the color of your choice. To change color, just CLICK on the color selector (under the _Select color_ control).<br/>**Select temperature and brightness: ** the light will be switched on with the temperature (Kelvin) and brightness (0-100) of your choice.<br/>**None:** the light will retain its last status. In case you've enable the night lighting, after the night time ends, the lamp will resume the color/temperature/brightness state set at day time. |
|
|
2784
2809
|
| Night Lighting | It allows to set a particular light color/brightness at nighttime. The options are the same as the daytime. You could select either a temperature/brightness or color. A cozy temperature of 2700 Kelvin, with a brightness of 10% or 20%, is a good choice for bathroom's night light.|
|
|
2785
2810
|
| Day/Night | Select the group address used to set the day/night behaviour. The group address value is _true_ if daytime, _false_ if nighttime. |
|
|
@@ -45,7 +45,7 @@ Diese Optionen werden nur angezeigt, wenn sie zum gewählten Typ passen. Dimmbar
|
|
|
45
45
|
|
|
46
46
|
## Node-PINs
|
|
47
47
|
|
|
48
|
-
|
|
48
|
+
Der PIN-Selektor befindet sich außerhalb der Editor-Tabs. Nach dem Aktivieren erscheint direkt darunter ein kontextbezogener Bereich **Flow-Eingang/-Ausgang** mit kopierbaren Beispielen für den ausgewählten Gerätetyp:
|
|
49
49
|
|
|
50
50
|
- **Input**: aktualisiere den Matter-Zustand aus dem Flow, ohne den KNX-Bus: `msg.payload = { function: "onoff", value: true }` (`function` ist eine von `onoff`, `level`, `rgb`, `colortemp`, `position`, `temperature`, `humidity`, `illuminance`, `occupancy`, `contact`, `currenttemp`, `setpoint`, `fanspeed`, `smoke`, `co`, `leak`, `co2`, `rvcstate`, `rvcmode`). Nützlich, um im Flow berechnete Werte (z.B. einen virtuellen Sensor) für Alexa & Co. bereitzustellen.
|
|
51
51
|
- **Output**: Jeder von einem Matter-Controller empfangene Befehl wird an den Flow weitergeleitet: `msg.topic` = Gerätename, `msg.payload` = Wert, `msg.matter` = der rohe Befehl. Ein Gerät ohne Befehls-GAs wird zum **Nur-Flow-Gerät**.
|
|
@@ -36,6 +36,20 @@
|
|
|
36
36
|
"mappings": "KNX-Zuordnungen",
|
|
37
37
|
"advanced": "Erweiterte Optionen"
|
|
38
38
|
},
|
|
39
|
+
"flow_help": {
|
|
40
|
+
"title": "Flow-Eingang/-Ausgang",
|
|
41
|
+
"intro": "Diese Beispiele entsprechen dem ausgewählten Gerätetyp und sind verfügbar, solange die Ein-/Ausgangs-PINs aktiviert sind.",
|
|
42
|
+
"input_title": "Flow → Matter (Node-Eingang)",
|
|
43
|
+
"input_hint": "Sende eine dieser Nachrichten, um den bereitgestellten Matter-Zustand ohne KNX-Schreibvorgang zu aktualisieren.",
|
|
44
|
+
"output_title": "Matter → Flow (Node-Ausgang)",
|
|
45
|
+
"output_hint": "Befehle eines Matter-Controllers werden mit dem Wert in msg.payload und den Rohdetails in msg.matter ausgegeben.",
|
|
46
|
+
"function": "Funktion",
|
|
47
|
+
"message": "Beispielnachricht",
|
|
48
|
+
"copy": "Kopieren",
|
|
49
|
+
"copied": "Nachricht kopiert",
|
|
50
|
+
"no_input": "Für diesen Gerätetyp gibt es keine Beispiele für Flow-Zustandsupdates.",
|
|
51
|
+
"no_output": "Dieser Gerätetyp gibt keine Controller-Befehle aus; sein Ausgang bleibt inaktiv."
|
|
52
|
+
},
|
|
39
53
|
"functions": {
|
|
40
54
|
"fn_onoff_cmd": "Ein/Aus Befehls-GA",
|
|
41
55
|
"fn_onoff_status": "Ein/Aus Status-GA",
|
|
@@ -19,11 +19,11 @@ Er ersetzt die unveröffentlichten getrennten Matter-Controller-Nodes und behäl
|
|
|
19
19
|
| Sensoren | Sensor-Endpunkte zeigen ihre Mess-/Status-GA nur bei Unterstützung: Temperatur, Feuchte, Helligkeit, Präsenz, Kontakt und Batterie. |
|
|
20
20
|
| Read at startup | Veröffentlicht den gecachten Matter-Wert beim Deploy/Start oder wenn sich das Gerät erneut verbindet. |
|
|
21
21
|
| Update local state from KNX write | Aktualisiert den lokalen Matter/KNX-Cache, wenn ein Telegramm auf eine konfigurierte KNX-GA geschrieben wird. |
|
|
22
|
-
| Node Input/Output PINs | Zeigt Node-RED-Eingangs-/Ausgangspins
|
|
22
|
+
| Node Input/Output PINs | Zeigt Node-RED-Eingangs-/Ausgangspins und direkt darunter den Bereich **Flow-Eingang**. Für Leuchten werden die unterstützten Lichtzustands-Nachrichten auf oberster Ebene angezeigt; andere Endpunkte zeigen das einfache `{function,value}`-Format und die erweiterten Matter-Felder. |
|
|
23
23
|
|
|
24
24
|
## Flow-Eingang
|
|
25
25
|
|
|
26
|
-
|
|
26
|
+
Aktiviere **Node Input/Output PINs**, um den Bereich **Flow-Eingang** direkt unter dem Auswahlfeld einzublenden. Für Leuchten zeigt er kopierbare Beispiele der unterstützten Eigenschaften auf oberster Ebene, etwa `msg.on`, `msg.dimming`, `msg.color_temperature` und `msg.color`. Für andere Endpunkte wird er aus der angekündigten Struktur aufgebaut und zeigt Endpoint ID sowie alle lesbaren/schreibbaren Attribute und akzeptierten Befehle. Er bleibt auch ohne KNX-Gateway verfügbar.
|
|
27
27
|
|
|
28
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
29
|
|
|
@@ -17,6 +17,7 @@
|
|
|
17
17
|
"input_help_endpoint_hint": "Der Knoten kennt Node ID und Endpoint ID bereits; einfache Nachrichten benötigen sie nicht.",
|
|
18
18
|
"input_help_simple_title": "Einfache Nachrichten",
|
|
19
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_light_hint": "Licht-Endpunkte akzeptieren Lichtzustands-Eigenschaften direkt in msg (nicht in msg.payload). Es werden nur die von der ausgewählten Leuchte unterstützten Steuerungen angezeigt.",
|
|
20
21
|
"input_help_advanced_title": "Erweiterte Matter-Details",
|
|
21
22
|
"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
23
|
"input_help_operation": "Operation",
|
|
@@ -31,7 +32,7 @@
|
|
|
31
32
|
"input_help_no_simple": "Dieser Endpunkt besitzt keine bekannte einfache Eingangsfunktion.",
|
|
32
33
|
"input_help_no_structure": "Die Matter-Struktur ist nicht verfügbar. Aktualisiere die Geräteliste, während der Endpunkt online ist.",
|
|
33
34
|
"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
|
+
"onoff": "Ein / Aus", "on": "Ein", "off": "Aus", "level": "Stufe", "brightness": "Helligkeit", "color_temperature": "Farbtemperatur", "xy_color": "XY-Farbe", "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
36
|
},
|
|
36
37
|
"tabs": {
|
|
37
38
|
"switch": "Schalten",
|
|
@@ -45,7 +45,7 @@ These options are hidden unless they apply to the selected type. Dimmable device
|
|
|
45
45
|
|
|
46
46
|
## Node PINs
|
|
47
47
|
|
|
48
|
-
|
|
48
|
+
The PIN selector is outside the editor tabs. Enabling it reveals a contextual **Flow input/output** section directly below, with copyable examples filtered to the selected device type:
|
|
49
49
|
|
|
50
50
|
- **Input**: update the Matter state from the flow, without the KNX bus: `msg.payload = { function: "onoff", value: true }` (`function` is one of `onoff`, `level`, `rgb`, `colortemp`, `position`, `temperature`, `humidity`, `illuminance`, `occupancy`, `contact`, `currenttemp`, `setpoint`, `fanspeed`, `smoke`, `co`, `leak`, `co2`, `rvcstate`, `rvcmode`). Useful to expose flow-computed values (e.g. a virtual sensor) to Alexa & Co.
|
|
51
51
|
- **Output**: every command received from a Matter controller is forwarded to the flow: `msg.topic` = device name, `msg.payload` = value, `msg.matter` = the raw command. A device without command GAs becomes a **flow-only device**.
|
|
@@ -36,6 +36,20 @@
|
|
|
36
36
|
"mappings": "KNX mappings",
|
|
37
37
|
"advanced": "Advanced options"
|
|
38
38
|
},
|
|
39
|
+
"flow_help": {
|
|
40
|
+
"title": "Flow input/output",
|
|
41
|
+
"intro": "These examples match the selected device type and are available while the node input/output PINs are enabled.",
|
|
42
|
+
"input_title": "Flow → Matter (node input)",
|
|
43
|
+
"input_hint": "Send one of these messages to update the exposed Matter state without writing to KNX.",
|
|
44
|
+
"output_title": "Matter → Flow (node output)",
|
|
45
|
+
"output_hint": "Commands received from a Matter controller are emitted with the value in msg.payload and raw routing details in msg.matter.",
|
|
46
|
+
"function": "Function",
|
|
47
|
+
"message": "Example message",
|
|
48
|
+
"copy": "Copy",
|
|
49
|
+
"copied": "Message copied",
|
|
50
|
+
"no_input": "This device type has no flow state-update examples.",
|
|
51
|
+
"no_output": "This device type does not emit controller commands; its output remains silent."
|
|
52
|
+
},
|
|
39
53
|
"functions": {
|
|
40
54
|
"fn_onoff_cmd": "On/Off command GA",
|
|
41
55
|
"fn_onoff_status": "On/Off status GA",
|
|
@@ -19,11 +19,11 @@ It replaces the unpublished per-device Matter controller nodes and keeps the ful
|
|
|
19
19
|
| Sensors | Sensor endpoints expose their measurement/status GA only when supported: temperature, humidity, illuminance, occupancy, contact and battery. |
|
|
20
20
|
| Read at startup | Publishes the cached Matter value at deploy/startup or when the device reconnects. |
|
|
21
21
|
| Update local state from KNX write | Updates the local Matter/KNX cache when a telegram is written on a configured KNX GA. |
|
|
22
|
-
| Node Input/Output PINs | Shows Node-RED input/output pins.
|
|
22
|
+
| Node Input/Output PINs | Shows Node-RED input/output pins and reveals the **Flow input** section directly below this field. Lights show their supported top-level light-state messages; non-light endpoints show the simple `{function,value}` contract and advanced Matter fields. The selection is preserved when the editor is reopened. |
|
|
23
23
|
|
|
24
24
|
## Flow input
|
|
25
25
|
|
|
26
|
-
|
|
26
|
+
Enable **Node Input/Output PINs** to reveal the **Flow input** section directly below the selector. For lights it shows copyable examples for the supported top-level properties, such as `msg.on`, `msg.dimming`, `msg.color_temperature` and `msg.color`. For non-light endpoints it is built from the advertised structure and provides 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
27
|
|
|
28
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
29
|
|
|
@@ -17,6 +17,7 @@
|
|
|
17
17
|
"input_help_endpoint_hint": "The node already knows the Node ID and Endpoint ID, so the simple messages do not need them.",
|
|
18
18
|
"input_help_simple_title": "Simple messages",
|
|
19
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_light_hint": "Light endpoints accept light-state properties directly on msg (not inside msg.payload). Only controls supported by the selected light are shown.",
|
|
20
21
|
"input_help_advanced_title": "Advanced Matter details",
|
|
21
22
|
"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
23
|
"input_help_operation": "Operation",
|
|
@@ -31,7 +32,7 @@
|
|
|
31
32
|
"input_help_no_simple": "This endpoint has no known simple input functions.",
|
|
32
33
|
"input_help_no_structure": "The Matter structure is unavailable. Refresh the device list while the endpoint is online.",
|
|
33
34
|
"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
|
+
"onoff": "On / Off", "on": "On", "off": "Off", "level": "Level", "brightness": "Brightness", "color_temperature": "Colour temperature", "xy_color": "XY colour", "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
36
|
},
|
|
36
37
|
"tabs": {
|
|
37
38
|
"switch": "Switch",
|
|
@@ -45,7 +45,7 @@ Estas opciones solo aparecen cuando tienen sentido para el tipo seleccionado. Lo
|
|
|
45
45
|
|
|
46
46
|
## PINes del nodo
|
|
47
47
|
|
|
48
|
-
|
|
48
|
+
El selector de PINes está fuera de las pestañas del editor. Al activarlo aparece justo debajo una sección contextual **Entrada/salida del flow**, con ejemplos copiables filtrados según el tipo de dispositivo:
|
|
49
49
|
|
|
50
50
|
- **Entrada**: actualiza el estado Matter desde el flow, sin pasar por el bus KNX: `msg.payload = { function: "onoff", value: true }` (`function` es una de `onoff`, `level`, `rgb`, `colortemp`, `position`, `temperature`, `humidity`, `illuminance`, `occupancy`, `contact`, `currenttemp`, `setpoint`, `fanspeed`, `smoke`, `co`, `leak`, `co2`, `rvcstate`, `rvcmode`). Útil para exponer a Alexa y cía. valores calculados en el flow (p.ej. un sensor virtual).
|
|
51
51
|
- **Salida**: cada comando recibido de un controlador Matter se reenvía al flow: `msg.topic` = nombre del dispositivo, `msg.payload` = valor, `msg.matter` = el comando en bruto. Un dispositivo sin GA de comando se convierte en un **dispositivo solo-flow**.
|
|
@@ -36,6 +36,20 @@
|
|
|
36
36
|
"mappings": "Asignaciones KNX",
|
|
37
37
|
"advanced": "Opciones avanzadas"
|
|
38
38
|
},
|
|
39
|
+
"flow_help": {
|
|
40
|
+
"title": "Entrada/salida del flow",
|
|
41
|
+
"intro": "Estos ejemplos corresponden al tipo de dispositivo seleccionado y están disponibles mientras los pines de entrada/salida del nodo están activados.",
|
|
42
|
+
"input_title": "Flow → Matter (entrada del nodo)",
|
|
43
|
+
"input_hint": "Envía uno de estos mensajes para actualizar el estado Matter expuesto sin escribir en KNX.",
|
|
44
|
+
"output_title": "Matter → Flow (salida del nodo)",
|
|
45
|
+
"output_hint": "Los comandos recibidos de un controlador Matter se emiten con el valor en msg.payload y los detalles raw en msg.matter.",
|
|
46
|
+
"function": "Función",
|
|
47
|
+
"message": "Mensaje de ejemplo",
|
|
48
|
+
"copy": "Copiar",
|
|
49
|
+
"copied": "Mensaje copiado",
|
|
50
|
+
"no_input": "Este tipo de dispositivo no tiene ejemplos de actualización de estado desde el flow.",
|
|
51
|
+
"no_output": "Este tipo de dispositivo no emite comandos del controlador; su salida permanece inactiva."
|
|
52
|
+
},
|
|
39
53
|
"functions": {
|
|
40
54
|
"fn_onoff_cmd": "GA comando On/Off",
|
|
41
55
|
"fn_onoff_status": "GA estado On/Off",
|
|
@@ -19,11 +19,11 @@ Sustituye a los nodos Matter separados no publicados y conserva toda la UI de lu
|
|
|
19
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. |
|
|
20
20
|
| Read at startup | Publica el valor Matter en caché al desplegar/iniciar o cuando el dispositivo se reconecta. |
|
|
21
21
|
| Update local state from KNX write | Actualiza la caché local Matter/KNX cuando se escribe un telegrama en una GA KNX configurada. |
|
|
22
|
-
| Node Input/Output PINs | Muestra pines de entrada/salida Node-RED
|
|
22
|
+
| Node Input/Output PINs | Muestra pines de entrada/salida Node-RED y la sección **Entrada del flow** justo debajo de este campo. Las luces muestran sus mensajes de estado compatibles en el nivel superior; los demás endpoints muestran el formato simple `{function,value}` y los campos Matter avanzados. |
|
|
23
23
|
|
|
24
24
|
## Entrada del flow
|
|
25
25
|
|
|
26
|
-
|
|
26
|
+
Activa **Node Input/Output PINs** para mostrar la sección **Entrada del flow** justo debajo del selector. Para una luz, muestra ejemplos copiables de las propiedades compatibles en el nivel superior, como `msg.on`, `msg.dimming`, `msg.color_temperature` y `msg.color`. Para los demás endpoints, se construye con la estructura anunciada y muestra el Endpoint ID, todos los atributos legibles/escribibles y los comandos aceptados. Sigue disponible sin gateway KNX.
|
|
27
27
|
|
|
28
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
29
|
|
|
@@ -17,6 +17,7 @@
|
|
|
17
17
|
"input_help_endpoint_hint": "El nodo ya conoce el Node ID y el Endpoint ID; los mensajes simples no los necesitan.",
|
|
18
18
|
"input_help_simple_title": "Mensajes simples",
|
|
19
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_light_hint": "Los endpoints de luz aceptan propiedades de estado directamente en msg (no dentro de msg.payload). Solo se muestran los controles compatibles con la luz seleccionada.",
|
|
20
21
|
"input_help_advanced_title": "Detalles Matter avanzados",
|
|
21
22
|
"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
23
|
"input_help_operation": "Operación",
|
|
@@ -31,7 +32,7 @@
|
|
|
31
32
|
"input_help_no_simple": "Este endpoint no tiene funciones de entrada simples conocidas.",
|
|
32
33
|
"input_help_no_structure": "La estructura Matter no está disponible. Actualiza la lista de dispositivos mientras el endpoint esté en línea.",
|
|
33
34
|
"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
|
+
"onoff": "Encender / Apagar", "on": "Encender", "off": "Apagar", "level": "Nivel", "brightness": "Brillo", "color_temperature": "Temperatura de color", "xy_color": "Color XY", "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
36
|
},
|
|
36
37
|
"tabs": {
|
|
37
38
|
"switch": "Cambiar",
|
|
@@ -45,7 +45,7 @@ Ces options ne s'affichent que lorsqu'elles s'appliquent au type sélectionné.
|
|
|
45
45
|
|
|
46
46
|
## PIN du nœud
|
|
47
47
|
|
|
48
|
-
|
|
48
|
+
Le sélecteur de PIN se trouve hors des onglets de l'éditeur. Son activation affiche juste dessous une section contextuelle **Entrée/sortie du flow**, avec des exemples copiables filtrés selon le type d'appareil :
|
|
49
49
|
|
|
50
50
|
- **Entrée** : mettez à jour l'état Matter depuis le flux, sans passer par le bus KNX : `msg.payload = { function: "onoff", value: true }` (`function` est l'une de `onoff`, `level`, `rgb`, `colortemp`, `position`, `temperature`, `humidity`, `illuminance`, `occupancy`, `contact`, `currenttemp`, `setpoint`, `fanspeed`, `smoke`, `co`, `leak`, `co2`, `rvcstate`, `rvcmode`). Utile pour exposer à Alexa & Co. des valeurs calculées dans le flux (ex. un capteur virtuel).
|
|
51
51
|
- **Sortie** : chaque commande reçue d'un contrôleur Matter est transmise au flux : `msg.topic` = nom de l'appareil, `msg.payload` = valeur, `msg.matter` = la commande brute. Un appareil sans GA de commande devient un **appareil flow uniquement**.
|
|
@@ -36,6 +36,20 @@
|
|
|
36
36
|
"mappings": "Mappages KNX",
|
|
37
37
|
"advanced": "Options avancées"
|
|
38
38
|
},
|
|
39
|
+
"flow_help": {
|
|
40
|
+
"title": "Entrée/sortie du flow",
|
|
41
|
+
"intro": "Ces exemples correspondent au type d'appareil sélectionné et sont disponibles lorsque les broches d'entrée/sortie du nœud sont activées.",
|
|
42
|
+
"input_title": "Flow → Matter (entrée du nœud)",
|
|
43
|
+
"input_hint": "Envoyez l'un de ces messages pour mettre à jour l'état Matter exposé sans écrire sur KNX.",
|
|
44
|
+
"output_title": "Matter → Flow (sortie du nœud)",
|
|
45
|
+
"output_hint": "Les commandes reçues d'un contrôleur Matter sont émises avec la valeur dans msg.payload et les détails bruts dans msg.matter.",
|
|
46
|
+
"function": "Fonction",
|
|
47
|
+
"message": "Message d'exemple",
|
|
48
|
+
"copy": "Copier",
|
|
49
|
+
"copied": "Message copié",
|
|
50
|
+
"no_input": "Ce type d'appareil ne possède aucun exemple de mise à jour d'état depuis le flow.",
|
|
51
|
+
"no_output": "Ce type d'appareil n'émet aucune commande de contrôleur ; sa sortie reste inactive."
|
|
52
|
+
},
|
|
39
53
|
"functions": {
|
|
40
54
|
"fn_onoff_cmd": "GA commande On/Off",
|
|
41
55
|
"fn_onoff_status": "GA état On/Off",
|
|
@@ -19,11 +19,11 @@ Il remplace les nœuds Matter séparés non publiés et conserve toute l'UI lumi
|
|
|
19
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. |
|
|
20
20
|
| Read at startup | Publie la valeur Matter en cache au déploiement/démarrage ou quand le périphérique se reconnecte. |
|
|
21
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. |
|
|
22
|
-
| Node Input/Output PINs | Affiche les pins entrée/sortie Node-RED. Les
|
|
22
|
+
| Node Input/Output PINs | Affiche les pins entrée/sortie Node-RED et la section **Entrée du flow** juste sous ce champ. Les lumières affichent leurs messages d'état pris en charge au premier niveau ; les autres endpoints affichent le format simple `{function,value}` et les champs Matter avancés. |
|
|
23
23
|
|
|
24
24
|
## Entrée du flow
|
|
25
25
|
|
|
26
|
-
|
|
26
|
+
Activez **Node Input/Output PINs** pour afficher la section **Entrée du flow** juste sous le sélecteur. Pour une lumière, elle propose des exemples copiables des propriétés prises en charge au premier niveau, comme `msg.on`, `msg.dimming`, `msg.color_temperature` et `msg.color`. Pour les autres endpoints, elle est construite depuis la structure annoncée et affiche l'Endpoint ID, tous les attributs lisibles/inscriptibles et toutes les commandes acceptées. Elle reste disponible sans passerelle KNX.
|
|
27
27
|
|
|
28
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
29
|
|
|
@@ -17,6 +17,7 @@
|
|
|
17
17
|
"input_help_endpoint_hint": "Le nœud connaît déjà le Node ID et l'Endpoint ID ; les messages simples n'en ont pas besoin.",
|
|
18
18
|
"input_help_simple_title": "Messages simples",
|
|
19
19
|
"input_help_simple_hint": "Ces fonctions utilisent des unités lisibles et sont traduites vers le cluster, la commande ou l'attribut Matter de l'endpoint sélectionné.",
|
|
20
|
+
"input_help_light_hint": "Les endpoints de type lumière acceptent les propriétés d'état directement dans msg (pas dans msg.payload). Seules les commandes prises en charge par la lumière sélectionnée sont affichées.",
|
|
20
21
|
"input_help_advanced_title": "Détails Matter avancés",
|
|
21
22
|
"input_help_advanced_hint": "Seuls les attributs et commandes annoncés sont affichés. Les exemples d'écriture utilisent 0 comme valeur provisoire ; les arguments des commandes peuvent devoir être adaptés au type Matter.",
|
|
22
23
|
"input_help_operation": "Opération",
|
|
@@ -31,7 +32,7 @@
|
|
|
31
32
|
"input_help_no_simple": "Cet endpoint ne possède aucune fonction d'entrée simple connue.",
|
|
32
33
|
"input_help_no_structure": "La structure Matter est indisponible. Actualisez la liste des appareils lorsque l'endpoint est en ligne.",
|
|
33
34
|
"input_functions": {
|
|
34
|
-
"onoff": "Marche / Arrêt", "level": "Niveau", "position": "Position du volet", "tiltposition": "Inclinaison du volet", "open": "Ouvrir", "close": "Fermer", "stop": "Arrêter", "setpoint": "Consigne chauffage", "coolingsetpoint": "Consigne refroidissement", "currenttemp": "Température actuelle", "fanspeed": "Vitesse du ventilateur", "temperature": "Température", "humidity": "Humidité", "illuminance": "Éclairement", "occupancy": "Occupation", "contact": "Contact", "battery": "Batterie", "activepower": "Puissance active", "importedenergy": "Énergie importée", "identify": "Identifier", "lock": "Verrouiller", "unlock": "Déverrouiller"
|
|
35
|
+
"onoff": "Marche / Arrêt", "on": "Allumer", "off": "Éteindre", "level": "Niveau", "brightness": "Luminosité", "color_temperature": "Température de couleur", "xy_color": "Couleur XY", "position": "Position du volet", "tiltposition": "Inclinaison du volet", "open": "Ouvrir", "close": "Fermer", "stop": "Arrêter", "setpoint": "Consigne chauffage", "coolingsetpoint": "Consigne refroidissement", "currenttemp": "Température actuelle", "fanspeed": "Vitesse du ventilateur", "temperature": "Température", "humidity": "Humidité", "illuminance": "Éclairement", "occupancy": "Occupation", "contact": "Contact", "battery": "Batterie", "activepower": "Puissance active", "importedenergy": "Énergie importée", "identify": "Identifier", "lock": "Verrouiller", "unlock": "Déverrouiller"
|
|
35
36
|
},
|
|
36
37
|
"tabs": {
|
|
37
38
|
"switch": "Changer",
|
|
@@ -45,7 +45,7 @@ Queste opzioni sono nascoste finché non servono al tipo selezionato. I disposit
|
|
|
45
45
|
|
|
46
46
|
## PIN del nodo
|
|
47
47
|
|
|
48
|
-
|
|
48
|
+
Il selettore dei PIN si trova fuori dalle TAB dell'editor. Abilitandolo compare subito sotto una sezione contestuale **Input/output del flow**, con esempi copiabili filtrati per il tipo di dispositivo selezionato:
|
|
49
49
|
|
|
50
50
|
- **Input**: aggiorna lo stato Matter dal flow, senza passare dal bus KNX: `msg.payload = { function: "onoff", value: true }` (`function` è una tra `onoff`, `level`, `rgb`, `colortemp`, `position`, `temperature`, `humidity`, `illuminance`, `occupancy`, `contact`, `currenttemp`, `setpoint`, `fanspeed`, `smoke`, `co`, `leak`, `co2`, `rvcstate`, `rvcmode`). Utile per esporre ad Alexa & Co. valori calcolati nel flow (es. un sensore virtuale).
|
|
51
51
|
- **Output**: ogni comando ricevuto da un controller Matter viene inoltrato al flow: `msg.topic` = nome del dispositivo, `msg.payload` = valore, `msg.matter` = il comando grezzo. Un dispositivo senza GA di comando diventa un **dispositivo solo-flow**.
|
|
@@ -36,6 +36,20 @@
|
|
|
36
36
|
"mappings": "Mappature KNX",
|
|
37
37
|
"advanced": "Opzioni avanzate"
|
|
38
38
|
},
|
|
39
|
+
"flow_help": {
|
|
40
|
+
"title": "Input/output del flow",
|
|
41
|
+
"intro": "Questi esempi corrispondono al tipo di dispositivo selezionato e sono disponibili quando i PIN input/output del nodo sono abilitati.",
|
|
42
|
+
"input_title": "Flow → Matter (input del nodo)",
|
|
43
|
+
"input_hint": "Invia uno di questi messaggi per aggiornare lo stato Matter esposto senza scrivere sul bus KNX.",
|
|
44
|
+
"output_title": "Matter → Flow (output del nodo)",
|
|
45
|
+
"output_hint": "I comandi ricevuti da un controller Matter vengono emessi con il valore in msg.payload e i dettagli raw in msg.matter.",
|
|
46
|
+
"function": "Funzione",
|
|
47
|
+
"message": "Messaggio di esempio",
|
|
48
|
+
"copy": "Copia",
|
|
49
|
+
"copied": "Messaggio copiato",
|
|
50
|
+
"no_input": "Questo tipo di dispositivo non ha esempi di aggiornamento stato dal flow.",
|
|
51
|
+
"no_output": "Questo tipo di dispositivo non emette comandi dal controller; il suo output rimane inattivo."
|
|
52
|
+
},
|
|
39
53
|
"functions": {
|
|
40
54
|
"fn_onoff_cmd": "GA comando On/Off",
|
|
41
55
|
"fn_onoff_status": "GA stato On/Off",
|
|
@@ -19,11 +19,11 @@ Sostituisce i nodi Matter separati non pubblicati e mantiene tutta la UI luce qu
|
|
|
19
19
|
| Sensori | Gli endpoint sensore mostrano il relativo GA di misura/stato solo quando supportato: temperatura, umidità, illuminamento, presenza, contatto e batteria. |
|
|
20
20
|
| Read at startup | Pubblica il valore Matter in cache al deploy/avvio o quando il dispositivo si riconnette. |
|
|
21
21
|
| Update local state from KNX write | Aggiorna la cache locale Matter/KNX quando arriva una scrittura su un GA KNX configurato. |
|
|
22
|
-
| Node Input/Output PINs | Mostra i pin input/output Node-RED.
|
|
22
|
+
| Node Input/Output PINs | Mostra i pin input/output Node-RED e la sezione **Input dal flow** subito sotto questo campo. Per le luci sono mostrati i messaggi di stato luce supportati al primo livello; per gli endpoint non luce sono mostrati il formato semplice `{function,value}` e i campi Matter avanzati. La selezione viene mantenuta alla riapertura dell'editor. |
|
|
23
23
|
|
|
24
24
|
## Input dal flow
|
|
25
25
|
|
|
26
|
-
|
|
26
|
+
Abilita **PIN di Input/Output del nodo** per mostrare la sezione **Input dal flow** subito sotto il selettore. Per le luci contiene esempi copiabili delle proprietà supportate al primo livello, come `msg.on`, `msg.dimming`, `msg.color_temperature` e `msg.color`. Per gli endpoint non luce viene costruita dalla struttura annunciata e mostra l'Endpoint ID selezionato, tutti gli attributi leggibili/scrivibili e tutti i comandi accettati. Rimane disponibile anche quando il nodo viene usato soltanto dal flow senza gateway KNX.
|
|
27
27
|
|
|
28
28
|
Le scritture semplici usano `msg.payload = {function:"position",value:35}`. Ometti `value` per leggere uno stato supportato, ad esempio `{function:"temperature"}`; l'output usa unità comprensibili e include i dettagli raw in `msg.matter`. Le funzioni comprendono `onoff`, `level`, `position`, `tiltposition`, `open`, `close`, `stop`, `setpoint`, `coolingsetpoint`, `currenttemp`, `fanspeed`, letture sensore e `identify`, ma soltanto se annunciate dall'endpoint. La serratura accetta `{function:"lock",value:true|false}`.
|
|
29
29
|
|
|
@@ -17,6 +17,7 @@
|
|
|
17
17
|
"input_help_endpoint_hint": "Il nodo conosce già Node ID ed Endpoint ID, quindi non servono nei messaggi semplici.",
|
|
18
18
|
"input_help_simple_title": "Messaggi semplici",
|
|
19
19
|
"input_help_simple_hint": "Queste funzioni usano unità comprensibili e vengono tradotte nel cluster, comando o attributo Matter esposto dall'endpoint selezionato.",
|
|
20
|
+
"input_help_light_hint": "Gli endpoint luce accettano le proprietà dello stato luce direttamente in msg (non dentro msg.payload). Sono mostrati solo i controlli supportati dalla luce selezionata.",
|
|
20
21
|
"input_help_advanced_title": "Dettagli Matter avanzati",
|
|
21
22
|
"input_help_advanced_hint": "Sono elencati soltanto attributi e comandi annunciati. Gli esempi di scrittura usano 0 come segnaposto; gli argomenti dei comandi possono richiedere un adattamento al tipo Matter.",
|
|
22
23
|
"input_help_operation": "Operazione",
|
|
@@ -31,7 +32,7 @@
|
|
|
31
32
|
"input_help_no_simple": "Questo endpoint non espone funzioni semplici conosciute.",
|
|
32
33
|
"input_help_no_structure": "La struttura Matter non è disponibile. Aggiorna la lista dei dispositivi mentre l'endpoint è online.",
|
|
33
34
|
"input_functions": {
|
|
34
|
-
"onoff": "On / Off", "level": "Livello", "position": "Posizione tapparella", "tiltposition": "Inclinazione tapparella", "open": "Apri", "close": "Chiudi", "stop": "Stop", "setpoint": "Setpoint riscaldamento", "coolingsetpoint": "Setpoint raffrescamento", "currenttemp": "Temperatura corrente", "fanspeed": "Velocità ventilatore", "temperature": "Temperatura", "humidity": "Umidità", "illuminance": "Illuminamento", "occupancy": "Presenza", "contact": "Contatto", "battery": "Batteria", "activepower": "Potenza attiva", "importedenergy": "Energia importata", "identify": "Identifica", "lock": "Blocca", "unlock": "Sblocca"
|
|
35
|
+
"onoff": "On / Off", "on": "Accendi", "off": "Spegni", "level": "Livello", "brightness": "Luminosità", "color_temperature": "Temperatura colore", "xy_color": "Colore XY", "position": "Posizione tapparella", "tiltposition": "Inclinazione tapparella", "open": "Apri", "close": "Chiudi", "stop": "Stop", "setpoint": "Setpoint riscaldamento", "coolingsetpoint": "Setpoint raffrescamento", "currenttemp": "Temperatura corrente", "fanspeed": "Velocità ventilatore", "temperature": "Temperatura", "humidity": "Umidità", "illuminance": "Illuminamento", "occupancy": "Presenza", "contact": "Contatto", "battery": "Batteria", "activepower": "Potenza attiva", "importedenergy": "Energia importata", "identify": "Identifica", "lock": "Blocca", "unlock": "Sblocca"
|
|
35
36
|
},
|
|
36
37
|
"tabs": {
|
|
37
38
|
"switch": "On/Off",
|
|
@@ -45,7 +45,7 @@
|
|
|
45
45
|
|
|
46
46
|
## 节点引脚
|
|
47
47
|
|
|
48
|
-
|
|
48
|
+
引脚选择器位于编辑器选项卡之外。启用后,其下方会显示与所选设备类型匹配的 **Flow 输入/输出** 区域,并提供可复制示例:
|
|
49
49
|
|
|
50
50
|
- **输入**:从 Flow 更新 Matter 状态,无需经过 KNX 总线:`msg.payload = { function: "onoff", value: true }`(`function` 为 `onoff`、`level`、`rgb`、`colortemp`、`position`、`temperature`、`humidity`、`illuminance`、`occupancy`、`contact`、`currenttemp`、`setpoint`、`fanspeed`、`smoke`、`co`、`leak`、`co2`、`rvcstate`、`rvcmode` 之一)。适合把 Flow 中计算的值(如虚拟传感器)公开给 Alexa 等。
|
|
51
51
|
- **输出**:从 Matter 控制器收到的每个命令都转发到 Flow:`msg.topic` = 设备名称,`msg.payload` = 值,`msg.matter` = 原始命令。没有命令 GA 的设备成为**纯 Flow 设备**。
|
|
@@ -36,6 +36,20 @@
|
|
|
36
36
|
"mappings": "KNX 映射",
|
|
37
37
|
"advanced": "高级选项"
|
|
38
38
|
},
|
|
39
|
+
"flow_help": {
|
|
40
|
+
"title": "Flow 输入/输出",
|
|
41
|
+
"intro": "这些示例与所选设备类型匹配,并在启用节点输入/输出引脚时显示。",
|
|
42
|
+
"input_title": "Flow → Matter(节点输入)",
|
|
43
|
+
"input_hint": "发送以下消息之一,无需写入 KNX 即可更新所公开的 Matter 状态。",
|
|
44
|
+
"output_title": "Matter → Flow(节点输出)",
|
|
45
|
+
"output_hint": "Matter 控制器收到的命令会输出,值位于 msg.payload,原始路由详情位于 msg.matter。",
|
|
46
|
+
"function": "功能",
|
|
47
|
+
"message": "示例消息",
|
|
48
|
+
"copy": "复制",
|
|
49
|
+
"copied": "消息已复制",
|
|
50
|
+
"no_input": "此设备类型没有 Flow 状态更新示例。",
|
|
51
|
+
"no_output": "此设备类型不会输出控制器命令;其输出保持静默。"
|
|
52
|
+
},
|
|
39
53
|
"functions": {
|
|
40
54
|
"fn_onoff_cmd": "开/关 命令 GA",
|
|
41
55
|
"fn_onoff_status": "开/关 状态 GA",
|
|
@@ -19,11 +19,11 @@
|
|
|
19
19
|
| 传感器 | 传感器 endpoint 只在支持时显示对应测量/状态 GA:温度、湿度、照度、占用、接触和电池。 |
|
|
20
20
|
| Read at startup | 在部署/启动或设备重新连接时发布缓存的 Matter 值。 |
|
|
21
21
|
| Update local state from KNX write | 当配置的 KNX GA 收到写入 telegram 时,更新本地 Matter/KNX 缓存。 |
|
|
22
|
-
| Node Input/Output PINs | 显示 Node-RED
|
|
22
|
+
| Node Input/Output PINs | 显示 Node-RED 输入/输出端口,并在该字段下方显示 **流程输入** 区域。灯光会显示其支持的顶层灯光状态消息;其他端点会显示简单的 `{function,value}` 格式和高级 Matter 字段。 |
|
|
23
23
|
|
|
24
24
|
## 流程输入
|
|
25
25
|
|
|
26
|
-
|
|
26
|
+
启用 **Node Input/Output PINs** 后,**流程输入** 区域会直接显示在选择器下方。对于灯光,它提供所支持顶层属性的可复制示例,例如 `msg.on`、`msg.dimming`、`msg.color_temperature` 和 `msg.color`。对于其他端点,该区域根据公布的结构生成,并显示 Endpoint ID、所有可读/可写属性以及接受的命令。未选择 KNX 网关时仍然可用。
|
|
27
27
|
|
|
28
28
|
简单写入使用 `msg.payload = {function:"position",value:35}`。省略 `value` 即可读取支持的状态,例如 `{function:"temperature"}`;输出使用易懂单位,并在 `msg.matter` 中保留原始详情。`onoff`、`level`、`position`、`open`、`close`、`stop`、设定点、风扇和传感器功能仅在端点公布支持时出现。门锁接受 `{function:"lock",value:true|false}`。
|
|
29
29
|
|
|
@@ -17,6 +17,7 @@
|
|
|
17
17
|
"input_help_endpoint_hint": "节点已知 Node ID 和 Endpoint ID,因此简单消息无需提供它们。",
|
|
18
18
|
"input_help_simple_title": "简单消息",
|
|
19
19
|
"input_help_simple_hint": "这些功能使用易懂的单位,并自动转换为所选端点公开的 Matter 集群、命令或属性。",
|
|
20
|
+
"input_help_light_hint": "灯光端点直接在 msg 上接收灯光状态属性(而不是放在 msg.payload 中)。这里只显示所选灯具支持的控制项。",
|
|
20
21
|
"input_help_advanced_title": "高级 Matter 详情",
|
|
21
22
|
"input_help_advanced_hint": "仅列出设备公布的属性和命令。写入示例中的 0 是占位值;命令参数可能需要按 Matter 数据类型调整。",
|
|
22
23
|
"input_help_operation": "操作",
|
|
@@ -31,7 +32,7 @@
|
|
|
31
32
|
"input_help_no_simple": "此端点没有已知的简单输入功能。",
|
|
32
33
|
"input_help_no_structure": "Matter 结构不可用。请在端点在线时刷新设备列表。",
|
|
33
34
|
"input_functions": {
|
|
34
|
-
"onoff": "开 / 关", "level": "亮度", "position": "窗帘位置", "tiltposition": "百叶角度", "open": "打开", "close": "关闭", "stop": "停止", "setpoint": "制热设定点", "coolingsetpoint": "制冷设定点", "currenttemp": "当前温度", "fanspeed": "风扇速度", "temperature": "温度", "humidity": "湿度", "illuminance": "照度", "occupancy": "占用", "contact": "触点", "battery": "电池", "activepower": "有功功率", "importedenergy": "输入电能", "identify": "识别", "lock": "上锁", "unlock": "解锁"
|
|
35
|
+
"onoff": "开 / 关", "on": "打开", "off": "关闭", "level": "亮度", "brightness": "亮度", "color_temperature": "色温", "xy_color": "XY 颜色", "position": "窗帘位置", "tiltposition": "百叶角度", "open": "打开", "close": "关闭", "stop": "停止", "setpoint": "制热设定点", "coolingsetpoint": "制冷设定点", "currenttemp": "当前温度", "fanspeed": "风扇速度", "temperature": "温度", "humidity": "湿度", "illuminance": "照度", "occupancy": "占用", "contact": "触点", "battery": "电池", "activepower": "有功功率", "importedenergy": "输入电能", "identify": "识别", "lock": "上锁", "unlock": "解锁"
|
|
35
36
|
},
|
|
36
37
|
"tabs": {
|
|
37
38
|
"switch": "开关",
|
package/package.json
CHANGED
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
"engines": {
|
|
4
4
|
"node": ">=20.18.1"
|
|
5
5
|
},
|
|
6
|
-
"version": "6.1.
|
|
6
|
+
"version": "6.1.1",
|
|
7
7
|
"description": "KNX Ultimate is the most advanced KNX integration for Node-RED, providing secure KNX/IP communication, routing, ETS project import, Philips Hue, Matter Controller and Matter Bridge (control matter device via KNX and expose KNX GA via Matter), MQTT, diagnostics with AI, virtual devices, and powerful automation nodes. Build professional, reliable, and scalable smart home and building automation projects with minimal effort.",
|
|
8
8
|
"files": [
|
|
9
9
|
"nodes/",
|