スマートホームスキルでよく起きるトラブルとその解決策

Jason Kwan Feb 08, 2021
Share:
Tips & Tools Smart Home API
Blog_Header_Post_Img

多くのスマートホームスキルで発生する問題はテストとトラブルシューティングによって解決できます。ここではデバイスの検出の失敗、デバイスが操作できない問題とスマートホームスキルAPIで対応されている発話をご紹介します。

「新しいスマートホームデバイスを検出できませんでした」

全てのリージョンで検出できない時

ユーザがスマートホームスキルを有効にして、「Alexa、デバイスを検出して」の発話かAlexaアプリで「デバイスを検出」を押しても新しいデバイスが検出できない場合、Discoverディレクティブに対するレスポンスが不正である可能性があります。この現象を解決するヒントをご紹介します:

  • 各インターフェースの技術資料にあるサンプルを確認しながら実装してください。Discoverディレクティブに対するレスポンスを技術資料にあるサンプルと比較することによって不正な形が判定できます。例えば、サーモスタットを実装している時には送信しているレスポンスとThermostatControllerの技術資料にあるDiscoveryレスポンスのサンプルと比較してみたください。コードエディタによって技術資料のJSONと実際に送信したJSONを比較すると、具体的にどこが異なるかが判明できます。
  • エンドポイントを一つずつ試してください。複数のデバイスで試すより、一つずつ試すとどのデバイスやどのインターフェースで問題が起きているかを判別できます。まずは技術資料のサンプルで実装して、サンプルのデバイスが検出できるまでインターフェースを一つだけ実装することが大事です。例えば、上記のサーモスタットの例から実装すると、サンプルを使ってデバイスが検出できたら、lowerSetpointとupperSetpointの代わりにtargetSetpointを試してみてください。対象となるインターフェースで当てはまるプロパティが問題なく検出できたら、他に当てはまるインターフェースを一つずつ追加して、正しく検出できることが確認できたら、複数のインターフェースが含めたデバイスを追加して試します。

特定のリージョンで検出できない時

どの言語やロケールでテストしても無事に検出されますが、スキルの審査時に特定のリージョンで検出できない場合があります。特定のリージョンで検出できない時は以下の解決方法をご確認ください。

  • 1つ以上のリージョンで検出されない時は他のリージョンのLambda関数をご確認ください。デバイスの検出を行う時に、お客様のアカウントに設定されているリージョンによって、呼び出されるLambda関数のリージョンが異なります。例えば、Alexaアプリで使用しているAmazonのアカウントを日本に設定すると、米国西部 (オレゴン)・us-west-2のLambda関数が呼び出されます。このアカウントで他の言語で試しても、Discoverディレクティブがus-west-2のリージョンにしか届きません。複数のリージョンで使えるスマートホームスキルを開発すると、複数の国のAmazonのアカウントで試す必要があります。スマートホームのリージョンの技術資料からどのLambdaのリージョンがサポートされているかをご確認ください。
  • あるインターフェースは特定のリージョンでしか使用できません。Discoveryのレスポンスに特定のリージョンでしか使用できないインターフェースが含まれると検出が失敗する場合があります。Alexaインターフェースとサポートしている言語の一覧を参照して、どのインターフェースがどのリージョンでサポートされているかをご確認ください。

「すみません。<デバイス>が応答していません。」

「すみません。<デバイス>が応答していません。」と応答されるにも関わらず、デバイスは反応する

もしデバイスが操作できる状態でAlexaが上記のメッセージを返したら、Lambda関数がリクエストに対するレスポンスを正しく返していない可能性があります。基本的にAlexaはLambdaからのレスポンスを8秒まで待ちますので、Lambda関数は8秒以内にレスポンスを送信する必要があります。以下の例をご参照ください:

  1. ユーザが「ランプを消して」と発話する
  2. Alexaがその発話を受け取る
  3. AlexaがTurnOffディレクティブをLambdaに送信する
  4. Lambdaがリクエストを受け取る
  5. Lambdaがデバイスクラウドにランプを消す指示を出す
  6. デバイスクラウドがリクエストを受け取り、成功・失敗したレスポンスをLambdaに送信する
  7. LambdaがAlexaに3.のリクエストに対してレスポンスを送信する

上記の4-7番で8秒以上になりますと、そのランプが正しく操作されたにも関わらず、Alexaは「すみません。<デバイス>が応答していません。」と応答します。Lambda関数の最長実行時間がデフォルトの3秒に設定されおり、かつ上記の6番が3秒以上かかる場合、デバイスクラウドがデバイスを操作してもLambda関数がタイムアウトしてしまいます。そうしますと、上記の7番が正しく実行されません。本現象を解消するには、Lambda関数の最長実行時間が8秒に設定されていることと、デバイスクラウドが正しく反応し、Lambda関数が8秒以内にレスポンスを送信できることをご確認ください。

「すみません。<デバイス>が応答していません。」かつスマートデバイスが反応しない

技術資料のサンプルJSONと比較してください。インタフェースによって、payloadの形式が異なりますので、各パラメータのスペリング、payloadオブジェクトの形式、headerオブジェクトのnamespaceとnameのパラメーターのスペリングを確認してください。一からレスポンスを組み立てるより、サンプルのJSONをコピーし、一部編集して使うことを推奨します。

例えば、ThermostatControllerのAdjustTargetTemperatureの技術資料では、payload内のtargetSetpointDeltaの形式を確認できます:

Copied to clipboard
{
  "directive": {
    "header": {
      "namespace": "Alexa.ThermostatController",
      "name": "AdjustTargetTemperature",
      "messageId": "<message id>",
      "correlationToken": "<an opaque correlation token>",
      "payloadVersion": "3"
    },
    "endpoint": {
      "scope": {
        "type": "BearerToken",
        "token": "<an OAuth2 bearer token>"
      },
      "endpointId": "<endpoint id>",
      "cookie": {}
    },
    "payload": {
      "targetSetpointDelta": {
        "value": -2.0,
        "scale": "CELSIUS"
      }
    }
  }
}

Alexa開発者コンソールのスマートホームテストを使用してください。以下のインターフェースの自動化されたテストが実行できます:

  • BrightnessController
  • ColorController
  • ColorTemperatureController
  • PowerController
  • ThermostatController

デバイスの全てのプロパティがStateReportに定義されていることをご確認ください。例えば、TemperatureSensorThermostatControllerが含まれているデバイスでは、TemperatureSensorのtemperatureのプロパティとThermostatControllerのthermostatMode、targetSetpoint、lowerSetpointやupperSetpointがDiscoveryで定義されているのであればそれらのプロパティがStateReportに含まれていることをご確認ください。

特定のデバイスのコントローラやインターフェースが操作できない

ある発話で特定のデバイスのインターフェースを操作できますが、似たような発話で同じデバイスが操作できない場合があります。各インターフェースの技術資料にはサポートされている発話が記載されています。そのインターフェースが正しく実装されているのであれば、技術資料にある発話を使用できます。例えば、ThermostatControllerが実装されているサーモスタットは技術資料にある発話で操作することができます。

関連ドキュメント

Subscribe