Mí último proyecto ha sido precisamente este, el poder interactuar con mi Raspberry desde mi teléfono móvil, gracias a la aplicación Telegram, una herramienta que os permitirá enviar ordenes a vuestra RPI y recibir información de ella, aunque esta esté dentro de una red doméstica, y aun encontrándose por detrás de un Firewall.
Para lograrlo lo primero que tenemos que hacer es actualizar el software, descargar e instalar la API de Telegram ejecutando las siguientes ordenes:
sudo apt-get install python-setuptools
sudo apt-get install python-pip
sudo pip install telepot
git clone https://github.com/eternnoir/pyTelegramBotAPI.git
cd pyTelegramBotAPI
python setup.py install
Una vez concluidos los pasos anteriores, lo siguiente es configurar lo que Telegram llama Bot, que no es otra cosa que dar de alta nuestro dispositivo (RPI) de manera que sea identificable dentro de la red Telegram.
Para hacerlo necesitamos entrar en Telegram y crear una conversación con @botfather.
Al hacerlo nos aparecerá un mensaje de bienvenida, y otro de presentación en el que se nos resumirán los comandos que @botfather permite para gestionar nuestros Bots.
Nuestro siguiente paso en la creación del Bot, continuando la conversación, ha de ser:
/newbot
Tras lo que se nos solicitará el nombre que queremos darle a nuestro Bot, que para que os hagáis una idea será el que aparecerá en nuestras conversaciones futuras con él:
Podemos llamarte RPI
Seguidamente se nos pedirá un nombre de usuario (telegram) para nuestro Bot, que para que lo entendáis y no preste a confusión no es otra cosa que el nombre público de vuestro Bot en la base de datos de Telegram. Es importante que el nombre elegido acabe con las letras bot
Es posible que el nombre elegido ya exista, ante lo que se os volverá a solicitar, os recomiendo buscar un nombre singular y a la vez fácil de recordar por vosotros ya que será el que Telegram (@botfather) os pida en el futuro para su gestión.
En este ejemplo raspberrypi2alteabot
Si el nombre asignado no existe, se nos confirmará el alta en el momento y se nos indicará una referencia que ellos llaman Token compuesta de letras y números, que necesitaremos utilizar en cualquier programa que desarrollemos en el futuro para identificar a nuestra Raspberry previamente al envío de cualquier mensaje.
Continuando con la configuración, desde la conversación con @botfather podemos asignar una imagen a nuestro Bot con la orden
/setuserpic
O cambiar su nombre (el que aparece en la conversación) por otro con:
/setname
Una vez hecho esto, tan solo nos quedará conocer nuestro Id de Telegram (el del móvil en el que queremos recibir las respuestas.
Para verlo es necesario ir a la dirección
https://api.telegram.org/bot**Vuestro Token**/getUpdates
Sustituyendo el texto en negrita por el Token obtenido en el proceso anterior.
El resultado será similar a lo siguiente:
{"ok":true,"result":[{"update_id":987654321, "message":{"message_id":3,"from":{"id":12345678,"is_bot":false,"first_name":"Santiago","last_name":"Crespo","language_code":"es"},"chat":{"id":12345678,"first_name":"Santiago","last_name":"Crespo","type":"private"},"date":1618144771,"text":"Sss"}},{"update_id":987654321,
Tomando la información ficticia de este ejemplo nuestro Id es el 87654321.
Es decir, el Token identifica a nuestra Raspberry , y el id a nosotros. Lo volveremos a ver en un ejemplo que incluyo más adelante.
Una vez acabada la configuración llega la parte más divertida, la empezar de interactuar con nuestro Raspi-bot, para ello crearemos una conversación (siguiendo el ejemplo) con @raspberrypi2alteabot
Para haceros el trabajo más sencillo a continuación os adjunto un sencillo script que he hecho en python consistente en darnos la fecha y la hora de ese preciso instante con tan solo enviar la orden /time
Os sorprenderá ver la rapidez de la respuesta.
__________________________
# -*- coding: utf-8 -*-
import time
import datetime
import telepot
import commands
def handle(msg):
print msg
chat_id = msg['from']['id']
command = msg['text']
if command == '/time':
bot.sendMessage(chat_id, str(datetime.datetime.now()))
bot = telepot.Bot('NUESTROTOKEN')
bot.message_loop(handle)
while 1:
time.sleep(3)
__________________________
(Cuidado con las tabulaciones, y con las comillas, en este último caso en ocasiones al hacer pegar/paste el sistema las pega como acentos y al ejecutar el programa nos da error de sintaxis.
Si ejecutáis el programa, hacéis una prueba enviando el comando /time , y revisáis lo que aparece en la pantalla de vuestra Raspberry, veréis una secuencia de datos entre los que aparecerá una cadena numérica antecedida de u’id’:
Esa cadena, normalmente de 8 dígitos, es el identificativo (usuario en Telegram) de la persona que ha enviado la orden, un dato muy útil si por ejemplo queremos restringir el envío de respuestas a un usuario/s concreto/s, con tan solo sustituir chat_id por ese dato (entre comillas) en el comando de envío del mensaje.
Así, para por ejemplo enviar la respuesta tan solo al usuario 12345678 lo haríamos de la siguiente manera:
bot.sendMessage(‘12345678’, str(datetime.datetime.now()))
A continuación os incluyo un ejemplo de programa Python que nos envía un mensaje y una foto que hemos guardado como foto.jpg al usuario (ficticio) 12345678.
import time
import datetime
import commands
import subprocess
import telepot
fichfoto= 'foto.jpg'
token = 'Token generado con el @BotFather'
bot = telepot.Bot(token)
foto = open(fichfoto, 'rb')
bot.sendMessage('12345678', 'RPI3+ enviando Prueba')
bot.sendPhoto('12345678', foto)
Rev 04/2021
Hola, he hecho todo tal cual comentas y no me funciona (no obtengo respuesta, y en el terminal se queda en espera constantemente). ¿Puedes ayudarme? Grcias!!
Me gustaMe gusta
Hola Alvaro, ¿puedes explicar con más detalle qué te ocurre exactamente? ¿No recibes el mensaje en el móvil o en la Raspberry Pi? ¿Has comprobado que el token se haya informado correctamente? Ya me cuentas.
Me gustaMe gusta
hola bro, una consulta, porque me sale este esrror al momento de hacer correr tu script
File «edgar.py», line 10
if command == ‘/time’:
^
este es el código completo, me parece que la libreria commands no encuentra……. o nose que pueda ser, ayudaaaaaaaaaaaaaa jefe
import time
import datetime
import telepot
import commands
def handle(msg):
print msg
chat_id = msg[‘from’][‘id’]
command = msg[‘text’]
if command == ‘/time’:
bot.sendMessage(‘12345678’, str(datetime.datetime.now()))
bot = telepot.Bot(‘602726791:AAHDgyZ_axSnhWv3mFq1nLNU71eBjRtp7-4’)
bot.message_loop(handle)
while 1:
time.sleep(3)
Me gustaMe gusta
Hola Edgar, buenas tardes,
Revisando tu mensaje se me ocurren dos errores posibles:
-las tabulaciones: en python son fundamentales ya que es su forma de establecer orden y jerarquías en las definiciones y condiciones.
-las comillas simples: si has copiado el código haciendo copiar/pegar muy probablemente se hayan pegado tildes/acentos en lugar de comillas simples, visualmente son casi iguales pero son distintos caracteres, por lo que el cambio de uno por otro te dará errores de ese tipo. Prueba a sustituir las comillas una por una y prueba.
Ya me dices como ha ido.
Saludos
Santi
Me gustaMe gusta
Pingback: Como hacer una alarma con una Raspberry Pi | Alteageek, tutoriales, raspberry pi y cisco, en español