SORACOMのIoTボタンで耳の遠い祖父のために光とLINEで通知する呼び鈴を作る

## なんと..（後日追記）

本記事がQiitaエンジニアフェスタ2021のSORACOM賞を受賞しました！
SORACOMさん、ありがとうございます！

https://blog.soracom.com/ja-jp/2021/09/10/qiita-engineer-festa-2021-winners-of-soracom-award/

## 課題

祖父とのLINEで「最近、耳が遠くなってしまって玄関のチャイムが聞こえない」という悩みを聞きました。来客に気づかなかったり荷物が受け取れなかったりすることが増えて困ってる、とのこと。
そこで、SORACOMのIoTボタンを使って祖父でも反応できる呼び鈴を作ってみることにしました。



## やりたいこと


玄関先にIoTボタンを設置して呼び鈴と一緒に押してもらい、祖父でも気が付くような通知を送ってみます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/594998/06b884b7-12c1-e15f-248f-5b50fcfca523.png)

##### ①Hueのライトを点滅させる
耳は聞こえにくいですが、光なら反応できるだろうということでPhilipsのHueを使ってみます

##### ②LINE Notifyで家族のLINEグループに通知を送る
LINEであれば祖父も祖母も使えるのでこちらにも通知を送るようします



## 用意したもの
**・SORACOM LTE-M Button powered by AWS**
[SORACOM LTE-M Button powered by AWS - SORACOM (ソラコム) IoTストア](https://soracom.jp/store/5208/)
ボタンを押すとAWS Lambdaのファンクションをトリガーできます

**・Hueライト**
[Hue White Ambiance 1 パック E26 | Philips Hue](https://www.philips-hue.com/ja-jp/p/hue-white-ambiance-1-pack-e26/8718699722302)
こいつを点滅させます

**・Hueブリッジ**
[Hue ブリッジ | Philips Hue](https://www.philips-hue.com/ja-jp/p/hue-bridge/8718696562260)
Hueライトに信号を送るための端末です

お財布には優しくありませんでした・・・

## 作ってゆく

#### step1 Hueのライトを設置する

マニュアルに沿って設置していきます。
ブリッジを設置すると家のネットワークの外からHueを操作できるようになります。
今回はAWS Lambdaから実行しますのでブリッジが必要になります。



#### step2 IFTTTを使ってHueのランプを操作するフローを作る

HueはWeb APIを介して操作することができます。
しかし認証周りが煩わしかったりするので、[IFTTT](https://ifttt.com/home)を使用してアクセスすることにしました。
Webhookのトリガーと組み合わせてHTTPリクエストでHueのランプが点くようなフローを作成します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/594998/b02a5b34-4113-a7e0-ec8f-2fd2c4d8e23f.png)
フローを作成したら [Webhooks](https://ifttt.com/maker_webhooks) のページを開き、Documentation をクリックします。
Your Key is: に続く値がご自身のWebhookキーとなりますので、イベント名と一緒にメモしておきましょう。（後々使います）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/594998/0f6471fb-fe41-33f8-eae7-7db34249efd2.png)


#### step3 LINE Notifyの設定を行う

適当にLINEグループを作成して、LINE Notify のトークンを発行します。
トークン発行はこちらからできます。
https://notify-bot.line.me/ja/


作成したグループを選択して、
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/594998/305174b0-74b0-319f-cd3c-caa951f5d34f.png)

トークンを発行します。トークンはあとで必要になりますのでメモします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/594998/9f59ba84-8fae-431e-04c2-94f4473aa3b7.png)

最後に作成したグループへLINE Notifyと通知を受け取るアカウント（祖父、祖母のアカウントなど）を招待しておきます。




#### step4 Lambda関数を作成する

IoTボタンが押されてから実行したい処理をAWS Lambdaで定義します。
今回は「IFTTTのWebhookエンドポイントへのリクエスト」と「LINE Notifyの送信」を行う関数を作ります。


一応私が使ったコードをサンプルとして残しておきます。
※IoT連携は選択できるリージョンが限られてますのでご注意ください。私は東京にしました

```python:lambda_function.py
import os
import json
import requests

def lambda_handler(event, context):
    try:
        ifttt_event = event['placementInfo']['attributes']['event']
        ifttt_key   = event['placementInfo']['attributes']['key']
        line_token  = event['placementInfo']['attributes']['line_token']
    except KeyError:
        return {
            'statusCode': 400,
            'body': json.dumps('Invalid Placement')
        }
    
    # IFTTT → Hue
    ifttt_endpoint = 'https://maker.ifttt.com/trigger/' + ifttt_event + '/with/key/'+ifttt_key
    requests.post(ifttt_endpoint)
    
    # LINE Notify
    message = '玄関のボタンが押されましたよ'
    line_notify_api = 'https://notify-api.line.me/api/notify'
    headers = {'Authorization': f'Bearer {line_token}'}
    data = {'message': f'message: {message}'}
    requests.post(line_notify_api, headers = headers, data = data)
    
    return {
        'statusCode': 200,
        'body': json.dumps('Hello from Lambda')
    }

```


#### step5 AWSにIoTボタンを登録してLambda関数と紐づける
AWSのコンソール画面から [AWS IoT 1-Click](https://aws.amazon.com/jp/iot-1-click/) のリソースを作成します。

デバイス（IoTボタン）を登録して、
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/594998/d698c5bc-0f6a-8b25-5998-a08b1bb2b760.png)


プロジェクトを登録します。
このときにデバイステンプレートにstep4で作成したLambda関数を指定します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/594998/248cc7e7-74e6-8ae5-9da7-1af1b06ed330.png)

プロジェクトにプレイスメントを作成して、デバイス(IoTボタン)との紐づけを行います。
属性に以下の値をそれぞれ設定します。

|属性の名前|値|
|---|---|
|event  |IFTTTのWebhookイベント名|
|key    |IFTTTのKeyの値|
|line_token   |LINE Notifyで発行したトークン|


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/594998/6d008127-68d9-6265-ca1d-4e3481070799.png)
以上で設定は完了です！
IoTボタンを押すと一連のプロセスが動くと思います。


## できた！

https://www.youtube.com/watch?v=ytVeY6z7aQQ

こんな感じで出来ました。
少し時間差があって気になりますが、まあ良しとします。


## 効果の検証
祖父母の家に行けていないので、まだ効果検証できていません。
自粛ムードが収まったら実際に行って試してもらおうと思っています。
喜んでくれたら嬉しいです笑

## 参考
SORACOMの記事とAWSのドキュメントを参考にして作りました。

[IFTTT を使って LINE に送信 | iot-showcase (soracom.github.io)](https://soracom.github.io/iot-showcase/projects/LTE-M_button/mkmk/b-work/line-notify-with-ifttt.html)
[AWS IoT 1-Click エンドポイントとクォータ - AWS 全般のリファレンス](https://docs.aws.amazon.com/ja_jp/general/latest/gr/1click.html)