61 - Controlar tu Raspberry desde Telegram

61 - Controlar tu Raspberry desde Telegram

En este episodio del podcast te comento as posibilidades que tienes para controlar tu Raspberry desde Telegram, y sacarle el máximo provecho y utilidad.

1:25
-3:15

En el episodio 19 del podcast te hablé sobre como controlar tu Raspberry con un botón desde Android. En este nuevo episodio, te explicaré como puedes controlar tu Raspberry desde Telegram, desde tu ordenador, desde el móvil, desde donde quieras. De esta forma no necesitas instalar ninguna aplicación adicional, con las que ya tienes lo puedes hacer. Eso si, vas a necesitar trabajar un poco mas, porque no todo va a venir hecho como en la aplicación que te comenté anteriormente, pero, aquí está la gracia. Lo vas a poder adaptar exactamente a tus necesidades. Lo podrás personalizar hasta el mas mínimo detalle.

Controlar tu Raspberry desde Telegram

Controlar tu Raspberry desde Telegram

Antes que nada indicarte que esto de controlar la Raspberry desde Telegram no va a ser algo tan trivial como lo que te comenté en el episodio 19 del podcast. Sin embargo, tiene sus ventajas. Por un lado podrás gestionar la Raspberry desde cualquier dispositivo que tenga Telegram, y por otro vas a poder personalizarlo según tus necesidades. Lo puedes adecuar al uso que le quieras dar.

Infraestructura mínima

Antes que nada necesitarás instalar lo mínimo en tu Raspberry para comunicar Telegram con tu pequeño dispositivo. En este caso, la comunicación con Telegram la vas a hacer con webhooks.

Para ello, necesitas un servidor web, y en este caso, me he decantado por Nginx, aunque si lo prefieres puedes utilizar Apache, o cualquier otro con el que te sientas cómodo. Para su instalación te recomiendo le des un vistazo al siguiente artículo.

En principio, para lo que vas a hacer inicialmente, con el servidor Nginx o Apache, tienes mas que suficiente. No necesitas instalar un servidor de base de datos. Al menos en principio. Sin embargo, tampoco está de mas que tengas instalado MariaDB, para un futuro uso.

Por otro lado, es mas que recomendable que las comunicaciones estén cifradas, y además es un requisito para trabajar con Telegram. Así, mi recomendación es que instales un certificado Let’s Encrypt. Para ello, puedes seguir el siguiente tutorial,

Por último, en lo que a infraestructura se refiere, es necesario tener acceso a tu Raspberry desde el exterior. En este sentido, y dado que la mayoría tenemos IP dinámica, es necesario hacer uso de un servicio externo, como puede ser el que ofrece DuckDNS. Para configurar este servicio, te recomiendo que leas el siguiente artículo.

Webhooks

Como he comentado en otros artículos y episodios del podcast, el uso de webhooks, es una potente herramienta, preferible a otras soluciones. En este sentido, para controlar tu Raspberry desde Telegram, vas a utilizar este procedimiento. En este sentido te indico el artículo donde te explico como configurar el webhook que utilizarás para controlar tu Raspberry desde Telegram.

Una vez establecido el webhook, el siguiente paso definir las acciones que realizará tu bot, ante diferentes acciones. Para ello, es puedes dar un vistazo al siguiente artículo, donde te explico como puedes integrar Telegram con PHP.

Monitorización

Además de la interacción que puedas hacer con el bot, es interesante, monitorizar la Raspberry para saber lo que está sucediendo. En este sentido, he incluido, dos sencillas acciones.

La primera de las acciones es que el bot nos avise cuando se ha iniciado la Raspberry. Por supuesto, también cuando se detenga la Raspberry, mediante una parada programada claro. En el caso de no tengamos suministro eléctrico, no tendremos información. Para esto, vas a crear un servicio con Systemd. Para hacerlo, te recomiendo que le des un vistazo al siguiente capítulo del tutorial sobre Systemd,

[Unit]
Description=Send message on shutdown
After=network-online.target
Wants=network-online.target

[Service]
Type=oneshot
ExecStart=/bin/bash /home/pi/bot/sendmessage.sh "Bienvenido..."
ExecStop=/bin/bash /home/pi/bot/sendmessage.sh "Adiossss"
RemainAfterExit=yes

[Install]
WantedBy=multi-user.target

