いまさらかもしれないですが 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 円で実現している。こちらも試してみたい。
参考資料
Pinned Articles
About
ウェブ界隈でエンジニアとして労働活動に励んでいる @gomi_ningen 個人のブログです
Tags
JavaScript
PowerShell
kibana
elasticsearch
fluentd
nginx
イベント
五十嵐裕美
村川梨衣
logrotate
IoT
Scala
Java
C言語
iputils
ICMP
WUG
mastodon
Swift
AWS
Clock
Windows
アーキテクチャ
PoEAA
iOS
DeviceFarm
プログラミング言語
OS
StepFunctions
Lambda
Serverless
terraform
ポエム
RHEL
ネットワーク
GraphQL
CloudWatch
Linux
Coreutils
network
nc
telnet
LinuxKernel
fpinscala
ELB
IAM
AppSync
EFS
Gradle
english