Imagen destacada del post Alarma IoT con Rust, MQTT, ESPHome y Telegram

Alarma IoT con Rust, MQTT, ESPHome y Telegram

Por Lucas Rack | 18 de agosto de 2025

Construyendo un Sistema de Alarma IoT con Rust, MQTT, ESPHome y Telegram

En Mechardo Labs me apasiona crear soluciones IoT innovadoras que integren hardware y software de forma fluida. En mi hogar, encontré un antiguo sistema de alarma inactivo, con sensores y sirenas cuyas conexiones convergían en un punto central. Aprovechando esta infraestructura, diseñé un sistema de alarma IoT avanzado utilizando un broker MQTT, una placa ESP32 con ESPHome para la gestión del hardware, y un puente (bridge) en Rust para proporcionar una interfaz robusta. Este sistema permite enviar notificaciones en tiempo real (por ejemplo, a través de Telegram), combinando fiabilidad, escalabilidad y una experiencia de usuario optimizada.

Conexiones

El proyecto mqtt-IOT-alarm es un sistema de alarma IoT basado en MQTT diseñado para monitorear tres sensores de movimiento distribuidos en la casa y dos sensores de apertura de puerta, uno adelante y otro atrás. Todos estos sensores se conectan a un ESP32 con conector USB tipo C (se utilizó un adaptador para una correcta lectura).

ESP32 USB type C

Para adaptar la conexión de los sensores se requiere utilizar 12 V de alimentación, y dado que los sensores funcionan como interruptores, se reduce la tensión a la salida para que el ESP32 pueda leerla correctamente. Se empleó un divisor resistivo en la salida del sensor (reduciendo a 3.3 V) y se agregó un capacitor como filtro pasa bajos. Para las sirenas, se utilizó un par de relés que actúan como desacoplo de señales. Por último, se conectó el receptor de un timbre inalámbrico directamente a la placa.

Conexiones alarma IOT

Pines utilizados

  • Pin 16: Sirena exterior
  • Pin 17: Sirena interior
  • Pin 33: Timbre inalámbrico
  • Pin 13: Sensor puerta delantera
  • Pin 12: Sensor puerta trasera
  • Pin 14: Sensor movimiento 1
  • Pin 27: Sensor movimiento 2
  • Pin 26: Sensor movimiento 3

Programando el ESP32 con ESPHome

¿Por qué ESPHome?

ESPHome es una plataforma de código abierto que simplifica la programación de dispositivos ESP32 y ESP8266 para aplicaciones IoT. Su configuración basada en YAML nos permitió definir rápidamente los sensores y actuadores sin escribir código C++ de bajo nivel. Además, ESPHome se integra fácilmente con MQTT y permite actualizaciones OTA (over the air).

Configuración del ESP32

esphome:
  name: esp32-mqtt-alarm
esp32:
  board: esp32dev

wifi:
  ssid: "wifi-ssid"
  password: "wifi-password"

logger:
api:
ota:
  platform: esphome

mqtt:
  broker: "192.168.100.2"
  port: 1883

on_message:
  - topic: "alarm/exterior"
    payload: "ON"
    then:
      - logger.log: "Activando sirena EXTERIOR (GPIO16)"
      - output.turn_on: pin16
  - topic: "alarm/exterior"
    payload: "OFF"
    then:
      - logger.log: "Desactivando sirena EXTERIOR (GPIO16)"
      - output.turn_off: pin16

  - topic: "alarm/interior"
    payload: "ON"
    then:
      - logger.log: "Activando sirena INTERIOR (GPIO17)"
      - output.turn_on: pin17
  - topic: "alarm/interior"
    payload: "OFF"
    then:
      - logger.log: "Desactivando sirena INTERIOR (GPIO17)"
      - output.turn_off: pin17

output:
- platform: gpio
  pin: 16
  id: pin16
- platform: gpio
  pin: 17
  id: pin17

binary_sensor:
- platform: gpio
  pin: 33
  name: "Bell Button"
  id: bell_button
  on_press:
    - logger.log: "Botón del timbre presionado. Publicando MQTT..."
    - mqtt.publish:
        topic: "bell"
        payload: "ON"

Esta configuración publica los eventos de los sensores al broker MQTT y permite controlar las sirenas remotamente a través de tópicos MQTT.

Bridge MQTT con Rust

La pieza clave de software es un programa en Rust que actúa como puente entre los sensores/actuadores y los usuarios (yo). El ESP32 envía datos de los sensores mediante mensajes MQTT al broker local (Mosquitto). El programa Rust se suscribe a los tópicos de interés y ejecuta la lógica definida cada vez que recibe un mensaje. Gracias al modelo pub/sub de MQTT, el hardware y el software están desacoplados: los dispositivos publican datos en el broker y el servicio en Rust los recibe al suscribirse a esos tópicos.

  • Cliente MQTT en Rust (rumqttc): el bridge usa el crate rumqttc para conectarse al broker MQTT. Se inicializan las opciones de conexión (MqttOptions), se crea un cliente y se suscribe a los tópicos relevantes (por ejemplo alarm/motion, alarm/door).
  • Manejo de notificaciones: el servicio también puede enviar alertas a Telegram. De este modo, cada evento (como “Movimiento detectado”) se envía como mensaje al chat configurado del usuario. Para poder activar o desactivar la alarma, se envian mensajes MQTT a través de Home Assistant
  • Concurrencia y ejecución: el programa corre bajo tokio::main, lanzando una tarea que procesa eventloop.poll() de manera continua y no bloqueante. Esto permite manejar múltiples mensajes en paralelo sin afectar la respuesta en tiempo real.
  • Seguridad: el broker MQTT se configura con autenticación y, opcionalmente, cifrado TLS/SSL. Además, el código puede aplicar mecanismos de debounce para evitar inundar de notificaciones al usuario durante eventos muy frecuentes.

Conclusión

El proyecto mqtt-IOT-alarm fue una experiencia emocionante en la construcción de un sistema de alarma IoT completamente local. Al combinar el rendimiento de Rust en el puente MQTT, la simplicidad de ESPHome en el ESP32, y la flexibilidad de Telegram para notificaciones, creamos una solución confiable y fácil de usar. Este proyecto demuestra el poder de integrar herramientas de código abierto con desarrollo personalizado para resolver problemas reales del hogar.