Revolviendo viejos cacharros electrónicos en desuso encontré un viejo sistema de alarma que que si bien es funcional no tiene la posibilidad de conectar con nada excepto con un par de controles remotos para manejar sus funciones.
Se me ocurrió montarla en un deposito que está a varias calles de mi casa pero claro lo ideal seria poder controlar su estado y saber si se dispara o no. Como la alarma no tiene conectividad pero el deposito tiene conexión a Internet entonces me propuse construir un dispositivo que fuera capaz de actuar sobre los botones del control remoto y para eso desmonte uno de los controles dejando su placa al descubierto. Inicialmente arme todo en un proto-board para verificar su funcionamiento.

Como tenia un par de relay usados con Arduino, use uno para actuar en cada botón ACTIVAR y DESACTIVAR y el estado de la alarma lo veo monitoreando el voltaje de salida que activa una sirena de 12V, si hay voltaje la sirena suena y por lo tanto la alarma se disparo, para censar este voltaje uso un acoplador óptico PC817.
El cerebro de todo el proyecto es una placa Pico W que se conecta a Internet a un broker MQTT gratuito que cree en el sitio HiveMQ.

El código completo en MicroPython es el siguiente:
"""
**************************************************
Objtivo: Monitor del estado de una alarma
por Internet con MQTT
Electrónica: Pico W + CD4001 + PC817
Autor. Daniel Schmidt
***************************************************
"""
from machine import Pin
from time import sleep
import network
from umqtt.simple import MQTTClient
import config
import time
from machine import WDT
topic_sub = b'casa/activar'
topic_sub_d = b'casa/desactivar'
led= machine.Pin('LED', machine.Pin.OUT)
led.value(0)
MQTT_TOPIC_ESTADO = 'alarma/estado'
# Parametros del MQTT
MQTT_SERVER = config.mqtt_server
MQTT_PORT = 0
MQTT_USER = config.mqtt_username
MQTT_PASSWORD = config.mqtt_password
MQTT_CLIENT_ID = b"raspberrypi_casa"
MQTT_KEEPALIVE = 7200
MQTT_SSL = True
MQTT_SSL_PARAMS = {'server_hostname': MQTT_SERVER}
#Pines asignados
broker_ok = Pin(12, Pin.OUT)
broker_ok.value(0)
wifi_ok = Pin(13, Pin.OUT)
wifi_ok.value(0)
estado = Pin(16, Pin.IN)
activar = Pin(14, Pin.OUT)
activar.value(0)
desactivar = Pin(15, Pin.OUT)
desactivar.value(0)
verificar = Pin(17, Pin.IN, Pin.PULL_UP)
estado = Pin(16, Pin.IN)
def sub_cb(topic, msg):
msg = msg.decode('utf-8')
#print(msg)
if msg == '1':
activar.on()
elif msg == '0':
activar.off()
if msg == '2':
desactivar.on()
elif msg == '0':
desactivar.off()
def initialize_wifi(ssid, password):
wlan = network.WLAN(network.STA_IF)
wlan.active(True)
wlan.connect(ssid, password) # Conectado con la red WiFi
while not wlan.isconnected():
wifi_ok.toggle()
print("Conectando a la red Wi-Fi...")
time.sleep(1)
wifi_ok.value(1)
print('Conectado al WiFi!!')
network_info = wlan.ifconfig()
print('IP address:', network_info[0])
return True
def connect_mqtt():
try:
client = MQTTClient(client_id=MQTT_CLIENT_ID,
server=MQTT_SERVER,
port=MQTT_PORT,
user=MQTT_USER,
password=MQTT_PASSWORD,
keepalive=MQTT_KEEPALIVE,
ssl=MQTT_SSL,
ssl_params=MQTT_SSL_PARAMS)
client.connect()
client.set_callback(sub_cb) # Asocia la función de retorno (IMPORTANTE!!)
return client
except Exception as e:
print(f"Shit.... el broker no me atiende :(: {e}")
return None
def publish_mqtt(topic, value):
client.publish(topic, value)
#print("Publicado:", value)
try:
wifi_ok.value(0)
time.sleep(10)
if not initialize_wifi(config.wifi_ssid, config.wifi_password):
print('Shit!!!! el WiFi... no conecta :(')
else:
# Conéctar al broker MQTT e inicie el cliente MQTT.
client = connect_mqtt()
wdt = WDT(timeout=8000) # Habilita el watchdog para 8 Segundos
while True:
if client is None:
broker_ok.toggle()
print("Intentando reconectar...")
client = connect_mqtt()
wdt.feed() # Borra el WD -------
time.sleep(5) # Esperar antes de reintentar
try:
client.ping() # Verificar la conexión
broker_ok.value(1)
client.subscribe(topic_sub)
client.subscribe(topic_sub_d)
if (verificar.value() == 0):
estado = 'Activada'
else:
estado = 'Apagada'
# Publica el estado de alarma
wdt.feed() # Borra el WD -------
publish_mqtt(MQTT_TOPIC_ESTADO, str(estado))
wdt.feed() # Borra el WD -------
time.sleep(5)
except Exception as e:
broker_ok.value(0)
print(f"Se perdió la conexión MQTT. {e}")
client.disconnect() # Desconectar el cliente anterior
client = None # Marcar como no conectado para que el bucle se reconecte
wdt.feed() # Borra el WD -------
time.sleep(5)
except Exception as e:
print('Error:', e)
machine.reset()
En el archivo config.py se almacenan las credenciales de acceso a la red WiFi como también el acceso al broker.
wifi_ssid = 'xxxxxxxx'
wifi_password = 'xxxxxxxxxxx'
mqtt_server = b'xxxxxxxxxxxxxxxxxxxxxxxxxxxx.s1.eu.hivemq.cloud'
mqtt_username = b'xxxxxxxxxxx'
mqtt_port = '8883'
mqtt_password = b'xxxxxxxxxxx'
El funcionamiento sorprende por la estabilidad del broker, realmente muy bueno tanto que voy agregarle mas funciones como control de luces, botón de pánico Incluso el envío de mensajes por WS o Telegram avisando a alguien mas sobre lo que está sucediendo.
El funcionamiento es muy simple, la placa electrónica cada 5 segundos me envía el estado de alarma que veo en una aplicación que descargue del PlayStore, del montón de app que hay esta cumple con lo que necesito.

Si la alarma se activa en el teléfono suena una alarma para indicar que hay un intruso. Si quiero activar la alarma oprimo el botón correspondiente y el programa envía un comando al broker que a su vez lo envía a la placa electrónica que actúa sobre el relevador correspondiente y le "hace creer" al control remoto que un dedo humano activo el botón lo mismo para desactivar.
Una vez que el sistema esta conectado se pueden sumar tantas funciones como comandos sean enviados.

Esta claro que se podrían eliminar los relay y hacerlo todo mas "electrónico" pero como salio funcionando a la primera así se quedo.
Toda esta maraña de cables lleva ya dos semanas funcionando sin problemas así que el paso siguiente será soldar todo en una placa colocarlo en una caja y montar todo en el lugar definitivo. Es de notar que todo este control y o acción sobre la alarma o el sistema bajo control es totalmente gratuito el único costo realmente muy bajo son los componentes para el montaje y basta que nuestro móvil tenga acceso a Internet tendremos control del sistema desde cualquier parte del mundo.
Luego estaré subiendo el diagrama electrónico.