いまさらかもしれないですが AWS IoT Enterprise Buttonを買ってみたので、ちょっといじってみたレポート。
AWS IoT AWS IoT Enterprise Button の登録
かなり簡単に AWS アカウントと AWS IoT エンタープライズボタンを紐づけられた
- AppStore から AWS IoT 1-Click というアプリをダウンロード
- AWS アカウントにログイン
- バーコードをスキャンしデバイス登録
- Wifi の設定など
この状態で AWS IoT のマネジメントコンソールをみると以下のように機器が登録された状態になる
AWS IoT 1-Click プロジェクトを作成する
つづいて、マネジメントコンソールから AWS IoT 1-Click プロジェクトを作成できます。ここでは単純にイベント発生時にLambda をフックできるようです。 Email や SMS を送る選択肢がでてきますが、これを選ぶと結局のところ用意された Lambda 関数を叩くようなので、まあ基本的に裏側は Lambda とする作りのようです。
動作テスト
プロジェクトにデバイスプレイスメントを紐づけると、デバイスからのイベントに応じて各種処理が走ります。ためしに IoT ボタンをクリックしてみましょう。なお、私の手元だときちんと IAM ロール作って Lambda に設定してあげないと SMS が届かなかったので、SMS が届かない方はそのあたりを確認してみてください。ちゃんと設定をやってあげると以下のような感じで SMS が無事到達しました。うさぎを注文しました。
デバイスのイベントログに以下のような出力がでました。
// 2018/5/26 15:37:58 シングルクリック 100%
{
"device": {
"type": "button",
"deviceId": "*********",
"attributes": {
"projectRegion": "ap-northeast-1",
"projectName": "Test",
"placementName": "MyFirstPlacement",
"deviceTemplateName": "SendEmail"
}
},
"stdEvent": {
"clickType": "SINGLE",
"reportedTime": "2018-05-26T06:37:58.510Z",
"certificateId": "*********",
"remainingLife": 99.85000000000001,
"testMode": false
}
}
// 2018/5/26 15:42:57 ダブルクリック 100%
{
"device": {
"type": "button",
"deviceId": "*********",
"attributes": {
"projectRegion": "ap-northeast-1",
"projectName": "Test",
"placementName": "MyFirstPlacement",
"deviceTemplateName": "SendEmail"
}
},
"stdEvent": {
"clickType": "DOUBLE",
"reportedTime": "2018-05-26T06:42:57.296Z",
"certificateId": "*********",
"remainingLife": 99.8,
"testMode": false
}
}
// 2018/5/26 15:43:47 長押しクリック 100%
{
"device": {
"type": "button",
"deviceId": "*********",
"attributes": {
"projectRegion": "ap-northeast-1",
"projectName": "Test",
"placementName": "MyFirstPlacement",
"deviceTemplateName": "SendEmail"
}
},
"stdEvent": {
"clickType": "LONG",
"reportedTime": "2018-05-26T06:43:47.595Z",
"certificateId": "*********",
"remainingLife": 99.75,
"testMode": false
}
}
電池(remainingLife)ガンガン減ってくなw という感想を抱きました。シングル/ダブル/長押しの3種類のイベントを検知できるようで。これらの組み合わせで例えば、モールス信号をダッシュボタンで打つと、その内容をテキストに起こして S3 に保存したり Slack に通知したりできそうですね。やっている人いそうだなと思って調べてみたら、まあやっぱりいた。
こちらの記事ではダッシュボタンを3つ用意しているようですが、3種類のイベントを表現できるのでデバイスは1個でも実現できそう。ただすぐ電池切れるでしょうね…。
生成された python のコード
SMS を送る Lambda のコードをちらっとみておく。
from __future__ import print_function
import boto3
import json
import logging
logger = logging.getLogger()
logger.setLevel(logging.INFO)
sns = boto3.client('sns')
def lambda_handler(event, context):
logger.info('Received event: ' + json.dumps(event))
attributes = event['placementInfo']['attributes']
phone_number = attributes['phoneNumber']
message = attributes['message']
for key in attributes.keys():
message = message.replace('{{%s}}' % (key), attributes[key])
message = message.replace('{{*}}', json.dumps(attributes))
sns.publish(PhoneNumber=phone_number, Message=message)
logger.info('SMS has been sent to ' + phone_number)
ちな、Lambda に到達する json イベントメッセージはこんなかんじ
{
"deviceInfo": {
"deviceId": "******",
"type": "button",
"remainingLife": 99.55,
"attributes": {
"projectRegion": "ap-northeast-1",
"projectName": "Test",
"placementName": "Placement",
"deviceTemplateName": "OrderRequest"
}
},
"deviceEvent": {
"buttonClicked": {
"clickType": "SINGLE",
"reportedTime": "2018-05-26T07:15:09.131Z"
}
},
"placementInfo": {
"projectName": "Test",
"placementName": "Placement",
"attributes": {
"phoneNumber": "******",
"message": "Is the order a rabbit?",
"room": "amausa"
},
"devices": {
"OrderRequest": "******"
}
}
}
余談
わずか300円でIoTボタンを作る方法 – Qiita という記事が面白かった。IoT エンタープライズボタン、2500円もしたのだけれど、同じようなことを300円で実現している。こちらも試してみたい。