Бризеры Tion и станции MagicAir через облако api2.magicair.tion.ru.
Собственный асинхронный клиент, без внешних зависимостей.
Одно устройство-хаб на локацию аккаунта и по устройству на каждый бризер и станцию. Комната подсказывается из имени зоны в облаке.
Бризер
| Сущность | Что показывает |
|---|---|
climate |
режим (выключен / продув / нагрев), скорость, целевая температура |
sensor «Температура на входе» |
воздух до бризера (t_in) |
sensor «Температура на выходе» |
воздух после бризера (t_out) |
sensor «Скорость» |
текущая скорость вентилятора |
sensor «Производительность» |
приток в м³/ч |
sensor «Ресурс фильтра» |
сколько дней фильтру осталось |
sensor «Наработка» |
часы работы, диагностический |
sensor «Уровень сигнала» |
диагностический |
sensor «Код ошибки» |
диагностический |
binary_sensor «Вентилятор» |
работает или нет |
binary_sensor «Требуется замена фильтра» |
ресурс исчерпан |
binary_sensor «Связь» |
устройство на связи с облаком |
number «Минимальная/максимальная скорость в авто» |
границы для автоматики зоны |
number «Порог CO2» |
уровень, по которому облако ведёт зону |
select «Источник воздуха» |
улица / помещение / смешанный — только у моделей с заслонкой |
MagicAir
| Сущность | Что показывает |
|---|---|
sensor «CO2» |
углекислый газ, ppm |
sensor «Температура» / «Влажность» |
климат комнаты |
sensor «PM1» / «PM2.5» / «PM10» |
пыль — только у моделей, которые её измеряют |
sensor «Сигнал Wi-Fi» |
диагностический |
binary_sensor «Связь» |
станция на связи с облаком |
Сущности, за которыми в конкретной модели нет датчика, не создаются: облако
отдаёт для них NaN, и интеграция это отличает от нуля.
Облако Tion управляет зоной, а не отдельным бризером. У climate-сущности
скорость auto означает, что зону ведёт облако по уровню CO₂; выбор
конкретной скорости или off переводит зону в ручной режим. Режим зоны, её
имя и порог CO₂ видны в атрибутах zone_mode, zone_name, zone_target_co2.
Список скоростей строится по speed_limit устройства: у O₂ это 1–4,
у S3/S4 — 1–6.
Порог CO₂ и границы скорости — свойства зоны, а сущности живут на бризере. Если в одной зоне стоит несколько бризеров, их одноимённые настройки показывают и меняют одно и то же значение.
aiohttp-сессия Home Assistant
↓
TionApiClient (api.py) — про HA ничего не знает
↓
TionDataUpdateCoordinator
↓
сущности
api.py — самостоятельный клиент: сессию получает снаружи, состояние отдаёт
дата-классами, ошибки поднимает своими типами (TionAuthError,
TionConnectionError, TionCommandError). Его можно дёргать из обычного
скрипта без Home Assistant.
Токен доступа лежит в .storage/tion_magicair.<entry_id> и переживает
перезапуск, поэтому логин не тратится на каждый старт. Протухший токен клиент
обновляет сам, ровно одна повторная попытка на запрос.
Home Assistant 2026.7.0 или новее. Ограничение жёсткое: интеграция
использует UnitOfRatio и UnitOfDensity, появившиеся в ядре именно в этой
версии. Проверялась на 2026.8.3.
- HACS → в меню сверху справа Custom repositories.
- Вставить
https://github.com/badigit/tion-homeassistant, тип — Integration. - Найти в списке Tion MagicAir, нажать Download.
- Перезапустить Home Assistant.
- Скопировать каталог
custom_components/tion_magicairвcustom_componentsсвоего Home Assistant. - Перезапустить Home Assistant.
- Настройки → Устройства и службы → Добавить интеграцию → Tion MagicAir.
| Поле | Что это | Обязательно |
|---|---|---|
| Электронная почта | логин учётной записи MagicAir — та же, что в мобильном приложении Tion | да |
| Пароль | пароль от этой учётной записи | да |
Одна учётная запись заводится один раз: повторная попытка с той же почтой
прервётся, регистр в ней значения не имеет. Пароль хранится только внутри
записи конфигурации; токен доступа интеграция получает сама и держит его в
.storage. Если облако перестанет принимать пароль, Home Assistant покажет
починку «Требуется повторная аутентификация» — почту вводить заново не нужно,
только новый пароль.
Меняются в Настройки → Устройства и службы → Tion MagicAir → Настроить.
| Параметр | Что делает | По умолчанию | Допустимо |
|---|---|---|---|
| Интервал опроса | как часто читать состояние из облака, в секундах | 60 | 10–3600 |
Чаще 10 секунд смысла нет: облако само обновляет телеметрию примерно раз в минуту. После изменения запись перечитывается автоматически, перезапуск Home Assistant не нужен.
Лежит в custom_components/tion_magicair/brand/ — начиная с Home Assistant
2026.3 кастомные компоненты несут значок с собой, и локальные файлы имеют
приоритет над CDN brands.home-assistant.io. Подавать PR в репозиторий
home-assistant/brands не нужно, папка custom_integrations там объявлена
устаревшей.
Используется официальный знак Tion, без изменений — так же, как это делают интеграции Dreame, Tapo, LG и прочие. Правила brands прямо говорят, что изображения служат только для опознания продукта и не означают одобрения; видоизменять чужой знак не нужно и вредно, получилось бы похожее до смешения производное вместо честной ссылки на оригинал. Элементов фирменного стиля самого Home Assistant в значке нет — это правилами запрещено.
Пересобрать из источника: uv run python scripts/make_brand.py.
icon@2x.png не выпускается: изображения крупнее 300 пикселей Tion не
публикует, а растянутая до 512 картинка была бы hDPI-версией без единой лишней
детали. Home Assistant в этом случае обходится одним icon.png.
- Настройки → Устройства и службы → Tion MagicAir, в меню записи выбрать
Удалить. Вместе с записью пропадут её устройства и сущности, а
сохранённый токен доступа сотрётся из
.storage. - Удалить каталог
custom_components/tion_magicair. - Перезапустить Home Assistant.
Учётные данные интеграция хранит только внутри записи конфигурации, поэтому после шага 1 в системе от неё ничего не остаётся.
uv sync --group dev
uv run pytest115 тестов, 100% покрытия по всем модулям. Кроме диалога настройки покрыты: разбор ответа облака для моделей, которых нет физически (3S, 4S, Lite и незнакомая новая), транспорт с обновлением протухшего токена, все команды climate, number и select, недоступность устройства и отказы облака.
На Windows тесты не запускаются, и дело не в них: Home Assistant
импортирует fcntl, а это модуль только для POSIX. Гонять нужно на Linux или
в контейнере, например тем же образом ядра, на котором интеграция работает:
docker run --rm -v "$PWD:/src" -w /src --entrypoint sh \
ghcr.io/home-assistant/home-assistant:2026.8.3 \
-c "pip install -q --break-system-packages pytest-homeassistant-custom-component==0.13.357 pytest-timeout && python -m pytest -q"Версия pytest-homeassistant-custom-component пиньтся под конкретную версию
ядра — 0.13.357 соответствует 2026.8.3.
Аккаунт с одним бризером Tion O₂ Rf (tionO2Rf) и одной станцией
MagicAir (co2mb): чтение всех величин, смена температуры, скорости и
режима зоны.
Код для S3, S4 и Lite написан по протоколу, но на железе не проверялся: у этих моделей есть заслонка и другой потолок скоростей, а у 4S — отдельная логика нагрева. Отзывы приветствуются.
Проект неофициальный и никак не связан с ООО «Тион». «Tion» и «MagicAir» — товарные знаки их правообладателя; знак и название используются только чтобы указать, с каким оборудованием работает интеграция, и не означают одобрения или поддержки с его стороны.