AWS IoT 1-clickデバイスでルンバを操作する

この記事はハンズラボ [Advent Calendar 2020](https://qiita.com/advent-calendar/2020/handslab) 14日目の記事です。

# はじめに
在宅勤務中、「仕事しなければいけないのに、なぜか掃除がしたくなる」衝動にかられることが多く、半年ほど前、ルンバe5を購入しました。
部屋がきれいに保たれているのはとても気持ちがいいですし、物事に集中できます。

さて、ルンバを導入してから半年ほど立ったのですが、在宅勤務中に困ったことがあります。

*ミーティング中にルンバが掃除を始めてしまう*

稀にミーティングの時間とルンバが掃除を始める時間がバッティングすることがあります。
ミーティング中、ルンバが掃除を始めだし、私のマイクから騒音が入り「なんだなんだ？」となり、私は以下の一連の動作をしなくてはいけません。

- マイクをミュート
- 席を立ち上がる
- ルンバ本体の停止ボタンを押す
- マイクのミュートを解除
- 一言謝罪

話を中断させてしまい申し訳ない気持ちになります。
もっと気を利かせてほしいと思うのですが、機械なのでしょうがないです。

そこで、ミーティング中にルンバが掃除を始めても最速で停止させるアイデアを考えます。
今回のタイトル「AWS IoT 1-clickデバイスでルンバを操作する」です。
手元の物理ボタンでルンバを最速で停止させ、ミーティング中の話の流れを止めないことが実現できると思います。

今回の記事は「AWS IoT 1-clickデバイスでルンバを操作する」実装の流れを説明していきます。

# 構成
以下が簡単な構成図です。
![スクリーンショット 2020-12-13 14.23.38.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/519667/fa829068-6a91-ddfa-acb0-6407c66b3ef5.png)
AWS IoT 1-Clickデバイスをトリガーとし、webhookのURLを叩くためのLambda関数を実行、IFTTを経由してルンバを操作するという流れになっています。

# 実装
実装方法を説明をしていきます。

## IFTT
まずはIFTTのアプレットを作成します。
IFTTTは、異なるソーシャルメディアやプラットフォームを連携させるWebサービスです。
今回はWebhooksとiRobotを連携させることで、「もし `Webhookが発火` したら `ルンバを停止させる`」というIFTTアプレットを作成していきます。

まずはじめに、Webhooksのkeyを取得するために、https://ifttt.com/maker_webhooks にアクセスして画面右上のDocumentationをクリックし、`Your Key is: xxxxxxxxxxx`をどこかにメモしておいてください。後ほど、Lambda関数で使用します。
![スクリーンショット 2020-12-13 14.10.27.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/519667/67ae89f7-a646-4cb6-7ddf-bccb155242a1.png)

次に、https://ifttt.com/create/ で以下のようにアプレットを作成します。
![スクリーンショット 2020-12-12 21.23.37.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/519667/8b5cee9c-1723-3ca5-989d-1fce867bc8d0.png)
「if this=`Webhooks` then that=`iRobot`」というアプレットとなります。 
Webhooksを追加する際、発火させるためのイベント名を設定します。
ここでは「stop_robot」とします。
iRobotのサービスでは、ルンバの次のアクションが実行可能です。

- ロボットを始動
- ロボットを停止
- ロボットを一時停止
- ロボットをドッキング
- 部屋ごとの清掃

ここでは、「Stop robot(ロボットの停止)」を選択し、アクションを作成します。

IFTTのアプレットの作成は以上です。

## Lambda関数
次にLambda関数を作成します。
ランタイムはPython 3.8です。

以下がソースコードです。

```python
import json
import urllib.request


key = '<Yours Webhooks Key>'

def lambda_handler(event, context):

    clickType = event['deviceEvent']['buttonClicked']['clickType']

    if clickType == "SINGLE":
        eventName = "stop_robot"

    url = f"https://maker.ifttt.com/trigger/{eventName}/with/key/{key}"

    req = urllib.request.Request(url)
    with urllib.request.urlopen(req) as res:
        body = res.read()
```

`<Yours Webhooks Key>`の箇所にIFTTのWebhooks Documentationで確認したkeyを入力します。
この関数が実行されるとイベント名に対応したURLをGETリクエストで投げます。

このLambda関数をデプロイします。

## AWS IoT 1-Click
最後にAWS IoT 1-ClickデバイスとLambda関数の紐付けを行います。

まずはAWS IoT 1-ClickコンソールからAWS IoT 1-Click対応デバイスの登録と有効化をします。
次にプロジェクトの作成をします。
ここで先程作成したLambda関数と紐付けます。
![スクリーンショット 2020-12-13 7.17.15.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/519667/853a7051-5ce3-ac38-3b4e-1eabe4ecf2a6.png)

プロジェクト作成後、プレイスメントを追加します。
![スクリーンショット 2020-12-13 7.27.53.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/519667/787b7e7d-b96b-fa85-0d4b-344a9a70d49b.png)
これでボタンからルンバを停止させる準備が整いました。

# デモ
<blockquote class="twitter-tweet"><p lang="und" dir="ltr"><a href="https://t.co/UovGvuvfoh">pic.twitter.com/UovGvuvfoh</a></p>&mdash; なか (@nakainu_) <a href="https://twitter.com/nakainu_/status/1338107150585921536?ref_src=twsrc%5Etfw">December 13, 2020</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

ルンバが停止しました。

# おわりに
今回は、物理ボタンでルンバを停止させることができました。

現時点では、幸いなことにミーティングとルンバの掃除時間がバッティングすることがなく、今回作ったボタンの出番はまだありません。
機会があれば、ミーティング中にこのボタンを使ってルンバ停止させたいと思っています。