SORACOM LTE-M Button のサンプルコード集 "j3tm0t0/1-click" を使いこなす

[SORACOM LTE-M Button powered by AWS](https://soracom.jp/products/gadgets/aws_button/) (以下 Button ※) のアドベントカレンダーのバックアップ担当 ソラコム松下(Max) です。

Button を本格的に使うためには AWS Lambda を使ってコードを書く必要がありますが、サクっと使いたい！と思ってる方にはハードルになっているようです。

そんな中、同じくソラコムのなかのひと j3tm0t0 が [j3tm0t0/1-click](https://github.com/j3tm0t0/1-click) というリポジトリで以下のサービスとの連携をするためのコードを公開してくれています。

今回は使い方をサクッと紹介していきます。

* [AWS IoT Core を MQTT ブローカーとして使う](#1)
* [AWS IoT Core の Device Shadow を更新する](#2)
* [Amazon CloudWatch のメトリクスに送信する](#3)
* [IFTTT の Webhooks を呼び出す](#4)
* [SORACOM Harvest にデータ送信する](#5)
* [Slack の Webhook を呼び出す](#6)
* [LINE の Bot と連携する](#7)

<h2 id="1">AWS IoT Core を MQTT ブローカーとして使う</h2>

https://github.com/j3tm0t0/1-click/tree/master/functions/aws-iot
README.md に詳細な説明が書かれているので、そちらだけで大丈夫です。

### 注意点

apex を使わずに `index.js` をコピペする場合は AWS Lambda の設定でランタイムを Node.js 8.10 に、そしてハンドラを `index.handle` にしておいてください。（標準では index.handle **r** と末尾に r が付きます）

環境変数 `ENDPOINT` が無い場合は東京リージョン(ap-northeast-1) の AWS IoT Core に接続しようとします。他のリージョンにしたい場合は `ENDPOINT` を設定するようにしてください。

qos は 0 もしくは 1 のみです。要するに [AWS IoT Core が受けられる QoS](https://docs.aws.amazon.com/ja_jp/iot/latest/developerguide/protocols.html) 以上は設定できません。

topic に `hoge/bar` と設定した場合、実際に送信される topic 先は `hoge/bar/<DSN>` となるので、subscribe 側は `hoge/bar/#` としておくと良いでしょう。

<h2 id="2">AWS IoT Core の Device Shadow を更新する</h2>

https://github.com/j3tm0t0/1-click/tree/master/functions/aws-iot-shadow
README.md に詳細な説明が書かれているので、そちらだけで大丈夫です。

### Device Shadow に対する動作

AWS IoT Core の Device Shadow に対しては、AWS IoT 1-Click のプレイスメント属性 `SINGLE` `DOUBLE` `LONG` の設定が存在するか否かで動作が変わります。

**存在する場合**

設定されている値 (JSON) が [AWS IoT Core の `/update` トピックに送信](https://docs.aws.amazon.com/ja_jp/iot/latest/developerguide/using-device-shadows.html#update-device-shadow)されます。

![](https://raw.githubusercontent.com/j3tm0t0/1-click/master/images/aws-iot-shadow/placement_attributes.png)

この時 `state` は `reported` でも `desired` どちらでも設定可能ですし、その中のペイロードも自由に設定できます。

**存在しない場合**

以下の JSON が[AWS IoT Core の `/update` トピックに送信](https://docs.aws.amazon.com/ja_jp/iot/latest/developerguide/using-device-shadows.html#update-device-shadow)されます。

(SINGLE の部分は DOUBLE や LONG にもなります)

```json
{"state":
  {"reported" :
    {"clickType" : "SINGLE" }
  }
}
```

#### Device Shadow を subscribe する

`/update/delta` トピックを subscribe するのが定石です。

### 注意点

apex を使わずに `index.js` をコピペする場合は AWS Lambda の設定でランタイムを Node.js 8.10 に、そしてハンドラを `index.handle` にしておいてください。（標準では index.handle **r** と末尾に r が付きます）

[AWS IoT Core を MQTT ブローカーとして使う](#1) 時と同様に、東京リージョン以外の AWS IoT Core と通信したい場合は環境変数 `ENDPOINT` を設定するようにしてください。

この Lambda 関数を配置したリージョンと Device Shadow の操作対象のモノがある AWS IoT Core のリージョンは一致している必要があります。

AWS IoT 1-Click のプレイスメント属性上で `thingName` が未設定だった場合は DSN がそのまま利用されます。よって `thingName` もしくは DSN と一致する "モノ" を、あらかじめ AWS IoT Core 上に作っておいてください。

<h2 id="3">Amazon CloudWatch のメトリクスに送信する</h2>

https://github.com/j3tm0t0/1-click/tree/master/functions/cloudwatch
README.md がありませんが、準備は Lambda 関数の実行時ロールに `cloudwatch:PutMetricData` がついている事を確認するだけです。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/22754/965571af-ed3e-97f4-033c-e17160d9ee34.png)

### 注意点

apex を使わずに `index.js` をコピペする場合は AWS Lambda の設定でランタイムを Node.js 8.10 に、そしてハンドラを `index.handle` にしておいてください。（標準では index.handle **r** と末尾に r が付きます）

<h2 id="4">IFTTT の Webhooks を呼び出す</h2>

https://github.com/j3tm0t0/1-click/tree/master/functions/ifttt
README.md に詳細な説明が書かれているので、そちらだけで大丈夫です。

### SINGLE / DOUBLE / LONG で呼び出す Webhooks を切り替えたい

※ _[自作だっしゅボタンを SORACOM LTE-M Button powered by AWS に置き換えた事でわかったこと](/ma2shita/items/e35b991e292056e69956#%E5%AE%9F%E8%A3%85)でも同じ解説しています。_

IFTTT の Webhooks 設定では(受け付けの際の)イベント名を `GARAGEOPEN_DOUBLE` としています。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/22754/1a5e1030-4f06-00b4-7d9c-c4ce5006fec0.png)

一方 AWS IoT 1-Click のプレイスメント属性では event に `GARAGEOPEN_$clickType` と設定します。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/22754/89dfea0b-a75c-da28-46e7-e73ddec21cdb.png)

これはプレイスメント属性に入っている `$clickType` を実際の clickType に置き換えるといった実装がされており、例えばシングルクリックなら `GARAGEOPEN_SINGLE` という IFTTT の Webhooks イベントを起動します。これで Lambda 関数を書き換えることなく、3種類の Webhooks を起動できるようになります。

### 注意点

apex を使わずに `index.js` をコピペする場合は AWS Lambda の設定でランタイムを Node.js 8.10 に、そしてハンドラを `index.handle` にしておいてください。（標準では index.handle **r** と末尾に r が付きます）

<h2 id="5">SORACOM Harvest にデータ送信する</h2>

[SORACOM Harvest](https://soracom.jp/services/harvest/) というデータ収集・蓄積サービスがあります。
2018年7月から[インターネット越しに SORACOM Harvest へデータが入れられるようになりました。](https://blog.soracom.jp/blog/2018/07/04/inventory-update/)

https://github.com/j3tm0t0/1-click/tree/master/functions/inventory
実際の設定方法は README.md に詳細な説明が書かれているので、そちらだけで大丈夫です。

### 注意点

apex を使わずに `index.js` をコピペする場合は AWS Lambda の設定でランタイムを Node.js 8.10 に、そしてハンドラを `index.handle` にしておいてください。（標準では index.handle **r** と末尾に r が付きます）

README.md では地図が表示されていますが Button には GPS 等の位置を特定する仕組みは入っていません。この地図は AWS IoT 1-Click のプレイスメント属性に `lat = 35.xxxxx` や `lon = 139.xxx` という固定の値を入れておき、それを表示させているという例です。

<h2 id="6">Slack の Webhook を呼び出す</h2>

https://github.com/j3tm0t0/1-click/tree/master/functions/slack
README.md がありませんので、こちらで解説します。

### 必要な情報と設定先

※設定先が２つ以上ある場合はどちらか１つでOKです

* Slack の Webhook URL
    * Lambda 関数の環境変数 `SLACK_URL`
    * AWS IoT 1-Click のプレイスメント属性 `slackUrl`
* Slack 上での送信時ボットの画像
    * AWS IoT 1-Click のプレイスメント属性 `iconEmoji`
    * AWS IoT 1-Click のプレイスメント属性 `iconUrl`
* 送信先の Slack チャンネル
    * AWS IoT 1-Click のプレイスメント属性 `slackChannel`

実際に設定する値は [Slack APIでメッセージ送信](/mizuki_takahashi/items/3f77c2e5b6142563ce66#主に使用するパラメーターarguments) を参考にしてみてください。

### 注意点

apex を使わずに `index.js` をコピペする場合は AWS Lambda の設定でランタイムを Node.js 8.10 に、そしてハンドラを `index.handle` にしておいてください。（標準では index.handle **r** と末尾に r が付きます）

<h2 id="7">LINE の Bot と連携する</h2>

https://github.com/j3tm0t0/1-click/tree/master/functions/line-bot_py
上記で紹介しているのは LINE Messaging API （後述する２番目の方法）です。Bot の作り方から解説してあります。

ちなみに LINE との連携方法は２つあります。
１つ目が [LINE Notify](https://notify-bot.line.me/ja/) です。その人のアカウントを使って成り代わって送信するといったものになります。
２つ目が [LINE Messaging API](https://developers.line.biz/ja/services/messaging-api/) です。通称 LINE Bot と呼ばれるようで、要するに Bot という人格を作り、そいつと会話するといったものになります。

### 注意点

Runtime は Python 3.6 をお選びください。

## あとがき

これらのコードをそのまま使うも良し、fork して改良したら是非 P-R をお待ちしております！（私がレビューするわけじゃないけれど）

EoT