Automação IoT

Tutorial do Binding MQTT do openHAB: Bridge do Broker, Generic Things e Regras

Conecte o openHAB a um broker MQTT externo, modele sensores e interruptores como generic MQTT things, interprete payloads JSON e publique a partir de regras, com uma configuração TLS pronta para produção.

Binding MQTT do openHAB conectando uma thing de bridge do broker a sensores e interruptores por meio de um broker MQTT na nuvem
Rode isso no seu próprio broker MQTTTenha um broker MQTT privado e gerenciado no plano Free e comece com exemplos de código prontos.
Teste grátis Exemplos de código Sem cartão de crédito

O binding MQTT do openHAB transforma qualquer tópico MQTT em canais que você pode vincular a items, exibir em dashboards e usar em regras. Neste tutorial você vai conectar o openHAB a um broker externo, definir generic MQTT things para um sensor e um interruptor de estufa (pense em uma estufa de hortaliças no interior de São Paulo), interpretar payloads JSON, publicar comandos a partir de regras e reforçar a configuração com TLS e credenciais.

Como o Binding MQTT do openHAB É Organizado

O openHAB modela o MQTT em duas camadas. A broker bridge (mqtt:broker) é a conexão: host, porta, TLS, client ID e credenciais. Abaixo dela ficam as things, cada uma descrevendo um dispositivo pelos seus tópicos. O tipo de thing mais flexível é a generic MQTT thing (mqtt:topic), na qual você declara cada canal e os tópicos de estado e de comando que ele usa. Os items então se vinculam a esses canais exatamente como fariam com qualquer outro binding.

Camada Tipo de thing Contém
Conexão mqtt:broker (bridge) Host, porta, TLS, client ID, usuário, senha, last will
Dispositivo mqtt:topic (generic thing) Canais com tópicos de estado e de comando
Dispositivo (automático) Things Home Assistant ou Homie Criadas a partir de mensagens de discovery
Modelo Items Vinculados a canais, usados na UI e em regras

Uma única broker bridge pode atender centenas de things e usa apenas uma conexão MQTT. Isso importa em planos com cotas de conexão: o openHAB conta como um único cliente, não importa quantos dispositivos ele modele.

Instale o binding em Settings > Add-on Store > Bindings > MQTT Binding. Se seus dispositivos enviam JSON, instale também a JSONPath Transformation na seção de transformações.

Conectando o openHAB a um Broker MQTT

Você pode criar a bridge pela UI (Things > + > MQTT Binding > MQTT Broker) ou em um arquivo .things. A configuração em texto é mais fácil de compartilhar e de fazer backup, por isso este tutorial a utiliza. Crie conf/things/mqtt.things:

Bridge mqtt:broker:connectmq "ConnectMQ Broker" [
    host="broker.connectmq.com",
    port=1883,
    secure=false,
    clientID="openhab-r4t8w1",
    lwtTopic="connectmq/demo/r4t8w1/openhab/status",
    lwtMessage="offline",
    lwtRetain=true,
    birthTopic="connectmq/demo/r4t8w1/openhab/status",
    birthMessage="online",
    birthRetain=true
] {
    Thing topic greenhouse "Greenhouse Sensor" {
    Channels:
        Type number : temperature "Temperature" [
            stateTopic="connectmq/demo/r4t8w1/greenhouse/telemetry",
            transformationPattern="JSONPATH:$.temp",
            unit="°C"
        ]
        Type number : humidity "Humidity" [
            stateTopic="connectmq/demo/r4t8w1/greenhouse/telemetry",
            transformationPattern="JSONPATH:$.hum",
            unit="%"
        ]
        Type switch : fan "Vent Fan" [
            stateTopic="connectmq/demo/r4t8w1/greenhouse/fan/state",
            commandTopic="connectmq/demo/r4t8w1/greenhouse/fan/set",
            on="ON",
            off="OFF"
        ]
        Type contact : door "Door" [
            stateTopic="connectmq/demo/r4t8w1/greenhouse/door",
            on="OPEN",
            off="CLOSED"
        ]
    }
}

Isso se conecta ao servidor MQTT público (gratuito) de forma anônima. Substitua r4t8w1 por uma string aleatória sua, porque o servidor MQTT público é compartilhado, pode ser lido por todos e serve apenas para testes e protótipos. O client ID não pode ser vazio e deve ser único; reutilizar um que outro cliente já esteja usando fará as duas conexões caírem repetidamente.

Verifique Settings > Things: a bridge deve ficar ONLINE em poucos segundos, seguida pela thing greenhouse.

Vinculando items

Crie conf/items/greenhouse.items:

Number:Temperature GH_Temperature "Temperature [%.1f °C]" <temperature> { channel="mqtt:topic:connectmq:greenhouse:temperature" }
Number:Dimensionless GH_Humidity "Humidity [%.0f %%]" <humidity> { channel="mqtt:topic:connectmq:greenhouse:humidity" }
Switch GH_Fan "Vent Fan" <fan> { channel="mqtt:topic:connectmq:greenhouse:fan" }
Contact GH_Door "Door [%s]" <door> { channel="mqtt:topic:connectmq:greenhouse:door" }

