Создаем бота Telegram и используем с Raspberry Pi

Используем Raspberry Pi и приложение Telegram, чтобы создать бота, который поможет справиться с задачами по дому.

В этой проекте мы создадим бота Телеграм, способного отправлять и получать сообщения от Raspberry Pi. Мы запрограммируем "Малину Пи", чтобы получить время и дату. Мы также сможем управлять контактами GPIO от Raspberry, подключив два светодиода к контактам Raspberry Pi GPIO.

Telegram - это приложение для обмена сообщениями, такое же как WhatsApp или Viber, но в Telegram можно создавать ботов. Для этого в нем есть бот API, которое позволяет не только человеку общаться с ними, но и машинам.

Итоги проекта можно в будущем использовать для управления чем-либо в своем доме или даже кормить свою собаку, когда вы уезжаете.

Что нам понадобится

Набор комплектующих не велик:

  • Raspberry Pi
  • 2 светодиода
  • 2 резистора на 220 Ом

Установка и создание бота Телеграм

Сначала перейдите в магазин Google Play и загрузите приложение Telegram.

Когда вы откроете приложение, он спросит ваш номер телефона. Введите номер, и Telegram отправит код подтверждения. Вам нужно будет ввести код для подтверждения своей учетной записи.

После добавления номера приложение перенесет вас на главный экран, который будет выглядеть следующим образом:

Теперь нам нужно создать нового бота, который будет отправлять и получать сообщения с помощью Raspberry Pi. В Telegram есть BotFather, который поможет нам создать бота. Найдите «botfather» в приложении.

Затем напишите «/start», чтобы начать общение с ботом.

После этого напишите «/newbot», чтобы запросить нового бота.

Теперь он попросит вас назвать своего нового бота.

Затем он попросит имя пользователя для бота. Введите уникальное имя пользователя, чтобы создать своего бота. В полученном сообщении появится токен. Сохраните его, поскольку он вам понадобится в коде.

Затем найдите бота, используя его, чтобы подтвердить, что бот создан.

Мы закончили создание бота. Теперь нам нужно написать код для Raspberry Pi, который заставит его отвечать на сообщения от бота. Но перед этим нужно произвести некоторые соединения с Raspberry Pi.

Схема соединения

Подключите положительный провод красного светодиода к GPIO 21 от Raspberry Pi и подсоедините отрицательный провод красного светодиода к земле через резистор 220 Ом.

Аналогичным образом подключите положительный провод зеленого светодиода к GPIO 20 от Raspberry Pi и отрицательный вывод зеленого светодиода на землю через 220-омный резистор.

Установка правильной библиотеки в Raspbian

Нам нужно установить библиотеку телепорта в Raspbian. Введите следующую команду в терминале, чтобы её установить:

sudo pip install telepot

Объяснение кода бота Telegram

Во-первых, мы добавили необходимые библиотеки для этого проекта. Библиотека телепорта позволяет нашей "малине" общаться с ботом Telegram с использованием API. Библиотека даты и времени используется для получения даты и времени. Библиотека 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

Всякий раз, когда Pi получает сообщение от бота 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.

Ардуино+