Raspberry Pi

IOTstack no Raspberry Pi: Node-RED, InfluxDB e Grafana com um Broker MQTT na Nuvem

Use o IOTstack para rodar Node-RED, InfluxDB e Grafana em Docker em um Raspberry Pi, dispense o contêiner local do Mosquitto e conecte o Node-RED a um broker MQTT externo na nuvem.

Contêineres Docker de Node-RED, InfluxDB e Grafana rodando com IOTstack no Raspberry Pi, conectados a 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

Uma instalação do IOTstack no Raspberry Pi entrega Node-RED, InfluxDB e Grafana como contêineres Docker que você pode reconstruir, atualizar e fazer backup com poucos comandos. Neste tutorial você vai instalar o IOTstack, selecionar os contêineres de que precisa, conectar o Node-RED a um broker MQTT externo em vez de um contêiner local do Mosquitto, armazenar leituras no InfluxDB e criar gráficos no Grafana. Ao final, você terá uma stack reproduzível e uma ideia clara do que deve ficar no Pi e do que não deve.

O que é o IOTstack e por que ele ajuda

O IOTstack é um projeto da comunidade que envolve o Docker Compose em um menu. Você escolhe os serviços em uma lista, ele gera um docker-compose.yml com volumes e portas sensatos e você inicia tudo com um único comando. As vantagens em relação a instalar cada ferramenta nativamente são reais:

  • Isolamento. A versão do Node.js do Node-RED não entra em conflito com mais nada no Pi.
  • Reprodutibilidade. A stack inteira é descrita em um arquivo mais uma pasta volumes. Copie os dois para um novo Pi e você volta a operar.
  • Atualizações limpas. Baixe uma imagem mais nova, recrie o contêiner e volte atrás se algo der errado.

O menu também oferece um contêiner do Mosquitto, e muitos guias o instalam por reflexo. Pense se você precisa dele. Um broker local só atende dispositivos que conseguem alcançar o Pi. Se seus sensores estão em mais de um lugar, se você quer acessar os dados pelo celular sem abrir portas ou se simplesmente não quer manter a segurança do broker por conta própria, um broker externo é a melhor escolha. Aqui usamos o broker na nuvem da ConnectMQ, e o Pi se torna um nó puro de processamento e armazenamento.

Serviço Contêiner neste tutorial Porta
Node-RED Sim 1880
InfluxDB 1.8 Sim 8086
Grafana Sim 3000
Portainer CE Opcional 9000
Mosquitto Não, substituído por um broker na nuvem n/a

Instale o IOTstack no Raspberry Pi

Comece com o Raspberry Pi OS Lite ou Desktop, 64 bits, totalmente atualizado. O instalador do IOTstack configura o Docker, o plugin do Compose e a pasta do IOTstack no seu diretório home:

sudo apt update && sudo apt full-upgrade -y
curl -fsSL https://raw.githubusercontent.com/SensorsIot/IOTstack/master/install.sh | bash

O script pode pedir uma reinicialização para que seu usuário entre no grupo docker. Depois de reiniciar, confira se o Docker funciona sem sudo:

docker version
docker compose version

Em seguida, abra o menu:

cd ~/IOTstack
./menu.sh

Escolha Build Stack e use a barra de espaço para selecionar nodered, influxdb e grafana (e portainer-ce, se você gosta de uma interface web para contêineres). Ao selecionar o Node-RED, o menu oferece nós adicionais. Marque node-red-contrib-influxdb e node-red-dashboard (ou o pacote mais novo do Dashboard 2.0, se aparecer na lista). Deixe mosquitto desmarcado. Saia do menu e inicie a stack:

cd ~/IOTstack
docker compose up -d
docker ps --format 'table {{.Names}}\t{{.Status}}\t{{.Ports}}'

Os três contêineres devem aparecer como Up. Os dados ficam em ~/IOTstack/volumes/, uma pasta por serviço.

Crie o banco de dados no InfluxDB

O serviço influxdb do IOTstack é o InfluxDB 1.8, que usa InfluxQL e não tem assistente de configuração. Crie um banco de dados e uma política de retenção de dentro do contêiner:

docker exec -it influxdb influx
CREATE DATABASE sensors
CREATE RETENTION POLICY "ninety_days" ON "sensors" DURATION 90d REPLICATION 1 DEFAULT
SHOW DATABASES
exit

Contêineres do mesmo projeto Compose compartilham uma rede e se alcançam pelo nome do serviço. É por isso que o Node-RED e o Grafana vão usar http://influxdb:8086, e não localhost.

Conecte o Node-RED a um broker MQTT externo