Observe o padrão do UID do canal: mqtt:topic:<bridge id>:<thing id>:<channel id>. Um erro de digitação ali é o motivo mais comum de um item continuar NULL.

Testando os Canais MQTT do openHAB

Simule o dispositivo a partir de um terminal:

# leitura do sensor (JSON interpretado pelo JSONPath)
mosquitto_pub -h broker.connectmq.com -p 1883 -i sim-r4t8w1 \
  -t 'connectmq/demo/r4t8w1/greenhouse/telemetry' -m '{"temp":24.6,"hum":71}'

# contato da porta
mosquitto_pub -h broker.connectmq.com -p 1883 -i sim-r4t8w1 \
  -t 'connectmq/demo/r4t8w1/greenhouse/door' -m 'OPEN'

# acompanhe os comandos que o openHAB envia
mosquitto_sub -h broker.connectmq.com -p 1883 -i mon-r4t8w1 \
  -t 'connectmq/demo/r4t8w1/greenhouse/fan/set' -v

Alterne o ventilador na UI do openHAB e o comando ON ou OFF aparece na janela do assinante. Um dispositivo real executaria o comando e publicaria seu novo estado em fan/state, que o openHAB usa para atualizar o item. Manter os tópicos de comando e de estado separados faz a UI mostrar o estado confirmado, e não apenas o último clique.

Interpretando JSON e Formatando Comandos

A maioria dos dispositivos modernos publica JSON. Além de transformationPattern para valores de entrada, a generic thing suporta formatBeforePublish para os de saída. Por exemplo, um dimmer que espera {"brightness": 40}:

Type dimmer : lamp "Grow Lamp" [
    stateTopic="connectmq/demo/r4t8w1/greenhouse/lamp/state",
    commandTopic="connectmq/demo/r4t8w1/greenhouse/lamp/set",
    transformationPattern="JSONPATH:$.brightness",
    formatBeforePublish="{\"brightness\": %s}",
    min=0,
    max=100
]

As transformações podem ser encadeadas com o caractere ∩ no padrão se você precisar de várias etapas, por exemplo JSONPath seguido de uma consulta MAP. Mantenha as cadeias curtas; quando a lógica cresce, uma regra é mais fácil de depurar.

Publicando Mensagens MQTT a partir de Regras do openHAB

Comandos vinculados a canais cobrem a maioria das necessidades, mas às vezes você quer publicar em um tópico arbitrário, por exemplo para enviar uma programação a um controlador. A broker bridge expõe a ação publishMQTT para isso. Em um arquivo de regras DSL conf/rules/greenhouse.rules:

rule "Greenhouse overheat"
when
    Item GH_Temperature changed
then
    val temp = (GH_Temperature.state as QuantityType<Number>).toUnit("°C").doubleValue
    if (temp > 30.0 && GH_Fan.state != ON) {
        GH_Fan.sendCommand(ON)
        val mqtt = getActions("mqtt", "mqtt:broker:connectmq")
        mqtt.publishMQTT("connectmq/demo/r4t8w1/greenhouse/event",
            "{\"event\":\"overheat\",\"temp\":" + temp + "}", false)
    }
end

A mesma ação está disponível em regras JavaScript por meio de actions.get("mqtt", "mqtt:broker:connectmq"). Evite publicar no mesmo tópico que um canal assina, a menos que você queira criar um loop.

Disparando regras a partir de tópicos brutos

Se você só quer reagir a uma mensagem sem modelar um item, adicione um canal de gatilho à bridge:

Bridge mqtt:broker:connectmq "ConnectMQ Broker" [ ... ] {
    Channels:
        Type publishTrigger : alarms "Alarms" [
            stateTopic="connectmq/demo/r4t8w1/+/alarm",
            separator="#"
        ]
}

Uma regra disparada por Channel "mqtt:broker:connectmq:alarms" triggered recebe o tópico e o payload unidos pelo separador, de modo que uma única regra pode tratar os alarmes de todos os dispositivos.

Configuração de Produção com TLS e Credenciais

Antes de conectar dispositivos reais, saia do servidor MQTT público. Crie um broker privado e atualize a bridge:

Bridge mqtt:broker:connectmq "ConnectMQ Broker" [
    host="broker.connectmq.com",
    port=8883,
    secure=true,
    certificatepin=false,
    publickeypin=false,
    clientID="YOUR_CLIENT_ID",
    username="YOUR_USERNAME",
    password="YOUR_PASSWORD",
    lwtTopic="site1/openhab/status",
    lwtMessage="offline",
    lwtRetain=true
]

