max-notify-ha

Тип проекта: личный проект

MaxNotify - интеграция для отправки сообщений в мессенджер MAX из Home Assistant

Звезды: 38
🍴Форки: 3
🔄Обновлен: 10 апр. 2026 г.
📰 Релизы
Релиз: v1.4.7 (10.04.2026)

[1.4.7] — 2026-04-10

Добавлено

  • Для режима notify.a161.ru добавлен полноценный приём входящих через Polling updates queue:
    • выбор режима приёма «Только отправка / Polling» в мастере и в настройках;
    • новый шаг настройки интервала опроса /updates (updates_interval, диапазон 2-30 секунд, по умолчанию 5 секунд).
  • В сервисы отправки медиа добавлена опция url_basic_auth (формат логин:пароль) для скачивания файлов по URL с BasicAuth:
    • max_notify.send_photo
    • max_notify.send_document
    • max_notify.send_video
  • Для URL вида http://логин:пароль@host/... учётные данные также поддерживаются автоматически.

Изменено

  • Для notify.a161.ru добавлена отправка inline-кнопок для текста и при отправке фото/документов/видео (где поддерживается API сервиса).
  • Сенсор последнего входящего сообщения теперь создаётся по режиму приёма, а не только по типу интеграции: при включённом приёме (в т.ч. notify.a161.ru + polling) сенсор входящих доступен.
  • Интерфейс, переводы, manifest, HACS и документация унифицированы по новому названию: MaxNotify (вместо Max Notify).
  • В README и services.yaml обновлены описания сервисов и добавлены пояснения по url_basic_auth.

Улучшено

  • Для notify.a161.ru расширена совместимость с форматами ответов /updates (reply/result/data, list/dict/string) с нормализацией во внутренний формат события.
  • Улучшена дедупликация callback-событий: приоритет ключа по callback_id, что снижает риск дублей.
  • Повышена устойчивость жизненного цикла интеграции:
    • более безопасный перезапуск polling при reload/reconfigure;
    • защита от накопления duplicate update listeners;
    • thread-safe планирование reload через hass.add_job(...).

Автоматическое поведение для notify.a161.ru

  • Добавлена защитная логика для режима polling без кнопок:
    • если включён polling, но кнопки не настроены, запускается grace-период;
    • при отсутствии отправок с кнопками в течение 24 часов режим автоматически переводится в «Только отправка»;
    • запись интеграции переименовывается под новый режим, в Home Assistant создаётся уведомление.

Ссылки

  • Изменения относительно прошлой версии: v1.4.6…v1.4.7
Релиз: v1.4.6 (07.04.2026)

[1.4.6] — 2026-04-07

Исправлено

  • Исправлена ошибка, из-за которой отправка могла падать при сетевых таймаутах/кратковременных проблемах соединения с API Max.
    Теперь для сетевых ошибок и таймаутов добавлены повторные попытки с задержками.

Добавлено

  • В сервисы отправки медиа добавлена опция disable_ssl (отключение проверки SSL для конкретного вызова):
    • max_notify.send_photo
    • max_notify.send_video
    • max_notify.send_document
  • Опция полезна для источников с self-signed или некорректными сертификатами.

Улучшено

  • Унифицирован таймаут чтения файлов по URL для отправки медиа (единый timeout вместо разных значений в отдельных ветках).
  • Исправлены и унифицированы тексты раздела «Кнопки» в переводах и сервисных описаниях (RU/EN), чтобы форматы кнопок были описаны одинаково и без неоднозначностей.

Совместимость с Home Assistant

  • Улучшена проверка минимальной версии Home Assistant:
    • в мастере настройки при несовместимой версии показывается понятная ошибка с требуемой версией из manifest.json;
    • при загрузке уже существующей записи интеграции добавлена жесткая runtime-проверка: несовместимая запись не загружается;
    • при несовместимости создается запись в Repairs с пояснением;
    • если для записи был включен WebHook (official API), интеграция пытается снять подписку WebHook в API Max перед блокировкой загрузки.

Ссылки

  • Изменения относительно прошлой версии: v1.4.5…v1.4.6
Релиз: v1.4.5 (06.04.2026)

[1.4.5] — 2026-04-06

