Debugowanie inteligentnego domu

1. Zanim zaczniesz

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

a4657871181b5ad2.gif

Poznanie narzędzi do debugowania integracji między chmurami jest ważnym krokiem na drodze do stworzenia integracji z Asystentem Google o jakości docelowej. Aby ułatwić monitorowanie i debugowanie, udostępniamy dane Google Cloud Platform (GCP), dziennikowanie i pakiet testów dla inteligentnego domu, które ułatwiają identyfikowanie i rozwiązywanie problemów z integracją.

Wymagania wstępne

Co utworzysz

W tym ćwiczeniu w języku Pythona wdrożysz integrację między chmurami z 2 błędami i połączysz ją z Asystentem. Następnie debugujesz błędy integracji za pomocą zestawu testów dla urządzeń inteligentnych oraz funkcji raportowania i rejestrowania Google Cloud Platform (GCP).

Czego się nauczysz

  • Jak używać danych i logowania GCP do identyfikowania i rozwiązywania problemów w środowisku produkcyjnym
  • Jak używać pakietu Test Suite do urządzeń smart home, aby wykrywać problemy z funkcjonalnością i interfejsem API

Czego potrzebujesz

2. Uruchom wadliwą aplikację.

Pobieranie kodu źródłowego

Aby pobrać na maszynę programistyczną przykładowy projekt tego ćwiczenia, kliknij ten link:

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

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

Informacje o projekcie

Aplikacja pralki zawiera te katalogi podrzędne:

Połącz się z Firebase

Otwórz terminal na komputerze deweloperskim. Otwórz katalog washer-faulty, a potem skonfiguruj interfejs wiersza poleceń Firebase z projektem integracji utworzonym w laboratorium kodowania Asystenta Google z urządzeniami inteligentnego domu:

$ 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 ten komunikat, możesz go zignorować i kontynuować. Ostrzeżenie jest spowodowane niektórymi 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 mycia naczyń.

$ firebase deploy

Dane wyjściowe konsoli powinny wyglądać tak:

...

✔ 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 za pomocą żądania synchronizacji z najnowszymi metadanymi urządzenia z wadliwej aplikacji do prania:

6f2b1344179977cf.png

Otwórz aplikację Google Home i sprawdź, czy widzisz urządzenie pralki o nazwie Faulty Washer.

e357de6a7faff925.png

3. Testowanie integracji

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

Testowanie pralki

Sprawdź, jak zmienia się wartość, gdy na telefonie użyjesz któregoś z tych poleceń głosowych:

„OK Google, włącz pralkę”

„OK Google, włącz pralkę”

„OK Google, wstrzymaj pranie”

„OK Google, wznów działanie pralki”

„OK Google, zatrzymaj pralkę”

Gdy wstrzymasz lub wznowisz pranie, Asystent poinformuje Cię o problemie:

„Nie udało mi się połączyć z <nazwa wyświetlana projektu>”.

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

Panel Analytics dotyczący urządzeń Smarthome

Błędy możesz sprawdzać w panelu Smarthome Analytics, który agreguje wykresy Dane o użytkowaniu i stanie dotyczące Twojego przetwarzania w chmurze:

  • Dane Użycie odzwierciedlają trend użycia integracji między chmurami, w tym liczbę aktywnych użytkowników dziennie i łączną liczbę żądań do Twojego rozwiązania.
  • Dane Stan pomagają monitorować występowanie anomalii w integracji między chmurami. Obejmują one opóźnienie żądania, odsetek powodzeń i podział błędów.

Aby określić przyczynę błędu, wykonaj czynności opisane poniżej, aby uzyskać dostęp do panelu projektu.

  1. W Konsoli dewelopera 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 dla projektu w Google Cloud. Wybierz panel Google Home Analytics – integracja z Cloudem.

5edd3751323176dd.png

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

c468743c20a11c15.png

Kod błędu PARTNER_RESPONSE_MISSING_DEVICE zawiera wskazówkę dotyczącą głównej przyczyny. Następnie pobierz dzienniki zdarzeń na podstawie kodu błędu, aby uzyskać więcej informacji.

Uzyskiwanie dostępu do dzienników zdarzeń

Aby uzyskać więcej informacji o błędzie, otwórz dzienniki zdarzeń integracji chmur w Cloud Logging.

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

W polu tekstowym Szukaj we wszystkich polach wpisz zapytanie PARTNER_RESPONSE_MISSING_DEVICE i kliknij Uruchom zapytanie. W sekcji Wyniki wyświetlają się logi pasujące do zapytania.

747cca0f1249a5a.png

Dziennik błędów zawiera zdarzenie związane ze smart home z szczegółami błędu, które wskazują:

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

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

Zidentyfikuj główną przyczynę błędu

functions/index.js znajdź moduł obsługi EXECUTE (w tablicy onExecute), który zwraca stan poszczególnych poleceń i nowy stan urządzenia. Wstawianie identyfikatorów urządzeń do odpowiedzi EXECUTE zależy od rozwiązania funkcji 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)));
     }
   }
 }

