AWS IoT Enterpriseボタンで外出時の作業を自動化してみる

# はじめに
最近流行りのスマートホームの流れに乗って、我が家でも色々なスマート家電を導入しています。ただ複数の製品を使っていて不便なのが、まとめて制御したい時にいちいちそれぞれのアプリで設定しないといけない事です(Google Homeの「おはよう」等でまとめて制御出来るものもありますが)。

そこで、今回は特に面倒に感じていた外出時の作業を半自動化してみました。

# 作ったもの
早速ですが今回の制作物のデモ動画です。
既に1週間ほど我が家で運用していますが、家族の評判は上々でした。

<blockquote class="twitter-tweet" data-lang="ja"><p lang="ja" dir="ltr">AWS IoTボタンで外出ボタン作った。おうち出るときにボタンを押すと一定時間後に部屋の電気を消して鍵を閉めてくれる。(電気はHUE、鍵はSESAMEを利用) <a href="https://t.co/XoTVQ4EMjX">pic.twitter.com/XoTVQ4EMjX</a></p>&mdash; ないん (@osa9) <a href="https://twitter.com/osa9/status/998048736285609984?ref_src=twsrc%5Etfw">2018年5月20日</a></blockquote>
<script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

概ね以下のような流れです。

1. 外出時に玄関ドアの**AWS IoTエンタープライズボタン**を押してドアを閉める
2. 一定時間経過
3. 照明(**Hue**)がオフになる
4. 鍵(**SESAME**)が施錠される


これで家を出てからいちいちHueアプリでライトをオフにして、SESAMEアプリで鍵を閉めるという煩わしい作業から解放されました。

# 使ったもの
今回使ったものです。
スマート家電はAPIやIFTTT等でインターネット側から制御出来るものなら何でもお好みで。

+ AWS IoTエンタープライズボタン
https://www.amazon.co.jp/dp/B075FPHHGG

+ Philips Hue (スマート照明)
https://www2.meethue.com/ja-jp

+ SESAME (スマートロック)
https://jp.candyhouse.co/

# 1. スマート家電の準備
まずはスマート家電をインターネット側から制御出来るようにします。

## 1-1. Hueで家のライトをオフにする
HueはAPIもありますが、制御する場合ブリッジと同じネットワーク内からブリッジのAPIを叩く必要があるので、IFTTTのWebhookと連携させるのが楽です。

今回はこんな感じのアップレットを作成しました。

トリガー：Webhook
アクション：Hue (All lights off)
<img width="300" alt="ifttt_hue.png" src="https://qiita-image-store.s3.amazonaws.com/0/107166/bd688a48-922f-ef6e-99dd-e6516b4f433d.png">

WebhookのURLは画像左上のアイコンをクリックして、Documentationから参照出来ます。
URLにアクセスしてみてライトが消えたら成功です。

## 1-2. SESAMEでおうちの鍵を閉める
SESAMEはAPIでもIFTTTでも制御出来ます。今回はせっかくなのでAPIを利用してみました。IFTTT+Webhookの方が楽かもです。

APIの有効化と利用方法は公式マニュアル(英語)に記載されています。
https://docs.candyhouse.co/#before-you-start

注意点：
・SESAMEアプリからAPIを有効化する必要がある
・Googleアカウント等でログインしている場合は、API利用のためアカウントパスワードを設定する必要がある


ちなみにAPIですが、Pythonの場合はpysesameライブラリを使えばなんと2行で利用出来ます。
https://pypi.org/project/pysesame/

```python
sesames = pysesame.get_sesames(ID, PW) #アカウントに紐付いたSESAME一覧を取得
sesames[0].lock() # 1個目のSESAMEをLockする。
```

# 2. 家電を制御するLambdaスクリプトの作成
AWS IoTエンタープライズボタンを押して起動されるLambdaスクリプトはこんな感じにしました。
Puthonのライブラリとしてpysesameをインストールする必要があります(インストールが面倒なら、IFTTTを呼ぶと良いです)

```python:handler.py
import pysesame
import requests

ID = '<SESAMEのID>'
PW = '<SESAMEのPW>'
HUE_WEBHOOK = '<IFTTTのWebHook URL>'

def going_out(event, context):
    # AWS IoTボタンのクリックタイプ(将来的に利用する)
    # ちなみに SINGLE, DOUBLE, LONG がある。
    click_type = event['deviceEvent']['buttonClicked']['clickType']

    # 待ち時間(AWS IoTのプレースホルダでwait_timeを指定する)
    wait_time = int(event['placementInfo']['attributes']['wait_time'])
    time.sleep(wait_time)

    # After timeout elapsed
    requests.get(HUE_WEBHOOK)

    sesames = pysesame.get_sesames(ID, PW)
    if(len(sesames) == 0):
        print('No Sesame Endpoint or login failed')
        return
    sesames[0].lock()
```

# 3. AWS IoTエンタープライズボタンの準備
Lambdaを起動する所までは良記事があるのでこの通りにやれば出来ると思います。

【国内販売開始】AWS IoT Enterprise Button試してみたらホンマに簡単にLambda関数を実行できた
https://dev.classmethod.jp/cloud/aws/aws-iot-enterprise-button/

ただし、AWS SNSではなく、先程作成したLambdaスクリプトを起動するようにします。
今回はこんな感じに設定しました。
AWS IoTボタンを押してから鍵のロックまで最短でも10秒程度かかるので、鍵を閉めるまでの時間(wait_time)は目的の秒数-10ぐらいが丁度良いです。

<img width="884" alt="スクリーンショット 2018-05-29 22.54.52.png" src="https://qiita-image-store.s3.amazonaws.com/0/107166/e991de55-6647-4e3c-53d3-089087fa34a1.png">
<img width="899" alt="スクリーンショット 2018-05-29 22.53.02.png" src="https://qiita-image-store.s3.amazonaws.com/0/107166/cb66086b-1956-b9c6-41cf-0a0e1d49beed.png">

セットアップ後にボタンを押してみて、ライトが消えたら成功です。

# まとめ
AWS IoT Enterpriseボタンを使って、外出時の家電操作を自動化してみました。
日々不便に感じる事を改善していくのはとても楽しいです。これからもQoL向上のために色々と改善していきたいと思います。