Меню

R2D2 — Телеграм бот АстроХостела

Чему бы тебя там не учили, ты не сможешь победить силу Тёмной Стороны

(С) Император Палпатин

Время бежит вперёд. Прогресс не отстаёт. И мы, изо всех сил стараемся бежать ещё быстрее. Чтобы, хотя бы, оставаться на месте (по мотивам «Алисы в зазеркалье»). Мессенджер Telegram в 2022+ году прочно вошёл в нашу жизнь. Уже смотрится не на пять вчерашнее предложение зайти на сайт, там ввести логин с паролем, зайти в ЛК и там включить розетку под астрографом. То ли дело телеграм бот!

Хоть какой-то мессенджер, но сейчас есть почти у каждорого человека. В мобиле, на компе, на планшете и … в каждом умном утюге. С февраля 2022 популярность «телеги» кратно выросла. Т.к. это не только средства передачи сообщений, но и целая соц. сеть с огромным объёмом текстовой и фото / видео инфы. Короче, не 100%, но охват телеги сейчас у нас огромный. Чат(ы) обсерватории в телеграме. Теперь и бот там же.

Довольно мотивационной части. Перейду к описательной.

Кому нужен телеграм бот R2D2?

Бот обсерватории, что логично, нужен для всех участников обсерватории. Для админа (меня), для каждого владельца астрографа. Со мной бот, что логично, общается больше и разнообразней. Принимает от меня команды и передаёт инфу Клиентам. Собирает ОС от них, дайджест передаёт мне. У каждого клиента сформирована своя изолированная структура. На сегодня она одинакова для всех Клиентов. Лишь у одного может быть или не быть задействована та или иная функция.

Зачем нужен телеграм бот R2D2?

Три цели преследует дроид:

  1. служит он для упрощения и автоматизации взаимодействий между хостерами и управляющими хостела:
    • /roof — текущий статус крыш (админ может менять);
    • /astro — ежедневный опрос, кто и что будет / не будет снимать.
  2. реализует некоторые функции управления астрографом:
    • /power, /on и /off — статус 220в розеток. Их включение / выключение;
    • /wol — разбудить комп сигналом Wake On LAN.
  3. дроид рассказывает анекдоты, даёт инфу об экономике, погоде и некоторых астрономических явлениях:
    • /weather — текущие показания погодной станции. Прогноз meteoblue на завтра;
    • /night — время заката / рассвета, когда будут сумерки гражданские, навигационные и астрономические. Будет ли Луна и в какой фазе;
    • /wind — есть ли ветер (данные с погодной станции). Откуда и как сильно дует;
    • /allsky — последний кадр с AllSky камеры обсерватории;
    • /allvid — timelapse ролик из 60 последних кадров AllSky;
    • /stars — количество звёзд на AllSky снимке за час / сутки;
    • /usd (aka /cbr) — курсы доллара и евро к рублю от ЦБ РФ;
    • /crypto (aka /btc) — курсы BTC / ETH от биржи ascendex.com;
    • ёж — любое слово «ёж» в чате придаст беседе колорит случайным анекдотом из anekdot.ru;
    • /me (aka /r2) — бот может рассказать часть своей истории. Как он жил на Татуине, кем ему приходится Люк и сложно ли быть астродроидом.

Кроме команд взаимодействия, бот ежеминутно просыпается и думает, не пора ли ему сделать что-то полезное для обсерватории. Вот что он сейчас умеет:

  • в 8 утра бот просыпается и забывает всё то, что вчера пипл заявил в желаниях снимать / не снимать;
  • в 9 утра R2 проверяет, не оставил ли кто включённым астрограф (именно астрограф, не комп). Если так, шлёт вопрос пользователю и уведомление админу. Пользователю формируется клавиатура с командой отключения питания его астрографа;
  • за час до заката бот идёт в метеоблю, замеряет прогноз на ночь и рассылает всем прогноз в виде %% облачности и картинки погодного виджета. Просит высказаться в рамках команды /astro, будет ли клиент снимать или нет. Данные собирает и …
  • … и за пять минут до заката присылает дайджест администратору хостела. Тот (я) понимает, какие астрографы надо перевести в какие режимы (дарки, лайты, флеты), что включается вручную включить, где крышки без моторов — открыть;
  • каждую минуту, бдительный R2, с тестером наперевес, проверяет состояние всех аккумуляторов дома и обсерватории. Если что не так, сразу же (настырно) шлёт мне предупреждение;
  • днём бот листает все гугл таблицы Клиентов и сообщает им о движении на их счетах. Волнуется об отрицательном балансе, если такой случайно найден. Уведомляет Админа и Клиента о том.

Как бот устроен технически?

