Report State là một tính năng quan trọng cho phép Hành động
Google Home chủ động báo cáo trạng thái mới nhất của thiết bị người dùng cho Google Home Graph thay vì chờ ý định
QUERY.
Report State báo cáo cho Google trạng thái của các thiết bị người dùng
có agentUserId được chỉ định liên kết với các thiết bị đó (được gửi trong yêu cầu
SYNC ban đầu). Khi Google Assistant muốn thực hiện một hành động
đòi hỏi phải hiểu trạng thái hiện tại của thiết bị, nó có thể chỉ cần tra cứu
thông tin trạng thái trong Home Graph thay vì
gửi ý định QUERY đến nhiều đám mây của bên thứ ba trước khi gửi
EXECUTE ý định.
Nếu không có Report State, khi có đèn của nhiều nhà cung cấp trong
phòng khách, lệnh Ok Google, tăng độ sáng trong phòng khách sẽ yêu cầu
giải quyết nhiều ý định QUERY được gửi đến nhiều đám mây, thay vì
chỉ tra cứu các giá trị độ sáng hiện tại dựa trên những gì đã được
báo cáo trước đó. Để mang lại trải nghiệm tốt nhất cho người dùng,
Assistant cần có trạng thái hiện tại của thiết bị,
mà không cần phải thực hiện một chuyến khứ hồi đến thiết bị.
Sau lần SYNC ban đầu cho một thiết bị, nền tảng sẽ gửi ý định QUERY
thu thập trạng thái của thiết bị để điền vào Home Graph.
Sau thời điểm đó, Home Graph chỉ lưu trữ trạng thái được
gửi bằng Report State.
Khi gọi Report State, hãy nhớ cung cấp dữ liệu trạng thái đầy đủ
cho một đặc điểm nhất định. Home Graph cập nhật trạng thái theo
từng đặc điểm và ghi đè tất cả dữ liệu cho đặc điểm đó khi thực hiện lệnh gọi
Report State được thực hiện. Ví dụ: nếu bạn đang báo cáo
trạng thái cho đặc điểm StartStop, thì tải trọng
cần bao gồm các giá trị cho cả isRunning và isPaused.
Bắt đầu
Để triển khai Report State, hãy làm theo các bước sau:
Bật Google HomeGraph API
-
Trong Google Cloud Console, hãy chuyển đến trang HomeGraph API.
Chuyển đến trang HomeGraph API - Chọn dự án khớp với mã dự án smart home của bạn.
- Nhấp vào BẬT.
Tạo khoá tài khoản dịch vụ
Làm theo các hướng dẫn sau để tạo khoá tài khoản dịch vụ trong Google Cloud Console:
-
Trong Google Cloud Console, hãy chuyển đến trang Tài khoản dịch vụ.
Chuyển đến trang Tài khoản dịch vụ.Bạn có thể cần chọn một dự án trước khi được chuyển đến trang Tài khoản dịch vụ.
Nhấp vào Tạo tài khoản dịch vụ.
Trong trường Tên tài khoản dịch vụ, hãy nhập tên.
Trong trường Mã tài khoản dịch vụ, hãy nhập mã.
Trong trường Nội dung mô tả tài khoản dịch vụ, hãy nhập nội dung mô tả.
Nhấp vào Tạo và tiếp tục.
Trong trình đơn thả xuống Vai trò, hãy chọn Tài khoản dịch vụ > Trình tạo mã thông báo danh tính OpenID Connect cho tài khoản dịch vụ.
Nhấp vào Tiếp tục.
Nhấp vào Xong.
Chọn tài khoản dịch vụ bạn vừa tạo trong danh sách tài khoản dịch vụ rồi chọn Quản lý khoá trong trình đơn Hành động.
Chọn Thêm khoá > Tạo khoá mới.
Đối với Loại khoá, hãy chọn tuỳ chọn JSON.
Nhấp vào Tạo. Tệp JSON chứa khoá của bạn sẽ tải xuống máy tính của bạn.
Gọi API
Chọn một tuỳ chọn trong các thẻ bên dưới:
HTTP
Home Graph cung cấp một điểm cuối HTTP
- Sử dụng tệp JSON tài khoản dịch vụ đã tải xuống để tạo Mã thông báo web JSON Token (JWT). Để biết thêm thông tin, hãy xem bài viết Xác thực bằng tài khoản dịch vụ.
- Lấy mã truy cập OAuth 2.0 có phạm vi
https://www.googleapis.com/auth/homegraphbằng oauth2l: - Tạo yêu cầu JSON bằng
agentUserId. Dưới đây là yêu cầu JSON mẫu cho Trạng thái báo cáo và Thông báo: - Kết hợp JSON Trạng thái báo cáo và Thông báo với mã thông báo trong yêu cầu HTTP POST
đến điểm cuối Home Graph của Google. Dưới đây là ví dụ về cách
thực hiện yêu cầu trong dòng lệnh bằng
curlđể kiểm thử:
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 cung cấp một điểm cuối gRPC
- Tải định nghĩa dịch vụ bộ đệm giao thức cho Home Graph API.
- Làm theo tài liệu dành cho nhà phát triển gRPC để tạo các đoạn mã ứng dụng cho một trong các ngôn ngữ được hỗ trợ.
- Gọi phương thức ReportStateAndNotification.
Node.js
Ứng dụng Node.js của Google API cung cấp các liên kết cho Home Graph API.
- Khởi chạy dịch vụ
google.homegraphbằng Thông tin xác thực mặc định của ứng dụng. - Gọi phương thức
reportStateAndNotificationbằng ReportStateAndNotificationRequest. Phương thức này trả về mộtPromisebằng 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
Thư viện ứng dụng HomeGraph API cho Java cung cấp các liên kết cho Home Graph API.
- Khởi chạy
HomeGraphApiServicebằng Thông tin xác thực mặc định của ứng dụng. - Gọi phương thức
reportStateAndNotificationbằngReportStateAndNotificationRequest. Phương thức này trả về mộtReportStateAndNotificationResponse.
// 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(); }
Kiểm thử Trạng thái báo cáo
Để chuẩn bị cho bản tích hợp Cloud-to-cloud được chứng nhận, bạn cần kiểm thử Report State.
Để làm việc này, bạn nên sử dụng công cụ Trình xem Home Graph, đây là một ứng dụng web độc lập không yêu cầu tải xuống hoặc triển khai.
Trang tổng quan Report State vẫn có sẵn, nhưng đã ngừng hoạt động và không còn được hỗ trợ.
Trang tổng quan Trạng thái báo cáo
Điều kiện tiên quyết
Trước khi có thể kiểm thử bản tích hợp Cloud-to-cloud, bạn cần có
Khoá tài khoản dịch vụ và agentUserId. Nếu bạn đã có
Khoá tài khoản dịch vụ và agentUserId hãy xem Triển khai
Report State Trang tổng quan.
Triển khai trang tổng quan Trạng thái báo cáo
Sau khi có Khoá tài khoản dịch vụ và Mã người dùng đại lý cho dự án của bạn,
hãy tải xuống và triển khai phiên bản mới nhất từ
Report State
Trang tổng quan.
Sau khi tải phiên bản mới nhất xuống, hãy làm theo hướng dẫn trong tệp README.MD đi kèm.
Sau khi triển khai trang tổng quan Report State, hãy truy cập vào trang tổng quan đó theo URL sau (thay your_project_id bằng mã dự án của bạn):
http://<your-project-id>.appspot.com
Trên trang tổng quan, hãy làm như sau:
- Chọn Tệp khoá tài khoản
- Thêm agentUserId
Sau đó, hãy nhấp vào List (Danh sách).
Tất cả thiết bị của bạn đều được liệt kê. Sau khi danh sách được điền, bạn có thể sử dụng nút Refresh (Làm mới) để cập nhật trạng thái thiết bị. Nếu có thay đổi về trạng thái thiết bị, hàng đó sẽ được đánh dấu màu xanh lục.
Sự khác biệt về Trạng thái báo cáo
Độ chính xác của trạng thái báo cáo dựa trên truy vấn đo lường mức độ khớp giữa trạng thái báo cáo mới nhất của thiết bị và trạng thái của thiết bị khi người dùng truy vấn trạng thái đó. Giá trị này dự kiến là 99,5%. Để biết thêm thông tin chi tiết về trạng thái hiện tại của Độ chính xác của trạng thái báo cáo của dự án, hãy xem Tình trạng thiết bị – Độ chính xác của trạng thái. Bạn cũng có thể xem thông tin chi tiết về Nhật ký sự khác biệt về trạng thái báo cáo trong Trình khám phá nhật ký.
Dưới đây là ví dụ về Nhật ký sự khác biệt về trạng thái báo cáo:
{
"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"
}Định nghĩa các trường trong Nhật ký sự khác biệt về trạng thái báo cáo
| Tên trường | Định nghĩa |
|---|---|
detailedAccuracyResult |
Tóm tắt chẩn đoán giải thích sự khác biệt cụ thể giữa tải trọng Trạng thái báo cáo và phản hồi ý định QUERY. |
queriedTime |
Dấu thời gian chính xác khi Google nhận được phản hồi QUERY từ nhà cung cấp dịch vụ thực hiện. |
reportedTime |
Dấu thời gian chính xác khi Google nhận thành công thông báo Trạng thái báo cáo. |
agentId |
Giá trị nhận dạng riêng biệt của dự án (thường là Mã dự án trong Google Home Developer Console). |
requestId |
Mã tương quan riêng biệt được liên kết với phản hồi ý định QUERY cụ thể. |
queryReportStateDifferences |
Một đối tượng hoặc danh sách làm nổi bật các thuộc tính trạng thái thiết bị cụ thể khác nhau giữa phản hồi QUERY và dữ liệu Trạng thái báo cáo. |
Phản hồi báo lỗi
Bạn có thể nhận được một trong các phản hồi báo lỗi sau đây khi gọi Report State. Các phản hồi này có dạng mã trạng thái HTTP.
400 Yêu cầu không hợp lệ
Máy chủ không xử lý được yêu cầu do ứng dụng gửi vì
cú pháp không hợp lệ. Các nguyên nhân thường gặp bao gồm JSON không hợp lệ hoặc sử dụng null thay vì "" cho giá trị chuỗi.
404 Không tìm thấy
Không tìm thấy tài nguyên được yêu cầu nhưng có thể sẽ có trong tương lai.
Thông thường, điều này có nghĩa là chúng tôi không tìm thấy thiết bị được yêu cầu. Điều này cũng có thể có nghĩa là tài khoản người dùng không được liên kết với Google hoặc chúng tôi nhận được agentUserId không hợp lệ. Đảm bảo rằng agentUserId khớp với giá trị được cung cấp trong phản hồi
SYNC và bạn đang xử lý đúng cách các ý định
DISCONNECT.
Khi lệnh gọi ReportState không thành công với lỗi 404 NOT_FOUND, điều này cho biết có sự không khớp về quá trình đồng bộ hoá giữa đám mây của bạn và Home Graph.
Điều này có thể xảy ra nếu một thiết bị bị xoá khỏi Home Graph hoặc nếu
người dùng huỷ liên kết tài khoản của họ.
Để xử lý các lỗi 404 từ Trạng thái báo cáo, hãy làm theo quy trình sau:
- Kiểm tra trạng thái tài khoản người dùng: Gọi
devices.syncchoagentUserIdtrả về lỗi 404. Điều này giúp xác định xem lỗi này là cho toàn bộ tài khoản người dùng hay một thiết bị cụ thể.- Nếu
SYNCtrả về lỗi 404, thì tài khoản người dùng không còn được liên kết với Google nữa. Ngừng gửi Trạng thái báo cáo và Yêu cầu đồng bộ hoá cho các thiết bị của người dùng này. - Nếu
SYNCtrả về 200 OK, thì tài khoản người dùng vẫn được liên kết, nghĩa là lỗi 404 là dành riêng cho thiết bị.
- Nếu
- Điều chỉnh danh sách thiết bị: Nếu
SYNCtrả về 200 OK, bạn cần xác định những thiết bị không còn được Google biết đến. Bạn nên so sánh danh sách thiết bị mà Google có cho người dùng với cơ sở dữ liệu thiết bị của bạn và xác định các thiết bị trong hệ thống của bạn không có trong danh sách của Google. Nếu một thiết bị cần được đồng bộ hoá với Google nhưng chưa được chia sẻ với Google, hãy sử dụngSYNCđể đảm bảo thiết bị đó được đồng bộ hoá với Google. Nếu một thiết bị cần được huỷ liên kết với Google, hãy ngừng báo cáo trạng thái cho thiết bị cụ thể đó và tiếp tục báo cáo cho các thiết bị hợp lệ khác trongagentUserIdđó.
Báo cáo trạng thái trực tuyến và ngoại tuyến
Khi thiết bị ngoại tuyến, bạn nên báo cáo <code{"online": code="" dir="ltr" false}<="" translate="no"> cho Trạng thái báo cáo trong vòng 5 phút kể từ khi thiết bị hoạt động. Ngược lại, khi thiết bị chuyển về trạng thái trực tuyến, bạn nên báo cáo <code{"online": code="" dir="ltr" translate="no" true}<=""> cho Trạng thái báo cáo trong vòng 5 phút kể từ khi thiết bị hoạt động. Bất cứ khi nào một thiết bị trực tuyến trở lại, đối tác phải báo cáo tất cả trạng thái hiện tại của thiết bị bằng APIreportStateAndNotification.
Ví dụ này cho thấy loại thiết bị light đang trực tuyến và báo cáo tất cả trạng thái hiện tại của thiết bị.
"requestId": "test-request-id",
"agentUserId": "agent-user-1",
"payload":{
"devices": {
"states": {
"device-id-1": {
"brightness": 65,
"on": true,
"online": true
}
"notifications": {},
}
}
}