1. 事前準備
身為物聯網 (IoT) 的開發人員,您可以建立智慧型住宅動作,讓使用者透過 Google Home 應用程式中的觸控設定操控裝置,以及透過 Google 助理語音指令。
如要建立與 Google 助理完美整合的正式環境,學習智慧型住宅動作的偵錯工具是相當重要的一步。為了協助您輕鬆監控及偵錯,我們提供 Google Cloud Platform (GCP) 指標、記錄和智慧型住宅測試套件,協助您找出並解決動作問題。
必要條件
- 請參閱「建立智慧型住宅動作」開發人員指南
- 執行「將智慧住宅裝置連結至 Google 助理」程式碼研究室
建構項目
在本程式碼研究室中,您將部署含有 2 項瑕疵的智慧型住宅動作,並將其連結至 Google 助理,然後透過測試套件,針對智慧型住宅及Google Cloud Platform (GCP) 指標與記錄。
課程內容
- 如何使用 GCP 指標和記錄功能找出並解決實際工作環境問題
- 如何使用適用於智慧型住宅的 Test Suite 找出功能和 API 問題
軟硬體需求
- 使用網路瀏覽器,例如 Google Chrome
- 已安裝 Google Home 應用程式的 iOS 或 Android 裝置
- Node.js 10.16 以上版本
- Google Cloud 帳單帳戶
2. 執行錯誤的應用程式
取得原始碼
點選下方連結,即可在開發機器上下載這個程式碼研究室的範例:
...或者從指令列複製 GitHub 存放區:
$ git clone https://github.com/google-home/smarthome-debug.git
關於專案
洗衣機應用程式包含下列子目錄:
public
:輕鬆控制及監控智慧型洗衣機狀態的前端 UI。functions
:這是完全導入的雲端服務,透過 Cloud Functions for Firebase 和 Firebase 即時資料庫管理智慧型洗衣機。
連結至 Firebase
在開發機器上開啟終端機。前往 washer-faulty
目錄,然後使用將智慧住宅裝置連結至 Google 助理程式碼研究室中的 Actions 專案,設定 Firebase CLI:
$ cd washer-faulty $ firebase use <project-id>
部署至 Firebase
前往 functions
資料夾,並使用 npm.
安裝所有必要的依附元件
$ cd functions $ npm install
注意:如果看到下方訊息,您可以忽略並繼續。警告訊息是因為某些較舊的依附元件存在,詳情請參閱這篇文章。
found 5 high severity vulnerabilities run `npm audit fix` to fix them, or `npm audit` for details
安裝依附元件並設定專案後,就可以開始部署錯誤的洗衣機應用程式。
$ firebase deploy
以下是控制台輸出內容:
... ✔ Deploy complete! Project Console: https://console.firebase.google.com/project/<project-id>/overview Hosting URL: https://<project-id>.firebaseapp.com
更新 HomeGraph
在瀏覽器中開啟「Hosting URL」(代管網址) (https://<project-id>.firebaseapp.com
),即可查看網頁應用程式。在網頁 UI 中,按一下「Refresh」 按鈕 ,透過「Request Sync」更新 HomeGraph,其中包含故障洗衣機應用程式的最新裝置中繼資料:
開啟 Google Home 應用程式,並確認有看到名為「Faulty Washer」的洗衣機裝置。
3. 測試動作
部署專案後,請測試動作能否控制洗衣機。
測試洗衣機
當您透過手機使用下列任一語音指令時,請檢查值是否有變化:
「Ok Google,打開洗衣機。」
「Ok Google,啟動洗衣機。」
「Ok Google,暫停洗衣機。」
「Ok Google,繼續洗衣機。」
「Ok Google,停止洗衣機。」
當您暫停 / 重新啟用洗衣機時,Google 助理會回應語音錯誤:
「很抱歉,我無法連上「<專案顯示名稱>」。
如要進行偵錯,請先進一步瞭解錯誤,然後縮小範圍並找出根本原因。
智慧型住宅數據分析資訊主頁
如果想要檢查錯誤,不妨使用智慧型住宅數據分析資訊主頁,該資訊主頁彙整了「使用情形和健康」指標的圖表,方便您瞭解雲端執行要求:
- 「用量」指標會反映智慧型住宅動作的用量趨勢,包括每日活躍使用人數和執行要求總數。
- 「健康」指標可協助你監控智慧型住宅動作的異常情況,包括要求延遲時間、成功百分比和錯誤詳細資料。
如要縮小錯誤原因範圍,請按照下列步驟存取專案資訊主頁。
- 在動作控制台中,前往「專案」頁面。
- 選取智慧型住宅專案。
- 選擇 [Analytics] 分頁標籤,然後按一下 [前往 Google Cloud Platform]。
- 系統會將您導向 Google Cloud 專案的資訊主頁清單。選取「Google Home Analytics - Cloud Integration」資訊主頁。
- 向下捲動至「Cloud Fulfillment errors - Status Breakdown」圖表,查看醒目顯示時間範圍內的錯誤代碼。
PARTNER_RESPONSE_MISSING_DEVICE
錯誤代碼會提供根本原因的提示。接下來,根據錯誤代碼擷取事件記錄來瞭解詳情。
存取事件記錄
如要進一步瞭解錯誤,請透過 Cloud Logging 存取智慧型住宅動作的事件記錄。
在 Google Cloud Platform 中開啟「導覽選單」,然後在「作業」下方選取「記錄」>記錄檔探索工具:存取專案的事件記錄檔。您也可以在搜尋框中搜尋「記錄檔探索工具」。
在「Query」區段中,輸入查詢 PARTNER_RESPONSE_MISSING_DEVICE
,然後按一下「Run Query」。符合查詢的記錄會顯示在「查詢結果」部分。
錯誤記錄會顯示智慧型住宅事件,並指出下列錯誤詳細資料:
- 使用者採取的動作為「繼續洗衣機」與最近失敗的語音指令相對應 (
actionType:
「STARTSTOP_UNPAUSE
」)。 - 相關聯的偵錯訊息為「
JSON response does not include device.
」
根據偵錯訊息,您應檢查 Washer 應用程式未在 EXECUTE
回應中加入正確的裝置的原因。
找出錯誤的根本原因
在 functions/index.js
中,找出會傳回每個指令狀態和新裝置狀態的 EXECUTE
處理常式 (位於 onExecute
陣列中)。是否要將裝置 ID 插入 EXECUTE
回應,取決於解析 updateDevice
函式:
index.js
app.onExecute(async (body) => {
...
for (const command of intent.payload.commands) {
for (const device of command.devices) {
for (const execution of command.execution) {
executePromises.push(
updateDevice(execution, device.id)
.then((data) => {
result.ids.push(device.id);
Object.assign(result.states, data);
})
.catch((e) =>
functions.logger.error('EXECUTE',
device.id, e.message)));
}
}
}
進一步檢查 updateDevice
函式如何處理洗衣機的暫停 / 繼續作業,然後您會看到與暫停 / 繼續指令相符的字串不正確:
index.js
const updateDevice = async (execution, deviceId) => {
const {params, command} = execution;
let state; let ref;
switch (command) {
...
case 'action.devices.commands.PauseUnpausePause':
state = {isPaused: params.pause};
if (params.pause) state.isRunning = false;
ref = firebaseRef.child(deviceId).child('StartStop');
break;
}
return ref.update(state)
.then(() => state);
};
修正錯誤
現在您已找出錯誤的根本原因,可以修正暫停 / Resume 指令字串:
index.js
const updateDevice = async (execution, deviceId) => {
const {params, command} = execution;
let state; let ref;
switch (command) {
...
case 'action.devices.commands.PauseUnpause':
state = {isPaused: params.pause};
if (params.pause) state.isRunning = false;
ref = firebaseRef.child(deviceId).child('StartStop');
break;
}
return ref.update(state)
.then(() => state);
};
測試修正結果
使用 Firebase CLI 部署更新後的程式碼:
firebase deploy --only functions
重試以下語音指令,現在你暫停 / 繼續計時,Google 助理就會正確回應。
「Ok Google,暫停洗衣機。」
=>
「沒問題,暫停洗衣機。」
「Ok Google,繼續洗衣機。」
=>
「我知道了,繼續洗衣機。」
你也可以透過提問來測試洗衣機目前的狀態。
「Ok Google,我的洗衣機已經打開了嗎?」
「Ok Google,我的洗衣機正在跑嗎?」
「Ok Google,洗衣機目前在哪個週期?」
4. 使用測試套件測試動作
除了手動測試之外,您也能使用自動化的智慧型住宅測試套件,根據與動作相關聯的裝置類型和特徵驗證用途。測試套件會執行一系列的測試來偵測動作中的問題,並針對失敗的測試案例顯示實用資訊,有助於加快偵錯速度,再深入分析事件記錄。
執行適用於智慧型住宅的測試套件
如要測試您的智慧型住宅動作 by Test Suite,請按照下列操作說明:
- 在網路瀏覽器中開啟針對智慧型住宅測試套件。
- 使用右上角的按鈕登入 Google。如此一來,測試套件就能將指令直接傳送給 Google 助理。
- 在「Project ID」欄位中,輸入智慧型住宅動作的專案 ID。然後點選「下一步」繼續操作。
- 在「測試設定」步驟中,您會看到測試套件清單,列出洗衣機的裝置類型和特徵。
- 停用「Test Request Sync」選項,因為範例工具應用程式沒有可新增 / 移除 / 重新命名洗衣機的 UI。在實際運作系統中,當使用者新增 / 移除 / 重新命名裝置時,您必須觸發 Request Sync。
- 點選「下一步」即可開始執行測試。
Test Suite 執行完成後,請查看測試案例的結果。您會看到兩個失敗的測試案例,以及各自的錯誤訊息:
如要為智慧型住宅動作偵錯失敗,你必須先分析錯誤訊息,找出錯誤的根本原因。
分析錯誤訊息
為了協助開發人員找出根本原因,Test Suite 會針對每個失敗的測試案例顯示錯誤訊息,並標明失敗原因。
針對上述第一個失敗的測試案例
錯誤訊息表示 Test Suite 預期智慧型住宅動作回報的狀態為 "isPause": true
,但實際狀態只包含 "isPause": false
。
此外,第二個失敗的測試案例,會顯示智慧型住宅動作的 QUERY
回應中的狀態包含 "isPause": true
,這與智慧型住宅動作回報的狀態中的 "isPause": false
不同:
根據這兩則錯誤訊息,接著應檢查動作回報的 isPaused
狀態是否正確。
找出錯誤的根本原因
開啟 functions/index.js
,當中包含 reportstate
函式,該函式會透過「報告狀態」將狀態變更發布至 Home 圖表。檢查「報表狀態」酬載,您會發現酬載缺少 isPaused
狀態,這就是測試套件在失敗測試案例中檢查的內容。
index.js
exports.reportstate = functions.database.ref('{deviceId}').onWrite(
async (change, context) => {
...
const requestBody = {
requestId: 'ff36a3cc', /* Any unique ID */
agentUserId: USER_ID,
payload: {
devices: {
states: {
/* Report the current state of our washer */
[context.params.deviceId]: {
online: true,
on: snapshot.OnOff.on,
isRunning: snapshot.StartStop.isRunning,
currentRunCycle: [{
currentCycle: 'rinse',
nextCycle: 'spin',
lang: 'en',
}],
currentTotalRemainingTime: 1212,
currentCycleRemainingTime: 301,
},
},
},
},
};
const res = await homegraph.devices.reportStateAndNotification({
requestBody,
});
...
});
修正錯誤
現在,您已找出錯誤的根本原因,請在報告狀態酬載中加入 isPaused
狀態來修改 functions/index.js
:
index.js
exports.reportstate = functions.database.ref('{deviceId}').onWrite(
async (change, context) => {
...
const requestBody = {
requestId: 'ff36a3cc', /* Any unique ID */
agentUserId: USER_ID,
payload: {
devices: {
states: {
/* Report the current state of our washer */
[context.params.deviceId]: {
online: true,
on: snapshot.OnOff.on,
isPaused: snapshot.StartStop.isPaused,
isRunning: snapshot.StartStop.isRunning,
currentRunCycle: [{
currentCycle: 'rinse',
nextCycle: 'spin',
lang: 'en',
}],
currentTotalRemainingTime: 1212,
currentCycleRemainingTime: 301,
},
},
},
},
};
...
});
測試修正結果
使用 Firebase CLI 部署更新後的程式碼:
$ firebase deploy --only functions
重新執行智慧型住宅的測試套件,就會發現所有測試案例皆已通過。
5. 恭喜
恭喜!您已順利學會如何透過適用於智慧型住宅的測試套件,排解智慧型住宅動作問題GCP 指標和記錄。
瞭解詳情
以本程式碼研究室為基礎,請嘗試下列練習並瀏覽其他資源:
- 在裝置上新增更多支援的特徵,並使用測試套件進行測試。
- 您可以建立資訊主頁、設定快訊,以及透過程式輔助方式存取指標資料,取得與動作相關的實用用量指標。
- 瞭解智慧型住宅的本地執行要求。
- 詳情請參閱 GitHub 範例。
您也可以進一步瞭解如何測試並提交動作送審,包括向使用者發布動作應用程式的認證程序。