Abra o Node-RED em http://<pi-ip>:1880. Arraste um nó mqtt in para a área de trabalho e edite o servidor:

  • Server: broker.connectmq.com
  • Port: 1883 para testes no servidor público
  • Protocol: MQTT V5 (ou 3.1.1)
  • Client ID: algo único e não vazio, por exemplo iotstack-nr-5d02e8
  • Topic: connectmq/demo/5d02e8/+/climate
  • Output: um objeto JSON já interpretado

O servidor público não exige credenciais, então você pode testar imediatamente. Lembre-se de que o servidor MQTT público pode ser lido por qualquer pessoa e serve para testes, não para dados de produção; é por isso que o topic contém um segmento aleatório. Se você é novo nos nós MQTT do Node-RED, o tutorial de Node-RED com MQTT cobre o nó de configuração em profundidade.

O fluxo do Node-RED: do MQTT para o InfluxDB

Importe o fluxo abaixo em Menu, Import. Ele assina o topic de clima de todos os cômodos, extrai o nome do cômodo do topic e grava um ponto no InfluxDB.

[
  {
    "id": "mqttIn1",
    "type": "mqtt in",
    "name": "climate in",
    "topic": "connectmq/demo/5d02e8/+/climate",
    "qos": "1",
    "datatype": "json",
    "broker": "broker1",
    "nl": false,
    "rap": true,
    "rh": 0,
    "inputs": 0,
    "x": 140, "y": 100,
    "wires": [["toPoint1"]]
  },
  {
    "id": "toPoint1",
    "type": "function",
    "name": "to InfluxDB point",
    "func": "const room = msg.topic.split('/')[3];\nconst p = msg.payload;\nif (typeof p.t !== 'number') { return null; }\nmsg.measurement = 'climate';\nmsg.payload = [\n  { temperature: p.t, humidity: p.rh },\n  { room: room }\n];\nreturn msg;",
    "outputs": 1,
    "x": 360, "y": 100,
    "wires": [["influxOut1"]]
  },
  {
    "id": "influxOut1",
    "type": "influxdb out",
    "influxdb": "influxCfg1",
    "name": "write sensors",
    "measurement": "",
    "precision": "",
    "retentionPolicy": "",
    "x": 580, "y": 100,
    "wires": []
  },
  {
    "id": "broker1",
    "type": "mqtt-broker",
    "name": "ConnectMQ public",
    "broker": "broker.connectmq.com",
    "port": "1883",
    "clientid": "iotstack-nr-5d02e8",
    "autoConnect": true,
    "usetls": false,
    "protocolVersion": "5",
    "keepalive": "60",
    "cleansession": true
  },
  {
    "id": "influxCfg1",
    "type": "influxdb",
    "hostname": "influxdb",
    "port": "8086",
    "database": "sensors",
    "name": "IOTstack InfluxDB",
    "influxdbVersion": "1.x"
  }
]

O nó function retorna um array de dois objetos, primeiro os campos e depois as tags, que é o formato que o node-red-contrib-influxdb espera para um único ponto com tags. Faça o deploy e publique uma leitura de teste:

mosquitto_pub -h broker.connectmq.com -p 1883 -i tester-5d02e8 -q 1 \
  -t connectmq/demo/5d02e8/office/climate -m '{"t":22.4,"rh":41}'

Confira se ela chegou:

docker exec -it influxdb influx -database sensors \
  -execute 'SELECT * FROM climate ORDER BY time DESC LIMIT 5'

Grafana no IOTstack do Raspberry Pi

Abra o Grafana em http://<pi-ip>:3000, faça login com a conta admin padrão e troque a senha. Adicione uma fonte de dados:

  1. Connections, Data sources, Add, InfluxDB.
  2. Linguagem de consulta: InfluxQL.
  3. URL: http://influxdb:8086.
  4. Database: sensors. Não é preciso usuário nem senha com a configuração padrão do IOTstack.
  5. Save and test.

Crie um dashboard com um painel Time series e esta consulta:

SELECT mean("temperature") FROM "climate"
WHERE $timeFilter
GROUP BY time($__interval), "room" fill(none)

Digite $tag_room no campo ALIAS do editor de consulta e você terá uma linha claramente identificada por cômodo. Se preferir o InfluxDB 2 e o Flux, o IOTstack também oferece um serviço influxdb2; o tutorial de Grafana e InfluxDB no Raspberry Pi mostra o lado do Flux em detalhe.

Produção: credenciais de broker privado e TLS

