Проверка доступности API Telegram в Hass.io

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

Статья подразумевает, что вы уже сходили на поклон к BotFather, настроили бота Telegram и знаете, где взять API токен.

Создаём сенсор Telegram API

Создадим простой файл скрипта telegram_health.sh, который будет возвращать нужный нам результат:

if curl --silent --fail -m 5 -o /dev/null -G  https://api.telegram.org/botXXXXX:YYYYY/getMe; then
    echo online
else
    echo offline
fi

Где XXXXX:YYYYY - это API token, полученный при создании бота. Файл можно проверить в любом окружении Linux, запустив команду

sh telegram_health.sh

Если всё сделано правильно, скрипт должен нам ответитьonline.

Socks Proxy

Если ваш телеграм работает через Socks Proxy, в строку вызова curl выше можно добавить адрес этой прокси, например, так:

curl --silent --fail -m 5 -o /dev/null -G  -x socks5://ip:port https://api.telegram.org/botXXXXX:YYYYY/getMe

вариант с паролем:

curl --silent --fail -m 5 -o /dev/null -G  -x socks5://login:password@ip:port https://api.telegram.org/botXXXXX:YYYYY/getMe 

Копируем скрипт в Hass.io

Теперь нам надо определиться, куда мы скопируем наш скрипт. Я предлагаю просто создать папку scripts внутри директории config и скопировать его туда. Это решение будет работать как с hassos, так и с hassio, установленным любым способом. Ещё один плюс - мы можем спокойно редактировать этот файл аналогично тому, как мы редактируем конфиги Hass.io

Создаём сенсор

Добавляем в раздел sensors: файла configuration.yaml следующие строки:

- platform: command_line
  name: "Telegram Status"
  command: sh /config/scripts/telegram_health.sh

Проверяем, что всё работает

Заходим в список наших сущностей (иконка <> в левом нижнем углу, набираем в фильтре telegram) и видим наш замечательный сенсор в статусе online:

1559841031905

Проверить его работу достаточно просто - по умолчанию сенсор обновляется каждую минуту, достаточно отредактировать telegram_health.sh так, чтобы API нас отругал (например, заменить один символ в токене) и статус сенсора в течение минуты должен измениться на offline:

1559840956560

Создаём автоматизацию для уведомления

Использовать Telegram для уведомления о прекращении его работы не получится по понятным причинам, поэтому нам нужно выбрать другой канал нотификаций. Я решил выбрать html5 push нотификации, которые замечательно работают на платформах Windows и Андроид и точно не поддерживаются на iOS.

Квест по настройке, включающий в себя подтверждения владения доменом, от имени которого отправляются нотификации, пересказывать не буду, но оно того стоило. Теперь любое устройство, на котором открыт браузер Chrome или Firefox может выступать получателем таких сообщений, достаточно открыть веб-интерфейс Home Assistant и активировать переключатель push нотификаций:

1559841318857

На Android устройстве браузер может быть закрыт, уведомление всё равно придёт. Ходят слухи, что такого же поведения можно добиться в Google Chrome для Windows, установив хотя бы одно расширение, требующее прав для работы в фоновом режиме (background), но я не проверял, так как браузер у меня и так всегда открыт.

Создадим пару автоматизаций, которые будут отправлять на все устройства сообщение о недоступности Telegram и (sic!) удалять это сообщение, когда сервис окажется онлайн.

- id: '1559835053687'
  alias: Telegram is down
  trigger:
  - entity_id: sensor.telegram_status
    platform: state
    from: online
    to: offline
    condition: []
    action:
  - data:
    message: Telegram API is down!
    data:
      tag: telegram_down
    service: notify.homeassistant
- id: '1559835053688'
  alias: Telegram is up
  trigger:
  - entity_id: sensor.telegram_status
    platform: state
    from: offline
    to: online
    condition: []
    action:
  - data:
    data:
      tag: telegram_down
    service: notify.html5_dismiss

Здесь мы используем специальное свойство tag, позволяющее управлять конкретной нотификацией, которую мы отправили ранее. Например, закрыть её.

Вот так это выглядит на экране компьютера:

1559842086244

Вместо заключения

Сделать сенсор доступности API Telegram оказалось несложно. Нужно заметить, что он не отреагирует, если ваш бот вдруг испустит дух, но будет фиксировать только доступность API Telegram. Понятно, что у технологии html5 push есть свои ограничения, тут каждый может выбрать резервный канал нотификаций, подходящий ему. Остаётся только пожелать, чтобы данный сенсор нам никогда не понадобился.