Ворота открылись сами в 17:26. Кто отдал команду — выяснить невозможно
TL;DR. У частного клиента дважды за месяц зафиксированы неавторизованные команды через Yandex Smart Home API: в одном случае это привело к тому, что въездные и гаражные ворота стояли открытыми почти 13 часов в отсутствие хозяев. Источник команд установить средствами Home Assistant нельзя — context_user_id у таких событий всегда null. В поддержке Яндекса тикет создан больше месяца назад, был один звонок от менеджера, дальше — шаблонные «мы скоро вернёмся», по тону похожие на автоответы LLM. Пока ждём — собрали свой мониторинг массовых команд. Данные, по которым можно установить источник, есть только у Яндекса. И эта сторона пока молчит.
Контекст
Я настраиваю и поддерживаю Home Assistant у частных заказчиков. У одного из них — загородный дом, автоматизация на HA, голосовое управление через Яндекс Алису (интеграция Yandex Smart Home, подключение через Yaha Cloud / HACS-компонент yandex_smart_home). В числе устройств — въездные и гаражные ворота, климат, DMX-освещение, выключатели, увлажнители.
За последние шесть недель через этот канал дважды приходили команды, которые никто из жильцов сознательно не отдавал. В одном из случаев это имело последствия в физическом мире.
Инцидент 1 — 9 марта 2026, ворота
Что увидел владелец
Вечером на почту пришло уведомление от камеры: движение во дворе. На записи — распахнутые настежь ворота. Владелец был в отъезде, в доме никого.
Хронология:
|
Ворота |
Открылись |
Закрылись |
Длительность |
|---|---|---|---|
|
Въездные |
9 марта, 17:26:27 |
10 марта, 06:25:24 |
12 ч 58 мин |
|
Гаражные |
9 марта, 17:26:28 |
10 марта, 06:25:24 |
12 ч 58 мин |
Что увидел я в логах HA
В 17:26:23–17:26:26 через шину HA пришла волна из ~40 событий типа yandex_smart_home_device_action. Все события — с одним и тем же context_id. По смыслу — команда «выключить» на группу устройств: климат, увлажнители, часть выключателей, два cover’а (ворота). Свет команда не затронула — это была не команда «всё выключить», а целевая, на конкретный набор.
Климатические устройства команду отбили с ошибкой ServiceNotSupported — они не поддерживают on_off как capability. Их состояние в итоге не поменялось. А вот ворота команду приняли.
Почему команда «выключить» открыла ворота
Привод ворот у клиента — с классическим импульсным управлением: один импульс = toggle. Один импульс открывает, следующий закрывает, состояние хранится у контроллера. В конфигурации HA команды open_cover и close_cover слали один и тот же GPIO-импульс.
В 17:26 ворота были закрыты. Яндекс прислал команду «выключить», HA транслировал её как close_cover, отправил импульс. Привод воспринял импульс как toggle — и открыл закрытые ворота.
Защитные автоматизации, которые должны были перехватить эту ситуацию (напоминание о незакрытых воротах, автозакрытие в 23:00, Telegram-уведомление об открытии) на тот момент были отключены — по причинам, к Яндексу отношения не имеющим.
Ключевая деталь
Владелец не отдавал такой команды. В доме в этот момент никого не было — колонки не могли услышать случайный голос с улицы, ТВ не работал. Команда пришла извне, через API.
Инцидент 2 — 8–10 апреля 2026, DMX-освещение
Спустя ровно месяц — та же картина, на других устройствах. В течение трёх дней через yandex_smart_home_device_action несколько раз приходили команды на включение и выключение DMX-освещения, в том числе ночью. Владелец этих команд не отдавал.
|
Дата |
Время MSK |
Действие |
|---|---|---|
|
8 апреля |
14:41:35 |
DMX ON (3 устройства) |
|
8 апреля |
14:41:44 |
DMX ON (повтор через 9 сек) |
|
8 апреля |
14:42:03 |
DMX ON (повтор) |
|
8 апреля |
19:23:54 |
DMX OFF |
|
10 апреля |
20:53:25 |
DMX ON (3 устройства) |
|
10 апреля |
22:28:02 |
DMX OFF |
|
10 апреля |
23:22:09 |
DMX ON |
|
10 апреля |
23:46:51 |
DMX OFF |
9 апреля команд не было. Это важно: значит, это не «сценарий, который тикает каждый день по расписанию». Паттерн нерегулярный.
Что удаётся увидеть самому — и чего не хватает
Интеграция Yandex Smart Home (yandex_smart_home) для каждой входящей команды публикует в шине HA событие yandex_smart_home_device_action. Recorder пишет его в SQLite (home-assistant_v2.db, таблицы events и event_data). Выглядит это так (реальный формат, идентификаторы обфусцированы):
{ "entity_id": "light.dmx_zone_1_example", "capability": { "type": "devices.capabilities.on_off", "state": { "instance": "on", "value": true } }}
Дополнительно у каждой записи в events есть:
-
time_fired_ts— момент события -
context_id— общий для всех событий, порождённых одним запросом. По нему и видно, что 9 марта на ~40 устройств пришла одна команда, а не сорок подряд. -
context_user_id— для всех событийyandex_smart_home_device_actionравенNULL
Вот здесь и начинается проблема. context_user_id = NULL означает, что команда пришла через внешнюю интеграцию, от неавторизованного с точки зрения HA субъекта. Для штатных команд из UI или автоматизаций HA это поле заполнено — видно, кто нажал на кнопку или какая автоматизация сработала. Для Алисы — всегда пусто.
То есть из логов HA в принципе нельзя вытащить:
-
с какого устройства пришёл запрос (колонка? приложение «Дом с Алисой»? веб? внешний сервис, интегрированный с аккаунтом?)
-
какой пользователь аккаунта Яндекс его отдал (если в аккаунте несколько членов семьи)
-
был ли это голосовой запрос — и если да, что конкретно распознал голосовой движок
-
был ли это пользовательский клик в интерфейсе, или срабатывание пользовательского сценария, или активность со стороны самого Яндекса (например, переиндексация / миграция устройств)
-
request_idна стороне Yandex API, по которому можно было бы самому поискать в логах
Всё это данные, которые физически существуют — но только у Яндекса. У владельца аккаунта своего лога «кто и что запросил» на портале/в приложении нет. История Алисы в приложении показывает голосовые команды, но не показывает действия, пришедшие через API, и не показывает команды, которые выполнялись от других пользователей аккаунта или от сценариев.
Временные меры…
Раз Яндекс не отвечает и не даёт инструмента, пришлось сделать минимальный собственный мониторинг. Это не решение проблемы — это способ узнавать о следующем инциденте раньше, чем ворота простоят открытыми 13 часов.
Компоненты:
-
SQL-сенсор поверх recorder’а — раз в 30 секунд читает из
home-assistant_v2.dbпоследние 500 событийyandex_smart_home_device_actionи кладёт их в атрибутitemsкак JSON-массив. На ~100 команд в день это покрывает примерно 5 дней истории; предел —recorder.purge_keep_days. -
Счётчик с окном 15 секунд на базе
counter:и двух автоматизаций. На каждое событиеyandex_smart_home_device_actionинкрементируется, через 15 секунд без новых событий — сбрасывается. Простейшая детекция всплесков. -
Автоматизация-алерт: если в окне
N ≥ 5событий — шлём Telegram с первыми 15 командами и общимcontext_id. Debounce 5 минут, чтобы один всплеск не превращался в спам. -
Lovelace-карточка «Детали команд Алисы по волнам» — markdown + Jinja, группирует события по
context_id, показывает сводку «за 14–19 апреля 2026 года (6 дн.): 43 волны, из них 34 массовых. Одиночных команд: 65. Всего событий: 500.» и каждый блок-волну с таблицейвремя / устройство / команда / значение
Ключевая эвристика — группировка по context_id. Если у тебя за секунду пришло 15 команд на 15 устройств, но у всех общий context_id — это одна команда от Алисы, не пятнадцать. По отдельным entity это видно плохо, по контексту — сразу.
Полный код пакета и дашборда. Там же — README с установкой и инструкциями по тестированию (симуляция массовой команды через Developer Tools → Events → Fire event).
Ещё раз: это костыль. Нормального ответа на вопрос «а кто это был-то» он не даёт и дать не может. Он только сообщает «опять пришло 15 команд за 3 секунды, смотрите лог».
Что я прошу у Яндекса
По факту, вопросы те же, что и в закрытом обращении. Выношу их сюда, потому что в закрытой переписке они, по ощущениям, не продвигаются.
-
По переданным
context_idи временным интервалам — данные о запросах к нашему аккаунту Smart Home:-
тип действия и полный набор затронутых устройств
-
источник запроса: какое устройство (конкретная колонка / приложение / веб / внешний сервис)
-
user_idпользователя аккаунта, от которого пришёл запрос -
request_idв логах Yandex API -
если запрос голосовой — расшифровка распознанной фразы
-
-
Подтверждение или опровержение: был ли это пользовательский запрос (голос/ручной клик), пользовательский сценарий, либо активность со стороны инфраструктуры Яндекса.
-
В долгосрочной перспективе — дать владельцу аккаунта инструмент самообслуживания: лог «что, когда, откуда, кем» с возможностью фильтрации.
Без этих данных разобраться нельзя — ни нам, ни кому-либо ещё со стороны. Тем временем ворота продолжают быть в зоне досягаемости API, источник которого для владельца аккаунта — чёрный ящик.
Что это значит для других пользователей
Если у вас дома Smart Home на Алисе и в периметре есть устройства, у которых нежелательное срабатывание имеет последствия в физическом мире — ворота, электрозамки, подача воды, газовые клапаны, шлагбаумы, аварийное отключение питания — имеет смысл:
-
Не добавлять такие устройства в Алису вообще. Yaha Cloud /
yandex_smart_homeпозволяет фильтровать, что отдавать в облако. Снимите эти устройства из экспорта. -
Если всё-таки добавлены — поставить перед ними защитный слой в HA:
-
проверка текущего состояния перед импульсом (не слать
close_cover, если уже closed) -
отдельная автоматизация-напоминание, если cover открыт ночью
-
аварийный Telegram при критичных переходах состояния
-
детектор массовых команд (
N действий за окно) — пример в github
-
-
Положить свой мониторинг запросов от Алисы. Пока Яндекс не дал его сам — держать SQL-сенсор и алерт у себя. 30 строк конфига.
Оговорка
Источником команд может оказаться что угодно — и наша сторона в том числе:
-
кривой сценарий в приложении, которого сам владелец уже не помнит
-
колонка в доме, распознавшая фоновое аудио как голосовую команду (радио, ТВ, видеозвонок, разговор соседей)
-
сторонний сервис, подключённый к аккаунту как навык/интеграция
-
баг в облачной стороне Yandex Smart Home
-
нечто, о чём мы пока не подумали
Все эти версии проверяемые — но только со стороны Яндекса, потому что данные есть только там. Проблема не в том, какая из версий окажется правдой. Проблема в том, что выяснять это должна единственная компетентная сторона — и по тикету 26040212533585258 от неё уже больше месяца идут автоответы.
Кирилл, если вдруг читаешь: очень ждём.
ссылка на оригинал статьи https://habr.com/ru/articles/1025556/