Telegram бот для умного дома

Последние события, связанные с блокировкой Telegram очень интересные, что я не смог обойти их стороной. Для телеграма не было лучшей рекламной акции, чем сопротивление блокировкам Роскомнадзора. И хотя я до этого не пользовался телеграмом, мне пришла в голову идея создать чатбот именно для него, чтобы я смог управлять устройствами умного дома и получать оповещения через телеграм. Да, я знаю, уже давно есть API для создания ботов для других мессенджеров, я хотел создать чатбот именно для Телеграма. Не ищите в этом логики, я подобные вещи делаю по-фану. Всякие сервисы для push уведомлений тоже не подходили, поскольку я хотел еще отправлять команды. В будущем, может, прикручу один из таких сервисов.

Немного бомбежки

Бомбежка получилась больше, чем ожидалась, так что можете перелистнуть к следующему заголовку, если вас интересует техническая часть.
Простите за оффтоп, но без него, кажется, эта статья была бы не полной, тем более, что я автор этого блога и могу себя особо не цензурить, в рамках закона, конечно. Я надеюсь, что здесь не найдут признаки экстремизма и разжигания ненависти, я не хочу в тюрьму, пожалуйста! По всей видимости, есть люди, которые стремятся все изгадить, просто по злому умыслу — злодеи. В следующий раз, когда кто-то будет ругать какой-то фильм, за то, что там злодей слишком клишированный и злой просто потому что злой, ему не хватает мотивации и в реальной жизни таких не бывает, не верьте ему. Такие клишированные злодеи по-всюду. Одни испоганили ВКонтакте, потирая ручки и издавая злодейский смех, как доктор зло. Другие блокируют пол интернета, как будто это поможет в борьбе с терроризмом. Не поможет — взять накостылять на коленке свой локальный мессенджер со своими ключами шифрования могут все — даже террористы. Что вы делаете с интернетом? Вы блокируете целые облачные платформы, с кучей облачных сервисов! Я перерыв десятки прокси-серверов, в поиске подходящего, попытался создать свой. У меня есть VPS, которая может достучаться до Telegram API(несмотря на то, что ЦОД в России). Дай, думаю, создам новый сервер для прокси — не вышло. Хостер обосрался, не мог создать сервер. Видимо, я не один попытался создать проксю из-за вас, у хостера кончились ресурсы и он не смог. Или так совпало и он сам сломался. Вот, что вы делаете с интернетом. Третие принимают глупые законы, которые нереализуемы даже технически. Да-да, я о пакете Яровой вспомнил. Быть может вы внесете законопроект, который требует привлечения сторонних специалистов? Чтобы вы спрашивали сетевиков, когда хотите создать законопроект об интернете. Чтобы вы спрашивали медиков, когда вносите закон о здравоохранении. Чтобы хоть кто-то думал о последствиях, прежде, чем дать согласие!

К делу

В один день мне не хотелось заниматься чем-то полезным, связанным с учебой, работой или саморазвитием и выбрал себе интересную тему для прокрастинации — почему бы не создать чат-бота для Telegram. Да, вот так вот я могу прокрастинировать. У OpenHAB есть расширение для обращения к API Телеграмм, но оно очень скудное — там всего два Action’а, которые позволяют отправить сообщение или фотографию. Это можно было использовать для уведомлений, но мне хотелось бы отдавать команды умному дому. Кроме того, это расширение не позволяет использовать прокси серверы.
Начал я с самого простого, поставил Telegram себе, чтобы узнать что это за штука. По глупости получил API ключи для приложения, потом понял, что BotFather, который создает ботов и от которого нужно было получить токен, это сам бот.
Было решено запилить программу, которая бы работала отдельно от OpenHAB’а и передавала бы ему команды, исходя из присланных сообщений. Т.е. можно было бы сделать минискрипт, который при получении сообщения изменял бы конкретный item OpenHAB’а через REST API, или изменял бы один item со строкой, чтобы скрипт на OpenHAB’е получил эту строку и уже сам бы менял item’ы внутри системы. Но так случилось, что все устройства, которыми я управлял в доме чере OpenHAB, управлялись через MQTT. Даже та Bluetooth лампа, о которой я писал прошлую статью, ныне управлялась через самопальный MQTT клиент на Python’е, который принимал команду по MQTT и передавал её лампе по её протоколу. Так, что было решено сделать так, чтобы Telegram бот стал бы еще MQTT клиентом, который передал бы команды устройствам без посредника в виде OpenHAB. Кроме того, это более универсальное решение, которое можно будет интегрировать с другими системами умного дома. Сам бот разрабатывался на nodejs с использованием пакетов node-telegram-bot-api, mqtt и got(Для REST запросов к OpenHAB, позже скажу, зачем).
Самым сложным испытанием было найти прокси для доступа к Telegram API. Хотя Telegram имеет хороший клиент, который позволяет обходить блокировки достаточно прозрачно для конечного пользователя, сам сайт Телеграмма заблокирован, что не дает боту доступа к API, с которым он должен общаться посредством совершения простых HTTP вызовов. В этом не было бы проблемы, если бы бот хостился на зарубежном VPS, будь он даже заблокирован в России, до самого Телеграмма он достучаться смог бы, а большего и не надо. Но бот должен хоститься дома, на Raspberry PI вместе с сервером умного дома. Иначе пришлось бы поднимать его через VPS, тянуть какой-то канал связи, в качестве посредника для передачи команд, будь то внешний MQTT брокер или HTTP polling сервер. К счастью, библиотека, с которой я работал, умела работать с HTTP прокси. Как я уже упомянул, я перерыл десяток прокси. Я даже был не уверен, в прокси дело или в моем коде. В последствии оказалось, что в моем коде тоже проблема, но я взял все-таки стандартный пример node-telegram-bot-api и таки перебрав десятки серверов, нашел доблестный украинский HTTP прокси сервер, который стабильно пускал polling запросы к Telegram API. Не скажу какой, мне достаточно было того, что заблокировали мое любимое зеркало Флибусты с OPDS каталогом, с которого я успешно пиратил книжки несколько месяцев.

На данный момент успел реализовать следующий функционал: чат-бот может подавать команды на включение-выключение захардкоженым устройствам, посредством MQTT. Может писать о текущем состоянии устройств, которое отслеживается также посредством MQTT. Может писать информацию о погоде. Саму информацию OpenHAB берет посредством REST API с сайта народного мониторинга, но дабы не чат бот не опрашивал лишний раз сайт народного мониторинга, он делает запрос прямо в OpenHAB, посредством REST API, для получения всех item’ов и выбирает данные из нужных четырех.

Ссылочка на проект на GitHub
Update 23.04: Я начал осваивать TOR. TOR + любой socks2HTTP прокси, вроде polipo, позволит захостить данного бота где угодно.