報表狀態

比向比與外比向外同網頁

Report State 是相當重要的功能,可讓 Home 動作主動將使用者裝置的最新狀態回報給 Google Home Graph,而不是等待 QUERY 意圖。

Report State 會向 Google 回報與指定 agentUserId 相關聯的使用者裝置狀態 (在原始 SYNC 要求中傳送)。當 Google Assistant 想執行需要瞭解裝置目前狀態的操作時,只需查詢 Home Graph 中的狀態資訊,不必在發出 EXECUTE 意圖之前向各種第三方雲端發出 QUERY 意圖。

如果沒有 Report State,則在客廳裡,會發出多個供應商發出的燈具,說出「Ok Google,提高客廳亮度」指令就必須解決傳送至多個雲端的多個 QUERY 意圖,而不是根據先前回報的內容查詢目前的亮度值。為提供最佳使用者體驗,Assistant 需具備裝置的目前狀態,而不需要往返裝置。

裝置初始 SYNC 之後,平台會傳送 QUERY 意圖,收集裝置狀態以填入 Home Graph。之後,Home Graph 只會儲存透過 Report State 傳送的狀態。

呼叫 Report State 時,請務必提供特定特徵的完整狀態資料。Home Graph 會以個別特徵更新狀態,並在發出 Report State 呼叫時覆寫該特徵的所有資料。舉例來說,如果您要回報 StartStop 特徵的狀態,酬載就需要包含 isRunningisPaused 的值。

開始使用

如要實作 Report State,請按照下列步驟操作:

啟用 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 檔案下載到電腦。

呼叫 API

在下方分頁中選取所需選項:

HTTP

Home Graph 會提供 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. 將「報告狀態」和「通知」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 會提供 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',
    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);
}
    

測試報告狀態

這項工作適用的建議工具

為方便您採取行動,以便進行認證,請務必測試 Report State

如要執行此操作,建議您使用 Home Graph 檢視器工具,這是不需要下載或部署的獨立網頁應用程式。

Report State 資訊主頁仍可使用,但已淘汰,不再提供相關支援。

報表狀態資訊主頁

先備知識

測試動作前,您需要有服務帳戶金鑰和 agentUserId。如果您已有服務帳戶金鑰,且 agentUserId 已有服務帳戶,請參閱「部署 Report State 資訊主頁」。

部署「報表狀態」資訊主頁

取得專案的服務帳戶金鑰和代理程式使用者 ID 後,請從 Report State 資訊主頁下載及部署最新版本。下載最新版本後,請按照隨附 README.MD 檔案中的操作說明進行。

部署 Report State 資訊主頁後,請透過下列網址存取資訊主頁 (將 your_project_id 替換成您的專案 ID):

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

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

  • 選擇帳戶金鑰檔案
  • 新增 agentUserId

然後按一下「清單」

您的所有裝置都會列在其中。填入清單後,您可以使用「Refresh」按鈕更新裝置狀態。如果有裝置狀態改變,該列會以綠色醒目顯示。

錯誤回應

呼叫 Report State 時,您可能會收到下列其中一個錯誤回應。這些回應會以 HTTP 狀態碼的形式呈現。

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