Raspberry Pi: botón para enviar mensaje vía Telegram

IMG_20160727_235155

Lo que pretendo en esta ocasión es poder tener una Raspberry Pi en la entrada de casa, para que cuando entre pueda clicar un botón y envíe automáticamente un mensaje por Telegram al número o números indicados. Se trata de un simple aviso del estilo “Ya estoy en casa“, para que tanto mi pareja como yo sepamos que la casa y el perro ya no están solos.

El proyecto es igualmente útil en otros escenarios en que queramos simplificar el envío de un aviso a otra persona: entornos laborales, personas que puedan requerir ayuda de otros… En este caso voy a utilizar un botón extraído de un antiguo PC, que va conectado directamente a los pines GPIO de la Raspberry Pi. Podrían valorarse otros diseños como utilizar un botón grande estilo recreativa, un sensor capacitivo, un hat específico… Es también tentador utilizar un sensor PIR, pero resulta poco útil si hay una mascota en casa o no se hace un buen calibrado.

Paso 1. Instalar Telegram en el teléfono o teléfonos.

Resulta evidente; es necesario contar con Telegram instalado en aquellos móviles a los que queramos enviar el mensaje. Lo podemos hacer directamente desde la Play Store. En la lista de contactos del teléfono tendremos guardado el contacto de la persona a la que queremos enviar el mensaje. Por cautela, algo me dice que también será útil crearnos un contacto que seremos nosotros mismos. Es decir, un contacto nuevo, con el nombre que quieras, pero con nuestro número propio de teléfono. No está de más.

Paso 2. Instalar telegram-cli en la Raspberry Pi.

Empezamos copiando a nuestra Raspberry Pi el programa, clonándolo del repositorio de Github. Este es el comando, que ejecutamos desde la terminal:

