действия на Google - как обрабатывать длительные операции - PullRequest
0 голосов
/ 30 декабря 2018

У меня есть действие AoG, которое выполняет вход во внешний бэкэнд и после входа в него может управлять конкретным устройством через API внешнего бэкэнда.Действие в основном контролирует домашнюю тревогу с помощью таких команд, как секция охраны XY , секция снятия с охраны гараж и т. Д. Прежде чем получить контроль над сигнализацией, необходимо войти в систему, что занимает значительное время (прибл. 20-30 секунд).Это намного дольше, чем позволяет AoG, что приводит к тайм-аутам.Я инициирую вход в систему как асинхронную операцию в обработчике actions.intent.MAIN (т. Е. Не ожидаю результата входа в обработчик) и просто говорю пользователю сообщить команду (постановка / снятие с охраны и т. Д.) В течение нескольких секунд.Я также реализовал push-уведомление , которое работает нормально.Проблема с push-уведомлениями заключается в том, что он просто выскакивает на мобильный телефон без звука, и пользователю приходится открывать уведомления и нажимать на него.Тогда это вызовет намерение и сделает запрошенное действие.

Это не очень хороший пользовательский опыт (обычно я хотел бы использовать свои действия в машине, когда возвращаюсь домой и имею возможность отключить домашнюю сигнализацию без необходимости прикасаться к телефону, нажимать на уведомления и т. Д.).

Есть идеи, как реализовать это более правильно?Я был бы очень признателен, если бы помощник Google мог на самом деле возобновить разговор и сказать мне что-то вроде: «эй, я уже вошел в систему поставщика услуг сигнализации, что вы хотите, чтобы я сделал сейчас?».

Буду благодарен за любые советы, связанные с подобной проблемой.

Я использую ActionsSDK для Node.JS для построения своего действия.

Ответы [ 2 ]

0 голосов
/ 02 января 2019

Вы уже рассмотрели способы, которыми помощник может инициировать (или заново инициировать) разговор.Действия действительно предназначены для чего-то, что является диалоговым, и 30-секундная пауза в разговоре была бы неудобной.

Еще один вариант, который у вас есть, - это использовать Media Response как часть вашего ответа для пользователя, вошедшего в систему (или как часть вашего желанного намерения? Не совсем ясно, но подход будет таким же).Это позволило бы вам поиграть в «несколько секунд».По окончании воспроизведения музыки вашему действию будет отправлено actions.intent.MEDIA_STATUS, которое вы можете использовать, чтобы убедиться, что вход в систему завершен, и, если это так, правильно ответить пользователю.

0 голосов
/ 02 января 2019

Единственный способ для AoG "взять на себя инициативу начала разговора" - это через push-уведомления.Помощник не может начать разговор через какое-то время или когда происходит событие.

Возможно, другим способом может быть отправка push-уведомления, только если ваше действие не выполнит длинную последовательностьсобытий и запускающее действие может вызвать намерение повторить попытку.Предполагалось бы, что все будет хорошо, если не будет сказано.

Вы также можете уведомить пользователя, что для завершения действия потребуется несколько секунд после его запуска, и реализовать намерения последующих действий, которые обрабатываются, если пользователь спрашивает «Это сделано?» или «Как дела?» .Включение этого процесса в процесс проверки прогресса, но при условии, что он должен быть успешным.

Вы можете легко сместить длительный фоновый процесс, реализовав очередь задач в Firebase, где ваше намерение - создать дочерний элементаналогично этому.

firebase.database().ref("tasks").push({action: "disarm_garage"});

И затем вы создаете триггер облачной функции для его обработки

functions.database.ref('tasks/{id}').onCreate((snap) => {
    const action = snap.val().action;
    switch (action) {
        case 'disarm_garage':
            // ...
            break;
    }

    // Remove the task after processing
    return snap.ref.remove();
});

Это обеспечит вам достаточно времени для выполнения задачи в фоновом режиме, не блокируяразговор.

...