Не видеть обратный вызов onQuery, запущенный в действиях NodeJS-on-google

Обзор

Я использую для создания клиента 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 Ассистент ответит «Дверь гаража закрыта» или другим эквивалентом. Вместо этого мы получаем «Извините, я не могу добраться до двери Мэтта прямо сейчас. Повторите попытку».


person dziczkzw    schedule 11.12.2019    source источник
comment
Это потенциально проблема с именованием? Если бы у него был общий псевдоним типа Garage Door, он бы сработал?   -  person Nick Felker    schedule 12.12.2019
comment
@NickFelker - это определенно проблема с name в JSON, возвращенном из намерения синхронизации. В конечном итоге я использовал что-то вроде приведенного ниже кода, и действие начало реагировать на намерения запроса, как я и ожидал. Отвечаю на свой вопрос, если другие столкнутся с этим!   -  person dziczkzw    schedule 14.12.2019
comment
Ох ... и спасибо @NickFelker за указание на мою ошибку. :) Очень признателен.   -  person dziczkzw    schedule 14.12.2019


Ответы (1)


Отвечая на мой собственный вопрос здесь, если у кого-то еще есть эта проблема. Причина, по которой мое действие обрабатывала намерения SYNC и EXECUTE, но не намерение QUERY, сводилась к тому, какие имена по умолчанию / имена пользователей я назначил каждому устройству в ответе SYNC.

В конце концов, я начал использовать следующее, и мое действие снова начало отвечать на намерения QUERY, как и ожидалось:

...

name: {
  defaultNames: ['Garage Door'],
  name: door.name,
  nicknames: [door.name, 'Garage Door']
},

...

где door.name - это имя, которое задает пользователь и возвращается при вызове API.

person dziczkzw    schedule 14.12.2019