1. 始める前に
モノのインターネット(IoT)デベロッパーは、スマートホーム アクションを構築できます。これにより、ユーザーは Google Home アプリのタップ操作や Google アシスタントの音声コマンドを使ってデバイスを操作できるようになります。
スマートホーム アクションのデバッグツールを学習することは、Google アシスタントと本番環境の品質統合を行うための重要なステップです。モニタリングとデバッグを簡単に行えるように、Google Cloud Platform(GCP)指標、Logging、スマートホーム用テストスイートを活用して、問題を特定し、解決することができます。
前提条件
- スマートホーム アクションを作成するデベロッパー ガイドを読む
- スマートホーム デバイスを Google アシスタントに接続する Codelab を実施する
作成するアプリの概要
この Codelab では、2 つの欠陥を含むスマートホーム アクションをデプロイしてアシスタントに接続し、スマートホーム用テストスイートと Google Cloud Platform(GCP)の指標とロギングを介してアクションの欠陥をデバッグします。
学習内容
- GCP の指標とロギングを使用して本番環境の問題を特定して解決する方法
- スマートホーム用テストスイートを使用して機能および API の問題を特定する方法
必要なもの
- ウェブブラウザ(Google Chrome など)
- Google Home アプリがインストールされている iOS デバイスまたは Android デバイス
- Node.js バージョン 10.16 以降
- Google Cloud 請求先アカウント
2. 問題のあるアプリを実行する
ソースコードを取得する
下のリンクをクリックして、この Codelab のサンプルを開発マシンにダウンロードします。
または、コマンドラインから GitHub リポジトリのクローンを作成することもできます。
$ git clone https://github.com/googlecodelabs/smarthome-debug.git
プロジェクトについて
洗濯アプリには次のサブディレクトリが含まれています。
public
: スマート洗濯機の状態を簡単に制御、モニタリングするフロントエンド UI。functions
: Cloud Functions for Firebase と Firebase Realtime Database を使用してスマート洗濯機を管理する、完全に実装されたクラウド サービス。
Firebase に接続する
開発マシンでターミナルを開きます。washer-faulty
ディレクトリに移動し、スマートホーム デバイスを Google アシスタント Codelab に接続するで作成した 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 を更新
ブラウザ(https://<project-id>.firebaseapp.com
)で Hosting URL を開いてウェブアプリを表示します。ウェブ UI で [更新] ボタン をクリックし、Request Sync を介して、不具合のある洗濯アプリの最新のデバイス メタデータで HomeGraph を更新します。
Google Home アプリを開き、洗濯機デバイスが [Failurey Washer] と表示されることを確認します。
3.アクションをテストする
プロジェクトをデプロイしてから、アクションが洗濯機を制御していることをテストします。
洗濯機をテストする
スマートフォンで次の音声コマンドを試したときに、値の変化を確認します。
「OK Google, 洗濯機をオンにして。」
「OK Google, 洗濯を開始して。」
「OK Google, 洗濯機を一時停止して」
「OK Google, 洗濯を再開して」
「OK Google, 洗濯機を止めて。」
洗濯機を一時停止 / 再開すると、アシスタントは音声で何か問題があると回答します。
「<プロジェクト名> に接続できませんでした。」
この問題をデバッグするには、まずエラーの詳細情報を確認して、原因を絞り込んで特定する必要があります。
スマートホーム分析ダッシュボード
エラーを調べるには、クラウド フルフィルメントの使用状況と健全性の指標が集約されたスマートホーム分析ダッシュボードが便利です。
- 使用状況の指標には、スマートホーム アクションの使用状況の傾向(1 日のアクティブ ユーザー数、フルフィルメントに対する合計リクエスト数など)が反映されます。
- 健全性指標では、スマートホーム アクションの異常発生の発生を監視し、リクエストのレイテンシ、成功率、エラーの内訳を把握できます。
エラーの原因を絞り込むには、以下の手順に沿ってプロジェクト ダッシュボードにアクセスします。
- Actions Console で [プロジェクト] ページに移動します。
- スマートホーム プロジェクトを選択します。
- [Analytics](分析)タブを選択し、[Go to Google Cloud Platform](Google Cloud Platform に移動)をクリックします。
- Google Cloud のプロジェクトのダッシュボードのリストが表示されます。[Google Home Analytics - Cloud Integration] ダッシュボードを選択します。
- [Cloud Fulfillment Errors - Status Breakdown] グラフまでスクロールし、ハイライト表示された期間のエラーコードを表示します。
PARTNER_RESPONSE_MISSING_DEVICE
エラーコードは、根本原因に対するヒントを提供します。次に、エラーコードに基づいてイベントログを取得し、詳細を確認します。
イベントログにアクセスする
このエラーの詳細を確認するには、Cloud Logging を介して、スマートホーム アクションのイベントログにアクセスします。
Google Cloud Platform のナビゲーション メニューを開き、[オペレーション] で [ロギング] > [ログ エクスプローラ] を選択して、プロジェクトのイベントログにアクセスします。または、検索ボックスでログ エクスプローラを検索できます。
[クエリ] セクションで、クエリ PARTNER_RESPONSE_MISSING_DEVICE
を入力し、[クエリを実行] をクリックします。クエリに一致するログが [クエリ結果] セクションに表示されます。
エラーログには、スマートホーム イベントと次のエラーの詳細が表示されます。
- ユーザーが行った操作は、最近失敗した音声コマンドに対応する「resuming 洗濯機」(
actionType:
「STARTSTOP_UNPAUSE
」)です。 - 関連付けられているデバッグ メッセージは「
JSON response does not include device.
」です
デバッグ メッセージに基づいて、EXECUTE
レスポンスに洗濯機アプリに正しいデバイスが含まれていない理由を確認してください。
エラーの根本原因を特定する
functions/index.js
で、各コマンドのステータスと新しいデバイスの状態を返す EXECUTE
ハンドラ(onExecute
配列内)を見つけます。EXECUTE
レスポンスへのデバイス ID の挿入は、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);
};
エラーを修正する
エラーの根本原因がわかったので、一時停止 / 再開コマンドの文字列を修正します。
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
以下の音声コマンドを再試行してください。洗濯機を一時停止または再開すると、アシスタントは正しく応答します。
「OK Google, 洗濯機を一時停止して。」
=>
「はい、洗濯機を一時停止します。」
「OK Google, 洗濯を再開して。」
=>
「かしこまりました。洗濯機を再開します」
質問して、洗濯機の現在の状態を確認することもできます。
「OK Google, 洗濯機はオンになってる?」
「OK Google, 洗濯機は動いてる?」
「OK Google, 洗濯機の今のステップを教えて」
4. テストスイートでアクションをテストする
手動でテストするだけでなく、自動化されたスマートホーム用のテストスイートを使用して、アクションに関連付けられたデバイスタイプとトレイトに基づいてユースケースを検証することもできます。テストスイートが一連のテストを実行してアクションの問題を検出し、失敗したテストケースについて情報メッセージを表示して、イベントログを使用する前にデバッグを高速化します。
スマートホーム用のテストスイートを実行する
スマートホーム アクションをテストスイートでテストする手順は次のとおりです。
- ウェブブラウザでスマートホーム用テストスイートを開きます。
- 右上のボタンを使用して Google にログインします。これにより、テストスイートから Google アシスタントに直接コマンドを送信できます。
- [Project ID] フィールドに、スマートホーム アクションのプロジェクト ID を入力します。[次へ] をクリックして続行します。
- [Test Settings] ステップで、洗濯機のデバイスタイプとトレイトが Test Suite に表示されます。
- サンプルの洗濯機アプリには、洗濯機の追加と削除、名前変更を行うための UI がないため、[Test Request Sync] オプションを無効にします。本番環境システムでは、ユーザーがデバイスを追加、削除、名前変更するたびに同期リクエストをトリガーする必要があります。
- [次へ] をクリックして、テストの実行を開始します。
テストスイートの実行が完了したら、テストケースの結果を表示します。失敗したテストケースが 2 つ表示され、それぞれのエラー メッセージがキャッチされます。
スマートホーム アクションをデバッグしてデバッグするには、エラー メッセージを分析することで、エラーの根本原因を特定する必要があります。
エラー メッセージを分析する
デベロッパーが根本原因を特定できるように、Test Suite では失敗したテストケースごとにエラーの理由を示すエラー メッセージが表示されます。
上記の最初の失敗したテストケースの場合、
エラー メッセージは、Test Suite がスマートホーム アクションから報告される状態の "isPause": true
を想定しているものの、実際の状態には "isPause": false
しか含まれていないことを示しています。
さらに、2 番目の失敗したテストケースのエラー メッセージは、スマートホーム アクションからの QUERY
レスポンスの状態に "isPause": true
が含まれていることを示しています。これは、スマートホーム アクションから報告された状態の "isPause": false
とは異なります。
両方のエラー メッセージに応じて、アクションが isPaused
という状態を正しい値で報告しているかどうかを確認する必要があります。
エラーの根本原因を特定する
Report State でホームグラフに状態の変化を送信する reportstate
関数を含む functions/index.js
を開きます。Report State ペイロードを調べると、ペイロードに 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,
});
...
});
エラーを修正する
エラーの根本原因がわかったので、Report State ペイロードに 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 指標とロギングのテストスイートを使用して、スマートホーム アクションの問題のトラブルシューティングを行う方法を学びました。
詳細
この Codelab で学んだことを活かして、追加リソースを参照しながら以下の演習に挑戦してみましょう。
- お使いのデバイスにサポートされているトレイトを追加して、テストスイートでテストします。
- ダッシュボードを作成し、アラートを設定して、プログラムで指標データにアクセスすることで、アクションに関する有用な使用状況の指標を取得できます。
- スマートホーム向けのローカル フルフィルメントの詳細をご覧ください。
- 詳しくは、GitHub サンプルをご覧ください。
審査のためにアクションをテストし、送信する方法の詳細(アクションをユーザーに公開するための認定プロセスを含む)もあわせてご覧ください。