Интерфейс вызова сервисов

  • В формах сервисов Max Notify (отправка текста, фото, документа, видео, удаление и правка сообщения) поле «Сущность уведомления» снова показывает доступные цели: у фильтра списка оставлен только домен notify (без привязки к integration в селекторе Home Assistant). В списке могут отображаться и другие службы notify.* (другие интеграции или YAML вроде notify через rest на notify.a161.ru) — нужно выбирать сущность именно этой интеграции Max Notify.
  • Режим notify.a161.ru и записи без сохранённого типа в данных, но с заголовком, содержащим notify.a161.ru, снова однозначно определяются как этот режим во всех проверках, где это важно.

Официальный API Max: WebHook, HTTPS и режимы приёма

  • WebHook предполагает, что у Home Assistant настроен внешний HTTPS-URL (доступ из интернета для серверов Max). Подробно — в README (раздел «Сеть», сценарии с Nabu Casa / reverse proxy).
  • При каждой загрузке интеграции выполняется проверка: если выбран приём WebHook, но собрать корректный внешний HTTPS-вебхук нельзя, интеграция снимает подписки WebHook в Max, переводит запись в режим «Только отправка», очищает секрет вебхука, обновляет заголовок записи и создаёт запись о проблеме (repair) с подсказкой проверить Настройки → Система → Сеть.
  • В журнал (INFO) при старте официальной записи добавлена строка диагностики: доступен ли HTTPS для вебхука, итоговый URL и заданные внешний/внутренний адреса.
  • Один и тот же токен бота нельзя использовать одновременно для Long Polling на одной записи интеграции и WebHook на другой: конфликтующий режим скрыт в мастере, при сохранении настроек показывается ошибка. В одной записи по-прежнему можно переключать режим (снятие подписок при необходимости).
  • Поля ввода токена и секретов в мастере настроены так, чтобы браузер по возможности не предлагал сохранить пароль (autocomplete off).

Режим notify.a161.ru

  • Для видео улучшены повторные попытки отправки при необходимости (согласно логике сервиса).

Документация и переводы

  • README и тексты интерфейса (RU/EN) обновлены под новое поведение WebHook и сети.

Ссылки

  • Изменения относительно прошлой версии: v1.4.4…v1.4.5
Релиз: v1.4.4 (05.04.2026)

[1.4.4] — 2026-04-04

Официальный API Max: кнопки-ссылки

  • В клавиатуре сообщения можно задать кнопки типа «ссылка» (link): подпись и URL, по нажатию открывается сайт в браузере.
  • В URL допускаются только протоколы http и https (требование API). Иначе в Home Assistant показывается понятная ошибка валидации, а не сырой ответ сервера.
  • Настройка через UI: при добавлении/редактировании кнопки выбирается тип «Ссылка» и поле URL; в сервисах — поле url у кнопки с type: link (см. README и подсказки в формах).

Режим notify.a161.ru

  • Лимит размера файла перед загрузкой унифицирован: до 10 МБ для фото, документов и видео (одна проверка для всех типов вложений).
  • Между успешными исходящими сообщениями для одной записи интеграции выдерживается пауза не менее 1 секунды — снижает нагрузку на API, если из автоматизаций подряд уходит много отдельных сообщений. На официальный API Max это не распространяется.

Документация

  • README, services.yaml и переводы интерфейса обновлены: кнопки link, лимит 10 МБ и пауза 1 с для notify.a161.ru.

Ссылки

  • Изменения относительно прошлой версии: v1.4.3…v1.4.4
Релиз: v1.4.3 (04.04.2026)

[1.4.3] — 2026-04-03

Режим notify.a161.ru: возможности и лимиты

  • Видео — доступен сервис max_notify.send_video (как у официального API, с учётом ограничений сервиса). Перед загрузкой проверяется размер до 10 МБ; при превышении в интерфейсе Home Assistant показывается понятная ошибка.
  • Удаление и правка сообщений — сервисы max_notify.delete_message и max_notify.edit_message больше не блокируются для этого режима: запросы уходят на API notify.a161.ru (без версии v= в URL, как ожидает сервис). Фактическая поддержка операций зависит от сервиса; по ответу сервера видно успех или ошибку.
  • Фото и документы — при слишком большом файле вместо только записи в журнал показывается ошибка валидации в UI (лимит порядка 4 МБ). Для ожидания обработки вложения на стороне сервера (attachment.not.ready) используются повторы с паузами и параметр count_requests — в том числе для notify.a161.ru (фото, документ, видео), а не только одна попытка.
  • Текст с кнопками в вызове — для notify.a161.ru по-прежнему уходит только текст; inline-клавиатура и кнопки из настроек не отправляются в API (поведение явно зафиксировано в коде и логах).

