SORACOM LTE-M ButtonでLINE Notifyする「かえるボタン」を作ってみた

SORACOM LTE-M Button からLINE Notifyでメッセージを送る「かえるボタン」を作ってみました。
SMSやSlackへの通知は下記のガイドが詳しいです。

ボタンのシングルクリック、ダブルクリック、長押しに応じて「まだだよ😆」「かえるよ🐸」「むかえにきて🚗」をLINE Notifyでお知らせします。
子供が外出時に使うことを想定しています。

(2017-2-20: python3.6のlambdaとその後のかえるボタンを追記しました。)

# 登録と初期設定
こちらのガイドに詳しく書かれていますので簡単に完了します。SMS送信まであっという間です。
[SORACOM LTE-M ButtonをクリックしてSlack通知にする](https://dev.soracom.io/jp/start/aws_button_slack/)



# LINE Notify の設定
LINEマイページ から アクセストークンを発行しておきます。

こちらが参考になります。
[[超簡単]LINE notify を使ってみる](https://qiita.com/iitenkida7/items/576a8226ba6584864d95)

# Lambda関数の作成
## python3.6
```python:lambda_function.py
# -*- coding: utf-8 -*-
import os
import urllib.request
import urllib.parse

def get_message(data):
    clicktype = data['deviceEvent']['buttonClicked']['clickType']
    if clicktype == 'SINGLE':
        message = u'まだだよ\U0001f606'
    elif clicktype == 'DOUBLE':
        message = u'かえるよ\U0001f438'
    elif clicktype == 'LONG':
        message = u'むかえにきて\U0001f697'
    else:
        message = u'けろけろ'
    return message

def line_notify(msg):
    url = "https://notify-api.line.me/api/notify"
    headers = {"Authorization" : "Bearer "+ os.environ['LINE_TOKEN']}
    data = urllib.parse.urlencode({"message" :  msg}).encode('utf-8')
    request = urllib.request.Request(url, data=data, headers=headers)
    r = urllib.request.urlopen(request)
    print(r)

def lambda_handler(event, context):
    message = get_message(event)
    line_notify(message)
    return
```
次に示すpython2.7のlambdaとはhttp postがurllib.request.Request()である点が異なります。python3.6のlambdaではimport urllib を宣言するだけで良くライブラリを自分で追加する必要がありません。こちらの方が手軽なことに後から気付きました。

ボタンから渡されるイベントはクリックに応じて、シングルクリック、ダブルクリック、長押しが clickType に SINGLE, DOUBLE, LONG の3種で渡されます。

```python
click_type = event['deviceEvent']['buttonClicked']['clickType']
```

AWS Lambdaの環境変数'LINE_TOKEN'へLINE Notifyのアクセストークンを保存して使用しています。
![2018-11-05.png](https://qiita-image-store.s3.amazonaws.com/0/277504/c46756d7-16f9-1826-6c5a-9ab318a48dca.png)

```python
token = os.environ['LINE_TOKEN']
```


## python2.7

```python:lambda_function.py 
# -*- coding: utf-8 -*-
from __future__ import print_function
import os
import json
import requests

def get_message(data):
    clicktype = data['deviceEvent']['buttonClicked']['clickType']
    if clicktype == 'SINGLE':
        message = u'まだだよ\U0001f606'
    elif clicktype == 'DOUBLE':
        message = u'かえるよ\U0001f438'
    elif clicktype == 'LONG':
        message = u'むかえにきて\U0001f697'
    else:
        message = u'けろけろ'
    return message
    
def line_notify(msg):
    url = "https://notify-api.line.me/api/notify"
    headers = {"Authorization" : "Bearer "+ os.environ['LINE_TOKEN']}
    params = {"message" :  msg}
    r = requests.post(url, headers=headers, params=params)
    print(r)
    
def lambda_handler(event, context):
    message = get_message(event)
    line_notify(message)
    return
```
requestsライブラリをpython2.7のLambdaで使用するには lambda_function.py と共にzipしてLambdaへアップロードする必要があります。

~~linux環境~~ラズパイなどpython2.7環境で適当なディレクトリを作成し、lambda_function.pyを保存してrequestsライブラリを同じディレクトリに保存します。
全てzipしてzipファイルを作成します。

```sh

$ pip install requests -t ./
$ zip -r lambda_line_notify.zip ./
```

AWS Lambda作成画面でコードエントリタイプの「.zipファイルをアップロード」を選択してこのlambda_line_notify.zipを保存すれば、requestsライブラリを含んだlambda関数一式がAWS Lambdaに作成されます。


# 運用
ボタンを押すだけです。
無事通知が来ました。
![IMG_0643s.jpg](https://qiita-image-store.s3.amazonaws.com/0/277504/6b5b3a2c-0d24-d3ee-b27a-fbf5f2182479.jpeg)


# 気付いたこと
- ストラップ用のホールがあります。裏ブタを外して取り付けます。
- 子供に持たせてみると、誤操作によるメッセージ送信が発生したのでシングルクリックには「まだだよ」を割り当てました。
- 爆破スイッチはせめて長押しに割り当てた方が良いかも。

![IMG_0851.JPG](https://qiita-image-store.s3.amazonaws.com/0/277504/4a6b6a68-d567-19f8-89ae-0a41dbfd4eff.jpeg)

#その後の「かえるボタン」
2019年2月現在、3か月経過しました。子供が習い事や出かける時に使用しています。安定して運用中です。
![IMG_1189s.jpg](https://qiita-image-store.s3.amazonaws.com/0/277504/5a829ab5-d37a-6946-c54f-ae71ce473943.jpeg)