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.
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
Concepto técnico
El sistema funciona así:
- HomeAssistant: Creamos dos automatizaciones (abrir y cerrar) que publican mensajes MQTT
- Panel móvil: Añadimos botones en el panel de control de HomeAssistant accesibles desde cualquier móvil que tenga usuario en nuestro home
- Raspberry Pi Pico W: Escucha los mensajes MQTT y activa los GPIO correspondientes
- 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
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.
Configuración en HomeAssistant
En HomeAssistant, la configuración es sencilla:
- Automatizaciones: Dos automatizaciones que publican mensajes MQTT cuando se activan
- Panel de control: Botones con el sistema de cards de HomeAssistant
- 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.
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
Este proyecto se implementó en noviembre de 2025 como solución práctica al problema de acceso múltiple con hardware limitado. El código está disponible y funcionando en producción.