Nefry BTとIFTTTをサクッと連携


こんにちは、ちゃんとくです。この記事は[Nefry Advent Calendar 2018](https://qiita.com/advent-calendar/2018/nefry) 2日目の記事です。

## やること
![Image from Gyazo](https://i.gyazo.com/d924874ad9ea315a1359f41e0cb97d92.png)

Nefry BTというマイコンボードのスイッチを押すと、IFTTTを経由してTwitterに投稿する仕組みを作ります。また、これを応用して「**センサのデータが〜を超えたらTwitter投稿**」や「**人検知したらTwitter投稿**」などの仕組みを作ることができます。

さらに、IFTTTではさまざまなサービス連携ができるので、LINE通知、メール通知、Slack投稿など簡単にカスタマイズできます。

短いコードでサクッとやれるので試してみてね！

※この記事は下記のNefry BT環境構築・初期設定が済んでいる前提で進めます。

- [Arduino IDEをPCにインストール](https://dotstud.io/docs/arduinoide-setup/)
- [Nefry BTの環境構築（Arduino IDE）](https://dotstud.io/docs/nefrybt-setup-arduino-ide/)
- [Wi-Fi情報を設定](https://dotstud.io/docs/nefrybt-setup-wifi/)

## Nefry BTって？

[![Image from Gyazo](https://i.gyazo.com/7a03cd802d043a75ac63bcfd1e6820f9.png)](https://gyazo.com/7a03cd802d043a75ac63bcfd1e6820f9)

Nefry BTは「ESP-WROOM-32」というWi-Fi・BLE通信モジュールを搭載した、Arduinoと同じように開発できるマイコンボードです。

[Grove](https://dotstud.io/docs/grove/)という刺すだけで配線できるモジュール対応のコネクタを搭載していて、ハードウェアをあまり意識せずに開発できます。

## IFTTTって？
![ifttt_action2.png](https://qiita-image-store.s3.amazonaws.com/0/119003/708ab034-730e-20ae-9299-a2a4c9a2e8af.png "ifttt_action2.png")
[公式ページ](https;//ifttt.com/)

IFTTTは**LINE、Twitter、Slackを始めとした様々なWebサービス同士を簡単に連携できるサービス**です。連携したものは「アプレット（旧名：レシピ）」と呼ばれ、自分で新しいアプレットを作成することもできます。

## IFTTTの設定
### IFTTTにアプレットを作成する
まずはIFTTTにアプレットを作成します。IFTTTのアカウントを持っていない場合はアカウント取得から進めてください。

IFTTTのアプレットは「〇〇が起きたら△△する」というようにトリガー（〇〇）とアクション（△△）に分けられます。

今回はNefry BTで「**ボタンを押したらIFTTTにアクセスする**」というプログラムを作成したいので、アプレットではトリガーとして自作のWebサービスを利用できる「**Webhooks**」を使います。

### トリガーの作成
![ifttt_trigger1.png](https://qiita-image-store.s3.amazonaws.com/0/119003/59201dfe-9640-4b3f-282b-706f8a93ccfc.png "ifttt_trigger1.png")

[IFTTTのアプレット作成ページ](https://ifttt.com/create/)から「**+this**」部分をクリックし、トリガーの作成をします。 

![ifttt_trigger2.png](https://qiita-image-store.s3.amazonaws.com/0/119003/8d6a728a-b432-ad6a-d254-c3ba52ecf751.png "ifttt_trigger2.png")
「Webhooks」を検索しましょう。 

![ifttt_trigger3.png](https://qiita-image-store.s3.amazonaws.com/0/119003/2e27d309-4ea1-6b12-a0fa-1869eb1a0f03.png "ifttt_trigger3.png")

任意のイベント名をつけます。後ほどNefry BTにも登録するので覚えておきましょう（大文字・小文字の区別があるのでコピー＆ペーストがオススメです）。 

### アクションの作成
続いてアクションを作成します。

![ifttt_action1.png](https://qiita-image-store.s3.amazonaws.com/0/119003/c890774c-ac28-6a63-e911-d9e42e2c9220.png "ifttt_action1.png")

「**+that**」から進めましょう。 

![ifttt_action2-1.png](https://qiita-image-store.s3.amazonaws.com/0/119003/4606d049-bba3-db34-dc2b-0708d57dd604.png "ifttt_action2-1.png")

Nefry BTのボタンを押したら実行したいWebサービスを自由に選びます。今回はサンプルとしてTwitterを連携してみます。LINE、Twitter、Slack、Gmail、Googleカレンダー、Facebookなどなど、たぶん思いつく有名Webサービスはだいたいあります。 

※連携するWebサービスのアカウント情報（ここではTwitter）は、マイページから登録する必要があります。

![ifttt_action3.png](https://qiita-image-store.s3.amazonaws.com/0/119003/c6d371f6-b8c4-7675-0f50-1e28f567aaa6.png "ifttt_action3.png")

起こしたいアクションを選びましょう。今回は「Post a tweet（Tweetする）」を選んでみます。 

![ifttt_action4.png](https://qiita-image-store.s3.amazonaws.com/0/119003/e7b9a98f-1faf-bc47-892e-5fb861a4ebc6.png "ifttt_action4.png")

Tweetする内容を入力し、「Create action」をクリックします。ちなみにTwitterの仕様として**全く同じ文字列を連続して投稿できない**ので、随時変化するTimestampなども入れるのがオススメです。 

![ifttt_action5.png](https://qiita-image-store.s3.amazonaws.com/0/119003/bba90955-6ecb-ac38-9368-d73b81bc2b8f.png "ifttt_action5.png")

新しいアプレットができました！「**Webhooksを受け取ったらTweetする**」というアプレットです。「Finish」で完了します。

### WebhooksのSecret Keyを取得
Nefry BTとWebhooksと紐付けるための「Secret Key」を取得します。

![ifttt_discover1.png](https://qiita-image-store.s3.amazonaws.com/0/119003/7fcad36d-0ee8-ac1f-7797-b3dc93bfeba9.png "ifttt_discover1.png")

[IFTTTのTOPページ](https://ifttt.com/)からWebhooksを検索しましょう。 

![ifttt_discover2.png](https://qiita-image-store.s3.amazonaws.com/0/119003/68d8b81a-1437-18f0-8a37-08ddb5516017.png "ifttt_discover2.png")

Webhooksのページに移動します（初回は認証画面が表示されるので「Connect」で開始しましょう）。右上の「Setting」に移動します。 

![ifttt_discover3.png](https://qiita-image-store.s3.amazonaws.com/0/119003/fb03ef52-06b8-e75e-70c3-fa4657085147.png "ifttt_discover3.png")

「URL」の末尾に自身のSecret Keyが記載されているのでコピーしましょう！ 

## Nefry BTのプログラム
以下のプログラムをNefry BTに書き込みます。

```
#include <Nefry.h>
#include <NefryIFTTT.h>

String SecretKey, Event;

void setup() {
    Nefry.setStoreTitle("SecretKey",0);
    Nefry.setStoreTitle("Event",1);
    SecretKey = Nefry.getStoreStr(0);   
    Event = Nefry.getStoreStr(1);
    Nefry.enableSW(); // SWの有効化。SWを使わない場合は不要
}

void loop() {
    if(Nefry.readSW()) {
        if (!IFTTT.send(event, SecretKey)) {
            Nefry.setLed(255, 0, 0);
        }
        Nefry.ndelay(1000*10); // 10秒間は再送しないようにする
    }
    Nefry.setLed(0, 0, 0);
}
```

## Nefry BTにIFTTTの情報を設定
![ifttt_setup1.png](https://qiita-image-store.s3.amazonaws.com/0/119003/cfc60997-5466-35b2-fe8f-a499af38137a.png "ifttt_setup1.png")
[Nefryポータル](https://dotstud.io/docs/nefrybt-basic-portal/)を開き、Data Storeに移動します。

![Image from Gyazo](https://i.gyazo.com/572d97615e6b3ec16d3d280ef32497ae.png)
「DataStore」のページに行くと2つのフォームが用意されているので、「Event」にはIFTTTで設定したイベント名、「SecretKey」にはIFTTTのWebhooksのKeyを入力します。

## 動作
![nefry_ifttt.png](https://qiita-image-store.s3.amazonaws.com/0/119003/5347e0e5-1ba9-678e-d62d-219200f3826b.png "nefry_ifttt.png")

## 雑な解説
### IFTTT.send()
`IFTTT.send("event名", "SecretKey")`で、IFTTTのイベント名とKeyを指定します。利用する時は`NefryIFTTT.h`ライブラリを読み込んでください。

### Nefry.setStoreTitle()
`Nefry.setStoreTitle("フォーム名", 番号)`で、Nefryポータルで設定するためのフォームを作成しています。0番目にLINE Auth, 1番目にLINEMessageという名前をつけています。

利用する時は`Nefry.h`ライブラリを読み込んでください

### Nefry.getStoreStr()
`Nefry.getStoreStr(番号)`で、Nefryポータルで設定した指定番号の値を取得しています。

わざわざポータル側で設定することもないのですが、トークンやメッセージを変えるたびにプログラムを書き込む手間を考えるとオススメの方法です。