MQTT Home Assistant - IoT
El puente normaliza los telegramas KNX en mensajes estructurados listos para transportes IoT (MQTT, REST, Modbus) y acepta entradas del flow para escribir de vuelta en el bus KNX. Esta guía resume la configuración y cómo enlazarla con nodos de terceros.
Modo de funcionamiento
El nodo tiene un selector Modo:
- Bridge IoT (predeterminado) — el comportamiento descrito abajo: una lista de mapeos que convierte los telegramas KNX en mensajes de salida MQTT/REST/Modbus y viceversa.
- MQTT / Home Assistant (nativo) — el nodo se conecta directamente a un broker MQTT y hace de puente KNX ↔ MQTT en ambos sentidos, publicando el descubrimiento MQTT de Home Assistant para que KNX aparezca automáticamente en Home Assistant. No hace falta cablear nodos
mqtt in/mqtt out.
Modo MQTT / Home Assistant
Requisitos: un broker MQTT accesible tanto por Node-RED como por Home Assistant, con la integración MQTT activada en HA. Todas las entidades se agrupan bajo un único dispositivo HA con el nombre del nodo.
| Campo | Propósito |
|---|---|
| Conexión al bus KNX | Autónomo (predeterminado): el nodo habla directamente con la pasarela KNX y no muestra pines de entrada/salida. Mensajes de flujo: el nodo expone un pin de entrada y uno de salida — conecta la salida de un nodo KNXUltimate en modo Universal al pin de entrada (bus KNX → MQTT) y el pin de salida a la entrada de otro nodo KNXUltimate en modo Universal (MQTT → bus KNX). |
| URL del broker / Usuario / Contraseña | Conexión al broker MQTT. |
| Topic base | Raíz de los topics de estado/comando (predeterminado knx-ultimate). |
| Publicar descubrimiento HA / Prefijo de descubrimiento | Activa el descubrimiento MQTT de Home Assistant y define su prefijo (predeterminado homeassistant). |
| Formato del nombre de entidad | Cómo se construyen los nombres de las entidades de HA a partir de la importación ETS, cuyos nombres empiezan por la ruta de grupos, p. ej. (Luces->Planta baja) Salón. Opciones: Como se importó de ETS (predeterminado), Nombre primero (Salón (Luces->Planta baja)), Solo el nombre (Salón), Nombre + dirección de grupo (Salón (0/1/2)). |
| Direcciones de grupo a exponer | Lista con casillas de cada dirección importada en la pasarela (ETS). Las direcciones marcadas se convierten en entidades HA, tipadas automáticamente a partir del DPT (switch, sensor, binary_sensor, number, text). Filtro + Seleccionar todo / nada; todas seleccionadas por defecto. Cada fila tiene además la opción Solo lectura: una dirección de solo lectura se sigue publicando en Home Assistant (estado visible) pero nunca acepta comandos de vuelta al bus KNX (los switch pasan a binary_sensor y los number a sensor). Los botones Marcar solo lectura / Quitar solo lectura la aplican a todas las direcciones mostradas. |
| Persianas y termostatos | Entidades compuestas que agrupan varias direcciones (ver abajo). |
Persianas y termostatos
Las persianas y termostatos combinan varias direcciones de grupo en una sola entidad HA, por lo que no pueden deducirse de un único DPT - añádelos en la lista:
- Persiana: GA subir/bajar (1.008), GA stop opcional (1.007), GA posición comando/estado opcional (5.001). Invertir posición asigna KNX (0% = abierto) a Home Assistant (100% = abierto).
- Termostato: GA temperatura actual (9.001), GA consigna comando/estado (9.001), GA on/off opcional (1.001 → off/heat), además de temperatura mín/máx y paso.
Los tipos de datapoint se leen de la importación ETS cuando están disponibles; en caso contrario, de los valores KNX por defecto. Para un estado fiable, las direcciones usadas por persianas/termostatos deberían estar presentes en la importación ETS.
Integración KNX nativa vs puente MQTT. Si Home Assistant ya se comunica con KNX mediante su integración KNX integrada, las persianas/clima se configuran allí con las direcciones de grupo y este puente MQTT no es necesario. Usa este modo cuando Node-RED posee el bus KNX y Home Assistant lo ve todo a través de MQTT.
Resumen de campos
| Campo | Propósito | Notas |
|---|---|---|
| Label | Nombre amigable | Aparece en el estado y en msg.bridge.label. |
| GA / DPT | Dirección de grupo y datapoint | Configúralos manualmente o usando el autocompletado ETS. |
| Dirección | KNX→IoT, IoT→KNX, Bidireccional | Determina qué salidas se utilizan. |
| Tipo de canal | MQTT / REST / Modbus | Cambia el significado de Target. |
| Target | Topic, URL base o registro | Vacío = usa outputtopic del nodo. |
| Template | Formato de cadena | Placeholders {{value}}, {{ga}}, {{type}}, {{target}}, {{label}}, {{isoTimestamp}}. |
| Escala / Offset | Conversión numérica | Se aplica en KNX→IoT; el sentido inverso se usa para IoT→KNX. |
| Timeout / Reintentos | Hints de reintento | Los nodos posteriores pueden usarlos para controlar reenvíos. |
Transportes habituales
Broker MQTT
- Publicar: conecta la salida 1 al nodo core
mqtt out. El bridge ya rellenamsg.topicymsg.payload. - Suscribirse: conecta un nodo
mqtt ina la entrada del bridge para convertir mensajes MQTT en escrituras KNX. El pin 2 devuelve un ack.API REST
- Envía la salida 1 al nodo core
http request(o contrib comonode-red-contrib-http-request). - El bridge copia
bridge.methodamsg.methody el template al payload, ideal para webhooks JSON.Registros Modbus
- Úsalo con
node-red-contrib-modbus(modbus-flex-write,modbus-write). - El
Targetmarca el registro;msg.payloadcontiene el valor ya transformado.Flujos de ejemplo
Estado KNX → MQTT
```json
[ { “id”: “bridge1”, “type”: “knxUltimateIoTBridge”, “z”: “flow1”, “server”: “gateway1”, “name”: “Bridge luces”, “emitOnChangeOnly”: true, “readOnDeploy”: true, “acceptFlowInput”: true, “mappings”: [ { “id”: “map-luz”, “enabled”: true, “label”: “Luz salón”, “ga”: “1/1/10”, “dpt”: “1.001”, “direction”: “bidirectional”, “iotType”: “mqtt”, “target”: “knx/light/living”, “method”: “POST”, “modbusFunction”: “writeHoldingRegister”, “scale”: 1, “offset”: 0, “template”: “{{value}}”, “property”: “”, “timeout”: 0, “retry”: 0 } ], “wires”: [[“mqttOut”],[“debugAck”]] }, { “id”: “mqttOut”, “type”: “mqtt out”, “name”: “MQTT estado”, “topic”: “”, “qos”: “0”, “retain”: “false”, “broker”: “mqttBroker”, “x”: 520, “y”: 120, “wires”: [] }, { “id”: “debugAck”, “type”: “debug”, “name”: “Ack KNX”, “active”: true, “tosidebar”: true, “complete”: “true”, “x”: 520, “y”: 180, “wires”: [] } ]
### Comando MQTT → KNX
```json
[
{
"id": "mqttIn",
"type": "mqtt in",
"name": "MQTT comando",
"topic": "knx/light/living/set",
"qos": "1",
"datatype": "auto",
"broker": "mqttBroker",
"x": 140,
"y": 200,
"wires": [["bridge1"]]
}
]
Combina ambos fragmentos para tener ida y vuelta KNX ↔ MQTT con confirmaciones.
Snapshot REST
{
"id": "bridge-rest",
"type": "knxUltimateIoTBridge",
"name": "Bridge contador",
"mappings": [
{
"label": "Potencia activa",
"ga": "2/1/20",
"dpt": "9.024",
"direction": "knx-to-iot",
"iotType": "rest",
"target": "https://example/api/knx/power",
"method": "POST",
"template": "{\"value\":{{value}},\"ga\":\"{{ga}}\",\"ts\":\"{{isoTimestamp}}\"}"
}
]
}
Dirige la salida 1 a http request y usa la respuesta junto con bridge.retry para decidir reintentos.
Escritura Modbus
- Configura
Target = 40010,Tipo = Modbus,Dirección = Bidireccional. - Conecta la salida 1 a
modbus-flex-writey asignamsg.payloadal valor del nodo Modbus. - Usa el ack para confirmar cuándo KNX se sincroniza tras la actualización del registro.
Consejos
- Deja
Targetvacío si quieres reutilizaroutputtopicpara varios mapeos. emitOnChangeOnlyreduce el ruido de sensores; desactívalo si necesitas todos los telegramas.- El pin 2 replica el payload IoT original y facilita el debug de escalados.
- Para float Modbus específicos, añade un
functionque prepare el formato (16/32 bits, orden de bytes, etc.). ¡Feliz bridge!
- Deja