Skip to content

Продвинутое получение команд от Яндекс.Станции и передача их в Home Assistant в виде событий

Notifications You must be signed in to change notification settings

dext0r/ha-yandex-station-intents

Repository files navigation

Получение команд от Яндекс.Станции в Home Assistant

Компонент генерирует события в Home Assistant на конкретные голосовые команды, адресованные Яндекс.Станции (или колонкам с Алисой). Как это работает: вы говорите "Алиса, сделай действие" и в Home Assistant появляется событие с текстом "сделай действие", именем колонки и комнаты. Такие события очень удобно использовать в автоматизациях.

Компонент адресован продвинутым пользователям, которые не боятся поредактировать YAML, и является продолжателем функции "Получение команд от станции" из компонента Yandex.Station от AlexxIT.

Основные преимущества и отличия:

  • Автоматическое создание/удаление/синхронизация сценариев в УДЯ (без перезагрузки HA!)
  • Понятная и однозначная переменная text в событиях (вместо Сделай громче на 0???!!!)
  • Возможно удалить все сценарии из УДЯ одним вызовом сервиса yandex_station_intents.clear_scenarios

Компонент "Yandex.Station Intents" никак не связан с компонентом "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 являются необязательными и могут использоваться в любых вариациях.

Как работает:

  1. Срабатывает от Алиса, как дела, генерирует событие с text: Как дела, колонка ничего не скажет в ответ
  2. Срабатывает от Алиса, кто нибудь дома, генерирует событие с text: Кто нибудь дома, колонка, которая нас услышала ответит Сейчас проверю
  3. Срабатывает от Алиса, время кушать (или Алиса, время ужина, или Алиса, давай ужинать и т.п.), генерирует событие с text: Время ужинать, колонка ничего не скажет в ответ
  4. Срабатывает от Алиса, не выключай свет в прихожей (или Алиса, не выключай свет в коридоре), генерирует событие с text: Не выключай свет в прихожей, колонка, которая нас услышала ответит случайной фразой из списка
  5. Срабатывает от Алиса, давай попьем чаю, генерирует событие с text: Давай попьем чаю, колонка, которая нас услышала ответит Отличная идея, сейчас включу свет на кухне, после этого колонка выполнит команду Включи свет на кухне
  6. Срабатывает от Алиса, очень холодно, генерирует событие с text: Очень холодно, колонка выполнит команду Прибавь температуру кондиционера на 1 градус в КОМНАТА (вместо КОМНАТА будет подставлена комната, в которой находится колонка)
  7. Срабатывает от Алиса, точная температура в комнате, генерирует событие с text: Точная температура в комнате, колонка, которая нас услышала ответит вычисленным шаблоном из say_phrase
  8. Срабатывает от Алиса, давай поиграем. Сценарий будет создан и работать только на аккаунте 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?

  1. При активации скриптов Алиса много болтает ("хорошо", "сделала" и т.п.). Болтовню можно отключить только для всего умного дома целиком, что не всегда удобно
  2. Невозможно достоверно определить колонку, которая активировала скрипт (только с некоторой вероятностью через мониторинг alice_state: BUSY)
  3. События очень удобно использовать в качестве триггера в автоматизациях

Как управлять светом и другими штуками?

Используйте интеграцию Yandex Smart Home

Миграция с YAML интентов Yandex.Station

  1. Установите и настройте интеграцию Yandex.Station Intents (YAML пока не меняйте)
  2. Удалите сценарии, которые были созданы компонентом Yandex.Station. Если в УДЯ нет вручную созданных сценариев - воспользуйтесь сервисом yandex_station_intents.clear_scenarios, в противном случае - удалите сценарии вручную.
  3. Убедитесь, что в УДЯ не осталось сценариев, созданных компонентом Yandex.Station
  4. В YAML конфигурации измените yandex_station на yandex_station_intents (при условии, что у вас в yandex_station есть только блок intents)
  5. Перезагрузите YAML конфигурацию Yandex.Station Intents сценарии будут созданы автоматически
  6. Дождитесь появления всех сценариев в УДЯ (30-60 секунд), посмотрите Журнал Сервера на наличие ошибок
  7. Перезагрузите Home Assistant, убедитесь, что ошибок по-прежнему нет
  8. Проверьте работу интентов, изменения в автоматизациях не потребуются

Удаление всех сценариев

Компонент позволяет удалить абсолютно все сценарии из УДЯ через сервис yandex_station_intents.clear_scenarios. Будут удалены в том числе и сценарии, созданные вручную.

Для удаления вызовите сервис через Панель разработчика > Сервисы:

service: yandex_station_intents.clear_scenarios
data:
  confirm: Я действительно хочу удалить ВСЕ сценарии из УДЯ

Благодарности

  • AlexxIT за компонент Yandex.Station и разрешение использовать из него код для взаимодействия с Яндексом

About

Продвинутое получение команд от Яндекс.Станции и передача их в Home Assistant в виде событий

Topics

Resources

Stars

Watchers

Forks

Packages

No packages published

Languages