AWS IoT を駆使してペットの気持ちを理解する
渡邉 聡
こんにちは。ソリューションアーキテクトの渡邉です。我が家には 5 才になるトイプードルがおり、実家では長く犬を飼っていたのですが、私自身特に世話をしてきたわけではないので、犬の飼い方のノウハウもなく、四苦八苦しながら育ててきました。
家の中をいかにして荒らされないようにするかという点において、トイレのしつけはとても重要だと最初から意識していたのですが、どんな方法でやるのが良いのか分からず苦労してきました。最終的におやつで釣ってしつけてきたのですが、これによって、5才になった今でもトイレ後は必ずおやつをせびる始末です。「しっかりトイレでできて偉いね!」とコミュニケーションが取れる時間としてはとっても良いのですが、一方でこの子のトイレを四六時中監視できるわけもなく・・・こんな風にポツンと見上げられてもなんのことか分からない ?? ということがしばしばあります。
そこで、今回は IoT の力でこの子のトイレを監視し、ぽつんと見上げられるときにトイレだったのかどうかチェックできる仕組みを作っていきたいと思います。
実際お試しいただくために、今回作成したソースコードをダウンロードできます。
目次
1. 利用するデバイス
2. 全体のアーキテクチャ
2-1. M5StickC を使ってセンシング情報を AWS に送信する
2-2. Arduino IDE のセットアップ
2-3. ライブラリのセットアップ
3. 実装
4. センサーの配置
5. AWS IoT Core に来たメッセージを Amazon DynamoDB に連携する
5-1. DynamoDB のテーブル定義を作成する
5-2. IoT Core から DynamoDB にメッセージを連携する
ご注意
本記事で紹介する AWS サービスを起動する際には、料金がかかります。builders.flash メールメンバー特典の、クラウドレシピ向けクレジットコードプレゼントの入手をお勧めします。
このクラウドレシピ (ハンズオン記事) を無料でお試しいただけます »
毎月提供されるクラウドレシピのアップデート情報とともに、クレジットコードを受け取ることができます。
1. 利用するデバイス
今回この仕組みを作っていくにあたり、いくつか仕組みとデバイスを検討したのですが、今回は下記のような PIR (Passive Infrared Ray: パッシブ型赤外線) モーションセンサー使って犬がトイレに入ったことを検知するようにしようと思います。
PIR センサーについて詳しく仕組みを理解しているわけではなかったので、まずは自宅にあった GROVE 接続できる PIR モーションセンサーを使ってみました。このセンサーには検出角度、検出距離があるので、どんな状況下で使うか考えた上でデバイスを選定するのが良さそうです。今回は犬のケージに貼り付けて使おうと思っていたのですが、最初に試した GROVE PIR Motion Sensor (上記写真の一番上のもの) ではケージ外の広い範囲の動きをとってしまい用途には合いませんでした。そこでいくつかの PIR センサーを購入してみて試してみたところ、今回の用途では M5Stack 用 PIR センサーユニット (写真左のもの) が用途に合いそうでした。この手のセンサーは単品の価格はお手頃なので個人で色々試してみるには気軽に始められて良いですよね。
最終的に用意したデバイスは以下の通りとなります。
- M5StickC
- M5Stack 用 PIR センサーユニット
- Amazon Echo
2. 利用するサービス
今回の仕組みを作成するにあたり利用した AWS サービスは下記の通りです。
- AWS IoT Core
- Amazon DynamoDB
- AWS Lambda
これらのサービスについてはこの後セットアップしながら説明していきますが、より詳しく知りたい場合は、「詳しくはこちらを」から各種サービスの特徴ページをご覧ください。
AWS IoT Core
AWS IoT Core は、インターネットに接続されたデバイスから、クラウドアプリケーションやその他のデバイスに簡単かつ安全に通信するためのマネージド型クラウドサービスです。 詳しくはこちら »
Amazon DynamoDB
Amazon DynamoDB は、規模に関係なく数ミリ秒台のパフォーマンスを実現する、フルマネージド型の key-value およびドキュメントデータベースです。 詳しくはこちら »
AWS Lambda
AWS Lambda はイベント発生時にお客様のコードを実行し、基盤となるコンピューティングリソースをお客様に代わって管理する、サーバーレスコンピューティングサービスです。 詳しくはこちら »
また、これに加えて Alexa の開発として Alexa developer console を使っています。
3. 全体のアーキテクチャ
今回のシステムアーキテクチャは下記のようになります。
M5StickC に取り付けられた PIR センサーをトイレケージに取り付け、犬のトイレを監視します。PIR モーションセンサーで犬を感知したら、MQTT で IoT Core に通知を行い、そのまま DynamoDB に書き込みを行います。DynamoDB にはセンサー毎に検知した時刻が刻まれていきます。Echo からは Alexa カスタムスキルを経由して Lambda をキックし、DynamoDB を参照して直近の時刻を取得することで、直近何時にトイレをしたのかわかるようになるという仕組みです。
それでは早速作ってみて行こうと思います。
4. M5StickC を使ってセンシング情報を AWS に送信する
4-1. Arduino IDE のセットアップ
こちらのページ を参考に Arduino IDE を設定していきます。ドライバーのインストール、ArduinoIDE のインストール、ボードマネージャ (今回は M5StickC 向け) の設定、M5StickC ライブラリのインストールまで行います。
4-2. ライブラリのセットアップ
今回のプログラムではセンサーで動体を検知したら MQTT メッセージを AWS IoT に送信するために PubSubClient というライブラリと、JSON メッセージを簡単に作成するために ArduinoJson というライブラリを使用しています。これらのライブラリをそれぞれ利用できるようにセットアップします。
PubSubClient のセットアップ
Arduino IDE のメニューから "スケッチ" -> "ライブラリをインクルード" -> "ライブラリを管理..." を選択します。
ライブラリマネージャが開いたら検索領域に "PubSubClient" と入力し検索を実行します。
※今回バージョン 2.8.0 をインストールしています。バージョンが異なると今回使用するソースコードに変更が必要となる場合がありますのでご注意ください。
クリックすると拡大します
ArduinoJson のセットアップ
PubSubClient と同じようにライブラリマネージャから "ArduinoJson" を検索してセットアップします。
※今回バージョン 6.16.1 をインストールしています。バージョンが異なると今回使用するソースコードに変更が必要となる場合がありますのでご注意ください。
クリックすると拡大します
4-3. 実装
MQTT エンドポイントの確認
まず、ソースコードに反映する必要がある MQTT のエンドポイントを確認します。AWS IoT のコンソールを開き 設定 を選択します。
クリックすると拡大します
カスタムエンドポイントの URI を確認します。この後ソースコードに埋め込む必要があるのでメモしておくと良いでしょう。
クリックすると拡大します
デバイス証明書を発行する
続いて、M5StickC が AWS IoT Core のエンドポイントに接続するために使用するデバイス証明書を発行します。デバイス証明書には接続の認可を行うためのポリシーを割り当てる必要があるので、ポリシーを作成し証明書に割り当てを行います。
ポリシーの作成
最初にポリシーの作成を行います。
AWS IoT のメニューから 安全性 を展開し ポリシー を選択します。
クリックすると拡大します
任意のポリシー名を入力しステートメントを追加します。
今回はデバイスを AWS IoT Core に接続 (iot:Connect) し、決められたトピックに対してPublish (iot:Publish) できれば良いので、ステートメントを 2 つ追加し、一つ目のアクションには iot:Connect、リソース ARN には arn:aws:iot:ap-northeast-1:XXXXXXXXXXXX:client/${iot:Connection.Thing.ThingName} とし、二つ目のアクションには iot:Publish、リソース ARN には arn:aws:iot:ap-northeast-1:XXXXXXXXXXXX:topic/myhome/pet/${iot:Connection.Thing.ThingName} (リージョン及び XXXXX となっているアカウント ID はご自身のアカウント ID) とし、効果はそれぞれ 許可 にチェックします。
クリックすると拡大します
iot:Connect のリソース ARN は AWS IoT Core レジストリに登録されたモノの名前に一致するクライアント ID を使用したデバイスからのみ接続を許可するという意味になります。また、iot:Publish のリソース ARN は myhome/pet/<ThingName> トピックへのみ Publish を許可するという意味になります。
アドバンストモードで入力する場合には下記のような JSON ドキュメントとなります。
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": "iot:Connect",
"Resource": "arn:aws:iot:ap-northeast-1:XXXXXXXXXXXX:client/${iot:Connection.Thing.ThingName}"
},
{
"Effect": "Allow",
"Action": "iot:Publish",
"Resource": "arn:aws:iot:ap-northeast-1:XXXXXXXXXXXX:topic/myhome/pet/${iot:Connection.Thing.ThingName}"
}
]
}
今回は DynamoDB のキーにセンサー名を入れ接続してくるデバイス毎に情報を管理していきます。センサーからのデータ送信時にセンサー名をセンサーのペイロードに入れることも可能ですが、今回は Topic 名にセンサー名を入れています。
Publish 出来る Topic 名は今回設定したようにポリシーを使って制御可能です。更にポリシー変数を使うことで登録済みのデバイス名の Topic にしか Publish できなくなるので、これによってデバイス名を装い不正にデータ送信されるということを防ぐことができます。
このようにしておくことで、デバイスから不正に証明書を抜き出され不正に接続されたとしても、送信できる Topic は限られるので影響は限定的になります。
入力が終わったら 作成 を押下してポリシー作成を完了します。
デバイス証明書の発行
M5StickC に設定するデバイス証明書を発行し、先程作成したポリシーを割り当てます。AWS IoT のメニューから“管理”を展開し モノ を選択し、モノ画面の中の 作成 を押下します。
クリックすると拡大します
AWS IoT のモノの作成方法について選択肢が出てきますが、今回は単一のモノの作成となるので、単一のモノを作成する を選択します。
クリックすると拡大します
デバイスの Thing として任意の名前を付け、画面下部までスクロールして 次へ を押下します。
クリックすると拡大します
続いて証明書の作成ですが、今回は AWS IoT が発行した証明書を使うので 証明書を作成 を押下します。
クリックすると拡大します
作成されたモノの証明書、パブリックキー、プライベートキーを ダウンロード リンクからダウンロードし保存しておきます。
加えて AWS IoT のルート CA 証明書もリンクからダウンロード (Amazon Trust Services エンドポイント (推奨) の RSA 2048 ビットキーをダウンロード) しておきます。更に 有効化 ボタンを押下して作成した証明書を有効化しておきます。ダウンロード、有効化が終わったら ポリシーをアタッチ を押下して次に進みます。
クリックすると拡大します
検索ウィンドウで先程作成したポリシー名を入力して検索し、リストに表示されたポリシーにチェックを行い、モノの登録 を押下して作成を完了します。
クリックすると拡大します
ソースコードを修正する
今回作成した M5StickC 用のプログラムは main.ino としてダウンロードファイルの中に含めておきました。Arduino IDE で開き、メモしたエンドポイントの URI とダウンロードした証明書、及びプライベートキーを用いてソースコードを作成してきます。
また、M5StickC をネットワークにつなげる為に、接続先の WiFi アクセスポイントの SSID と接続パスフレーズについても書き換えていただく必要がありますが、M5StickC は 2.4GHz でしか通信できないのでご注意ください。
具体的には下記のソースコードを修正します。
// 以下を環境に応じて変更
#define WIFI_SSID "SSID_STRING" // 接続するWiFiアクセスポイントのSSIDに変更
#define WIFI_PASSPHREASE "WIFI_PASSWORD" // WiFiアクセスポイントのパスフレーズに変更
#define DEVICE_NAME "DEVICE_NAME" // デバイス証明書作成時に登録したデバイス名
#define AWS_IOT_ENDPOINT "AWS_IOT_ENDPOINT" // AWS IoTの設定で控えたIoT Coreのエンドポイント
また、root_ca, certificate 及び private_key も更新します。
ダウンロードしたルート CA を用いて "root_ca" 変数の "-----BEGIN CERTIFICATE-----" から "-----END CERTIFICATE-----" の部分を更新し、証明書登録時にダウンロードした XXXXXXXXXX-certificate.pem.crt を用いて certificate 変数の "-----BEGIN CERTIFICATE-----" から "-----END CERTIFICATE-----" の部分を更新、"XXXXXXXXXX-private.pem.key" を用いて "private_key" 変数の "-----BEGIN RSA PRIVATE KEY-----" から "-----END RSA PRIVATE KEY-----" を更新します。
// ダウンロードしたAWS IoTのルートCA証明書を用いて更新
const char *root_ca = R"(-----BEGIN CERTIFICATE-----
-----END CERTIFICATE-----
)";
// AWS IoTからダウンロードしたXXXXXXXXXX-certificate.pem.crtの情報を用いて更新
const char *certificate = R"(-----BEGIN CERTIFICATE-----
-----END CERTIFICATE-----
)";
// AWS IoTからダウンロードしたXXXXXXXXXX-private.pem.keyの情報を用いて更新
const char *private_key = R"(-----BEGIN RSA PRIVATE KEY-----
-----END RSA PRIVATE KEY-----
)";
プログラムの構成としては、setup 関数で表示の設定、WiFi への接続、MQTT 接続の初期化、AWS IoT Core への接続を行い、loop 関数でセンサーのデジタル値の読み込みを行い、フラグが立った (検出した) 際に、JSON メッセージを作成して MQTT でトピックに対して Publish しています。高頻度で検知する (loop 関数を呼び出す) 必要はないので一定時間の wait を入れた上で loop 関数を終了するようにしています。
ビルドを実行しデバイスへ転送する
Arduino IDE のメニューから “スケッチ” - “検証・コンパイル” を選択してコンパイルを実行します。
クリックすると拡大します
問題なくコンパイルが完了したら、“スケッチ” - “マイコンボードに書き込む” を選択して M5StickC に書き込みを実行します。
クリックすると拡大します
書き込みが行えたら、M5StackC でプログラムが起動し、設定した WiFi アクセスポイントへの接続、AWS IoT Core への接続が行われ、センサーを取り付けていない状態では “EMPTY” と表示されます。
クリックすると拡大します
センサーを取り付けて、センサーに手をかざすと “IN” と表示が変わります
クリックすると拡大します
4. センサーの配置
M5StickC に繋いだセンサーをケージに取り付け、ケージに手を入れて反応を確認しながら場所を調整します。
試してみたところ、このセンサーでも周りの動きにかなり敏感に反応してしまい、犬のケージの周りをウロウロするだけでも反応してしまったので、センサーにさらに覆いをつけてみました。
クリックすると拡大します
この状態でケージにつけてみたところ、ケージの中に手を入れた時にのみ反応するようになりました。
クリックすると拡大します
5. AWS IoT Core に来たメッセージを Amazon DynamoDB に連携する
5-1. DynamoDB のテーブル定義を作成する
DynamoDB のコンソールで新規にテーブル定義を作成します。
アップロード前のフォルダ指定画面
クリックすると拡大します
任意のテーブル名 (今回は “pet_detection” としました) をつけ、プライマリキーは “sensor” とし、“ソートキーの追加” にチェックを入れ、ソートキーとして “timestamp” を設定します。
今回は直近のトイレの時間さえわかれば要件としては足りるので、ソートキーとして “timestamp” を入れる必要はないのですが、あとで時系列情報としてトイレの時刻を遡って確認することも考慮してこのようなテーブルとしました。
クリックすると拡大します
とはいえ、データを延々と保存しておくのも意味がないので、一定期間したらレコードを削除するようにしておきたいと思ます。作成したテーブルの “概要” タブから、“TTLの管理” を選んで TTL の有効化を行なっていきます。
クリックすると拡大します
TTL 属性として有効期限を記したカラムを設定します。有効期限のカラムはこの後 IoT Core で追加します。ここでは expiration_time というカラムに有効期限が入っているという前提で予め設定しました。
クリックすると拡大します
5-2. IoT Core から DynamoDB にメッセージを連携する
ルールアクションの設定
クリックすると拡大します
クリックすると拡大します
ルールクエリステートメント
このルールクエリの結果が DynamoDB に書き込まれます。DynamoDB のテーブルには、sensor 名をキーとして、タイムスタンプ、有効期限を書き込む必要があります。センサーからのペイロードにはこれらの値は含まれていませんので、ルールアクションの実行タイミングでこれらの値を追加していくようクエリを作成していきます。
まず、センサー名ですが、これは Topic の三階層目に入っていますので、Topic() 関数を使って抽出し加えます。また、タイムスタンプはデバイス側の時刻を用いるのが適切な場合が多いですが、M5StickC で時間を取り扱うのはハードルが高いので、今回は時間についてはクラウド側で刻むことにしました。timestamp() 関数で現在時刻を UNIX Time として取得できます。
今回はデータの視認性も考えて DynamoDB には ISO8601 形式で保存しておくことにしました。timestamp() 関数で取得した UNIX Time に対して、paese_time() 関数を使用し TimeZone を Asia/Tokyo にした上で時刻を文字列として保存しています。更に、先ほどの DynamoDB テーブルを作成で定義した通り、レコードを一定時間したら消すために、レコードの有効期限も追加します。
今回は 24 時間は残すように設定しようと思いますので、timestamp() 関数で取得した現在時刻 (秒) に対して 86400 (秒) を加えた値を expiration_time として追加しています。これらの値の他に送られてきたメッセージを全て DynamoDB に書き込むように “*” も SELECT 文の中に入っています。
SELECT
topic(3) as sensor,
parse_time("yyyy-MM-dd'T'HH:mm:ssZ",timestamp(),"Asia/Tokyo") as timestamp,
timestamp() / 1000 + 86400 as expiration_time,
*
FROM 'myhome/pet/+'
アクションの設定
“1 つ以上のアクションを設定する” の項目で “アクションの追加” を選択し、アクションを設定します。DynamoDB に IoT メッセージとして入ってきたデータを複数列に分けて入力できるよう “DynamoDB テーブル (DynamoDBv2) の複数列にメッセージを分割する” を選択します。
クリックすると拡大します
“1 つ以上のアクションを設定する” の項目で “アクションの追加” を選択し、アクションを設定します。DynamoDB に IoT メッセージとして入ってきたデータを複数列に分けて入力できるよう “DynamoDB テーブル (DynamoDBv2) の複数列にメッセージを分割する” を選択します。
クリックすると拡大します
6. Alexa カスタムスキルを使って直近のトイレ時間を Echo を使って確認できるようにする
6-1. Alexa Developer Console でスキルを作成する
Alexa developer console で Alexa Skill を開発していきます。
クリックすると拡大します
今回はスクラッチで作成していくこととします。
クリックすると拡大します
作成が完了したら呼び出し名を決めていきます。今回はそのままですが「トイレの時間」としました。
クリックすると拡大します
インテントは今回は呼び出しだけで時間を教えてもらうようにするため、最低限のものだけ (HelloWorldIntentを削除) にしました。
クリックすると拡大します
ただし、このまま (サンプル発話になにもない状態) だとビルド時にエラーとなってしまうため、CancelIntent のサンプル発話に “キャンセル” を追加しました。JSON エディターだと下記のような JSON になります。
{
"interactionModel": {
"languageModel": {
"invocationName": "トイレの時間",
"intents": [
{
"name": "AMAZON.CancelIntent",
"samples": [
"キャンセル"
]
},
{
"name": "AMAZON.HelpIntent",
"samples": []
},
{
"name": "AMAZON.StopIntent",
"samples": []
},
{
"name": "AMAZON.NavigateHomeIntent",
"samples": []
}
],
"types": []
}
}
}
作成が終わったら “モデルのビルド” を押してビルドを実行しておきます。
クリックすると拡大します
クリックすると拡大します
スキル ID の確認
Lambda 側に反映するスキル ID をエンドポイントで確認しコピーしておきます。
クリックすると拡大します
6-2. カスタムスキル用 Lambda を作成する
Amazon Alexa のサイト を参考にカスタムスキル開発を進めます。ここでは Lambda 関数を一から作成していきます。
SDK とプログラムを設定する必要があるため、ローカル環境でプログラムと SDK をまとめて zip 圧縮してから Lambda に zip 圧縮したプログラムを適用します。
プログラム配置用のディレクトリを下記の通り作成します。
$ mkdir custom_alexa_skill
作成した “custom_akexa_skill” ディレクトリに下記の Python プログラム (lambda_function.py) を作成します。
'''
Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
SPDX-License-Identifier: MIT-0
Permission is hereby granted, free of charge, to any person obtaining a copy of this
software and associated documentation files (the "Software"), to deal in the Software
without restriction, including without limitation the rights to use, copy, modify,
merge, publish, distribute, sublicense, and/or sell copies of the Software, and to
permit persons to whom the Software is furnished to do so.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED,
INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A
PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
'''
import datetime
import os
import boto3
from ask_sdk_core.skill_builder import SkillBuilder
from ask_sdk_core.utils import is_request_type
from ask_sdk_model.ui import SimpleCard
from boto3.dynamodb.conditions import Key
sb = SkillBuilder()
TARGET_TABLE = os.environ.get("DYNAMO_TABLE","pet_detection")
TARGET_SENSOR = os.environ.get("SENSOR_NAME","pet_sensor")
@sb.request_handler(can_handle_func=is_request_type("LaunchRequest"))
def launch_request_handler(handler_input):
dynamoDB = boto3.resource("dynamodb")
table = dynamoDB.Table(TARGET_TABLE)
queryData = table.query(
KeyConditionExpression = Key("sensor").eq(TARGET_SENSOR), # 取得するKey情報
ScanIndexForward = False, # 昇順か降順か(デフォルトはTrue=昇順)
Limit = 1 # 取得するデータ件数
)
if queryData.get('Items'):
timestr = queryData['Items'][0]['timestamp']
dt = datetime.datetime.strptime(timestr, '%Y-%m-%dT%H:%M:%S%z')
speech_text = "{}時{}分です。".format(dt.hour, dt.minute)
else:
speech_text = "ごめんなさい、まだわかりません。"
handler_input.response_builder.speak(speech_text).set_card(
SimpleCard("Sensor Information", speech_text)).set_should_end_session(
True)
return handler_input.response_builder.response
@sb.request_handler(can_handle_func=is_request_type("SessionEndedRequest"))
def session_ended_request_handler(handler_input):
return handler_input.response_builder.response
@sb.exception_handler(can_handle_func=lambda i, e: True)
def all_exception_handler(handler_input, exception):
print(exception)
speech = "問題が発生しました。もう一度言ってください。"
handler_input.response_builder.speak(speech).ask(speech)
return handler_input.response_builder.response
lambda_handler = sb.lambda_handler()
このプログラムには ASK SDK for Python を使用しますので、上記 Lambda 関数を AWS にデプロイする前にパッケージに含める必要があります。下記のコマンドで ASK SDK を作成した Python プログラムと同じディレクトリにダウンロードします。
※ pip コマンドが使えるように Python3.8 の事前セットアップが必要です。
$ pip install ask-sdk-core -t .
コマンドを実行すると lambda_function.py と同じディレクトリに SDK がダウンロードされます。
下記のコマンドで lambda プログラムと SDK をまとめて zip 圧縮します。
$ cd ..
$ zip ./custom_alexa_skill.zip -r ./custom_akexa_skill/
※ zip ファイルを Windows などの環境で別のアプリケーションを使って圧縮する際には、ルート階層に lambda_function.py が来るように圧縮することに注意してください。
6-3. Lambda 関数の作成
作成した Zip ファイルを元に Lambda 関数を作っていきます。“一から作成” を選び、任意の関数名を入力します。ランタイムは “Python3.8” とします。
クリックすると拡大します
作成された関数に対して Alexa Skill から呼び出し出来るよう “+トリガーを追加” を選択してトリガーを追加していきます。
クリックすると拡大します
“トリガーの設定” で “Alexa Skills Kit” を選択します。
クリックすると拡大します
スキル ID の検証を “有効 (推奨)” を選択し、スキル ID に Alexa Developer Consoleで作成したスキル ID を入力します。
クリックすると拡大します
作成した Lambda 関数名をクリックして関数コードを表示させ、“アクション” から “zipファイルをアップロード” を選択して先ほど作成した Zip ファイル (custom_alexa_skill.zip) をアップロードします。
クリックすると拡大します
この Lambda 関数は DynamoDB のテーブルをクエリして結果を返すものですが、この状態ではこの Lambda 関数から DynamoDB にアクセスできません。実行ロールを編集して DynamoDB にアクセス出来るように設定していきます。
“アクセス権限” タブを開き “実行ロール” の項目にあるロール名をクリックして IAM コンソールを表示します。
クリックすると拡大します
“ポリシーをアタッチします” をクリックしてポリシーを追加します。
クリックすると拡大します
“AmazonDynamoDBReadOnlyAccess” を追加します。“ポリシーのフィルタ” で “AmazonDynamoDB” と入力すると候補に出てくるのでチェックボックスを選択し、“ポリシーのアタッチ” を押して決定します。
クリックすると拡大します
Alexa スキルのエンドポイントを更新する
Lambda 関数の ARN をコピーして Alexa スキルのカスタムエンドポイントを更新します。
Lambda 関数のコンソールの上部にある ARN をコピーします。
クリックすると拡大します
Alexa developer console のエンドポイントの AWS Lambda の ARN の項目の、“デフォルトの地域” にコピーした Lambda の ARN を反映します。反映したら "エンドポイントを保存" を押下して設定を保存します。
クリックすると拡大します
7. 試してみる
まずは alexa developer console のテスト機能で試してみます。ステージを “開発中” に変更して、マイクボタンを押しながら「トイレの時間」と発話 (もしくはキーボードで入力) してみます。
クリックすると拡大します
直近のセンサーが反応した時間が返されます。
クリックすると拡大します
それでは、実際に Echo デバイスにカスタムスキルを設定して試してみます。
クリックすると拡大します
8. まとめ
今回は PIR センサーによるペット検知でしたが、IoT デバイスに取り付けられるセンサーは多種多様なデバイスが存在します。アイデア次第では今回の仕組みをそのまま使って簡単に色々な応用も可能になるのではと思います。
また、個人で所有する複数のデバイスに対応したり、複数のお客様に対してサービスを提供したりも応用によっては可能になりますので、皆さんもチャレンジしてみてください!
筆者プロフィール
渡邉 聡
アマゾン ウェブ サービス ジャパン合同会社
デジタルトランスフォーメーション本部 プロトタイピングソリューションアーキテクト
趣味は DIY で棚や机の作成から、料理から手芸まで興味のあるものは何でも作ってみます。最近は何十年ぶりに自作 PC を組み立ててみました。
AWS を無料でお試しいただけます