Интерфейс настройки (мастер и опции)

  • Для notify.a161.ru убраны шаги с настройкой клавиатуры к сообщениям (и при первой настройке, и при открытии шестерёнки / Перенастроить): остаются токен, формат сообщений и при первичной настройке — user_id.
  • Записи, у которых в данных не был сохранён тип интеграции, но заголовок содержит notify.a161.ru, снова распознаются как этот режим; при сохранении настроек тип записывается в конфигурацию.

Сенсоры

  • Для notify.a161.ru не создаётся сенсор последнего входящего сообщения (входящие обновления Max для этого режима недоступны). Сенсор последнего исходящего сообщения сохраняется.

Документация

  • README обновлён: актуальный список возможностей и ограничений notify.a161.ru, описание count_requests, разделы по send_video, delete_message, edit_message, пояснение про настройки без мастера кнопок.

Ссылки

  • Изменения относительно прошлой версии: v1.4.2…v1.4.3
Релиз: v1.4.2 (03.04.2026)

[1.4.2] — 2026-04-03

Новое и улучшено

  • Режим notify.a161.ru: фото и файлы — доступны сервисы max_notify.send_photo и max_notify.send_document (путь/URL к файлу и при необходимости подпись). Ограничения по размеру и форматам задаёт сторона сервиса (в интеграции проверяется лимит порядка 4 МБ до загрузки). Поведение официального API platform-api.max.ru при отправке изображений и документов не менялось.
  • Интерфейс «Добавить чат» — если в списке выбрана интеграция с notify.a161.ru, вместо ошибки показывается понятное сообщение: в этом режиме нельзя добавлять чаты к записи, для другого получателя нужна новая интеграция Max Notify.
  • Совместимость с ответами API notify.a161.ru при загрузке: корректная обработка ответов без ожидаемого заголовка Content-Type: application/json и разных форм ответа после загрузки файла (в том числе с полями token и fileId).

По-прежнему для notify.a161.ru

  • Не поддерживаются видео (send_video), редактирование и удаление сообщений.
  • Клавиатура и свои кнопки в вызовах сервисов для этого режима не работают; при отправке медиа кнопки из вызова игнорируются (как и раньше для текста).
  • Сервис по-прежнему может отвечать пустым телом без message_id.

Документация

  • В README обновлены ограничения и возможности режима notify.a161.ru, описания сервисов send_photo / send_document.

Ссылки

  • Изменения относительно прошлой версии: v1.4.1…v1.4.2

Релиз: v1.4.1 (01.04.2026)

[1.4.1] — 2026-04-01

Изменено

  • Для сервиса notify.a161.ru добавлена отправка в группы

Ссылки

  • Изменения относительно прошлой версии: v1.4.0…v1.4.1

Релиз: v1.4.0 (27.03.2026)

[1.4.0] — 2026-03-27

Новое

  • Добавлен новый режим подключения через сторонний сервис notify.a161.ru (выбор типа интеграции на первом шаге настройки):
    • отдельная ветка мастера настройки;
    • отдельные поля/подсказки в UI;
    • отдельные переводы (RU/EN);
    • валидация токена формата сервиса (36 символов).
  • Для пользовательских кнопок в сервисах добавлен новый удобный формат многорядной раскладки:
    • каждый объект верхнего списка трактуется как отдельный ряд;
    • старые форматы полностью сохранены (обратная совместимость).

Изменено

  • Логика отправки сообщений теперь учитывает тип интеграции:
    • официальный режим использует platform-api.max.ru;
    • режим стороннего сервиса использует notify.a161.ru.
  • В документации (README, AUTOMATIONS, сервисные примеры) разделены сценарии для официального API и стороннего сервиса.
  • Для видео на официальном API увеличены задержка и окно повторов при ожидании обработки вложений — стабильнее для больших файлов.

