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.
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
- Przeczytaj przewodnik dla programistów dotyczący tworzenia działania inteligentnego domu.
- Uruchom ćwiczenie w programie dotyczące łączenia inteligentnych urządzeń domowych z Asystentem Google.
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
- Przeglądarka, np. Google Chrome.
- urządzenie z iOS lub Androidem i zainstalowaną aplikacją Google Home;
- Node.js w wersji 10.16 lub nowszej.
- konto rozliczeniowe Google Cloud;
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:
public
: interfejs użytkownika do łatwego kontrolowania i monitorowania stanu inteligentnej pralki.functions
: w pełni wdrożona usługa w chmurze, która zarządza inteligentnym pralką za pomocą Cloud Functions dla Firebase i Bazy danych czasu rzeczywistego Firebase.
Łą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ż, aby zaktualizować HomeGraph za pomocą Poproś o synchronizację o najnowsze metadane urządzenia z nieprawidłowej aplikacji pralki:
Otwórz aplikację Google Home i sprawdź, czy widzisz pralkę o nazwie Wadliwa pralka.
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.
- W Konsoli Actions otwórz stronę Projekty.
- Wybierz projekt inteligentnego domu.
- Wybierz kartę Analytics i kliknij Otwórz Google Cloud Platform.
- Spowoduje to otwarcie listy paneli Twojego projektu w Google Cloud. Wybierz panel Google Home Analytics – integracja z Google Cloud.
- 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.
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.
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:
- W przeglądarce otwórz pakiet testowy do inteligentnego domu.
- 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.
- W polu Identyfikator projektu wpisz identyfikator akcji inteligentnego domu. Następnie kliknij DALEJ, aby kontynuować.
- W kroku Ustawienia testowe zobaczysz listę aplikacji Test Suite z typem i cechami pralki.
- 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.
- 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:
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
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:
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.
5. Gratulacje
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:
- Dodaj do urządzenia więcej obsługiwanych cech i przetestuj je za pomocą Test Suite.
- Twórz panele, konfiguruj alerty i korzystaj z danych wskaźników w sposób zautomatyzowany, aby uzyskiwać przydatne dane o korzystaniu z akcji.
- Dowiedz się więcej o lokalnej realizacji zamówień w przypadku inteligentnego domu.
- Aby dowiedzieć się więcej, zapoznaj się z przykładem na GitHubie.
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.