Создаем бота Telegram и используем с Raspberry Pi
С помощью Raspberry Pi и приложения Telegram создадим бота, способного помочь с различными домашними задачами.
В рамках этого проекта мы разработаем Телеграм-бота, который сможет обмениваться сообщениями с Raspberry Pi. Мы настроим «Малину Пи» на получение текущих даты и времени. Помимо этого, появится возможность управлять контактами GPIO на Raspberry через два светодиода, подключённых к выводам GPIO.
Telegram представляет собой мессенджер наподобие WhatsApp или Viber, но с возможностью создания ботов. Для этого в нём предусмотрен специальный бот API, позволяющий взаимодействовать с ботами не только людям, но и устройствам.
Результаты проекта впоследствии можно применить для управления различными устройствами в доме или даже для кормления питомца во время вашего отсутствия.
Что нам понадобится
Набор компонентов минимален:
Raspberry Pi
2 светодиода
2 резистора на 220 Ом
Установка и создание бота Телеграм
Для начала откройте Google Play и скачайте приложение Telegram.
При первом запуске приложение запросит номер телефона. После ввода номера Telegram отправит код подтверждения. Введите полученный код для верификации аккаунта.
После подтверждения номера приложение перенаправит вас на главный экран, который выглядит следующим образом:
Далее необходимо создать нового бота для обмена сообщениями с Raspberry Pi. В Telegram предусмотрен BotFather — специальный инструмент для создания ботов. Найдите «botfather» в поиске приложения.
Отправьте «/start», чтобы инициировать диалог с ботом.
Далее отправьте «/newbot» для создания нового бота.
BotFather предложит дать имя новому боту.
После этого потребуется указать имя пользователя для бота. Введите уникальное имя пользователя для создания бота. В ответном сообщении будет содержаться токен. Обязательно сохраните его — он потребуется при написании кода.
Затем найдите созданного бота через поиск, чтобы убедиться в его успешном создании.
На этом создание бота завершено. Теперь нужно написать код для Raspberry Pi, благодаря которому она будет отвечать на сообщения от бота. Но прежде выполним необходимые подключения к Raspberry Pi.
Схема соединения
Подсоедините положительный вывод красного светодиода к GPIO 21 Raspberry Pi, а отрицательный вывод красного светодиода — к земле через резистор 220 Ом.
Аналогично подсоедините положительный вывод зелёного светодиода к GPIO 20 Raspberry Pi, а отрицательный — к земле через резистор 220 Ом.
Установка правильной библиотеки в Raspbian
Необходимо установить библиотеку telepot в Raspbian. Для этого выполните в терминале следующую команду:
sudo pip install telepot
Объяснение кода бота Telegram
Первым делом подключаем необходимые для проекта библиотеки. Библиотека telepot обеспечивает взаимодействие «малины» с ботом Telegram посредством API. Библиотека datetime служит для получения даты и времени. Библиотека GPIO отвечает за управление светодиодами.
import datetime # Importing the datetime library
import telepot # Importing the telepot library
from telepot.loop import MessageLoop # Library function to communicate with telegram bot
import RPi.GPIO as GPIO # Importing the GPIO library to use the GPIO pins of Raspberry pi
from time import sleep # Importing the time library to provide the delays in program
При каждом получении сообщения от бота Telegram вызывается функция handle. Внутри этой функции считывается сообщение и извлекается текст. Далее текст сравнивается с командами, и формируется соответствующий ответ.
def handle(msg):
chat_id = msg['chat']['id'] # Receiving the message from telegram
command = msg['text'] # Getting text from the message
print ('Received:')
print(command)
# Comparing the incoming message to send a reply according to it
if command == '/hi':
bot.sendMessage (chat_id, str("Hi! MakerPro"))
elif command == '/time':
bot.sendMessage(chat_id, str("Time: ") + str(now.hour) + str(":") + str(now.minute) + str(":") + str(now.second))
elif command == '/date':
bot.sendMessage(chat_id, str("Date: ") + str(now.day) + str("/") + str(now.month) + str("/") + str(now.year))
elif command == '/red_1':
bot.sendMessage(chat_id, str("Red led is ON"))
GPIO.output(red_led_pin, True)
Ниже нужно подставить свой токен бота. Метод «Bot.getMe()» проверит успешность соединения между Pi и ботом Telegram и выведет результат.
bot = telepot.Bot('542543102:AAE7xb6_XGAn9Yh-4PPJmfK5YK9TEA4')
print (bot.getMe())
Следующая команда запускает прослушивание бота, и при получении каждого нового сообщения будет вызываться функция handle.
MessageLoop(bot, handle).run_as_thread()
Ниже представлен полный код.
Код целиком
import datetime # Importing the datetime library
import telepot # Importing the telepot library
from telepot.loop import MessageLoop # Library function to communicate with telegram bot
import RPi.GPIO as GPIO # Importing the GPIO library to use the GPIO pins of Raspberry pi
from time import sleep # Importing the time library to provide the delays in program
red_led_pin = 21 # Initializing GPIO 21 for red led
green_led_pin = 20 # Initializing GPIO 20 for green led
GPIO.setmode(GPIO.BCM) # Use Board pin numbering
GPIO.setup(red_led_pin, GPIO.OUT) # Declaring the GPIO 21 as output pin
GPIO.setup(green_led_pin, GPIO.OUT) # Declaring the GPIO 20 as output pin
now = datetime.datetime.now() # Getting date and time
def handle(msg):
chat_id = msg['chat']['id'] # Receiving the message from telegram
command = msg['text'] # Getting text from the message
print ('Received:')
print(command)
# Comparing the incoming message to send a reply according to it
if command == '/hi':
bot.sendMessage (chat_id, str("Hi! MakerPro"))
elif command == '/time':
bot.sendMessage(chat_id, str("Time: ") + str(now.hour) + str(":") + str(now.minute) + str(":") + str(now.second))
elif command == '/date':
bot.sendMessage(chat_id, str("Date: ") + str(now.day) + str("/") + str(now.month) + str("/") + str(now.year))
elif command == '/red_1':
bot.sendMessage(chat_id, str("Red led is ON"))
GPIO.output(red_led_pin, True)
elif command == '/red_0':
bot.sendMessage(chat_id, str("Red led is OFF"))
GPIO.output(red_led_pin, False)
elif command == '/green_1':
bot.sendMessage(chat_id, str("Green led is ON"))
GPIO.output(green_led_pin, True)
elif command == '/green_0':
bot.sendMessage(chat_id, str("Green led is OFF"))
GPIO.output(green_led_pin, False)
# Insert your telegram token below
bot = telepot.Bot('542543102:AAE7xb6_XGAn9Yh-4PPJmfK5YK9TEA4')
print (bot.getMe())
# Start listening to the telegram bot and whenever a message is received, the handle function will be called.
MessageLoop(bot, handle).run_as_thread()
print ('Listening....')
while 1:
sleep(10)
На этом всё. Программа для бота Телеграм и Raspberry Pi готова.