An open API service indexing awesome lists of open source software.

https://github.com/kai-zer-ru/max-notify-ha

MaxNotify - интеграция для отправки сообщений в мессенджер MAX из Home Assistant
https://github.com/kai-zer-ru/max-notify-ha

homeassistant homeassistant-integration max

Last synced: about 2 months ago
JSON representation

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

Awesome Lists containing this project

README

          


MaxNotify

# MaxNotify для Home Assistant

**MaxNotify** подключает мессенджер **Max** к Home Assistant: можно отправлять сообщения, фото, файлы и видео в чаты и (по желанию) реагировать на входящие сообщения и нажатия кнопок в сценариях. Настройка выполняется через интерфейс Home Assistant, без правки конфигурационных файлов для самой интеграции.

Интеграция умеет работать **двумя способами**: с **официальным API** платформы Max и через сервис **notify.a161.ru** (упрощённый вариант для тех, кто им пользуется). Оба варианта настраиваются в мастере при добавлении записи.

**Текущая версия интеграции:** 2.0.0. **Поддерживается Home Assistant** не ниже **2026.2.0** (более старые выпуски могут работать некорректно).

---

## Содержание

- [Сообщество и поддержка](#сообщество-и-поддержка)
- [Важно знать про Max и про notify.a161.ru](#важно-знать)
- [Что умеет интеграция](#что-умеет)
- [Что понадобится заранее](#что-понадобится)
- [Установка](#установка)
- [Первичная настройка](#первичная-настройка)
- [Приём сообщений и сценарии](#приём-сообщений)
- [Кнопки под сообщением](#кнопки)
- [Действия Home Assistant (сервисы)](#действия-home-assistant)
- [Удаление сообщений (подробно)](#удаление-сообщений-подробно)
- [Подробные примеры автоматизаций](#подробные-примеры-автоматизаций)
- [Краткий журнал возможностей (по истории коммитов)](#краткий-журнал-возможностей-по-истории-коммитов)
- [Если что-то не работает: журнал](#если-что-то-не-работает-журнал)
- [Где взять токен и ID чата](#где-взять-токен-и-id)
- [Для разработчиков](#для-разработчиков)
- [Полезные ссылки](#полезные-ссылки)

[![HACS](https://img.shields.io/badge/HACS-Default-orange.svg)](https://github.com/hacs/integration)
[![GitHub](https://img.shields.io/badge/GitHub-kai--zer--ru%2Fmax--notify--ha-blue?logo=github)](https://github.com/kai-zer-ru/max-notify-ha)
[![Поддержать](https://img.shields.io/badge/донат-Tinkoff-FFDD2D.svg)](https://www.tbank.ru/rm/r_wKLcbFgjYa.ncgWMwrHSA/vyQvd5941/)

---

## Сообщество и поддержка

Новости, обновления и помощь по теме:

- **Telegram** — [@kai_zer_ru_ha](https://t.me/kai_zer_ru_ha)
- **Max** — [kai_zer_ru_ha](https://max.ru/id251603503331_biz)
- **Дзен** — [kai_zer_ru_ha](https://dzen.ru/kai_zer_ru_ha)
- **VK** — [kai_zer_ru_ha](https://vk.com/kai_zer_ru_ha)
- **Обсуждение** - [Чат в Max](https://max.ru/join/KoCsTSA3VGOCiIFdSAW0myVJEwXZi-rt9fTfGxdgk6A)
- **Поддержка автора** - [Т-Банк](https://www.tbank.ru/rm/r_wKLcbFgjYa.ncgWMwrHSA/vyQvd5941/)

---

## Важно знать

### Регистрация бота в Max

Сейчас регистрация разработчика и выпуск бота на платформе Max ориентированы на **ИП и организации**. Это правила самой платформы, а не интеграции. Для работы через **официальный API** вам нужен бот и токен из кабинета разработчика.

### Сервис notify.a161.ru

Интеграция **может** работать через прокси [notify.a161.ru](https://notify.a161.ru/) и бота в Max — те же идеи (отправка, приём, кнопки), но с **ограничениями этого сервиса** и без ответственности автора MaxNotify за стабильность чужого сайта. Подключение такого режима — **на ваше усмотрение и риск**.

Кратко, как этот режим устроен в MaxNotify (**это единственное место, где перечислены все отличия**; дальше по тексту — только отсылки сюда, без повторов):

- **Чаты:** поддерживаются **личные** (положительный ID) и **групповые** (отрицательный ID), как в мессенджере Max: отправка и приём в группе — если это позволяет [сервис](https://notify.a161.ru/). Несколько получателей к одной записи — через **Добавить чат** (как у официального API). Другой токен или полностью отдельная связка настроек — **отдельная** запись MaxNotify.
- **Slash-команды:** добавить команды бота через API Max в этом режиме нельзя; входящие сообщения вида `/команда` всё равно обрабатываются — в событии **`max_notify_received`** поле **`command`** без ведущего `/` (как при работе через официальный API).
- Приём входящих — только **опрос сервера (Polling)**, не WebHook.
- Перед отправкой файлов интеграция проверяет размер **до 10 МБ** на файл.
- Если долго не было ни входящих сообщений, ни исходящих **с кнопками**, интеграция может **сама переключить приём на «только отправка»** (чтобы снова слушать чат, включите приём в настройках записи).
- Между исходящими запросами к одной записи выдерживается пауза **около 1 секунды**.
- **Удаление сообщений:** по **`message_id`** или списку **`message_ids`** — поддерживается. **Удаление по дате**, по **интервалу «начало / конец периода для поиска»** и действие **«удалить последнее исходящее»** для notify.a161.ru **не поддерживаются** (эти режимы есть только у **официального API**). При вызове недоступной операции Home Assistant покажет **переведённую ошибку**, запрос к сервису уходит не будет.

Шаги мастера — в разделе [Первичная настройка → notify.a161.ru](#notifya161ru).

### Токен

Токен вы получаете у выбранного способа подключения (официальный кабинет Max или бот notify.a161.ru). В описании интеграции считается, что это **долгоживущий** токен: отдельные сценарии смены пароля и срока жизни здесь не расписываются.

---

## Что умеет

- **Отправка** текста, фото, документов и видео в Max через **службу MaxNotify** (действия `max_notify.send_message`, `send_photo`, `send_document`, `send_video` и т.д. в сценариях или вручную в **Инструментах разработчика**).
- **Одно сообщение с несколькими вложениями** — в интерфейсе действий можно передать список файлов; на стороне интеграции действует общий лимит платформы (**до 12 вложений на сообщение**, включая inline-клавиатуру), как у официального API Max.
- **Приём** (если включён): новые сообщения и нажатия кнопок попадают в Home Assistant как событие **`max_notify_received`** — на него можно повесить сценарии.
- **Сообщения вида `/команда` (slash):** из текста входящего сообщения в событии заполняется поле **`command`** (без ведущего `/`), плюс **`args`** — остаток строки; так можно строить сценарии на команды в чате. Для записи с **официальным API** в настройках интеграции дополнительно можно задать список slash-команд бота и **синхронизировать** его с платформой Max. У **notify.a161.ru** синхронизации команд с бэкендом Max нет, но разбор `/команда` в пришедшем тексте при включённом приёме сохраняется.
- **Кнопки** под сообщением: задаются в настройках записи и/или в действии отправки; по нажатию можно запускать автоматизации.
- **Рассылка одним действием** всем добавленным чатам во **всех** записях MaxNotify — действие **`max_notify.send_text_to_all`**.
- Настройка через **Настройки → Устройства и службы**; YAML нужен только если вы сами пишете сценарии.

У **официального API** есть **Long Polling** и **WebHook**; у **notify.a161.ru** вместо них только **Polling** для приёма. **Группы** поддерживаются в обоих типах подключения; остальные ограничения notify.a161.ru — в разделе [Сервис notify.a161.ru](#сервис-notifya161ru).

---

## Что понадобится

- Установленный Home Assistant не ниже **2026.2.0**.
- Для **официального API**: бот в Max и **токен** из раздела интеграции (например [business.max.ru](https://business.max.ru/self/#/chat-bots) / документация разработчика).
- Для **notify.a161.ru**: **user_id** и **токен** (36 символов), как выдаёт сервис [notify.a161.ru](https://notify.a161.ru/).

---

## Установка

### Через HACS (рекомендуется)

[![Открыть репозиторий в HACS](https://my.home-assistant.io/badges/hacs_repository.svg)](https://my.home-assistant.io/redirect/hacs_repository/?owner=kai-zer-ru&repository=max-notify-ha&category=integration)

Если кнопка не сработала: **HACS** → **Интеграции** → вверху списка откройте меню (**⋯**) → **Пользовательские репозитории** → URL `https://github.com/kai-zer-ru/max-notify-ha`, категория **Интеграция**. Установите **MaxNotify** и **перезапустите** Home Assistant.

### Вручную

Скопируйте папку `custom_components/max_notify` из этого репозитория в каталог `config/custom_components/` вашего Home Assistant и перезапустите систему.

После установки: **Настройки** → **Устройства и службы** → **Добавить интеграцию** → найдите **MaxNotify**.

---

## Первичная настройка

При добавлении записи сначала выберите **тип подключения** в списке.

### Официальный API Max (platform-api.max.ru)

1. Укажите **токен** бота — интеграция проверит его через сеть.
2. Выберите **формат текста**: обычный текст, Markdown или HTML (как позволяет API Max).
3. Выберите **режим приёма**:
- **Только отправка** — входящие сообщения не обрабатываются.
- **Длинный опрос (Long Polling)** — Home Assistant сам опрашивает сервер Max, **внешний адрес не нужен**.
- **WebHook** — сервер Max вызывает **URL вебхука** вашего Home Assistant по **HTTPS** (входящие запросы к интеграции). Нужен **доступный из интернета** адрес (не только «домашний» `http://192.168.…`). Его задают в **Настройки → Система → Сеть**; часто используют облачный доступ Home Assistant или обратный прокси с сертификатом. В карточке интеграции показывается адрес вебхука; при желании задаётся **секрет** (проверка заголовка запроса).
4. Если включён приём не «только отправка», можно настроить **кнопки** клавиатуры (ряды, подписи, ссылка или «callback» для сценариев).
5. Добавьте **чат**: укажите номер получателя. **Положительное число** — личный диалог, **отрицательное** — группа. Дополнительные чаты добавляются через меню записи (**Добавить чат**).

Позже токен и формат можно изменить в **Перенастроить**; список чатов — в настройках записи.

### notify.a161.ru

1. Получите на [notify.a161.ru](https://notify.a161.ru/) **user_id** и **токен** (36 символов).
2. Введите токен, формат сообщений и режим: **только отправка** или **Polling** (опрос очереди входящих).
3. Для Polling укажите **интервал опроса** и **период неактивности** (1–3 суток); правило автопереключения на «только отправка» — в [блоке про сервис](#сервис-notifya161ru).
4. Укажите ID получателя: **положительный** — личный чат, **отрицательный** — группа (как у официального API). Дополнительные чаты — **Добавить чат** в карточке записи. Чтобы полностью сменить токен или «основную» связку, используйте **Перенастроить** или новую запись.

---

## Приём сообщений

Когда приём включён, Home Assistant получает событие **`max_notify_received`**. Его можно использовать в **Сценариях** с триггером **Событие**.

Основные поля (для ответа в тот же чат удобны **`config_entry_id`** и **`recipient_id`**):

| Поле | Зачем нужно |
|------|-------------|
| `update_type` | Тип: новое сообщение или нажатие кнопки |
| `config_entry_id` | Какая запись MaxNotify |
| `recipient_id` | Куда отвечать (**тот же номер**, что при добавлении чата): положительный — личный чат, отрицательный — группа |
| `text` | Текст сообщения |
| `command` | Если сообщение похоже на команду (например `/start`) |
| `callback_data` | Данные нажатой кнопки |
| `message_id` | Номер сообщения (удобно для удаления или правки) |
| `event_id` | Уникальный ключ события (в т.ч. чтобы не сработать дважды) |

Дополнительно в событии могут быть поля вроде `user_id` и `chat_id` в формате API Max; для новых сценариев ориентируйтесь на **`recipient_id`**.

**Официальный API:** пока у бота активна подписка **WebHook**, **Long Polling** со стороны Max недоступен — в интерфейсе это учтено: сначала переключите режим, если нужно сменить способ приёма. Несколько записей с **одним и тем же** токеном не могут одновременно конфликтовать (например WebHook в одной и Long Polling в другой) — мастер настройки это блокирует.

На стороне платформы Max для **long polling** действуют ограничения (в т.ч. не более **2 запросов в секунду** к очереди обновлений, таймаут long poll **30 с**, размер выборки до **100** событий; подробности — в [документации подписок](https://dev.max.ru/docs-api/methods/POST/subscriptions)). Интеграция выдерживает паузу между запросами long polling и использует согласованный таймаут; для стабильной работы в продакшене по-прежнему рекомендуется **WebHook**, если у Home Assistant есть **публичный HTTPS** (см. [Сеть](https://www.home-assistant.io/docs/configuration/basic/) в документации HA). Переключение на WebHook **не ломает** существующие сценарии на событие **`max_notify_received`**, если внешний URL корректно указан в настройках системы.

**Если пропал внешний HTTPS** для WebHook: при загрузке интеграция может **снять подписку** в Max и перевести запись в безопасный режим, а в Home Assistant появится **заметка о проблеме** с подсказкой проверить сеть.

**notify.a161.ru:** входящие только через **Polling**; остальные ограничения — в [блоке про сервис](#сервис-notifya161ru).

**Группы (официальный API и notify.a161.ru):** бота добавляют в группу и по правилам Max выдают ему нужные права (часто **администратор**), иначе события из группы могут не приходить. ID группы — **отрицательный** `recipient_id`. Для notify.a161.ru дополнительные нюансы — [в блоке про сервис](#сервис-notifya161ru).

---

## Кнопки

- В **настройках записи** задаётся постоянная клавиатура (если включён приём не «только отправка» — для официального API это Long Polling или WebHook, для notify.a161 — Polling).
- В **действии отправки сообщения** можно добавить свои кнопки или отключить прикрепление сохранённой клавиатуры.
- Тип **ссылка** открывает сайт; адрес должен начинаться с `http://` или `https://`.
- Для кнопок «callback» в сценарии фильтруйте событие по **`callback_data`**.

---

## Действия Home Assistant

Все действия начинаются с **`max_notify.`** (в интерфейсе — в списке действий службы MaxNotify).

**Формат сообщений** — в **расширенных параметрах** действия (блок обычно свёрнут): поле **`format`** — **`text`**, **`markdown`** или **`html`**, как при настройке записи. Оно задаёт разметку **текста сообщения**, **подписи** к фото/файлу/видео и текста при **правке сообщения** (`edit_message`). Если не указать, используется формат, выбранный в настройках интеграции.

**Пользовательские кнопки** — тоже в расширенных параметрах:

- **`send_keyboard`** — прикладывать ли к этому отправлению **клавиатуру из настроек записи** (по умолчанию вкл.). Выключите, если нужен только текст или только свои кнопки.
- **`buttons`** — **своя** inline-клавиатура **только для этого вызова**: ряды кнопок (тип callback / message / **link** с URL `http`/`https`). Можно комбинировать с сохранённой клавиатурой, если **`send_keyboard`** включён. Готовые примеры структуры — в **[AUTOMATIONS.md](AUTOMATIONS.md)** и в подсказке к полю в UI.

| Действие | Назначение |
|----------|------------|
| **send_message** | Текст, при необходимости **заголовок**; в расширенных — **формат**, **`send_keyboard`**, **`buttons`**. Получателя указывают **сущностью чата Max** (создаётся интеграцией) либо вручную: запись MaxNotify + `recipient_id` в расширенных полях. |
| **send_text_to_all** | Тот же текст **во все добавленные чаты** всех записей MaxNotify (записи без ни одного чата пропускаются). В расширенных — **формат**, **`send_keyboard`**, **`buttons`**. |
| **send_photo** | Фото: файл на диске Home Assistant или ссылка; можно несколько файлов; **подпись**; в расширенных — **формат**, клавиатура, **`buttons`**, повторы при обработке вложения на стороне Max. |
| **send_document** | Один файл-документ за вызов (только поле **`file`**, не **`files`**); подпись, формат, клавиатура и **`buttons`** — как у фото. |
| **send_video** | Видео (форматы вроде mp4, mov, webm, mkv). |
| **delete_message** | Удаление по ID, списку ID, **дате (календарный день)** или **интервалу периода**. Подробно — [ниже](#удаление-сообщений-подробно). |
| **delete_last_outgoing_message** | Найти и удалить последнее **исходящее** сообщение бота в **групповом** чате. **Только официальный API Max**; у notify.a161.ru недоступно. В личных чатах официальный API не отдаёт историю по `recipient_id` — используйте явный `message_id`. |
| **edit_message** | Изменить текст (**в т.ч. формат** в расширенных), кнопки сообщения или снять их (**`remove_buttons`**). |

В расширенных параметрах у **медиа**-действий дополнительно при необходимости задаются **авторизация для скачивания по ссылке** (Basic / Digest / Bearer), **отключение проверки SSL** (только если понимаете риск), число **повторов** отправки, пока вложение «готовится» на сервере.

---

## Удаление сообщений (подробно)

Действие **`max_notify.delete_message`** объединяет несколько режимов. Ошибки валидации выводятся в интерфейсе Home Assistant **с переводом** (русский / английский и др., см. `translations/` интеграции).

### Приоритет полей (сверху вниз)

Если задано несколько способов, используется **только верхний по списку**, остальные игнорируются:

1. **`message_id`** (один или несколько через запятую в одном поле)
2. **`message_ids`**
3. **`date`** — один календарный день в **локальной** зоне Home Assistant (00:00:00–23:59:59)
4. Пара полей периода: **`from`** и **`to`** (в UI: «Начало периода для поиска» / «Конец периода для поиска»)

### Период и дата

- **Интервал:** нужно указать **оба** поля начала и конца **или** ни одного (если удаляете только по ID / дате). Одна граница без второй — ошибка.
- **Поле «Дата»:** только **дата без времени** (или Unix timestamp — берётся календарный день момента). Если в значении указано время — ошибка.
- **Форматы даты и времени** (для `from` / `to` и для «Даты» как даты): `2026-10-23`, `2026.10.23`, `2026/10/23`, `23.10.2026`, `23-10-2026`, `23/10/2026`; с временем — через пробел или `T`, время с `:` или `-` (например `2026-10-23 00:00:00`, `23.10.2026 00-00-00`). Допускается Unix timestamp. Неверный формат — ошибка.

### Официальный API и notify.a161.ru

| Возможность | Официальный API | notify.a161.ru |
|-------------|-----------------|----------------|
| Удаление по `message_id` / `message_ids` | Да | Да |
| Удаление по **дате** или **интервалу** (поиск в API, затем удаление **по одному** `message_id` на запрос) | Да | **Нет** (будет сообщение об ошибке) |
| Действие **`delete_last_outgoing_message`** | Да (группы) | **Нет** |

У **официального API** при запросе списка сообщений за период в query передаётся **`count`** (не дублируется запрос с `limit`).

**Лимит частоты:** на экземпляр Home Assistant действует **общее** ограничение **не более 30 исходящих HTTP-запросов в секунду** ко всем конечным точкам API Max и notify.a161.ru (отправка, удаление, правка, опрос `/updates`, подписки WebHook и т.д.). Скачивание медиа по произвольным URL в настройках вложений в это ограничение **не входит**.

### Ответ действия

При вызове из UI в ответе может быть объект **`deleted`** — сколько сообщений успешно удалено.

### Пример вызова вручную (notify.a161.ru, только по ID)

```text
DELETE https://notify.a161.ru/messages?message_id=mid.<ваш_id>
Authorization: <токен из настроек записи>
```

Подробные YAML-примеры — в **[AUTOMATIONS.md](AUTOMATIONS.md)**.

---

## Подробные примеры автоматизаций

Готовые фрагменты YAML (ответ на команду, нажатие кнопки, все параметры действий) собраны в файле **[AUTOMATIONS.md](AUTOMATIONS.md)**.

---

## Если что-то не работает: журнал

Чтобы в журнале появлялись подробные сообщения интеграции, в `configuration.yaml` можно добавить:

```yaml
logger:
default: warning
logs:
custom_components.max_notify: debug
```

Перезагрузите Home Assistant и откройте **Настройки → Система → Журнал**; при необходимости используйте просмотр полного журнала из меню журнала.

---

## Где взять токен и ID

- **Токен официального бота:** кабинет разработчика Max → ваш бот → раздел про интеграцию / API.
- **User ID и Chat ID:** например бот [CHECK ID](https://max.ru/id222312277810_1_bot) в Max (по пересланному сообщению) или API со списком чатов в [документации Max](https://dev.max.ru/docs-api).

---

## Для разработчиков

Описание данных от операторов API и оформление изменений в репозитории: **[docs/README.md](docs/README.md)**.

Способности бэкенда по типу интеграции задаются в **`IntegrationCapabilities`** (см. **[docs/PROVIDER_SPEC.md](docs/PROVIDER_SPEC.md)**), в том числе:

- **`supports_delete_message`** — удаление по известному `message_id`;
- **`supports_delete_message_by_period`** — поиск по дате/интервалу и удаление найденных сообщений (по одному HTTP DELETE на сообщение);
- **`supports_delete_last_outgoing_message`** — служба «последнее исходящее».

Для **notify.a161.ru** последние два флага выключены.

**Сенсоры ID сообщений:** при появлении нескольких чатов на запись идентификаторы сообщений привязаны к чату; старые сенсоры с прежним `unique_id` могут остаться в системе помеченными как устаревшие — см. журнал и карточку устройства.

---

## Краткий журнал возможностей (по истории коммитов)

Ниже — то, что по смыслу добавлялось в ветке 2.x и релизах 1.4.x, если это не продублировано выше по тексту:

- **Версия 2.0.0** — архитектура по **провайдерам** (официальный API и notify.a161.ru), общий код исходящих запросов.
- **Сенсоры ID сообщений:** перестали создаваться **устаревшие дубликаты по каждому чату** (отдельный `unique_id` на получателя); остаются актуальные сенсоры по чату и **два глобальных устаревших** на запись интеграции (для совместимости с прошлыми версиями). Ранее созданные лишние сущности при желании удалите из реестра объектов вручную.
- **Удаление** — по ID/списку; по дате и интервалу (список через GET /messages, затем удаления по одному id) и **удаление последнего исходящего** в группе — для официального API; ограничения a161 — в таблице выше; **глобально до 30 исходящих запросов/с** к API.
- **Несколько вложений** в одном сообщении (лимит платформы, до **12** с учётом клавиатуры); исправления приёма и отправки вложений.
- **Slash-команды** — поля `command` / `args` в `max_notify_received`; синхронизация команд с Max — только официальный API.
- **`send_text_to_all`** — рассылка текста во все чаты всех записей.
- **Формат текста** (`text` / `markdown` / `html`) в сервисах отправки и правки.
- **notify.a161.ru** — polling **GET /updates**, интервал опроса и **период неактивности** (автопереход в «только отправка»); пауза **~1 с** между исходящими запросами; лимит файла **10 МБ**; при сбоях polling — запись в **ремонты** и подсказки в логах (в т.ч. **curl** на уровне debug).
- **Медиа по URL** — опциональная **авторизация** (Basic, Digest, Bearer) и опция **отключения проверки SSL** для загрузки по ссылке.
- **WebHook vs Long Polling** — взаимное исключение на один токен; WebHook только при **HTTPS** в настройках HA; при потере HTTPS подписка может быть снята.
- **Групповые чаты a161** — исправления добавления и работы с отрицательным `recipient_id`.
- **Порядок полей в UI** сервисов, **format** в `edit_message` как выпадающий список, единый стиль `services.yaml`.
- **SSL** — доработки проверки (в т.ч. wildcard).
- **Совместимость** — при загрузке проверяется **минимальная версия** Home Assistant (см. в начале README).
- **Сеть и таймауты** — улучшена обработка обрывов при вызовах API Max; для загрузки медиа по URL заданы **согласованные таймауты** чтения.

---

## Полезные ссылки

- [Репозиторий MaxNotify](https://github.com/kai-zer-ru/max-notify-ha)
- [Документация API Max](https://dev.max.ru/docs-api)
- [Портал разработчика Max](https://dev.max.ru/)
- [Канал в Telegram](https://t.me/kai_zer_ru_ha)
- [Канал в Max](https://max.ru/id251603503331_biz)
- [Поддержать проект (Тинькофф)](https://www.tbank.ru/rm/r_wKLcbFgjYa.ncgWMwrHSA/vyQvd5941/)
- [Группа в VK](https://vk.com/kai_zer_ru_ha)
- [Обсуждение в Max](https://max.ru/join/KoCsTSA3VGOCiIFdSAW0myVJEwXZi-rt9fTfGxdgk6A)

---

[![Star History Chart](https://api.star-history.com/svg?repos=kai-zer-ru/max-notify-ha&type=date&theme=dark)](https://star-history.com/#kai-zer-ru/max-notify-ha&type=date)