Sprawdź, jak funkcja updateDevice obsługuje wstrzymanie i wznowienie prania w pralce. Zobaczysz, że ciąg znaków dopasowujący do polecenia wstrzymania/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':
     state = {isPaused: params.pause};
     if (params.pause) state.isRunning = false;
     ref = firebaseRef.child(deviceId).child('StartStop');
     break;
 }

 return ref.update(state)
     .then(() => state);
};

Naprawianie błędu

Gdy już poznasz główną przyczynę błędu, możesz poprawić ciąg znaków w komandzie wstrzymania / wznowienia:

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

Testowanie poprawki

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

firebase deploy --only functions

Ponownie użyj tych poleceń głosowych, a Asystent powinien teraz prawidłowo reagować na wstrzymanie i wznowienie prania.

„OK Google, wstrzymaj pranie”

=>

"Oczywiście, wstrzymam pranie."

„OK Google, wznów działanie pralki”

=>

"Rozumiem, wznawiam pranie."

Możesz też przetestować bieżący stan pralki, zadawać pytania.

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

„OK Google, czy moja pralka działa?”

„OK Google, na którym cyklu jest moja pralka?”

4. Testowanie integracji za pomocą Test Suite

Oprócz testowania ręcznego możesz też korzystać z automatycznego pakietu testów dla inteligentnego domu, aby sprawdzać przypadki użycia na podstawie typów urządzeń i właściwości powiązanych z integracją. Pakiet testów przeprowadza serię testów w celu wykrycia problemów z integracją i wyświetla komunikaty informacyjne o nieudanych testach, aby przyspieszyć debugowanie przed zapoznaniem się z dziennikami zdarzeń.

Uruchomienie pakietu testów dla inteligentnych urządzeń domowych

Aby przetestować integrację między chmurami za pomocą Test Suite, wykonaj te czynności:

  1. W przeglądarce otwórz Test Suite for smart home (Zestaw testów dla inteligentnych urządzeń domowych).
  2. Zaloguj się w Google, klikając przycisk w prawym górnym rogu. Dzięki temu pakiet testów może wysyłać polecenia bezpośrednio do Asystenta Google.
  3. W polu Identyfikator projektu wpisz identyfikator projektu integracji między chmurami. Aby kontynuować, kliknij DALEJ.
  4. Na etapie Ustawienia testu pakiet testów podaje typ urządzenia i cechy pralki.

78ed6a1ebdb581bf.png

  1. Wyłącz opcję Testuj synchronizację żądań, ponieważ przykładowa aplikacja do prania nie ma interfejsu użytkownika umożliwiającego dodawanie, usuwanie ani zmianę nazwy pralki. W systemie produkcyjnym musisz wywołać Request Sync (Wyślij żądanie synchronizacji) za każdym razem, gdy użytkownik dodaje, usuwa lub zmienia nazwę urządzenia.
  2. Aby rozpocząć testowanie, kliknij DALEJ.

Po zakończeniu działania zestawu testów możesz wyświetlić wyniki testów. Zobaczysz 2 nieudane przypadki testowe z odpowiednimi komunikatami o błędach:

5838d10631c98ed2.png

Aby debugować integrację między chmurami w przypadku błędu, musisz najpierw zidentyfikować jego główną przyczynę, analizując komunikat o błędzie.

Analizowanie komunikatu o błędzie

Aby pomóc deweloperom w znalezieniu głównej przyczyny, pakiet testów wyświetla komunikaty o błędach dla każdego nieudanego przypadku testu, 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 wartości "isPause": true w stanach zgłoszonych z integracji między chmurami, ale rzeczywiste stany obejmują tylko "isPause": false.

Dodatkowo komunikat o błędzie drugiego nieudanego testu przypadku wskazuje, że stany w odpowiedzi QUERY z integracji między chmurami obejmują "isPause": true, co różni się od "isPause": false w stanach zgłaszanych z integracji między chmurami:

fdb5124102e3a37.png

Zgodnie z obu komunikatami o błędzie musisz sprawdzić, czy raporty integracji zawierają wartość isPaused.

Zidentyfikuj główną przyczynę błędu

Otwórz funkcję functions/index.js, która zawiera funkcję reportstate publikującą zmiany stanu w domowym grafowi za pomocą funkcji Raport stanu. Sprawdź ładunek Stan raportu. Okaże się, że brakuje w nim stanu isPaused, który jest dokładnie tym, co Test Suite sprawdza w nieudanych przypadkach testowych.

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

Naprawianie błędu

Po zidentyfikowaniu głównej przyczyny błędu zmodyfikuj functions/index.js, dodając stan isPaused do pliku danych Stan raportu:

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

Testowanie poprawki

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

$ firebase deploy --only functions

Ponownie uruchom zestaw testów dla inteligentnego domu, a okaże się, że wszystkie przypadki testowe zostały zaliczone.

148837f85d377dd6.png

5. Gratulacje

17d485868a6771bc.png

Gratulacje! Wiesz już, jak rozwiązywać problemy z integracją usług w chmurze za pomocą Test Suite dla inteligentnego domu oraz danych i rejestrowania GCP.

Więcej informacji

Na podstawie tego ćwiczenia z programowania wykonaj te ćwiczenia 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 w celu opublikowania integracji dla użytkowników.