Ir al contenido

Guía de Configuración del Entorno de Demostración

Guía de Configuración del Entorno de Demostración

Esta sección proporciona una guía paso a paso para configurar un entorno completo de demostración IoT. Al finalizar esta sección, podrás:

  • Desplegar toda la pila de backend IoT en menos de 10 minutos usando Docker Compose
  • Verificar que cada componente funcione correctamente
  • Realizar pruebas básicas de publicación-suscripción MQTT
  • Acceder a las interfaces de Node-RED, InfluxDB y Grafana
  • Preparar el entorno para demostraciones con clientes

Antes de comenzar, asegúrate de tener lo siguiente:

  • Docker (versión 24.0 o más reciente): Instalar Docker
  • Docker Compose (versión 2.20 o más reciente): Incluido con Docker Desktop, o instalado por separado en Linux
  • Una computadora con al menos 4 GB de RAM y 10 GB de espacio libre en disco
  • Conexión a Internet para descargar las imágenes de los contenedores (primera configuración: ~1 GB de descarga)
  • Placa ESP32 (opcional para pruebas iniciales, las herramientas cliente MQTT pueden simular dispositivos)

Abre una terminal y ejecuta:

Ventana de terminal
docker --version
docker compose version

Salida esperada (las versiones pueden variar):

Docker version 27.0.0, build abcdef1
Docker Compose version v2.29.0

Si Docker no está instalado, descarga Docker Desktop desde docker.com y sigue el asistente de instalación.

Crea un directorio para el entorno de demostración:

Ventana de terminal
mkdir ~/iot-demo
cd ~/iot-demo

Paso 2: Crear la Configuración de Docker Compose

Sección titulada «Paso 2: Crear la Configuración de Docker Compose»

Crea un archivo llamado docker-compose.yml en el directorio ~/iot-demo:

version: "3.8"
services:
# Broker MQTT
mosquitto:
image: eclipse-mosquitto:2
container_name: mosquitto
ports:
- "1883:1883"
- "8883:8883"
volumes:
- ./mosquitto/config:/mosquitto/config
- ./mosquitto/data:/mosquitto/data
- ./mosquitto/log:/mosquitto/log
restart: unless-stopped
# Motor de Automatización Node-RED
nodered:
image: nodered/node-red:4
container_name: nodered
ports:
- "1880:1880"
volumes:
- ./nodered/data:/data
environment:
- TZ=UTC
restart: unless-stopped
depends_on:
- mosquitto
# Base de Datos de Series de Tiempo InfluxDB
influxdb:
image: influxdb:2
container_name: influxdb
ports:
- "8086:8086"
volumes:
- ./influxdb/data:/var/lib/influxdb2
- ./influxdb/config:/etc/influxdb2
environment:
- DOCKER_INFLUXDB_INIT_MODE=setup
- DOCKER_INFLUXDB_INIT_USERNAME=admin
- DOCKER_INFLUXDB_INIT_PASSWORD=admin123
- DOCKER_INFLUXDB_INIT_ORG=iot-demo
- DOCKER_INFLUXDB_INIT_BUCKET=sensor-data
- DOCKER_INFLUXDB_INIT_RETENTION=30d
restart: unless-stopped
# Visualización Grafana
grafana:
image: grafana/grafana:11
container_name: grafana
ports:
- "3000:3000"
volumes:
- ./grafana/data:/var/lib/grafana
- ./grafana/config:/etc/grafana
environment:
- GF_SECURITY_ADMIN_USER=admin
- GF_SECURITY_ADMIN_PASSWORD=admin123
- GF_INSTALL_PLUGINS=
restart: unless-stopped
depends_on:
- influxdb

Notas de configuración:

  • El broker MQTT se expone en el puerto 1883 (sin cifrar) para desarrollo local. Para producción, usa el puerto 8883 con TLS.
  • InfluxDB se inicializa con una organización, un bucket y credenciales de demostración. Deben cambiarse para producción.
  • Grafana está preconfigurado con credenciales de administrador. Cámbialas para cualquier uso que no sea de demostración.
  • Todos los servicios usan volúmenes persistentes para que los datos sobrevivan a los reinicios de los contenedores.

Paso 3: Crear la Configuración de Mosquitto

Sección titulada «Paso 3: Crear la Configuración de Mosquitto»

Crea el directorio y el archivo de configuración de Mosquitto:

Ventana de terminal
mkdir -p mosquitto/config

Crea mosquitto/config/mosquitto.conf:

Ventana de terminal
# Configuración de Mosquitto para la Demo IoT
listener 1883
protocol mqtt
# Permitir acceso anónimo para fines de demostración
allow_anonymous true
# Persistencia
persistence true
persistence_location /mosquitto/data/
# Registro de logs
log_dest file /mosquitto/log/mosquitto.log
log_dest stdout
log_type all
# Conexiones máximas
max_connections 1000

Nota de seguridad importante: La configuración anterior permite acceso anónimo para fines de demostración. En cualquier implementación de producción o expuesta a Internet, siempre:

  • Establece allow_anonymous false
  • Configura autenticación de usuario/contraseña
  • Usa cifrado TLS (ver Sección 16 para más detalles)

Crea los directorios de datos:

Ventana de terminal
mkdir -p mosquitto/data mosquitto/log

Inicia todos los servicios:

Ventana de terminal
cd ~/iot-demo
docker compose up -d

Docker descargará todas las imágenes (solo la primera vez) e iniciará los contenedores. Esto normalmente toma de 2 a 5 minutos según la velocidad de Internet.

Salida esperada:

[+] Running 5/5
✔ Container mosquitto Started
✔ Container influxdb Started
✔ Container nodered Started
✔ Container grafana Started

Verifica el estado de todos los contenedores:

Ventana de terminal
docker compose ps

Salida esperada:

NAME IMAGE STATUS PORTS
mosquitto eclipse-mosquitto:2 Up 2 minutes 0.0.0.0:1883->1883/tcp, 0.0.0.0:8883->8883/tcp
nodered nodered/node-red:4 Up 2 minutes 0.0.0.0:1880->1880/tcp
influxdb influxdb:2 Up 2 minutes 0.0.0.0:8086->8086/tcp
grafana grafana/grafana:11 Up 2 minutes 0.0.0.0:3000->3000/tcp

InfluxDB se inicializa automáticamente con las credenciales especificadas en docker-compose.yml. Para verificarlo:

  1. Abre un navegador y ve a http://localhost:8086
  2. Inicia sesión con el usuario admin y la contraseña admin123
  3. Deberías ver la interfaz de InfluxDB mostrando el bucket sensor-data

Si la configuración automática no se completó (la inicialización inicial puede ser sensible al tiempo), complétala manualmente:

  1. Haz clic en “Get Started”
  2. Ingresa: Usuario admin, Contraseña admin123, Organización iot-demo, Bucket sensor-data
  3. Haz clic en “Continue”

Obtén el token de la API (necesario para que Node-RED escriba datos):

Ventana de terminal
docker exec influxdb influx auth list --org iot-demo

Copia la cadena del token (un valor hexadecimal largo). Guárdalo — lo necesitarás al configurar Node-RED en secciones posteriores.

  1. Abre un navegador y ve a http://localhost:1880
  2. Deberías ver la interfaz del editor de flujos de Node-RED
  3. No hay autenticación configurada por defecto (en producción, habilita la autenticación de administrador)

Prueba rápida de verificación:

  1. Arrastra un nodo “Inject” (desde la paleta izquierda) al espacio de trabajo
  2. Arrastra un nodo “Debug” al espacio de trabajo
  3. Conecta la salida del nodo Inject a la entrada del nodo Debug
  4. Haz clic en el botón “Deploy” (arriba a la derecha)
  5. Haz clic en el botón del lado izquierdo del nodo Inject
  6. Revisa la barra lateral de Debug (panel derecho) — deberías ver mensajes con timestamp apareciendo
  1. Abre un navegador y ve a http://localhost:3000
  2. Inicia sesión con el usuario admin y la contraseña admin123
  3. Grafana te pedirá cambiar la contraseña — haz clic en “Skip” para fines de demostración

Agregar InfluxDB como fuente de datos:

  1. Ve a Connections → Data Sources → Add data source
  2. Busca y selecciona “InfluxDB”
  3. Configura:
    • Query Language: Flux
    • URL: http://influxdb:8086 (usa el nombre del servicio Docker, no localhost)
    • Organization: iot-demo
    • Token: (pega el token del Paso 5)
    • Default Bucket: sensor-data
  4. Haz clic en “Save & Test” — deberías ver una confirmación de “Data source is working”

Para verificar que el broker MQTT funciona, usa herramientas de línea de comandos MQTT o MQTT Explorer.

Instala los clientes MQTT si aún no están disponibles:

Ventana de terminal
# macOS
brew install mosquitto
# Ubuntu/Debian
sudo apt-get install mosquitto-clients

En una terminal, suscríbete a un topic de prueba:

Ventana de terminal
mosquitto_sub -h localhost -p 1883 -t "demo/test" -v

En otra terminal, publica un mensaje de prueba:

Ventana de terminal
mosquitto_pub -h localhost -p 1883 -t "demo/test" -m '{"message":"Hello IoT Demo","timestamp":1712345678}'

La terminal del suscriptor debería mostrar:

demo/test {"message":"Hello IoT Demo","timestamp":1712345678}

MQTT Explorer es una aplicación de escritorio gratuita que proporciona una interfaz visual:

  1. Descarga e instala MQTT Explorer
  2. Crea una nueva conexión:
    • Host: localhost
    • Port: 1883
    • Sin usuario/contraseña (anónimo)
  3. Haz clic en “Connect”
  4. Verás una vista en vivo de todos los topics a medida que los datos fluyen por el broker
  5. También puedes publicar mensajes de prueba directamente desde la interfaz

Paso 9: Simular Datos de Sensores (Node-RED)

Sección titulada «Paso 9: Simular Datos de Sensores (Node-RED)»

Para demostrar el flujo de datos sin hardware físico, crea un flujo de sensor simulado en Node-RED:

  1. En Node-RED, crea un nuevo flujo haciendo clic en ”+” junto al nombre de la pestaña
  2. Agrega estos nodos:
    • Nodo Inject (configurado para repetirse cada 10 segundos)
    • Nodo Function (para generar valores aleatorios de sensor)
    • Nodo MQTT Out (para publicar en el broker)

Configura el nodo Inject:

  • Payload: timestamp
  • Repeat: interval, cada 10 segundos
  • Name: Every 10s

Configura el nodo Function con este código JavaScript:

// Genera datos aleatorios de sensor simulando un ESP32
const sensorData = {
device_id: "esp32_sim_01",
temperature: Math.round((20 + Math.random() * 15) * 10) / 10, // 20-35°C
humidity: Math.round((40 + Math.random() * 40) * 10) / 10, // 40-80%
light: Math.round(Math.random() * 1000), // 0-1000 lux
battery: Math.round((80 + Math.random() * 20) * 10) / 10, // 80-100%
timestamp: Date.now()
};
msg.payload = sensorData;
msg.topic = "factory/zone1/environment";
return msg;

Configura el nodo MQTT Out:

  • Server: localhost:1883 (o usa el nodo del broker Mosquitto)
  • Topic: factory/zone1/environment
  • QoS: 1
  • Name: Publish Sensor Data

Conecta: Inject → Function → MQTT Out

Despliega el flujo. Deberías ver los datos apareciendo en MQTT Explorer bajo el topic factory/zone1/environment.

Paso 10: Escribir Datos Simulados en InfluxDB

Sección titulada «Paso 10: Escribir Datos Simulados en InfluxDB»

Para completar el flujo de datos, agrega almacenamiento en InfluxDB:

  1. Instala la paleta de nodos de InfluxDB:
    • Haz clic en el menú hamburguesa (arriba a la derecha) → Manage palette
    • Ve a la pestaña “Install”
    • Busca node-red-contrib-influxdb e instálalo
  2. Agrega un nodo InfluxDB Out a tu flujo
  3. Configura el nodo InfluxDB:
    • Server: Crea una nueva configuración de servidor InfluxDB
    • URL: http://influxdb:8086
    • Token: (pega el token de la API de InfluxDB del Paso 5)
    • Organization: iot-demo
    • Bucket: sensor-data
  4. Conecta: MQTT In → Function → InfluxDB Out

Un flujo mínimo completo ahora se ve así:

Inject (10s) → Function (generar datos) → MQTT Out (publicar)
↓
MQTT In (suscribir) → InfluxDB Out (almacenar)

Después de completar todos los pasos, verifica cada componente:

  • Docker: Los 4 contenedores están en ejecución (docker compose ps)
  • Mosquitto: El broker MQTT acepta conexiones en el puerto 1883 (prueba con mosquitto_sub)
  • Node-RED: Editor de flujos accesible en http://localhost:1880
  • InfluxDB: Interfaz web accesible en http://localhost:8086, el bucket sensor-data existe
  • Grafana: Inicio de sesión en http://localhost:3000, fuente de datos InfluxDB configurada
  • Flujo de Datos: Los datos simulados de sensores fluyen desde Inject → InfluxDB (visible en InfluxDB Data Explorer)

