智慧住宅動作通知

啟用通知後,你就可以透過「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」動作新增通知:

  1. 指示 Google 在以下裝置上啟用通知: smart home 個裝置應用程式。如果使用者開啟或關閉通知 在應用程式中傳送 SYNC 要求,將裝置變更通知 Google。
  2. 發生相關裝置事件或狀態變更,進而觸發 通知、呼叫 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

  1. 前往 Google Cloud Console 中的「HomeGraph API」頁面。

    前往 HomeGraph API 頁面
  2. 選取 smart home 專案 ID 相符的專案。
  3. 按一下「ENABLE」(啟用)

建立服務帳戶金鑰

請按照下列操作說明,從 Google Cloud Console 產生服務帳戶金鑰:

注意:執行時,請確認您使用的 GCP 專案正確無誤 這些步驟。這是與您的 smart home 專案 ID 相符的專案。
  1. 前往 Google Cloud Console 的「Create service account key」(建立服務帳戶金鑰) 頁面。

    前往「Create Service Account Key」(建立服務帳戶金鑰) 頁面。
  2. 在「服務帳戶」清單中,選取 新增服務帳戶
  3. 在 [Service account name] (服務帳戶名稱) 欄位中輸入一個名稱。
  4. 在「服務帳戶 ID」欄位中輸入 ID。
  5. 在「角色」清單中,選取「服務帳戶」> 服務帳戶權杖建立者

  6. 在「Key type」(金鑰類型) 部分,選取「JSON」選項。

  7. 點選「建立」。包含金鑰的 JSON 檔案 下載至您的電腦中。

傳送通知

使用 devices.reportStateAndNotification API。 您的 JSON 要求必須包含 eventId,這是由 來處理觸發通知的事件eventId 應 為隨機 ID,每次傳送通知要求時均不會相同。

在您傳入 API 呼叫的 notifications 物件中,加入 priority 值,定義通知的顯示方式。您的 notifications 物件可能包含不同欄位 (視裝置而定) 特徵。

請按照下列其中一個路徑設定酬載並呼叫 API:

傳送主動通知酬載

如要呼叫 API,請在下列其中一個分頁中選取選項:

HTTP

Home Graph API 會提供 HTTP 端點

  1. 使用下載的服務帳戶 JSON 檔案建立 JSON Web Token (JWT)。若需更多資訊,請參閲 使用服務帳戶進行驗證
  2. 使用 使用 https://www.googleapis.com/auth/homegraph 個範圍 oauth2l
  3. oauth2l fetch --credentials service-account.json \
      --scope https://www.googleapis.com/auth/homegraph
    
  4. 使用 agentUserId 建立 JSON 要求。 以下是 Report State 和通知的 JSON 要求範例:
  5. {
      "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
                }
              }
            }
          }
        }
      }
    }
    
  6. 結合 Report State 與通知 JSON 以及 HTTP POST 中的權杖 要求傳送至 Google Home Graph 端點。以下範例將說明 使用 curl 在指令列中發出要求,如下所示: 測試:
  7. 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 端點

  1. 取得 Home Graph API 的通訊協定緩衝區服務定義
  2. 按照 gRPC 開發人員說明文件為其中一種支援語言產生用戶端虛設常式。
  3. 呼叫 ReportStateAndNotification 方法。

Node.js

Google API Node.js 用戶端提供 Home Graph API 的繫結。

  1. 使用應用程式預設憑證初始化 google.homegraph 服務。
  2. 使用 ReportStateAndNotificationRequest 呼叫 reportStateAndNotification 方法。這會傳回包含 ReportStateAndNotificationResponsePromise
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 的繫結。

  1. 使用應用程式預設憑證HomeGraphApiService 初始化。
  2. 使用 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 端點

  1. 使用下載的服務帳戶 JSON 檔案建立 JSON Web Token (JWT)。若需更多資訊,請參閲 使用服務帳戶進行驗證
  2. 使用 使用 https://www.googleapis.com/auth/homegraph 個範圍 oauth2l
  3. oauth2l fetch --credentials service-account.json \
      --scope https://www.googleapis.com/auth/homegraph
    
  4. 使用 agentUserId 建立 JSON 要求。 以下是 Report State 和通知的 JSON 要求範例:
  5. {
      "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
                }
              }
            }
          }
        }
      }
    }
    
  6. 結合 Report State 與通知 JSON 以及 HTTP POST 中的權杖 要求傳送至 Google Home Graph 端點。以下範例將說明 使用 curl 在指令列中發出要求,如下所示: 測試:
  7. 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 端點

  1. 取得 Home Graph API 的通訊協定緩衝區服務定義
  2. 按照 gRPC 開發人員說明文件為其中一種支援語言產生用戶端虛設常式。
  3. 呼叫 ReportStateAndNotification 方法。

Node.js

Google API Node.js 用戶端提供 Home Graph API 的繫結。

  1. 使用應用程式預設憑證初始化 google.homegraph 服務。
  2. 使用 ReportStateAndNotificationRequest 呼叫 reportStateAndNotification 方法。這會傳回包含 ReportStateAndNotificationResponsePromise
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 的繫結。

  1. 使用應用程式預設憑證初始化 HomeGraphApiService
  2. 使用 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)。