Awesome
Получение команд от Яндекс.Станции в Home Assistant
Компонент генерирует события в Home Assistant на конкретные голосовые команды, адресованные Яндекс.Станции (или колонкам с Алисой). Как это работает: вы говорите "Алиса, сделай действие" и в Home Assistant появляется событие с текстом "сделай действие", именем колонки и комнаты. Такие события очень удобно использовать в автоматизациях.
Компонент адресован продвинутым пользователям, которые не боятся поредактировать YAML, и является продолжателем функции "Получение команд от станции" из компонента Yandex.Station от AlexxIT.
Основные преимущества и отличия:
- Автоматическое создание/удаление/синхронизация сценариев в УДЯ (без перезагрузки HA!)
- Понятная и однозначная переменная
text
в событиях (вместоСделай громче на 0???!!!
) - Возможно удалить все сценарии из УДЯ одним вызовом сервиса
yandex_station_intents.clear_scenarios
Компонент "Yandex.Station Intents" никак не связан с компонентом "Yandex.Station" и его авторами!
- Похожие компоненты
- Установка
- Настройка
- Вопросы и ответы
- Миграция с YAML интентов Yandex.Station
- Благодарности
Похожие компоненты
- Yandex.Station: управляет Яндекс.Станцией (воспроизведение, громкость, синтез текста), так же позволяет получать команды от Яндекс.Станции (с ручным созданием сценариев и в чуть менее удобной форме).
- YandexDialogs: обрабатывает любые фразы, адресованные Алисе, через NLU (Natural Language Processing). При использовании обязательно называть имя навыка, например "Алиса, попроси мой_навык сделать что нибудь".
- Yandex Smart Home: позволяет управлять устройствами, подключенными к Home Assistant через Алису и веб-интерфейс. Используйте его для "Алиса, включи лампочку зелёным на 50% яркости" или "Алиса, прибавь громкость на телевизоре".
Установка
Способ 1: HACS
- Установите и настройте HACS
- Откройте HACS --> Три точки в верхнем правом углу -> Пользовательские репозитории
- Добавьте репозиторий
dext0r/ha-yandex-station-intents
(типИнтеграция
) - В поиске найдите и откройте
Yandex.Station Intents
-> Скачать - Перезагрузите Home Assistant
Способ 2: вручную, не рекомендуется
- Скачайте архив
yandex_station_intents.zip
из последнего релиза - Создайте подкаталог
custom_components/yandex_station_intents
в каталоге где расположен файлconfiguration.yaml
- Распакуйте содержимое архива в
custom_components/yandex_station_intents
- Перезагрузите Home Assistant
Настройка
- Добавьте интеграцию в Home Assistant:
Настройки
>Устройства и службы
>Интеграции
> НажатьДобавить интеграцию
>Yandex.Station Intents
(если интеграции нет в списке - обновите страницу) - Настройте список фраз или мигрируйте с yaml интентов компонента Yandex.Station
- Перезагрузите YAML конфигурацию через
Панель разработчика
>YAML
, вНастройки
>Система
>Журнал сервера
появятся ошибки если что-то пошло не так
Список фраз (интенты)
Интеграция работает с заранее сформированным списком фраз, на основе которых будут автоматически созданы сценарии в УДЯ. Активационные фразы могут содержать только кириллицу, цифры и пробелы.
Настройка выполняется через основной файл конфигурации configuration.yaml. Пример конфигурации:
yandex_station_intents:
intents:
Как дела: # (1), символ : обязателен
Кто нибудь дома: Сейчас проверю # (2)
Время ужинать: # (3)
extra_phrases: # альтернативные фразы, максимум три, не должны совпадать с основной фразой
- Давай кушать
- Давай ужинать
- Время ужина
Не выключай свет в прихожей: # (4)
extra_phrases:
- Не выключай свет в коридоре
say_phrase: "{{ ['Договорились', 'Хорошо', 'Я тебя услышала', 'Оки-доки']|random }}"
Давай попьем чаю: # (5)
say_phrase: Отличная идея, сейчас включу свет на кухне
execute_command: Включи свет на кухне
Очень холодно: # (6)
execute_command: Прибавь температуру кондиционера на 1 градус в {{ event.room }}
Точная температура в комнате: # (7)
say_phrase: "Точная температура {{ states('sensor.room_temperature') }} в {{ event.room }}"
Давай поиграем:
accounts: [vasya] # (8)
В данном случае интеграция автоматически создаст в УДЯ восемь сценариев, каждый из которых начинается с символов ---
. Не удаляйте эти символы и не модифицируйте никак название! По ним компонент понимает, что это его сценарий и в случае необходимости синхронизирует/удалит его.
Дополнительные параметры say_phrase
, extra_phrases
, execute_command
, account
являются необязательными и могут использоваться в любых вариациях.
Как работает:
- Срабатывает от
Алиса, как дела
, генерирует событие сtext: Как дела
, колонка ничего не скажет в ответ - Срабатывает от
Алиса, кто нибудь дома
, генерирует событие сtext: Кто нибудь дома
, колонка, которая нас услышала ответитСейчас проверю
- Срабатывает от
Алиса, время кушать
(илиАлиса, время ужина
, илиАлиса, давай ужинать
и т.п.), генерирует событие сtext: Время ужинать
, колонка ничего не скажет в ответ - Срабатывает от
Алиса, не выключай свет в прихожей
(илиАлиса, не выключай свет в коридоре
), генерирует событие сtext: Не выключай свет в прихожей
, колонка, которая нас услышала ответит случайной фразой из списка - Срабатывает от
Алиса, давай попьем чаю
, генерирует событие сtext: Давай попьем чаю
, колонка, которая нас услышала ответитОтличная идея, сейчас включу свет на кухне
, после этого колонка выполнит командуВключи свет на кухне
- Срабатывает от
Алиса, очень холодно
, генерирует событие сtext: Очень холодно
, колонка выполнит командуПрибавь температуру кондиционера на 1 градус в КОМНАТА
(вместоКОМНАТА
будет подставлена комната, в которой находится колонка) - Срабатывает от
Алиса, точная температура в комнате
, генерирует событие сtext: Точная температура в комнате
, колонка, которая нас услышала ответит вычисленным шаблоном изsay_phrase
- Срабатывает от
Алиса, давай поиграем
. Сценарий будет создан и работать только на аккаунтеvasya
(можно указать несколько аккаунтов через запятую). Аккаунт указывается в том же виде, как отображается в списке интеграций Yandex.Station Intents. Если аккаунты не указаны - сценарии будут созданы для всех активных интеграций.
Обработка событий
После того как колонка услышит ключевую фразу в Home Assistant сгенерируется событие yandex_intent
с параметрами:
text
: Основная фраза (смотрите примеры)entity_id
: ID колонки, которая услышала фразу активации (толькоmode: websocket
)room
: Комната, в которой находится колонка (толькоmode: websocket
)account
: Аккаунт, к которому привязана колонка
Пример обработки:
automation:
- alias: Кто нибудь дома
trigger:
- platform: event
event_type: yandex_intent
event_data:
text: Кто нибудь дома # пример (2)
action:
- service: media_player.play_media
target:
entity_id: '{{ trigger.event.data.entity_id }}' # ответит колонка, которая услышала "Алиса, кто нибудь дома"
data:
media_content_type: text
media_content_id: Я не знаю, ха-ха
- alias: Как дела
trigger:
- platform: event
event_type: yandex_intent
event_data:
text: Как дела # пример (1)
room: Кухня # сработает, если спросили колонку в комнате "Кухня"
action:
- service: media_player.play_media
target:
entity_id: '{{ trigger.event.data.entity_id }}'
data:
media_content_type: text
media_content_id: Здесь в комнате {{ trigger.event.data.room }} всё отлично!
Режим синхронизации
По умолчанию сценарии синхронизируются с УДЯ автоматически при запуске Home Assistant. Это поведение можно отключить добавлением в конфигурацию опции autosync: false
. После этого сценарии будут синхронизированы только при перезагрузке YAML конфигурации компонента со страницы Панель разработчика
> YAML
или через сервис yandex_station_intents.reload
.
Пример:
yandex_station_intents:
autosync: false
intents:
Тест:
Режимы работы (для продвинутых)
Интеграция поддерживает два режима работы: websocket
(по-умолчанию) и device
. Режим задаётся через параметр mode
в конфигурации (менять можно в любой момент).
Режим websocket
(по-умолчанию):
- Для работы желательна настроенная интеграция Yandex.Station
- Постоянное подключение к серверам Яндекса, не требует интеграцию
Yandex Smart Home
- Невозможно активировать событие из интерфейса УДЯ или голосом на телефоне, активация возможна только через колонку
- Позволяет получать
entity_id
иroom
колонки, которая услышала активационную фразу - Использует недокументированную функцию УДЯ и в теории может быть отключен Яндексом
Режим device
(условно-устаревший):
- Требует установленный компонент
Yandex Smart Home
, в фильтрах необходимо разрешить плеерыmedia_player.yandex_station_intents*
- Можно активировать событие кнопкой в интерфейсе или голосом на телефоне
- Невозможно определить колонку, которая услышала фразу, отсутствуют параметры
entity_id
иroom
в событиях - Будет работать всегда, так как активация происходит через управление виртуальным устройством в УДЯ
- В этом режиме не поддерживаются:
- Параметр
execute_command
- Шаблоны в
say_phrase
- Параметр
Вопросы и ответы
Зачем это всё, если можно отдать скрипты через Yandex Smart Home?
- При активации скриптов Алиса много болтает ("хорошо", "сделала" и т.п.). Болтовню можно отключить только для всего умного дома целиком, что не всегда удобно
- Невозможно достоверно определить колонку, которая активировала скрипт (только с некоторой вероятностью через мониторинг
alice_state: BUSY
) - События очень удобно использовать в качестве триггера в автоматизациях
Как управлять светом и другими штуками?
Используйте интеграцию Yandex Smart Home
Миграция с YAML интентов Yandex.Station
- Установите и настройте интеграцию
Yandex.Station Intents
(YAML пока не меняйте) - Удалите сценарии, которые были созданы компонентом Yandex.Station. Если в УДЯ нет вручную созданных сценариев - воспользуйтесь сервисом
yandex_station_intents.clear_scenarios
, в противном случае - удалите сценарии вручную. - Убедитесь, что в УДЯ не осталось сценариев, созданных компонентом
Yandex.Station
- В YAML конфигурации измените
yandex_station
наyandex_station_intents
(при условии, что у вас вyandex_station
есть только блокintents
) - Перезагрузите YAML конфигурацию
Yandex.Station Intents
сценарии будут созданы автоматически - Дождитесь появления всех сценариев в УДЯ (30-60 секунд), посмотрите Журнал Сервера на наличие ошибок
- Перезагрузите Home Assistant, убедитесь, что ошибок по-прежнему нет
- Проверьте работу интентов, изменения в автоматизациях не потребуются
Удаление всех сценариев
Компонент позволяет удалить абсолютно все сценарии из УДЯ через сервис yandex_station_intents.clear_scenarios
. Будут удалены в том числе и сценарии, созданные вручную.
Для удаления вызовите сервис через Панель разработчика
> Сервисы
:
service: yandex_station_intents.clear_scenarios
data:
confirm: Я действительно хочу удалить ВСЕ сценарии из УДЯ
Благодарности
- AlexxIT за компонент Yandex.Station и разрешение использовать из него код для взаимодействия с Яндексом