Envío de notificaciones push con Raspberry Pi: alarma de intrusión y agua en sentina (edición actualizada)
Ojo! Este proyecto lo realicé hace unos años con mi padre como trabajo académico en un curso de la Universidad de Cantabria y en su día giraba en torno a Pushetta, un servicio de notificaciones push que ya no está operativo. Lo republico aquí con el proyecto original intacto (que sigue siendo perfectamente válido en su parte de hardware y lógica) y una actualización completa con las alternativas actuales, para que cualquiera pueda montarlo hoy en día con Python 3 y servicios vivos y gratuitos.
Objeto del proyecto
El objeto de este proyecto es enviar y recibir notificaciones push con Raspberry Pi: que nuestra placa detecte un evento por sus GPIO y nos avise al móvil en tiempo real, estemos donde estemos.
Ejemplo práctico elegido: aviso mediante una app al smartphone de un mensaje de alarma de intrusión y de agua en sentina en una embarcación de recreo.
Elementos del proyecto
Hardware:
- Raspberry Pi (en el proyecto original una Raspberry Pi B Rev 1; vale cualquier modelo actual)
- Smartphone Android / iOS
- Sensor de nivel de agua con interruptor de flotador (al no disponer aún del elemento real, en las pruebas lo simulamos con un pulsador)
- Sensor magnético de apertura (para la alarma de intrusión en la puerta/escotilla de entrada)
Software:
- Raspberry Pi OS (antes Raspbian) — https://www.raspberrypi.com/software/
- Python 3 (incluido de serie en el sistema)
- Librería
gpiozero(incluida de serie en Raspberry Pi OS) oRPi.GPIO - Un servicio de notificaciones push (en el original, Pushetta; hoy en día, ntfy, Telegram o Pushover — los vemos más abajo)
El entorno náutico
La idea es vigilar dos cosas a bordo: que nadie entre sin permiso y que la sentina no acumule agua. Aquí el contexto real del proyecto:



Desarrollo del proyecto
Estructuramos el trabajo en 4 bloques:
- Montaje del hardware o parte física.
- Desarrollo y depuración del algoritmo en Python.
- Configuración del servicio de notificaciones push y su integración con el algoritmo.
- Pruebas de funcionamiento y otros posibles usos.
1. Hardware
Antes de empezar a conectar cosas en los GPIO, importante tener la Raspberry sin corriente: un cortocircuito entre pines puede resultar fatídico. Nosotros utilizamos una Raspberry Pi B (Rev 1), pero da exactamente igual: simplemente hay que consultar el esquemático de pines de la versión que empleemos (por ejemplo en pinout.xyz).
Componentes electrónicos del montaje de pruebas:
- 1 diodo LED (su uso es simplemente visualizar cuándo activamos el pulsador)
- 1 resistencia de 100 Ω (limitadora del LED)
- 1 resistencia de 2.200 Ω (pull-down para la entrada)
- 1 pulsador (simulará el contacto del sensor de nivel)
- 1 protoboard y cables
Este es el esquemático que tenemos que montar (el pulsador entra al GPIO 17, numeración BCM, con resistencia pull-down):

Y aquí podemos ver el resultado del montaje:

2. Python
¿Qué es Python y por qué lo usamos?
Python es un lenguaje de programación interpretado, de propósito general y orientado a objetos. De sus ventajas destacan la sencillez, la versatilidad y ser multiplataforma. Está administrado por la Python Software Foundation y posee licencia de código abierto. Para un proyecto como este es la elección natural: viene de serie en Raspberry Pi OS y controlar los GPIO con él es trivial.
En el proyecto original trabajábamos con Python 2.7 y la librería RPi.GPIO, que había que descargar e instalar a mano. Hoy en día todo esto se ha simplificado: Raspberry Pi OS incluye Python 3 y la librería gpiozero, pensada precisamente para que los GPIO sean coser y cantar, sin instalaciones adicionales.
El algoritmo. El funcionamiento del script es sencillo: definimos el GPIO 17 como entrada (según esquemático BCM) y el programa queda a la escucha de forma continua. Cuando se cierra el contacto (pulsamos el botón / el flotador detecta agua), se dispara el envío de la notificación al servicio push, que la hace llegar a nuestro móvil.
El código original (Python 2, con Pushetta). Lo dejo aquí como referencia histórica, tal cual se escribió en su día (nótese el urllib2 y el print sin paréntesis, hoy obsoletos):
# Importamos la libreria GPIO
import RPi.GPIO as GPIO
# Importamos la libreria time
import time
# Definimos el modo BCM
GPIO.setmode(GPIO.BCM)
# Definimos los pines GPIO como entrada
GPIO.setup(17, GPIO.IN)
while True:
if GPIO.input(17):
import urllib2
import json
# Funcion de Script para enviar las notificaciones a Pushetta
def sendNotification(token, channel, message):
data = {
"body": message,
"message_type": "text/plain"
}
req = urllib2.Request('http://api.pushetta.com/api/pushes/{0}/'.format(channel))
req.add_header('Content-Type', 'application/json')
req.add_header('Authorization', 'Token {0}'.format(token))
response = urllib2.urlopen(req, json.dumps(data))
# Importante modificar segun formato: Apikey + Canal + Mensaje
sendNotification("3c5901b1216b455d89d2cddb41b592e94d92df59",
"raspyobs", "Alarma: Inundacion en sentina")
print "El mensaje ha sido enviado!"
GPIO.cleanup()3. El servicio de notificaciones: Pushetta (RIP) y las alternativas actuales
¿Qué era Pushetta?
Pushetta era un servicio web que permitía enviar notificaciones push de eventos a smartphones iOS y Android en tiempo real, mediante un sistema de canales con filosofía publicador/suscriptor: creabas un canal, suscribías la app de tu móvil a él, y cualquier script que publicara en ese canal hacía llegar el aviso a todos los suscriptores. Su configuración era sencilla: registro en www.pushetta.com, confirmación del correo, creación del canal desde la pestaña channels (con su icono, descripción y tipo público/privado — si lo creabas privado, hacía falta confirmar el vínculo desde el panel), y por último copiar la APIKEY generada al script de Python.