Любой телеграм бот, работающий через вебхуки — это веб страница. Webhook — инструмент работы «быстрых» ботов с загрузкой, равной количеству сообщений. Любое сообщение боту тут же, если автор бота установил хук, в виде POST запроса идёт на выбранную в настройках «секретную» страницу.

Так как я, по работе, пишу на PHP (+Symfony), то и R2D2 пришлось жить на одной из страниц сайта хостела в виде набора PHP классов в структуре сайта. Хоть современный Symfony против создания отдельного бандла, но я за подобную изоляцию не связанных сущностей. Так что создал TelegramBundle. В нём все нужные таблицы (пока что одна Profile, служит для хранение переменных профилей пользователей), репо, команды, головной сервис App\TelegramBundle\R2D2\R2D2. и подсервисы (грубо говоря, одна команда = один сервис).

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

Межведомственное Взаимодействие бота с удалёнными сервисами

Пользователь пишет боту команду /power и получает текущие статусы своих розеток. Ему формируются вирт. клавиши с включением / выключением его розеток. Введя вручную или выбрав на виртуальной клавиатуре команду /on {имя_канала} он включает, командой /off {имя_канала} выключает розетку.

Итак, бот — это PHP страница на вирт. сервере где-то в Латвии. Но как есть включить питание астрографа в Краснодарском крае?

  • команда в телеге /on boris_scope от Бориса или от меня приведёт к POST запросу на секретную страницу бота на сайте https://astrohostel.ru;
  • на этой странице проводится проверка на доступность этого канала пользователю. Одним можно одни каналы, другим другие. Админу доступно всё. Проверка и привязка пользователей идёт по их Telegram ID. Это избавляет бота от мороки с аутентификацией. Если канал недоступен, пользователю о том придёт сообщение и, (настраивается) админу тоже придёт уведомление;
  • пройденная проверка ведёт к POST запросу от https://astrohostel.ru к одному из двух «апельсинов» (мини-компов Orange Pi) одной или другой обсерватории. Сами апельсины, не имея внешних публичных IP, доступны от сервера astrohostel по VPN. Все мои устройства формируют одну виртуальную приватную сеть;
  • через самописный мини REST API endpoint код бота отправляет запрос на включение или выключение выбранного канала;
  • апельсин обсерватории проверяет соответствие буквенного кода порта к его GPIO. Включает или выключает этот порт;
  • к GPIO апельсина (через инвертор) подключен алишный блок реле. К реле подключено 220в, которые питают комп или астрограф Клиента.

Аналогично работает команда /wol. С тем только отличием, что клиент не указывает название канала, используется команда без параметров. Если в профиле пользователя есть данные о MAC адресе его компа, то код бота с astrohostel.ru шлёт команду на WOL-endpoint выбранного апельсина, указав MAC из профиля пользователя. Вывод команды /usr/bin/wol анализируется и возвращается в виде bool-статуса и строки результата.

Команда /usd шлёт запрос на сайт ЦБ РФ, получает XML, форматирует его и выдаёт текст в ответ на запрос.
Команда /crypto, аналогично, через API сервиса биржи ascendex.com, получает котировки по паре популярных криптовалют, выдаёт текст в ответ на запрос.

Команды многошагового взаимодействия (интерактивные)

Команды /roof и /astro имеют статусы, хранящиеся в профилях пользователей / крыш.

/roof, например, воспринимает два параметра (имя крыши и статус), если получает команду от админа. Админ, с использованием виртуальной клавиатуры, может легко обозначить обе или выбранную крышу как открытую или закрытую.
Остальным пользователям доступна команда /roof без параметров. Она читает профили крыш, формирует текст и отправляет ответ на запрос.

/astro более многоходовая команда.

  • в любое время любой пользователь, не исключая админа, может обозначить своё желание снимать определённый тип астрокадров (лайт, флет по небу, по флетбоксу, дарк) или пропустить съёмку сегодня. До открытия крыши он может сколько угодно раз менять свою отметку, если прогноз или другие обстоятельства изменились;
  • в любое время любой пользователь может получить список всех отметок, отправив боту команду /astro. Тот соберёт высказывания всех пользователей, сформирует текст и отправит его в ответ;
  • в 8 утра все вчерашние высказывания стираются;
  • за час до заката бот рассылает всем пользователям текущий прогноз и вирт. клавиатуру /astro с параметрами. Предлагает высказаться о планах на сегодняшнюю ночь;
  • за пять минут до заката админу присылается итоговый дайджест. Тот определяет необходимость открытия крыш, крышек, флетбоксов и время открытия.

TBD дополнить картинками

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

Ваш адрес email не будет опубликован. Обязательные поля помечены *