Node-RED

Alerta por e-mail no Node-RED com dados MQTT: limites, histerese e detecção de silêncio

Envie alertas por e-mail quando valores MQTT ultrapassarem um limite, sem lotar sua caixa de entrada. Este tutorial monta um flow Node-RED com histerese, cooldown, watchdog de dispositivo silencioso e configuração SMTP, e o compara com as regras de alerta por limite do ConnectMQ.

Flow de alerta por e-mail no Node-RED enviando uma notificação quando um valor de temperatura MQTT ultrapassa um limite
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

Um alerta por e-mail no Node-RED é uma das formas mais simples de ser avisado quando um valor de sensor publicado via MQTT sai da faixa. Neste tutorial você vai montar um flow que observa um topic de temperatura, envia um e-mail quando ela ultrapassa um limite, evita enviar dezenas de duplicatas e também avisa quando um dispositivo para de publicar de vez.

O que vamos construir

O flow final faz quatro coisas:

  1. Assina um topic de sensor em um broker MQTT.
  2. Decide se o valor está em estado de alarme, usando um limite alto e um limite de rearme mais baixo (histerese), para que um valor oscilando no limite não dispare e-mails repetidos.
  3. Envia um e-mail quando o alarme começa e outro quando ele é normalizado, com um cooldown para que um sensor instável não lote sua caixa de entrada.
  4. Envia um e-mail separado se nenhuma mensagem chegar por dez minutos, porque um sensor morto muitas vezes é mais perigoso do que uma leitura alta.

Nos exemplos usamos o servidor MQTT público gratuito em broker.connectmq.com com o prefixo de topic connectmq/demo/k7f3qa. Escolha sua própria string aleatória em vez de k7f3qa e lembre-se de que a área pública pode ser lida por qualquer pessoa e serve apenas para testes. O cenário é uma estufa, como as de produtores de hortaliças e flores no interior paulista.

Instalando o node de e-mail

O Node-RED não vem com um node de e-mail. Instale-o em Menu → Manage palette → Install pesquisando node-red-node-email, ou pela linha de comando no diretório de usuário do Node-RED:

cd ~/.node-red
npm install node-red-node-email
# depois reinicie o Node-RED

O pacote adiciona um node de saída e-mail, que envia via SMTP, e um node de entrada de e-mail, que lê uma caixa postal. Precisamos apenas do node de saída. O comportamento dele é simples: msg.payload vira o corpo, msg.topic vira o assunto e, se o campo To do node ficar vazio, msg.to define o destinatário.

Configurações SMTP que realmente funcionam

Provedor Servidor Porta Conexão segura Observações
Gmail / Google Workspace smtp.gmail.com 465 Ativada Exige verificação em duas etapas e uma senha de app
Microsoft 365 smtp.office365.com 587 Desativada (usa STARTTLS) O SMTP AUTH precisa estar liberado para a caixa postal
Serviço transacional (SendGrid, Mailgun, SES) Host do provedor 465 ou 587 Conforme o provedor Melhor entregabilidade para e-mails automáticos
Relay local (Postfix) localhost 25 Desativada Só se você já roda um relay

Com o Gmail, não use sua senha normal. Crie uma senha de app nas configurações de segurança da sua conta Google e cole-a no node. Para qualquer coisa além de um projeto pessoal, um serviço de e-mail transacional com domínio de envio verificado oferece melhor entregabilidade, porque e-mails de alerta automáticos enviados de uma caixa pessoal caem facilmente nos filtros de spam.

Montando o flow de alerta por e-mail no Node-RED

O flow é: mqtt in → function (lógica de alarme) → e-mail, mais um ramo com um node trigger para detecção de silêncio. Se você nunca ligou nodes MQTT, o tutorial Node-RED MQTT explica o node de configuração do broker em detalhes.

Passo 1: assine o sensor

Adicione um node mqtt in com:

  • Servidor: broker.connectmq.com, porta 1883, um client ID único como nr-alerts-k7f3qa
  • Topic: connectmq/demo/k7f3qa/greenhouse/temperature
  • Saída: auto-detect (objeto JSON analisado ou string)

Passo 2: a lógica de alarme

Um switch node simples que verifica payload > 30 envia um e-mail para cada leitura acima de 30. Se o sensor reporta a cada dez segundos, são 360 e-mails por hora. Em vez disso, guarde o estado no contexto do node e só emita nas transições. Coloque isto em um function node:

const HIGH = 30;          // dispara o alarme neste valor ou acima
const RESET = 28;         // normaliza o alarme neste valor ou abaixo
const COOLDOWN_MS = 15 * 60 * 1000;  // tempo mínimo entre e-mails

