Отладка умного дома

1. Прежде чем начать

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

a4657871181b5ad2.gif

Изучение инструментов отладки для действий умного дома — важный шаг для создания качественной интеграции с Google Assistant. Чтобы облегчить мониторинг и отладку, Google Cloud Platform (GCP) Metrics и Logging and Test Suite для умного дома доступны, чтобы помочь вам выявлять и устранять проблемы с вашими действиями.

Предпосылки

Что вы будете строить

В этой кодовой лаборатории вы развернете действие «умный дом» с двумя дефектами и подключите его к помощнику, а затем отлаживаете дефекты действия с помощью Test Suite для метрик и ведения журнала Google Cloud Platform (GCP).

Что вы узнаете

  • Как использовать метрики и ведение журнала GCP для выявления и решения производственных проблем
  • Как использовать Test Suite для умного дома для выявления функциональных проблем и проблем с API

Что вам понадобится

2. Запустите неисправное приложение

Получить исходный код

Щелкните следующую ссылку, чтобы загрузить образец для этой лаборатории кода на свой компьютер для разработки:

... или вы можете клонировать репозиторий GitHub из командной строки:

$ git clone https://github.com/google-home/smarthome-debug.git

О проекте

Приложение стиральной машины содержит следующие подкаталоги:

  • public : пользовательский интерфейс для простого управления и мониторинга состояния умной стиральной машины.
  • functions : полностью реализованный облачный сервис, который управляет умной стиральной машиной с помощью облачных функций для Firebase и базы данных Firebase Realtime .

Подключиться к Firebase

Откройте терминал на вашей машине разработки. Перейдите в каталог washer-faulty , затем настройте интерфейс командной строки Firebase с вашим проектом Actions, созданным в разделе «Подключение умных домашних устройств к кодовой лаборатории Google Assistant »:

$ cd washer-faulty
$ firebase use <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/<project-id>/overview
Hosting URL: https://<project-id>.firebaseapp.com

Обновить домашнюю диаграмму

Откройте URL-адрес хостинга в браузере ( https://<project-id>.firebaseapp.com ), чтобы просмотреть веб-приложение. В веб-интерфейсе щелкните Обновить ae8d3b25777a5e30.png кнопку, чтобы обновить HomeGraph через Request Sync с последними метаданными устройства из неисправного приложения для стиральной машины:

6f2b1344179977cf.png

Откройте приложение Google Home и убедитесь, что вы видите стиральную машину с именем Faulty Washer .

e357de6a7faff925.png

3. Проверьте свои действия

После развертывания проекта проверьте, что ваше действие управляет стиральной машиной.

Проверьте стиральную машину

Проверьте изменение значения, когда вы попробуете любую из следующих голосовых команд через свой телефон:

«Окей, Google, включи мою стиральную машину».

«Окей, Google, включи мою стиральную машину».

«Окей, Google, останови мою стиральную машину».

«Окей, Google, возобнови мою стиральную машину».

«Окей, Google, останови мою стиральную машину».

Вы заметите, что Ассистент отвечает голосом, что что-то не так, когда вы приостанавливаете/возобновляете стирку:

«Извините, мне не удалось связаться с <отображаемое имя проекта>».

Чтобы отладить эту проблему, вам сначала потребуется дополнительная информация об ошибке, чтобы сузить круг и определить основную причину.

Панель аналитики умного дома

Хорошим местом для проверки ошибок является панель инструментов Smarthome Analytics , которая объединяет графики показателей использования и работоспособности для вашего облачного исполнения:

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

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

  1. В консоли Actions перейдите на страницу Projects.
  2. Выберите свой проект умного дома.
  3. Выберите вкладку «Аналитика» и нажмите «Перейти к Google Cloud Platform ».

b1735bbe11a7aff8.png

  1. Это приведет вас к списку информационных панелей для вашего проекта в Google Cloud. Выберите панель инструментов Google Home Analytics — облачная интеграция .

5edd3751323176dd.png

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

c468743c20a11c15.png

Код ошибки PARTNER_RESPONSE_MISSING_DEVICE указывает на основную причину. Затем извлеките журналы событий на основе кода ошибки для получения дополнительных сведений.

Доступ к журналам событий

Чтобы получить более подробную информацию об ошибке, получите доступ к журналам событий для вашего умного дома Действия через Cloud Logging .

Откройте меню навигации в Google Cloud Platform и в разделе «Операции» выберите «Ведение журнала » > «Проводник журналов» , чтобы получить доступ к журналам событий для вашего проекта. Кроме того, вы можете выполнить поиск Logs Explorer в поле поиска.

В разделе «Запрос» введите запрос PARTNER_RESPONSE_MISSING_DEVICE и нажмите «Выполнить запрос» . Журналы, соответствующие запросу, отображаются в разделе Результаты запроса .

747cca0f1249a5a.png

В журнале ошибок отображается событие умного дома с подробными сведениями об ошибке, указывающими:

  • Предпринятое пользователем действие — «возобновление стирки» ( 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':
     state = {isPaused: params.pause};
     if (params.pause) state.isRunning = false;
     ref = firebaseRef.child(deviceId).child('StartStop');
     break;
 }

 return ref.update(state)
     .then(() => state);
};

