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 z Asystentem 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 metryki 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 dowiesz się, jak wdrożyć integrację typu cloud-to-cloud z 2 błędami i połączyć ją z Asystentem, a potem debugować błędy integracji za pomocą pakietu testów dla inteligentnego domu oraz danych i logów 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 domu inteligentnego do identyfikowania problemów z funkcjami i interfejsami API
Czego potrzebujesz
- przeglądarka internetowa, 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 używany 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 inteligentną pralką i monitorowanie jej stanu.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 używanym do programowania. Przejdź do katalogu 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 aplikacji wadliwej 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 <nazwa wyświetlana projektu>”.
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ę aktywnych użytkowników dziennie i łączną liczbę żądań do 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 podane niżej czynności, aby uzyskać dostęp do panelu projektu.
- W Konsoli Play 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 „wznawianie 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śl główną przyczynę 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 działania pralki. 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
Skoro znasz już przyczynę 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 wstrzymanie i wznowienie 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 zestawu 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 Project ID (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ę Test Request Sync (Testuj synchronizację żądań), 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 przypadku testowego, który zakończył się niepowodzeniem,

komunikat o błędzie wskazuje, że pakiet testów oczekuje w stanach zgłaszanych z integracji typu chmura-chmura znaku "isPause": true, ale rzeczywiste stany zawierają tylko znak "isPause": false.
Dodatkowo komunikat o błędzie w drugim nieudanym przypadku testowym 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śl główną przyczynę 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 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: 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ą usług w chmurze za pomocą pakietu testów dla inteligentnego domu oraz pomiarów i logowania w GCP.
Więcej informacji
Wykonaj te ćwiczenia i zapoznaj się z dodatkowymi materiałami, korzystając z tego samouczka:
- 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 danych pomiarowych za pomocą interfejsu API, aby otrzymywać przydatne dane o użyciu integracji.
- Poznaj lokalną realizację zamówień 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.