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

Таймеры, несколько команд устройству, TTS (NodeJS)

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

!!! ЭТО ЧЕРНОВИК !!!

Описание

По мотивам статьи Алиса, таймеры, TTS и Node-RED, идея взята оттуда.

Можно получить возможность выполнить несколько сценариев за одну команду, а так же выполнять сценарии по таймеру, но при этом node-red уже не нужен.

Пример команд:

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

Для реализации этого вам понадобятся сервер/хостинг с поддержкой NodeJS и этот скрипт.

Таймеров на данный момент нет и они будут добавлены позднее.

Схема работы:

Установка

# git clone https://github.com/subnetsRU/alice-command-skill.git
# cd alice-command-skill
# npm install

Настройка

Создаём свой навык в dialogs.yandex.ru
  1. Задаём имя навыка, то как мы будем к нему обращаться.
  2. в Webhook URL нужно задать имя домена или IP-адрес где расположен скрипт alice-command-skill, а так же указать порт (указан в объект config, по умолчанию это порт 8443)
  3. указываем приватность навыка
  4. заполняем остальные обязательные поля
  5. после чего отправляем навык на модерацию и ждём размещения в каталоге (вам придёт письмо когда это произойдёт).
Отредактируйте index.js и добавьте необходимую информацию в объект config

Указываем путь до SSL сертификата и его ключа. Сертификат можно сделать самоподписанным (на момент написания статьи проверка валидности SSL сертификата со стороны Яндекса производится только для навыков Умного Дома, а так же если в навыке используется авторизация). Валидный сертификат можно бесплатно получить на sslforfree или letsencrypt.

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

Указываем порт, на котором будут ожидаться запросы от яндекс диалогов и который мы указали в Webhook URL при создании навыка.

port: 8443,

Значение для параметра "cookie": Его можно получить открыв консоль браузера (F12, там вкладка network) и зайти на, например, https://iot.quasar.yandex.ru/m/user/devices после чего тыкнуть в консоли на запрос и скопировать то, что будет в Request Headers после "Cookie".

cookie: 'yandexuid=XXXXXXXXXXXXXXXXXX;uniqueuid=YYYYYYYYYYYYYYYYYYY;ну и так далее...',

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

    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

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

Послесловие

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

Есть ещё способ выполнить несколько сценариев - читайте "Несколько команд в одном сценарии".

Автор статьи: @VirusNet