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




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