Debugowanie inteligentnego domu

1. Zanim zaczniesz

Jako deweloper internetu rzeczy (IoT) możesz tworzyć działania inteligentnego domu, które dają użytkownikom możliwość sterowania urządzeniami za pomocą sterowania dotykowego w aplikacji Google Home oraz poleceń głosowych w Asystencie Google.

a4657871181b5ad2.gif

Zapoznanie się z narzędziami do debugowania w działaniach inteligentnego domu to ważny krok na drodze do integracji funkcji związanych z jakością produkcyjną z Asystentem Google. Aby ułatwić monitorowanie i debugowanie, udostępniamy wskaźniki Google Cloud Platform (GCP), Logging i Test Suite dla inteligentnego domu, które pomogą Ci zidentyfikować i rozwiązać problemy z działaniami.

Wymagania wstępne

Co utworzysz

W ramach tego ćwiczenia w programie wdrożysz działanie związane z inteligentnym domem z 2 usterkami i połączysz je z Asystentem, a potem zdebugujesz je za pomocą Test Suite dla Wskaźniki i logowanie Google Cloud Platform (GCP).

Czego się nauczysz

  • Jak korzystać ze wskaźników i logowania GCP do identyfikowania i rozwiązywania problemów produkcyjnych
  • Jak korzystać z pakietu Test Suite dla inteligentnego domu, aby zidentyfikować problemy dotyczące funkcjonalności i interfejsów API

Czego potrzebujesz

2. Uruchom niedziałającą aplikację

Pobieranie kodu źródłowego

Kliknij ten link, aby pobrać na swoim komputerze przykładową wersję ćwiczenia z programowania:

...lub sklonuj repozytorium GitHub, używając wiersza poleceń:

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

Informacje o projekcie

Aplikacja do pralki zawiera te podkatalogi:

Połącz z Firebase

Otwórz terminal na komputerze, na którym pracujesz. Przejdź do katalogu washer-faulty, a potem skonfiguruj interfejs wiersza poleceń Firebase za pomocą projektu w ramach Actions (Łączenie inteligentnych urządzeń domowych z ćwiczeniem z programowania Asystenta Google):

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

Wdrażanie w Firebase

Przejdź do folderu functions i zainstaluj wszystkie niezbędne zależności za pomocą pliku npm..

$ cd functions
$ npm install

Uwaga: jeśli zobaczysz komunikat poniżej, możesz go zignorować i kontynuować. Ostrzeżenie jest spowodowane starszymi zależnościami. Więcej szczegółów 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ć niewłaściwą aplikację pralki.

$ firebase deploy

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

...

✔ Deploy complete!

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

Aktualizowanie wykresu głównego