O certificado da ConnectMQ é emitido pela Let's Encrypt, na qual o Java confia por padrão, então não é preciso importar nenhum certificado extra. O certificate pinning é desativado explicitamente porque os certificados Let's Encrypt são renovados a cada poucos meses; um certificado fixado faria a bridge rejeitar o broker após a próxima renovação. Use o client ID exatamente como foi emitido, já que ele está vinculado às credenciais. Para saber mais sobre como proteger o sistema inteiro, leia as boas práticas de segurança MQTT.

Se preferir rodar o broker localmente dentro da rede do openHAB, você ainda pode fazer bridge com a nuvem depois, mas um broker MQTT gerenciado elimina a necessidade de manter um host separado para o broker e permite que locais remotos e celulares alcancem os mesmos tópicos.

Exibindo a Disponibilidade dos Dispositivos

Uma generic thing continua ONLINE enquanto a bridge estiver conectada, mesmo que o dispositivo por trás dela tenha perdido energia há horas. Para tornar isso visível, faça cada dispositivo publicar uma mensagem online retida ao se conectar e defina um last will offline retido. Depois adicione as configurações de disponibilidade à thing:

Thing topic greenhouse "Greenhouse Sensor" [
    availabilityTopic="connectmq/demo/r4t8w1/greenhouse/status",
    payloadAvailable="online",
    payloadNotAvailable="offline"
] {
    // canais como antes
}

Quando o dispositivo cai, o broker publica o will dele, o openHAB marca a thing como OFFLINE e os items vinculados ficam UNDEF. Regras e dashboards conseguem então distinguir "o sensor está lendo 0" de "o sensor sumiu", o que faz toda a diferença para qualquer coisa que controle aquecimento, irrigação ou alarmes.

Checklist de Solução de Problemas

  1. A bridge continua OFFLINE. Verifique host e porta, e se secure=true está definido apenas com a porta 8883. Procure o reason code em openhab.log.
  2. A bridge oscila entre ONLINE e OFFLINE. Client ID duplicado; outra instância do openHAB ou ferramenta de teste usa o mesmo.
  3. Thing ONLINE, mas item NULL. UID de canal errado no item, erro de digitação no tópico ou o add-on JSONPath está faltando. Use log:set DEBUG org.openhab.binding.mqtt no console para ver cada mensagem recebida.
  4. O interruptor mostra UNDEF. O payload não corresponde exatamente a on ou off; os valores diferenciam maiúsculas de minúsculas.
  5. Os comandos não fazem nada. Garanta que o dispositivo escute no tópico de comando e que você não esteja publicando no tópico de estado dele.

Onde o openHAB se Encaixa em um Sistema Maior

O openHAB é um consumidor no broker, não o dono dos dados. Nós ESPHome, tomadas Tasmota e o Zigbee2MQTT podem todos publicar no mesmo broker, e outras ferramentas podem ler os mesmos tópicos. O tutorial de ESPHome MQTT mostra como publicar a partir de dispositivos configurados em YAML, e o Tasmota MQTT aborda tomadas inteligentes com firmware gravado. Para o panorama arquitetural mais amplo, veja o guia de automação com IoT. E se você ainda está comparando brokers, a visão geral sobre broker MQTT na nuvem explica os prós e contras.

Rode o openHAB em um Broker ConnectMQ

A ConnectMQ oferece um broker MQTT gerenciado e privado, com MQTT 3.1.1 e 5.0, TLS, credenciais geradas e um explorador de tópicos ao vivo que torna simples depurar os canais do openHAB. Crie um broker no plano Serverless (Free) em app.connectmq.com, sem cartão de crédito, cole as credenciais na sua bridge e suas things do openHAB estarão online.

Perguntas frequentes

O openHAB inclui um broker MQTT próprio?

Não. As versões atuais do openHAB fornecem apenas o binding cliente, então você precisa de um broker externo, como uma instância local do Mosquitto ou um broker na nuvem como a ConnectMQ.

O openHAB pode usar MQTT 5?

A broker bridge tem um parâmetro mqttVersion que pode ser definido como V5. A versão 3.1.1 continua sendo o padrão e funciona com quase todos os dispositivos.

Quantas conexões MQTT o openHAB usa?

Uma por broker bridge, independentemente de quantas generic things estejam sob ela. Isso o torna eficiente em planos com limite de conexões.

Por que meus items atualizam, mas os comandos não são enviados?

Provavelmente o canal não tem commandTopic, ou o item está vinculado como somente leitura. Adicione um tópico de comando e confirme com um assinante que a mensagem está sendo publicada.

Artigos relacionados

Guia de Configuração do Zigbee2MQTT: do Coordenador ao Painel

Instale o Zigbee2MQTT com Docker, configure o coordenador e a conexão MQTT, pareie e renomeie dispositivos, controle-os via MQTT e veja seus estados em um painel, testando primeiro no servidor MQTT público (gratuito).

8 min de leitura

Todos os artigos →

Seu broker MQTT privado está a poucos cliques de distância

Crie uma conta, receba as credenciais do seu broker e conecte seu primeiro dispositivo — sem servidores para instalar, atualizar ou escalar.