Ограничения режима notify.a161.ru

  • Поддерживается только отправка текстовых сообщений.
  • Поддержка inline-кнопок (buttons, send_keyboard) в этом режиме отключена.
  • Не поддерживаются сервисы:
    • отправка фото/документов/видео;
    • редактирование сообщений;
    • удаление сообщений.
  • При отправке сервис может возвращать пустой HTTP-ответ без тела (без message_id).

Улучшено в диагностике

  • После успешной отправки текста в лог пишется полный ответ сервера.
  • Добавлена попытка извлечь message_id из ответа с явным логом результата (найден / не найден).

Ссылки

  • Изменения относительно прошлой версии: v1.3.1…v1.4.0

Релиз: v1.3.1 (23.03.2026)

[1.3.1] — 2026-03-23

Важно: как теперь работают кнопки под сообщением

С 1.3.1 правила одинаковые для текста, фото, документа, видео и для редактирования сообщения (когда вы задаёте поле с кнопками):

  • Если включено «Отправлять клавиатуру» (так по умолчанию):
    не указали свои кнопки в вызове — к сообщению подставляется стандартная клавиатура из настроек интеграции; указали непустые свои кнопки — к сообщению идут только они, без склейки со стандартной; указали кнопки, но список пустой — снова используется стандартная клавиатура из настроек.
  • Если «Отправлять клавиатуру» выключено: стандартная клавиатура не подставляется; прикрепляются лишь явно заданные в вызове кнопки (если они не пустые).

Так проще предсказать результат в автоматизациях и не зависеть от того, какой именно сервис вы вызываете.

Улучшено в интерфейсе Home Assistant

  • Для фото, документа, видео и редактирования сообщения в формах сервисов появились названия и пояснения к переключателю «Отправлять клавиатуру» (русский и английский).
  • Тексты подсказок для кнопок и клавиатуры приведены в соответствие с описанной выше логикой.

Ссылки

  • Изменения относительно прошлой версии: v1.3.0…v1.3.1

Релиз: v1.3.0 (22.03.2026)

[1.3.0] — 2026-03-22

Важно: обязательно обновиться, если включён Long Polling

При приёме сообщений режимом Long Polling в прошлых версиях Home Assistant мог долго ждать завершения загрузки или писать в лог предупреждение о таймауте при старте — как будто интеграция «висит» на этапе настройки.
В 1.3.0 опрос сервера Max перенесён так, что он не блокирует запуск Home Assistant: после обновления система должна нормально дозагружаться, а входящие сообщения по-прежнему обрабатываются.

Новое

  • Удаление сообщения — отдельное действие сервиса: указали идентификатор сообщения и нужный чат/интеграцию, сообщение удаляется в Max. Удобно для автоматизаций «убрать старое меню».
  • Редактирование сообщения — можно изменить текст, формат (обычный текст, Markdown или HTML), заменить или убрать кнопки под сообщением.
  • Свои кнопки к любой отправке — при отправке текста, фото, документа или видео в дополнительных полях можно задать кнопки, которых нет в настройках интеграции (например, одноразовое меню для сценария). Они добавляются к уже настроенной клавиатуре, если она к сообщению прикрепляется.
  • Больше попыток для тяжёлых файлов — для фото, документа и видео можно указать, сколько раз повторять отправку, если сервер не сразу принял большой файл. Сами паузы между попытками работают предсказуемее.
  • Два сенсора на каждую интеграцию — отдельно запоминается последнее отправленное из Home Assistant сообщение и последнее входящее (по данным приёма). Идентификатор в интерфейсе показывается без префикса mid., чтобы проще копировать в автоматизации.
  • Примеры автоматизаций — в репозитории добавлен отдельный файл с примерами вызовов сервисов и разбора входящих событий; в основном описании (README) есть на него ссылка.

Улучшено

  • В событии о входящем сообщении чаще и надёжнее передаётся идентификатор сообщения; для продвинутых сценариев доступны полные данные, которые прислал Max (чтобы ничего не «терялось» в упрощённом виде).
  • Подписи к полям и сообщения об ошибках в интерфейсе Home Assistant дополнены там, где появились новые действия (в том числе на русском и английском).

Ссылки

  • Изменения относительно прошлой версии: v1.2.2…v1.3.0

Релиз: v1.2.2 (05.03.2026)

[1.2.2] — 2026-03-05