let value = msg.payload;
if (typeof value === "object" && value !== null) value = value.value;
value = Number(value);
if (isNaN(value)) return null;

const inAlarm = context.get("inAlarm") || false;
const lastSent = context.get("lastSent") || 0;
const now = Date.now();

let event = null;
if (!inAlarm && value >= HIGH) event = "raised";
if (inAlarm && value <= RESET) event = "cleared";
if (!event) return null;

context.set("inAlarm", event === "raised");

// Sempre reporta a normalização, mas limita a taxa de novos alarmes
if (event === "raised" && now - lastSent < COOLDOWN_MS) {
    node.status({ fill: "yellow", shape: "ring", text: "alarm suppressed (cooldown)" });
    return null;
}
context.set("lastSent", now);

node.status({
    fill: event === "raised" ? "red" : "green",
    shape: "dot",
    text: event + " at " + value
});

msg.topic = event === "raised"
    ? `ALARM: greenhouse temperature ${value} C`
    : `Cleared: greenhouse temperature back to ${value} C`;

msg.payload =
    `Greenhouse temperature ${event}.\n\n` +
    `Current value: ${value} C\n` +
    `Alarm limit: ${HIGH} C, reset limit: ${RESET} C\n` +
    `Time: ${new Date(now).toISOString()}\n` +
    `Source topic: connectmq/demo/k7f3qa/greenhouse/temperature\n`;

return msg;

A diferença entre HIGH e RESET é a faixa de histerese. Um valor oscilando entre 29,8 e 30,2 dispara uma vez e permanece em alarme até realmente cair para 28.

Passo 3: configure o node de e-mail

Ligue a saída do function node a um node de e-mail. Preencha destinatário, servidor, porta, conexão segura, usuário e senha conforme a tabela acima. Faça o deploy, e o status do node mostra se o login SMTP deu certo na primeira vez que uma mensagem passar por ele.

Passo 4: detecte dispositivos silenciosos

Adicione um segundo fio do node mqtt in para um node trigger configurado assim:

  • Send: nothing
  • Then: wait for 10 minutos, com extend delay if new message arrives marcado
  • Then send: uma string como No data from greenhouse sensor for 10 minutes

Cada leitura recebida reinicia o temporizador, então o trigger só dispara quando o sensor fica em silêncio. Envie a saída dele para um change node que define msg.topic como linha de assunto e, em seguida, para o mesmo node de e-mail.

Testando sem esperar uma onda de calor

Publique valores de teste em um terminal:

# normal
mosquitto_pub -h broker.connectmq.com -p 1883 -i test-k7f3qa -t "connectmq/demo/k7f3qa/greenhouse/temperature" -m "24.5"
# dispara o alarme
mosquitto_pub -h broker.connectmq.com -p 1883 -i test-k7f3qa -t "connectmq/demo/k7f3qa/greenhouse/temperature" -m "31.2"
# ainda alto, nenhum e-mail novo
mosquitto_pub -h broker.connectmq.com -p 1883 -i test-k7f3qa -t "connectmq/demo/k7f3qa/greenhouse/temperature" -m "30.4"
# normaliza
mosquitto_pub -h broker.connectmq.com -p 1883 -i test-k7f3qa -t "connectmq/demo/k7f3qa/greenhouse/temperature" -m "27.0"

Você deve receber exatamente dois e-mails. Durante os testes, reduza temporariamente COOLDOWN_MS e o atraso do trigger, e coloque um debug node em paralelo com o node de e-mail para ver o que seria enviado sem acionar o servidor SMTP toda vez.

Solução de problemas na entrega de e-mails

Problema O que verificar
O node mostra "Invalid login" Use uma senha de app no Gmail; verifique se o SMTP AUTH está ativado nas caixas do Microsoft 365
Timeout de conexão A porta 25, e às vezes 465/587, é bloqueada por alguns provedores de internet e de nuvem; tente a outra porta ou um serviço transacional
Erro "Self signed certificate" Combinação errada de porta e conexão segura, por exemplo conexão segura ativada na 587
E-mails caem no spam Envie de um domínio com SPF e DKIM configurados e evite assuntos todo em maiúsculas
Um e-mail por leitura O function node não está guardando estado; garanta que você retorne null quando não há transição
Nenhum e-mail após reiniciar com o valor alto O contexto fica na memória por padrão; isso é esperado, a próxima leitura reavalia o estado

Se você precisa que o estado de alarme sobreviva a uma reinicialização do Node-RED, ative um armazenamento de contexto persistente no settings.js e use context.get("inAlarm", "file"). O guia de contexto do Node-RED explica as opções.

Alertas por e-mail no Node-RED vs regras de alerta por limite do ConnectMQ

