AWS Lambda で Alexa Smart Home Skill を実装し、Alexa で ESP8266(Arduino)に接続した LED を操作できるようにします。
目次
前回と今回の記事で、Alexa Smart Home Skill と AWS IoT を組み合わせることで Alexa から ESP8266 に接続した LED を操作する方法を具体的に説明しています。
前回の記事では、AWS IoT Core と ESP8266 を連携させて、AWS から ESP8266 の LED を操作できるようになりました。
今回の記事は、AWS Lambda を用いて Alexa Smart Home Skill の実装をおこない、Alexa で ESP8266 の LED が操作できるようにします。
Amazon 開発者情報 を入力する
Amazon 開発者ポータル にアクセスします。AWS とは別物です。Amazon.co.jp のアカウントでログインします。
▶ https://developer.amazon.com/dashboard
日本版 Amazon.co.jp のアカウントでログインしてください。『Amazon Developerアカウントを作成』を押してアカウント作成に進んではいけません。ここをクリックしてアカウントを作成すると、US版 Amazon.com のアカウントでログインした扱いになり、後の作業がうまくいかなくなります。
Alexa Smart Home Skill を作成する
スマートホームスキルを作成する
Amazon 開発者ポータルが表示されたら、『Alexa Skills Kit』を選択。
▶ https://developer.amazon.com/alexa/console/ask
『スキルの作成』を選択。
名前を決めて入力します。『ESP8266Skill』とでもしておきましょう。デフォルトの言語は日本語とします。モデルは『スマートホーム』を選択して、作成を押します。
これでスマートホームスキルが作成されました。
セキュリティプロファイルを作成しアカウントリンクを設定する
次に、セキュリティプロファイルを作成します。Alexa Smart Home Skill と Amazon.co.jp を連携させるための設定です。
Amazon 開発者ポータルで、『Login with Amazon』を選択。
▶ https://developer.amazon.com/loginwithamazon/console/site/lwa/overview.html
『セキュリティプロファイルを新規作成』を選択。
名前を決めて入力する。『ESP8266Skill』とでもします、説明とURLは適当に設定します。
セキュリティプロファイルが作成されました。『クライアントIDおよびクライアントシークレットを表示』します。表示された『クライアントID』と『クライアントシークレット』をコピっておきます。
再び『Alexa Skills Kit』の画面で作業します。
以下の通り入力します。
Web認証画面のURI | https://www.amazon.com/ap/oa |
アクセストークンのURI | https://api.amazon.com/auth/o2/token |
ユーザーのクライアントID | セキュリティプロファイルのクライアントIDを貼り付ける |
ユーザーのシークレット | セキュリティプロファイルのクライアントシークレットを貼り付ける |
スコープ | profile |
最後の『Alexaのリダイレクト先のURL』の3つのURLをコピっておきます。
再び『Login with Amazon』に移って作業をします。
『管理する』の『セキュリティプロファイル』を選択。
『ウェブ設定』を選択し、『編集』を選択。『許可された返信URL』に、先ほどの『Alexaのリダイレクト先URL』3つを入力します。
AWS Lambda で Skill のプログラムを書く
AWS にログインして、『AWS Lambda』にアクセスします。
▶ https://us-west-2.console.aws.amazon.com/lambda/home
リージョンを『米国西部(オレゴン)』に必ず変更します。これ以外のリージョンだと Alexa Skill で日本語が使えないようです。
Lambda 関数を作成する
『関数の作成』をします。
『一から作成』します。関数名は適当に決めます。『ESP8266Lambda』とでもしましょう。ランタイムは『Python 3.x』で。
実行ロールを『AWS ポリシーテンプレートから新しいロールを作成』に、ロール名は『ESP8266Role』とでもしておきます。
Lambda 関数が作成されました。
『アクセス権限』を選択。ロール名の下の青いリンク(ここでは『ESP8266Role』)を選択します。
ロールの設定画面に移りました。『ポリシーをアタッチします』。
『IoT』で検索して『AWSIoTFullAccess』を選択してポリシーの作成をします。ほんとはもう少し細かく設定したほうが良いのでしょうけど面倒なので。
『AWSIoTFullAccess』が付与されているのを確認します。
AWS Lambda と Alexa Smart Home Skill を連携させる
Amazon 開発者ポータルから『Alexa Skills Kit』を開きます。
▶ https://developer.amazon.com/alexa/console/ask
作成したスキルをクリック。
『スキルID』をコピっておきます。
『Lambda』の作成した関数の設定画面で、『トリガーを追加』を選択します。
『Alexa Smart Home』を選択。
先ほどコピーした『スキルID』を、『アプリケーションID欄』に貼り付けてから、追加します。
『Lambda』の関数設定画面の右上の ARN の値をコピります。
『Alexa Skills Kit』の作成したスキルの設定画面の『デフォルトエンドポイント』欄に、先ほどコピーした ARN の値を貼り付けて、保存します。
Lambda 関数の中身を用意する
私の作成したプログラムがあるので、ダウンロードしてください。
Lambda
以下のファイル群が、Lambda の中身です。alexa/skill-sample-python-smarthome-switch を参考に実装しました。ESP8266
は 前回の記事 で使用した ESP8266 のプログラム(スケッチ)です。
人によっては、2箇所ほど修正が必要かもしれません。
AWS IoT Core でオレゴン以外のリージョンを使っている人は、以下の region_name
を変える必要があります。ここで指定するのは Lambda のリージョンではなく IoT Core のリージョンです。
client = boto3.client('iot-data', region_name='us-west-2')
AWS IoT Core で作成したモノの Thing Shadow のトピック名を、モノの名前に応じて変更します。
topic_shadow_name = "$aws/things/ESP8266/shadow/update"
アップロードしてデプロイする
Lambda フォルダの中身を .zip で圧縮します。
『Lambda』の設定画面の『関数コード』の『アクション』の『.zip ファイルをアップロード』から .zip ファイルをアップロードします。
下のようになればOKです。最後に、『デプロイ』をクリックします。
以上で終了です。お疲れ様でした。
携帯の Alexa アプリで Smart Home Skill をインストールして試す
Alexa アプリを起動し、『デバイス』を選択。
『スマートホームスキル』を選択すると、『ESP8266Skill』にように、スキル名が表示されると思います。表示されない場合は、Alexa のログインに用いているアカウントとAmazon 開発者ポータルの登録に用いているアカウントが異なる可能性があります。
Amazonアカウントとの連携画面に移ったら、Amazonアカウント情報を入力します。
その後、デバイスの検出に移ります。45秒くらいかかりますが気長に待つと、無事に照明として検出されます。
アプリからLEDのON/OFFができるようになりました!!!
この状態で、「アレクサ、LEDをつけて」と言ってみましょう。LEDがつきました!!!
以上で、Alexa から ESP8266 に接続した LED を制御できるようになりました。これを応用すれば、Alexa で何でもできるようになる気がしてきます。
次回(あるのか分からない)は、赤外線LED を用いて、ESP8266 をスマートリモコン化したいと思います。どっかでプログラムの説明もしないとですね。
とても分かり易く参考になりました。特にAmazonの2つのサービスは初めて使ってみたのですが、このサイトの説明通りにやってみて初めてでもすんなりAlexaとESPを接続出来ました。