Изменено

  • Отправка по recipient_id при наличии сущности

    • Изменена приоритетность цели для сервиса max_notify.send_message: если в вызове указаны дополнительные идентификаторы (recipient_id, chat_id, user_id), они имеют приоритет над entity_id.
    • Это позволяет использовать заранее настроенную сущность notify.max_notify_... как «интеграцию по умолчанию», но при этом в конкретном вызове сервиса переопределять получателя через recipient_id (например, отправить сообщение в личный чат при наличии группового notify).
  • Прямая отправка сообщений без сущности notify

    • Добавлена возможность отправлять сообщения напрямую по recipient_id / chat_id / user_id даже если для указанных ID нет соответствующей сущности notify.max_notify_....
    • В обработчике сервиса при наличии явных ID и отсутствии buttons сообщение формируется и отправляется напрямую через новый вспомогательный метод send_plain_message, минуя поиск сущностей в реестре Home Assistant.
  • Улучшение UI форм сервисов

    • Для полей message и title сервиса send_message, а также caption в send_photo, send_video и send_document включён многострочный ввод (multiline: true) в services.yaml для более удобного редактирования текста в интерфейсе Home Assistant.
  • Уточнён текст ошибок и локализация

    • Сообщение об ошибке missing_target обновлено: теперь явно указывается, что можно использовать recipient_id, chat_id или user_id в связке с entity_id или config_entry_id.
    • Для случая, когда по переданному recipient_id/chat_id/user_id не удаётся определить получателя, добавлена локализованная ошибка plain_recipient_not_resolved, которая отображается в интерфейсе Home Assistant при вызове сервиса.
    • Для новых и существующих ошибок (invalid_notify_entity, missing_target, invalid_config_entry, missing_config_entry_id, no_matching_entities, plain_recipient_not_resolved) добавлены записи в секции exceptions переводов (en/ru) в формате, поддерживаемом Home Assistant.

Релиз: v1.2.1 (05.03.2026)

[1.2.1] — 2026-03-05

Добавлено

  • Единый идентификатор получателя (recipient_id)
    Для всех сервисов max_notify.send_message, send_photo, send_document, send_video добавлен параметр recipient_id (в схемах, обработчиках и UI):

    • положительное число — личный чат (User ID);
    • отрицательное число — групповой чат (Chat ID).
      В событии max_notify_received добавлено поле recipient_id с тем же смыслом, что и при настройке чата. Это позволяет в автоматизациях просто передавать recipient_id обратно в сервис, чтобы ответить «в тот же чат», независимо от типа (личка или группа).
  • Логирование и отладка
    Добавлены подробные DEBUG-логи:

    • async_process_update: логируются entry_id, тип апдейта, ключ дедупликации и «сырое» тело update (ограниченное по длине);
    • polling GET /updates: marker, параметры запроса, количество полученных обновлений, новый marker;
    • регистрация сервисов (register_send_message_service, _ensure_service_registered), выбор действия в меню опций/кнопок, длина webhook-секрета;
    • отправка сообщений/медиа: параметры получателей, длина текста, количество попыток и успех/ошибки Max API; при 5 неудачных попытках создаётся persistent_notification в HA с деталями ошибки.

Изменено

  • README.md

    • В таблицу max_notify_received добавлено поле recipient_id и пояснение, что оно рекомендуется для автоматизаций; chat_id и user_id помечены как низкоуровневые.
    • Примеры автоматизаций переписаны на использование recipient_id (одна строка вместо choose с проверкой знака chat_id).
    • В описании сервиса max_notify.send_message добавлен параметр recipient_id и уточнено, что в «Дополнительно» можно использовать связку config_entry_id + recipient_id.
  • Сервисы и схемы

    • В schemas.py добавлен CONF_RECIPIENT_ID во все схемы сервисов (send_message, send_photo, send_document, send_video).
    • В services.py реализован разбор recipient_id по знаку на списки chat_ids/user_ids в обработчиках отправки сообщения, фото/документа и видео; добавлены DEBUG-логи _resolve_entity_ids, async_send_message_handler, _send_photo_or_document, _send_video.
    • В services.yaml в блоках advanced всех четырёх сервисов добавлено поле recipient_id (пример: положительный User ID, отрицательный Chat ID).
  • Переводы

    • Для всех сервисов добавлены локализованные описания поля recipient_id (en/ru).
    • Поля chat_id и user_id в переводах помечены как устаревшие в контексте send_message (name с пометкой (deprecated) / (устарело) и описание с рекомендацией использовать recipient_id).
  • Улучшенная отправка сообщений
    В notify.py добавлена повторная отправка сообщений в Max с экспоненциальной задержкой и финальным уведомлением:

    • до 5 попыток с логированием и паузами 1/2/4/8 секунд между ними;
    • при окончательном провале создаётся persistent_notification в Home Assistant с информацией об ошибке и URL запроса.

