The Things Network (TTN)で受信したLoRaWANのデータをIFTTTを利用してSlackに通知する

How to integrate TTN (The Things Network) with Slack, and notify these data?

LoRaWANサーバとしてデファクトスタンダード（とかいうと怒る人もいるかもしれませんが）であるTTN（The Things Network）で受信確認したデータをSlackに通知する方法について紹介します。

あるLoRaノードの到達確認の際にSlackで確認したいなあと思って試しました。

LoRaWANってなに？って人はここを読むとは思いませんので、以下のMONOISTさんの記事を参照してください。

https://monoist.atmarkit.co.jp/mn/articles/1709/19/news004.html

# 事前準備

**1. TTNの使い方がわかる（すでにLoRaノードからデータを受信できる）**

LoRaWAN初心者にはちょっとわからないかも

**2. JSONがわかる**

**3. 自身でアプリケーションが追加できるSlackワークスペースを持っている**

Slackは非常に便利で無料でも十分に利用できるコミュニティワークスペースです。その便利さや他のサービスとの連携の容易さから通知用として活用している人も多いと思います（私もいろいろ活用しています）。

https://slack.com/

**4. IFTTTのアカウントを持っている**

持っていない人は以下から登録しましょう。

https://ifttt.com/

# すること

TTNで受信しているデータをSlackへ通知します。

フローはこんな感じです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/211407/c2d9fdf4-c48d-c558-813c-31608bd13b9f.png)


センサ値などを送信するノード（デバイス）をTTNのサーバで受信し、ABPもしくはOTAAでデバイスを認証後データを確認できるものとします。

TTNのインテグレーション機能を利用してIFTTTのWebhooksのreceiverとPost to Slackを連携してSlackのチャンネルへ通知を行います。

HTTPインテグレーションからそのままSlack通知を試したのですが、Incoming webhookなど必要なパラメータをTTNで指定できなかったためこの構成になりました。

## 1. SlackとIFTTTを連携する

自身が設定やアプリ連携ができるSlackワークスペースを用意してください。

以下を参考に連携します。

https://get.slack.help/hc/ja/articles/360002091107-Slack-%E5%AF%BE%E5%BF%9C-IFTTT

- slack
https://slack.com/intl/ja-jp/signin

- IFTTT
https://ifttt.com

ここで連携したワークスペースのチャンネルなどにデバイスから受信したメッセージを通知します。

## ２. IFTTTでwebhookとSlack通知部分を作成する

まずは連携するためのIFTTTを作成します。

https://ifttt.com

IFTTTにアクセスして、自分のアイコンをクリックしてCreateから以下を組み合わせます。

- Trigger (IF)
WebhooksのReceive a web request
このときEventNameを適当に決めてください。また後で利用するので控えておきましょう。

- action (Then)
SlackのPost to channelから自身のSlackワークスペースの投稿したいチャンネルなどを選択します。

ここまでうまくいくと以下のような画面になっているはずです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/211407/0fa9c977-f73e-307d-18fd-b44d42fbf669.png)

以下、通知部分なので適当に編集します。

- Message

Slackに投稿される通知メッセージ部分です。
{{EventName}}はIFTTTのイベント名、Value1, Value2, Value3はIFTTT連携元から渡されるJSON中にあるタグです。

私は以下のように設定しています。

```
{{EventName}}: {{Value1}} (base64 data: {{Value2}}) Raw: {{Value3}}
```

- Title

通知タイトルです。適当に設定してください。


### IFTTT連携情報の取得

また、IFTTTに連携するためのwebhookの情報を取得しておきます。

IFTTTのHomeからwebhookのServiceを検索して見つけます。

すると、”Documentation”というものが右上に見つかるはずです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/211407/2f56ce24-6e9b-1f83-7643-ccb182888427.png)

ここに連携に必要な情報が書いてあります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/211407/b1c5b803-d922-8bec-17ea-0ca405bdbd56.png)

