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 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 ćwiczeniu wdrożysz integrację typu cloud-to-cloud 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 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ć przykładowy kod do tego ćwiczenia na komputer używany do programowania:

…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 spróbujesz użyć na telefonie dowolnego 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 zestawienie błędów.

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

  1. W Developer Console otwórz stronę Projects (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 do wprowadzania danych 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:

  • 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 prania, a zobaczysz, że ciąg znaków pasujący 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ę 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-chmura w przypadku niepowodzenia, musisz najpierw przeanalizować komunikat o błędzie i określić 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 "isPause": true w stanach zgłaszanych przez integrację typu Cloud-to-cloud, ale rzeczywiste stany zawierają tylko "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 w raportach integracji jest podana wartość isPaused.

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 Report State. 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 stanu raportu 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.