Telegram bot на Raspberry pi: сигнализация, контроль и управление.

Хотели бы иметь собственного бота, который  будет помощником, сигнализацией, пультом от всего, а заодно и кроссплатформенным приложением, работающим на всех ваших девайсах?

За последние пол года я написал около полусотни разных ботов для мессенджера Telegram. Пора немного поделиться хотя бы простыми примерами 🙂
Для тех, кто не любит читать, мы подготовили небольшой видеообзор, демонстрирующий возможности связок, описанных ниже.

Осторожно, будет много букаф!

Зачем мне бот от Telegram?

Телеграм, или в народе «телега», «телек», — очень крутой мессенджер! И не только тем, что он безопасный и удобный, а еще и тем, что у него открытое api. Такие программы мы любим. Это значит, что можно объединить все самое важное и критично-необходимое в одном мессенджере. С точки зрения удобства использования, бот — это всего лишь ваш контакт в телефоне, который умеет «кое-что еще». С практической точки зрения — целый сервер домашней автоматизации (Raspberry pi или любой другой МК) можно подключить к управлению и мониторингу через бота телеграма в вашем телефоне. При этом вы не заботитесь о «белой» IP адресации, или транзитном облаке для вашего трафика. Весь транспорт берет на себя Telegram! На устройстве, где будет написан ваш бот, просто достаточно иметь выход в сеть Интернет, но этим дело не ограничивается. С помощью бота можно соединить кучу областей жизнедеятельности и работы: напоминание покормить кота, вывод квартальных отчетов, управление светом на даче и т.д. и т. п. На что хватит фантазии.

Сегодня мы остановимся на небольшом симбиозе контроля и управления. Для примера нам понадобятся:

  • датчик температуры и влажности
  • датчик контроля протечек
  • датчик движения или объема
  • реле 220v c 3-5 вольтовой логикой управления

Сразу оговорюсь, что список может быть не полным или вы можете что-то выкинуть из него. Что подключать, решать вам. Как подключить все эти устройства и проверить их минимальную работу, можно посмотреть по ссылкам ниже.
Si7021: raspberry + датчик температуры и влажности
YL-83: raspberry + датчик контроля протечек
Dfrobot ir motion sensor: raspberry pi + датчик движения
Реле 220v: raspberry pi подключение реле

Создание бота Telegram

Естественное условие — наличие телеграма на вашем девайсе (телефон, пк, планшет — без разницы).
Открываем Telegram, идем в контакты и ищем в поисковой строке @botfather. Кликаем на него. Это мастер или менеджер создания и управления всех ваших ботов.
Вводим в строку ввода «/» и нажимаем «/newbot». Далее все по инструкции.


В конечном итоге, после того как вы придумаете имя контакта и уникальное имя и успешно все создадите, у вас появится TOKEN. Никому не говорите его и не пересылайте, вы будете использовать его в качестве ключа авторизации в ваших программах. При желании можете посмотреть остальные доступные команды, все они начинаются со «/». Например, вы можете создать аватарку вашему боту.

И как мне Telegram-бота написать?

Терпение, мой мальчик, и их_теозавры станут нашими! Для начала хотел бы поделиться очень удобным и простым приложением-помощником для работы с API Telegram — Telepot
Также для реализации всех возможностей потребуется Python3.5. Как установить Python3.5 вы можете прочитать в отдельной статье.
После того как Python3.5 установлен, ставим Telepot из pip:

После установки приложения убедитесь, что >>> import telepot проходит успешно в python3.5

Больше кода богу кода!

В сети видел достаточно примеров ботов, но, если честно, бОльшая часть не красива с точки зрения пользователя. Очень часто людям приходится писать в телефоне команды, а не кликать. Даже если вы видели примеры с кликами, чаще всего они со слешами в начале, которые, мягко говоря, раздражают людей. В данном примере мы попытаемся это исправить. Будем делать вот такие красивые клавиатуры и кнопки со своим содержимым и логикой работы, как на картинке ниже:

В  боте будут присутствовать блок управления реле, блок с отображением текущей информации используемых датчиков (влажность/температура/вода/обратная связь от реле) и блок настроек сигнализаций. Последний блок — это такой же блок управления, только не датчиками, а программами или их параметрами. Так же хочу отметить, что будет настроена фильтрация по разрешенным персональным id телеграмма. Данная навеска позволит иметь доступ к боту только вам и вашим близким.  Если кратко, то это самые необходимые примеры работы бота в различных проектах. Произвольные клавиатуры могут содержать текст, вызов контакта, локации и еще много чего. «Волшебные серые кнопки» имеют не меньший функционал. Если вы хотите более подробно разобраться с возможностями элементов — обратитесь к официальной документации api.

Поехали. Создаем тело бота:

Делаем файл исполняемым:

Вам необходимо в теле бота заменить разрешенные айдишники со значением None на свои, а также записать в TOKEN свои данные, полученные при регистрации бота. Как узнать свой id в Telegram?. Айдишник можно узнать, просто запустив бота и нажав на старт. Вы увидите диагностическую информацию с вашим айдишником на экране консоли.

Но перед тем как запускать бота, убедитесь, что все необходимые директории и файлы из bot.py представлены в системе! (либо перепишите сценарий под себя).
Для того чтобы вы лучше понимали, как и что должно будет работать и зачем все файлы и команды ниже, нарисую маленькую схему. Схема не претендует на звание лучшей, она лишь отображает все в упрощенном виде:

