Debugowanie inteligentnego domu

1. Zanim zaczniesz

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

a4657871181b5ad2.gif

Poznanie narzędzi do debugowania w ramach akcji inteligentnego domu to ważny krok na drodze do integracji jakości produkcji z Asystentem Google. Aby ułatwić monitorowanie i debugowanie, udostępniliśmy Wskaźniki Google Cloud Platform (GCP), Logowanie oraz Pakiet testowy do 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 akcję inteligentnego domu z 2 defektami i połączysz ją z Asystentem, a następnie zdebugujesz defekty za pomocą narzędzia Test Suite dla inteligentnego domu, wskaźników i logowania Google Cloud Platform (GCP).

Czego się nauczysz

  • Jak korzystać ze wskaźników GCP i logowania w celu identyfikowania i rozwiązywania problemów w środowisku produkcyjnym
  • jak używać pakietu Test Suite dla inteligentnego domu do identyfikowania problemów z funkcjonalnością i interfejsem API.

Czego potrzebujesz

2. Uruchom usterkę aplikacji

Pobieranie kodu źródłowego

Kliknij poniższy link, aby pobrać na komputerze przykładowy program do przykładowego ćwiczenia:

Możesz też 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 z Firebase

Otwórz terminal na komputerze, którego używasz do programowania. Przejdź do katalogu washer-faulty, a następnie skonfiguruj interfejs wiersza poleceń Firebase przy użyciu projektu Actions utworzonego w ramach łączenia inteligentnych urządzeń domowych z ćwiczeniami 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ą narzędzia npm.

$ cd functions
$ npm install

Uwaga: jeśli zobaczysz komunikat poniżej, możesz zignorować ten komunikat i kontynuować. Ostrzeżenie jest związane ze 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ć wadliwą aplikację pralki.

$ firebase deploy

Powinny pojawić się te dane wyjściowe konsoli:

...

✔ Deploy complete!

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

Zaktualizuj wykres domowy

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

6f2b1344179977cf.png

Otwórz aplikację Google Home i sprawdź, czy widzisz pralkę o nazwie Wadliwa pralka.

e357de6a7faff925.png

3. Testowanie działania

Po wdrożeniu projektu sprawdź, czy akcja 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 pralkę”.

„OK Google, wznów pralkę”.

„OK Google, zatrzymaj pralkę”.

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

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

Aby debugować ten problem, potrzebujesz więcej informacji o błędzie, które pozwolą Ci określić jego przyczynę.

Panel Analytics Smarthome

Dobrym miejscem do sprawdzania błędów jest panel Smarthome Analytics, w którym znajdują się wykresy danych o użyciu i stanie realizacji zamówień w chmurze:

  • Dane Użycie odzwierciedlają trendy dotyczące korzystania z akcji inteligentnego domu, w tym liczbę aktywnych użytkowników dziennie i łączną liczbę żądań związanych z realizacją.
  • Dane Zdrowie pomagają monitorować występowanie anomalii w działaniu inteligentnym w domu, uwzględniając czas oczekiwania na żądania, 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ę Analytics i kliknij Otwórz Google Cloud Platform.

b1735bbe11a7aff8.png

  1. Spowoduje to otwarcie listy paneli Twojego projektu w Google Cloud. Wybierz panel Google Home Analytics – integracja z Google Cloud.

5edd3751323176dd.png

  1. Przewiń w dół do wykresu Cloud Fulfillment Errors – Status Breakdown (Błędy Cloud Fulfillment Error – Podział stanu), aby wyświetlić kody błędów dla zaznaczonego przedziału czasu.

c468743c20a11c15.png

Kod błędu PARTNER_RESPONSE_MISSING_DEVICE wskazuje główną przyczynę. Aby dowiedzieć się więcej, pobierz dzienniki zdarzeń na podstawie kodu błędu.

Uzyskiwanie dostępu do dzienników zdarzeń

Aby dowiedzieć się więcej o tym błędzie, otwórz Cloud Logging. Dzienniki zdarzeń dotyczące akcji w inteligentnym domu.

Otwórz menu nawigacyjne w Google Cloud Platform i w sekcji Operacje kliknij Logowanie > Eksplorator logów, aby uzyskać dostęp do dzienników zdarzeń dotyczących projektu. Możesz też wyszukać Eksplorator logów w polu wyszukiwania.

W sekcji Zapytanie wpisz 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 zawiera zdarzenie związane z inteligentnym domem ze szczegółami błędu dotyczącymi tych elementów:

  • Wykonane przez użytkownika działanie to „wznowienie prania” (actionType:STARTSTOP_UNPAUSE”), które jest związane z niedawnym nieudanym poleceniem głosowym.
  • Powiązany komunikat do debugowania: „JSON response does not include device.