Технические детали

  • В updates.py:
    • из update теперь формируется поле recipient_id (user_id для лички, отрицательный chat_id для группы);
    • для message_callback при отсутствии /команды текстовая команда берётся из callback_data — это унифицирует обработку кнопок и текстовых команд по полю command.
  • Добавлены DEBUG-логи в ключевые точки: регистрация сервисов, настройка webhook, генерация уникального имени записи, polling /updates и обработка каждого update.

Релиз: v1.2.0 (16.02.2026)

[1.2.0] — 2026-02

Добавлено

  • Приём сообщений от бота Max

    • Режим приёма в настройках: Только отправка, Long Polling (опрос API) или Webhook (HTTPS-URL). При Webhook отображается URL для подписки, опционально — секрет (заголовок X-Max-Bot-Api-Secret).
    • Событие max_notify_received: при входящем сообщении или нажатии inline-кнопки. В event.dataupdate_type (message_created / message_callback), config_entry_id, user_id, chat_id, text, command, args, callback_data, event_id.
    • Long Polling: цикл GET /updates с маркером, таймаут и лимит из const. Запуск/остановка при setup/unload записи.
    • Webhook: HTTP-представление MaxNotifyWebhookView, регистрация/отмена URL при смене режима.
  • Кнопки клавиатуры (inline-кнопки)

    • В config flow (при Polling/Webhook): шаг после секрета — меню «Кнопки клавиатуры»: добавить / удалить кнопку или продолжить. Кнопка: ряд, тип (callback / message), подпись, payload (для callback). Сохранение в options.buttons.
    • В options flow: меню кнопок с действиями «Добавить кнопку», «Редактировать кнопку», «Удалить кнопку», «Завершить». Шаги выбора кнопки для редактирования и форма редактирования (ряд, тип, подпись, payload). Пояснение в переводах: payload приходит в событии как callback_data для триггеров автоматизаций.
    • Отправка сообщений с кнопками: в notify.pysend_message_with_buttons() и _normalize_buttons_for_api(); POST /messages с attachments: [{ type: "inline_keyboard", payload: { buttons } }].
    • Сервис max_notify.send_message: параметр buttons (список рядов кнопок; при использовании — config_entry_id и chat_id/user_id). Параметр send_keyboard (по умолчанию true): при true и отсутствии buttons к сообщению подмешивается клавиатура из entry.options.buttons.
    • Схема сервиса вынесена в schemas.py (SERVICE_SEND_MESSAGE_SCHEMA с buttons и send_keyboard).
  • Дедупликация входящих обновлений

    • Ключ дедупликации: update_id/id из API или для message_callback — (chat_id, user_id, payload); для остальных — (update_type, timestamp, message_id). Окно для message_callback 3 с, для остальных 15 с. Блокировка (asyncio.Lock) при проверке/записи, чтобы при нескольких доставках одного нажатия уходило одно событие.
    • В событие добавлено поле event_id (тот же ключ) для отсечения дублей в автоматизациях при необходимости.
  • Локализация и UI сервисов

    • Полные переводы полей сервисов (name + description) для send_message, send_photo, send_document, send_video: entity_id, message, title, send_keyboard, config_entry_id, chat_id, user_id, file, caption, notify, advanced (Дополнительно / Advanced) в en/ru и strings.json.
    • В services.yaml для send_message в блоке advanced добавлено поле send_keyboard (boolean, default true).
  • Вспомогательные модули

    • api.py — проверка токена validate_token() (GET /me).
    • helpers.pynormalize_buttons(), buttons_display_str(), buttons_choice_list(), get_unique_entry_title().
    • translations.pyget_menu_labels(), get_option_labels(), get_receive_mode_title() для config/options flow.
    • webhook.py — расчёт URL webhook, MaxNotifyWebhookView, register_webhook / unregister_webhook.

