Перейти к содержанию

Таймеры, несколько команд устройству, TTS (NodeJS): различия между версиями

Материал из Wiki yaboard
Нет описания правки
Нет описания правки
Строка 20: Строка 20:
Нам понадобятся:
Нам понадобятся:
* Сервер/хостинг с поддержкой [https://nodejs.org/ NodeJS], и  
* Сервер/хостинг с поддержкой [https://nodejs.org/ NodeJS], и  
* Этот [https://github.com/subnetsRU/alice-command-skill/blob/master/index.js полезный скрипт].
* Этот [https://github.com/subnetsRU/alice-command-skill/blob/master/index.js полезный скрипт], который является навыком для Алисы.




Наши действия:
Наши действия:
* Создаём обычный приватный диалог;
* Создаём обычный приватный диалог (навык);
* Устанавливаем и запускаем код навыка на сервере/хостинге;
* Устанавливаем и запускаем скрипт alice-command-skill (код навыка) на сервере/хостинге;
* Создаём нужные сценарии умного дома в приложении Яндекс;
* Создаём нужные нам сценарии умного дома в приложении Яндекс;
* Наслаждаемся.
* Наслаждаемся.


Строка 33: Строка 33:




== Установка сценария ==
== Установка скрипта ==




  Выполняем три простых команды (в каждую из строк можно кликнуть мышью и скопировать нужный текст)
  На сервере/хостинге выполняем три простых команды (в каждую из строк можно кликнуть мышью и скопировать нужный текст)


* <span class="tocopy">git clone <nowiki>https://github.com/subnetsRU/alice-command-skill.git</nowiki></span>
* <span class="tocopy">git clone <nowiki>https://github.com/subnetsRU/alice-command-skill.git</nowiki></span>
Строка 43: Строка 43:




Можно переходить к настройке.
Можно переходить к настройке. Правке файла с настройками - config.js.




Строка 54: Строка 54:
[[Файл:User id.png|200px|thumb|User ID (пример)]]
[[Файл:User id.png|200px|thumb|User ID (пример)]]


  Если вы пользуетесь браузером Chrome, то для удобства чтения JSON на страницах можно использовать плагин
  Если вы пользуетесь браузером Chrome, то для удобства чтения JSON (''вам это понадобится, будет присутствовать ниже'') на страницах можно использовать плагин
  [https://chrome.google.com/webstore/detail/json-formatter/bcjindcccaagfpapjjmafapmmgkkhgoa/related?hl=ru JSON Formatter]
  [https://chrome.google.com/webstore/detail/json-formatter/bcjindcccaagfpapjjmafapmmgkkhgoa/related?hl=ru JSON Formatter]. Если у вас другой браузер, то вы можете найти похожий плагин и для него.


Создаём свой навык в [https://dialogs.yandex.ru/developer dialogs.yandex.ru] ([https://yandex.ru/dev/dialogs/alice/doc/protocol-docpage/ документация]):
Создаём свой навык в [https://dialogs.yandex.ru/developer dialogs.yandex.ru] ([https://yandex.ru/dev/dialogs/alice/doc/protocol-docpage/ документация]):
# Задаём имя навыка (как будем к нему обращаться);
# Задаём имя навыка (как будем к нему обращаться);
# В ''Webhook URL'' - имя домена или IP-адрес, где расположен скрипт ''alice-command-skill'', и порт (указан в объекте ''config'', по умолчанию 8443);
# В ''Webhook URL'' - имя домена или IP-адрес, где расположен скрипт ''alice-command-skill'', и порт (указан в ''config.js'', по умолчанию 8443);
# Указываем, что навык приватный!
# Указываем, что навык приватный!
# Заполняем остальные обязательные поля;
# Заполняем остальные обязательные поля;
Строка 97: Строка 97:
</pre>
</pre>


Их вы сможете узнать когда выполните своё первое обращение к навыку. Будет отображено в консоли (где вы запустили навык) в ''incoming JSON'', который отображает весь пришедший в навык запрос.
Их вы сможете узнать когда выполните своё первое обращение к навыку. Будет отображено в консоли (где вы запустили навык) в ''incoming JSON'', который отображает весь пришедший в навык запрос от Яндекс.Диалогов, где:


* '''user.user_id''' - '''идентификатор пользователя''' Яндекса, единый для всех приложений и устройств. Присутствует только, когда вы выполнили вход в аккаунт Яндекс на устройстве. Никогда не изменяется.
* '''user.user_id''' - '''идентификатор пользователя''' Яндекса, единый для всех приложений и устройств пользователя. Присутствует только, когда пользователь выполнил вход в аккаунт '''Яндекс''' на устройстве. Никогда не изменяется.
* '''application.application_id''' - '''идентификатор экземпляра приложения''', в котором пользователь общается с Алисой. Присутствует всегда, но может изменяться (например, если переустановите приложение).
* '''application.application_id''' - '''идентификатор экземпляра приложения''', в котором пользователь общается с Алисой. Присутствует всегда, но может изменяться (например, если переустановите приложение).


Если вы хотите дать возможность управления нескольким устройствам, то их можно перечислить через запятую. Пример:
Поясню по user_id и application.
 
Ситуация 1:
* берём смартфон
* открываем приложение/браузер яндекс
* обращаемся к Алисе: "Алиса, попроси дом вируса помощь"
В этой ситуации в ''incoming JSON'' вы увидите наличие только <b class="green">application.application_id</b>, а <b class="red">user.user_id</b> будет отсутствовать
 
Ситуация 2:
* берём смартфон
* открываем приложение/браузер яндекс
* '''авторизуемся в приложении/браузере яндекс -> [https://passport.yandex.ru/ passport.yandex.ru]'''
* обращаемся к Алисе: "Алиса, попроси дом вируса помощь"
* в ''incoming JSON'' вы увидите наличие <b class="green">application.application_id</b> и <b class="green">user.user_id</b>
 
Если вы хотите дать возможность управления нескольким устройствам/пользователям, то их можно перечислить через запятую. Пример:
<pre>
<pre>
     auth:{
     auth:{
Строка 137: Строка 152:
[[Файл:S3.jpg|мини|без|Результирующий сценарий, который выполнит два сценария|150px]]
[[Файл:S3.jpg|мини|без|Результирующий сценарий, который выполнит два сценария|150px]]


Открываем страницу с [https://iot.quasar.yandex.ru/m/user/scenarios JSON по сценариям] находим ID сценариев с включением лампы и люстры и вносим их в config.
Открываем страницу с [https://iot.quasar.yandex.ru/m/user/scenarios JSON по сценариям] находим ID созданных сценариев "''Включи люстру''" и "''Включи лампу''" с включением лампы и люстры и вносим их в config.js в scenarios -> enable.
Где этот ID показано на скриншоте ниже:
Где этот ID показано на скриншоте ниже:
[[Файл:Scenarion json id.png|мини|без]]
[[Файл:Scenarion json id.png|мини|без]]


Аналогично вы можете поступить и со сценариями для выключения.
Аналогично вы можете поступить и со сценариями для выключения, создав сценарии "''Выключи люстру''" и "''Выключи лампу''", а затем добавить их в config.js в scenarios -> disable.


<pre>
<pre>
Строка 155: Строка 170:
     },
     },
</pre>
</pre>
Вы можете комбинировать, создав сценарии:
# Выключи люстру и включи лампу
# Включи люстру и выключи лампу


Теперь запустите навык:
Теперь запустите навык:
Строка 165: Строка 176:
</pre>
</pre>


И пользуйтесь.
И пользуйтесь. Исходя из приведенного примера когда вы скажете Алисе "''Включай люстру и лампу''" навык запустит два сценария "''Включи люстру''" и "''Включи лампу''", что, в свою очередь, приведет к включению устройств "люстра" и "лампа" в вашем Умном Доме.


Далее Вы можете комбинировать, создав сценарии, например:
# Выключи люстру и включи лампу
# Включи люстру и выключи лампу


== Послесловие ==
== Послесловие ==
Строка 172: Строка 186:


Видеодемонстрация работы навыка:
Видеодемонстрация работы навыка:
[[Файл:Text_morecommand_tts_nodeJS.mp4]]
[[Файл:Text_morecommand_tts_nodeJS.mp4]]
После внесения изменений в настройки (в файле config.js) необходимо перезапускать скрипт.


С автором статьи можно связаться в телеграм: [https://t.me/VirusNet @VirusNet].
С автором статьи можно связаться в телеграм: [https://t.me/VirusNet @VirusNet].

Версия от 14:00, 3 июля 2020

Требуются прямые руки И вдумчивое отношение к инструкции
Мы не несём никакой ответственности за правильное или неправильное применение, или неприменение, и/или неспособность применить данное руководство.
Телефон вызова экстренных служб - 112.

Постановка задачи

По мотивам статьи Алиса, таймеры, TTS и Node-RED, идея работы навыка взята здесь. По предлагаемой инструкции точно так же можно выполнять несколько команд на устройство в одном сценарии, запускать их по таймеру, не требуя Node-RED.

Дополнительный плюс - можно выполнять сложные команды. Примеры:

  • Включи люстру и телевизор
  • Выключи люстру и включи телевизор
  • Включи аквариум и телевизор и выключи люстру


Нам понадобятся:


Наши действия:

  • Создаём обычный приватный диалог (навык);
  • Устанавливаем и запускаем скрипт alice-command-skill (код навыка) на сервере/хостинге;
  • Создаём нужные нам сценарии умного дома в приложении Яндекс;
  • Наслаждаемся.
Таймеров на данный момент нет, они будут добавлены позднее. Работа над навыком не закончена. Следите за обновлениями на github.

Установка скрипта

На сервере/хостинге выполняем три простых команды (в каждую из строк можно кликнуть мышью и скопировать нужный текст)
  • git clone https://github.com/subnetsRU/alice-command-skill.git
  • cd alice-command-skill
  • npm install


Можно переходить к настройке. Правке файла с настройками - config.js.

Настройка

Создаём навык
Консоль браузера и куки
ID Яндекс.Станции (пример)
User ID (пример)
Если вы пользуетесь браузером Chrome, то для удобства чтения JSON (вам это понадобится, будет присутствовать ниже) на страницах можно использовать плагин
JSON Formatter. Если у вас другой браузер, то вы можете найти похожий плагин и для него.

Создаём свой навык в dialogs.yandex.ru (документация):

  1. Задаём имя навыка (как будем к нему обращаться);
  2. В Webhook URL - имя домена или IP-адрес, где расположен скрипт alice-command-skill, и порт (указан в config.js, по умолчанию 8443);
  3. Указываем, что навык приватный!
  4. Заполняем остальные обязательные поля;
  5. Отправляем навык на модерацию, ждём размещения в каталоге (вам придёт письмо-оповещение).
  • Добавляем необходимую информацию в config.js;
  • Указываем путь до SSL сертификата и его ключа:

ssl: {
  crt: '/path/to/ssl.crt', //путь до файла с SSL сертификатом
  key: '/path/to/ssl.key', //путь до файла с ключом от SSL сертификата
},

Допускается самоподписанный сертификат (на момент написания статьи проверка валидности SSL сертификата со стороны Яндекса производится только для навыков Умного Дома, или если навык использует авторизацию).
Валидный сертификат можно бесплатно получить на sslforfree или letsencrypt.
  • Указываем порт, на котором будут ожидаться запросы от яндекс диалогов и который мы указали в Webhook URL, например: port: 8443,
  • Значение параметра "cookie" можно взять так:
    • Открываем консоль браузера (F12, вкладка "Network")
    • Заходим, к примеру, в квазар
    • Щёлкаем на запрос в консоли
    • Копируем из Request Headers часть строки после "Cookie":
cookie: 'yandexuid=XXXXXXXXXXXXXXXXXX;uniqueuid=YYYYYYYYYYYYYYYYYYY;ну и так далее...',
  • Находим идентификатор Яндекс.Станции, которая будет отвечать на команды. Этот ID можно увидеть на странице с устройствами.
  • Укажем наш id в config (это только пример! У вас будет другое значение):
speaker: '2077cfa6-2365-4ed4-97d5-4b46895762af',


Осталось задать, каким устройствам/пользователям разрешено использовать наш навык:

    auth:{
         user_id: ['BBD3793D182F7C1842F0F1B99B9FE39DFA3E26557C99B7CDE2CAE116A3170301'],
         application: ['BBD3793D182F7C1842F0F1B99B9FE39DFA3E26557C99B7CDE2CAE116A3170301'],
    },

Их вы сможете узнать когда выполните своё первое обращение к навыку. Будет отображено в консоли (где вы запустили навык) в incoming JSON, который отображает весь пришедший в навык запрос от Яндекс.Диалогов, где:

  • user.user_id - идентификатор пользователя Яндекса, единый для всех приложений и устройств пользователя. Присутствует только, когда пользователь выполнил вход в аккаунт Яндекс на устройстве. Никогда не изменяется.
  • application.application_id - идентификатор экземпляра приложения, в котором пользователь общается с Алисой. Присутствует всегда, но может изменяться (например, если переустановите приложение).

Поясню по user_id и application.

Ситуация 1:

  • берём смартфон
  • открываем приложение/браузер яндекс
  • обращаемся к Алисе: "Алиса, попроси дом вируса помощь"

В этой ситуации в incoming JSON вы увидите наличие только application.application_id, а user.user_id будет отсутствовать

Ситуация 2:

  • берём смартфон
  • открываем приложение/браузер яндекс
  • авторизуемся в приложении/браузере яндекс -> passport.yandex.ru
  • обращаемся к Алисе: "Алиса, попроси дом вируса помощь"
  • в incoming JSON вы увидите наличие application.application_id и user.user_id

Если вы хотите дать возможность управления нескольким устройствам/пользователям, то их можно перечислить через запятую. Пример:

    auth:{
         user_id: ['BBD3793D182F7C1842F0F1B99B9FE39DFA3E26557C99B7CDE2CAE116A3170301','28D27CB412CAA0AB39DDBD9A6974BE2BCD75362DEFC9C7DE92799D8825EA5399'],
         application: ['BBD3793D182F7C1842F0F1B99B9FE39DFA3E26557C99B7CDE2CAE116A3170301','8E73021EA84D8432C264A6D75C30F2A654C22D3FCEB22D8BAAD30A807110FD0E'],
    },

Задайте интенты (слова на которые будет реагировать навык).

  • help - фразы для воспроизведения фраз команды "помощь".
  • enable - слова, которые будут означать команду для сценариев включения
  • disable - слова, которые будут означать команду для сценариев выключения
    intents: {
        help: ['справка', 'помощь', 'что ты умеешь'],
        enable: ['включи','включить'],
        disable: ['выключи','выключить']
    },

Ну а теперь создадим сами сценарии, которые мы и собираемся выполнять. Сделать это можно как в приложении Яндекса (Android, IOS), так и в web-интерфейсе квазара.

Покажу на одном примере. Создаем сценарий на включение люстры:

Сценарий включения люстры

По образу и подобию люстры создаём такой же сценарий, но для лампы.

Создаем сценарий для выполнения двух сценариев:

Результирующий сценарий, который выполнит два сценария

Открываем страницу с JSON по сценариям находим ID созданных сценариев "Включи люстру" и "Включи лампу" с включением лампы и люстры и вносим их в config.js в scenarios -> enable. Где этот ID показано на скриншоте ниже:

Аналогично вы можете поступить и со сценариями для выключения, создав сценарии "Выключи люстру" и "Выключи лампу", а затем добавить их в config.js в scenarios -> disable.

    scenarios: {
        enable: {       //сценарии на включение
            'люстру': '49c84e35-d1f3-4f8b-bc26-fe1ddd383d3f',   //сценарий: включи люстру
            'лампу': '0f70f28e-6b09-4876-8846-d34449dddc9e',    //сценарий: включи лампу
        },
        disable:{       //сценарии на выключение
            'люстру': '1e3d27e6-1731-4461-bbe0-e3ed75e41ed5',   //сценарий: выключи люстру
            'лампу': '212bc2b7-57db-4f79-a896-aff933b0e433',    //сценарий: выключи лампу
        }
    },

Теперь запустите навык:

# npm start

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

Далее Вы можете комбинировать, создав сценарии, например:

  1. Выключи люстру и включи лампу
  2. Включи люстру и выключи лампу

Послесловие

Видеодемонстрация работы навыка:

После внесения изменений в настройки (в файле config.js) необходимо перезапускать скрипт.

С автором статьи можно связаться в телеграм: @VirusNet.