Управление Яндекс.Станцией и другими колонками с Алисой из Home Assistant

    Мы привыкли называть умными устройства, которыми можем управлять, не вставая с дивана. Включить лампочку, вентилятор, кофеварку или стиральную машину.


    Колонки с Яндекс Алисой хоть и называются умными, но вы не можете изменить громкость не находясь рядом с колонкой (орать через всю комнату не считается). Вы не можете перемотать песню из мобильного приложения Яндекса. Или остановить сказку, запущенную на колонке в детской, из своей кровати в спальне.


    В январе 2020 кто-то обнаружил, что Яндекс.Станция поддерживает некий локальный протокол. На GitHub начали появляться проекты по управлению Яндекс.Станцией. Мне хватило пару часов, чтоб разобраться и выпустить первую версию компонента для Home Assistant. Это достаточно популярная система домашней автоматизации, написанная на языке Python.


    На сегодняшний день компонент поддерживает управление всеми колонками с Яндекс Алисой и при желании может выглядеть так:



    Или так:



    А работать так:



    Инструкции по установке, настройке и использованию компонента можете найти на GitHub странице проекта.


    Локальный протокол


    Устройства Яндекса обнаруживаются в локальной сети по протоколу mDNS и имени _yandexio._tcp.local..


    Локальный протокол представляет собой подключение к станции по WebSocket и обмен JSON-сообщениями в две стороны. Создавался он для приложения Яндекс.Музыки и поддерживает полный перечень команд управления станцией, как медиа-устройством: включить песню по ID из каталога Яндекс.Музыки, перемотать, изменить громкость и т.п.


    Первым сообщением нужно отправить на станцию токен, полученный с серверов Яндекса, используя акаунт Яндекса, к которому привязана станция. Так что кому угодно управлять вашей станцией не получится.


    Кстати подключение к колонкам Google через протокол Chromecast не ограничено какими-либо паролями или аккаунтами. Управление колонкой доступно любому пользователю той же локальной сети.


    К многим устройствам с AirPlay первой версии подключение также не ограничено паролем.


    Помимо медиа команд протокол поддерживает функцию, делающую Яндекс.Станцию совершенно уникальным устройством на рынке. Это возможность отправить на колонку текстовую команду. И колонка её выполнит, будто услышала команду через микрофон.


    Вы можете включить плейлист дня с Яндекс.Музыки, лайкнуть песню, спросить погоду, вызвать такси, управлять умными устройствами, подключенными напрямую в экосистему Яндекса.


    И вишенкой на торте — вы можете попросить станцию произнести любую фразу голосом Алисы. Это тот самый голос, который по праву признан лучшим голосом TTS для русского языка на сегодняшний день. Этот голос является эксклюзивом Яндекс Алисы и его нет даже в Yandex SpeechKit.


    Но и это ещё не всё! Помимо зачечательного голоса вам доступна настройка генератора речи и библиотека звуков из платформы Яндекс.Диалоги.


    Облачное управление


    На сегодняшний день локальный протокол поддерживает только большая станция и модуль. Почти пол года сообщество ждало появление протокола в остальных колонках с Алисой, но это так и не случилось.


    В начале мая Яндекс выпустил очень интересное обновление для своей платформы. В сценарии умного дома добавили возможность отправить на любую колонку пользователя любую текстовую команду. Как и в случае с большой станцией — колонка её выполняет.


    По задумке авторов сценарий выполняется по заданной активационной фразе, которую пользователь произносит своему устройству с Алисой. Это может быть колонка, мобильное приложение Яндекс или Яндекс.Браузер с Алисой на компьютере. Но в интерфейсе управления сценариями есть кнопка ручного запуска любого пользовательского сценария.


    Интерфейс умного дома Яндекса представляет собой обычное веб-приложение, которое можно запустить в том числе на компьютере.


    Я ранее сталкивался с внутренними API этого приложения для реализации функции управления HDMI выходом большой станции. Да, есть ещё такая недокументированная возможность и компонент её поддерживает.


    Научить компонент создавать сценарии и выполнять их не составило особого труда. Через сценарии можно как выполнять команды, так и произносить любые фразы.


    Единственным большим минусом такого подхода является отсутствие обратной связи от колонки. Неизвестно что играет станция на данный момент и вообще играет ли она что-либо. У локального протокола такой проблемы нет, там выводится полная информация о исполнителе и красивая обложка из Яндекс.Музыки.


    YandexStation 2.0


    Некоторое время ушло на объединение локального и облачного режима работы. При старте Home Assistant все колонки включаются в облачном режиме и запускается поиск колонок, поддерживающих локальный режим. mDNS довольно капризный протокол и иногда может искать колонку довольно долго. Но благодаря наличию облачного режима — управление станцией сохранится, пусть и в обрезанном режиме без обратной связи. При обнаружении локальной колонки — управление переключается на локальный протокол.


    Похожим образом работает другой мой компонент для управления устройствами eWeLink (Sonoff) на оригинальной прошивке — SonoffLAN. В линейке популярных китайских реле также есть устройства, которые поддерживают локальное и облачное управление. И устройства, которые поддерживают только облачное управление.


    Могу написать отдельную статью про компонент, если интересно.


    Home Assistant Windows Portable


    Для пользователей, испытывающих трудности в установке Home Assistant, я собрал портативную версию Home Assistant под Windows на базе WinPythonHassWP. Эта версия подойдёт для ознакомления и экспериментов. В ней уже установлен Home Assistant Community Store (HACS) и компоненты YandexStation и SonoffLAN.


    Демонстрация

    Для повседневного использования всё же рекомендую установить Hass.io на Raspberry Pi, NUC (или аналог) или виртуальную машину с Linux. Но слышал у VirtualBox есть проблемы с Multicast. Это тот самый mDNS без которого в локальной сети НЕ найдутся ваши Яндекс.Станции, устройства Sonoff, колонки Google, плееры с поддержкой AirPlay и многие другие полезные гаджеты.


    Заключение


    Я знаю довольно много людей, кто купил колонки с Алисой благодаря выходу этого компонента. Решение показывает, что при наличии фукнционального API — эти колонки могут стать почти обязательным устройством в каждом умном доме.


    Это далеко не все крутые вещи, на которые способны колонки с Алисой и экосистема умного дома Яндекса. Просто у меня пока ещё не дошли руки реализовать всё задуманное.


    Следить за развитием этого и других моих проектов можно на канале в Telegram. На странице GitHub вы можете найти и другие полезные компоненты для Home Assistant.

    AdBlock похитил этот баннер, но баннеры не зубы — отрастут

    Подробнее
    Реклама

    Комментарии 38

      +1
      Пользуюсь ежедневно. Решение крутое. Спасибо автору!
        +1
        Поддерживаю, давно уже использую решение автора в HA.
        +1
        Алексей! Молодец! Спасибо за твои старания. Пользуюсь почти всеми твоими модулями.
        А SonoffLAN думаю знают не только в России.

          0
          локальный протокол поддерживает только большая станция и модуль
          Модуль — это мини, как на видео?
            0
            Модуль это alice.yandex.ru/modul
              0
              А Яндекс.Розетка, получается, локальный протокол не поддерживает? Вкл-выкл своим скриптом и без интернета никак не сделать?
                +1
                У меня нет Яндекс.Розетки. Потенциально можно доработать компонент, чтоб он поддерживал и Яндекс.Розетку через облако Яндекса. Но такого я не планировал.

                Если у вас есть любая колонка Яндекса — уже сейчас можно управлять розеткой через неё с помощью компонента.
            0

            У меня дома есть и Алиса и Google Home, есть такой сценарий: колонка с Алисой понимает команду "включи колыбельную" и включает выключатель а умном доме, а тот запускает двунаправленный процесс проигрывания локального mp3 файла на Google home mini. Колонка хоть и умная получается, но работать с ней невозможно, поэтому приходилось дублировать устройствами Chromecast и я не мог выбрать единую платформу для колонок умного дома. Сейчас Алиса стала умнее и с этим компонентом уже с ней можно работать. Например, при открытии окон при работающем кондере сказать голосом, что на улице жарко и если не закрыть окно, то кондёр будет выключен через пару минут.


            Даже с облачным управлением это прорыв, но плохо, что локальное управление не работает в мини колонках

              0
              Да. И поддержка локального протокола на мини и проигрывание mp3 по ссылке — всё в руках Яндекса.

              У меня есть теория, что пользовательские звуки, загруженные в платформу Яндекс.Диалогов — тоже можно проиграть с помощью компонента. Но руки так и не дошли проверить.
                +1
                Тут ниже подсказывают, что только что локальное управление появилось и в мини
                0

                А в обратную сторону она умеет? Ну чтобы "Алиса включи свет на кухне"?

                  +1
                  В обратную сторону есть другой компонент (не мой):
                  github.com/dmitry-k/yandex_smart_home

                  Если Home Assistant прокинут в Интернет и есть HTTPS — настроить не проблема.
                    0

                    Существуют ли какие-то варианты чтобы работало без интернета? Не обязательно Алиса. Думаю пока что купить...

                      +1
                      1. Ваша колонка не распознает голос без Интернета.

                      2. Если отмотать телеграм чат Яндекс.Диалогов на дату выхода первой станции — можно найти моё предложение по интеграции колонки в уже имеющиеся у пользователей системы домашней автоматизации. Уже существующими на тот момент у них API и не покидая локальную сеть пользователя.

                      Но спустя 2 года Яндекс так и не прислушались :)

                      Google в прошлом году выпустил Local Home SDK. Где колонка передаёт команду напрямую в систему умного дома. Но для распознования команды в любом случае нужен Интернет.
                      0
                      Я пользуюсь Yandex2mqtt
                      Не требует наличия HomeAssistant, только локальный mqtt.
                      Ну и конечно, как со всеми диалогами яндекс, нужен доступ извне по https протоколу (хотя это можно сделать и бесплатно, пользуясь dynDNS и letsencrypt).
                    0
                    А Яндекс мини играть музыку с Ютуба ещё не заставили?
                      0
                      Не встречал такого решения. Модуль можно. И модуль можно воткнуть в взрослую акустику по HDMI.

                      Я как раз жду из китая пару переходников HDMI-AUX, чтоб проверить подключение модуля к старой акустике без HDMI.
                        0
                        А это мысль! Правда, модуля нет в продаже :(
                          +1
                          Их много на вторичном рынке. Народ не проникся, а очень зря. Потенциал у устройства большой. Плюс за такую цену.
                            0

                            Даже на вторичном не смог найти. Плохо искал?..

                      +2

                      Забавно, что не прошло суток после выхода статьи на Хабре, как заработало локальное управление Станции Мини.

                        0

                        Только вот Мини имеет неприятную особенность — сама меняет себе локальный IP каждые несколько дней несмотря на то что на роутере ей выставлен статический адрес. Очень странная особенность и к сожалению компонент автора к ней не был готов. Я было попытался поддержать смену IP в компоненте заменив проверку что локальное устройство с таким то ид уже найдено на проверку что локальное устройство с таким то ид и адресом найдено. Но теперь при смене IP у мини начинается форменная жесть со спамом безуспешных попыток соединения. Пока к сожалению не удаётся выкроить времени что бы лучше разобраться в коде.

                          0

                          Любопытно. Я такого поведения не замечал, всегда на одном ip сидит.
                          У меня Keenetic с офф. прошивкой, ежели что.

                            0
                            Думаю на этих выходных у меня самого дойдут руки разобраться с стабильностью локального подключения
                            0
                            UPD: Действительно, апдейт сегодня прилетел. См. первый пункт чейнджлога за 26.06.2020:
                            На устройствах Android появилась возможность отправлять музыку из приложения Яндекс.Музыки на Станцию Мини.

                            yandex.ru/support/station-mini/release-notes.html
                            AlexxIT
                            +1
                            Автору — браво.
                            И за компонент, и за статью.
                            Всё грамотно.
                              0
                              Давно я ждал, когда появится возможность управлять Яндекс колонкой. Уже подумывал свой аналог пилить… Наконец- то появилась такая возможность!
                                0

                                Вот бы колонка имела параметр места установки. А то в спальне одна колонка, в гостиной вторая, в обоих комнатах телеки сяоми. Хочется сказать: "Алиса, выключи телек/свет/кондей" и по месту установки она бы добавила контекст собственного местоположения спальня/гостиная. Ну и софт со станции портировали бы на андроид, чтобы на телек можно было поставить и рулить им как станцией ютубы/вкл/выкл/музыка/радио.

                                  0
                                  Вот бы колонка имела параметр места установки. А то в спальне одна колонка, в гостиной вторая, в обоих комнатах телеки сяоми.

                                  Все колонки с Алисой уже несколько месяцев как имеют привязку к месту и на "Алиса, выключи телек/свет/кондей" выключают устройство именно в этом месте, если оно задано в настройках устройства. Жаль только на команду "Алиса, включи телекИ" она тоже включит только там где ты находишь, что бы включила все надо добавить "везде" или "все" (про "все" не уверен).


                                  Ну и софт со станции портировали бы на андроид, чтобы на телек можно было поставить и рулить им как станцией ютубы/вкл/выкл/музыка/радио.

                                  Колонки и так работают на каком то кастомизированном андройде. И кстати у яндекса есть своя платформа для телеков

                                    0
                                    Заказал сегодня мини, купил комплект сяоми для умного дома, в прошлом году купил сяоми телек 55. Увы на телек через АПК пришлось ставить яндекс.радио и через голосовой поиск запускать. Алису на телек не поставить, из Алисы телек не включить/выключить, из Гугл ассистента телек не включается/выключается, совсем не хочу ик передатчик покупать. Готовлю проект автоматизации в новую квартиру, где запустил капитальный ремонт.
                                      0
                                      А почему ИК-пульт родной Алисы не хотите, если не секрет? У меня такой дома стоит. И тв, и кондиционер через него управляется.
                                        0
                                        Вообще никакой пульт не хочу. Я же не просто так беру все устройства с поддержкой zigbee/bt/wifi (rs485 через esp8266 через wifi для водосчётчиков и электросчётчика). В отличии от других решений, я хочу максимально на беспроводных технологиях построить всё. Квартира маленькая 48 квадратов. И хочу использовать только сяоми решения (исключения: регуляторы отопления, вентили водоснабжения, регуляторы тёплого пола, электромеханический замок, бризер, водосчётчики, электросчётчики). Увы стиралку, посудомойку, варочную плиту, вытяжку, духовку, холодильник, питьевой фильтр не по карману мне купить сейчас умными.
                                          +1
                                          На выходных как раз добавил в компонент YandexStation поддержку кондиционеров, прокинутых в умный дом Яндекса в том числе через Яндекс Пульт.

                                          Выбрал именно этот ИК пульт из-за наличия большого количества готовых пресетов устройств. С моим кондеем не мог справится Logitech Harmony. А Яндекс Пульт подхватил без проблем.

                                          Теперь можно добавить автоматизации, завязанные на датчиках двери и окон, на внешнем датчике температуры и на присутствии людей дома. Для полностью автоматического управления кондиционером.

                                          В Home Assistant выглядит так:

                                    0

                                    А может кто-то знает — доступно ли описание протокола для работы с Алисой со стороны колонки? Ну то есть послать голосовую команду в виде аудио-файла на сервера Яндекса так, как это делает Яндекс станция и получить результат обработки.
                                    У Гугл, например, есть открытый SDK для устройств: https://developers.google.com/assistant/sdk. Есть ли что-то аналогичное для Алисы? Может неофициальное?

                                      0
                                      Конечно, на коммерческой основе у них сервис работает и вам есть и цены.
                                        0

                                        Интересует некоммерческое использование. Потому и спрашиваю — может кто-то уже реверсил протокол?

                                          0
                                          Для некоммерческого использования есть 1000 запросов в месяц кажется. Ну и ваши цели, коммерческие или нет всё равно требуют оплаты коммерческого сервиса, это вполне нормально.
                                            0
                                            В открытом доступе есть только Yandex SpeechKit. Это не «Алиса», а просто сервис для распознавания/синтеза речи.

                                    Только полноправные пользователи могут оставлять комментарии. Войдите, пожалуйста.

                                    Самое читаемое