node-red-contrib-knx-ultimate 6.3.24 → 6.3.25
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 +5 -0
- package/examples/IoT Bridge - Modbus Flex Adapter.json +361 -0
- package/nodes/knxUltimate-config.js +13 -4
- package/nodes/knxUltimateIoTBridge.html +349 -20
- package/nodes/knxUltimateIoTBridge.js +474 -44
- package/nodes/locales/de/knxUltimateIoTBridge.html +28 -2
- package/nodes/locales/de/knxUltimateIoTBridge.json +20 -2
- package/nodes/locales/en/knxUltimateIoTBridge.html +28 -2
- package/nodes/locales/en/knxUltimateIoTBridge.json +20 -2
- package/nodes/locales/es/knxUltimateIoTBridge.html +28 -2
- package/nodes/locales/es/knxUltimateIoTBridge.json +20 -2
- package/nodes/locales/fr/knxUltimateIoTBridge.html +28 -2
- package/nodes/locales/fr/knxUltimateIoTBridge.json +20 -2
- package/nodes/locales/it/knxUltimateIoTBridge.html +28 -2
- package/nodes/locales/it/knxUltimateIoTBridge.json +20 -2
- package/nodes/locales/zh-CN/knxUltimateIoTBridge.html +28 -2
- package/nodes/locales/zh-CN/knxUltimateIoTBridge.json +20 -2
- package/package.json +3 -3
|
@@ -79,6 +79,10 @@
|
|
|
79
79
|
"target": "Ziel",
|
|
80
80
|
"method": "HTTP-Methode",
|
|
81
81
|
"modbusFunction": "Modbus-Funktion",
|
|
82
|
+
"modbusMessageFormat": "Modbus-Nachrichtenformat",
|
|
83
|
+
"modbusUnitId": "Unit-ID",
|
|
84
|
+
"modbusArea": "Modbus-Bereich",
|
|
85
|
+
"modbusDataType": "Datentyp",
|
|
82
86
|
"scale": "Skalierung",
|
|
83
87
|
"offset": "Offset",
|
|
84
88
|
"timeout": "Zeitüberschreitung (ms)",
|
|
@@ -103,7 +107,7 @@
|
|
|
103
107
|
"target": "Topic, URL oder Register",
|
|
104
108
|
"target_mqtt": "Topic, z. B. knx/light/living",
|
|
105
109
|
"target_rest": "https://example/api/endpoint",
|
|
106
|
-
"target_modbus": "
|
|
110
|
+
"target_modbus": "Nullbasierte Adresse (z. B. 0)",
|
|
107
111
|
"template": "{\"value\":{{value}}}",
|
|
108
112
|
"property": "Optionale Eigenschaft/Pfad",
|
|
109
113
|
"method": "POST",
|
|
@@ -114,7 +118,7 @@
|
|
|
114
118
|
"default": "Ziel",
|
|
115
119
|
"mqtt": "MQTT-Topic",
|
|
116
120
|
"rest": "REST-URL",
|
|
117
|
-
"modbus": "Modbus-
|
|
121
|
+
"modbus": "Modbus-Adresse (nullbasiert)"
|
|
118
122
|
},
|
|
119
123
|
"method": {
|
|
120
124
|
"default": "HTTP-Methode",
|
|
@@ -125,6 +129,20 @@
|
|
|
125
129
|
"modbus": "Modbus-Funktion"
|
|
126
130
|
}
|
|
127
131
|
},
|
|
132
|
+
"modbus": {
|
|
133
|
+
"formatLegacy": "Legacy-Skalar-Nachricht",
|
|
134
|
+
"formatFlex": "Mit Flex Write kompatibel",
|
|
135
|
+
"areaCoil": "Coil (FC1 lesen / FC5 schreiben)",
|
|
136
|
+
"areaDiscreteInput": "Discrete Input (FC2 lesen, schreibgeschützt)",
|
|
137
|
+
"areaHoldingRegister": "Holding Register (FC3 lesen / FC6 schreiben)",
|
|
138
|
+
"areaInputRegister": "Input Register (FC4 lesen, schreibgeschützt)",
|
|
139
|
+
"dataTypeBool": "Boolesch",
|
|
140
|
+
"dataTypeUint16": "16 Bit ohne Vorzeichen",
|
|
141
|
+
"dataTypeInt16": "16 Bit mit Vorzeichen",
|
|
142
|
+
"zeroBasedHint": "Verwende die nullbasierte Protokolladresse (0–65535), nicht die in manchen Handbüchern angegebene 4xxxx-Referenz.",
|
|
143
|
+
"flexHint": "Flex gibt msg.payload = {value,fc,unitid,address,quantity} zur direkten Verbindung mit modbus-flex-write aus.",
|
|
144
|
+
"readOnlyHint": "Discrete Inputs und Input Register sind schreibgeschützt und können nur Modbus → KNX verwenden."
|
|
145
|
+
},
|
|
128
146
|
"labels": {
|
|
129
147
|
"outputKnxToIoT": "Strom KNX → IoT",
|
|
130
148
|
"outputIoTToKnx": "Bestätigungen IoT → KNX",
|
|
@@ -45,7 +45,8 @@ The rest of this help describes the classic **IoT bridge** mode.
|
|
|
45
45
|
## Mapping Fields
|
|
46
46
|
|
|
47
47
|
- **Direction** — choose KNX→IoT, IoT→KNX or bidirectional.
|
|
48
|
-
- **Channel type** — MQTT uses the target as topic; REST uses it as the base URL; Modbus
|
|
48
|
+
- **Channel type** — MQTT uses the target as topic; REST uses it as the base URL; for Modbus, **Target** is the zero-based protocol address (0–65535).
|
|
49
|
+
- **Modbus format / Unit ID / Area / Data type** — choose **Flex Write compatible** for new mappings, then select the unit, memory area and `bool`, `uint16` or `int16`. A missing format remains the legacy scalar contract so existing flows keep working.
|
|
49
50
|
- **Scale & Offset** — applied to KNX→IoT; IoT→KNX applies the inverse transform.
|
|
50
51
|
- **Template** — optional string replacing `{{value}}`, `{{ga}}`, `{{label}}`, `{{target}}`, `{{type}}`, `{{isoTimestamp}}`.
|
|
51
52
|
- **Timeout / Retries** — informational fields exposed in the emitted message for downstream nodes to act on.
|
|
@@ -88,7 +89,32 @@ The rest of this help describes the classic **IoT bridge** mode.
|
|
|
88
89
|
|
|
89
90
|
### Modbus register sync
|
|
90
91
|
|
|
91
|
-
|
|
92
|
+
The bridge is a message adapter for `node-red-contrib-modbus`; it does not open a TCP/serial connection and does not poll a device. Install a version of that package compatible with your Node-RED runtime, then use its client and transport nodes.
|
|
93
|
+
|
|
94
|
+
|Area|Read|Write|Allowed direction|
|
|
95
|
+
|--|--|--|--|
|
|
96
|
+
| Coil | FC1 | FC5 | Either direction |
|
|
97
|
+
| Discrete input | FC2 | — | Modbus → KNX only |
|
|
98
|
+
| Holding register | FC3 | FC6 | Either direction |
|
|
99
|
+
| Input register | FC4 | — | Modbus → KNX only |
|
|
100
|
+
|
|
101
|
+
For a new mapping select `Format = Flex Write compatible`. On KNX → Modbus, Output 1 can be wired directly to a `modbus-flex-write` node and emits:
|
|
102
|
+
|
|
103
|
+
```
|
|
104
|
+
msg.payload = {
|
|
105
|
+
value: 215,
|
|
106
|
+
fc: 6,
|
|
107
|
+
unitid: 1,
|
|
108
|
+
address: 9,
|
|
109
|
+
quantity: 1
|
|
110
|
+
}
|
|
111
|
+
```
|
|
112
|
+
|
|
113
|
+
`address` is always zero-based: if a device manual labels a holding register as `40010`, its protocol address is commonly `9`; verify the convention in that manual. The bridge supports one bit or one 16-bit register per mapping. It does not currently combine words, decode 32-bit/float values or manage byte/word order.
|
|
114
|
+
|
|
115
|
+
For Modbus → KNX, wire the data output of a `modbus-flex-getter` or `modbus-read` node to the bridge input. A Flex Getter provides the request (`fc`, `unitid`, `address`, `quantity`) in `msg.modbusRequest`; a Modbus Read node preserves it in `msg.input.payload`. The returned values array may be in `msg.payload` or `msg.values`. The bridge supports both message shapes, matches every Flex mapping covered by the response and uses the appropriate array element. Enable **Keep Msg Properties** on Flex Getter. Scale and offset are applied as `raw = KNX × scale + offset`; the incoming path applies the inverse transformation.
|
|
116
|
+
|
|
117
|
+
`Read KNX values on deploy` reads KNX only; schedule Modbus reads in the external Modbus flow. Legacy mappings (including mappings without `modbusMessageFormat`) continue to emit the previous scalar payload plus top-level `msg.address`/`msg.modbusFunction` metadata.
|
|
92
118
|
|
|
93
119
|
## Sample Flow
|
|
94
120
|
|
|
@@ -79,6 +79,10 @@
|
|
|
79
79
|
"target": "Target",
|
|
80
80
|
"method": "HTTP method",
|
|
81
81
|
"modbusFunction": "Modbus function",
|
|
82
|
+
"modbusMessageFormat": "Modbus message format",
|
|
83
|
+
"modbusUnitId": "Unit ID",
|
|
84
|
+
"modbusArea": "Modbus area",
|
|
85
|
+
"modbusDataType": "Data type",
|
|
82
86
|
"scale": "Scale",
|
|
83
87
|
"offset": "Offset",
|
|
84
88
|
"timeout": "Timeout (ms)",
|
|
@@ -103,7 +107,7 @@
|
|
|
103
107
|
"target": "Topic, URL or register",
|
|
104
108
|
"target_mqtt": "Topic, e.g. knx/light/living",
|
|
105
109
|
"target_rest": "https://example/api/endpoint",
|
|
106
|
-
"target_modbus": "
|
|
110
|
+
"target_modbus": "Zero-based address (e.g. 0)",
|
|
107
111
|
"template": "{\"value\":{{value}}}",
|
|
108
112
|
"property": "Optional property/path",
|
|
109
113
|
"method": "POST",
|
|
@@ -114,7 +118,7 @@
|
|
|
114
118
|
"default": "Target",
|
|
115
119
|
"mqtt": "MQTT topic",
|
|
116
120
|
"rest": "REST URL",
|
|
117
|
-
"modbus": "Modbus
|
|
121
|
+
"modbus": "Modbus address (zero-based)"
|
|
118
122
|
},
|
|
119
123
|
"method": {
|
|
120
124
|
"default": "HTTP method",
|
|
@@ -125,6 +129,20 @@
|
|
|
125
129
|
"modbus": "Modbus function"
|
|
126
130
|
}
|
|
127
131
|
},
|
|
132
|
+
"modbus": {
|
|
133
|
+
"formatLegacy": "Legacy scalar message",
|
|
134
|
+
"formatFlex": "Flex Write compatible",
|
|
135
|
+
"areaCoil": "Coil (FC1 read / FC5 write)",
|
|
136
|
+
"areaDiscreteInput": "Discrete input (FC2 read only)",
|
|
137
|
+
"areaHoldingRegister": "Holding register (FC3 read / FC6 write)",
|
|
138
|
+
"areaInputRegister": "Input register (FC4 read only)",
|
|
139
|
+
"dataTypeBool": "Boolean",
|
|
140
|
+
"dataTypeUint16": "Unsigned 16-bit",
|
|
141
|
+
"dataTypeInt16": "Signed 16-bit",
|
|
142
|
+
"zeroBasedHint": "Use the zero-based protocol address (0–65535), not the 4xxxx reference printed by some manuals.",
|
|
143
|
+
"flexHint": "Flex emits msg.payload = {value,fc,unitid,address,quantity} for direct wiring to modbus-flex-write.",
|
|
144
|
+
"readOnlyHint": "Discrete inputs and input registers are read-only and can only use Modbus → KNX."
|
|
145
|
+
},
|
|
128
146
|
"labels": {
|
|
129
147
|
"outputKnxToIoT": "KNX → IoT stream",
|
|
130
148
|
"outputIoTToKnx": "IoT → KNX acknowledgements",
|
|
@@ -45,7 +45,8 @@ El resto de esta ayuda describe el modo clásico **Bridge IoT**.
|
|
|
45
45
|
## Campos de mapeo
|
|
46
46
|
|
|
47
47
|
- **Dirección** — elige KNX→IoT, IoT→KNX o bidireccional.
|
|
48
|
-
- **Tipo de canal** — MQTT usa el target como topic; REST lo usa como URL base; Modbus
|
|
48
|
+
- **Tipo de canal** — MQTT usa el target como topic; REST lo usa como URL base; para Modbus, **Target** es la dirección de protocolo desde cero (0–65535).
|
|
49
|
+
- **Formato Modbus / Unit ID / Área / Tipo de dato** — para los mapeos nuevos elige **Compatible con Flex Write** y después la unidad, el área de memoria y `bool`, `uint16` o `int16`. Si falta el formato se mantiene el contrato escalar heredado, por lo que los flows existentes siguen funcionando.
|
|
49
50
|
- **Escala y Offset** — aplicados a KNX→IoT; IoT→KNX usa la transformación inversa.
|
|
50
51
|
- **Template** — cadena opcional que reemplaza `{{value}}`, `{{ga}}`, `{{label}}`, `{{target}}`, `{{type}}`, `{{isoTimestamp}}`.
|
|
51
52
|
- **Timeout / Reintentos** — campos informativos expuestos en el mensaje para que los nodos posteriores gestionen reintentos/ventanas.
|
|
@@ -88,7 +89,32 @@ El resto de esta ayuda describe el modo clásico **Bridge IoT**.
|
|
|
88
89
|
|
|
89
90
|
### Sincronización de registro Modbus
|
|
90
91
|
|
|
91
|
-
|
|
92
|
+
El bridge es un adaptador de mensajes para `node-red-contrib-modbus`: no abre conexiones TCP/serie ni consulta dispositivos por sí mismo. Instala una versión del paquete compatible con tu runtime Node-RED y utiliza después sus nodos cliente y de transporte.
|
|
93
|
+
|
|
94
|
+
|Área|Lectura|Escritura|Dirección permitida|
|
|
95
|
+
|--|--|--|--|
|
|
96
|
+
| Coil | FC1 | FC5 | Ambas direcciones |
|
|
97
|
+
| Discrete input | FC2 | — | Solo Modbus → KNX |
|
|
98
|
+
| Holding register | FC3 | FC6 | Ambas direcciones |
|
|
99
|
+
| Input register | FC4 | — | Solo Modbus → KNX |
|
|
100
|
+
|
|
101
|
+
Para un mapeo nuevo selecciona `Formato = Compatible con Flex Write`. De KNX a Modbus, la salida 1 puede conectarse directamente a un nodo `modbus-flex-write` y emite:
|
|
102
|
+
|
|
103
|
+
```
|
|
104
|
+
msg.payload = {
|
|
105
|
+
value: 215,
|
|
106
|
+
fc: 6,
|
|
107
|
+
unitid: 1,
|
|
108
|
+
address: 9,
|
|
109
|
+
quantity: 1
|
|
110
|
+
}
|
|
111
|
+
```
|
|
112
|
+
|
|
113
|
+
`address` siempre empieza en cero: si el manual del dispositivo etiqueta un holding register como `40010`, su dirección de protocolo suele ser `9`; comprueba la convención del manual. El bridge admite un bit o un único registro de 16 bits por mapeo. Por ahora no combina palabras, no decodifica valores de 32 bits/float ni gestiona el orden de bytes/palabras.
|
|
114
|
+
|
|
115
|
+
De Modbus a KNX, conecta la salida de datos de un nodo `modbus-flex-getter` o `modbus-read` a la entrada del bridge. Flex Getter proporciona la petición (`fc`, `unitid`, `address`, `quantity`) en `msg.modbusRequest`; Modbus Read la conserva en `msg.input.payload`. El array de valores devuelto puede estar en `msg.payload` o en `msg.values`. El bridge admite ambas formas de mensaje, relaciona todos los mapeos Flex cubiertos por la respuesta y usa el elemento correcto del array. Activa **Keep Msg Properties** en Flex Getter. Escala y offset siguen `raw = KNX × escala + offset`; en la entrada se aplica la transformación inversa.
|
|
116
|
+
|
|
117
|
+
`Leer valores KNX al desplegar` solo lee KNX; programa las lecturas Modbus en el flow Modbus externo. Los mapeos heredados (incluidos los que no tienen `modbusMessageFormat`) continúan emitiendo el payload escalar anterior con los metadatos `msg.address`/`msg.modbusFunction` en el nivel superior.
|
|
92
118
|
|
|
93
119
|
## Flow de ejemplo
|
|
94
120
|
|
|
@@ -79,6 +79,10 @@
|
|
|
79
79
|
"target": "Destino",
|
|
80
80
|
"method": "Método HTTP",
|
|
81
81
|
"modbusFunction": "Función Modbus",
|
|
82
|
+
"modbusMessageFormat": "Formato del mensaje Modbus",
|
|
83
|
+
"modbusUnitId": "Unit ID",
|
|
84
|
+
"modbusArea": "Área Modbus",
|
|
85
|
+
"modbusDataType": "Tipo de dato",
|
|
82
86
|
"scale": "Escala",
|
|
83
87
|
"offset": "Offset",
|
|
84
88
|
"timeout": "Tiempo de espera (ms)",
|
|
@@ -103,7 +107,7 @@
|
|
|
103
107
|
"target": "Tema, URL o registro",
|
|
104
108
|
"target_mqtt": "Tema, p. ej. knx/light/living",
|
|
105
109
|
"target_rest": "https://example/api/endpoint",
|
|
106
|
-
"target_modbus": "
|
|
110
|
+
"target_modbus": "Dirección desde cero (p. ej. 0)",
|
|
107
111
|
"template": "{\"value\":{{value}}}",
|
|
108
112
|
"property": "Propiedad/ruta opcional",
|
|
109
113
|
"method": "POST",
|
|
@@ -114,7 +118,7 @@
|
|
|
114
118
|
"default": "Destino",
|
|
115
119
|
"mqtt": "Topic MQTT",
|
|
116
120
|
"rest": "URL REST",
|
|
117
|
-
"modbus": "
|
|
121
|
+
"modbus": "Dirección Modbus (desde cero)"
|
|
118
122
|
},
|
|
119
123
|
"method": {
|
|
120
124
|
"default": "Método HTTP",
|
|
@@ -125,6 +129,20 @@
|
|
|
125
129
|
"modbus": "Función Modbus"
|
|
126
130
|
}
|
|
127
131
|
},
|
|
132
|
+
"modbus": {
|
|
133
|
+
"formatLegacy": "Mensaje escalar heredado",
|
|
134
|
+
"formatFlex": "Compatible con Flex Write",
|
|
135
|
+
"areaCoil": "Coil (lectura FC1 / escritura FC5)",
|
|
136
|
+
"areaDiscreteInput": "Discrete input (lectura FC2 solamente)",
|
|
137
|
+
"areaHoldingRegister": "Holding register (lectura FC3 / escritura FC6)",
|
|
138
|
+
"areaInputRegister": "Input register (lectura FC4 solamente)",
|
|
139
|
+
"dataTypeBool": "Booleano",
|
|
140
|
+
"dataTypeUint16": "16 bits sin signo",
|
|
141
|
+
"dataTypeInt16": "16 bits con signo",
|
|
142
|
+
"zeroBasedHint": "Usa la dirección de protocolo desde cero (0–65535), no la referencia 4xxxx que aparece en algunos manuales.",
|
|
143
|
+
"flexHint": "Flex emite msg.payload = {value,fc,unitid,address,quantity}, conectable directamente a modbus-flex-write.",
|
|
144
|
+
"readOnlyHint": "Los discrete inputs e input registers son de solo lectura y únicamente admiten Modbus → KNX."
|
|
145
|
+
},
|
|
128
146
|
"labels": {
|
|
129
147
|
"outputKnxToIoT": "Flujo KNX → IoT",
|
|
130
148
|
"outputIoTToKnx": "Confirmaciones IoT → KNX",
|
|
@@ -45,7 +45,8 @@ Le reste de cette aide décrit le mode classique **Passerelle IoT**.
|
|
|
45
45
|
## Champs de correspondance
|
|
46
46
|
|
|
47
47
|
- **Direction** — choisir KNX→IoT, IoT→KNX ou bidirectionnel.
|
|
48
|
-
- **Type de canal** — MQTT utilise la cible comme topic, REST comme URL de base
|
|
48
|
+
- **Type de canal** — MQTT utilise la cible comme topic, REST comme URL de base ; pour Modbus, **Target** est l'adresse de protocole à base zéro (0–65535).
|
|
49
|
+
- **Format Modbus / Unit ID / Zone / Type de donnée** — pour les nouvelles correspondances, choisissez **Compatible avec Flex Write**, puis l'unité, la zone mémoire et `bool`, `uint16` ou `int16`. En l'absence de format, l'ancien contrat scalaire reste actif afin de préserver les flows existants.
|
|
49
50
|
- **Échelle & offset** — appliqués pour KNX→IoT ; IoT→KNX applique la transformation inverse.
|
|
50
51
|
- **Template** — chaîne optionnelle remplaçant `{{value}}`, `{{ga}}`, `{{label}}`, `{{target}}`, `{{type}}`, `{{isoTimestamp}}`.
|
|
51
52
|
- **Timeout / Tentatives** — informations exposées sur le message pour aider les nœuds en aval à gérer les reprises.
|
|
@@ -88,7 +89,32 @@ Le reste de cette aide décrit le mode classique **Passerelle IoT**.
|
|
|
88
89
|
|
|
89
90
|
### Synchronisation de registre Modbus
|
|
90
91
|
|
|
91
|
-
|
|
92
|
+
La passerelle est un adaptateur de messages pour `node-red-contrib-modbus` ; elle n'ouvre pas de connexion TCP/série et n'interroge pas elle-même un appareil. Installez une version du paquet compatible avec votre runtime Node-RED, puis utilisez ses nœuds client et transport.
|
|
93
|
+
|
|
94
|
+
|Zone|Lecture|Écriture|Direction autorisée|
|
|
95
|
+
|--|--|--|--|
|
|
96
|
+
| Coil | FC1 | FC5 | Les deux directions |
|
|
97
|
+
| Discrete input | FC2 | — | Modbus → KNX uniquement |
|
|
98
|
+
| Holding register | FC3 | FC6 | Les deux directions |
|
|
99
|
+
| Input register | FC4 | — | Modbus → KNX uniquement |
|
|
100
|
+
|
|
101
|
+
Pour une nouvelle correspondance, sélectionnez `Format = Compatible avec Flex Write`. De KNX vers Modbus, la sortie 1 se raccorde directement à un nœud `modbus-flex-write` et émet :
|
|
102
|
+
|
|
103
|
+
```
|
|
104
|
+
msg.payload = {
|
|
105
|
+
value: 215,
|
|
106
|
+
fc: 6,
|
|
107
|
+
unitid: 1,
|
|
108
|
+
address: 9,
|
|
109
|
+
quantity: 1
|
|
110
|
+
}
|
|
111
|
+
```
|
|
112
|
+
|
|
113
|
+
`address` est toujours à base zéro : si le manuel de l'appareil désigne un holding register par `40010`, son adresse de protocole est généralement `9` ; vérifiez la convention du manuel. La passerelle prend en charge un bit ou un seul registre 16 bits par correspondance. Elle ne combine pas encore plusieurs mots, ne décode pas les valeurs 32 bits/float et ne gère pas l'ordre des octets/mots.
|
|
114
|
+
|
|
115
|
+
De Modbus vers KNX, reliez la sortie de données d'un nœud `modbus-flex-getter` ou `modbus-read` à l'entrée de la passerelle. Flex Getter fournit la requête (`fc`, `unitid`, `address`, `quantity`) dans `msg.modbusRequest` ; Modbus Read la conserve dans `msg.input.payload`. Le tableau de valeurs retourné peut se trouver dans `msg.payload` ou `msg.values`. La passerelle accepte les deux formes de message, associe toutes les correspondances Flex couvertes par la réponse et utilise le bon élément du tableau. Activez **Keep Msg Properties** sur Flex Getter. L'échelle et le décalage suivent `raw = KNX × échelle + décalage` ; le chemin entrant applique la transformation inverse.
|
|
116
|
+
|
|
117
|
+
`Lire les valeurs KNX au déploiement` lit uniquement KNX ; planifiez les lectures Modbus dans le flow Modbus externe. Les correspondances historiques (y compris celles sans `modbusMessageFormat`) continuent d'émettre l'ancien payload scalaire avec les métadonnées `msg.address`/`msg.modbusFunction` au premier niveau.
|
|
92
118
|
|
|
93
119
|
## Flow d’exemple
|
|
94
120
|
|
|
@@ -79,6 +79,10 @@
|
|
|
79
79
|
"target": "Cible",
|
|
80
80
|
"method": "Méthode HTTP",
|
|
81
81
|
"modbusFunction": "Fonction Modbus",
|
|
82
|
+
"modbusMessageFormat": "Format du message Modbus",
|
|
83
|
+
"modbusUnitId": "Unit ID",
|
|
84
|
+
"modbusArea": "Zone Modbus",
|
|
85
|
+
"modbusDataType": "Type de donnée",
|
|
82
86
|
"scale": "Échelle",
|
|
83
87
|
"offset": "Décalage",
|
|
84
88
|
"timeout": "Délai (ms)",
|
|
@@ -103,7 +107,7 @@
|
|
|
103
107
|
"target": "Topic, URL ou registre",
|
|
104
108
|
"target_mqtt": "Topic, ex. knx/light/salon",
|
|
105
109
|
"target_rest": "https://example/api/endpoint",
|
|
106
|
-
"target_modbus": "
|
|
110
|
+
"target_modbus": "Adresse à base zéro (ex. 0)",
|
|
107
111
|
"template": "{\"value\":{{value}}}",
|
|
108
112
|
"property": "Propriété/chemin optionnel",
|
|
109
113
|
"method": "POST",
|
|
@@ -114,7 +118,7 @@
|
|
|
114
118
|
"default": "Cible",
|
|
115
119
|
"mqtt": "Topic MQTT",
|
|
116
120
|
"rest": "URL REST",
|
|
117
|
-
"modbus": "
|
|
121
|
+
"modbus": "Adresse Modbus (base zéro)"
|
|
118
122
|
},
|
|
119
123
|
"method": {
|
|
120
124
|
"default": "Méthode HTTP",
|
|
@@ -125,6 +129,20 @@
|
|
|
125
129
|
"modbus": "Fonction Modbus"
|
|
126
130
|
}
|
|
127
131
|
},
|
|
132
|
+
"modbus": {
|
|
133
|
+
"formatLegacy": "Message scalaire historique",
|
|
134
|
+
"formatFlex": "Compatible avec Flex Write",
|
|
135
|
+
"areaCoil": "Coil (lecture FC1 / écriture FC5)",
|
|
136
|
+
"areaDiscreteInput": "Discrete input (lecture FC2 uniquement)",
|
|
137
|
+
"areaHoldingRegister": "Holding register (lecture FC3 / écriture FC6)",
|
|
138
|
+
"areaInputRegister": "Input register (lecture FC4 uniquement)",
|
|
139
|
+
"dataTypeBool": "Booléen",
|
|
140
|
+
"dataTypeUint16": "16 bits non signé",
|
|
141
|
+
"dataTypeInt16": "16 bits signé",
|
|
142
|
+
"zeroBasedHint": "Utilisez l’adresse de protocole à base zéro (0–65535), et non la référence 4xxxx indiquée dans certains manuels.",
|
|
143
|
+
"flexHint": "Flex émet msg.payload = {value,fc,unitid,address,quantity}, directement raccordable à modbus-flex-write.",
|
|
144
|
+
"readOnlyHint": "Les discrete inputs et input registers sont en lecture seule et acceptent uniquement Modbus → KNX."
|
|
145
|
+
},
|
|
128
146
|
"labels": {
|
|
129
147
|
"outputKnxToIoT": "Flux KNX → IoT",
|
|
130
148
|
"outputIoTToKnx": "Accusés IoT → KNX",
|
|
@@ -45,7 +45,8 @@ Il resto di questo aiuto descrive la modalità classica **Bridge IoT**.
|
|
|
45
45
|
## Campi della mappatura
|
|
46
46
|
|
|
47
47
|
- **Direzione** — scegli KNX→IoT, IoT→KNX oppure bidirezionale.
|
|
48
|
-
- **Tipo canale** — per MQTT il target è il topic; per REST è l'URL base; per Modbus è
|
|
48
|
+
- **Tipo canale** — per MQTT il target è il topic; per REST è l'URL base; per Modbus **Target** è l'indirizzo di protocollo zero-based (0–65535).
|
|
49
|
+
- **Formato Modbus / Unit ID / Area / Tipo di dato** — per le nuove mappature scegli **Compatibile con Flex Write**, quindi imposta unità, area di memoria e `bool`, `uint16` o `int16`. Se il formato è assente resta attivo il contratto scalare legacy, così i flow esistenti continuano a funzionare.
|
|
49
50
|
- **Scala & Offset** — applicati su KNX→IoT; IoT→KNX usa la trasformazione inversa.
|
|
50
51
|
- **Template** — stringa opzionale con segnaposto `{{value}}`, `{{ga}}`, `{{label}}`, `{{target}}`, `{{type}}`, `{{isoTimestamp}}`.
|
|
51
52
|
- **Timeout / Tentativi** — campi informativi esposti nel messaggio in uscita per i nodi successivi.
|
|
@@ -88,7 +89,32 @@ Il resto di questo aiuto descrive la modalità classica **Bridge IoT**.
|
|
|
88
89
|
|
|
89
90
|
### Sincronizzazione Modbus
|
|
90
91
|
|
|
91
|
-
|
|
92
|
+
Il bridge è un adattatore di messaggi per `node-red-contrib-modbus`: non apre connessioni TCP/seriali e non interroga autonomamente il dispositivo. Installa una versione del pacchetto compatibile con il tuo runtime Node-RED, poi usa i suoi nodi client e di trasporto.
|
|
93
|
+
|
|
94
|
+
|Area|Lettura|Scrittura|Direzione ammessa|
|
|
95
|
+
|--|--|--|--|
|
|
96
|
+
| Coil | FC1 | FC5 | Entrambe le direzioni |
|
|
97
|
+
| Discrete input | FC2 | — | Solo Modbus → KNX |
|
|
98
|
+
| Holding register | FC3 | FC6 | Entrambe le direzioni |
|
|
99
|
+
| Input register | FC4 | — | Solo Modbus → KNX |
|
|
100
|
+
|
|
101
|
+
Per una nuova mappatura seleziona `Formato = Compatibile con Flex Write`. Da KNX a Modbus, l'output 1 si collega direttamente a un nodo `modbus-flex-write` ed emette:
|
|
102
|
+
|
|
103
|
+
```
|
|
104
|
+
msg.payload = {
|
|
105
|
+
value: 215,
|
|
106
|
+
fc: 6,
|
|
107
|
+
unitid: 1,
|
|
108
|
+
address: 9,
|
|
109
|
+
quantity: 1
|
|
110
|
+
}
|
|
111
|
+
```
|
|
112
|
+
|
|
113
|
+
`address` è sempre zero-based: se il manuale del dispositivo indica un holding register come `40010`, il relativo indirizzo di protocollo è comunemente `9`; verifica la convenzione nel manuale. Il bridge gestisce un bit o un singolo registro a 16 bit per mappatura. Al momento non combina più word, non decodifica valori a 32 bit/float e non gestisce l'ordine di byte/word.
|
|
114
|
+
|
|
115
|
+
Da Modbus a KNX, collega l'uscita dati di un nodo `modbus-flex-getter` o `modbus-read` all'ingresso del bridge. Flex Getter fornisce la richiesta (`fc`, `unitid`, `address`, `quantity`) in `msg.modbusRequest`; Modbus Read la conserva in `msg.input.payload`. L'array dei valori restituiti può trovarsi in `msg.payload` oppure in `msg.values`. Il bridge supporta entrambe le forme, abbina tutte le mappature Flex comprese nella risposta e usa l'elemento corretto dell'array. Abilita **Keep Msg Properties** su Flex Getter. Scala e offset seguono `raw = KNX × scala + offset`; in ingresso viene applicata la trasformazione inversa.
|
|
116
|
+
|
|
117
|
+
`Leggi valori KNX al deploy` legge soltanto KNX; pianifica le letture Modbus nel flow Modbus esterno. Le mappature legacy (comprese quelle senza `modbusMessageFormat`) continuano a emettere il precedente payload scalare con i metadati `msg.address`/`msg.modbusFunction` al livello principale.
|
|
92
118
|
|
|
93
119
|
## Flow di esempio
|
|
94
120
|
|
|
@@ -79,6 +79,10 @@
|
|
|
79
79
|
"target": "Target",
|
|
80
80
|
"method": "Metodo HTTP",
|
|
81
81
|
"modbusFunction": "Funzione Modbus",
|
|
82
|
+
"modbusMessageFormat": "Formato messaggio Modbus",
|
|
83
|
+
"modbusUnitId": "Unit ID",
|
|
84
|
+
"modbusArea": "Area Modbus",
|
|
85
|
+
"modbusDataType": "Tipo di dato",
|
|
82
86
|
"scale": "Scala",
|
|
83
87
|
"offset": "Offset",
|
|
84
88
|
"timeout": "Timeout (ms)",
|
|
@@ -103,7 +107,7 @@
|
|
|
103
107
|
"target": "Topic, URL o registro",
|
|
104
108
|
"target_mqtt": "Topic, es. knx/light/soggiorno",
|
|
105
109
|
"target_rest": "https://example/api/endpoint",
|
|
106
|
-
"target_modbus": "
|
|
110
|
+
"target_modbus": "Indirizzo zero-based (es. 0)",
|
|
107
111
|
"template": "{\"value\":{{value}}}",
|
|
108
112
|
"property": "Proprietà/percorso opzionale",
|
|
109
113
|
"method": "POST",
|
|
@@ -114,7 +118,7 @@
|
|
|
114
118
|
"default": "Target",
|
|
115
119
|
"mqtt": "Topic MQTT",
|
|
116
120
|
"rest": "URL REST",
|
|
117
|
-
"modbus": "
|
|
121
|
+
"modbus": "Indirizzo Modbus (zero-based)"
|
|
118
122
|
},
|
|
119
123
|
"method": {
|
|
120
124
|
"default": "Metodo HTTP",
|
|
@@ -125,6 +129,20 @@
|
|
|
125
129
|
"modbus": "Funzione Modbus"
|
|
126
130
|
}
|
|
127
131
|
},
|
|
132
|
+
"modbus": {
|
|
133
|
+
"formatLegacy": "Messaggio scalare legacy",
|
|
134
|
+
"formatFlex": "Compatibile con Flex Write",
|
|
135
|
+
"areaCoil": "Coil (lettura FC1 / scrittura FC5)",
|
|
136
|
+
"areaDiscreteInput": "Discrete input (lettura FC2, sola lettura)",
|
|
137
|
+
"areaHoldingRegister": "Holding register (lettura FC3 / scrittura FC6)",
|
|
138
|
+
"areaInputRegister": "Input register (lettura FC4, sola lettura)",
|
|
139
|
+
"dataTypeBool": "Booleano",
|
|
140
|
+
"dataTypeUint16": "16 bit senza segno",
|
|
141
|
+
"dataTypeInt16": "16 bit con segno",
|
|
142
|
+
"zeroBasedHint": "Usa l’indirizzo di protocollo zero-based (0–65535), non il riferimento 4xxxx riportato da alcuni manuali.",
|
|
143
|
+
"flexHint": "Flex emette msg.payload = {value,fc,unitid,address,quantity}, collegabile direttamente a modbus-flex-write.",
|
|
144
|
+
"readOnlyHint": "Discrete input e input register sono di sola lettura e possono usare solo Modbus → KNX."
|
|
145
|
+
},
|
|
128
146
|
"labels": {
|
|
129
147
|
"outputKnxToIoT": "Flusso KNX → IoT",
|
|
130
148
|
"outputIoTToKnx": "Ack IoT → KNX",
|
|
@@ -45,7 +45,8 @@ KNX 总线的值会发布到 MQTT,可写的数据点接受来自 Home Assistan
|
|
|
45
45
|
## 映射字段
|
|
46
46
|
|
|
47
47
|
- **方向** — 选择 KNX→IoT、IoT→KNX 或双向。
|
|
48
|
-
- **通道类型** — MQTT 将目标视为主题;REST 将其视为基础 URL
|
|
48
|
+
- **通道类型** — MQTT 将目标视为主题;REST 将其视为基础 URL;对于 Modbus,**目标**是从零开始的协议地址(0–65535)。
|
|
49
|
+
- **Modbus 格式 / Unit ID / 区域 / 数据类型** — 新映射请选择**兼容 Flex Write**,然后选择单元、内存区域以及 `bool`、`uint16` 或 `int16`。如果没有格式字段,则继续使用旧版标量协议,现有 Flow 不受影响。
|
|
49
50
|
- **缩放 & 偏移** — 应用于 KNX→IoT;在 IoT→KNX 时使用逆向变换。
|
|
50
51
|
- **模板** — 可选字符串,可替换 `{{value}}`、`{{ga}}`、`{{label}}`、`{{target}}`、`{{type}}`、`{{isoTimestamp}}`。
|
|
51
52
|
- **超时 / 重试** — 信息字段,用于告知下游节点应如何处理重试和时间窗口。
|
|
@@ -88,7 +89,32 @@ KNX 总线的值会发布到 MQTT,可写的数据点接受来自 Home Assistan
|
|
|
88
89
|
|
|
89
90
|
### Modbus 寄存器同步
|
|
90
91
|
|
|
91
|
-
|
|
92
|
+
本桥接节点是 `node-red-contrib-modbus` 的消息适配器;它本身不会打开 TCP/串行连接,也不会轮询设备。请安装与你的 Node-RED 运行环境兼容的该软件包版本,然后使用其中的客户端和传输节点。
|
|
93
|
+
|
|
94
|
+
|区域|读取|写入|允许的方向|
|
|
95
|
+
|--|--|--|--|
|
|
96
|
+
| 线圈 | FC1 | FC5 | 双向 |
|
|
97
|
+
| 离散输入 | FC2 | — | 仅 Modbus → KNX |
|
|
98
|
+
| 保持寄存器 | FC3 | FC6 | 双向 |
|
|
99
|
+
| 输入寄存器 | FC4 | — | 仅 Modbus → KNX |
|
|
100
|
+
|
|
101
|
+
对于新映射,请选择`格式 = 兼容 Flex Write`。从 KNX 到 Modbus 时,输出 1 可直接连接到 `modbus-flex-write` 节点,并输出:
|
|
102
|
+
|
|
103
|
+
```
|
|
104
|
+
msg.payload = {
|
|
105
|
+
value: 215,
|
|
106
|
+
fc: 6,
|
|
107
|
+
unitid: 1,
|
|
108
|
+
address: 9,
|
|
109
|
+
quantity: 1
|
|
110
|
+
}
|
|
111
|
+
```
|
|
112
|
+
|
|
113
|
+
`address` 始终从零开始:如果设备手册将某个保持寄存器标为 `40010`,其协议地址通常为 `9`;请确认该手册采用的规则。每条映射支持一个位或一个 16 位寄存器。目前不会组合多个字、解码 32 位/浮点值,也不处理字节/字顺序。
|
|
114
|
+
|
|
115
|
+
从 Modbus 到 KNX 时,将 `modbus-flex-getter` 或 `modbus-read` 节点的数据输出连接到桥接输入。Flex Getter 在 `msg.modbusRequest` 中提供请求(`fc`、`unitid`、`address`、`quantity`);Modbus Read 则将请求保留在 `msg.input.payload` 中。返回的值数组可以位于 `msg.payload` 或 `msg.values`。桥接节点支持这两种消息形式,会匹配该响应覆盖的所有 Flex 映射,并使用正确的数组元素。请在 Flex Getter 上启用 **Keep Msg Properties**。缩放和偏移遵循 `raw = KNX × 缩放 + 偏移`;输入路径应用逆变换。
|
|
116
|
+
|
|
117
|
+
`部署时读取 KNX 数值`只读取 KNX;Modbus 读取应在外部 Modbus Flow 中安排。旧版映射(包括没有 `modbusMessageFormat` 的映射)仍会输出之前的标量 payload,并在顶层保留 `msg.address`/`msg.modbusFunction` 元数据。
|
|
92
118
|
|
|
93
119
|
## 示例 Flow
|
|
94
120
|
|
|
@@ -79,6 +79,10 @@
|
|
|
79
79
|
"target": "目标",
|
|
80
80
|
"method": "HTTP 方法",
|
|
81
81
|
"modbusFunction": "Modbus 功能",
|
|
82
|
+
"modbusMessageFormat": "Modbus 消息格式",
|
|
83
|
+
"modbusUnitId": "Unit ID",
|
|
84
|
+
"modbusArea": "Modbus 区域",
|
|
85
|
+
"modbusDataType": "数据类型",
|
|
82
86
|
"scale": "缩放",
|
|
83
87
|
"offset": "偏移",
|
|
84
88
|
"timeout": "超时 (ms)",
|
|
@@ -103,7 +107,7 @@
|
|
|
103
107
|
"target": "主题、URL 或寄存器",
|
|
104
108
|
"target_mqtt": "主题,例如 knx/light/living",
|
|
105
109
|
"target_rest": "https://example/api/endpoint",
|
|
106
|
-
"target_modbus": "
|
|
110
|
+
"target_modbus": "从零开始的地址(如 0)",
|
|
107
111
|
"template": "{\"value\":{{value}}}",
|
|
108
112
|
"property": "可选属性/路径",
|
|
109
113
|
"method": "POST",
|
|
@@ -114,7 +118,7 @@
|
|
|
114
118
|
"default": "目标",
|
|
115
119
|
"mqtt": "MQTT 主题",
|
|
116
120
|
"rest": "REST URL",
|
|
117
|
-
"modbus": "Modbus
|
|
121
|
+
"modbus": "Modbus 地址(从零开始)"
|
|
118
122
|
},
|
|
119
123
|
"method": {
|
|
120
124
|
"default": "HTTP 方法",
|
|
@@ -125,6 +129,20 @@
|
|
|
125
129
|
"modbus": "Modbus 功能"
|
|
126
130
|
}
|
|
127
131
|
},
|
|
132
|
+
"modbus": {
|
|
133
|
+
"formatLegacy": "旧版标量消息",
|
|
134
|
+
"formatFlex": "兼容 Flex Write",
|
|
135
|
+
"areaCoil": "线圈(FC1 读取 / FC5 写入)",
|
|
136
|
+
"areaDiscreteInput": "离散输入(FC2 读取,只读)",
|
|
137
|
+
"areaHoldingRegister": "保持寄存器(FC3 读取 / FC6 写入)",
|
|
138
|
+
"areaInputRegister": "输入寄存器(FC4 读取,只读)",
|
|
139
|
+
"dataTypeBool": "布尔值",
|
|
140
|
+
"dataTypeUint16": "16 位无符号整数",
|
|
141
|
+
"dataTypeInt16": "16 位有符号整数",
|
|
142
|
+
"zeroBasedHint": "请使用从零开始的协议地址(0–65535),不要使用某些手册中标注的 4xxxx 引用编号。",
|
|
143
|
+
"flexHint": "Flex 输出 msg.payload = {value,fc,unitid,address,quantity},可直接连接到 modbus-flex-write。",
|
|
144
|
+
"readOnlyHint": "离散输入和输入寄存器为只读,只能使用 Modbus → KNX。"
|
|
145
|
+
},
|
|
128
146
|
"labels": {
|
|
129
147
|
"outputKnxToIoT": "KNX → IoT 流",
|
|
130
148
|
"outputIoTToKnx": "IoT → KNX 确认",
|
package/package.json
CHANGED
|
@@ -3,8 +3,8 @@
|
|
|
3
3
|
"engines": {
|
|
4
4
|
"node": ">=20.18.1"
|
|
5
5
|
},
|
|
6
|
-
"version": "6.3.
|
|
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.",
|
|
6
|
+
"version": "6.3.25",
|
|
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 and Modbus adapters, 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/",
|
|
10
10
|
"resources/",
|
|
@@ -19,7 +19,6 @@
|
|
|
19
19
|
"@matter/main": "^0.17.9",
|
|
20
20
|
"@matter/nodejs": "^0.17.9",
|
|
21
21
|
"@project-chip/matter.js": "^0.17.9",
|
|
22
|
-
"dns-sync": "0.2.1",
|
|
23
22
|
"google-translate-tts": "^0.3.0",
|
|
24
23
|
"js-yaml": "4.3.1",
|
|
25
24
|
"knxultimate": "6.0.2",
|
|
@@ -94,6 +93,7 @@
|
|
|
94
93
|
"hue",
|
|
95
94
|
"matter",
|
|
96
95
|
"mqtt",
|
|
96
|
+
"modbus",
|
|
97
97
|
"home-assistant",
|
|
98
98
|
"building-automation",
|
|
99
99
|
"home-automation",
|