どうも、CHASUKEでございます。
「IoTをシンプルに」をキャッチフレーズに、Amazon.co.jpで『AWS IoT Enterpriseボタン』というIoTボタンデバイスが販売されました。→商品はコチラ
今回、こちらを購入して、ボタンを押したら赤ちゃんのトイレを記録するシステム(赤ちゃん用トイレIoT)を作ってみました。
もうすぐ1ヶ月になる赤ちゃんのトイレ記録を、毎日妻が記録してくれている。赤ちゃんと僕?の世話で忙しい妻のために、なにか協力できたらなと思い、作ってみました!
この記事では、『AWS IoT Enterpriseボタン』でできることや、『赤ちゃん用トイレIoT』の作成方法を書いていきます。
それでは行ってみましょー!!
AWS IoT Enterpriseボタンでできること
Amazonの商品をボタンを押すだけで購入できる「Amazon Dashボタン」と形は同じだが、できることが違います。→AmazonDashボタンの記事はこちら
「AWS IoTボタン」を押すと、AmazonのクラウドサービスであるAWS(アマゾンウェブサービス)にある「Lambda(ラムダ)」に登録したプログラムを実行します。
Dashボタンを押すと次の日に商品が届くが、「AWS IoT」ではより自由なアクションを実行させることができるのだ。
実はDashボタンにも、ラズパイにサーバを用意することで、商品を購入させず、自由なアクションをさせる方法があります。
▼僕も以前にHomeKit製品と連携して遊んでいる。
https://chasuke.com/wp/amazondashkit/
『AWS IoT Enterpriseボタン』を使えば、ラズパイでサーバを立てる必要なんてなく、Amazonのクラウドサービスであるアマゾンウェブサービス(AWS)の「IoT 1-Click」と「Lambda(ラムダ)」を使って簡単に仕組みを作ることができます。
Dashボタンと違うのが、以下の通り、ボタンを押すアクションが3つあること。
- シングルクリック
- ダブルクリック
- 長押し(1.5秒以上)
さらに、大量のボタンを使ったシステム構築を想定しているため、そのIoTボタンがどこに設置してあるものかを判断するための住所などの属性を定義し、判定材料に使えたりするのが面白い♪
AWS IoT Enterpriseボタンで作ったもの
赤ちゃんIoTといえば「うんこボタン」というのがあります。
これを使えば、赤ちゃんの「おしっこ」と「うんち」をボタンを押すだけで記録・通知し、アプリで確認、コメント入力できるIoTガジェットです。
これのパクリとなってしまうが、「AWS IoTボタン」を押すだけでトイレの記録ができる同じ仕組みを作りました。
しかし、スマホアプリまで作る余裕はないので、Googleスプレッドシートに「日付」と「うんこorおしっこ」を記録できるようにした。(※後日、授乳時刻の記録機能を追加)
ちなみ、Googleスプレッドシートへの記録はIFTTT(Webhookチャンネル)を利用すれば、お手軽です。
▼連携イメージはこんな感じ
トイレIoTボタンの作り方
AWS IoT Enterpriseボタンを利用するためには、AWS(クラウドサービス)に加入している必要があるため、加入している前提で作り方を書いていきます。
まだ未加入の方は、1年間使える無料枠もあるので、ぜひこの機会に♪
IFTTTアプレットを作成する
さきに、IFTTT経由でGoogleスプレッドシートに書き込むためのアプレットを作成します。
▼Lambdaから呼び出される「Webhook」になります。
Event NameがURLに含まれるので、メモしておきましょう。
▼アクション側は、スプレッドシートに追記。
Lambdaから日付など2属性を送るので、「Value1 ||| Value2」としています。スプレッドシートの作成場所は、「IFTTT」直下としました。ファイルがなければ自動で作成してくれます。
AWS Lambda関数を作成
AWS IoTボタンの設定をする前に、呼び出されるLambda関数を定義します。今回は、こんな感じにしました。
3つのアクションで動作を分けれますが、慣れてない嫁が使うので、ダブルクリックと長押しは一緒の動作をするようにしてます。動作としてはIFTTTアプレットをリクエストします。
▼サービスからLamdbaを選んで、関数を作成します。
▼関数名やロールを選択します。
言語はPython3で書いています。
▼コードは、こんな感じです。
import urllib.request, json
import datetime
def lambda_handler(event, context):
print('イベント:', event);
# 現在(日本時刻)を取得
dt_now = datetime.datetime.now()
jpn_now = dt_now + datetime.timedelta(hours=9)
message = '';
cliType = event['deviceEvent']['buttonClicked']['clickType']
if cliType == "SINGLE":
message = "おしっこ"
elif cliType == "DOUBLE" or "LONG":
message = "うんこ"
# IFTTT向けHTTPリクエスト準備
url = "https://maker.ifttt.com/trigger/[イベント名]/with/key/[自分のWebhook URLを設定]"
method = "POST"
headers = {"Content-Type" : "application/json"}
# PythonオブジェクトをJSONに変換する
obj = {
"value1" : jpn_now.strftime("%Y/%m/%d %H:%M:%S"),
"value2" : message
}
json_data = json.dumps(obj).encode("utf-8")
# IFTTT向けHTTPリクエスト(POST)
request = urllib.request.Request(url, data=json_data, method=method, headers=headers)
with urllib.request.urlopen(request) as response:
response_body = response.read().decode("utf-8")
IFTTT(Webhook)のURLは自分のものを入力します。IFTTTのWebhook設定ページから確認できます。イベント名は、先ほどWebhookで指定したもの。
ちなみに、ダブルクリックした時にAWS IoTボタンから送られてくるJSONイメージがこちら。参考にしてみてください。
{
"deviceInfo": {
"deviceId": "G03XXXXXXXXXXXXW",
"type": "button",
"remainingLife": 98.25,
"attributes": {
"projectRegion": "ap-northeast-1",
"projectName": "toiletButton",
"placementName": "myhome",
"deviceTemplateName": "OrderPush"
}
},
"deviceEvent": {
"buttonClicked": {
"clickType": "DOUBLE",
"reportedTime": "2018-06-02T06:25:23.955Z"
}
},
"placementInfo": {
"projectName": "toiletButton",
"placementName": "myhome",
"attributes": {
"place": "myhome"
},
"devices": {
"OrderPush": "G03XXXXXXXXXXXXW"
}
}
}
AWS IoT Enterprise側の設定
最後になってしまったが、AWS IoTボタンの設定をしていく。
『IoT 1-Click』というAWSのサービスを利用するのですが、スマホアプリでサクッと、デバイス登録、プレイスメント登録、Lambdaとの紐付けまでなどの設定ができてしまいます。
▼アプリはこちら
▼アプリを起動し、日本語を選択。ログインします。
▼デバイスを登録します。
パッケージに貼られてるバーコードからスキャンできました。
▼無事追加され、WiFiを有効化の設定に移る。
▼アプリの指示通りに、ボタン操作します。
ネットワーク設定は、2.4GHzのWiFiを選びます。
▼アプリに指示に従って、ぽちぽちしていると登録完了できた。
簡単だ。
▼続いて、プロジェクトを作成し、Lambda関数の呼び出し設定をする。
▼適当なプロジェクト名を設定。
デバイステンプレートで、ボタンを押した時の動作を設定できる。
▼デバイス名などを入力します。
3つのアクションの中から、作成したLambda関数を呼び出したいので「Lambda関数の選択」とします。
ちなみに、EメールやSMSを選択すると、Lambda関数を自動で作成(※米国西部オレゴン)し、それを呼び出すように設定されます。
▼作成してあるLambda関数の一覧から選択可能
▼デバイステンプレートが完成しました。
続いて、作成したデバイステンプレートとボタンを紐づけ定義できるプレイスメントを作成します。
▼プレイスメント属性には自由な属性をキーバリューで登録できます。
複数のデバイスで運用する場合に有効ですね。
今回はボタン1つだけなので使ってませんが、例えば、以下のようにプレイスメントを2つ用意して「myhome」と「mySecondHome」などとして、プレイスメント内に定義したplace属性に「main」「second」などと登録できます。
各プレイスメントごとにボタンが被らないように複数個のボタンを登録できます。また、プロジェクト側(画面左)にプレイスメントを定義して置くと、全プレイスメント共通で属性設定を登録しておけます。
実際に動かしてみる
これで全設定が完成しました。
さっそくボタンをポチッとすると、白くLEDが点滅した後に、緑に点灯します。ワンクリックに約5秒くらい要しますね。
また、ダブルクリックも長押しもLEDの光り方は全て同じです。ワンクリックとダブルクリックの押し間違いは、けっこう発生する予感がする。(※これがダブルクリックと長押しは同じアクションにしている理由)
Googleドライブの指定フォルダにスプレッドシートが作成されているはずです。
できたできたっ♪
最後に
赤ちゃん用のトイレIoTボタンを作ってみました。
AWS IoTボタンを触ってみて感動したのは、ボタンからLambda関数の呼び出しがアプリで超簡単にできちゃうこと。
CHASUKE
ラズパイでサーバ立てなくて良いから楽チン♪
大量のIoTボタンデバイスでの運用を想定しているだけに、紐付けやプレイスメント設定の考え方がとてもわかりやすく感じました。
今回作った仕組みも、少しイジれば別の用途に応用できると思います。面白いと思った方は、是非挑戦してみてください!
これで子育てに忙しい妻の役に少しでも立てたかもしれない。
それではまた。