Manufatura inteligente

Dashboard de Monitoramento de Linha de Produção com MQTT, Grafana e Node-RED

Um passo a passo para montar um dashboard de monitoramento de linha de produção: as estações publicam status e contagens via MQTT, o Telegraf armazena os dados e o Grafana ou o Node-RED os transforma em uma visão ao vivo da linha.

Dashboard de monitoramento de linha de produção com blocos de status das estações, contadores de peças e um medidor de OEE alimentados por dados MQTT
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 dashboard de monitoramento de linha de produção transforma sinais brutos das máquinas em uma única tela que diz aos supervisores se a linha está rodando, quantas peças boas já produziu e onde está perdendo tempo. Neste tutorial você vai publicar dados das estações via MQTT, armazená-los com Telegraf e InfluxDB e montar o dashboard no Grafana, com uma alternativa mais leve em Node-RED para linhas pequenas. Tudo roda contra um broker real, então você pode acompanhar a partir de um notebook.

O que um bom dashboard de linha de produção mostra

Antes de ligar qualquer coisa, decida o que a tela precisa responder. A maioria dos dashboards de linha fracassa porque exibe todas as tags que o CLP expõe, em vez das poucas perguntas que as pessoas realmente fazem durante um turno.

Pergunta no chão de fábrica Sinal necessário Widget típico
Cada estação está rodando agora? state (RUNNING, IDLE, DOWN, SETUP) Blocos de status com código de cores
Estamos dentro do plano do turno? Contagem de boas, contagem planejada Número grande mais barra de progresso
De onde vem o refugo? Contagem de rejeitos por estação Gráfico de barras por estação
Qual estação é o gargalo? Taxa real vs. taxa ideal Tabela ordenada pela diferença de taxa
Qual a saúde geral da linha? Disponibilidade, desempenho, qualidade Medidor de OEE com três sub-barras
O que nos parou na última hora? Mudanças de estado com timestamps Linha do tempo de estados

Mantenha a primeira versão nessas seis. Os supervisores vão pedir mais quando confiarem nos números, e a confiança vem de as contagens baterem com o que eles veem no chão de fábrica.

Arquitetura: da estação à tela

O caminho dos dados é curto e cada peça é substituível:

  1. Cada estação (gateway do CLP, PC de borda ou microcontrolador) publica uma pequena mensagem JSON de status em um broker MQTT sempre que seu estado muda e pelo menos a cada poucos segundos.
  2. O Telegraf assina os topics da linha e grava cada mensagem no InfluxDB como série temporal.
  3. O Grafana consulta o InfluxDB e renderiza os painéis.
  4. Opcionalmente, um fluxo Node-RED assina os mesmos topics e alimenta um dashboard leve em uma TV ao lado da linha.

O broker é o hub que desacopla as estações dos consumidores. Se esse papel for novo para você, este artigo sobre o que um broker MQTT faz cobre o básico. Como cada consumidor assina de forma independente, você pode adicionar depois um historiador, um painel andon ou uma calculadora de OEE sem mexer nas estações.

Passo 1: projete a estrutura de topics

Uma árvore de topics previsível economiza horas depois. Use uma hierarquia no estilo ISA-95 para que o dashboard possa filtrar por linha e estação com wildcards:

connectmq/demo/<your-id>/line1/<station>/status

Por exemplo connectmq/demo/a7f3k9/line1/filler/status. O payload é um único objeto JSON:

{
  "state": "RUNNING",
  "good": 1842,
  "reject": 17,
  "rate": 58.5,
  "ideal_rate": 60,
  "ts": 1792137600
}

As contagens são cumulativas no turno, o que torna os dados robustos: se uma mensagem se perder, a próxima ainda traz o total correto. As taxas são em peças por minuto. Adicione um nível de empresa e de site antes da linha quando expandir para mais de uma planta, por exemplo uma unidade em Joinville e outra em Manaus.

Passo 2: simule as estações

Para montar o dashboard antes de a linha real estar conectada, rode este simulador em Python. Ele usa paho-mqtt 2.x e o servidor MQTT público gratuito em broker.connectmq.com. Troque a7f3k9 pelo seu próprio ID aleatório, porque a área pública pode ser lida por todos.

import json
import random
import time

import paho.mqtt.client as mqtt

PREFIX = "connectmq/demo/a7f3k9/line1"
STATIONS = {"filler": 60, "capper": 62, "labeler": 65, "packer": 58}

client = mqtt.Client(mqtt.CallbackAPIVersion.VERSION2, client_id="line1-sim-a7f3k9")
client.connect("broker.connectmq.com", 1883, keepalive=30)
client.loop_start()

counters = {name: {"good": 0, "reject": 0, "state": "RUNNING"} for name in STATIONS}