Em implantações reais, substitua o servidor público por um broker privado. Em um broker MQTT gerenciado como a ConnectMQ, você cria um broker no portal e recebe usuário, senha e client ID. No Node-RED, edite o nó de configuração mqtt-broker:

  • Porta 8883, marque Use TLS e adicione uma configuração TLS com Verify server certificate ativado. A ConnectMQ usa um certificado Let's Encrypt, então nenhum arquivo de CA personalizado é necessário.
  • Client ID: YOUR_CLIENT_ID. A ConnectMQ vincula os client IDs às credenciais emitidas, então use exatamente o que aparece no portal.
  • Aba Security: YOUR_USERNAME e YOUR_PASSWORD.

O Node-RED armazena as credenciais criptografadas em flows_cred.json, dentro de ~/IOTstack/volumes/nodered/data. Defina um credentialSecret no settings.js da mesma pasta para que a chave de criptografia permaneça estável quando o contêiner for reconstruído.

Backups e atualizações

A força do IOTstack é que tudo o que importa está em dois lugares: docker-compose.yml e volumes/. Uma rotina simples:

  1. Pare a stack brevemente com docker compose stop (ou use os scripts de backup do IOTstack, se você os instalou).
  2. Compacte a pasta: sudo tar czf ~/iotstack-$(date +%F).tgz -C ~ IOTstack/docker-compose.yml IOTstack/volumes.
  3. Inicie novamente com docker compose up -d e copie o arquivo para fora do Pi.

Para atualizar as imagens:

cd ~/IOTstack
docker compose pull
docker compose up -d
docker image prune -f

Fixe as tags das imagens no docker-compose.yml para os serviços em que uma atualização de versão principal inesperada causaria problemas, especialmente o InfluxDB.

Solução de problemas

Sintoma Causa Correção
O nó MQTT do Node-RED fica em "connecting" Porta ou configuração TLS errada 1883 sem TLS, 8883 com TLS
O Node-RED mostra "disconnected" logo depois de conectar Client ID duplicado Cada cliente precisa de seu próprio ID
Erro no nó InfluxDB ENOTFOUND influxdb Host definido como localhost Use o nome do serviço, influxdb
Grafana mostra "database not found" Banco de dados não criado Execute CREATE DATABASE sensors
Os contêineres param depois de reiniciar Falta a política de reinício O IOTstack define restart: unless-stopped; confira o arquivo

Comece com a ConnectMQ

Deixe o IOTstack cuidar do processamento e um broker MQTT gerenciado cuidar das conexões. Crie uma conta gratuita em app.connectmq.com, escolha o plano Serverless sem cartão de crédito e cole as credenciais geradas no nó de configuração do Node-RED. Mais projetos com o Pi estão reunidos no tutorial de MQTT com Raspberry Pi.

Perguntas frequentes

Preciso do contêiner do Mosquitto no IOTstack?

Só se todos os dispositivos estiverem na mesma rede local e você quiser o broker no Pi. Com um broker externo na nuvem, o Node-RED assina pela internet e você evita manter a segurança do broker no Pi.

Qual versão do InfluxDB o IOTstack usa?

O serviço influxdb é o InfluxDB 1.8 com InfluxQL, e um serviço separado, influxdb2, oferece a versão 2 com Flux. Escolha uma e mantenha-se nela, já que as configurações do Node-RED e do Grafana são diferentes.

Posso rodar o IOTstack em um Raspberry Pi OS de 32 bits?

Algumas imagens ainda publicam builds de 32 bits, mas o suporte está diminuindo. Um sistema de 64 bits evita a maioria dos problemas de compatibilidade de imagens.

Como mover o IOTstack para um novo Raspberry Pi?

Instale o IOTstack no novo Pi, pare-o, restaure o seu docker-compose.yml e a pasta volumes e execute docker compose up -d.

Artigos relacionados

Registro de Acessos Raspberry Pi RFID MQTT com o Leitor RC522

Ligue um leitor RFID RC522 a um Raspberry Pi, leia tags em Python, confira-as em uma lista de permissões local e publique cada tentativa de acesso como um evento MQTT que loggers, dashboards e ferramentas de alerta podem consumir.

8 min de leitura

Confiabilidade do Raspberry Pi: Rodando um Pi 24/7 como Gateway IoT

Um guia prático para manter um gateway MQTT com Raspberry Pi rodando por meses: desgaste do armazenamento, sistemas de arquivos somente leitura, alimentação, refrigeração, watchdogs de hardware e software e monitoramento remoto de saúde.

9 min de leitura

Pico W vs Pico 2 W para MQTT: Desempenho, Memória e TLS do RP2040 vs RP2350

O Pico 2 W mantém o formato e o chip Wi-Fi do Pico W, mas troca o RP2040 pelo RP2350, mais rápido. Esta comparação mostra o que isso significa para dispositivos MQTT: CPU, memória, TLS, recursos de segurança, suporte de software e qual placa comprar para cada projeto.

9 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.