Control remoto de cerradura con MQTT y HomeAssistant

caja_portada.jpeg

El problema: más personas que mandos

Cuando tienes un espacio compartido con una cerradura de control remoto que solo viene con cuatro mandos, pero sois más de cuatro personas las que necesitáis acceder, surge un problema logístico. En nuestro caso, esta puerta no es la principal (esa tiene una cerradura más segura), pero sí es la primera entrada al local, y necesitábamos una solución que permitiera el acceso a todos sin tener que estar compartiendo mandos constantemente.

caja_proto_mando.jpeg

La solución: un hack con MQTT y HomeAssistant

La respuesta llegó en forma de hack tecnológico. Ya teníamos HomeAssistant funcionando en el local, así que decidimos aprovechar su capacidad MQTT para crear un sistema de control remoto alternativo. La idea es simple pero efectiva: emular las pulsaciones del mando a distancia mediante un circuito controlado por una Raspberry Pi Pico W la versión 1.0

placa.jpeg

Concepto técnico

El sistema funciona así:

  1. HomeAssistant: Creamos dos automatizaciones (abrir y cerrar) que publican mensajes MQTT
  2. Panel móvil: Añadimos botones en el panel de control de HomeAssistant accesibles desde cualquier móvil que tenga usuario en nuestro home
  3. Raspberry Pi Pico W: Escucha los mensajes MQTT y activa los GPIO correspondientes
  4. Transistor como pseudo-botón: Cierra el circuito del mando simulando una pulsación física

Es una solución sencilla y elegante que convierte un mando físico limitado en un sistema de acceso digital ilimitado.

Componentes del sistema

Hardware

  • Raspberry Pi Pico W: El cerebro del sistema, con WiFi integrado y capacidad para ejecutar CircuitPython
  • Transistores: Actúan como interruptores electrónicos controlados por los GPIO (GP21 para cerrar, GP22 para abrir)
  • Mando original de la cerradura: Modificado para conectar los transistores en paralelo con los botones físicos
  • Caja contenedora: Para proteger el montaje

Software

  • HomeAssistant: Gestiona las automatizaciones y el panel de control
  • Broker MQTT: Mosquitto ejecutándose en el servidor local (192.168.1.52)
  • CircuitPython: Firmware en la Pico W con las librerías necesarias para MQTT

interfaz_botones.jpg

El código

El código en CircuitPython es directo y funcional. Se conecta al WiFi, se suscribe a los topics MQTT y cuando recibe un mensaje, activa el GPIO correspondiente durante 150ms (simulando una pulsación):

# Version resumida del código
import os
import ipaddress
import time
import digitalio
import board
import ssl, socketpool, wifi
import adafruit_connection_manager
import adafruit_minimqtt.adafruit_minimqtt as MQTT
pool = socketpool.SocketPool(wifi.radio)

# GPIO21 controla el transistor del botón (abre/cierra)
button_gp21 = digitalio.DigitalInOut(board.GP21)
button_gp21.direction = digitalio.Direction.OUTPUT
button_gp21.value = False   # inactivo = botón sin pulsar
# MQTT setup - dos topics diferentes
mqtt_puerta_cerrar = "homeassistant/sensorpuerta/cerrar" 
mqtt_puerta_abrir = "homeassistant/sensorpuerta/abrir"  

mqtt_client = MQTT.MQTT()
wifi.radio.connect(os.getenv('CIRCUITPY_WIFI_SSID'), os.getenv('CIRCUITPY_WIFI_PASSWORD'))
ipv4 = ipaddress.ip_address("8.8.4.4")

# Funciones auxiliares: emular un "pulsado" breve
def press_button_gp21(ms=150):
    print("→ Pulsando botón (GPIO21)")
    button_gp21.value = True      # activa transistor → cierra circuito
    time.sleep(ms / 1000)
    button_gp21.value = False     # suelta botón
    print("→ Soltado GPIO21")

# Callbacks MQTT
def connected(client, userdata, flags, rc):
    client.subscribe(mqtt_puerta_cerrar)
    client.subscribe(mqtt_puerta_abrir)
    
def message(client, topic, message):
    print(f"New message on topic {topic}: {message}")
    # Convertir topic de bytes a string si es necesario
    topic_str = topic if isinstance(topic, str) else topic.decode('utf-8')
    msg_str = message if isinstance(message, str) else message.decode('utf-8')
    # Verificar el topic y activar el GPIO correspondiente
    if topic_str == mqtt_puerta_cerrar:
        # Señal "on" → activa GPIO21
        if msg_str == "1" or msg_str.lower() == "on":
            press_button_gp21(150)
mqtt_client.on_connect = connected
mqtt_client.on_disconnect = disconnected
mqtt_client.on_message = message

mqtt_client.connect()
while True:
    mqtt_client.loop(timeout=2)

El circuito del transistor

El hack del transistor es la clave física del sistema. Básicamente, conectamos un transistor en paralelo con cada botón del mando original. Cuando el GPIO de la Pico W activa el transistor, este cierra el circuito exactamente igual que si hubiéramos pulsado el botón físicamente. Es un truco simple pero efectivo que permite mantener la funcionalidad original del mando mientras añadimos control remoto.

protos.jpeg

Configuración en HomeAssistant

En HomeAssistant, la configuración es sencilla:

  1. Automatizaciones: Dos automatizaciones que publican mensajes MQTT cuando se activan
  2. Panel de control: Botones con el sistema de cards de HomeAssistant
  3. Usuarios: Cada persona con acceso al local tiene las credenciales de HomeAssistant
# Ejemplo de automatización en HomeAssistant
automation:
  - alias: "Abrir puerta"
    trigger:
      platform: state
      entity_id: input_boolean.abrir_puerta
      to: 'on'
    action:
      - service: mqtt.publish
        data:
          topic: "homeassistant/sensorpuerta/abrir"
          payload: "on"
      - service: input_boolean.turn_off
        entity_id: input_boolean.abrir_puerta

Hardware libre

Un poco de hardware libre es perfecto para resolver un problema. No necesitamos comprar más mandos (que no se podía) ni cambiar la cerradura, solo reutilizar lo que ya teníamos y añadir una capa de inteligencia digital libre.

Es también una demostración de que los hacks no siempre son complejos. A veces, la solución más elegante es la más simple: un transistor, una placa de 10€, y un poco de código que une el mundo físico con el digital.
caja_patas.jpeg

Notas técnicas

  • La Pico W se alimenta por USB y está siempre conectada
  • El tiempo de pulsación (150ms) es ajustable según la cerradura
  • El sistema mantiene los mandos originales funcionales
  • La seguridad depende de las credenciales de HomeAssistant

Futuras mejoras

  • Añadir retroalimentación visual/sonora cuando se activa
  • Registrar logs de acceso
  • Implementar horarios de acceso por usuario
  • Añadir sensor de puerta abierta/cerrada para confirmación