ここで、**keyの情報をコピーしておきましょう**。

これは後のTTNのインテグレーションの設定で利用します。

## ３. TTN上でアプリケーションのインテグレーションを設定する

### 事前確認

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/211407/2b194923-23c0-0d8a-859a-e1be14ab2275.png)

上記のイメージのように、自身の所有しているデバイスがアプリケーションに登録されており、実際に受信したデータが、このアプリケーションの「データ」のタブから確認できることがまず必要となります。

以下はアップリンクのシミュレーションでデータの受信を試してみた例です。実際のデータを受信してもこのように見えます。

### Decoderの記述

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/211407/07767f5a-f36a-794c-0a24-4b5606c2292c.png)

ここで一度Payload Formatsのタグにて”Decoder”を記述します。受信したデータの解釈やデータ部のある程度の分割などをここで指定することができます。

”Decoder”で返すJSONタグ名は後にIFTTTへ渡すデータ名として利用するので注意してください。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/211407/e02a80b3-49dd-879e-7f67-682fd8edfa27.png)

プログラムは以下。

```javascript
function Decoder(bytes, port) {
  var str = String(bytes[0]) + " " + String(bytes[1]) + " " + String(bytes[2]) + " " + String(bytes[3]) + " " + String(bytes[4])
  return {
      RevMsg: String.fromCharCode.apply(null, bytes),
      RevRaw: bytes,
      RevRawBytes: str
  };
}
```

”HELLO"のASCIIコードをテストに入力するとこんな感じになります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/211407/1b2fcc06-08db-b464-fe3b-aa0bb51d77eb.png)

Decoderについては以下の動画が参考になります。

[![IMAGE ALT TEXT HERE](http://img.youtube.com/vi/nT2FnwCoP7w/0.jpg)](http://www.youtube.com/watch?v=nT2FnwCoP7w)

この状態であれば、インテグレーションの設定を行っていきましょう。

### インテグレーションの追加と設定

アプリケーション＞インテグレーションのタブから、インテグレーションを追加します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/211407/9247591e-48fa-e120-931c-16582d210c68.png)

すでにIFTTTとの連携のため「IFTTT Maker」がインテグレーションのテンプレートとして用意されています。

以下を参考に設定しましょう。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/211407/444ec7bc-c042-de2e-fc0a-f60f673f4f3a.png)

- プロセスID
TTN上で識別するためのID、適切なIDを適当に決めましょう。

- Event Name
IFTTTで作成したアクションのイベント名をここに入力します。

- Key
IFTTTのAPIキーです。**先程取得したIFTTTのKeyをここに貼り付けます**。

- Value 1, Value 2, Value ３

IFTTTに渡す値を３つまで指定できます。**ここに入力するフィールド名はDecoderで指定したもののみ**です。私の場合、以下のフィールド名３つを入力しました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/211407/291ab7d8-b95e-c8c5-a8f8-fea2a97a85f4.png)

これで全体の連携設定は終了です。

# 4.連携の確認

ここまで設定が上手く完了している場合、TTN上でデバイスからデータがきたシミュレーションをすることで動作を確認することができます。

なお、このシミュレーションはアプリケーションに登録されているデバイス単位で行うことができます。

『登録アプリケーション＞登録デバイス（シミュレーションしたいデバイス）＞一覧』の下の方にある「アップリンクシミュレーション」を試しましょう。送信したデータと、デコードされたデータを確認することもできます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/211407/63518994-c60d-df98-212a-0d11baab533f.png)

これと同時にSlackにも通知が来るはずです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/211407/d6a521ac-88a8-e5fe-5679-085f4795bf71.png)

ASCII文字列デコードとBase64、あとは１バイトずつ１０進数にデコードしたものを通知しています（１６進数での表示方法がわからなかったのであくまでデバッグです）。
これでIFTTTを利用してTTNとSlackを連携できました。

実験の際や簡単な疎通確認の際に利用してみてください。