Изменено

  • manifest.json — версия 1.2.0.
  • init.py — при setup entry: при режиме Polling запуск start_polling(), при Webhook — регистрация представления и register_webhook(). При unload — stop_polling() или unregister_webhook().
  • config_flow.py — первый шаг дополнен выбором режима приёма (receive_mode). При «Только отправка» — сразу шаг добавления чата; при Polling/Webhook — шаг секрета и меню кнопок, затем чат. Создание entry с options: receive_mode, webhook_secret, buttons; заголовок записи с учётом режима и уникальности. Валидация токена перенесена в api.validate_token. Options flow: форма init с полями receive_mode и webhook_secret; при Polling/Webhook переход в меню кнопок (add/edit/remove), сохранение options с buttons и обновление заголовка.
  • const.py — добавлены константы приёма (CONF_RECEIVE_MODE, CONF_WEBHOOK_SECRET, RECEIVE_MODE_, WEBHOOK_, POLLING_), типы обновлений и событие (EVENT_MAX_NOTIFY_RECEIVED), кнопки (CONF_BUTTONS, CONF_BUTTON_, CONF_ACTION, CONF_SEND_KEYBOARD), пути API (API_PATH_UPDATES, API_PATH_SUBSCRIPTIONS).
  • notify.py — добавлены _normalize_buttons_for_api() и send_message_with_buttons() для отправки сообщения с inline_keyboard.
  • services.py — схемы сервисов импортируются из schemas.py. Обработчик send_message: при наличии buttons — отправка через send_message_with_buttons по config_entry_id и chat_id/user_id; иначе при send_keyboard: true разделение получателей на тех, кому подмешивается клавиатура из options, и остальных; вызов send_message_with_buttons для первых и notify.send_message для вторых.
  • README.md — переработан: краткие разделы «Возможности», «Требования», «Установка», «Настройка»; «Приём сообщений» (режимы, данные события, групповые чаты, примеры ответа и кнопок); «Кнопки клавиатуры»; «Сервисы» (таблицы и примеры); «Токен и ID», «Ссылки». Удалены дубли и лишние примеры.

Технические детали

  • Новые файлы: api.py, helpers.py, schemas.py, translations.py, updates.py, webhook.py.
  • В updates.py: парсинг update (message_created / message_callback), извлечение user_id из callback для message_callback, callback_data из update.callback; allowlist событий по options.buttons (при непустых кнопках — все события разрешены); дедупликация в цикле polling и в async_process_update с блокировкой.
  • Subentries и unique_id при создании entry не используются для блокировки дубликата по токену (убрана проверка async_set_unique_id / _abort_if_unique_id_configured в первом шаге).
Релиз: v1.1.1 (11.02.2026)

[1.1.1] — 2026-02

Добавлено

  • Соответствие HACS: в manifest добавлены issue_tracker (ссылка на issues репозитория) и codeowners (["@kai-zer-ru"]) для публикации в HACS.
  • Параметр notify в сервисах: в схемы send_message, send_photo, send_document, send_video добавлен опциональный параметр notify (по умолчанию true); в переводах (ru/en) — поля fields.notify для всех четырёх сервисов.

Изменено

  • manifest.json: version 1.1.1, добавлены issue_tracker и codeowners.
  • notify.py: в upload_image_and_send и upload_video_and_send добавлен параметр notify; логика передачи notify: false в API закомментирована (клиент Max не отключает push/звук).
  • services.py: логика установки/сброса _notify_param и передача notify в вызовы upload закомментированы; в сущности (async_send_message) закомментировано чтение _notify_param и добавление payload["notify"] = False.
  • services.yaml: блок поля notify во всех четырёх сервисах закомментирован — в диалоге вызова сервиса поле не отображается.

Технические детали

  • Параметр notify остаётся в Python-схемах (vol.Optional("notify", default=True)); при поддержке «тихой» отправки на стороне Max достаточно раскомментировать код и блоки в services.yaml.
Релиз: v1.1.0 (11.02.2026)

[1.1.0] — 2026-02

