Raspberry Pi

IOTstack en Raspberry Pi: Node-RED, InfluxDB y Grafana con un broker MQTT en la nube

Usa IOTstack para ejecutar Node-RED, InfluxDB y Grafana en Docker en una Raspberry Pi, prescinde del contenedor local de Mosquitto y conecta Node-RED a un broker MQTT externo en la nube.

Contenedores Docker de Node-RED, InfluxDB y Grafana ejecutándose con IOTstack en Raspberry Pi y conectados a un broker MQTT en la nube
Pruébalo en tu propio broker MQTTConsigue un broker MQTT privado y gestionado con el plan Free y empieza con ejemplos de código listos para usar.
Pruébalo gratis Ejemplos de código Sin tarjeta

Una instalación de IOTstack en Raspberry Pi te da Node-RED, InfluxDB y Grafana como contenedores Docker que puedes reconstruir, actualizar y respaldar con unos pocos comandos. En este tutorial instalarás IOTstack, seleccionarás los contenedores que necesitas, conectarás Node-RED a un broker MQTT externo en lugar de a un contenedor local de Mosquitto, guardarás las lecturas en InfluxDB y las graficarás en Grafana. Al final tendrás un stack reproducible y una idea clara de qué debe estar en la Pi y qué no.

Qué es IOTstack y por qué ayuda

IOTstack es un proyecto comunitario que envuelve Docker Compose en un menú. Eliges servicios de una lista, genera un docker-compose.yml con volúmenes y puertos sensatos y lo arrancas todo con un solo comando. Las ventajas frente a instalar cada herramienta de forma nativa son reales:

  • Aislamiento. La versión de Node.js de Node-RED no puede entrar en conflicto con nada más en la Pi.
  • Reproducibilidad. Todo el stack se describe en un archivo más una carpeta volumes. Copia ambos a una Pi nueva y vuelves a estar en marcha.
  • Actualizaciones limpias. Descarga una imagen más reciente, recrea el contenedor y vuelve atrás si algo falla.

El menú también ofrece un contenedor de Mosquitto, y muchas guías lo instalan por inercia. Piensa si lo necesitas. Un broker local solo sirve a los dispositivos que pueden llegar a la Pi. Si tus sensores están en más de un lugar, si quieres acceder a los datos desde el móvil sin abrir puertos o si simplemente no quieres mantener tú mismo la seguridad del broker, un broker externo es mejor opción. Aquí usamos el broker en la nube de ConnectMQ, y la Pi se convierte en un nodo puro de procesamiento y almacenamiento.

Servicio Contenedor en este tutorial Puerto
Node-RED Sí 1880
InfluxDB 1.8 Sí 8086
Grafana Sí 3000
Portainer CE Opcional 9000
Mosquitto No, se sustituye por un broker en la nube n/a

Instalar IOTstack en la Raspberry Pi

Parte de Raspberry Pi OS Lite o Desktop, de 64 bits y totalmente actualizado. El instalador de IOTstack configura Docker, el plugin de Compose y la carpeta de IOTstack en tu directorio personal:

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

El script puede pedirte que reinicies para que tu usuario se una al grupo docker. Tras reiniciar, comprueba que Docker funciona sin sudo:

docker version
docker compose version

Después abre el menú:

cd ~/IOTstack
./menu.sh

Elige Build Stack y usa la barra espaciadora para seleccionar nodered, influxdb y grafana (y portainer-ce si te gusta tener una interfaz web para los contenedores). Al seleccionar Node-RED, el menú ofrece nodos adicionales. Marca node-red-contrib-influxdb y node-red-dashboard (o el paquete más reciente Dashboard 2.0 si aparece). Deja mosquitto sin seleccionar. Sal del menú y arranca el stack:

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

Los tres contenedores deberían mostrar Up. Los datos se guardan en ~/IOTstack/volumes/, una carpeta por servicio.

Crear la base de datos de InfluxDB

