MQTT Home Assistant - IoT
Il bridge normalizza i telegrammi KNX in messaggi strutturati per trasporti IoT (MQTT, REST, Modbus) e accetta input dal flow per riscrivere sul bus. Qui trovi una guida rapida e i collegamenti consigliati ai nodi di trasporto di Node-RED.
Modalità di funzionamento
Il nodo ha un selettore Modalità:
- Bridge IoT (predefinito) — il comportamento descritto qui sotto: una lista di mappature che trasforma i telegrammi KNX in messaggi di output MQTT/REST/Modbus e viceversa.
- MQTT / Home Assistant (nativo) — il nodo si connette direttamente a un broker MQTT e fa da ponte KNX ↔ MQTT in entrambe le direzioni, pubblicando il discovery MQTT di Home Assistant così KNX compare automaticamente in Home Assistant. Non serve cablare nodi
mqtt in/mqtt out.
Modalità MQTT / Home Assistant
Requisiti: un broker MQTT raggiungibile sia da Node-RED che da Home Assistant, con l’integrazione MQTT attiva in HA. Tutte le entità sono raggruppate sotto un unico dispositivo HA con il nome del nodo.
| Campo | Scopo |
|---|---|
| Connessione al bus KNX | Stand-alone (predefinito): il nodo parla direttamente col gateway KNX e non mostra PIN di ingresso/uscita. Messaggi di flow: il nodo espone un PIN di ingresso e uno di uscita — collega l’uscita di un nodo KNXUltimate in modalità Universale al PIN di ingresso (bus KNX → MQTT) e il PIN di uscita all’ingresso di un altro nodo KNXUltimate in modalità Universale (MQTT → bus KNX). |
| URL broker / Nome utente / Password | Connessione al broker MQTT. |
| Topic di base | Radice dei topic di stato/comando (predefinito knx-ultimate). |
| Pubblica discovery HA / Prefisso discovery | Abilita il discovery MQTT di Home Assistant e ne imposta il prefisso (predefinito homeassistant). |
| Formato nome entità | Come costruire i nomi delle entità HA a partire dall’import ETS, i cui nomi iniziano con il percorso dei gruppi, es. (Luci->Piano terra) Soggiorno. Opzioni: Come importato da ETS (predefinito), Prima il nome (Soggiorno (Luci->Piano terra)), Solo il nome (Soggiorno), Nome + indirizzo di gruppo (Soggiorno (0/1/2)). |
| Indirizzi di gruppo da esporre | Lista con checkbox di ogni indirizzo importato nel gateway (ETS). Gli indirizzi spuntati diventano entità HA, tipizzate automaticamente dal DPT (switch, sensor, binary_sensor, number, text). Filtro + Seleziona tutti / nessuno; tutti selezionati di default. Ogni riga ha inoltre l’opzione Sola lettura: un indirizzo in sola lettura viene comunque pubblicato su Home Assistant (stato visibile) ma non accetta mai comandi verso il bus KNX (gli switch diventano binary_sensor, i number diventano sensor). I pulsanti Imposta sola lettura / Togli sola lettura la applicano a tutti gli indirizzi mostrati. |
| Tapparelle e Termostati | Entità composite che aggregano più indirizzi (vedi sotto). |
Tapparelle e Termostati
Tapparelle e termostati combinano più indirizzi di gruppo in un’unica entità HA, quindi non possono essere dedotti da un singolo DPT - aggiungili nella lista:
- Tapparella: GA su/giù (1.008), GA stop opzionale (1.007), GA posizione comando/stato opzionale (5.001). Inverti posizione mappa KNX (0% = aperto) su Home Assistant (100% = aperto).
- Termostato: GA temperatura attuale (9.001), GA setpoint comando/stato (9.001), GA on/off opzionale (1.001 → off/heat), più temperatura min/max e step.
I tipi di datapoint vengono letti dall’import ETS se disponibili, altrimenti dai default KNX. Per uno stato affidabile, gli indirizzi usati da tapparelle/termostati dovrebbero essere presenti nell’import ETS.
Integrazione KNX nativa vs bridge MQTT. Se Home Assistant comunica già con KNX tramite la sua integrazione KNX nativa, tapparelle/clima si configurano lì con i group address e questo bridge MQTT non serve. Usa questa modalità quando è Node-RED a possedere il bus KNX e Home Assistant vede tutto via MQTT.
Riepilogo mappatura
| Campo | Scopo | Note |
|---|---|---|
| Label | Nome descrittivo | Appare nello status e in msg.bridge.label. |
| GA / DPT | Indirizzo di gruppo e datapoint | Puoi usare l’autocomplete ETS o inserirli a mano. |
| Direzione | KNX→IoT, IoT→KNX, Bidirezionale | Determina quali pin sono attivi. |
| Tipo canale | MQTT / REST / Modbus | Cambia il significato di Target. |
| Target | Topic, URL base o registro | Vuoto = usa outputtopic del nodo. |
| Template | Formattazione stringa | Segnaposto {{value}}, {{ga}}, {{type}}, {{target}}, {{label}}, {{isoTimestamp}}. |
| Scala / Offset | Conversione numerica | Applicata KNX→IoT; in IoT→KNX viene invertita. |
| Timeout / Tentativi | Suggerimenti pass-through | Servono ai nodi a valle per gestire ritentativi/timeouts. |
Trasporti tipici
MQTT broker
- Pubblicazione: collega l’uscita 1 al nodo core
mqtt out. Il bridge impostamsg.topicemsg.payloadgià pronti per il broker. - Sottoscrizione: collega un nodo
mqtt inall’ingresso del bridge. I payload sono convertiti secondo il DPT e scritti su KNX; l’ack sul pin 2 conferma la scrittura.REST API
- Invita l’uscita 1 nel nodo core
http request(o contrib comenode-red-contrib-http-request). - Il bridge propaga
bridge.methodinmsg.methode il template inmsg.payload, così puoi inviare JSON o form-data.Registri Modbus
- Abbinalo a
node-red-contrib-modbus(modbus-flex-write,modbus-write). - Usa
Targetcome indirizzo/registro Modbus. L’uscita 1 porta il valore inmsg.payloade i metadati inmsg.bridge.Flow di esempio
Stato KNX → MQTT
```json
[ { “id”: “bridge1”, “type”: “knxUltimateIoTBridge”, “z”: “flow1”, “server”: “gateway1”, “name”: “Bridge luci”, “emitOnChangeOnly”: true, “readOnDeploy”: true, “acceptFlowInput”: true, “mappings”: [ { “id”: “map-luce”, “enabled”: true, “label”: “Luce soggiorno”, “ga”: “1/1/10”, “dpt”: “1.001”, “direction”: “bidirectional”, “iotType”: “mqtt”, “target”: “knx/light/soggiorno”, “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 stato”, “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/soggiorno/set",
"qos": "1",
"datatype": "auto",
"broker": "mqttBroker",
"x": 140,
"y": 200,
"wires": [["bridge1"]]
}
]
Unisci i due snippet nello stesso flow per ottenere il round-trip KNX ↔ MQTT con ack.
Payload REST
{
"id": "bridge-rest",
"type": "knxUltimateIoTBridge",
"name": "Bridge contatore",
"mappings": [
{
"label": "Potenza attiva",
"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}}\"}"
}
]
}
Instrada l’uscita 1 verso http request e usa la risposta per log o retry basati su bridge.retry.
Scrittura Modbus
- Mappa con
Target = 40010,Tipo = Modbus,Direzione = Bidirezionale. - Collega l’uscita 1 a
modbus-flex-writedinode-red-contrib-modbus, assegnandomsg.payloadal campovaluedel nodo Modbus. - L’ack informa quando KNX è stato aggiornato dopo un comando proveniente dal registro.
Suggerimenti finali
- Se lasci
Targetvuoto puoi reindirizzare più mappature sullo stesso topic/endpoint tramiteoutputtopic. emitOnChangeOnlylimita il rumore dei sensori; disattivalo se serve ogni telegramma.- L’uscita 2 replica sempre il payload arrivato dal mondo IoT con i metadati
bridge: utile per il debug di scaling. - Per registri Modbus floating usa un
functionper comporre il formato richiesto dal dispositivo (16/32 bit). Buon bridging!
- Se lasci