歡迎使用 Google Home 開發人員中心,探索全新功能,瞭解如何開發智慧住宅動作。注意:請繼續在「動作」控制台中建立動作。

報告狀態

透過集合功能整理內容 你可以依據偏好儲存及分類內容。
17.19 的

「報告狀態」是一項重要的功能,可讓智慧型住宅動作主動將使用者的裝置的最新狀態傳回 Google 的 Home 圖表,不必等待 QUERY 意圖。

向與 Google 回報狀態裝置的使用者狀態報告 (顯示指定的 agentUserId) 與其相關 (透過原始 SYNC 要求傳送)。如果 Google 助理想要採取需要瞭解裝置目前狀態的動作,可以直接在 Home Graph 中查詢狀態資訊,而不必在發出 EXECUTE 意圖前向各種第三方雲端發出 QUERY 意圖。

在沒有報告狀態的情況下,由於客廳有多個供應商的光源,「Ok Google,將客廳的亮度」需要解析多個QUERY,多個意圖會傳送至多個雲端,而不是根據先前回報的資料查詢目前的亮度值。為提供最佳使用者體驗,Google 助理必須處於裝置目前的狀態,且不需要往返裝置。

在裝置的初始 SYNC 之後,平台會傳送 QUERY 意圖,用於收集裝置狀態並填入 Home Graph。之後,住家圖表只會儲存隨報表狀態傳送的狀態。

呼叫報表狀態時,請務必提供特定特性的完整狀態資料。「住家圖表」會個別追蹤每個小點的狀態,並在傳送報告狀態呼叫時,覆寫該特性的所有資料。舉例來說,如果您要回報 StartStop 屬性的狀態,酬載就必須同時提供 isRunningisPaused 的值。

開始使用

如要導入報表狀態,請按照下列步驟操作:

啟用 Google HomeGraph API

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

    前往 HomeGraph API 頁面
  2. 選取與智慧型住宅專案 ID 相符的專案。
  3. 按一下「啟用」

建立服務帳戶金鑰

請按照下列操作說明,透過 GCP Console 產生服務帳戶金鑰:

注意:執行這些步驟時,請務必使用正確的 GCP 專案。這是與您的智慧型住宅專案 ID 相符的專案。
  1. 前往 GCP Console 的「Create service account key」(建立服務帳戶金鑰) 頁面。

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

  6. 針對「金鑰類型」,選取「JSON」選項

  7. 按一下「建立」,內含金鑰的 JSON 檔案會下載到您的電腦中。

呼叫 API

從以下分頁選取一個選項:

HTTP

Home Graph API 提供 HTTP 端點

  1. 使用下載的服務帳戶 JSON 檔案建立 JSON Web Token (JWT)。詳情請參閱使用服務帳戶進行驗證
  2. 使用 OAuth2l 取得具有 https://www.googleapis.com/auth/homegraph 範圍的 OAuth 2.0 存取權杖:
  3. oauth2l fetch --credentials service-account.json \
      --scope https://www.googleapis.com/auth/homegraph
    
  4. 使用 agentUserId 建立 JSON 要求。 以下是報告狀態和通知的 JSON 要求範例:
  5. {
      "requestId": "123ABC",
      "agentUserId": "user-123",
      "payload": {
        "devices": {
          "states": {
            "light-123": {
              "on": true
            }
          }
        }
      }
    }
    
  6. 將 HTTP POST 要求中的報表狀態與通知 JSON 和權杖合併至 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 方法。其會使用 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',
    requestId: 'PLACEHOLDER-REQUEST-ID',
    payload: {
      devices: {
        states: {
          "PLACEHOLDER-DEVICE-ID": {
            on: true
          }
        }
      }
    }
  }
});
    

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 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);
}
    

測試報告狀態

請務必測試報表狀態,以便做好相關準備。

必要條件

您必須具備服務帳戶金鑰和 agentUserId,才能測試動作。如果您已有服務帳戶金鑰且 agentUserId,請參閱部署報表狀態資訊主頁

部署報告狀態資訊主頁

為專案建立服務帳戶金鑰和代理程式使用者 ID 後,請從報表狀態資訊主頁下載及部署最新版本。下載最新版本後,請按照隨附的 README.MD 檔案中的指示操作。

部署報告狀態資訊主頁後,您可以透過以下網址存取資訊主頁 (將 your_project_id 替換為您的專案 ID):

http://<your-project-id>.appspot.com

在資訊主頁上執行下列操作:

  • 選擇您的帳戶金鑰檔案
  • 新增代理程式使用者 ID

然後按一下 [清單]

系統隨即會列出所有裝置。填入清單後,您可以使用「Refresh」(重新整理) 按鈕更新裝置狀態。裝置狀態如有變更,該列就會以綠色醒目顯示。

錯誤回應

呼叫報告狀態時,您可能會收到下列其中一個錯誤回應。這些回應會以 HTTP 狀態碼的形式顯示。

  • 400 Bad Request - 因語法無效,伺服器無法處理用戶端傳送的要求。常見原因包括 JSON 格式錯誤,或使用 null 而非字串值。
  • 404 Not Found:找不到要求的資源,但日後可能會提供這項功能。這通常表示我們無法找到所要求的裝置。這也可能表示使用者帳戶未與 Google 連結,或者收到無效的 agentUserId。確認 agentUserIdSYNC 回應中提供的值相符,且您已正確處理 DISCONNECT 意圖。