lunes, 26 de octubre de 2026

Envío de notificaciones push con Raspberry Pi

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.



La protagonista: placa Raspberry Pi.

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) o RPi.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:



Pieza del cierre magnético de vigilancia de la entrada.
Entrada de la embarcación vigilada con el sensor magnético
La entrada de la embarcación vigilada con el sensor magnético.
Plan de la embarcación con la ubicación del sensor de flotador
Plan de la embarcación con la ubicación del sensor.


Sensor de nivel de agua con interruptor de flotador.
Sentina con la bomba de achique Rule 500W
La sentina, con la bomba de achique Rule 500W.

Desarrollo del proyecto

Estructuramos el trabajo en 4 bloques:

  1. Montaje del hardware o parte física.
  2. Desarrollo y depuración del algoritmo en Python.
  3. Configuración del servicio de notificaciones push y su integración con el algoritmo.
  4. 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):

Esquemático del circuito: Raspberry Pi, pulsador en GPIO 17, resistencias y LED
Esquemático del circuito con el pulsador en el GPIO 17.

Y aquí podemos ver el resultado del montaje:

Montaje real del circuito en protoboard con la Raspberry Pi
Montaje real en protoboard.

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.

Panel de la web de Pushetta con el canal raspyobs creado
Panel de Pushetta con el canal «raspyobs» ya creado.
Formulario de creación de un nuevo canal en Pushetta
Formulario de creación de un nuevo canal en Pushetta.

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 bucles

Para probarlo no hace falta nada más:

curl -d "Prueba de aviso desde la Raspberry" https://ntfy.sh/sentina-barco-jf-2026

Si 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_id y desde Python un requests.post() a api.telegram.org te 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:

Ejecución del script en el entorno de desarrollo de la Raspberry
Ejecutando el script desde el entorno de desarrollo.
Detalle del montaje con la Raspberry Pi conectada al circuito
Detalle del montaje con la Raspberry conectada.

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):

Notificación de alarma de inundación en sentina recibida en el móvil
La notificación de alarma recibida en el móvil.

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