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

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 с помощью вашего проекта интеграции, встроенного в раздел «Подключение устройств умного дома к лаборатории кода 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

Обновить домашний график

Откройте URL-адрес хостинга в своем браузере ( https://<firebase-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. Откройте вкладку «Аналитика» в меню слева.

b1735bbe11a7aff8.png

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

5edd3751323176dd.png

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

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);
};

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

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

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

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

Следуйте этим инструкциям, чтобы протестировать интеграцию облака в облако с помощью 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 в состояниях, о которых сообщает ваша интеграция Cloud-to-Cloud, но фактические состояния включают только "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 попробуйте выполнить следующие упражнения и изучите дополнительные ресурсы:

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