El servicio influxdb de IOTstack es InfluxDB 1.8, que usa InfluxQL y no tiene asistente de configuración. Crea una base de datos y una política de retención desde dentro del contenedor:

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

Los contenedores del mismo proyecto Compose comparten una red y se alcanzan entre sí por nombre de servicio. Por eso Node-RED y Grafana usarán http://influxdb:8086 y no localhost.

Conectar Node-RED a un broker MQTT externo

Abre Node-RED en http://<pi-ip>:1880. Arrastra un nodo mqtt in al lienzo y edita su servidor:

  • Server: broker.connectmq.com
  • Port: 1883 para probar en el servidor público
  • Protocol: MQTT V5 (o 3.1.1)
  • Client ID: algo único y no vacío, por ejemplo iotstack-nr-5d02e8
  • Topic: connectmq/demo/5d02e8/+/climate
  • Output: un objeto JSON ya interpretado

El servidor público no necesita credenciales, así que puedes probar de inmediato. Recuerda que cualquiera puede leer el servidor MQTT público gratuito, pensado para pruebas y no para datos de producción; por eso el topic contiene un segmento aleatorio. Si eres nuevo con los nodos MQTT de Node-RED, el tutorial de Node-RED y MQTT explica a fondo el nodo de configuración.

El flujo de Node-RED: de MQTT a InfluxDB

Importa el flujo siguiente con Menu, Import. Se suscribe al topic de clima de cada habitación, extrae el nombre de la habitación del topic y escribe un punto en 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"
  }
]

El nodo function devuelve un array de dos objetos, primero los campos y después las etiquetas, que es el formato que node-red-contrib-influxdb espera para un único punto con etiquetas. Haz Deploy y publica una lectura de prueba:

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}'

Comprueba que ha llegado:

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

Grafana con IOTstack en Raspberry Pi

Abre Grafana en http://<pi-ip>:3000, inicia sesión con la cuenta admin predeterminada y cambia la contraseña. Añade una fuente de datos:

  1. Connections, Data sources, Add, InfluxDB.
  2. Lenguaje de consulta: InfluxQL.
  3. URL: http://influxdb:8086.
  4. Database: sensors. No hace falta usuario ni contraseña con la configuración predeterminada de IOTstack.
  5. Save and test.

Crea un dashboard con un panel Time series y esta consulta:

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

Escribe $tag_room en el campo ALIAS del editor de consultas y obtendrás una línea claramente etiquetada por habitación. Si prefieres InfluxDB 2 y Flux, IOTstack también ofrece un servicio influxdb2; el tutorial de Grafana e InfluxDB en Raspberry Pi muestra en detalle la parte de Flux.

Producción: credenciales de broker privado y TLS

Para despliegues reales, sustituye el servidor público por un broker privado. En un broker MQTT gestionado como ConnectMQ, creas un broker en el portal y recibes un usuario, una contraseña y un client ID. En Node-RED, edita el nodo de configuración mqtt-broker:

  • Puerto 8883, marca Use TLS y añade una configuración TLS con Verify server certificate activado. ConnectMQ usa un certificado de Let's Encrypt, así que no necesitas ningún archivo de CA personalizado.
  • Client ID: YOUR_CLIENT_ID. ConnectMQ vincula los client ID a las credenciales emitidas, así que usa exactamente el que muestra el portal.
  • Pestaña Security: YOUR_USERNAME y YOUR_PASSWORD.

Node-RED guarda las credenciales cifradas en flows_cred.json dentro de ~/IOTstack/volumes/nodered/data. Define un credentialSecret en settings.js, en la misma carpeta, para que la clave de cifrado se mantenga estable al reconstruir el contenedor.

Copias de seguridad y actualizaciones

La fortaleza de IOTstack es que todo lo que te importa está en dos sitios: docker-compose.yml y volumes/. Una rutina sencilla:

  1. Detén el stack brevemente con docker compose stop (o usa los scripts de copia de seguridad de IOTstack si los instalaste).
  2. Archiva la carpeta: sudo tar czf ~/iotstack-$(date +%F).tgz -C ~ IOTstack/docker-compose.yml IOTstack/volumes.
  3. Vuelve a arrancar con docker compose up -d y copia el archivo fuera de la Pi.