Теперь опишем все более детально.
Директория для состояния сигнализаций и файл с критической температурой:

Сценарий включения реле (signal на 20 pin BCM):

Сценарий отключения реле (signal на 20 pin BCM):

Текущее состояние реле смотрим через пин, на котором подключен сигнальный провод реле. (Конечно, вам никто не мешает сделать более реальный контроль через опторазвязку):

Считывание температуры из Si7021 (подключен по i2c):

Считывание влажности из Si7021 (подключен по i2c):

Считывание состояния из датчика наличия воды (капель). Подключен на 17pin BCM:

Итак, скрипты по управлению реле и считывания данных с датчиков написаны и протестированы, можно потестировать бота. Запускаем. Кликаем. Переписываем chat_allow на разрешенные, например, вписываем в первый свой, во второй — id телеграма жены, нет жены, тогда брата, нет брата, тогда кота 🙂
Протестировали? Красиво? Но это же не все. Во-первых, где программы сигнализаций движения/воды/температуры? Во-вторых, а как мне отправлять сообщения из системы в моего бота? Не тогда, когда я нажимаю на кнопку и получаю callback, а если что-то случится, чтобы бот сам прислал?
Спокойствие, только спокойствие! Сейчас все сделаем.

Оправка сообщений из linux в Telegram

Щас прогреем и поедем (с) Сейчас все напишем.
Для реализации такого сценария нам понадобится все тот же telepot и знание вашего персонального id и токена от бота. Ниже напишу пример скрипта, который будет отправлять входящую переменную $1 через вашего бота на ваш id. Этот сценарий можно будет вызывать любой вашей программой или приложением из системы. Согласитесь, весьма удобно. И где эти вайберы / вотсапы / скайпы ? Правильно, api — отличная вещь.
Ну, за дело:

Делаем скрипт исполняемым и работающим только под root:

Проверяем, как это работает. Запускаем сценарий и на вход подаем произвольную строку в кавычках:


Радуемся! Дело остается за малым: нужно написать небольшие сигнализации, которые бы отсылали в бота информацию о происшествиях, если таковые случились. Нам потребуется написать циклы, которые будут крутиться всегда и периодически проверять, как дела на наших датчиках.

Пишем свои маленькие «сигнализации»

Общий принцип следующий: вращаем бесконечный цикл, отвечающий за датчик, который будет периодически снимать показания, и если программа обнаружит, что показания проблемные, будет отправлять нам сообщения, скажем, раз в 10 минут (на самом деле лучше так не делать, ибо очень назойливо получать аварийные сообщения, а написать так, чтобы отсылка происходила один раз и потом только тогда, когда состояние снова станет нормальным. Но статья не об этом. Поэтому пример максимально упрощен.

Не забываем сделать сценарий исполняемым:

Последний скрипт, который мы не указали и который должен присутствовать, — это скрипт по контролю объемника.
Мы воспользуемся прерываниями библиотеки gpio и будем ждать, когда произойдет движение, и только тогда скажем об этом нашему треду из multialert.py:

Добавляем бит исполнения:

Обьемник подключен на 16 пин. При запуске этого сценария вы получите ответ, что движение есть только тогда, когда ваш обьемник действительно сработает. После этого программа завершится.

Добавление бота Telegram и остальных сценариев в автозагрузку

Знающие люди, конечно, могут написать своих демонов (шутка). Но если вы хотите, чтобы бот и сигнализации всего лишь постоянно работали после загрузки системы, можно добавить все в /etc/rc.local:

Итог

В статье предоставлен весьма подробный туториал, как сделать своего бота, работающего с различными устройствами. Причем выглядит это весьма неплохо, все кликабельно и претендует на жизнь.
Дополнительно описаны процессы создания сигнализаций и простых отсылок сообщений из системы.
Все в совокупности может тянуть на небольшой проект, НО не стоит радоваться раньше времени! Перед тем как пустить это в дело в автономное плавание, программно стоит позаботиться о корректности всех входящих данных, протестировать: а что будет, если у вас нет интернета, а если датчик перегорит , если провод сожрет кот, если… если, если.
Можно считать этот материал лабораторным, но весьма близким к реальному.

Всем упорства в работе, отсутствия коротких замыканий и да прибудет с вами сила 🙂
Подписывайтесь на блог, обещаю потихоньку выкладывать такие же функциональные и полезные статьи.

Комментарии к “Telegram bot на Raspberry pi: сигнализация, контроль и управление.”: 8

  1. Спасибо, очень хорошая статья.
    Подскажите пожалуйста, как управлять через бот не одним реле, а тремя.
    Большое спасибо, за ответ.

  2. Добрый день,
    подскажите пож-ста,
    как настроить на rasberry Pi обход блокировки Telegram для бота.
    А то уже неделю, как управление перестало работать.
    У меня настроено управление отоплением и контроль температуры по всему дому и на улице,
    уже привык к классному сервису, а тут Роском надзор весь кайф обломал

    1. Тоже долго искал, вставить где нибудь в начале:
      telepot.aio.api.set_proxy(«http://server:port»)

      1. Александр, спасибо за ваш ответ. Я новичок, подскажите пожалуйста, не могу разобраться — какой сервер и порт указывать? Можете рабочий пример написать?

  3. Ааа, допер, спасибо! Я неделю с этим мучался, с обходом блокировки, а оказывается всё так просто =)

Добавить комментарий

А не бот ли вы? *