啟用通知後,你就可以透過「smart home」採取行動 Google Assistant,向使用者傳達重要訊息 裝置相關事件或變更可實作通知 使用者能及時收到裝置事件,例如有人來門,或 回報要求的裝置狀態變更,例如門鎖門鎖 或已卡住
您的「smart home」動作可傳送下列類型 通知使用者:
主動通知:通知 smart home 的使用者 且使用者未向其裝置提出要求,例如 門鈴聲。
後續回應回應:裝置指令要求確認訊息 成功或失敗 (例如鎖門時)。這些快訊用於 需要一段時間才能完成的裝置指令只在 透過智慧音箱和智慧型揚聲器傳送裝置指令要求時支援 螢幕。
Assistant 會透過以下方式向使用者發送這類通知: 。主動通知 預設為關閉狀態 使用者可以選擇開啟或關閉所有主動通知, Google Home app (GHA)。
觸發通知的事件
發生裝置事件時,您的動作執行要求會傳送通知要求 Google。smart home 動作的裝置特徵 支援會判斷可用的通知事件類型及 還可納入這些通知的資料
以下特徵支援主動通知:
特徵 | 活動 |
---|---|
ObjectDetection | 裝置偵測到的物體,例如偵測到的臉孔 。例如:「小艾和小明在前門。」 |
RunCycle | 裝置完成循環。例如:"洗衣機循環 更新作業完成。」 |
SensorState | 裝置偵測到支援的感應器狀態。例如: 「煙霧偵測器偵測到煙霧」 |
下列特徵支援後續回覆:
特徵 | 活動 |
---|---|
LockUnlock | 在執行下列步驟後,完成狀態和狀態會改變
action.devices.commands.LockUnlock 裝置指令。適用對象
例如:「前門已上鎖」或「前門卡住了」。
|
NetworkControl | 在執行下列步驟後,完成狀態和狀態會改變
action.devices.commands.TestNetworkSpeed 裝置指令。適用對象
例如:"網路速度測試已完成。下載速度
辦公室路由器目前為 80.2 Kbps,上傳速度為 9.3 Kbps。"
|
OpenClose | 在執行下列步驟後,完成狀態和狀態會改變
action.devices.commands.OpenClose 裝置指令。適用對象
例如:「前門已開啟」或「無法打開前門」。
|
所有裝置類型都支援適用特徵的通知。
建立智慧型住宅動作的通知
請在下列階段為「smart home」動作新增通知:
- 指示 Google 在以下裝置上啟用通知:
smart home 個裝置應用程式。如果使用者開啟或關閉通知
在應用程式中傳送
SYNC
要求,將裝置變更通知 Google。 - 發生相關裝置事件或狀態變更,進而觸發
通知、呼叫
Report State
reportStateAndNotification
API。如果 裝置狀態已變更,您可以傳送狀態和通知酬載 Report State與「通知」通話一同顯示。
下列章節將詳細說明上述步驟。
指出應用程式是否已啟用通知功能
使用者可選擇是否接收主動通知,包括: 可在 GHA 中啟用此功能。在您的應用程式中 smart home 裝置,您也可以選擇新增 使用者可以從裝置上明確切換通知,例如從 應用程式設定中。
如要向 Google 說明你的裝置已啟用通知功能,請進行以下操作:
Request SYNC 呼叫
更新裝置資料。您應該傳送像這樣的 SYNC
要求:
使用者在您的應用程式中變更這項設定。
在 SYNC
回應中,傳送以下其中一種更新:
- 使用者在您的裝置應用程式中明確開啟通知功能,或
不提供切換選項,請將
devices.notificationSupportedByAgent
屬性設為true
。 - 如果使用者在裝置應用程式中明確關閉了通知功能,請設定
devices.notificationSupportedByAgent
屬性設為false
。
以下程式碼片段示範如何設定 SYNC 回應:
devices: [{
id: 'device123',
...
notificationSupportedByAgent: true,
}]
傳送通知要求給 Google
如要在 Assistant 觸發通知,請 執行要求會將通知酬載傳送至 Google Home Graph 透過 Report State 和 Notification API 呼叫傳送。
啟用 Google HomeGraph API
-
前往 Google Cloud Console 中的「HomeGraph API」頁面。
前往 HomeGraph API 頁面 - 選取 smart home 專案 ID 相符的專案。
- 按一下「ENABLE」(啟用)。
建立服務帳戶金鑰
請按照下列操作說明,從 Google Cloud Console 產生服務帳戶金鑰:
-
前往 Google Cloud Console 的「Create service account key」(建立服務帳戶金鑰) 頁面。
前往「Create Service Account Key」(建立服務帳戶金鑰) 頁面。 - 在「服務帳戶」清單中,選取 新增服務帳戶:
- 在 [Service account name] (服務帳戶名稱) 欄位中輸入一個名稱。
- 在「服務帳戶 ID」欄位中輸入 ID。
在「角色」清單中,選取「服務帳戶」> 服務帳戶權杖建立者:
在「Key type」(金鑰類型) 部分,選取「JSON」選項。
- 點選「建立」。包含金鑰的 JSON 檔案 下載至您的電腦中。
傳送通知
使用
devices.reportStateAndNotification
API。
您的 JSON 要求必須包含 eventId
,這是由
來處理觸發通知的事件eventId
應
為隨機 ID,每次傳送通知要求時均不會相同。
在您傳入 API 呼叫的 notifications
物件中,加入
priority
值,定義通知的顯示方式。您的
notifications
物件可能包含不同欄位 (視裝置而定)
特徵。
請按照下列其中一個路徑設定酬載並呼叫 API:
傳送主動通知酬載
如要呼叫 API,請在下列其中一個分頁中選取選項:
HTTP
Home Graph API 會提供 HTTP 端點
- 使用下載的服務帳戶 JSON 檔案建立 JSON Web Token (JWT)。若需更多資訊,請參閲 使用服務帳戶進行驗證。
- 使用
使用
https://www.googleapis.com/auth/homegraph
個範圍 oauth2l: - 使用
agentUserId
建立 JSON 要求。 以下是 Report State 和通知的 JSON 要求範例: - 結合 Report State 與通知 JSON 以及 HTTP POST 中的權杖
要求傳送至 Google Home Graph 端點。以下範例將說明
使用
curl
在指令列中發出要求,如下所示: 測試:
oauth2l fetch --credentials service-account.json \ --scope https://www.googleapis.com/auth/homegraph
{ "agentUserId": "PLACEHOLDER-USER-ID", "eventId": "PLACEHOLDER-EVENT-ID", "requestId": "PLACEHOLDER-REQUEST-ID", "payload": { "devices": { "notifications": { "PLACEHOLDER-DEVICE-ID": { "ObjectDetection": { "priority": 0, "detectionTimestamp": 1534875126750, "objects": { "named": [ "Alice" ], "unclassified": 2 } } } } } } }
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 API 提供了 gRPC 端點
- 取得 Home Graph API 的通訊協定緩衝區服務定義。
- 按照 gRPC 開發人員說明文件為其中一種支援語言產生用戶端虛設常式。
- 呼叫 ReportStateAndNotification 方法。
Node.js
Google API Node.js 用戶端提供 Home Graph API 的繫結。
- 使用應用程式預設憑證初始化
google.homegraph
服務。 - 使用 ReportStateAndNotificationRequest 呼叫
reportStateAndNotification
方法。這會傳回包含 ReportStateAndNotificationResponse 的Promise
。
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', eventId: 'PLACEHOLDER-EVENT-ID', requestId: 'PLACEHOLDER-REQUEST-ID', payload: { devices: { notifications: { 'PLACEHOLDER-DEVICE-ID': { ObjectDetection: { priority: 0, detectionTimestamp: 1534875126750, objects: { named: ['Alice'], unclassified: 2 } } } } } } } });
Java
Java 適用的 HomeGraph API 用戶端程式庫提供 Home Graph API 的繫結。
- 使用應用程式預設憑證將
HomeGraphApiService
初始化。 - 使用
ReportStateAndNotificationRequest
呼叫reportStateAndNotification
方法。其會傳回ReportStateAndNotificationResponse
。
// 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 notification payload. Map<?, ?> notifications = Map.of( "ObjectDetection", Map.of( "priority", 0, "detectionTimestamp", 1534875126, "objects", Map.of("named", List.of("Alice"), "unclassifed", 2))); // Send notification. ReportStateAndNotificationRequest request = new ReportStateAndNotificationRequest() .setRequestId("PLACEHOLDER-REQUEST-ID") .setAgentUserId("PLACEHOLDER-USER-ID") .setEventId("PLACEHOLDER-EVENT-ID") .setPayload( new StateAndNotificationPayload() .setDevices( new ReportStateAndNotificationDevice() .setNotifications(Map.of("PLACEHOLDER-DEVICE-ID", notifications)))); homegraphService.devices().reportStateAndNotification(request);
傳送後續回應酬載
後續回應的酬載包含要求的狀態、錯誤
偵測事件失敗的代碼 (如適用),以及有效的 followUpToken
並在 EXECUTE
意圖要求期間提供的 ID必須使用 followUpToken
並在 5 分鐘內保持有效狀態,並正確連結回應
原始要求。
下列程式碼片段顯示EXECUTE
要求酬載示例
「followUpToken
」欄位中的值。
{ "requestId": "ff36a3cc-ec34-11e6-b1a0-64510650abcf", "inputs": [{ "intent": "action.devices.EXECUTE", "payload": { "commands": [{ "devices": [{ "id": "123", }], "execution": [{ "command": "action.devices.commands.TestNetworkSpeed", "params": { "testDownloadSpeed": true, "testUploadSpeed": false, "followUpToken": "PLACEHOLDER" } }] }] } }] };
Google 會使用 followUpToken
,只在裝置上輸出通知
使用者原本與其互動,且未向所有網站廣播
使用者的裝置。
如要呼叫 API,請在下列其中一個分頁中選取選項:
HTTP
Home Graph API 會提供 HTTP 端點
- 使用下載的服務帳戶 JSON 檔案建立 JSON Web Token (JWT)。若需更多資訊,請參閲 使用服務帳戶進行驗證。
- 使用
使用
https://www.googleapis.com/auth/homegraph
個範圍 oauth2l: - 使用
agentUserId
建立 JSON 要求。 以下是 Report State 和通知的 JSON 要求範例: - 結合 Report State 與通知 JSON 以及 HTTP POST 中的權杖
要求傳送至 Google Home Graph 端點。以下範例將說明
使用
curl
在指令列中發出要求,如下所示: 測試:
oauth2l fetch --credentials service-account.json \ --scope https://www.googleapis.com/auth/homegraph
{ "agentUserId": "PLACEHOLDER-USER-ID", "eventId": "PLACEHOLDER-EVENT-ID", "requestId": "PLACEHOLDER-REQUEST-ID", "payload": { "devices": { "notifications": { "PLACEHOLDER-DEVICE-ID": { "NetworkControl": { "priority": 0, "followUpResponse": { "status": "SUCCESS", "followUpToken": "PLACEHOLDER", "networkDownloadSpeedMbps": 23.3, "networkUploadSpeedMbps": 10.2 } } } } } } }
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 API 提供 gRPC 端點
- 取得 Home Graph API 的通訊協定緩衝區服務定義。
- 按照 gRPC 開發人員說明文件為其中一種支援語言產生用戶端虛設常式。
- 呼叫 ReportStateAndNotification 方法。
Node.js
Google API Node.js 用戶端提供 Home Graph API 的繫結。
- 使用應用程式預設憑證初始化
google.homegraph
服務。 - 使用 ReportStateAndNotificationRequest 呼叫
reportStateAndNotification
方法。這會傳回包含 ReportStateAndNotificationResponse 的Promise
。
const followUpToken = executionRequest.inputs[0].payload.commands[0].execution[0].params.followUpToken; 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', eventId: 'PLACEHOLDER-EVENT-ID', requestId: 'PLACEHOLDER-REQUEST-ID', payload: { devices: { notifications: { 'PLACEHOLDER-DEVICE-ID': { NetworkControl: { priority: 0, followUpResponse: { status: 'SUCCESS', followUpToken, networkDownloadSpeedMbps: 23.3, networkUploadSpeedMbps: 10.2, } } } } } } } });
Java
Java 適用的 HomeGraph API 用戶端程式庫提供 Home Graph API 的繫結。
- 使用應用程式預設憑證初始化
HomeGraphApiService
- 使用
ReportStateAndNotificationRequest
呼叫reportStateAndNotification
方法。其會傳回ReportStateAndNotificationResponse
// 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(); // Extract follow-up token. ExecuteRequest.Inputs executeInputs = (Inputs) executeRequest.getInputs()[0]; String followUpToken = (String) executeInputs .getPayload() .getCommands()[0] .getExecution()[0] .getParams() .get("followUpToken"); // Build device follow-up response payload. Map<?, ?> followUpResponse = Map.of( "NetworkControl", Map.of( "priority", 0, "followUpResponse", Map.of( "status", "SUCCESS", "followUpToken", followUpToken, "networkDownloadSpeedMbps", 23.3, "networkUploadSpeedMbps", 10.2))); // Send follow-up response. ReportStateAndNotificationRequest request = new ReportStateAndNotificationRequest() .setRequestId("PLACEHOLDER-REQUEST-ID") .setAgentUserId("PLACEHOLDER-USER-ID") .setEventId("PLACEHOLDER-EVENT-ID") .setPayload( new StateAndNotificationPayload() .setDevices( new ReportStateAndNotificationDevice() .setNotifications(Map.of("PLACEHOLDER-DEVICE-ID", followUpResponse)))); homegraphService.devices().reportStateAndNotification(request);
記錄
通知支援事件記錄,詳情請參閱「透過 Cloud Logging 存取事件記錄檔」一文。 這些記錄檔對於測試及維護通知品質,都很實用 你的動作。
以下是 notificationLog
項目的結構定義:
屬性 | 說明 |
---|---|
requestId |
通知要求 ID。 |
structName |
通知結構的名稱,例如「ObjectDetection」。 |
status |
指出通知的狀態。 |
status
欄位包含多種狀態,這可能表示
通知酬載其中部分選項僅適用於具備下列內容的動作:
尚未發布至正式環境
狀態範例包括:
狀態 | 說明 |
---|---|
EVENT_ID_MISSING |
代表缺少必要的 eventId 欄位。
|
PRIORITY_MISSING |
代表缺少 priority 欄位。
|
NOTIFICATION_SUPPORTED_BY_AGENT_FALSE |
表示用於通知裝置的 SYNC 提供的 notificationSupportedByAgent 屬性為 false。
|
NOTIFICATION_ENABLED_BY_USER_FALSE |
表示使用者未啟用 GHA 中的通知裝置通知功能。這個狀態僅適用於尚未發布至正式版的動作。 |
NOTIFYING_DEVICE_NOT_IN_STRUCTURE |
表示使用者尚未將通知裝置指派給住家/住家結構體。這個狀態僅適用於尚未發布至正式版的動作。 |
除了這些適用於所有通知的一般狀態外,status
欄位也可能包括特定特性的狀態 (例如:OBJECT_DETECTION_DETECTION_TIMESTAMP_MISSING
)。