1. Zanim zaczniesz
Jako deweloper Internetu Rzeczy (IoT) możesz tworzyć integracje typu chmura-chmura, które umożliwiają użytkownikom sterowanie urządzeniami za pomocą elementów sterujących dotykowych w aplikacji Google Home i poleceń głosowych wydawanych Asystentowi Google.

Poznanie narzędzi do debugowania integracji typu cloud-to-cloud jest ważnym krokiem w budowaniu integracji z Asystentem Google o jakości produkcyjnej. Aby ułatwić monitorowanie i debugowanie, udostępniamy wskaźniki Google Cloud Platform (GCP), rejestrowanie i pakiet testów dla inteligentnego domu, które pomogą Ci identyfikować i rozwiązywać problemy z integracjami.
Wymagania wstępne
- Przeczytaj przewodnik dla deweloperów Tworzenie integracji typu chmura-chmura
- Uruchom samouczek dotyczący łączenia inteligentnych urządzeń domowych z Asystentem Google
Co utworzysz
W tym module utworzysz integrację typu chmura-chmura z 2 błędami i połączysz ją z Asystentem. Następnie debugujesz błędy integracji za pomocą pakietu testów dla inteligentnego domu oraz statystyk i logowania Google Cloud Platform (GCP).
Czego się nauczysz
- Jak używać danych i logów GCP do identyfikowania i rozwiązywania problemów produkcyjnych
- Jak używać pakietu testów dla inteligentnego domu do identyfikowania problemów z funkcjami i interfejsami API
Czego potrzebujesz
- przeglądarka, np. Google Chrome;
- Urządzenie z iOS lub Androidem z zainstalowaną aplikacją Google Home
- Node.js w wersji 10.16 lub nowszej
- konto rozliczeniowe Google Cloud;
2. Uruchom wadliwą aplikację
Pobieranie kodu źródłowego
Kliknij ten link, aby pobrać na komputer, którego używasz do programowania, przykładowy kod do tego laboratorium:
…lub możesz 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, który umożliwia łatwe sterowanie stanem inteligentnej pralki i jego monitorowanie.functions: w pełni wdrożona usługa w chmurze, która zarządza inteligentną pralką za pomocą Cloud Functions dla Firebase i Bazy danych czasu rzeczywistego Firebase.
Łączenie Analytics z Firebase
Otwórz terminal na komputerze deweloperskim. Otwórz katalog washer-faulty, a potem skonfiguruj interfejs wiersza poleceń Firebase za pomocą projektu integracji utworzonego w samouczku dotyczącym łączenia inteligentnych urządzeń domowych 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ą polecenia npm..
$ cd functions $ npm install
Uwaga: jeśli zobaczysz poniższy komunikat, możesz go zignorować i kontynuować. Ostrzeżenie jest spowodowane 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 obsługi wadliwej pralki.
$ firebase deploy
Oto dane wyjściowe, które powinny się wyświetlić w konsoli:
... ✔ 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ż
, aby zaktualizować HomeGraph o najnowsze metadane urządzenia z wadliwej aplikacji do obsługi pralki za pomocą Request Sync.

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

3. Testowanie integracji
Po wdrożeniu projektu sprawdź, czy integracja 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 pranie”.
„OK Google, wznów pranie”.
„OK Google, zatrzymaj pralkę”
Gdy wstrzymasz lub wznowisz pranie, Asystent odpowie głosowo, że coś jest nie tak:
„Nie udało mi się połączyć z projektem <project display name>”.
Aby rozwiązać ten problem, musisz najpierw uzyskać więcej informacji o błędzie, aby zawęzić zakres i zidentyfikować jego główną przyczynę.
Panel Smarthome Analytics
Dobrym miejscem do sprawdzania błędów jest panel Smarthome Analytics, który zawiera zagregowane wykresy danych o użyciu i stanie w przypadku realizacji w chmurze:
- Dane Użycie odzwierciedlają trend użycia integracji typu „chmura do chmury”, w tym liczbę dziennych aktywnych użytkowników i łączną liczbę żądań do usługi realizacji.
- Wskaźniki Stan pomagają monitorować występowanie anomalii w integracji typu chmura-chmura, obejmując opóźnienie żądań, odsetek sukcesów i podział błędów.
Aby zawęzić przyczynę błędu, wykonaj poniższe czynności, aby uzyskać dostęp do panelu projektu.
- W Developer Console otwórz stronę Projekty.
- Wybierz projekt inteligentnego domu.
- W menu po lewej stronie kliknij kartę Statystyki.

