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 z Asystentem 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 metryki 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 dowiesz się, jak wdrożyć integrację typu cloud-to-cloud z 2 błędami i połączyć ją z Asystentem, a potem debugować błędy integracji za pomocą pakietu testów dla inteligentnego domu oraz danych i logów 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 domu inteligentnego 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 używany 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 używanym do programowania. Przejdź do katalogu 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 aplikacji wadliwej 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 <nazwa wyświetlana projektu>”.

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ę aktywnych użytkowników dziennie i łączną liczbę żądań do 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 podane niżej czynności, aby uzyskać dostęp do panelu projektu.

  1. W Konsoli Play 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 „wznawianie 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śl główną przyczynę 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 działania pralki. 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

Skoro znasz już przyczynę 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 wstrzymanie i wznowienie 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 zestawu 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 Project ID (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ę Test Request Sync (Testuj synchronizację żądań), 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 przypadku testowego, który zakończył się niepowodzeniem,

99e4e5d06965a8a7.png

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

Dodatkowo komunikat o błędzie w drugim nieudanym przypadku testowym 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śl główną przyczynę 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 nieudanych testów.

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ą usług w chmurze za pomocą pakietu testów dla inteligentnego domu oraz pomiarów i logowania w GCP.

Więcej informacji

Wykonaj te ćwiczenia i zapoznaj się z dodatkowymi materiałami, korzystając z tego samouczka:

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.