Добавлено

  • Формат сообщений (text / markdown / html)
    В первом шаге настройки добавлен выбор формата сообщений (Текст, Markdown, HTML) — соответствует параметру format в API Max. Значение сохраняется в config entry и передаётся при отправке текста (notify, send_message), подписей к фото, документам и видео.

  • Перенастройка интеграции

    • Шаг async_step_reconfigure: меню интеграции Перенастроить. Форма с необязательным новым API-токеном (пусто = оставить текущий) и выбором формата сообщений; при отправке — обновление entry.data и перезагрузка интеграции.
    • Options Flow (шестерёнка рядом с названием интеграции): та же форма изменения токена и формата, открывается по клику на шестерёнку. Реализован класс MaxNotifyOptionsFlow и async_get_options_flow() в config flow.
  • Минимальная версия Home Assistant
    В manifest указана minimum_ha_version": "2026.2.0" (ранее 2025.2.0).

Изменено

  • config_flow.py: первый шаг (user) сохраняет и передаёт в data поле CONF_MESSAGE_FORMAT; при создании entry в data записываются CONF_ACCESS_TOKEN и CONF_MESSAGE_FORMAT.
  • notify.py: при формировании payload для отправки сообщений (текст, фото, видео) в API передаётся "format": msg_format, если выбран не текст (значение берётся из entry.data).
  • const.py: добавлена константа CONF_MESSAGE_FORMAT.
  • README.md: описание выбора формата при настройке, блок «Формат сообщений», способы перенастройки (шестерёнка и ⋮ → Перенастроить).
  • strings.json, translations (ru/en): строки для шага user (message_format), шага reconfigure, abort.reconfigure_successful, options.step.init.

Технические детали

  • Версия в manifest: 1.1.0.
  • Новые импорты в config_flow: ConfigEntry, OptionsFlow.
  • Схемы перенастройки и options сохраняют введённые значения при ошибке валидации токена (suggested values из user_input).
Релиз: v1.0.0 (11.02.2026)

[1.0.0] — первый релиз

Добавлено

Интеграция с мессенджером Max (официальный API platform-api.max.ru):

  • Настройка через UI (Config Flow)

    • Ввод токена бота с проверкой через GET /me.
    • Добавление получателей одним полем «ID получателя»: положительное число — личный чат (User ID), отрицательное — группа (Chat ID).
    • Subentries: добавление нескольких чатов через страницу интеграции («Добавить чат»).
  • Сервисы

    • max_notify.send_message — отправка текста (message, title, entity_id или config_entry_id + chat_id/user_id).
    • max_notify.send_photo — отправка фото по локальному пути или URL (caption, entity_id / доп. параметры).
    • max_notify.send_document — отправка файла как документ (путь или URL).
    • max_notify.send_video — отправка видео (mp4, mov, webm, mkv) по пути или URL.
  • Платформа notify

    • Сущности notify.max_... для каждого настроенного получателя.
    • Отправка сообщений через действие «Уведомление» в автоматизациях и сценариях.
  • Работа с медиа по документации Max

    • Загрузка через POST /uploads (type=image, file, video).
    • Прикрепление медиа: type + payload (объект с token из ответа загрузки).
    • Для видео: токен из первого ответа (POST /uploads), загрузка на CDN, ответ retval (XML).
    • Пауза после загрузки и повтор при attachment.not.ready с увеличивающимся интервалом (фото/документ и видео).
    • Парсинг ответа загрузки без зависимости от Content-Type (CDN может не отдавать application/json).
  • Получатели

    • Разрешение user_id → chat_id диалога через GET /chats для личных сообщений.
    • Выбор получателя: entity_id или config_entry_id + chat_id / user_id в расширенных параметрах сервисов.
  • Локализация

    • Русский и английский (translations/ru.json, en.json), строки конфигурации и сервисов.
  • Документация и упаковка

    • README с описанием установки (HACS и вручную), настройки, сервисов, получения токена и ID.
    • manifest.json (version 1.0.0, documentation, minimum_ha_version 2025.2.0).
    • hacs.json для установки через HACS.
    • .gitignore для Python/IDE/OS.

Технические детали

  • Файлы интеграции: __init__.py, config_flow.py, const.py, manifest.json, notify.py, services.py, services.yaml, strings.json, translations/en.json, translations/ru.json.
  • Константы: задержки и интервалы повторов вынесены в const.py (FILE_UPLOAD_DELAY, FILE_READY_RETRY_DELAYS, VIDEO_*).
  • Общая логика: отправка сообщения с вложением и повторами вынесена в _post_message_with_retry() в notify.py.

Поддержка проекта