Таймеры, несколько команд устройству, TTS (NodeJS)
Телефон вызова экстренных служб - 112.
Постановка задачи
По мотивам статьи Алиса, таймеры, TTS и Node-RED, идея работы навыка взята здесь. По предлагаемой инструкции точно так же можно выполнять несколько команд на устройство в одном сценарии, запускать их по таймеру, не требуя Node-RED.
Дополнительный плюс - можно выполнять сложные команды. Примеры:
- Включи люстру и телевизор
- Выключи люстру и включи телевизор
- Включи аквариум и телевизор и выключи люстру
Нам понадобятся:
- Сервер/хостинг с поддержкой NodeJS, и
- Этот полезный скрипт.
Наши действия:
- Создаём обычный приватный диалог;
- Устанавливаем и запускаем код навыка на сервере/хостинге;
- Создаём нужные сценарии умного дома в приложении Яндекс;
- Наслаждаемся.
Таймеров на данный момент нет, они будут добавлены позднее. Работа над навыком не закончена. Следите за обновлениями на github.
Установка сценария
Выполняем три простых команды (в каждую из строк можно кликнуть мышью и скопировать нужный текст)
- git clone https://github.com/subnetsRU/alice-command-skill.git
- cd alice-command-skill
- npm install
Можно переходить к настройке.
Настройка



Если вы пользуетесь браузером Chrome, то для удобства чтения JSON на страницах можно использовать плагин JSON Formatter
Создаём свой навык в dialogs.yandex.ru (документация):
- Задаём имя навыка (как будем к нему обращаться);
- В Webhook URL - имя домена или IP-адрес, где расположен скрипт alice-command-skill, и порт (указан в объекте config, по умолчанию 8443);
- Указываем, что навык приватный!
- Заполняем остальные обязательные поля;
- Отправляем навык на модерацию, ждём размещения в каталоге (вам придёт письмо-оповещение).
- Добавляем необходимую информацию в 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 - Идентификатор экземпляра приложения, в котором пользователь общается с Алисой. Присутствует всегда, но может изменяться (например если вы переустановите приложение).
Если вы хотите дать возможность управления нескольким устройствам, то их можно перечислить через запятую. Пример:
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', //сценарий: выключи лампу
}
},
Вы можете комбинировать, создав сценарии:
- Выключи люстру и включи лампу
- Включи люстру и выключи лампу
Теперь запустите навык:
# npm start
И пользуйтесь.
Послесловие
Видеодемонстрация работы навыка:
С автором статьи можно связаться в телеграм: @VirusNet.