try:
    while True:
        for name, ideal in STATIONS.items():
            c = counters[name]
            # De vez em quando muda o estado para deixar o dashboard interessante
            roll = random.random()
            if c["state"] == "RUNNING" and roll < 0.03:
                c["state"] = random.choice(["DOWN", "IDLE"])
            elif c["state"] != "RUNNING" and roll < 0.25:
                c["state"] = "RUNNING"

            rate = 0.0
            if c["state"] == "RUNNING":
                rate = round(ideal * random.uniform(0.85, 1.0), 1)
                made = int(rate / 12)  # aproximadamente 5 segundos de produção
                rejects = 1 if random.random() < 0.04 else 0
                c["good"] += made - rejects
                c["reject"] += rejects

            payload = {
                "state": c["state"],
                "good": c["good"],
                "reject": c["reject"],
                "rate": rate,
                "ideal_rate": ideal,
                "ts": int(time.time()),
            }
            client.publish(f"{PREFIX}/{name}/status", json.dumps(payload), qos=1, retain=True)
        time.sleep(5)
except KeyboardInterrupt:
    client.loop_stop()
    client.disconnect()

Quatro estações publicando a cada cinco segundos ficam bem dentro do limite do servidor público de 10 mensagens por segundo por cliente. A flag retain faz com que um dashboard que conecta no meio do turno receba imediatamente o último estado conhecido de cada estação. Verifique o fluxo em um terminal:

mosquitto_sub -h broker.connectmq.com -p 1883 -i viewer-a7f3k9 -t "connectmq/demo/a7f3k9/line1/+/status" -v

Passo 3: armazene os dados com Telegraf e InfluxDB

O consumidor MQTT do Telegraf transforma cada mensagem em um ponto do InfluxDB, e o parsing de topics extrai a linha e a estação como tags. Salve como telegraf.conf:

[agent]
  interval = "5s"
  flush_interval = "5s"

[[inputs.mqtt_consumer]]
  servers = ["tcp://broker.connectmq.com:1883"]
  topics = ["connectmq/demo/a7f3k9/line1/+/status"]
  client_id = "telegraf-a7f3k9"
  qos = 1
  data_format = "json"
  json_string_fields = ["state"]
  json_time_key = "ts"
  json_time_format = "unix"

  [[inputs.mqtt_consumer.topic_parsing]]
    topic = "connectmq/demo/+/+/+/status"
    measurement = "_/_/_/_/_/measurement"
    tags = "_/_/_/line/station/_"

[[outputs.influxdb_v2]]
  urls = ["http://localhost:8086"]
  token = "YOUR_INFLUX_TOKEN"
  organization = "plant"
  bucket = "line"

Cada ponto cai no measurement status com as tags line=line1 e station=filler, mais os campos state, good, reject, rate e ideal_rate. Em produção, troque o servidor para ssl://broker.connectmq.com:8883 e adicione username = "YOUR_USERNAME", password = "YOUR_PASSWORD" e o seu client_id emitido. Mais opções estão no guia do consumidor MQTT do Telegraf.

Passo 4: monte o dashboard de monitoramento de linha de produção no Grafana

Adicione o InfluxDB como fonte de dados no Grafana (linguagem de consulta Flux) e crie estes painéis.

Blocos de status das estações. Use um painel Stat com mapeamento de valores: RUNNING para verde, IDLE para amarelo, DOWN para vermelho, SETUP para azul.

from(bucket: "line")
  |> range(start: -5m)
  |> filter(fn: (r) => r._measurement == "status" and r._field == "state")
  |> last()
  |> group(columns: ["station"])

Peças boas neste turno. Como as contagens são cumulativas, o último valor é o total:

from(bucket: "line")
  |> range(start: today())
  |> filter(fn: (r) => r._measurement == "status" and r._field == "good" and r.station == "packer")
  |> last()

Use a última estação da linha (aqui a embaladora) como produção da linha; contar em todas as estações gera contagem dupla.

Taxa vs. ideal. Um painel Time series com rate e ideal_rate por estação mostra o gargalo de relance: a estação cuja taxa real fica mais abaixo da ideal enquanto está rodando.

Linha do tempo de estados. O painel State timeline do Grafana alimentado pelo campo state dá uma barra por estação colorida pelo estado ao longo do turno, que é a forma mais rápida de ver quando e onde a linha parou.

Medidor de OEE. Numa primeira versão, calcule o OEE em um subscriber separado e publique o resultado em line1/oee, depois faça o gráfico desse topic. A matemática está explicada em como calcular o OEE, e o tutorial de monitoramento de OEE em tempo real traz um subscriber pronto. Fazer o cálculo uma única vez, fora do Grafana, mantém todas as telas mostrando o mesmo número.