Cada vez que se produzca uno de estos eventos, tu bot te avisará utilizando el procedimiento indicado por Ángel en su artículo sobre crear un bot con bash.

#!/bin/bash
source /home/pi/bot/keys
if [ ! -z "$1" ]
then
  URL="https://api.telegram.org/bot$TOKEN/sendMessage"
  curl -s -X POST $URL -d chat_id=$CHANNEL -d text="$1" >/dev/null 2>&1
fi

La segunda de las acciones va a ser la de monitorizar el directorio donde se encuentran nuestros archivos del bot. Para ello, seguiremos lo indicado por David en el artículo de colaboratorio.net, donde puedes ver como monitorizar el directorio.

#!/bin/bash
source /home/pi/bot/keys
URL="https://api.telegram.org/bot$TOKEN/sendMessage"
/usr/bin/inotifywait -e create,delete,modify,move,attrib -mrq /home/pi/bot | while read line; do
  curl -s -X POST $URL -d chat_id=$CHANNEL -d text="$line" >/dev/null 2>&1
done

En este segundo caso, también definiremos un servicio con Systemd que se encargue de realizar la monitorización. Este servicio se iniciará con nuestra Raspberry.

[Unit]
Description=Monitor bot directory

[Service]
ExecStart=/home/pi/bot/monitor.sh

[Install]
WantedBy=multi-user.target

Comandos para controlar tu Raspberry desde Telegram

Además de estos procesos de monitorización, también querrás interactuar con tu bot para hacer diferentes acciones. Así utilizando BotFather, puedes definir las siguientes acciones de forma realmente sencilla.

  • info – Muestra información
  • mumble – Gestiona Mumble
  • ngnix – Gestiona Nginx
  • temp – Devuelve la temperatura de la Raspberry
  • help – Muestra esta ayuda

Así, algunas de estas acciones están definidas directamente en el código de PHP, y otras harán uso de un script externo.

Por ejemplo, el código de info, que nos permite conocer el estado de la memoria de la Raspberry, es tan sencillo como,

if(preg_match('/^\/info/', $json->message->text) == 1)
{
    $msg = shell_exec('free -h');
    $ans = sendMessage($TEST_GROUP, $msg);
}

Donde sendMessage se define como,

function sendMessage($chat_id, $text)
{
    global $TELEGRAM;
    $json = ['chat_id'    => $chat_id,
         'text'       => $text,
         'parse_mode' => 'HTML'];
    return http_post($TELEGRAM.'/sendMessage', $json);
}

Por otro lado, para conocer la temperatura de la Raspberry, es tan sencillo como,

if(preg_match('/^\/temp/', $json->message->text) == 1)
  {
      $ans = shell_exec('cat /sys/class/thermal/thermal_zone0/temp');
      $msg = "La temperatura en la Raspberry es de 🌡. ";
      $msg .= number_format(substr($ans, 0, -1)/1000.0, 1);
      $msg .= " ºC";
      $ans = sendMessage($TEST_GROUP, $msg);
  }

Acciones con derechos de root

Por otro lado, hay algunas acciones que requieren de derechos de administrador. Para ello, es necesario modificar el archivo /etc/sudoers. Sin embargo, eso lo debes hacer utilizando sudo visudo. Para esto, te recomiendo le des un vistazo al siguiente artículo,

Interacción con el bot

Para mejorar la interacción con el bot, he añadido un teclado inline, que mejora sensiblemente la experiencia de usuario.

$msg = "El servidor Mumble está en <strong>marcha</strong>\n¿Quieres que lo detenga?";
$keyboard = array(array(
                array("text"          => "Si",
                      "callback_data" => "detener_mumble"),
            array("text"          => "No",
                  "callback_data" => "nada")));
$json = ['chat_id'      => $chat_id,
      'text'         => $text,
      'parse_mode'   => 'HTML',
      'reply_markup' => array('inline_keyboard' => $keyboard)];
return http_post($TELEGRAM.'/sendMessage', $json);

Conclusiones

Como puedes ver esto no es tan sencillo como el procedimiento indicado para controlar tu Raspberry con un botón. Sin embargo, ya puedes ver el potencial, y aquí solo dependes de tu imaginación, respecto a lo que puedes hacer.

El código correspondiente tanto para el webhook, como para los servicios de Systemd, como los scripts, los puedes encontrar en este [Repositorio de GitHub

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *