Форум » » Crestron + Алиса » Ответить

Crestron + Алиса

johnytsat: Добрый день,коллеги. Пытался кто-нибудь связать Алису с Crestron с помощью новой API "Умный дом" от Яндекс?

Ответов - 41, стр: 1 2 3 All

Вячеслав: Да, но https так и не осилил. Поэтому связал через чужой навык, который отдает все по http, да ещё и с плюшками в виде регулярных выражений. Кроме http еще ненужные особо IFTTT, MQTT, вроде и по https тоже может.

johnytsat: не через MajorDomo случаем?

Вячеслав: Нет, через Домовенка Кузю Сейчас навык добавили в приложение как умные устройства и можно говорить Алисе команды без вызова навыка домовенка. Можно сказать «Алиса, включи свет на 82%» Или «Алиса, включи канал 101», но в этом варианте нельзя самому задать контрольное слово ( яндекс генерит варианты сам на основе имени устройства) и нельзя сформировать свой ответ алисы как в случае стандартного вызова команды через навык. Т.е. Через раздел умных устройств на «Алиса, включи свет» она ответит типа «окей, включаю», а если говорить “Алиса, попроси домовенка кузю включить свет» она может ответить пользовательское “Спокойной ночи, сладких снов» вечером и “Включила, нет проблем» в дневные часы


SuHo: Доброго дня, Вячеслав Можете поподробнее описать что использовали качестве шлюза и какие его настройки?

Вячеслав: Шлюзом можно назвать только сервер владельца навыка "Домовенок Кузя" (alexstar.ru) Начнем с того что нужен аккаунт на яндексе к которому вы регистрируете устройства умного дома и собственно Яндекс станцию. Есть приложение Яндекс для телефонов в котором выполняются необходимые привязки Яндекс станции и создание/привязка прочих умных устройств. Яндекс станция понимает куда отправлять запрос анализируя того что вы сказали. Если к примеру сказать "Алиса, включи свет" Первым делом Алиса проверит, зарегистрированы ли для вашего аккаунта какие то умные устройства которые управляются словами "включи свет", если таких нет, то Алиса скажет просто типа "Я еще не умею такого делать, ну или поставит вам песню с таким названием" Если устройство есть (например вы добавили "лампа" сервиса Домовенок Кузя, в последствии переименовав на сайте alexstart "Лампа" в "Свет" ) то алиса генерит для такого устройства на основании его типа и имени пару десятков активационных фраз. Среди которых само собой есть фраза "Включи свет" Ваша фраза совпала с имеющейся фразой для одного из "виртуальных устройств", значит алиса отправляет команду серверу alexstar.ru данные в которых содержится инфа о пользователе (ваш уникальный id на яндексе идентификатор устройства и его состояние вкл/выкл/value) Ресурс alexstar тоже знает Вас как пользователя яндекс и на странице настроек ваших устройств выполняет для устройства "Свет" пункт меню "Правило на включение" в котором указано правило созданное вами на этом же сайте ("Включить свет"). В моем случае это url строка которая формирует GET запрос http://vyacheslav.ddns.net:6000/svet{value} Соответственно это GET запрос прилетает на мой домашний роутер и по порту 6000 редиректится на контроллер Crestron. Внутри этого Get запрос содержится фраза svet1 Я парсю её и понимаю что надо включить свет (средствами крестрон). Устройства можно создавать прямо на сайте alexstar они автоматически появятся в приложении яндекс. Подтверждает Алиса такую команду без тру фидбэка, на основании нескольких вариантов, которые генерит её AI. Это был вариант который через умные устройства. Другой базовый вариант (куда более мощный но требует добавлять в общем случае к команде название навыка) это голосовая команда непосредственно через навык "Алиса, попроси домовенка кузю включить свет" Алиса, зная свой зарегистрированный разработчиком Alex навык "Домовенок Кузя" перенаправляет вашу голосовую команду на сайт alexstar.ru (в ней есть куча полей согласно API яндекс диалогов), среди полей есть Ваш идентификатор (под которым объединены ваши устройства голосового управления телефон, яндекс станцию, браузер и т.п.) и собственно текст "включить свет". Ресурс находит нужного пользователя и в списке его правил находит правило с именем "включить свет" к которому вы привязали Get запрос вида http://vyacheslav.ddns.net:6000/{in}{1} Далее он прилетает к вам на роутер и т.д. как описано выше. Кроме GET может быть использована еще куча всяких вариантов на любой вкус и цвет. Преимущество второго варианта, 1) это несколько регулярных выражений а не только единственное {value} как в первом варианте (в примере {in}{1} ) с помощью которых вы можете дополнять GET запрос. См. на сайте alexstar описание. Вместо {in} в поле GET запроса прилетает та фраза которую вы сказали "включить свет". Вместо {1} прилетает "1" если в вашей фразе было "вкл" и "0" если в фразе было "выкл" Т.е. на контроллере я получаю "включить свет1" 2)Могу отправить свой ответ для озвучивания или написать его прямо в разделе правила на сайте. Если я отправлю в ответ на GET фразу "Включаю, нет проблем", алиса её озвучивает через колонку Яндекс станции. 3) Я сам полностью придумываю фразу которую потом могу парсить из голосовой команды. С помощью ответов и фраз я даже могу некий диалог реализовать между шлюзом и мной. Например: Я: Алиса, попроси домовенка кузю выключить режим охраны Алиса: Назовите, пароль Я: Алиса, ээээ 12345 Алиса: Пароль принят, выключаю режим охраны К сожалению, яндекс не хочет лечить "баг" с невыходом из навыка из браузера и наоборот бодрым выходом из навыка при работе со станцией по тайм ауту. Если бы они оставили выход только по фразе "Алиса, вернись", то можно было бы запустив навык однажды "Алиса, запусти навык Домовенок Кузя", потом говорить команды коротко без префикса как в варианте 1, при этом имея широкий функционал варианта 2. А уж если приперло музычку включить, то выйти из навыка "Алиса, вернись" и потом уже "Алиса, включи радио семь". Т.е. внутри навыка Алиса будет понимать только те команды, которым вы её обучили, на остальное говорить голосом домовенка "Команда не найдена". Кстати, первый вариант работы через умные устройства ещё хорош еще тем, что не нужно слушать противный голос домовенка Кузи. Быстрее это все попробовать и все станет понятно. Тем более вы можете поупражняться с голосовым помощником встроенным в Яндекс Браузер, необязательно покупать голосовые устройства Яндекса. Я описал лишь часть функционала, а там еще тележка плюшек.

olegny: Вячеслав пишет: Далее он прилетает к вам на роутер и т.д. как описано выше. Кроме GET может быть использована еще куча всяких вариантов на любой вкус и цвет. А как же с безпасностью? Эдак каждый может включить свет в вашем доме? ;)

Вячеслав: Может, если знает что и куда отправить. Для тех кому критична безопасность https тоже доступен Есть еще промежуточный вариант c basic авторизацией, да и acl никто не отменял, принимайте пакет только с доверенного сервера

SuHo: Вячеслав пишет: Я парсю её и понимаю что надо включить свет Вячеслав, спасибо огромное за подробный ответ. Я ещё не так глубоко изучил Crestron, поэтому у меня ещё вопрос - какой модуль вы используете для "приёма" пакетов от Алисы?

