1. Прежде чем начать
Как разработчик решений для Интернета вещей (IoT), вы можете создавать интеграции между облачными сервисами , которые позволят вашим пользователям управлять своими устройствами с помощью сенсорного управления в приложении Google Home и голосовых команд с помощью Google Assistant.

Освоение инструментов отладки для интеграций между облачными сервисами — важный шаг на пути к созданию высококачественной интеграции с Google Assistant. Для упрощения мониторинга и отладки доступны инструменты Google Cloud Platform (GCP) Metrics and Logging and Test Suite для умного дома, которые помогут вам выявлять и устранять проблемы в ваших интеграциях.
Предварительные требования
- Ознакомьтесь с руководством разработчика по созданию интеграции между облачными сервисами.
- Запустите практическое занятие по подключению устройств умного дома к Google Assistant .
Что вы построите
В этом практическом задании вы развернете интеграцию «облако-облако» с двумя ошибками и подключите ее к Google Ассистенту, а затем отладите ошибки интеграции с помощью набора тестов для умного дома и метрик и логирования Google Cloud Platform (GCP).
Что вы узнаете
- Как использовать метрики и логирование GCP для выявления и устранения проблем в производственной среде.
- Как использовать набор тестов для умного дома, чтобы выявить функциональные проблемы и проблемы с API.
Что вам понадобится
- Веб-браузер, например, Google Chrome.
- Устройство iOS или Android с установленным приложением Google Home .
- Node.js версии 10.16 или более поздней.
- Платежный аккаунт Google Cloud
2. Запустите неисправное приложение.
Получите исходный код
Чтобы загрузить пример этого практического задания на свой компьютер, перейдите по следующей ссылке:
...или вы можете клонировать репозиторий GitHub из командной строки:
$ git clone https://github.com/google-home/smarthome-debug.git
О проекте
Приложение для стиральной машины содержит следующие подкаталоги:
-
public: Интерфейс пользователя для удобного управления и мониторинга состояния умной стиральной машины. -
functions: Полностью реализованный облачный сервис, управляющий интеллектуальной стиральной машиной с помощью Cloud Functions for Firebase и Firebase Realtime Database.
Подключитесь к Firebase
Откройте терминал на своей машине разработчика. Перейдите в каталог washer-faulty , затем настройте Firebase CLI с вашим проектом интеграции, созданным в рамках мастер-класса «Подключение устройств умного дома к Google Assistant» :
$ cd washer-faulty $ firebase use <firebase-project-id>
Развернуть в Firebase
Перейдите в папку functions и установите все необходимые зависимости с помощью npm.
$ cd functions $ npm install
Примечание: Если вы видите сообщение ниже, можете проигнорировать его и продолжить. Предупреждение связано с некоторыми устаревшими зависимостями, более подробную информацию можно найти здесь .
found 5 high severity vulnerabilities run `npm audit fix` to fix them, or `npm audit` for details
Теперь, когда вы установили зависимости и настроили свой проект, вы готовы развернуть неисправное приложение стиральной машины.
$ firebase deploy
Вот что вы должны увидеть в консоли:
... ✔ Deploy complete! Project Console: https://console.firebase.google.com/project/<Firebase-project-id>/overview Hosting URL: https://<Firebase-project-id>.firebaseapp.com
Обновить HomeGraph
Откройте URL-адрес хостинга в браузере ( https://<firebase-project-id>.firebaseapp.com ), чтобы просмотреть веб-приложение. В веб-интерфейсе нажмите кнопку «Обновить».
Кнопка для обновления HomeGraph с использованием последних метаданных устройства из неисправного приложения стиральной машины с помощью функции Request Sync .

Откройте приложение Google Home и убедитесь, что вы видите устройство стиральной машины с названием "Неисправная стиральная машина" .

3. Протестируйте интеграцию.
После развертывания проекта проверьте, что ваша интеграция управляет стиральной машиной.
Проверьте стиральную машину
Проверьте изменение значения при выполнении любой из следующих голосовых команд с помощью телефона:
«Эй, Google, включи мою стиральную машину».
«Эй, Google, запусти мою стиральную машину».
«Эй, Google, поставь мою стиральную машину на паузу».
«Эй, Google, возобнови работу моей стиральной машины».
«Эй, Google, останови мою стиральную машину».
Вы заметите, что голосовой помощник сообщает о проблеме, когда вы ставите стиральную машину на паузу/возобновляете её работу:
«Извините, мне не удалось связаться с <имя проекта>».
Для устранения этой проблемы вам сначала потребуется больше информации об ошибке, чтобы сузить круг поиска и определить первопричину.
Панель аналитики умного дома
Для проверки ошибок хорошо подойдет панель мониторинга Smarthome Analytics , которая объединяет графики использования и показателей состояния вашей облачной инфраструктуры:
- Показатели использования отражают тенденции использования вашей облачной интеграции, включая количество ежедневно активных пользователей и общее количество запросов на выполнение.
- Показатели работоспособности помогают отслеживать возникновение аномалий в вашей облачной интеграции, включая задержку запросов, процент успешных запросов и анализ ошибок.
Чтобы определить причину ошибки, выполните следующие действия для доступа к панели управления проектом.
- В консоли разработчика перейдите на страницу «Проекты».
- Выберите свой проект «умного дома».
- В левом меню нажмите вкладку «Аналитика» .

- Это приведет вас к списку панелей мониторинга для вашего проекта в Google Cloud. Выберите панель мониторинга Google Home Analytics - Cloud Integration .

- Прокрутите вниз до диаграммы «Ошибки выполнения облачных запросов — разбивка по статусу», чтобы просмотреть коды ошибок за выделенный временной диапазон.

Код ошибки PARTNER_RESPONSE_MISSING_DEVICE указывает на первопричину проблемы. Далее, для получения более подробной информации просмотрите журналы событий, соответствующие этому коду ошибки.
Доступ к журналам событий
Для получения более подробной информации об ошибке откройте журналы событий вашей интеграции «облако-облако» с помощью функции Cloud Logging .
Откройте меню навигации в Google Cloud Platform и в разделе «Операции» выберите «Журналы» > «Обозреватель журналов» , чтобы получить доступ к журналам событий для вашего проекта. Также вы можете найти «Обозреватель журналов» в поле поиска.
В поле ввода «Поиск по всем полям» введите запрос PARTNER_RESPONSE_MISSING_DEVICE и нажмите «Выполнить запрос» . Журналы, соответствующие запросу, отобразятся в разделе «Результаты» .

В журнале ошибок отображается событие, связанное с системой «умный дом», с подробными сведениями об ошибке, указывающими на следующее:
- Действие пользователя — «возобновление работы стиральной машины» (
actionType:"STARTSTOP_UNPAUSE"), соответствующее недавней неудачной голосовой команде. - Соответствующее отладочное сообщение: «
JSON response does not include device.
Судя по отладочному сообщению, вам следует проверить, почему приложение для стиральной машины не указывает правильное устройство в ответе EXECUTE .
Определите первопричину ошибки.
В functions/index.js найдите обработчик EXECUTE (в массиве onExecute ), который возвращает статус каждой команды и новое состояние устройства. Вставка идентификаторов устройств в ответ на команду EXECUTE зависит от разрешения функции updateDevice :
index.js
app.onExecute(async (body) => {
...
for (const command of intent.payload.commands) {
for (const device of command.devices) {
for (const execution of command.execution) {
executePromises.push(
updateDevice(execution, device.id)
.then((data) => {
result.ids.push(device.id);
Object.assign(result.states, data);
})
.catch((e) =>
functions.logger.error('EXECUTE',
device.id, e.message)));
}
}
}
Проверьте также, как функция updateDevice обрабатывает команды паузы/возобновления работы стиральной машины, и вы обнаружите, что строка, с которой нужно сопоставить команду паузы/возобновления, неверна:
index.js
const updateDevice = async (execution, deviceId) => {
const {params, command} = execution;
let state; let ref;
switch (command) {
...
case 'action.devices.commands.PauseUnpausePause':
const data = await queryDevice(deviceId);
state = (data.isPaused === false && data.isRunning === false)
? {isRunning: false, isPaused: false}
: {isRunning: !params.pause, isPaused: params.pause};
ref = getFirebaseRef().child(deviceId).child('StartStop');
break;
}
return ref.update(state)
.then(() => state);
};
Исправьте ошибку.
Теперь, когда вы определили первопричину ошибки, вы можете исправить строку команды паузы/возобновления:
index.js
const updateDevice = async (execution, deviceId) => {
const {params, command} = execution;
let state; let ref;
switch (command) {
...
case 'action.devices.commands.PauseUnpause':
const data = await queryDevice(deviceId);
state = (data.isPaused === false && data.isRunning === false)
? {isRunning: false, isPaused: false}
: {isRunning: !params.pause, isPaused: params.pause};
ref = getFirebaseRef().child(deviceId).child('StartStop');
break;
}
return ref.update(state)
.then(() => state);
};
Проверьте исправление.
Разверните обновленный код с помощью Firebase CLI:
firebase deploy --only functions
Повторите следующие голосовые команды, и вы увидите, что теперь голосовой помощник корректно реагирует при приостановке/возобновлении работы стиральной машины.
«Эй, Google, поставь мою стиральную машину на паузу».
=>
"Конечно, я поставлю стиральную машину на паузу."
«Эй, Google, возобнови работу моей стиральной машины».
=>
"Понял, возобновляю стирку."
Вы также можете проверить текущее состояние вашей стиральной машины, задав вопросы.
"Эй, Google, моя стиральная машина включена?"
«Эй, Google, моя стиральная машина работает?»
"Привет, Google, какой режим стирки у меня включен?"
4. Проверьте интеграцию с помощью набора тестов.
Помимо ручного тестирования, вы можете использовать автоматизированный набор тестов для умного дома, чтобы проверить сценарии использования на основе типов и характеристик устройств, связанных с вашей интеграцией. Набор тестов запускает серию тестов для выявления проблем в вашей интеграции и отображает информативные сообщения о неудачных тестовых случаях, чтобы ускорить отладку, прежде чем углубляться в журналы событий.
Запустите набор тестов для умного дома.
Следуйте этим инструкциям, чтобы протестировать интеграцию между облачными сервисами с помощью набора тестов:
- Откройте в веб-браузере набор тестов для умного дома .
- Войдите в Google, используя кнопку в правом верхнем углу. Это позволит тестовому набору отправлять команды непосредственно в Google Ассистент.
- В поле «Идентификатор проекта» введите идентификатор проекта вашей интеграции «облако-облако». Затем нажмите «Далее» , чтобы продолжить.
- На этапе «Настройки теста» вы увидите, что в списке параметров стиральной машины Test Suite указаны тип устройства и его характеристики.

- Отключите параметр «Тестовый запрос синхронизации» , поскольку в тестовом приложении для стиральной машины отсутствует пользовательский интерфейс для добавления/удаления/переименования стиральной машины. В рабочей системе необходимо запускать запрос синхронизации всякий раз, когда пользователь добавляет/удаляет/переименовывает устройства.
- Нажмите кнопку ДАЛЕЕ , чтобы начать выполнение теста.
После завершения выполнения набора тестов просмотрите результаты выполнения тестовых случаев. Вы заметите два неудачных тестовых случая с соответствующими сообщениями об ошибках:

Для отладки интеграции между облачными сервисами, выявившей ошибку, вам необходимо определить первопричину ошибки, сначала проанализировав сообщение об ошибке.
Анализ сообщения об ошибке
Чтобы помочь разработчикам определить первопричину проблемы, Test Suite отображает сообщения об ошибках для каждого неудачного тестового случая, указывающие на причину сбоя.
В первом из вышеописанных случаев, когда тест не прошёл,

В сообщении об ошибке указано, что Test Suite ожидает "isPause": true в состояниях, сообщаемых вашей облачной интеграцией, но фактические состояния включают только "isPause": false .
Кроме того, сообщение об ошибке второго неудачного тестового случая указывает на то, что состояния в ответе QUERY от вашей облачной интеграции включают "isPause": true , что отличается от "isPause": false в состояниях, сообщаемых вашей облачной интеграцией:

Судя по обоим сообщениям об ошибке, вам следует проверить, правильно ли ваше интеграционное приложение отображает состояние isPaused .
Определите первопричину ошибки.
Откройте functions/index.js , содержащий функцию reportstate , которая отправляет изменения состояния в Home Graph с помощью функции Report State. Проверьте содержимое файла Report State, и вы обнаружите, что в нем отсутствует состояние isPaused , которое в точности соответствует тому, что проверялось в тестовых случаях, завершившихся неудачей.
index.js
exports.reportstate = functions.database.ref('{deviceId}').onWrite(
async (change, context) => {
...
const requestBody = {
requestId: 'ff36a3cc', /* Any unique ID */
agentUserId: USER_ID,
payload: {
devices: {
states: {
/* Report the current state of our washer */
[context.params.deviceId]: {
online: snapshot.online,
on: snapshot.OnOff.on,
isRunning: snapshot.StartStop.isRunning,
currentRunCycle: [{
currentCycle: 'rinse',
nextCycle: 'spin',
lang: 'en',
}],
currentTotalRemainingTime: 1212,
currentCycleRemainingTime: 301,
},
},
},
},
};
const res = await homegraph.devices.reportStateAndNotification({
requestBody,
});
...
});
Исправьте ошибку.
Теперь, когда вы определили первопричину ошибки, отредактируйте functions/index.js , добавив состояние isPaused в полезную нагрузку Report State:
index.js
exports.reportstate = functions.database.ref('{deviceId}').onWrite(
async (change, context) => {
...
const requestBody = {
requestId: 'ff36a3cc', /* Any unique ID */
agentUserId: USER_ID,
payload: {
devices: {
states: {
/* Report the current state of our washer */
[context.params.deviceId]: {
online: snapshot.online,
on: snapshot.OnOff.on,
isPaused: snapshot.StartStop.isPaused,
isRunning: snapshot.StartStop.isRunning,
currentRunCycle: [{
currentCycle: 'rinse',
nextCycle: 'spin',
lang: 'en',
}],
currentTotalRemainingTime: 1212,
currentCycleRemainingTime: 301,
},
},
},
},
};
...
});
Проверьте исправление.
Разверните обновленный код с помощью Firebase CLI:
$ firebase deploy --only functions
Повторно запустите набор тестов для системы «умный дом», и вы увидите, что все тестовые случаи пройдены успешно.

5. Поздравляем!

Поздравляем! Вы успешно освоили методы устранения неполадок при интеграции облачных сервисов с помощью набора тестов для умного дома и инструментов сбора и ведения журналов GCP.
Узнать больше
Опираясь на этот практический урок, попробуйте выполнить следующие упражнения и изучите дополнительные ресурсы:
- Добавьте к своему устройству дополнительные поддерживаемые характеристики и протестируйте их с помощью набора тестов.
- Создавайте панели мониторинга , настраивайте оповещения и получайте доступ к данным метрик программным способом, чтобы получать полезные показатели использования вашей интеграции.
- Изучите возможности локальной доставки товаров для умного дома.
- Ознакомьтесь с нашим примером на GitHub , чтобы узнать больше.
Вы также можете узнать больше о тестировании и отправке интеграции на проверку, включая процесс сертификации для публикации вашей интеграции для пользователей.