Po wyświetleniu komunikatu o debugowaniu sprawdź, dlaczego aplikacja pralki nie podaje w odpowiedzi EXECUTE prawidłowego 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. Wstawianie identyfikatorów urządzeń w odpowiedzi EXECUTE zależy od rozpoznania 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ź dokładnie, jak funkcja updateDevice obsługuje wstrzymywanie i wznawianie działania pralki, aby znaleźć nieprawidłowy ciąg znaków pasujący do polecenia wstrzymania/wznowienia:

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

Napraw błąd

Po zidentyfikowaniu głównej przyczyny błędu możesz poprawić ciąg poleceń 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);
};

Testowanie poprawki

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

firebase deploy --only functions

Powtórz te polecenia głosowe, a Asystent będzie reagować prawidłowo, gdy wstrzymasz lub wznowisz działanie pralki.

„OK Google, wstrzymaj pralkę”.

=>

„Jasne, wstrzymuję pralkę”.

„OK Google, wznów pralkę”.

=>

„OK, wznawiam działanie pralki”.

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

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

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

„OK Google, jaki jest cykl pralki?”

4. Testowanie akcji w narzędziu Test Suite

Oprócz testowania ręcznego możesz użyć zautomatyzowanego pakietu Test Suite dla inteligentnego domu, który pozwala zweryfikować przypadki użycia na podstawie typów urządzeń i cech powiązanych z Twoją akcją. Pakiet testowy przeprowadza serię testów, aby wykryć problemy w akcji, i wyświetla komunikaty dotyczące nieudanych testów, aby przyspieszyć debugowanie przed zagłębieniem się w dzienniki zdarzeń.

Uruchom Test Suite dla inteligentnego domu

Aby przetestować działanie inteligentnego domu Action by Test Suite, wykonaj te czynności:

  1. W przeglądarce otwórz pakiet testowy do inteligentnego domu.
  2. Zaloguj się w Google za pomocą przycisku w prawym górnym rogu. Dzięki temu pakiet Test Suite będzie mógł wysyłać polecenia bezpośrednio do Asystenta Google.
  3. W polu Identyfikator projektu wpisz identyfikator akcji inteligentnego domu. Następnie kliknij DALEJ, aby kontynuować.
  4. W kroku Ustawienia testowe zobaczysz listę aplikacji Test Suite z typem i cechami pralki.

78ed6a1ebdb581bf.png

  1. Wyłącz opcję Testuj synchronizację żądań, 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 dodaje urządzenia, usuwa je lub zmienia ich nazwy.
  2. Aby rozpocząć test, kliknij DALEJ.

Gdy pakiet Test Suite zakończy działanie, wyświetl wyniki przypadków testowych. Zobaczysz 2 nieudane testy z odpowiednim komunikatem o błędzie:

5838d10631c98ed2.png

Aby debugować akcję w inteligentnym domu pod kątem błędu, musisz najpierw przeanalizować komunikat o błędzie, aby określić jego główną przyczynę.

Analiza komunikatu o błędzie

Aby pomóc deweloperom w zidentyfikowaniu głównej przyczyny, pakiet Test Suite wyświetla komunikaty o błędach w każdym przypadku zakończonym niepowodzeniem, które wskazują przyczyny niepowodzenia.

W przypadku pierwszego niezaliczonego przypadku testowego powyżej

99e4e5d06965a8a7.png

komunikat o błędzie oznacza, że pakiet Test Suite oczekuje wartości "isPause": true w stanach raportowanych przez działanie w inteligentnym domu, a rzeczywiste stany to tylko "isPause": false.

Dodatkowo drugi komunikat o błędzie w przypadku błędu testowego wskazuje, że stan w odpowiedzi QUERY z akcji inteligentnego domu obejmuje stan "isPause": true, który różni się od "isPause": false w stanach zgłoszonych jako działanie inteligentnego domu:

fdb5124102e3a37.png

Pojawią się one w obu komunikatach o błędach i sprawdź, czy w raportach akcji podana jest poprawna wartość parametru isPaused.

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

Otwórz functions/index.js, który zawiera funkcję reportstate, która za pomocą stanu raportu publikuje zmiany stanu na głównym wykresie. Sprawdź ładunek stanu raportu, a zauważysz, że w ładunku brakuje stanu isPaused, który był sprawdzany przez pakiet Test Suite 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,
      });
      ...
    });

Napraw błąd

Po znalezieniu głównej przyczyny błędu sprawdź 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,
              },
            },
          },
        },
      };
      ...
    });

Testowanie poprawki

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

$ firebase deploy --only functions

Ponownie uruchom pakiet Test Suite dla inteligentnego domu i sprawdź, czy 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 dzięki narzędziu Test Suite dla inteligentnego domu oraz wskaźników i logowania GCP.

Więcej informacji

Nawiązując do tych ćwiczeń z programowania, wypróbuj te ć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 w celu publikowania go użytkownikom.