Обзор
Я использую для создания клиента actions-on-google
библиотеку Node.js действие smarthome для типа устройства Garage Door
. Это действие развернуто как облачная функция в GCP. Я могу подтвердить, что до сих пор прекрасно работает следующее:
- Связь бухгалтерского учета с нашим потоком OAuth
- Ответ на намерение синхронизации (т. Е.
onSync()
в клиенте) - Ответ на выполнение намерений (т. Е.
onExecute()
в клиенте)
Проблема
Несмотря на то, что другие обратные вызовы (onSync()
и onExecute()
) работают нормально, мы не видим никаких доказательств того, что onQuery()
вызывается, несмотря ни на что. В Stackdriver не отображаются какие-либо ошибки, и их журналы не создаются в Stackdriver под фильтром «Действия Google».
Мы ожидаем, что onQuery()
запустится, когда мы спросим у Google Assistant такие вещи, как дверь гаража открыта? и дверь Мэтта закрыта?
- Мы попытались удалить
async
, чтобы узнать, зависает ли звонок - Мы пробовали удалить
headers
в лямбде - Мы попытались удалить весь остальной код и выполнить повторное развертывание, чтобы изолировать
onQuery()
Код
В следующем коде показан простой обратный вызов onQuery()
. Код onExecute()
и onSync
был удален для ясности.
'use strict';
const functions = require('firebase-functions');
const {smarthome} = require('actions-on-google');
const app = smarthome({
jwt: require('./XXXXXXXXX-XXXXXXXXXX.json'),
debug: true,
});
//
// Note: Removed onSync() and onExecute() for clarity
//
app.onQuery(async (body, headers) => {
// Expecting to see these logging statements in
// Stackdriver like we do for onExecute() and
// onSync() ... but nothing ever shows up.
console.info('=== onQuery.body', body);
console.info('=== onQuery.headers', headers);
// We have hardcoded the following ID and a "closed"
// state. It matches a valid device ID to the testing
// account we are using.
return {
requestId: body.requestId,
payload: {
devices: {
'2489e4a92799728292b8d5a8b1c9d177': {
on: true,
online: true,
openPercent: 0,
}
}
}
};
});
exports.smarthome = functions.https.onRequest(app);
Мы рассмотрели возможность того, что в JSON, возвращенном при вызове onSync()
, может отсутствовать характеристика или что-то, что мешает ему правильно реагировать на намерение запроса, но мы не смогли идентифицировать что-либо, что могло быть неправильным или отсутствовать. Вот полезная нагрузка JSON, возвращенная onSync()
:
{
"requestId": "ff36a3cc-ec34-11e6-b1a0-64510650abcf",
"payload": {
"agentUserId": "1836.15267389",
"devices": [{
"id": "1234",
"type": "action.devices.types.GARAGE",
"traits": [
"action.devices.traits.OpenClose"
],
"name": {
"defaultNames": ["Smart Garage Door"],
"name": "Matt's Door",
"nicknames": ["Matt's Door"]
},
"willReportState": true,
"attributes": {
"openDirection": [
"UP",
"DOWN"
]
},
"deviceInfo": {
"manufacturer": "ABC Corp",
"model": "test",
"hwVersion": "1.0",
"swVersion": "1.0"
}
}]
}
}
ожидаемый результат
Мы ожидаем, что Google Ассистент ответит «Дверь гаража закрыта» или другим эквивалентом. Вместо этого мы получаем «Извините, я не могу добраться до двери Мэтта прямо сейчас. Повторите попытку».
Garage Door
, он бы сработал? - person Nick Felker   schedule 12.12.2019name
в JSON, возвращенном из намерения синхронизации. В конечном итоге я использовал что-то вроде приведенного ниже кода, и действие начало реагировать на намерения запроса, как я и ожидал. Отвечаю на свой вопрос, если другие столкнутся с этим! - person dziczkzw   schedule 14.12.2019