Debugowanie inteligentnego domu

1. Zanim zaczniesz

Jako deweloper Internetu Rzeczy (IoT) możesz tworzyć integracje typu chmura-chmura, które umożliwiają użytkownikom sterowanie urządzeniami za pomocą elementów sterujących dotykowych w aplikacji Google Home i poleceń głosowych wydawanych Asystentowi Google.

a4657871181b5ad2.gif

Poznanie narzędzi do debugowania integracji typu cloud-to-cloud jest ważnym krokiem w budowaniu integracji z Asystentem Google o jakości produkcyjnej. Aby ułatwić monitorowanie i debugowanie, udostępniamy wskaźniki Google Cloud Platform (GCP), rejestrowaniepakiet testów dla inteligentnego domu, które pomogą Ci identyfikować i rozwiązywać problemy z integracjami.

Wymagania wstępne

Co utworzysz

W tym module utworzysz integrację typu chmura-chmura z 2 błędami i połączysz ją z Asystentem. Następnie debugujesz błędy integracji za pomocą pakietu testów dla inteligentnego domu oraz statystyk i logowania Google Cloud Platform (GCP).

Czego się nauczysz

  • Jak używać danych i logów GCP do identyfikowania i rozwiązywania problemów produkcyjnych
  • Jak używać pakietu testów dla inteligentnego domu do identyfikowania problemów z funkcjami i interfejsami API

Czego potrzebujesz

2. Uruchom wadliwą aplikację

Pobieranie kodu źródłowego

Kliknij ten link, aby pobrać na komputer, którego używasz do programowania, przykładowy kod do tego laboratorium:

…lub możesz sklonować repozytorium GitHub z wiersza poleceń:

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

Informacje o projekcie

Aplikacja pralki zawiera te podkatalogi:

Łączenie Analytics z Firebase

Otwórz terminal na komputerze deweloperskim. Otwórz katalog washer-faulty, a potem skonfiguruj interfejs wiersza poleceń Firebase za pomocą projektu integracji utworzonego w samouczku dotyczącym łączenia inteligentnych urządzeń domowych z Asystentem Google:

$ cd washer-faulty
$ firebase use <firebase-project-id>

Wdrażanie w Firebase

Otwórz folder functions i zainstaluj wszystkie niezbędne zależności za pomocą polecenia npm..

$ cd functions
$ npm install

Uwaga: jeśli zobaczysz poniższy komunikat, możesz go zignorować i kontynuować. Ostrzeżenie jest spowodowane starszymi zależnościami. Więcej informacji znajdziesz tutaj.

found 5 high severity vulnerabilities
  run `npm audit fix` to fix them, or `npm audit` for details

Po zainstalowaniu zależności i skonfigurowaniu projektu możesz wdrożyć aplikację do obsługi wadliwej pralki.

$ firebase deploy

Oto dane wyjściowe, które powinny się wyświetlić w konsoli:

...

✔ Deploy complete!

Project Console: https://console.firebase.google.com/project/<Firebase-project-id>/overview
Hosting URL: https://<Firebase-project-id>.firebaseapp.com

Aktualizowanie HomeGraph