Para detener el entorno de demostración:

Ventana de terminal
cd ~/iot-demo
docker compose down

Para detener y eliminar todos los datos (empezar desde cero):

Ventana de terminal
cd ~/iot-demo
docker compose down -v
rm -rf mosquitto/data mosquitto/log nodered/data influxdb/data grafana/data

Síntoma: docker compose up -d devuelve un código de salida de error para uno o más contenedores.

Revisa los logs:

Ventana de terminal
docker compose logs <nombre-del-servicio>

Causa común: Puerto ya en uso.

Ventana de terminal
# Verifica qué está usando el puerto 1883
lsof -i :1883
# Detén el servicio en conflicto o cambia el mapeo de puertos en docker-compose.yml

Síntoma: mosquitto_sub devuelve “Connection refused”.

Verifica que el broker esté en ejecución:

Ventana de terminal
docker compose ps mosquitto

Revisa los logs de Mosquitto:

Ventana de terminal
docker compose logs mosquitto

Intenta conectarte con salida detallada:

Ventana de terminal
mosquitto_sub -h localhost -p 1883 -t "test" -d

Síntoma: El nodo InfluxDB Out muestra “Connection error”.

Asegúrate de que ambos estén en la misma red Docker — Docker Compose crea automáticamente una red para todos los servicios, por lo que usar el nombre del servicio influxdb (no localhost) en la configuración del nodo InfluxDB resuelve este problema.

Grafana muestra “No data” en los paneles

Sección titulada «Grafana muestra “No data” en los paneles»

Síntoma: Los paneles del dashboard muestran “No data” o “Query error”.

Verifica:

  1. ¿La fuente de datos InfluxDB está configurada con la URL correcta? Usa http://influxdb:8086 (no localhost).
  2. ¿El token es correcto? (Recupéralo con docker exec influxdb influx auth list)
  3. ¿Hay puntos de datos en el bucket? Verifica en InfluxDB Data Explorer.
  4. ¿La consulta usa el nombre de bucket correcto? El valor por defecto es sensor-data.

Kit de Hardware para el Entorno de Demostración (Opcional)

Sección titulada «Kit de Hardware para el Entorno de Demostración (Opcional)»

Para una experiencia de demostración completa con hardware físico, se recomiendan los siguientes componentes:

ComponenteModelo RecomendadoCosto Aprox.Término de Búsqueda
Placa ESP32ESP32 DevKit V1$5-8”ESP32 WiFi Bluetooth Development Board”
Sensor de temperaturaDHT22$3-5”DHT22 Temperature Humidity Sensor Module”
Sensor de luzBH1750$2-4”BH1750 Light Intensity Sensor Module GY-302”
Módulo de reléRelé de 2 canales 5V$3-6”5V 2-Channel Relay Module Optocoupler”
Protoboard + cablesProtoboard de 830 puntos$5-8”Breadboard 830 Points + 65 Jumper Wires”
Cable USBUSB-A a Micro-USB$2-4”USB to Micro USB Data Cable for ESP32”
Total$20-35

Este kit de hardware te permite demostrar:

  • Monitoreo de temperatura y humedad (DHT22 → ESP32 → MQTT → Grafana)
  • Automatización basada en luz (BH1750 → ESP32 → MQTT → control de relé)
  • Control simple de ENCENDIDO/APAGADO (Node-RED → MQTT → ESP32 → relé → LED)

Esta sección proporcionó una configuración completa y repetible para un entorno de demostración IoT:

  • Desplegó una pila Docker de 4 servicios (Mosquitto, Node-RED, InfluxDB, Grafana)
  • Configuró cada servicio con ajustes apropiados para uso de demostración
  • Verificó la comunicación MQTT usando herramientas CLI y MQTT Explorer
  • Creó un flujo de datos de sensores simulados desde Node-RED a InfluxDB
  • Preparó el entorno para demostraciones con clientes

Todo el proceso de configuración toma menos de 10 minutos y solo requiere Docker en la máquina anfitriona. Este entorno se usará a lo largo de la capacitación para respaldar los capítulos basados en proyectos (Capítulos 02-05, 10-14).


¿Desarrollas un producto IoT comercial?

Ofrecemos servicios ODM de ESP32, del diseño a la fabricación. Del prototipo a la producción: el equipo detrás de este tutorial puede construirlo contigo.

Hablemos →