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

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

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

a4657871181b5ad2.gif

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

Предварительные условия

Что ты построишь

В этой лаборатории кода вы развернете действие «умный дом» с двумя дефектами и подключите его к Ассистенту, а затем отладите дефекты действия с помощью набора тестов для «умного дома» и показателей и ведения журнала облачной платформы Google (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. В консоли «Действия» перейдите на страницу «Проекты».
  2. Выберите проект умного дома.
  3. Выберите вкладку «Аналитика» и нажмите «Перейти к Google Cloud Platform» .

b1735bbe11a7aff8.png

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

5edd3751323176dd.png

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

c468743c20a11c15.png

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

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

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

Откройте меню навигации в 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);
};

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

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

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 CLI:

firebase deploy --only functions

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

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

=>

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

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

=>

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

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

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

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

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

4. Проверьте свои действия с помощью набора тестов.

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

После завершения работы 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. Проверьте полезную нагрузку состояния отчета, и вы обнаружите, что в ней отсутствует состояние 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 в полезные данные состояния отчета:

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 CLI:

$ firebase deploy --only functions

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

148837f85d377dd6.png

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

17d485868a6771bc.png

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

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

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

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