Вячеслав: Я использую самописный модуль на simpl+. Если не владете навком написания модулей на simpl+, то я варианта корректно обработать приходящие длинные строки стандартными кубиками с трудом представляю. Может коллеги подскажут. Могу конечно за небольшую плату предложить Вам модуль на simpl+ или дописать его под вашу задачу. В модуле в качестве параметров пишите искомые строки (типа: svet1 / свет1 / свет0 / выключить дисплей) каждой искомой строке соответствует параметр со строкой ответа (типа: включаю свет/ включаю дисплей для Яндекс станции), можно выбирать отправлять ответ или ответ формируется на сервере. Так же есть аналоговый выход для значений присылаемых через регулярные выражения {d1} или {value} чтоб реализовать управление каналами, температурой или % света. Ну и понятно, что каждому параметру соответствует digital выход для управления реакцией оборудования. В планах еще возможность добавить в ответы целочисленные значения, ну и наверно basic авторизацию. Добавил в версии 6 модуля Модуль используется на контроллере 2 -серии, под 3 серию может придётся править для поддержки кириллических символов, хотя может и заработает. В любом случае на латинице точно будет работать.

SuHo: с simpl+ нормально как обработать запрос с WEB-страницы с поиском я умею вот с получением не работал вы используете SocetServerStartListen?

Вячеслав: Да, его

SuHo: Спасибо. Буду пробовать

SuHo: Почти всё победил. Осталось только разобраться с настройкой Алисы при работе не через Кузю. Вячеслав, вам удалось уменьшить интервал посыла команд? У меня команды ходят только с интервалом 15 сек.

Вячеслав: Было у меня такое.)) Совершаете мои же ошибки на раннем этапе интеграции с сервисом. {текст удален} Но собственные ошибки и их поиск конечно полезны в плане саморазвития. Могу сэкономить Вам пару дней и скажу из-за чего это, если хотите )

SuHo: :) хочу

Вячеслав: 1.Используйте поле Content-Length 2.Используйте размерность переменной для TX не менее 500 символов (Тут я попался, так как использовал внешний клиент сначала, поменял потом на сокет, а размерность осталась прежняя, потерял время пока увидел что команда ушла обрезанной, хоть и с правильной длиной). Причина в кропнутом ответе. Из за некорректной команды сервак начинает тупить и время перед нормальным приёмом повторной команды иногда составляло до 20с

SuHo: не смог разобраться и понять :( пора с бутылкой пива в личку ;)

Вячеслав: Пивом тут не обойдётся

johnytsat: Вячеслав пишет: А возможно использовать вместо самописного модуля модуль TCP/IP Server для приема GET запроса на него? Или из-за длины команды он никогда его не увидит?

Вячеслав: Да, возможно использовать внешний TCP/IP Server. Просто вы будете ограничены по длине голосовых команд. Но в 80% случаев, особенно при использовании идентификаторов заменителей (например для варианта работы через умные устройства, так как символьное выражение голосовой команды там всё равно Яндексом не пересылается) внешнего модуля будет достаточно. RX запрос с идентификатором "tv0" составляет всего 66 символов, т.е. 66-3=63. 63 это минимальная служебная информация добавляемая к вашему идентификатору команды+value. 255-63=192 Итого 192 символа останется на вашу команду вместе со статусом/value. Или половину (96) от этого если будет использоваться кириллица. Чуть хуже ситуация с ответом. В моем случае служебный оверхед составляет порядка 184 символа (но это лишь в моем варианте). С другой стороны по методу 1, ответы вообще не нужны, так как Алиса не позволяет их озвучивать. Главная сложность парсить приходящие команды. В случае SIMPL+ эта задача решается куда более ловко. А если уж дошли то SIMPL+, то добавить сокет сервера пользуясь справкой не составит труда.

Paul_T: johnytsat пишет: Пытался кто-нибудь связать Алису с Crestron с помощью новой API "Умный дом" от Яндекс? А, где посмотреть этот API? И, совсем ламмерский вопрос: Обязательно пользоваться Умной Колонкой или можно говорить в телефон?

Вячеслав: Можно говорить в телефон. Api можно посмотреть в разделе Яндекс диалоги click here

Paul_T: Вячеслав пишет: Спасибо. Говорю в телефон. Кузя отвечает заданным ответом, т.е. Правило выполняется, но GET запрос пока не приходит... Порт проброшен, на компе поднят TCP сервер. Буду разбираться, вещь интересная...

