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 chmura–chmura 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), logowaniepakiet testów inteligentnego domu, które pomogą Ci zidentyfikować i rozwiązać problemy związane z integracją.

Wymagania wstępne

Co utworzysz

W tym ćwiczeniu z programowania wdrożysz integrację między chmurami z 2 usterkami i połączysz ją z Asystentem. Następnie debugujesz usterki integracji za pomocą zestawu testów dla urządzeń inteligentnych i platformy Google Cloud Platform (GCP) z funkcją raportowania i rejestrowania.

Czego się nauczysz

  • Jak używać danych i rejestru GCP do wykrywania i rozwiązywania problemów w środowisku produkcyjnym
  • Jak używać Test Suite do wykrywania problemów z funkcjonalnością i interfejsem API w przypadku urządzeń smart home

Czego potrzebujesz

2. Uruchom wadliwą aplikację.

Pobieranie kodu źródłowego

Aby pobrać na maszynie deweloperskiej przykładowy projekt tego laboratorium programistycznego, 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:

Łączenie Analytics z Firebase

Otwórz terminal na komputerze programistycznym. Otwórz katalog washer-faulty, a potem skonfiguruj interfejs wiersza poleceń Firebase z projektem integracji utworzonym w Codelab Połącz urządzenia inteligentnego domu 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ą 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

Aktualizacja 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 pralki, używając do tego synchronizacji żądań.

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 analityczny Smarthome

Błędy można sprawdzać w panelu Smarthome Analytics, który agreguje wykresy dane o użytkowaniu i stanie dotyczące wdrażania 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 Twojego 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 stanów, 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.

Dostęp do dzienników zdarzeń

Aby uzyskać więcej informacji o błędzie, uzyskaj dostęp do dzienników zdarzeń integracji między chmurami za pomocą 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 informacjami o błędzie, 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: „JSON response does not include device.

Na podstawie komunikatu debugowania sprawdź, dlaczego aplikacja pralki nie uwzględnia 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 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 przykazie 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 odkryjesz, że Asystent prawidłowo reaguje na wstrzymanie i wznowienie pracy pralki.

„OK Google, wstrzymaj pranie”

=>

"Oczywiście, wstrzymam pralkę."

„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ń.

Uruchamianie pakietu testów inteligentnego domu

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 zmienianie 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 odpowiednim komunikatem o błędzie:

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 zidentyfikować główną przyczynę, 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 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.

Określ główną przyczynę błędu

Otwórz functions/index.js, który zawiera funkcję reportstate publikującą zmiany stanu w domowym Graph 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 pakiet Test Suite sprawdza w nieudanych przypadkach testu.

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 sprawdzisz, że wszystkie przypadki testowe się powiodło.

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

Wykorzystując to Codelab, wykonaj te ćwiczenia i pobierz dodatkowe materiały:

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.