Otwórz adres URL hostingu w przeglądarce (https://<firebase-project-id>.firebaseapp.com), aby wyświetlić aplikację internetową. W interfejsie internetowym kliknij przycisk Odświeżae8d3b25777a5e30.png, aby zaktualizować HomeGraph o najnowsze metadane urządzenia z wadliwej aplikacji do obsługi pralki za pomocą Request Sync.

6f2b1344179977cf.png

Otwórz aplikację Google Home i sprawdź, czy widzisz pralkę o nazwie Uszkodzona pralka.

e357de6a7faff925.png

3. Testowanie integracji

Po wdrożeniu projektu sprawdź, czy integracja steruje pralką.

Testowanie pralki

Sprawdź zmianę wartości, gdy wypróbujesz na telefonie dowolne z tych poleceń głosowych:

„OK Google, włącz pralkę”

„OK Google, włącz pralkę”.

„OK Google, wstrzymaj pranie”.

„OK Google, wznów pranie”.

„OK Google, zatrzymaj pralkę”

Gdy wstrzymasz lub wznowisz pranie, Asystent odpowie głosowo, że coś jest nie tak:

„Nie udało mi się połączyć z projektem <project display name>”.

Aby rozwiązać ten problem, musisz najpierw uzyskać więcej informacji o błędzie, aby zawęzić zakres i zidentyfikować jego główną przyczynę.

Panel Smarthome Analytics

Dobrym miejscem do sprawdzania błędów jest panel Smarthome Analytics, który zawiera zagregowane wykresy danych o użyciu i stanie w przypadku realizacji w chmurze:

  • Dane Użycie odzwierciedlają trend użycia integracji typu „chmura do chmury”, w tym liczbę dziennych aktywnych użytkowników i łączną liczbę żądań do usługi realizacji.
  • Wskaźniki Stan pomagają monitorować występowanie anomalii w integracji typu chmura-chmura, obejmując opóźnienie żądań, odsetek sukcesów i podział błędów.

Aby zawęzić przyczynę błędu, wykonaj poniższe czynności, aby uzyskać dostęp do panelu projektu.

  1. W Developer Console otwórz stronę Projekty.
  2. Wybierz projekt inteligentnego domu.
  3. W menu po lewej stronie kliknij kartę Statystyki.

b1735bbe11a7aff8.png

  1. Spowoduje to wyświetlenie listy paneli w Twoim projekcie w Google Cloud. Wybierz panel Google Home Analytics – integracja z chmurą.

5edd3751323176dd.png

  1. Przewiń w dół do wykresu Błędy realizacji w chmurze – podział według stanu, aby wyświetlić kody błędów w wyróżnionym zakresie czasu.

c468743c20a11c15.png

Kod błędu PARTNER_RESPONSE_MISSING_DEVICE wskazuje główną przyczynę problemu. Następnie pobierz dzienniki zdarzeń na podstawie kodu błędu, aby uzyskać więcej informacji.

Dostęp do dzienników zdarzeń

Aby uzyskać więcej informacji o błędzie, otwórz dzienniki zdarzeń integracji typu chmura-chmura za pomocą Cloud Logging.

Otwórz menu nawigacyjne w Google Cloud Platform i w sekcji Operacje wybierz Logowanie > Eksplorator logów, aby uzyskać dostęp do logów zdarzeń w projekcie. Możesz też wyszukać Eksplorator logów w polu wyszukiwania.

W polu Wyszukaj we wszystkich polach wpisz zapytanie PARTNER_RESPONSE_MISSING_DEVICE i kliknij Uruchom zapytanie. Logi pasujące do zapytania zostaną wyświetlone w sekcji Wyniki.

747cca0f1249a5a.png

W dzienniku błędów widać zdarzenie dotyczące inteligentnego domu ze szczegółami błędu wskazującymi:

  • Działanie użytkownika to „wznowienie prania” (actionType:STARTSTOP_UNPAUSE”), co odpowiada ostatniemu nieudanemu poleceniu głosowemu.
  • Powiązany komunikat debugowania to „JSON response does not include device.

Na podstawie komunikatu debugowania sprawdź, dlaczego aplikacja pralki nie zawiera prawidłowego urządzenia w odpowiedzi EXECUTE.

Określanie głównej przyczyny błędu

functions/index.js znajdź moduł obsługi EXECUTE (w tablicy onExecute), który zwraca stan każdego polecenia i nowy stan urządzenia. Wstawianie identyfikatorów urządzeń do EXECUTEodpowiedzi zależy od rozwiązania updateDevicefunkcji:

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

Sprawdź, jak funkcja updateDevice obsługuje wstrzymywanie i wznawianie prania, a zobaczysz, że ciąg znaków, który ma pasować do polecenia wstrzymania lub wznowienia, jest nieprawidłowy:

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

Naprawianie błędu

Po ustaleniu przyczyny błędu możesz poprawić ciąg znaków dla polecenia wstrzymania lub wznowienia:

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

Testowanie poprawki

Wdróż zaktualizowany kod za pomocą wiersza poleceń Firebase:

firebase deploy --only functions

Spróbuj ponownie użyć tych poleceń głosowych. Asystent powinien teraz prawidłowo reagować na polecenia wstrzymania i wznowienia prania.

„OK Google, wstrzymaj pranie”.

=>

„Jasne, wstrzymuję pranie”.

„OK Google, wznów pranie”.

=>

„OK, wznawiam pranie”.

Możesz też sprawdzić aktualny stan pralki, zadając pytania.

„OK Google, czy pralka jest włączona?”

„OK Google, czy pralka działa?”

„OK Google, w jakim cyklu pracuje pralka?”

4. Testowanie integracji za pomocą pakietu testów

Oprócz testowania ręcznego możesz użyć automatycznego pakietu testów dla inteligentnego domu, aby sprawdzić przypadki użycia na podstawie typów urządzeń i cech powiązanych z integracją. Pakiet testów przeprowadza serię testów, aby wykryć problemy z integracją, i wyświetla informacyjne komunikaty o nieudanych przypadkach testowych, aby przyspieszyć debugowanie przed przejrzeniem dzienników zdarzeń.

Uruchamianie pakietu testów dla inteligentnego domu

Aby przetestować integrację typu „chmura do chmury” za pomocą pakietu testowego, wykonaj te czynności:

  1. W przeglądarce otwórz pakiet testów dla inteligentnego domu.
  2. Zaloguj się w Google, klikając przycisk w prawym górnym rogu. Dzięki temu pakiet testowy może wysyłać polecenia bezpośrednio do Asystenta Google.
  3. W polu Identyfikator projektu wpisz identyfikator projektu integracji typu Cloud-to-Cloud. Następnie kliknij DALEJ, aby kontynuować.
  4. Na etapie Ustawienia testu na liście Test Suite zobaczysz typ urządzenia i cechy pralki.

78ed6a1ebdb581bf.png

  1. Wyłącz opcję Synchronizacja żądania testowego, ponieważ przykładowa aplikacja do pralki nie ma interfejsu, który umożliwiałby dodawanie, usuwanie ani zmienianie nazwy pralki. W systemie produkcyjnym musisz wywoływać Request Sync (Poproś o synchronizację) za każdym razem, gdy użytkownik dodaje, usuwa lub zmienia nazwy urządzeń.
  2. Aby rozpocząć test, kliknij DALEJ.

Po zakończeniu działania pakietu testów wyświetl wyniki przypadków testowych. Zauważysz 2 przypadki testowe, które zakończyły się niepowodzeniem, wraz z odpowiednimi komunikatami o błędach:

5838d10631c98ed2.png

Aby debugować integrację typu „chmura do chmury” w przypadku błędu, musisz najpierw przeanalizować komunikat o błędzie, aby zidentyfikować jego główną przyczynę.

Analizowanie komunikatu o błędzie

Aby pomóc deweloperom w określeniu głównej przyczyny problemu, pakiet testów wyświetla komunikaty o błędach dla każdego nieudanego przypadku testowego, które wskazują przyczynę niepowodzenia.

W przypadku pierwszego nieudanego przypadku testowego powyżej

99e4e5d06965a8a7.png

komunikat o błędzie wskazuje, że pakiet testów oczekuje w stanach zgłaszanych z integracji typu cloud-to-cloud wartości "isPause": true, ale rzeczywiste stany zawierają tylko "isPause": false.

Dodatkowo komunikat o błędzie drugiego nieudanego przypadku testowego wskazuje, że stany w QUERY odpowiedzi z integracji typu chmura-chmura obejmują "isPause": true, co różni się od "isPause": false w stanach zgłaszanych przez integrację typu chmura-chmura:

fdb5124102e3a37.png

Zgodnie z treścią obu komunikatów o błędach należy sprawdzić, czy raporty integracji zawierają stan isPaused z prawidłową wartością.

Określanie głównej przyczyny błędu

Otwórz plik functions/index.js, który zawiera funkcję reportstate publikującą zmiany stanu w Home Graph za pomocą funkcji Report State. Sprawdź ładunek stanu raportu. Zobaczysz, że brakuje w nim stanu isPaused, czyli dokładnie tego, co pakiet testowy sprawdzał w przypadku testów, które zakończyły się niepowodzeniem.

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

Naprawianie błędu

Po ustaleniu głównej przyczyny błędu zmień functions/index.js, dodając do ładunku Report State stan 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,
                isPaused: snapshot.StartStop.isPaused,
                isRunning: snapshot.StartStop.isRunning,
                currentRunCycle: [{
                  currentCycle: 'rinse',
                  nextCycle: 'spin',
                  lang: 'en',
                }],
                currentTotalRemainingTime: 1212,
                currentCycleRemainingTime: 301,
              },
            },
          },
        },
      };
      ...
    });

Testowanie poprawki

Wdróż zaktualizowany kod za pomocą wiersza poleceń Firebase:

$ firebase deploy --only functions

Ponownie uruchom pakiet testów dla inteligentnego domu. Zobaczysz, że wszystkie przypadki testowe zostały zaliczone.

148837f85d377dd6.png

5. Gratulacje

17d485868a6771bc.png

Gratulacje! Udało Ci się rozwiązać problemy z integracją typu cloud-to-cloud za pomocą pakietu testowego dla inteligentnego domu oraz danych i logów GCP.

Więcej informacji

Na podstawie tych ćwiczeń z programowania wykonaj poniższe zadania i zapoznaj się z dodatkowymi materiałami:

Możesz też dowiedzieć się więcej o testowaniu i przesyłaniu integracji do sprawdzenia, w tym o procesie certyfikacji, który umożliwia opublikowanie integracji dla użytkowników.