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

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

Материал из Wiki yaboard
Нет описания правки
Нет описания правки
Строка 12: Строка 12:
По мотивам статьи [[Алиса, таймеры, TTS и Node-RED]], идея работы навыка взята [https://flows.nodered.org/node/node-red-contrib-yandex-alice-command здесь]. По предлагаемой инструкции точно так же можно выполнять несколько команд на устройство в одном сценарии, запускать их по таймеру, не требуя Node-RED.
По мотивам статьи [[Алиса, таймеры, TTS и Node-RED]], идея работы навыка взята [https://flows.nodered.org/node/node-red-contrib-yandex-alice-command здесь]. По предлагаемой инструкции точно так же можно выполнять несколько команд на устройство в одном сценарии, запускать их по таймеру, не требуя Node-RED.


Дополнительным плюсом можно выполнять сложные команды. Примеры:
Дополнительный плюс - можно выполнять сложные команды. Примеры:
* Включи люстру '''и''' телевизор
* Включи люстру '''и''' телевизор
* Выключи люстру '''и''' включи телевизор
* Выключи люстру '''и''' включи телевизор
Строка 36: Строка 36:




<pre>
Выполняем три простых команды (в каждую из строк можно кликнуть мышью и скопировать нужный текст)
# git clone https://github.com/subnetsRU/alice-command-skill.git
 
# cd alice-command-skill
* <span class="tocopy">git clone <nowiki>https://github.com/subnetsRU/alice-command-skill.git</nowiki></span>
# npm install
* <span class="tocopy">cd alice-command-skill</span>
</pre>
* <span class="tocopy">npm install</span>
 
 
Можно переходить к настройке.




Строка 50: Строка 53:


Создаём свой навык в [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'', по умолчанию 8443);
# указываем приватность навыка
# Указываем, что навык приватный!
# заполняем остальные обязательные поля
# Заполняем остальные обязательные поля;
# после чего отправляем навык на модерацию и ждём размещения в каталоге ''(вам придёт письмо когда это произойдёт)''.
# Отправляем навык на модерацию, ждём размещения в каталоге (вам придёт письмо-оповещение).
[[Файл:Create skill.png.png|мини|без]]
 
[[Файл:Create skill.png.png|thumb]]
 
* Добавляем необходимую информацию в config.js;
* Указываем путь до SSL сертификата и его ключа:
<p class="tocopy"><br>ssl: {
<br> &nbsp;&nbsp;crt: '/path/to/ssl.crt',                //путь до файла с SSL сертификатом
<br> &nbsp;&nbsp;key: '/path/to/ssl.key',                //путь до файла с ключом от SSL сертификата
<br>},
</p>
 
Допускается самоподписанный сертификат ''(на момент написания статьи проверка валидности SSL сертификата со стороны Яндекса производится только для навыков Умного Дома, или если навык использует авторизацию)''.
Валидный сертификат можно бесплатно получить на [https://www.sslforfree.com/ sslforfree] или [https://letsencrypt.org/ru/ letsencrypt].
 
 
* Указываем порт, на котором будут ожидаться запросы от яндекс диалогов и который мы указали в ''Webhook URL'', например: <span class="tocopy">port: 8443,</span>


Отредактируйте config.js и добавьте необходимую информацию.
* Значение параметра "cookie" можно взять так:
Указываем путь до SSL сертификата и его ключа.
** Открываем консоль браузера (F12, вкладка "Network")
Сертификат можно сделать самоподписанным ''(на момент написания статьи проверка валидности SSL сертификата со стороны Яндекса производится только для навыков Умного Дома, а так же если в навыке используется авторизация)''. Валидный сертификат можно бесплатно получить на [https://www.sslforfree.com/ sslforfree] или [https://letsencrypt.org/ru/ letsencrypt].
** Заходим, к примеру, в [https://iot.quasar.yandex.ru/m/user/devices квазар]
<pre>
** Щёлкаем на запрос в консоли
ssl: {
** Копируем из Request Headers часть строки после "Cookie".
        crt: '/path/to/ssl.crt',                //путь до файла с SSL сертификатом
 
        key: '/path/to/ssl.key',                //путь до файла с ключом от SSL сертификата
[[Файл:Консоль браузера и куки.png|thumb]]
    },
</pre>


Указываем порт, на котором будут ожидаться запросы от яндекс диалогов и который мы указали в ''Webhook URL'' при [https://dialogs.yandex.ru/developer создании навыка].
cookie: 'yandexuid=XXXXXXXXXXXXXXXXXX;uniqueuid=YYYYYYYYYYYYYYYYYYY;ну и так далее...',
<pre>
port: 8443,
</pre>


Значение для параметра "cookie":
* Находим идентификатор Яндекс.Станции, которая будет отвечать на команды. Этот ID можно увидеть на [https://iot.quasar.yandex.ru/m/user/devices странице с устройствами].
Его можно получить открыв консоль браузера (F12, там вкладка network) и зайти на, например, https://iot.quasar.yandex.ru/m/user/devices
после чего тыкнуть в консоли на запрос и скопировать то, что будет в Request Headers после "Cookie".
[[Файл:Консоль браузера и куки.png|без]]
<pre>
cookie: 'yandexuid=XXXXXXXXXXXXXXXXXX;uniqueuid=YYYYYYYYYYYYYYYYYYY;ну и так далее...',
</pre>


Находим id устройства яндекс.станция, которая будет отвечать на команды. Этот ID можно увидеть на [https://iot.quasar.yandex.ru/m/user/devices странице с устройствами].
[[Файл:Yandex station id.png|мини|без|ID яндекс.станции]]
[[Файл:Yandex station id.png|мини|без|ID яндекс.станции]]


Укажем id устройства яндекс.станция в ''config'':
* Укажем наш id в ''config'' (это только пример! У вас будет другое значение):
<pre>
speaker: '2077cfa6-2365-4ed4-97d5-4b46895762af',
speaker: '2077cfa6-2365-4ed4-97d5-4b46895762af',
</pre>


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


Осталось задать, каким устройствам/пользователям разрешено использовать наш навык:
<pre>
<pre>
     auth:{
     auth:{
Строка 96: Строка 100:
     },
     },
</pre>
</pre>
Их вы сможете узнать когда выполните своё первое обращение к навыку. Будет отображено в консоли (где вы запустили навык) в ''incoming JSON'', который отображает весь пришедший в навык запрос.
Их вы сможете узнать когда выполните своё первое обращение к навыку. Будет отображено в консоли (где вы запустили навык) в ''incoming JSON'', который отображает весь пришедший в навык запрос.
[[Файл:User id.png|мини|без]]
[[Файл:User id.png|мини|без]]


Строка 115: Строка 121:
* enable - слова, которые будут означать команду для сценариев включения
* enable - слова, которые будут означать команду для сценариев включения
* disable - слова, которые будут означать команду для сценариев выключения
* disable - слова, которые будут означать команду для сценариев выключения
<pre>
<pre>
     intents: {
     intents: {

Версия от 12:05, 3 июля 2020

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

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

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

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

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


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


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

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

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

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


Можно переходить к настройке.

Настройка

Если вы пользуетесь браузером Chrome, то для удобства чтения JSON на страницах можно использовать плагин
JSON Formatter

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

  1. Задаём имя навыка (как будем к нему обращаться);
  2. В Webhook URL - имя домена или IP-адрес, где расположен скрипт alice-command-skill, и порт (указан в объекте config, по умолчанию 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 яндекс.станции
  • Укажем наш id в config (это только пример! У вас будет другое значение):
speaker: '2077cfa6-2365-4ed4-97d5-4b46895762af',


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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Аналогично вы можете поступить и со сценариями для выключения.

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

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

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

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

# npm start

И пользуйтесь.

Послесловие

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

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