Alternativa em Node-RED para uma única linha

Se você só precisa de uma TV ao lado de uma linha e não quer um banco de séries temporais, o Node-RED é mais rápido. Configure um nó de configuração mqtt-broker com servidor broker.connectmq.com e porta 1883 (ou 8883 com TLS e suas credenciais em produção) e depois adicione:

  1. Um nó mqtt in assinando connectmq/demo/a7f3k9/line1/+/status, com saída configurada como objeto JSON já interpretado.
  2. Um nó function que extrai o nome da estação de msg.topic.split("/")[4] e o encaminha para o widget certo.
  3. Widgets ui-text do Dashboard 2.0 para o estado, widgets ui-gauge para a taxa e um ui-chart para as contagens de boas.

A contrapartida é o histórico: o Node-RED mostra bem o presente, mas não é um historiador. Muitas plantas rodam os dois, com o Node-RED no painel da linha e o Grafana para a revisão do turno. O artigo sobre dashboard de OEE no Node-RED aprofunda essa abordagem.

Armadilhas comuns e como corrigi-las

  • Contagens zeram no meio do turno. Um reinício do CLP ou do gateway limpa o contador. Guarde a linha de base do turno na borda, ou faça o dashboard usar difference() com nonNegative: true para que os resets não criem produção negativa.
  • Blocos mostram um RUNNING desatualizado. Se uma estação fica offline, sua mensagem retida continua dizendo RUNNING. Adicione o campo ts ao bloco e pinte-o de cinza quando tiver mais de 30 segundos, ou use uma mensagem Last Will do MQTT que publique OFFLINE.
  • Client IDs duplicados. Duas instâncias do Telegraf com o mesmo client ID vão se derrubar mutuamente o tempo todo. Cada cliente precisa de um ID único.
  • Painéis demais. Se a tela precisa de rolagem na TV do chão de fábrica, está carregada demais. Leve os detalhes para um dashboard de drill-down.

Do demo à produção

O servidor público é perfeito para construir, mas seus topics ficam visíveis para qualquer pessoa. Para uma linha real, migre para um broker privado: um broker MQTT gerenciado elimina o trabalho de atualizar e escalar um servidor, e um broker MQTT na nuvem permite que supervisores remotos e a matriz vejam o mesmo dashboard. Com o ConnectMQ você cria o broker no portal, recebe usuário, senha e client ID e muda apenas as configurações de conexão no simulador, no Telegraf e no Node-RED. O explorador de topics ao vivo do portal é útil para confirmar que todas as estações estão publicando antes de depurar um painel vazio no Grafana.

O plano Serverless gratuito suporta até 25 conexões, o que cobre uma linha piloto com seu gateway, o Telegraf e alguns dashboards. Plantas maiores costumam migrar para o plano Serverless pago ou para um cluster Dedicated conforme mais linhas entram em operação. Para a estratégia mais ampla, incluindo o caminho até um gêmeo digital da fábrica, veja o guia de manufatura inteligente.

Comece com o ConnectMQ

Crie um broker gratuito em app.connectmq.com no plano Serverless, sem cartão de crédito, aponte suas estações e o Telegraf para ele e tenha hoje mesmo um dashboard de linha de produção rodando em infraestrutura privada.

Perguntas frequentes

Devo usar Grafana ou Node-RED para um dashboard de linha de produção?

Use o Grafana quando precisar de histórico, comparações entre turnos e muitos usuários; use o Node-RED para um painel ao vivo rápido em uma linha. Muitas equipes rodam os dois a partir dos mesmos topics MQTT.

Com que frequência as estações devem publicar status?

Publique imediatamente a cada mudança de estado e envie um heartbeat a cada 5 a 10 segundos. Isso mantém os blocos atualizados sem inundar o broker.

Posso conectar CLPs diretamente?

A maioria dos CLPs precisa de um gateway de borda (Node-RED, um conversor de protocolo ou o cliente MQTT do próprio CLP) que lê as tags e publica JSON no broker. Depois que os dados estão no MQTT, o dashboard não se importa com a origem.

O servidor público é seguro para dados reais de produção?

Não. A área pública do broker.connectmq.com pode ser lida por qualquer pessoa, então use-a apenas para testes e leve os dados de produção para um broker ConnectMQ privado com credenciais e TLS.

Artigos relacionados

OEE vs TEEP vs OOE: qual indicador você deve usar?

OEE, OOE e TEEP compartilham os mesmos fatores de desempenho e qualidade, mas medem contra bases de tempo diferentes. Esta comparação resolve um único exemplo e lista os sinais MQTT de que cada indicador precisa.

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.