Google上的操作-如何处理长时间运行的操作

时间:2018-12-30 18:31:03

标签: actions-on-google

我有AoG操作,该操作正在登录到外部后端,一旦登录,它就可以通过外部后端的API控制特定的设备。 Action基本上可以通过 XY手臂区域撤防区域车库等命令来控制家庭警报。在获得警报控制之前,必须先登录,这需要花费相当长的时间(大约20-30秒)。这比AoG实际允许超时的时间长得多。我正在actions.intent.MAIN处理程序中将登录启动为异步操作(即不等待处理程序中的登录结果),而只是告诉用户在几秒钟内告诉命令(撤防/撤防车库等)。我还实现了push notification,效果很好。推送通知的问题在于它只是在手机上弹出而没有任何声音,并且用户必须打开通知并点按它。然后它将触发意图并执行请求的操作。

这并不是真正的良好用户体验(通常,我想在回家时在汽车上使用我的动作,并且有可能无需触摸电话,点击通知等就可以解除家庭警报的防盗功能。)

有什么想法如何以更适当的方式实现它?我真正要感谢的是,如果Google Assistant可以实际上重新启动对话并告诉我类似信息:“嘿,我已经登录到警报服务提供商,您现在要我做什么?”。

对于处理类似问题的任何建议,我将不胜感激。

我正在使用ActionsSDK for Node.JS来构建我的动作。

2 个答案:

答案 0 :(得分:1)

AoG“主动发起对话”的唯一方法是通过推送通知。一段时间或事件发生后,助理无法进行对话。

也许另一种方法是仅在您的操作无法执行较长的事件序列并且触发操作可以调用重试意图时才发送推送通知。除非有这样的假设,否则一切都会很好。

您还可以通知用户,一旦启动该操作,将花费几秒钟的时间来完成该操作,并实施后续意图以处理用户是否询问“是否完成?” 或< em>“进展如何?” 。使其成为检查进度的一部分,但要假设它应该成功。

您可以在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();
});

这将确保您有足够的时间在后台完成任务,而不会阻止对话。

答案 1 :(得分:1)

您已经研究了助手可以发起(或重新发起)对话的方式。动作实际上是为对话而设计的,在对话中暂停30秒会很尴尬。

您还有另一个选择是使用“媒体响应”作为对用户登录的答复(或者作为您的欢迎意图的一部分?尚不完全清楚,但是方法是相同的)。这会让您播放一些“保持音乐”几秒钟。在音乐播放结束时,actions.intent.MEDIA_STATUS将发送到您的操作,您可以使用该操作来确保登录已完成,如果已完成,则可以适当地响应用户。