注文していた、AWS IoTエンタープライズボタンが来ました!
ボタンを押して、裏で、AWS Lambdaを起動させ、さまざまなことができる機械です。
2,500円。安いような、高いような。。。
ちなみに、内部がリチウムイオン電池が入っていますが交換不可とのことなので、2000回程度PUSHしたら寿命ということらしいです。
利用シーンですが、例えば、私がぱっと思いつくだけでも、
・ 病院のナースコールとして
・ タイムカードとして
・ 投票や出席カウンターとして
・ 飲食店の呼び出しベルとして
・ 防犯緊急ベルとして
色々、アイデアが膨らみそうです。
また、ボタンプッシュをトリガーとし、そのアプトプットも、Eメールしたり、SMS通知したり、LINE通知したり、Excelに吐き出したり、ログに出したり、Srackに出したり、いろいろカスタマイズできそうです。
私は前の記事で書いたように、単純に母の生き死にを確認したいので、お年寄り見守り端末としてこれから設定していこうと思います。
[AWS IoT Enterprise Button]
まずは、IoT Enterprise Buttonを設定します。
まず、iPhoneやiPadなどから、AWS IoT 1-Clickアプリケーションをインストールします。
iOSの場合10から対応しています。
Androidのアプリでも試しましたが、AWSにうまくログインできず、iPadだとうまくいきました。
アプリの作りはまだ、やや不安定ですね。
なお、BluetoothはONにしておく必要があります。
AWS IoT 1-Clickアプリケーションを起動し、AWSのログインID(メールアドレス)とパスワードでログインします。
[AWS IoT 1-Clickアプリケーション ログイン後の画面]
通常は、「AWS IoT Enterprise Button向け」 の欄にある、Wi-Fiを設定をクリックして設定するのですが、私の場合は、WiFiの設定まで完了し、ボタンのインジケーターが緑の点灯(設定完了のサイン)になったのを確認しても、どうしてもデバイス登録が反映されず、クリアされてしまいました。何度やっても同じです。
仕方ないので、翌日、上段にある「すべてのデバイスタイプ向け」から登録しなおしたら、やっとAWSアカウントとデバイスを紐づけて認識させることができました。このあたり、アプリの動作なのか、私の気合が足りないだけなのか、何なのかわかりませんが、まだまだ不安定ですね。
多分私の精神統一が足りてないということですね(苦笑
なお、デバイス登録する場合、
・ AWS IoT Enterprise Buttonが入っていた箱の側面にあるバーコードをスキャン
・ バーコードの下部(またはボタン本体の裏側にも記載 ただしむちゃくちゃ文字が小さいのので、老眼なりかけの私は虫眼鏡必須!)にあるDSN番号(機器固有のシリアル番号 G030 PMで始まる番号)を手動で入力
するやり方があります。
手動で入力する際は、文字列を、ハイフンや空白を入れずに連続して入力します。
間違えやすいので、スキャンした方が無難です。
[デバイス登録画面]
デバイススキャンが終了し、アプリにDSN番号を認識させると、次はデバイスをWi-Fiに参加させます。
参加させるために、ボタンを6秒押すよう指示があるので押します。
すると、青く点滅を始めます。
[デバイスのボタンを長押しするよう指示がある]
すると、しばらくしてWi-FiのESSIDとパスワードの指定があるので、入力します。
[Wi-Fiを認識]
認識が成功すると、最後にもう一度ボタンを押すよう指示が出ます。これで設定完了です。
(「AWS IoT Enterprise Button向け」 の欄から行ったら、これが出ませんでした。なんでだろ。)
[AWSアカウントにデバイスが認識されました]
このデバイスをクリックして、有効にします。
[デバイスを有効にする]
この後、Eメールを送信したりする作りを行うのですが、アプリからでもできます。
私は、AWSマネジメントコンソールから行いました。
[AWSマネジメントコンソールから、IoT 1-Clickを選択]
IoT 1-Clickの画面に遷移します。
[IoT 1-Click画面トップページ]
左ペインから、「管理」をクリックします。
デバイスでは、先ほどアプリから設定したデバイス情報を確認することができます。
[デバイス情報]
ここで、左ペインからプロジェクトを選択し、このデバイス(IoTエンタープライズボタン)に割り当てる役割(プロジェクト)を設定します。
様々な設定項目は疎結合なので、依存度が低くてよいですね。
[プロジェクト定義画面]
プロジェクト定義画面では、プロジェクト名や説明を入力します。
分かりやすい名前をここでは設定します。
次の画面に遷移し、「デバイステンプレート」を設定します。
ボタンを押した時の動作としてよく利用される、Eメール送信やSMS送信などがあらかじめAWS Lambda関数として定義されており、それを呼び出すことができます。
[デバイステンプレートを定義する]
一からサーバーを構築しようとすると、この関数を走らせるだけで、OSをインストールして、ミドルウェアをインストールして、デプロイ環境をインストールして。。。ってやらなくてはならないのですが、Lambdaは関数を呼び出すだけなので、本当に便利ですね。
まさにサーバーを意識することなく実行環境を作ることができる、サーバーレスアーキテクチャです。
[すべてのボタンタイプを選択]
あらかじめ設定されているテンプレートを選びます。
ここではSMSを選択しました。テンプレート名も定義しておきます。
[例としてSMSテンプレートを選択]
SMSの通知先電話番号やメッセージ内容を設定します。
個別に変数を指定することもできます。
オレゴンリージョンの場合、SMSは米国からかけることになるので、+81(国番号)をあたまに付けます。
[電話番号、メッセージを設定]
プロジェクトを登録し、完了です。
[プロジェクトが正常に作成された]
次に、プレイスメントを作成します。
デバイス(IoTエンタープライズボタン)と、設定したプロジェクトを紐づけする画面です。
やたらと横文字だらけの日本語で、ほぼ意味不明です。
「プレイスメントには、フィールド内の物理デバイスと属性として保存されたコンテキストデータが示されます。デバイスはIDで・・」って、何?この日本語。
[プレイスメントの作成画面]
なにはともあれ、正しく紐づけができましたよ。
[プレイスメントの作成完了]
さて、いよいよ動作確認です。
IoTエンタープライズボタンをぽちっとな、とします。
[おお! SMSを受信できました。米国経由って、なんかすごい]
IoT 1-Clickのモニタリング画面で、1コールがあったこともログで確認できました。
[IoT 1-Clickモニタリング画面]
デバイスの認識にかなり苦労しましたが、それ以降の設定はとても簡単です。
ただ、横文字だらけの日本語はほぼ意味をなしていないので、わかりやすい訳にしてほしいところですな。
一応、Lambda側も見ておきます。
Lambda関数が作成されていて、Amazon SMSなどを呼んでいることがわかります。
非常にわかりやすいIDEがコンソールから利用できるんですね。すばらしい!
ちなみに、生成されたLambda関数は、Python3.6で書かれていました。
----------------------------------------------------------------
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))
dsn = event['deviceInfo']['deviceId']
click_type = event['deviceEvent']['buttonClicked']['clickType']
message += '\n(DSN: {}, {})'.format(dsn, click_type)
sns.publish(PhoneNumber=phone_number, Message=message)
logger.info('SMS has been sent to ' + phone_number)
----------------------------------------------------------------