Otwórz URL hostingu w przeglądarce (https://<project-id>.firebaseapp.com), aby wyświetlić aplikację internetową. W interfejsie internetowym kliknij przycisk Odśwież ae8d3b25777a5e30.png, aby zaktualizować HomeGraph przez Poproś o synchronizację o najnowsze metadane urządzenia z nieprawidłowej aplikacji pralki:

6f2b1344179977cf.png

Otwórz aplikację Google Home i sprawdź, czy wyświetla się pralka o nazwie Awaria pralki.

e357de6a7faff925.png

3. Przetestuj działanie

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

Sprawdzanie pralki

Sprawdź zmianę wartości po wypróbowaniu jednego z tych poleceń głosowych na telefonie:

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

„OK Google, uruchom pralkę”.

„OK Google, wstrzymaj pralkę”.

„OK Google, wznów pralkę”.

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

Gdy wstrzymasz lub wznowisz działanie pralki, Asystent zareaguje głosowo, że coś jest nie tak:

„Nie udało mi się skontaktować z <wyświetlaną nazwą projektu>”.

Aby debugować ten problem, musisz najpierw uzyskać więcej informacji o błędzie, co pozwoli nam określić jego główną przyczynę.

Panel Analytics Smarthome

Dobrym miejscem do sprawdzania błędów jest panel Analytics Smarthome, który zawiera wykresy wskaźników użytkowania i stanu Twojej realizacji w chmurze:

  • Dane Użycie odzwierciedlają trendy wykorzystania akcji inteligentnego domu, w tym liczbę aktywnych użytkowników dziennie i łączną liczbę żądań związanych z realizacją.
  • Wskaźniki zdrowotne pomagają monitorować wystąpienia anomalii w działaniu inteligentnego domu obejmujące czas oczekiwania na żądanie, odsetek powodzenia i podział błędów.

Aby znaleźć przyczynę błędu, otwórz panel projektu, wykonując opisane niżej czynności.

  1. W konsoli Actions otwórz stronę Projekty.
  2. Wybierz projekt inteligentnego domu.
  3. Wybierz kartę Statystyki i kliknij Otwórz Google Cloud Platform.

b1735bbe11a7aff8.png

  1. Wyświetli się lista paneli Twojego projektu w Google Cloud. Wybierz panel Google Home Analytics – integracja z chmurą.

5edd3751323176dd.png

  1. Przewiń w dół do wykresu Błędy realizacji Cloud Fulfillment – zestawienie stanów, aby wyświetlić kody błędów dla zaznaczonego zakresu czasowego.

c468743c20a11c15.png

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

Dostęp do dzienników zdarzeń dostępu

Aby dowiedzieć się więcej o błędzie, użyj Cloud Logging, aby uzyskać więcej informacji o błędzie.

Otwórz Menu nawigacyjne w Google Cloud Platform i w sekcji Operacje wybierz Logowanie > Eksplorator logów – dostęp do dzienników zdarzeń związanych z projektem. Możesz też wyszukać Eksplorator logów w polu wyszukiwania.

W sekcji Zapytanie wpisz zapytanie PARTNER_RESPONSE_MISSING_DEVICE i kliknij Uruchom. Logi pasujące do zapytania zostaną wyświetlone w sekcji Wyniki zapytania.

747cca0f1249a5a.png

Dziennik błędów pokazuje zdarzenie związane z inteligentnym domem ze szczegółami błędu:

  • Podjęte działanie użytkownika to „wznawianie pralki” (actionType:STARTSTOP_UNPAUSE”), odpowiadający 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 podaje w odpowiedzi EXECUTE odpowiedniego urządzenia.

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

W narzędziu functions/index.js znajdź moduł obsługi EXECUTE (w tablicy onExecute), który zwraca stan każdego polecenia i nowy stan urządzenia. Wstawienie identyfikatorów urządzeń w 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ź jeszcze, jak funkcja updateDevice obsługuje wstrzymywanie i wznawianie działania pralki. okaże się, że ciąg znaków odpowiadający polecenie wstrzymywania/wznawiania 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

Po zidentyfikowaniu głównej przyczyny błędu możesz poprawić ciąg znaków w poleceniu wstrzymywania / wznawiania:

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

Sprawdź rozwiązanie

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

firebase deploy --only functions

Powtórz te polecenia głosowe, a zobaczysz, że Asystent reaguje prawidłowo, gdy wstrzymasz lub wznowisz pralkę.

„OK Google, wstrzymaj pralkę”.

=&gt;

„Jasne, wstrzymuję pralkę”.

„OK Google, wznów pralkę”.

=&gt;

„OK, wznawiam pralkę”.

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

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

„OK Google, czy pralka działa?”

„OK Google, jaki cykl ma teraz włączona pralka?”

4. Testowanie akcji za pomocą pakietu Test Suite

Oprócz ręcznego testowania możesz też korzystać z automatycznego Test Suite dla inteligentnego domu, który umożliwia sprawdzanie przypadków użycia na podstawie typów urządzeń i cech powiązanych z Twoją akcją. Pakiet Test Suite przeprowadza serię testów, aby wykryć problemy w akcji, i wyświetla komunikaty informacyjne dotyczące przypadków zakończonych niepowodzeniem, aby przyspieszyć debugowanie przed przejściem do dzienników zdarzeń.

Uruchom Test Suite dla inteligentnego domu

Aby przetestować inteligentny dom Action by Test Suite, wykonaj te czynności:

  1. W przeglądarce otwórz Test Suite for smart home.
  2. Zaloguj się w Google, klikając przycisk w prawym górnym rogu. Dzięki temu pakiet testów będzie mógł wysyłać polecenia bezpośrednio do Asystenta Google.
  3. W polu Identyfikator projektu wpisz identyfikator projektu akcji dotyczącej inteligentnego domu. Aby kontynuować, kliknij DALEJ.
  4. W kroku Test Settings (Ustawienia testowe) zobaczysz w pakiecie Test Suite typ i cechy pralki.

78ed6a1ebdb581bf.png

  1. Wyłącz opcję Testuj synchronizację, ponieważ przykładowa aplikacja pralki nie ma interfejsu umożliwiającego dodanie, usunięcie lub zmianę nazwy pralki. W systemie produkcyjnym musisz aktywować żądanie synchronizacji za każdym razem, gdy użytkownik doda, usunie lub zmieni nazwę urządzenia.
  2. Aby rozpocząć test, kliknij DALEJ.

Po zakończeniu działania pakietu Test Suite wyświetl wyniki przypadków testowych. Zobaczysz 2 nieudane przypadki testowe z odpowiednim komunikatem o błędzie:

5838d10631c98ed2.png

Aby debugować awarię działania inteligentnego domu, musisz znaleźć główną przyczynę błędu, analizując najpierw komunikat o błędzie.

Analizowanie komunikatu o błędzie

Aby pomóc deweloperom w znalezieniu głównej przyczyny niepowodzenia, w przypadku każdego przypadku testu Suite Test Suite wyświetla komunikaty o błędach, które wskazują jego przyczynę.

W pierwszym przypadku nieudanego testowania powyżej

99e4e5d06965a8a7.png

jego komunikat o błędzie wskazuje, że pakiet Test Suite oczekuje stanu "isPause": true w stanach zgłoszonych przez działanie inteligentnego domu, ale rzeczywiste stany obejmują tylko "isPause": false.

Oprócz tego komunikat o błędzie w drugim przypadku nieudanego testu wskazuje, że stany w odpowiedzi QUERY na działanie inteligentnego domu to "isPause": true. Różni się to od stanu "isPause": false w stanach zgłoszonych przez działanie inteligentnego domu:

fdb5124102e3a37.png

Zgodnie z obydwoma komunikatami o błędach sprawdź, czy raporty działań zawierają prawidłową wartość isPaused.

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

Otwórz aplikację functions/index.js, która zawiera funkcję reportstate, która publikuje zmiany stanu na wykresie głównym za pomocą stanu raportu. Sprawdź ładunek stanu raportu i zauważ, że w ładunku brakuje stanu isPaused, który dokładnie sprawdzał pakiet narzędzi 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: 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 zmień functions/index.js, dodając stan isPaused do ładunku stanu 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,
              },
            },
          },
        },
      };
      ...
    });

Sprawdź rozwiązanie

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

$ firebase deploy --only functions

Ponownie uruchom Test Suite dla inteligentnego domu – okazuje się, że wszystkie przypadki testowe zostały zaliczone.

148837f85d377dd6.png

5. Gratulacje

17d485868a6771bc.png

Gratulacje! Wiesz już, jak rozwiązywać problemy z działaniami w inteligentnym domu za pomocą Test Suite dla Wskaźniki i logowanie GCP.

Więcej informacji

Na bazie tego ćwiczenia z programowania wykonaj poniższe ćwiczenia i zapoznaj się z dodatkowymi materiałami:

Możesz też dowiedzieć się więcej o testowaniu i przesyłaniu akcji do sprawdzenia, w tym o procesie certyfikacji umożliwiającym publikowanie akcji dla użytkowników.