Вячеслав: Похоже все таки сетевая проблема. Смотрите Wireshark-ом, ну и сервер свой проверьте Hercules -ом (сначала на локальный IP, потом на внешний)

Paul_T: Вячеслав пишет: Да, переброс портов не перебрасывается ))) Как раз Hercules'ом и слушаю TCP

johnytsat: Я просто не до конца понимаю видимо,что нужно указывать в IP адрес сервера. Потому что,чтобы что-то передать или получить сигнал Connect-F должен быть активным,как я понимаю? И его status должен быть равен 2d?Тогда какой IP должен выступать в роли сервера?Адрес контроллера?

Вячеслав: Для варианта TCP/IP server используется 2 типа адреса: Вариант1 0.0.0.0 позволяет организовать входящее подключение с любого внешнего адреса. Своего рода отключенный файервол. Вариант2 x.x.x.x позволяет подключаться к вашему серверу клиенту с IP адресом x.x.x.x (Например можно вписать вместо x.x.x.x адрес сервера alexstar.ru 46.173.214.134, хотя правильнее вписать доменное имя alexstar.ru используя поле use host name) . Впрочем, зная вашу url команду, другой пользователь сайта alexstar.ru сможет управлять вашими устройствами, поэтому держите ёё в секрете или реализуйте авторизацию basic (пароль и логин с вашей страницы настроек доступен только Вам). Но basic авторизация это уже однозначно программный код и на кубиках такого не сделать. Никакие 127.0.0.1 или адрес крестрона сюда вписывать не нужно. Можно посмотреть контекстную справку по этому элементу в SimplWindows. В общем случае status будет равен 1 (ожидание соединения), а Connect-F равен 0. Когда прилетит входящий Get, то статус поменяется на 2d , и Connect-F на 1. Это подключение будет вскоре разорвано (после передачи запроса Get), по инициативе сервера alexstar.ru, так как нет необходимости его поддерживать постоянно (оно и к лучшему). Не интересовался как долго сервис поддерживает это входящее соединение открытым, но скорее всего около 0,5s выделенные разработчиком для вашего ответа на Get запрос, если он предусмотрен.

johnytsat: Спасибо огромное,очень помогло двинуться!

johnytsat: Не понял как убрать задержку в 15с через поле Content-Length,ведь в GET-запросе этого поля нет. Убрал задержку через последовательный SocketServerStopListen,SocketServerStartListen после получения запроса. Не знаю только,создаст ли это какие-нибудь проблемы?

Вячеслав: Задержка возникает при не корректном ответе на входящий Get. Если вы не отправляете ответ с крестрона, то проблема задержки может быть иная.. Поле Content-Length относится лишь к ответу в формате json. Как влияет SocketServerStopListen, SocketServerStartListen не могу сказать. Я изначально закрываю соединение, если оно остается активным более 0,2s в силу особенностей единственно возможного подключения. Но это скорее костыль на всякий случай. (Вот он видимо меня и выручил) Вы хотите сказать, что если его не закрывать, то удаленная сторона закроет его не ранее чем через 15с и следовательно новые входящие запросы крестрон принять не сможет, потому что для них навык alexstar создает новые сессии?

Вячеслав: Paul_T пишет: Да, переброс портов не перебрасывается ))) Как раз Hercules'ом и слушаю TCP Вангую, у Вас наверное роутер получает серый внешний адрес от провайдера.

johnytsat: Вячеслав пишет: Да,я пока без ответа делал,только на получение)И такое ощущение что SocketStartListen,если его не останавливать слушает в течении 15с.

Paul_T: Вячеслав пишет: Естественно, но это никогда не мешало достучаться на локальный IP по переброшенному порту. Дело в корявой прошивке MI роутера, поставил альтернативную, все работает...