Pushetta cerró (su web y su API dejaron de responder y su app desapareció de las tiendas), así que el proyecto tal cual estaba dejó de funcionar. La buena noticia: la parte hardware y la lógica siguen 100 % válidas, y hoy hay alternativas mejores y más fáciles.
Alternativa recomendada: ntfy
ntfy es hoy en día la alternativa más cercana al espíritu de Pushetta: un servicio de notificaciones pub/sub basado en HTTP, con apps para iOS y Android, y que se usa con un simple POST. Se puede usar gratis en el servidor público ntfy.sh (sin registro: el "canal" es un tema que eliges y por el que te suscribes desde la app) o autoalojarlo en la propia Raspberry Pi si quieres control total. Además permite enviar adjuntos (¡fotos de una cámara!), títulos, prioridades y etiquetas con iconos.
Instalación de la app: busca «ntfy» en Google Play o App Store, pulsa «+» y suscríbete a un tema con un nombre difícil de adivinar (por ejemplo sentina-barco-jf-2026, porque ese nombre hace de contraseña en el servidor público).
El código actualizado (Python 3 + gpiozero + ntfy)
#!/usr/bin/env python3
# Alarma de agua en sentina con aviso push por ntfy
# Python 3 + gpiozero (incluidos en Raspberry Pi OS)
import requests # pip3 install requests (suele venir de serie)
from gpiozero import Button, LED # libreria GPIO de alto nivel
from signal import pause # deja el programa a la escucha
# Configuracion de ntfy
NTFY_TOPIC = "sentina-barco-jf-2026" # el nombre del tema es la "contrasena"
NTFY_URL = "https://ntfy.sh/" + NTFY_TOPIC
# GPIO 17 (numeracion BCM): pulsador/flotador con pull-down
sensor = Button(17)
led = LED(27) # LED de aviso local (ajustar pin al esquema)
def enviar_aviso(mensaje, titulo="Alarma a bordo", etiqueta="warning"):
"""Publica una notificacion push en el tema de ntfy"""
requests.post(
NTFY_URL,
data=mensaje.encode("utf-8"),
headers={
"Title": titulo.encode("utf-8"),
"Tags": etiqueta,
"Priority": "high",
},
)
print("El mensaje ha sido enviado!")
# Al cerrarse el contacto (flotador/escotilla) -> notificacion push + LED
sensor.when_pressed = lambda: (led.on(), enviar_aviso("Agua en la sentina"))
sensor.when_released = lambda: (led.off(),)
print("Escuchando el sensor... (Ctrl+C para salir)")
pause() # el programa queda a la escucha sin consumir CPU con buclesPara probarlo no hace falta nada más:
curl -d "Prueba de aviso desde la Raspberry" https://ntfy.sh/sentina-barco-jf-2026Si quieres autoalojar ntfy en la propia Raspberry (ideal para no depender de terceros), se instala con un binario o Docker y luego hay que abrir puertos o usar una VPN tipo Tailscale para recibir avisos fuera de casa.
Otras alternativas actuales
- Bot de Telegram — probablemente la vía más popular hoy. Creas un bot gratis con @BotFather en dos minutos, te quedas con su token, averiguas tu
chat_idy desde Python unrequests.post()aapi.telegram.orgte lleva el aviso al chat. Sin apps adicionales: usas el Telegram de siempre, con historial de mensajes incluido. - Pushover — el clásico profesional: app de pago único (unos 5 € por dispositivo), muy fiable y con prioridades (la prioridad 2 repite el aviso hasta que lo reconozcas, perfecta para alarmas reales como esta).
- Home Assistant — si la Raspberry va a ser el centro de la domótica del barco o de casa, su app ya trae notificaciones persistentes de fábrica y los sensores GPIO se integran directamente como entidades.
Un ejemplo mínimo con Telegram (solo cambia la función de envío):
import requests
BOT_TOKEN = "123456789:ABCdefGHIjklMNOpqrsTUVwxyz" # token de @BotFather
CHAT_ID = "123456789" # tu chat_id
def enviar_aviso(mensaje):
url = f"https://api.telegram.org/bot{BOT_TOKEN}/sendMessage"
requests.post(url, data={"chat_id": CHAT_ID, "text": mensaje})
print("El mensaje ha sido enviado!")4. Pruebas de funcionamiento y otros posibles usos
Una vez preparado el hardware y el código, ejecutamos el script desde el entorno o la consola de la Raspberry:


Y en el teléfono, tras activar el pulsador o el sensor de nivel, recibimos la notificación al instante (aquí en la app original de Pushetta; con ntfy o Telegram el resultado es idéntico):

Otros usos posibles: el mismo esquema sirve para un servicio de videovigilancia con notificaciones push (empleando motion para llamar al script y avisar de intrusiones, incluso mandando la foto como adjunto de ntfy), o con el puerto serie/USB y estándares náuticos como NMEA 0183, NMEA 2000 y Raymarine para desarrollar plotters con datos de GPS, temperatura, presión o profundidad. Y hoy además, el mismo código de aviso puede correr en un ESP32 o ESP8266 (con WiFi integrado y consumo mínimo) que publica directamente en ntfy o en el bot de Telegram, dejando la Raspberry para tareas más gordas.
Es un ejemplo práctico del amplio abanico de posibilidades que nos ofrece la Raspberry Pi, que en combinación con Arduino y otros dispositivos o interfaces nos permite desarrollar infinidad de proyectos.
¿Has montado algún sistema de avisos parecido en tu barco, casa o taller? Cuéntamelo en los comentarios y como siempre, se acepta cualquier tipo de sugerencia o mejora!



No hay comentarios:
Publicar un comentario