Report State to ważna funkcja, która umożliwia akcji
Google Home proaktywne zgłaszanie najnowszego stanu urządzenia użytkownika do Google Home Graph, zamiast czekać na intencję
QUERY.
Report State zgłasza do Google stany urządzeń użytkowników
z określonym agentUserId powiązanym z tymi urządzeniami (przesyłanym w pierwotnym
SYNC żądaniu). Gdy Google Assistant chce wykonać działanie
które wymaga zrozumienia bieżącego stanu urządzenia, może po prostu sprawdzić
informacje o stanie w Home Graph zamiast
wysyłać intencję QUERY do różnych chmur innych firm przed wysłaniem
EXECUTE intencji.
Bez funkcji Report State w przypadku świateł od różnych dostawców w
salonie polecenie Ok Google, rozjaśnij salon wymaga
rozwiązania wielu intencji QUERY wysyłanych do wielu chmur, a nie tylko
sprawdzenia bieżących wartości jasności na podstawie tego, co zostało
wcześniej zgłoszone. Aby zapewnić jak najlepsze wrażenia użytkownikom,
Assistant musi znać bieżący stan urządzenia,
bez konieczności wysyłania żądania do urządzenia i otrzymywania odpowiedzi.
Po początkowym żądaniu SYNC dotyczącym urządzenia platforma wysyła intencję QUERY
która zbiera stan urządzenia w celu wypełnienia Home Graph.
Od tego momentu Home Graph przechowuje tylko stan, który jest
wysyłany za pomocą Report State.
Podczas wywoływania funkcji Report State pamiętaj, aby podać pełne dane stanu dla danej cechy. Home Graph aktualizuje stany na podstawie poszczególnych cech i zastępuje wszystkie dane dotyczące tej cechy, gdy zostanie wykonane wywołanie funkcji Report State. Jeśli na przykład zgłaszasz
stan cechy StartStop, ładunek
musi zawierać wartości zarówno dla isRunning jak i isPaused.
Rozpocznij
Aby zaimplementować funkcję Report State, wykonaj te czynności:
Włącz interfejs Google HomeGraph API
-
W Google Cloud Console otwórz stronę HomeGraph API.
Otwórz stronę HomeGraph API - Wybierz projekt, który odpowiada identyfikatorowi projektu smart home.
- Kliknij WŁĄCZ.
Utwórz klucz konta usługi
Aby wygenerować klucz konta usługi z Google Cloud Console, wykonaj te instrukcje:
-
W Google Cloud Console otwórz stronę Konta usługi.
Otwórz stronę Konta usługi.Zanim przejdziesz na stronę Konta usługi, może być konieczne wybranie projektu.
Kliknij Utwórz konto usługi.
W polu Nazwa konta usługi wpisz nazwę.
W polu Identyfikator konta usługi wpisz identyfikator.
W polu Opis konta usługi wpisz opis.
Kliknij Utwórz i kontynuuj.
W menu Rola wybierz Konta usługi > Twórca tokenów tożsamości OpenID Connect konta usługi.
Kliknij Dalej.
Kliknij Gotowe.
Na liście kont usługi wybierz utworzone konto usługi i wybierz Zarządzaj kluczami z menu Działania.
Kliknij Dodaj klucz > Utwórz nowy klucz.
W polu Typ klucza wybierz opcję JSON.
Kliknij Utwórz. Na komputer zostanie pobrany plik JSON zawierający klucz.
Wywołaj interfejs API
Wybierz opcję z kart poniżej:
HTTP
Home Graph udostępnia punkt końcowy HTTP.
- Użyj pobranego pliku JSON konta usługi, aby utworzyć token internetowy JSON Token (JWT). Więcej informacji znajdziesz w artykule Uwierzytelnianie za pomocą konta usługi.
- Uzyskaj token dostępu OAuth 2.0 z
https://www.googleapis.com/auth/homegraphzakresem za pomocą oauth2l: - Utwórz żądanie JSON z identyfikatorem
agentUserId. Oto przykładowe żądanie JSON dotyczące funkcji Report State i powiadomienia: - Połącz żądanie JSON dotyczące funkcji Report State i powiadomienia oraz token w żądaniu HTTP POST
do punktu końcowego Home Graph Google. Oto przykład, jak
wysłać żądanie w wierszu poleceń za pomocą
curl, na potrzeby testowania:
oauth2l fetch --credentials service-account.json \ --scope https://www.googleapis.com/auth/homegraph
{ "requestId": "123ABC", "agentUserId": "user-123", "payload": { "devices": { "states": { "light-123": { "on": true } } } } }
curl -X POST -H "Authorization: Bearer ACCESS_TOKEN" \ -H "Content-Type: application/json" \ -d @request-body.json \ "https://homegraph.googleapis.com/v1/devices:reportStateAndNotification"
gRPC
Home Graph udostępnia punkt końcowy gRPC
- Pobierz definicję usługi buforów protokołu dla interfejsu Home Graph API.
- Postępuj zgodnie z dokumentacją dla deweloperów gRPC, aby wygenerować stuby klienta dla jednego z obsługiwanych języków.
- Wywołaj metodę ReportStateAndNotification.
Node.js
- Zainicjuj usługę
google.homegraphza pomocą domyślnego uwierzytelniania aplikacji. - Wywołaj metodę
reportStateAndNotificationza pomocą ReportStateAndNotificationRequest. Zwraca onaPromisez ReportStateAndNotificationResponse.
const homegraphClient = homegraph({ version: 'v1', auth: new GoogleAuth({ scopes: 'https://www.googleapis.com/auth/homegraph' }) }); const res = await homegraphClient.devices.reportStateAndNotification({ requestBody: { agentUserId: 'PLACEHOLDER-USER-ID', requestId: 'PLACEHOLDER-REQUEST-ID', payload: { devices: { states: { "PLACEHOLDER-DEVICE-ID": { on: true } } } } } });
Java
Biblioteka klienta interfejsu HomeGraph API dla języka Java udostępnia powiązania z interfejsem Home Graph API.
- Zainicjuj
HomeGraphApiServiceza pomocą domyślnego uwierzytelniania aplikacji. - Wywołaj metodę
reportStateAndNotificationza pomocąReportStateAndNotificationRequest. Zwraca onaReportStateAndNotificationResponse.
// Get Application Default credentials. GoogleCredentials credentials = GoogleCredentials.getApplicationDefault() .createScoped(List.of("https://www.googleapis.com/auth/homegraph")); // Create Home Graph service client. HomeGraphService homegraphService = new HomeGraphService.Builder( GoogleNetHttpTransport.newTrustedTransport(), GsonFactory.getDefaultInstance(), new HttpCredentialsAdapter(credentials)) .setApplicationName("HomeGraphExample/1.0") .build(); // Build device state payload. Map<?, ?> states = Map.of("on", true); // Report device state. ReportStateAndNotificationRequest request = new ReportStateAndNotificationRequest() .setRequestId("PLACEHOLDER-REQUEST-ID") .setAgentUserId("PLACEHOLDER-USER-ID") .setPayload( new StateAndNotificationPayload() .setDevices( new ReportStateAndNotificationDevice() .setStates(Map.of("PLACEHOLDER-DEVICE-ID", states)))); homegraphService.devices().reportStateAndNotification(request).execute(); }
Testowanie funkcji Report State
Aby przygotować integrację typu Cloud-to-cloud do certyfikacji, musisz przetestować funkcję Report State.
W tym celu zalecamy użycie narzędzia Home Graph Viewer, które jest samodzielną aplikacją internetową i nie wymaga pobierania ani wdrażania.
Panel Report State jest nadal dostępny, ale został wycofany i nie jest już obsługiwany.
Panel Report State
Wymagania wstępne
Aby móc przetestować integrację Cloud-to-cloud, musisz mieć
klucz konta usługi i agentUserId. Jeśli masz już klucz konta usługi i agentUserId przeczytaj artykuł Wdrażanie panelu
Report State Dashboard.
Wdrażanie panelu Report State
Gdy masz już klucz konta usługi i identyfikator agentUserId dla swojego projektu,
pobierz i wdróż najnowszą wersję z
Report State
panelu.
Po pobraniu najnowszej wersji postępuj zgodnie z instrukcjami zawartymi w pliku README.MD.
Po wdrożeniu panelu Report State otwórz go pod tym adresem URL (zastąp your_project_id identyfikatorem projektu):
http://<your-project-id>.appspot.com
W panelu wykonaj te czynności:
- Wybierz plik klucza konta.
- Dodaj identyfikator agentUserId.
Następnie kliknij Lista.
Wyświetli się lista wszystkich Twoich urządzeń. Gdy lista zostanie wypełniona, możesz użyć przycisku Odśwież , aby zaktualizować stany urządzeń. Jeśli stan urządzenia się zmieni, wiersz zostanie podświetlony na zielono.
Rozbieżności w funkcji Report State
Dokładność stanu raportu opartego na zapytaniach określa, jak dobrze najnowszy stan raportu dotyczący urządzenia odpowiada jego stanowi, gdy użytkownik o niego zapyta. Ta wartość powinna wynosić 99,5%. Więcej informacji o bieżącym stanie dokładności funkcji Report State w Twoim projekcie znajdziesz w artykule Stan urządzenia – dokładność stanu. Szczegóły dziennika rozbieżności funkcji Report State możesz też sprawdzić w Eksploratorze logów.
Oto przykład dziennika rozbieżności funkcji Report State:
{
"insertId": "abcdefgh",
"jsonPayload": {
"reportStateLog": {
"result": "INACCURATE",
"detailedAccuracyResult": "DETAILED_ACCURACY_RESULT_INACCURATE",
"isOffline": false,
"queriedTime": "2026-01-17T03:22:01.732938Z",
"reportedTime": "2024-11-30T15:24:34.052751Z",
"agentId": "google-smart-home-agent-id-example",
"requestId": "84920571364829501736",
"queryReportStateDifferences": {
"queryState": "on_off \t {\n on: true\n}\n",
"reportState": "on_off \t {\n on: false\n}\n"
},
"traitName": "TRAIT_ON_OFF",
"snapshotTime": "2026-01-17T03:22:01.732938Z",
"isMissingField": false,
"deviceType": "action.devices.types.OUTLET",
"stateName": "on",
"deviceId": "sample-device-id",
"accuracy": "INACCURATE"
}
},
"resource": {
"type": "assistant_action_project",
"labels": {
"project_id": "google-smart-home-agent-id-example"
}
},
"timestamp": "2026-01-17T07:16:13.712708257Z",
"severity": "ERROR",
"logName": "projects/google-smart-home-agent-id-example/logs/assistant_smarthome%2Fassistant_smarthome_logs",
"receiveTimestamp": "2026-01-17T07:16:13.712708257Z"
}Definicje pól dziennika rozbieżności funkcji Report State
| Nazwa pola | Definicja |
|---|---|
detailedAccuracyResult |
Podsumowanie diagnostyczne wyjaśniające konkretną rozbieżność między ładunkiem funkcji Report State a odpowiedzią na intencję QUERY. |
queriedTime |
Dokładny sygnatura czasowa, kiedy Google otrzymało odpowiedź QUERY od dostawcy realizacji. |
reportedTime |
Dokładny sygnatura czasowa, kiedy Google otrzymało powiadomienie Report State. |
agentId |
Unikalny identyfikator Twojego projektu (zwykle Identyfikator projektu w Google Home Developer Console). |
requestId |
Unikalny identyfikator korelacji powiązany z konkretną odpowiedzią na intencję QUERY. |
queryReportStateDifferences |
Obiekt lub lista wyróżniająca konkretne atrybuty stanu urządzenia, które różnią się między odpowiedzią QUERY a danymi funkcji Report State. |
Zwrócone kody błędów
Podczas wywoływania funkcji Report State możesz otrzymać jedną z tych odpowiedzi o błędzie. Te odpowiedzi mają postać kodów stanu HTTP.
400 Nieprawidłowe żądanie
Serwer nie mógł przetworzyć żądania wysłanego przez klienta z powodu
nieprawidłowej składni. Typowe przyczyny to nieprawidłowy format JSON lub użycie wartości null zamiast "" w przypadku wartości ciągu znaków.
404 Nie znaleziono
Nie udało się znaleźć żądanego zasobu, ale może on być dostępny w przyszłości.
Zwykle oznacza to, że nie możemy znaleźć żądanego urządzenia. Może to też oznaczać, że konto użytkownika nie jest połączone z Google lub że otrzymaliśmy nieprawidłowy identyfikator agentUserId. Upewnij się, że identyfikator agentUserId jest zgodny z wartością podaną w odpowiedzi
SYNC i że prawidłowo obsługujesz intencje
DISCONNECT.
Jeśli wywołanie funkcji ReportState nie powiedzie się z powodu błędu 404 NOT_FOUND, oznacza to, że występuje
niezgodność synchronizacji między Twoją chmurą a Home Graph.
Może się tak zdarzyć, jeśli urządzenie zostanie usunięte z Home Graph lub jeśli
użytkownik odłączy swoje konto.
Aby obsługiwać błędy 404 z funkcji Report State, wykonaj te czynności:
- Sprawdź stan konta użytkownika: wywołaj
devices.syncdla identyfikatoraagentUserId, który zwrócił błąd 404. Pomoże to ustalić, czy błąd dotyczy całego konta użytkownika, czy konkretnego urządzenia.- Jeśli
SYNCzwraca błąd 404, konto użytkownika nie jest już połączone z Google. Przestań wysyłać funkcję Report State i żądaj synchronizacji urządzeń tego użytkownika. - Jeśli
SYNCzwraca 200 OK, konto użytkownika jest nadal połączone, co oznacza, że błąd 404 dotyczy konkretnego urządzenia.
- Jeśli
- Uzgadnianie listy urządzeń: jeśli
SYNCzwraca 200 OK, musisz określić, które urządzenia nie są już znane Google. Zalecamy porównanie listy urządzeń, które Google ma dla użytkownika, z bazą danych urządzeń i zidentyfikowanie urządzeń w Twoim systemie, których nie ma na liście Google. Jeśli urządzenie powinno być zsynchronizowane z Google, ale nie jest jeszcze udostępnione Google, użyjSYNC, aby upewnić się, że urządzenie jest zsynchronizowane z Google. Jeśli urządzenie powinno zostać odłączone od Google, przestań zgłaszać stan tego urządzenia i kontynuuj zgłaszanie stanu innych prawidłowych urządzeń w ramach tego identyfikatoraagentUserId.
Raportowanie stanu online i offline
Gdy urządzenie jest offline, w ciągu 5 minut od jego działania należy zgłosić <code{"online": code="" dir="ltr" false}<="" translate="no"> do Report State. Gdy urządzenie wróci do stanu online, w ciągu 5 minut od jego działania należy zgłosić <code{"online": code="" dir="ltr" translate="no" true}<=""> do Report State. Gdy urządzenie wróci do trybu online, partner powinien zgłosić wszystkie bieżące stany urządzenia za pomocąreportStateAndNotification API.
Ten przykład pokazuje, że urządzenie typu light jest online i zgłasza wszystkie bieżące stany urządzenia.
"requestId": "test-request-id",
"agentUserId": "agent-user-1",
"payload":{
"devices": {
"states": {
"device-id-1": {
"brightness": 65,
"on": true,
"online": true
}
"notifications": {},
}
}
}