Viacheslav Alekseev: Вячеслав пишет: Да, возможно использовать внешний TCP/IP Server. Просто вы будете ограничены по длине голосовых команд. А что мешает прием буферизировать, он ведь данные не должен потерять, просто дошлет их в следующих посылках CHANGE Rx и если поставить BUFFER_INPUT Rx, то все в итоге должно прийти корректно. (или я чего-то не знаю про TCP Server?) А на отправку та же история - просто выходную команду отправлять в Tx циклом, разбивающим ее на куски по 250 байт, например. HTTP сервер ведь не дурак, знает когда HTTP запрос начинается и когда заканчивается (по нескольким \x0D\x0A).

Viacheslav Alekseev: Вячеслав пишет: Вы хотите сказать, что если его не закрывать, то удаленная сторона закроет его не ранее чем через 15с и следовательно новые входящие запросы крестрон принять не сможет, потому что для них навык alexstar создает новые сессии? johnytsat пишет: Да,я пока без ответа делал,только на получение)И такое ощущение что SocketStartListen,если его не останавливать слушает в течении 15с. Вклинюсь в диалог. HTTP клиент, отправив вам HTTP запрос, ждет адрекватного ответа на него, по всем правилам HTTP. (С кодом завершения и тд). А коль уж вы эмулируете HTTP сервер - вы должны ему этот ответ дать. Иначе он будет ждать его, пока не наступит таймаут. Это легко увидеть в браузере - набрав соответсвующий URL вы будете видеть как он пытается что-то загрузить и потом отваливается по таймауту. Вероятно, тот клиент не шлет следующие запросы, не завершив текущий. (Либо он однопоточный, либо крестроновский сокет не хочет принимать новые соединения.) Принудительный обрыв соединения позволяет избавиться от долгого таймаута, но это, конечно, костыль и для клиента формально означает ошибку (Удаленный хост неожиданно оборвал соединение). Поэтому обязательно ответьте на HTTP запрос минимально необходимым ответом, что-то типа HTTP/1.1 200 OK\x0D\x0A\x0A\x0A (пишу по памяти, примерно)

Paul_T: Минимальный ответ недостаточно. Я вот такой ответ шлю через Serial I/O HTTP/1.1 200 OK\x0d\x0aContent-Length: 30\x0d\x0aContent-Type: text/html\x0d\x0aConnection: keep-alive\x0d\x0a\x0d\x0a{"status":"ok","value":"100"}\x0D\x0A\x0D\x0A Алиса переваривает, задержки в 15 сек нет...

Вячеслав: А почему Content-Length: 30 получился, а не 29 или это рукотворный отредактированный вариант?

Paul_T: Вячеслав пишет: А почему Content-Length: 30 получился, а не 29 или это рукотворный отредактированный вариант? Да, рукотворный вариант. В Content-Lenght кроме основной нагрузки входит 1 символ перевода строки... Как я вычитал (хотя уже не уверен, сейчас перепроверю). Во всяком случае запрос моментально работает в из браузера, Алиса работает корректно, так-же корректно я вижу лог на сайте домовенка Кузи. UPD Лишний \n\r можно в конце не передавать. Content-Lenght сократил до реального значения 29 Кроме того, как оказалосьб достаточно передавать сообщение с таким заголовком: HTTP/1.1 200 OK\x0d\x0aContent-Length: 29\x0d\x0a\x0d\x0a{"status":"ok","value":"100"}\x0d\x0a

Вячеслав: Я вообще после блока json ничего не добавляю, тоже норм. Отправляю правда {"status":"ok","text":""} если ответ не предусмотрен. Наверное, можно и до {"status":"ok"} сократить

Viacheslav Alekseev: Вячеслав пишет: Я вообще после блока json ничего не добавляю, тоже норм. И это правильно, потому что длина контента задается в заголовке Content-Length и никаких дополнительных переводов строки в контенте не нужно. Они нужны чтобы отделить контент от http-запроса или обозначить конец запроса, если контента нет.

olegny: Не совсем так. Это используется при Chunked Encoding как альтернативе фиксированной длине, т.е. Chunked и Content-Length - взаимоисключающие методы.



полная версия страницы