Para actualizar las imágenes:

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

Fija las etiquetas de imagen en docker-compose.yml para los servicios en los que una actualización mayor inesperada haría daño, sobre todo InfluxDB.

Solución de problemas

Síntoma Causa Solución
El nodo MQTT de Node-RED se queda en "connecting" Puerto o ajuste TLS incorrectos 1883 sin TLS, 8883 con TLS
Node-RED muestra "disconnected" justo después de conectar Client ID duplicado Cada cliente necesita su propio ID
Error del nodo InfluxDB ENOTFOUND influxdb Host configurado como localhost Usa el nombre de servicio influxdb
Grafana indica "database not found" Base de datos no creada Ejecuta CREATE DATABASE sensors
Los contenedores se detienen tras reiniciar Falta la política de reinicio IOTstack define restart: unless-stopped; revisa el archivo

Empieza con ConnectMQ

Deja que IOTstack se encargue del procesamiento y que un broker MQTT gestionado gestione las conexiones. Crea una cuenta gratuita en app.connectmq.com, elige el plan Serverless sin tarjeta de crédito y pega las credenciales generadas en el nodo de configuración de Node-RED. Más proyectos con la Pi en el tutorial de MQTT con Raspberry Pi.

Preguntas frecuentes

¿Necesito el contenedor de Mosquitto en IOTstack?

Solo si todos los dispositivos están en la misma red local y quieres el broker en la Pi. Con un broker externo en la nube, Node-RED se suscribe a través de internet y te ahorras mantener la seguridad del broker en la Pi.

¿Qué versión de InfluxDB usa IOTstack?

El servicio influxdb es InfluxDB 1.8 con InfluxQL, y un servicio influxdb2 aparte ofrece la versión 2 con Flux. Elige uno y mantente con él, porque la configuración de Node-RED y Grafana es distinta.

¿Puedo ejecutar IOTstack en Raspberry Pi OS de 32 bits?

Algunas imágenes todavía publican versiones de 32 bits, pero el soporte se está reduciendo. Un sistema operativo de 64 bits evita la mayoría de los problemas de compatibilidad de imágenes.

¿Cómo traslado IOTstack a una Raspberry Pi nueva?

Instala IOTstack en la Pi nueva, detenlo, restaura tu docker-compose.yml y la carpeta volumes, y ejecuta docker compose up -d.

Artículos relacionados

Fiabilidad de la Raspberry Pi: cómo usar una Pi 24/7 como gateway IoT

Una guía práctica para mantener un gateway MQTT con Raspberry Pi funcionando durante meses: desgaste del almacenamiento, sistemas de archivos de solo lectura, alimentación, refrigeración, watchdogs de hardware y software y monitorización remota de la salud.

9 min de lectura

Pico W vs Pico 2 W para MQTT: rendimiento, memoria y TLS de RP2040 frente a RP2350

La Pico 2 W mantiene el formato y el chip Wi-Fi de la Pico W, pero sustituye el RP2040 por el RP2350, más rápido. Esta comparativa analiza qué significa para los dispositivos MQTT: CPU, memoria, TLS, funciones de seguridad, soporte de software y qué placa comprar para cada proyecto.

9 min de lectura

Registro de accesos Raspberry Pi RFID MQTT con el lector RC522

Conecta un lector RFID RC522 a una Raspberry Pi, lee etiquetas en Python, compáralas con una lista blanca local y publica cada intento de acceso como un evento MQTT que pueden consumir registradores, dashboards y herramientas de alertas.

8 min de lectura

Todos los artículos →

Tu broker MQTT privado, a unos pocos clics

Crea una cuenta, obtén las credenciales de tu broker y conecta tu primer dispositivo, sin servidores que instalar, parchear ni escalar.