スイッチでAlexa定型アクションを起動~スキル作成編~

Alexaスマートホームスキルを作成します。

Step1:ログイン

Alexa開発者コンソール(https://developer.amazon.com/alexa/console/ask)にログインします。Amazonの買い物アカウントがある場合はそのアカウントでログインします。開発者アカウントについての詳細は以下を参照してください。

開発者アカウントの作成
https://developer.amazon.com/ja/docs/app-submission/manage-account-and-permissions.html#create_account

今回のスキルは一般公開せず、開発中のままで使うことになります。買い物アカウントと開発中のアカウントを共通にするのは、現在使用しているechoで開発中のスキルを使用できるようにするためです。

Step2:スキルの作成を開始

ダッシュボード画面が表示されたら、Alexa Skills Kitを選択します。

スキルのメイン画面で「スキルの作成」ボタンを選択します。

新しいスキルを作成画面でスキル名を入力し、スキルに追加するモデルに「スマートホーム」を選択します。スキル名は「MotionSensors」にしてみました。
「スキルを作成」ボタンを押下します。

スマートホーム画面でスキルIDをコピーし、メモしておきます。

Step3:AWSアカウントの作成

以下のページの説明に従い、AWSアカウントを作成します。
クレジットカードまたはデビッドカードの請求情報が必要になります。
サポートプランは無料のベーシックプランで構いません。

AWS アカウント作成の流れ
https://aws.amazon.com/jp/register-flow/

Step4:Lambda関数の作成

AWSにログインしたら、左上のサービスメニューからLambdaを選択します。

右上に表示されているリージョンを「北米西部(オレゴン)」にします。日本からのAlexaスマートホームスキルはオレゴンに置かなくてはなりません。

オレゴンになったのを確認したら、「関数の作成」をクリックします。

関数の作成画面では「一から作成」を選択します。
関数名は「MotionSensorsFunc」にしました。
ランタイムは「Node.js 16.x」、アーキテクチャーは「arm64」を選択しました。
x86でも全く問題はありませんが、arm64にしたのは万が一課金が発生したとしても料金が若干安いからです。
「関数の作成」を選択します。

関数の概要の「+トリガーを追加」をクリックします。

トリガーの設定画面で「Alexa」、「Alexa Smart Home」を選択し、Skill IDにはStep2の最後にメモしておいたスキルIDを入力します。「追加」ボタンを押下します。

画面下部のほうで「コード」タブを選択し、index.jsを選択します。ここにソースを貼り付けます。「あんスマ」の物で全く問題ありませんが、少し手を加えたソースを下に掲載します。

「あんスマ」のコードから変更した内容は、以下の3点です。
1)sensor_num=10の宣言を変更するだけでセンサー数を変更できるようにした。
2)ボタンは不要なのでボタン関係の部分を削除
3)その他ハマっていた時にコチョコチョと変えた部分。例えば57行目のステータスコードのログ出力など。プログラムロジックには変更ありません。
以下からindex.jsをダウンロードできます。

コードをWebページのindex.jsにコピー&ペーストして「Deploy」を押下します。deployとは展開する、配置するという意味で、「AWSに内容を送信」という意味でしょうか。Node.jsはスクリプト言語ですのでビルドする必要はありません。プログラムに問題があると、Webページ上の行頭に印が付いて教えてくれます。エラーがあるプログラムを実行するとログにエラー内容が記録されます。今回の場合、コードの修正をしなければエラーは発生しない筈です。
クライアントIDとシークレットIDはまだ空欄のままです。後程設定します。

Step5:Lambda関数のARNをスマートホームスキルのエンドポイントに設定

Lambda関数のARN(Amazon Resource Name)をコピーします。

コピーしたARNをスマートホームスキル画面の「デフォルトのエンドポイント」に貼り付けます。「保存」ボタンで変更を保存します。

Step6:LWA(Login with Amazon)のセキュリティプロファイルの作成

Login with AmazonとはAmazonのユーザー認証サーバーであり、「Googleでログイン」、「facebookでログイン」と同じようなものかと思います。この設定を行い、スキルとリンクさせます。以下に詳しい説明があります。

Login with Amazonについて
https://developer.amazon.com/ja/apps-and-games/login-with-amazon

Login with Amazonに開発者アカウントでログインし、「セキュリティプロファイルの新規作成」をクリックします。

Login with Amazon
https://developer.amazon.com/loginwithamazon/console/site/lwa/overview.html

セキュリティプロファイル管理画面で「セキュリティプロファイル名」、「セキュリティプロファイルの説明」、「プライバシー規約同意書URL」を入力します。テキトーで構わないようですが、これはスキル開発用のプロファイルですという感じにすれば良いのではないでしょうか。URLにはhttps://example.comを使用させていただきました。
「保存」ボタンで保存します。

「ウェブ設定」タブを押下し「クライアントID」と「クライアントシークレット」をコピーします。クライアントシークレットは「シークレットを表示」をクリックして表示させます。(ちなみにこのIDとシークレットはLambda関数のindex.jsに貼り付けるものではありません。ご注意を。)

Step7:スキルのアカウントリンクの設定

スキルにアカウントリンクの設定を行います。スキルを有効にしたときのユーザー認証画面の設定になります。
スマートホームスキル画面の左メニューから「アカウントリンク」を選択します。

各項目には次の値を入力します。
Web認証画面のURI:https://www.amazon.com/ap/oa
アクセストークンのURI:https://api.amazon.com/auth/o2/token
ユーザーのクライアントID:Login with Amazonで取得したクライアントID
ユーザーのシークレット:Login with Amazonで取得したクライアントシークレット
ユーザーの認可スキーム:HTTP Basic認証(推奨)
スコープ:profile、またはprofile:user_id
※詳細は以下を参照
Configure account linking
https://developer.amazon.com/en-US/docs/alexa/smarthome/set-up-account-linking-tutorial.html#account-link
ユーザープロファイル
https://developer.amazon.com/ja/docs/login-with-amazon/customer-profile.html

ここまで入力したらページ右上の「保存」ボタンを押下します。
また、この画面にある「Alexaのリダイレクト先URL」3つをコピーします。

Login with Amazonのウェブ設定画面に戻り、「Alexaのリダイレクト先URL」からコピーした3つのURLを、「別のものを追加する」をクリックして「許可された返信URL」に貼り付けます。「保存」ボタンを押下します。

Step8:アクセス権限の設定

スキルを有効にした際、AccessGrantディレクティブがスキルに送信されるようにします。この設定をしないとリフレッシュトークンを取得できず、イベントゲートウェイに送信するときに必要なアクセストークンが取得できなくなります。
スマートホームスキル画面の左メニューから「アクセス権限」を選択します。
「Alexaイベントを送る」をON状態します。そうするとAlexaスキルメッセージングの項目が有効になります。「AlexaクライアントID」と「Alexaクライアントシークレット」をコピーしメモします。
クライアントシークレットは「表示」ボタンで表示させます。
このページに保存ボタンはないですが、他の画面の「保存」ボタンで変更を保存します。
このクライアントIDとクライアントシークレットをLambda関数のindex.jsにコピーします。

Step9:Lambda関数の完成

AWS Lambdaの関数画面に戻り、コードindex.jsの先頭にあるclient_ID=とclient_secret=にアクセス権限からコピーした値を貼り付けます。
「Deploy」ボタンをクリックして変更を反映します。

以上でスキルの作成は完了です。
次にAlexaアプリでスキルを有効にしてみます