git clone –recursive./configure https://github.com/vysheng/tg.git
Ahora tendremos una carpeta de nombre “tg” a la que accederemos:
cd tg
Antes de empezar a configurar el programa, instalaremos librerías necesarias para su funcionamiento:
sudo apt-get install libreadline-dev libconfig-dev libssl-dev lua5.2 liblua5.2-dev libtool libevent-dev libjansson*
Para después configurar Telegram:
./configure
Y seguidamente compilarlo, para lo cual se tomará unos minutos:
make
Ahora ejecutamos Telegram:
bin/telegram-cli k tg.pub
¿No funciona? ¿Recibes este mensaje?:
I: config dir=[/home/pi/.telegram-cli]
> telegram-cli: tgl/mtproto-utils.c:101: BN2ull: Assertion `0′ failed.
SIGNAL received

En ese caso modificamos el archivo mtproto-utils.c ubicado en la carpeta tgl. Vamos directamente a las líneas 101 y 115, y las eliminamos. Este es su contenido:

assert (0); // As long as nobody ever uses this code, assume it is broken.

Una vez guardados los cambios, volvemos a la carpeta inicial (/home/pi/tg) y volvemos a compilar:

make

Ahora sí, al ejecutar Telegram arrancará correctamente:

bin/telegram-cli k tg.pub

Paso 3. Configurando Telegram.

Al ejecutar el anterior comando, inicia la configuración. Lo primero que necesita el programa es que indiquemos nuestro numero de teléfono. Debe estar siempre precedido del prefijo del país. En el caso de España, escribimos +34 seguido de nuestro número de teléfono.

Una vez escrito presionamos enter, y recibimos un SMS en nuestro móvil con el código a indicar en la siguiente línea que nos solicita el programa. Después ya tenemos el programa iniciado y esperando ejecutar los comandos que le indiquemos.

Para comprobar que el servicio funciona, ejecutaremos el comando msg para enviar un mensaje por Telegram. La sintaxis es la siguiente:

msg NombreDelContacto Mensaje

No es necesario teclear el nombre del contacto completo; si ponemos las primeras letras la tecla de tabulación hará el autocompletado. Si en el paso 1 de este tutorial nos hemos añadido a nosotros mismos en la agenda de contactos del móvil, en esta prueba podemos indicar que nos envíe el mensaje a nuestro propio número y así comprobar que lo recibimos correctamente.

Finalmente, escribimos el comando quit para salir de Telegram.

quit

Paso 4. Crear script que envíe mensaje de Telegram al pulsar el botón físico.

El script es bastante sencillo, un bash script que podéis descargar desde aquí, y del que se detalla fuente y autoría en su cabecera (¡Agradecidos! Echadle un ojo). Este es el código que incluye:

#!/bin/bash
######
###
# telegram-cli bash script r0.1
# change 'to' to your own  Telegram account name
# by =  Mohammad Hafiz bin Ismail  [mypapit@gmail.com]
# url=  https://blog.mypapit.net/
###
######

## Replace 'to' with your account name

to=Replace_this_with_your-Telegram_account_name

##

function show_usage {

        echo "Usage $0 [message]"
        exit
}




if [ $# -lt 1 ]
then
  show_usage
fi


(echo "contact_list";sleep 20;echo "msg $to $1"; echo "safe_quit") | telegram-cli

Para descargarlo en la Raspberry Pi utilizo el comando wget, y así queda copia en la carpeta en la que estamos trabajando:

wget https://blog.mypapit.net/upload/files/send-telegram.sh.txt

Si nos fijamos, el archivo descargado tiene extensión txt, que facilita la lectura del código desde un navegador web. Pero necesitamos que quede con extensión sh para que se pueda ejecutar como bash script. Lo hacemos con el siguiente comando:

mv send-telegram.sh.txt send-telegram.sh

Ahora personalizamos el script a nuestros intereses. Para ello lo abrimos con nuestro editor preferido. En este caso utilizaré Nano:

nano send-telegram.sh

La primera línea a modificar es la siguiente:

to=Replace_this_with_your-Telegram_account_name

Simplemente le indicamos después del “to=” el nombre de usuario de Telegram al que queremos enviar el mensaje automatizado. Para esta prueba, nos podemos poner a nosotros mismos. Para el uso doméstico de aviso al estilo “Ya estoy en casa”, le indicaremos el nombre del grupo que contiene los contactos a notificar, substituyendo los espacios por una barra baja (ejemplo: nombre_del_grupo). Si evitamos espacios y símbolos, no nos complicamos la vida.

La siguiente modificación la realizamos al final de la última línea. En ella se indica que debe ejecutarse “telegram-cli”, pero no está indicada la ruta en la que se encuentra. Por lo tanto, modificamos “telegram-cli” por “bin/telegram-cli”.

Realizados los cambios, salimos de Nano guardando los cambios (Ctrl+X, presionando la “y” para sobre-escribir cambios, e intro para confirmar el nombre del archivo).

Antes de probar el script le daremos permisos de ejecución:

chmod a+x send-telegram.sh

Ahora sí, ejecutamos la prueba pertinente:

./send-telegram.sh “Mensaje a enviar”

Si no introducimos el mensaje entre comillas es posible que solo se envíe la primera palabra. Como podemos observar, con el script se ejecuta Telegram, carga la agenda de contactos, busca el contacto que hemos indicado en su código (a nosotros mismos, en el ejemplo), envía el mensaje y cierra Telegram. Todo con un solo comando.

Paso 5. Ejecutar el script al presionar un botón.

Esta parte se basa en la modificación del tutorial Raspberry Pi 2: botón de encendido, apagado y reset. Unicamente modificaremos el envío de la orden de reinicio por la de ejecución del script.

En primer lugar conectaremos un botón a los pines 5 y 6. Si situamos la Raspberry Pi delante nuestro, con los pines en la parte más cercana a nosotros, se trata de la tercera fila de pines. Este tipo de botón se puede comprar, pero si tenéis a mano algún ordenador antiguo podéis reciclar los botón de encendido o reset.

Para comunicarnos con la máquina mediante el botón utilizaremos un script Python. Lo descargamos en la Raspberry Pi:

wget https://raw.githubusercontent.com/gilyes/pi-shutdown/master/pishutdown.py

El script ahora contiene código preparado para apagar la Raspberry Pi, y por eso recibe ese nombre. Para evitar confusiones, lo renombramos:

mv pishutdown.py boton-telegram.py

Vamos a modificar el script con un editor de texto, de manera que ejecute el envío del mensaje vía Telegram si presionamos el botón, pero mantendremos la opción de apagar la Raspberry Pi si dejamos el botón presionado durante 3 segundos, pues siempre nos puede ser útil:

nano boton-telegram.py

Nos dirigimos a la línea 35 en la que encontramos esta orden de reinicio:

call([shutdown, -r, now], shell=False)

Y la substituimos por la ejecución del script de envío de mensajes de Telegram, indicando además qué mensaje queremos enviar cada vez que se presione el botón:

call([‘./send-telegram.sh “He llegado a casa”‘], shell=True)

Advertencias:

  • Las líneas 35 y 32 son muy parecidas, pero no iguales. Cuidado de modificar la 35, y no la 32 (perderíamos la posibilidad de apagar desde el botón, y deberíamos dejar el botón presionado para enviar el mensaje por Telegram).
  • Es necesario, como se observa en el código indicado, cambiar de False a True en la variable “shell”.

Ahora podemos guardar los cambios en Nano (Ctrl+X, presionando la “y” para sobre-escribir cambios, e intro para confirmar el nombre del archivo), para seguidamente ejecutar el script Python:

python boton-telegram.py

Ejecutado el script, si presionamos el botón veremos en pantalla cómo procede a enviar el mensaje vía Telegram, y permanece a la espera hasta la siguiente vez que se presione. Podemos presionar Ctrl+C para detener el script una vez comprobamos que funciona.

Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión / Cambiar )

Conectando a %s