- Spowoduje to wyświetlenie listy paneli w Twoim projekcie w Google Cloud. Wybierz panel Google Home Analytics – integracja z chmurą.

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

Kod błędu PARTNER_RESPONSE_MISSING_DEVICE wskazuje główną przyczynę problemu. 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, otwórz dzienniki zdarzeń integracji typu chmura-chmura za pomocą Cloud Logging.
Otwórz menu nawigacyjne w Google Cloud Platform i w sekcji Operacje wybierz Logowanie > Eksplorator logów, aby uzyskać dostęp do logów zdarzeń w projekcie. Możesz też wyszukać Eksplorator logów w polu wyszukiwania.
W polu Wyszukaj we wszystkich polach wpisz zapytanie PARTNER_RESPONSE_MISSING_DEVICE i kliknij Uruchom zapytanie. Logi pasujące do zapytania zostaną wyświetlone w sekcji Wyniki.

W dzienniku błędów widać zdarzenie dotyczące inteligentnego domu ze szczegółami błędu wskazującymi:
- Działanie użytkownika to „wznowienie prania” (
actionType:„STARTSTOP_UNPAUSE”), co odpowiada 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 zawiera prawidłowego urządzenia w odpowiedzi EXECUTE.
Określanie głównej przyczyny błędu
W 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ń do EXECUTEodpowiedzi zależy od rozwiązania updateDevicefunkcji:
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 wstrzymywanie i wznawianie prania, a zobaczysz, że ciąg znaków, który ma pasować do polecenia wstrzymania lub 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':
const data = await queryDevice(deviceId);
state = (data.isPaused === false && data.isRunning === false)
? {isRunning: false, isPaused: false}
: {isRunning: !params.pause, isPaused: params.pause};
ref = getFirebaseRef().child(deviceId).child('StartStop');
break;
}
return ref.update(state)
.then(() => state);
};
Naprawianie błędu
Po ustaleniu przyczyny błędu możesz poprawić ciąg znaków dla polecenia wstrzymania lub wznowienia:
index.js
const updateDevice = async (execution, deviceId) => {
const {params, command} = execution;
let state; let ref;
switch (command) {
...
case 'action.devices.commands.PauseUnpause':
const data = await queryDevice(deviceId);
state = (data.isPaused === false && data.isRunning === false)
? {isRunning: false, isPaused: false}
: {isRunning: !params.pause, isPaused: params.pause};
ref = getFirebaseRef().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
Spróbuj ponownie użyć tych poleceń głosowych. Asystent powinien teraz prawidłowo reagować na polecenia wstrzymania i wznowienia prania.
„OK Google, wstrzymaj pranie”.
=>
„Jasne, wstrzymuję pranie”.
„OK Google, wznów pranie”.
=>
„OK, wznawiam pranie”.
Możesz też sprawdzić aktualny stan pralki, zadając pytania.
„OK Google, czy pralka jest włączona?”
„OK Google, czy pralka działa?”
„OK Google, w jakim cyklu pracuje pralka?”
4. Testowanie integracji za pomocą pakietu testów
Oprócz testowania ręcznego możesz użyć automatycznego pakietu testów dla inteligentnego domu, aby sprawdzić przypadki użycia na podstawie typów urządzeń i cech powiązanych z integracją. Pakiet testów przeprowadza serię testów, aby wykryć problemy z integracją, i wyświetla informacyjne komunikaty o nieudanych przypadkach testowych, aby przyspieszyć debugowanie przed przejrzeniem dzienników zdarzeń.
Uruchamianie pakietu testów dla inteligentnego domu
Aby przetestować integrację typu „chmura do chmury” za pomocą pakietu testowego, wykonaj te czynności:
- W przeglądarce otwórz pakiet testów dla inteligentnego domu.
- Zaloguj się w Google, klikając przycisk w prawym górnym rogu. Dzięki temu pakiet testowy może wysyłać polecenia bezpośrednio do Asystenta Google.
- W polu Identyfikator projektu wpisz identyfikator projektu integracji typu Cloud-to-Cloud. Następnie kliknij DALEJ, aby kontynuować.
- Na etapie Ustawienia testu na liście Test Suite zobaczysz typ urządzenia i cechy pralki.

- Wyłącz opcję Synchronizacja żądania testowego, ponieważ przykładowa aplikacja do pralki nie ma interfejsu, który umożliwiałby dodawanie, usuwanie ani zmienianie nazwy pralki. W systemie produkcyjnym musisz wywoływać Request Sync (Poproś o synchronizację) za każdym razem, gdy użytkownik dodaje, usuwa lub zmienia nazwy urządzeń.
- Aby rozpocząć test, kliknij DALEJ.
Po zakończeniu działania pakietu testów wyświetl wyniki przypadków testowych. Zauważysz 2 przypadki testowe, które zakończyły się niepowodzeniem, wraz z odpowiednimi komunikatami o błędach:

Aby debugować integrację typu „chmura do chmury” w przypadku błędu, musisz najpierw przeanalizować komunikat o błędzie, aby zidentyfikować jego główną przyczynę.
Analizowanie komunikatu o błędzie
Aby pomóc deweloperom w określeniu głównej przyczyny problemu, pakiet testów wyświetla komunikaty o błędach dla każdego nieudanego przypadku testowego, które wskazują przyczynę niepowodzenia.
W przypadku pierwszego nieudanego przypadku testowego powyżej

komunikat o błędzie wskazuje, że pakiet testów oczekuje w stanach zgłaszanych z integracji typu cloud-to-cloud wartości "isPause": true, ale rzeczywiste stany zawierają tylko "isPause": false.
Dodatkowo komunikat o błędzie drugiego nieudanego przypadku testowego wskazuje, że stany w QUERY odpowiedzi z integracji typu chmura-chmura obejmują "isPause": true, co różni się od "isPause": false w stanach zgłaszanych przez integrację typu chmura-chmura:

Zgodnie z treścią obu komunikatów o błędach należy sprawdzić, czy raporty integracji zawierają stan isPaused z prawidłową wartością.
Określanie głównej przyczyny błędu
Otwórz plik functions/index.js, który zawiera funkcję reportstate publikującą zmiany stanu w Home Graph za pomocą funkcji Report State. Sprawdź ładunek stanu raportu. Zobaczysz, że brakuje w nim stanu isPaused, czyli dokładnie tego, co pakiet testowy sprawdzał w przypadku testów, które zakończyły się niepowodzeniem.
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: snapshot.online,
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 ustaleniu głównej przyczyny błędu zmień functions/index.js, dodając do ładunku Report State stan isPaused:
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: snapshot.online,
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 pakiet testów dla inteligentnego domu. Zobaczysz, że wszystkie przypadki testowe zostały zaliczone.

5. Gratulacje

Gratulacje! Udało Ci się rozwiązać problemy z integracją typu cloud-to-cloud za pomocą pakietu testowego dla inteligentnego domu oraz danych i logów GCP.
Więcej informacji
Na podstawie tych ćwiczeń z programowania wykonaj poniższe zadania i zapoznaj się z dodatkowymi materiałami:
- Dodaj do urządzenia więcej obsługiwanych cech i przetestuj je za pomocą pakietu testowego.
- Twórz panele, konfiguruj alerty i uzyskuj dostęp do danych o wskaźnikach za pomocą interfejsu API, aby otrzymywać przydatne dane o użyciu integracji.
- Dowiedz się więcej o lokalnej realizacji w przypadku inteligentnego domu.
- Więcej informacji znajdziesz w naszym przykładzie w GitHubie.
Możesz też dowiedzieć się więcej o testowaniu i przesyłaniu integracji do sprawdzenia, w tym o procesie certyfikacji, który umożliwia opublikowanie integracji dla użytkowników.