Как настроить отправку сообщений в Telegram из Home Assistant

Есть несколько разных способов как можно отправлять сообщения из Home Assistant. Если вы используете мессенджер Telegram, то очень удобно настроить чтобы сообщения из Home Assistant приходили именно в этот мессенджер.

Подключение состоит из нескольких этапов:

Для некоторых интеграций обязательно необходимо чтобы сервер Home Assistant был доступен снаружи, но в случае Telegram — это не обязательно. Можно настроить отправку сообщений в Telegram вне зависимости от того, есть ли у вас доступ к Home Assistant снаружи или его нет.

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

Для того чтобы можно было отправлять сообщения из Home Assistant нужно создать Telegram бота. Для того чтобы создать бота нужно поговорить со специальным ботом https://t.me/BotFather (это официальный бот Telegram)

Этому боту нужно отправить команду "/newbot". После этого он спросит две вещи: имя и логин бота. Имя можно ввести любое, а логин обязательно должен заканчиваться на слово "Bot". Ботов уже очень много и многие логины заняты, возможно не сразу получится найти логин который свободен.

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

Результат — BotFather пришлет сообщение что бот создан и в этом сообщении будет токен.

Вот токен, который получил я:

1251738428:AAGCg-TlvbP7ug8pKTJ8N5As3Zz1nhzvyOo

(После написания этого текста я поменял этот токен, так что не получится использовать эту строчку для управления моим ботом)

Узнать собственный ID в Telegram

Чтобы отправлять сообщения из Home Assistant нужно знать кому их отправлять. Нужно узнать собственный ID в Telegram. Есть множество Telegram ботов с помощью которых можно выяснить собственный ID. Например, https://t.me/GetIdsBot Этому боту нужно отправить сообщение /start, а в ответ он пришлет всю техническую информацию про ваш аккаунт. Из ответа бота нужно только значение ID.

Настройка Home Assistant

На данные момент у вас уже есть токен бота, есть ID вашего аккаунта, теперь нужно написать конфиг для Home Assistant.

В файл secrets.yaml нужно вписать (только нужно указать токен вашего бота):

secret_telegram_token: 1251738428:AAGCg-TlvbP7ug8pKTJ8N5As3Zz1nhzvyOo

А в файл configuration.yaml нужно вписать (только в двух местах этого конфига нужно указать ID вашего аккаунта в Telegram):

telegram_bot:
  - platform: polling
    api_key: !secret secret_telegram_token
    parse_mode: html
    allowed_chat_ids:
      - 120351727

notify:
  - name: me
    platform: telegram
    chat_id: 120351727

После этого нужно перезапустить Home Assistant.

Проверка работы

После того как Home Assistant запустился, нужно зайти в раздел "Services" (часто находится по адресу http://hassio.local:8123/developer-tools/service )

И начать там вводить название нового сервиса notify.me, который мы добавили:

Такой сервис должен быть. Нужно его выбрать, и в дополнительное поле ввести:

message: asdf

После этого, если нажать на кнопку, то вам в Telegram должно придти сообщение "asdf" от вашего бота.

Но если вы сейчас нажмете эту кнопку, то сообщение не придет (можете попробовать).

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

Так что сначала, нужно найти в Telegram вашего бота (BotFather вам прислал ссылку на него) и написать ему какое-нибудь сообщение.

После этого можно попробовать отправить сообщение из инструмента Home Assistant и вы его получите.

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

Итак, сейчас у вас в Home Assistant появился сервис с помощью которого можно отправлять сообщения в Telegram. Дальше его нужно начать использовать в автоматизациях.

Вот пример автоматизации которая отправляет в Telegram текущее время:

automation:
  - alias: Send time to telegram
    trigger:
      platform: time_pattern
      minutes: "/1"
    action:
      service: notify.me
      data_template:
        message: "{{ now().strftime('%H:%M') }}"

Конечно, нет никакого смысла отправлять каждую минуту текущее время. Это просто пример как можно использовать шаблоны в сообщениях (Есть отдельный текст с подробностями как использовать шаблоны в Home Assistant)

А вот пример полезной автоматизации. При запуске Home Assistant придет сообщение в Telegram. Удобно узнать что HA уже стал доступен после штатной перезагрузки или по какой-то причине он сам перезапустился:

automation:
  - alias: Notify about HA start
    trigger:
      platform: homeassistant
      event: start
    action:
      service: notify.me
      data:
        message: "Home Assistant - start"

(Про автоматизации у меня есть отдельный текст, в котором я рассказываю основные вещи как работают автоматизации и как их создавать)

Для чего можно использовать отправку сообщений? Например, уведомлять о всяких нештатных событиях: перегрелся процессор; никого нет дома, но идет потребление воды; влажность в ванной долго не приходит в норму. Можно присылать всякую статистику — первого числа присылать отчет о том сколько было потрачено электричества и разбивку по потребителям. Удобно присылать всякую отладочную информацию — в сети появилось новое wifi устройство; успешно подключено новое устройство к zigbee сети.

Стандартная проблема

Достаточно часто при настройке сообщений в Telegram из Home Assistant возникает проблема: некоторые сообщения отправляются, а некоторые нет.

Одна из причин почему так может быть — в конфигурационных файлах Home Assistant в разделе "telegram_bot:" не указано значение для параметра "parse_mode". В этом случае используется значение "parse_mode" по умолчанию, т.е. "markdown". А в таком случае некоторые сообщения вызывают ошибку и не отправляются. Например сообщение "asdf_asdf" не может быть отправлено в режиме "markdown".

Вот какая ошибка будет видна в логе:

Logger: homeassistant.components.telegram_bot
Source: components/telegram_bot/__init__.py:566
Integration: Telegram bot (documentation, issues)
First occurred: 12:38:53 PM (1 occurrences)
Last logged: 12:38:53 PM

Error sending message: Can't parse entities: can't find end of the entity starting at byte offset 4. Args: (120351727, 'asdf_asdf'), kwargs: {'parse_mode': 'Markdown', 'disable_notification': False, 'disable_web_page_preview': None, 'reply_to_message_id': None, 'reply_markup': None, 'timeout': None}

Это, конечно же, баг в Home Assistant, который должен быть исправлен. Но пока этот баг существует, решение — это явно указать "parse_mode: html" в настройках.

Что можно еще сделать

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

А еще можно отправлять сообщение не конкретному человеку, а в групповой чат.

Кроме отправки сообщение еще есть возможность настроить управление Home Assistant через команды в telegram, в некоторых ситуациях это может быть удобно.

Иван Бессарабов
ivan@bessarabov.ru

4 сентября 2020

Кстати, у меня есть телеграм канал про Home Assistant: https://t.me/bessarabov_ha