Исправить ошибку

Теперь, когда вы определили основную причину ошибки, вы можете исправить строку для команды pause/resume:

index.js

const updateDevice = async (execution, deviceId) => {
 const {params, command} = execution;
 let state; let ref;
 switch (command) {
   ...
   case 'action.devices.commands.PauseUnpause':
     state = {isPaused: params.pause};
     if (params.pause) state.isRunning = false;
     ref = firebaseRef.child(deviceId).child('StartStop');
     break;
 }

 return ref.update(state)
     .then(() => state);
};

Проверьте свое исправление

Разверните обновленный код с помощью интерфейса командной строки Firebase:

firebase deploy --only functions

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

«Окей, Google, останови мою стиральную машину».

=>

«Конечно, останавливаю стирку».

«Окей, Google, возобнови мою стиральную машину».

=>

"Понятно, возобновляю стирку."

Вы также можете проверить текущее состояние вашей стиральной машины, задавая вопросы.

"Окей, Google, моя стиральная машина включена?"

"Окей, Google, моя стиральная машина работает?"

«Окей, Google, какой цикл у моей стиральной машины?»

4. Проверьте свои действия с помощью Test Suite

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

Запустите Test Suite для умного дома

Следуйте этим инструкциям, чтобы протестировать свой умный дом Action by Test Suite:

  1. В веб-браузере откройте Test Suite для умного дома .
  2. Войдите в Google с помощью кнопки в правом верхнем углу. Это позволяет Test Suite отправлять команды непосредственно в Google Assistant.
  3. В поле «Идентификатор проекта» введите идентификатор проекта вашего действия «Умный дом». Затем нажмите «ДАЛЕЕ» , чтобы продолжить.
  4. На этапе «Настройки теста» вы увидите, что Test Suite перечисляет тип устройства и характеристики стиральной машины.

78ed6a1ebdb581bf.png

  1. Отключите параметр «Синхронизация тестового запроса» , поскольку в образце приложения для стиральной машины нет пользовательского интерфейса для добавления/удаления/переименования стиральной машины. В производственной системе вы должны запускать Request Sync всякий раз, когда пользователь добавляет/удаляет/переименовывает устройства.
  2. Нажмите NEXT , чтобы начать выполнение теста.

После завершения работы Test Suite просмотрите результаты тестовых наборов. Вы заметите два неудачных теста с соответствующим сообщением об ошибке:

5838d10631c98ed2.png

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

Проанализируйте сообщение об ошибке

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

Для первого неудачного теста выше,

99e4e5d06965a8a7.png

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

Кроме того, сообщение об ошибке второго неудачного тестового примера указывает, что состояния в ответе QUERY от вашего действия «умного дома» включают "isPause": true , которое отличается от "isPause": false в состояниях, о которых сообщает ваше действие «умный дом»:

fdb5124102e3a37.png

Согласно обоим сообщениям об ошибках, вы должны затем проверить, isPaused правильным значением.

Определите основную причину ошибки

Откройте functions/index.js , который содержит функцию reportstate , которая публикует изменения состояния в Home Graph через Report State. Проверьте полезную нагрузку Report State, и вы обнаружите, что в полезной нагрузке отсутствует состояние isPaused , а это именно то, что Test Suite проверял в неудачных тестовых примерах.

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: true,
                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: true,
                on: snapshot.OnOff.on,
                isPaused: snapshot.StartStop.isPaused,
                isRunning: snapshot.StartStop.isRunning,
                currentRunCycle: [{
                  currentCycle: 'rinse',
                  nextCycle: 'spin',
                  lang: 'en',
                }],
                currentTotalRemainingTime: 1212,
                currentCycleRemainingTime: 301,
              },
            },
          },
        },
      };
      ...
    });

Проверьте свое исправление

Разверните обновленный код с помощью интерфейса командной строки Firebase:

$ firebase deploy --only functions

Повторно запустите Test Suite для умного дома, и вы обнаружите, что все тестовые случаи пройдены.

148837f85d377dd6.png

5. Поздравления

17d485868a6771bc.png

Поздравляем! Вы успешно научились устранять неполадки, связанные с действиями умного дома, с помощью Test Suite для умного дома, метрик и ведения журнала GCP.

Узнать больше

Опираясь на эту лабораторию кода, попробуйте выполнить следующие упражнения и изучить дополнительные ресурсы:

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