Se seus dispositivos publicam em um broker ConnectMQ, você já tem uma segunda opção. O portal inclui regras de alerta por limite e um log de alertas: você escolhe um topic, define um limite e cada ultrapassagem fica registrada onde você e sua equipe podem revisá-la, sem rodar nenhum software extra.

As duas abordagens se complementam:

Necessidade Regras de alerta do portal Flow de e-mail no Node-RED
Limite simples em um topic Sim, configurado no portal Sim
Histórico de alertas em um só lugar Log de alertas no portal Você constrói, por exemplo com Node-RED e MySQL
Lógica customizada (histerese, condições combinadas, horários) Apenas regras de limite Tudo o que você conseguir escrever em JavaScript
Entrega em caixa de entrada, chat ou SMS Não é o propósito do log de alertas Node de e-mail, além do Telegram ou de outros nodes de notificação
Nenhum servidor extra para manter Sim Precisa de uma instância do Node-RED

Um padrão comum é configurar regras de limite no portal para visibilidade e auditoria e rodar ao lado um pequeno flow Node-RED para as poucas condições que precisam chegar ao celular de alguém à noite. Como o Node-RED é só mais um cliente MQTT, os dois leem os mesmos topics do mesmo broker. Esse é o formato geral das integrações com um broker MQTT gerenciado: o broker transporta as mensagens com confiabilidade, e ferramentas externas assinam e agem sobre elas.

Checklist de produção

  1. Saia do servidor público e use suas próprias credenciais (YOUR_USERNAME, YOUR_PASSWORD, YOUR_CLIENT_ID) na porta 8883 com TLS.
  2. Guarde as senhas SMTP nas credenciais do node, nunca em um function node ou em um arquivo de flow que você versiona no git.
  3. Use QoS 1 na assinatura para que uma desconexão breve não descarte silenciosamente a leitura que ultrapassa o limite.
  4. Mantenha o watchdog de silêncio; ele detecta baterias descarregadas, quedas de Wi-Fi e gateways travados.
  5. Envie para um endereço de grupo ou lista de distribuição em vez de uma única pessoa.
  6. Teste a cadeia completa todo mês publicando um valor alto falso.

Comece com o ConnectMQ

Os alertas são tão confiáveis quanto o broker que entrega as leituras. O ConnectMQ oferece um broker MQTT gerenciado com TLS, MQTT 5 e alertas por limite no portal, e seus flows Node-RED se conectam a ele como qualquer outro cliente. Crie um broker Serverless gratuito em app.connectmq.com, sem cartão de crédito, e em poucos minutos você leva este flow do servidor público para credenciais privadas.

Perguntas frequentes

Qual node do Node-RED envia e-mail?

O node de saída e-mail do pacote node-red-node-email. Instale-o pelo gerenciador de paleta e depois defina msg.payload para o corpo e msg.topic para o assunto.

Como faço o Node-RED parar de enviar um e-mail para cada leitura?

Guarde o estado de alarme no contexto e só envie nas transições, adicione um limite de rearme abaixo do limite de alarme para ter histerese e imponha um cooldown entre e-mails de alarme, como no function node acima.

O ConnectMQ pode enviar o e-mail no lugar do Node-RED?

O portal oferece regras de alerta por limite e um log de alertas. Para entregar notificações em uma caixa de entrada, rode um cliente como o Node-RED, que assina o broker e envia o e-mail.

Por que o Gmail rejeita o login do meu Node-RED?

O Google bloqueia senhas normais para SMTP a partir de aplicativos. Ative a verificação em duas etapas, gere uma senha de app e use-a no node de e-mail com smtp.gmail.com na porta 465 e conexão segura.

Artigos relacionados

Node-RED Dashboard 2.0 com MQTT: gauges, gráficos e controles

Um tutorial prático do Node-RED Dashboard 2.0: assine telemetria MQTT ao vivo, exiba-a em gauges e em um gráfico de linha e controle um dispositivo com um switch que publica comandos e reflete o estado real.

9 min de leitura

Cliente OPC UA no Node-RED para MQTT com topics ISA-95

Use o node-red-contrib-opcua para assinar variáveis OPC UA em um CLP ou servidor de simulação, mapear node IDs para topics MQTT no estilo ISA-95 e publicar os valores com qualidade e timestamps.

10 min de leitura

Histórico de gráficos no Node-RED: mantenha os dados MQTT após reinicializações

Os gráficos do Dashboard esquecem tudo quando o Node-RED reinicia. Este guia mostra duas formas confiáveis de manter o histórico de gráficos no Node-RED para dados MQTT: armazenamento de contexto em arquivo e uma pequena tabela SQLite, ambos reenviados ao Dashboard 2.0 na inicialização.

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.