スマートホームスキルとは
スマートホームスキルは、カスタムスキルと異なり、ユーザーが発話した内容を、プログラム用意なパラメーターにまで分解して呼び出してくれます。例えば、照明をつける場合、「Alexa、端末名をオンにして」といういうと、以下のようなDirectivesという形でスマートホームスキルが呼び出されます。
{
"directive": {
"header": {
"namespace": "Alexa.PowerController",
"name": "TurnOn",
"payloadVersion": "3",
"messageId": "1bd5d003-31b9-476f-ad03-71d471922820",
"correlationToken": "dFMb0z+PgpgdDmluhJ1LddFvSqZ/jCc8ptlAKulUj90jSqg=="
},
"endpoint": {
...
}
一般的なWebAPIの呼び出しと変わらない形で呼んでくれますので、会話の組み立てなどを考える必要がなく開発する側は非常に楽です。
カスタムスキルの場合は、会話が分解されて文字列としてスキル側に渡されます。そののため各言語ごとの処理が必要になります。しかしスマートホームスキルの場合は、その辺りの処理はAlexaが行ってくれるので、他言語化対応ができます。
以下の照明のON/OFFの場合、英語(米国)、英語(英国)、英語(インド)、ドイツ語、日本語の5ヶ国語に対応が可能です。
https://developer.amazon.com/ja/docs/device-apis/alexa-powercontroller.html
やりたいこと
自前デバイスを制御するためのスマートホームスキルの作成方法を理解する。デバイスは自前クラウド経由で制御が可能。自前クラウドはCognito User Poolsでアカウント管理を行っており、AlexaのAmazonアカウントと連携して制御可能とする。(アカウントリンク)
#開発者コンソールでスキルの登録
Amazon開発者コンソールでスキルを登録します。
https://developer.amazon.com/home.html
以下のように設定してスキルを作成します。後からLambdaなどの設定をするので、まずははアプリケーションIDだけ取れれば良いです。
#AWS Lambdaでスマートホームスキルの作成
AWSコンソールでスマートホームスキルをLambdaで作成します。Lambdaには、スマートホームスキルの雛形が用意されていますので、まずはそれを利用します。"設計図"、"alexa-smart-home-skill-adapter"を選択します。Amazonに確認したわけではないですが、tokyoリージョンにLambdaを作成した時は後にエラーになりました。us-east-1を選択して下さい。
以下のようにLambdaの設定をします。アプリケーションIDは先ほど作成したスマートホームスキルのIDを設定します。
Lambdaが作成されました。後ほどARNをスキルの設定で利用します。
Cognito User Poolsの設定
次にアカウント管理のためのCognito User Poolsの設定をしていきます。AWSコンソールよりユーザープールを作成します。ステップに従って設定するを選択します。
基本的な仕組みを確認するためなので、属性などはここでは必要ありません。以下のように設定をしていきます。
- 属性
- 標準属性 - なし
- カスタム属性 - なし
- ポリシー
- パスワード強度:デフォルト 8文字
- ユーザーの自己サインアップ:デフォルト 許可する
- 有効期限:デフォルト 7日間
- MFA
- MFA:OFF
- 検証:e-mailのみ
- メッセージのカスタマイズ
- E メール検証メッセージをカスタマイズ:デフォルト
- ユーザー招待メッセージをカスタマイズ:デフォルト
- E メールアドレスをカスタマイズ:デフォルト
- タグ/デバイスはスキップして次へを選択
- 「アプリクライアント」で「アプリクライアントの追加」
あとは次へを選択してプールを作成。次にスマートホームスキルに設定するための以下の二つの情報を取得。
- アプリクライアントID
- 「アプリの統合」「ドメイン名」をクリックして、適当なドメインを設定
スキルの設定
Alexaのコンソールの設定に戻って、以下の設定をします。
- LambdaのARNの設定
- アカウントリンクの設定
コールバックURIは次の設定で利用します。
Cognito User PoolsにコールバックURIの設定
先ほど取得したOAuthのコールバックURIを以下のように設定します。
動作確認
後ほどアップデートします