超簡単！？ Wio LTE と IFTTT を使って、サクッと IoT を体験してみよう

この記事は [SORACOM Advent Calendar 2017](https://qiita.com/advent-calendar/2017/soracom) の16日目の記事です。

[SORACOM UG 信州](https://www.facebook.com/groups/soracomug.shinshu/) の中の人こと @ko2a です。

本日開催の [SORACOM UG 信州 #2](https://soracomug-tokyo.connpass.com/event/70305/) での LT ネタとして用意したいた内容です。
ただ、5分に収まらなそうだったので技術情報については Qiita の方へ記載することにしました。

本当は記事を書くに至った経緯なども書きたかったのですが・・・なかなかうまくまとまらないので書くのを止めました。
今日の LT 枠が空いていたら軽く話そうかな？

# はじめに
[Seeed Wio LTE](https://soracom.jp/products/wio_lte/) と [Grove センサー](http://wiki.seeed.cc/Grove_System/) を使って IoT の モノ側を構築し、 SORACOM サービスと IFTTT を利用して インターネット側をサクッと用意して、 IoT を体験してみたいと思います。

私自身、 AWS や Azure などまだまだ勉強中の身であり、いきなり使いこなせる程の余裕はありません。
そんな経緯もあり、 Wio LTE と [IFTTT]() を使って何ができるのかな？というのを試してみたいと思い、実践してみました。

今回使用するセンサーは、ちょうど手元にあった [Grove - 温湿度センサー(SHT31)](http://wiki.seeed.cc/Grove-TempAndHumi_Sensor-SHT31/) を使用します。

※他のセンサーを使って試してみたい！という方は、Seeed さんが公開している [WioLTEforArduino](https://github.com/SeeedJP/WioLTEforArduino) のサンプルコードを参考にしてください。

なお、 IFTTT の連携時に連携先サービスのユーザーアカウントが必要になることがあります。
そのあたりの説明については、今回省略させていただきます。
（検索エンジンで「LINE IFTTT 連携」のように検索して頂くと、連携方法が紹介されているページが表示されます）

# 準備

## 1. IFTTT Maker Webhooks と SORACOM Beam の設定
SORACOM イベントで使用している、超音波センサーハンズオンのテキスト[「7章 Twitterと連携してみる」](https://github.com/soracom/handson/blob/master/ultrasonic-sensor/kit.md#section7) の手順に従い、[IFTTT Maker Webhooks](https://ifttt.com/maker_webhooks) のキーを確認します。

その後、SORACOM Beam の設定をテキストと同様に設定します。

## 2. Wio LTE へスケッチを書き込む
WioLTEforArduino の [IFTTT Maker Webhooks サンプルコード](https://github.com/SeeedJP/WioLTEforArduino/tree/master/examples/http/ifttt-webhook) をベースに、 SORACOM Beam を使えるようカスタマイズします。
また Grove 温湿度センサー(SHT31) の温度を取得し、データ連携するための処理を実装する必要があります。

サンプルコードからの変更点としては、以下となります。

- 温湿度センサー (SHT31) の初期化処理と取得処理の追加
- IFTTT 連携用の JSON 形式テキストの生成
- HTTP POST 先を IFTTT Maker Webhooks から SORACOM Beam へ変更

```cpp:wiolte-ifttt-webhook-sht31.ino
// コンソール確認用のモニタ出力処理は、Qiitaの記事では削除しています
// GitHubで公開しているものには記載されています

#include <WioLTEforArduino.h>
#include <SHT31.h>
#include <stdio.h>

#define APN                  "soracom.io"
#define USERNAME             "sora"
#define PASSWORD             "sora"
#define SORACOM_BEAM_EP_URL  "http://beam.soracom.io:8888/"

#define INTERVAL             (60000)
#define DATA_SIZE            (128)
#define NUMBER_SIZE          (32)

WioLTE Wio;
SHT31 sht31 = SHT31();
  
void setup() {
  delay(200);

  Wio.Init();
  Wio.PowerSupplyGrove(true);                 // I2C接続の場合は、明示的に電源ONする必要があり
  sht31.begin();                              // SHT31センサーの取得開始

  Wio.PowerSupplyLTE(true);
  delay(5000);

  if (!Wio.TurnOnOrReset()) {
    // Error
    return;
  }

  delay(10000);
  if (!Wio.Activate(APN, USERNAME, PASSWORD)) {
    // Error
    return;
  }
}

void loop() {
  char data[DATA_SIZE];
  int status;
  int connectId;

  float temp = sht31.getTemperature();        // 温度を取得
  float humi = sht31.getHumidity();           // 湿度を取得

  if (temp == NAN || humi == NAN) {
    // Error
    goto err;
  }

  char number[NUMBER_SIZE];
  int result;
  result = Wio.GetPhoneNumber(number, NUMBER_SIZE);    // データ送信元が識別できなくなるので、
                                                       // かわりに電話番号を取得してセットする

  // HTTP POST
  sprintf(data,"{\"value1\":\"%s\",\"value2\":\"%.2f\",\"value3\":\"%.2f\"}", number, temp, humi);
  if (!Wio.HttpPost(SORACOM_BEAM_EP_URL, data, &status)) {
    // Error
    goto err;
  }
  
err:
  // Wait
  delay(INTERVAL);
}
```

### ソースコード
GitHub にて公開しています。
https://github.com/ko2a/wiolte-ifttt-webhook-sht31 (SHT31 + SORACOM Beam)
https://github.com/ko2a/wiolte-grove-sht31-example (SHT31 サンプル)

### データフォーマット
IFTTT へ送るデータフォーマットは以下となります。
sprintf() で取得値をJSON形式のフォーマットへセットします。

```cpp
sprintf(data,"{\"value1\":\"%s\",\"value2\":\"%.2f\",\"value3\":\"%.2f\"}", number, temp, humi);
```

```json:Format
{ "value1" : "{PhoneNumber}", "value2" : "{Temperature}", "value3" : "{Humidity}" }
```

SORACOM Beam の機能として、IMSI 値をデータに乗せて送ることが可能なのですが、IFTTT 側のデータフォーマットの定義が決まっているため、IMSI 値を IFTTT 側で扱うことができませんでした。
そのため、現時点では Wio LTE で電話番号を [GetPhoneNumber()](https://github.com/SeeedJP/WioLTEforArduino/wiki/Reference-ja#getphonenumber) で取得し、 value1 へセットして識別情報として送っています。

**2017/12/19 Update**
現在、Seeed さんの方で IMSI/IMEI を取得する処理を実装しているみたいです。
[IMSIを取得する関数を提供してほしい](https://github.com/SeeedJP/WioLTEforArduino/issues/13)

現時点では master branch にマージされていませんが、そのうち利用できるようになるでしょう。

### Base64 エンコードという罠

当初、WioLTEforArduino のサンプルの中から、SORACOM Funnel/Harvest のコードを参考に SORACOM Beam でデータ送信をしよう！と考えたのですが、 SORACOM Beam のエントリーポイントのプロトコルを TCP/UDP にすると、データを Base64 で強制エンコードしていまうため、 IFTTT 側でデータの受け取りに失敗し、データを取得できないことがわかりました。

流石に IFTTT 側で Base64 デコード処理を組み込むわけにもいかず、どうしようと悩んだ末、IFTTT Maker Webhooks のサンプルコードを使って [HTTP POST](https://github.com/SeeedJP/WioLTEforArduino/wiki/Reference-ja#httppost) で送ることにしました。

この辺り、いい感じでドツボにハマったので、 ON/OFF 機能の実現を [サンタさん](https://twitter.com/hashtag/%E3%82%BD%E3%83%A9%E3%82%B3%E3%83%A0%E3%82%B5%E3%83%B3%E3%82%BF?src=hash) にお願いしました！

<blockquote class="twitter-tweet" data-lang="ja"><p lang="ja" dir="ltr">SORACOM BeamのエントリーポイントをTCP/UDPにしたときのBase64エンコードON/OFF機能(´ω`)<br><br>IFTTTなどのサービス側でデコード処理するのは難しいので、Base64で送りたくない場合があるのです(´ω`)<br>（まあHTTP POST使えるならそっち使えばよいのだが）<a href="https://twitter.com/hashtag/soracom?src=hash&amp;ref_src=twsrc%5Etfw">#soracom</a> <a href="https://twitter.com/hashtag/%E3%82%BD%E3%83%A9%E3%82%B3%E3%83%A0%E3%82%B5%E3%83%B3%E3%82%BF?src=hash&amp;ref_src=twsrc%5Etfw">#ソラコムサンタ</a></p>&mdash; こにゃ (@kuroneko_ko2a) <a href="https://twitter.com/kuroneko_ko2a/status/940835149532495873?ref_src=twsrc%5Etfw">2017年12月13日</a></blockquote>

（というか、既に実装されてて隠されているだけのような気もするけど・・・）

### 何故 SORACOM Beam を使ったのか？
IFTTT Maker Webhooks のサンプルコードには、直接 IFTTT へ連携する実装となっていましたが、今回 SORACOM Beam を使うことにしました。

SORACOM Advent Calendar なので、何かソラコムのサービスを使わなきゃ・・・というのもありましたが、それ以外の理由としては

* IFTTT Maker Webhooks のキー情報を、 Wio LTE 側で持たせなくて済む
* 仮に接続先が変わったとしても、 Wio LTE 側の処理を変更する必要がない

というメリットがあったからです。

キー情報や連携先の Webhook URL を User Console 側で保持しているので、キーを変更したり接続先を変えたいときは Web からいじいじするだけ！ Wio LTE をいじる必要もない！ 便利( ✌︎'ω')✌︎

接続情報が変わる都度、ファームを書き換えるなんて面倒だし、そもそも出来ない場合もありますからね・・・

このあたりのお話、イベントで @ma2shita さんが話しているのを聞いてはいるのですが、 
これは実際に使ってみないとありがたみを理解しづらいかも・・・

# IFTTT のサンプルアプレット

今回、3 つのサンプルアプレットを作成してみました。
![soracomAdCal2017_0019.png](https://qiita-image-store.s3.amazonaws.com/0/49240/04652d2f-2035-d9ff-7924-ff6212428b23.png)

アプレットの *this* の箇所の設定方法は、超音波センサーハンズオンのテキスト[「7章 Twitterと連携してみる」](https://github.com/soracom/handson/blob/master/ultrasonic-sensor/kit.md#section7) に掲載されています。
*that* については、以下で説明します。

## 例1：Google スプレッドシート にセンサーデータを記録する

![soracomAdCal2017_0001.png](https://qiita-image-store.s3.amazonaws.com/0/49240/6de7d956-9dcf-e289-e62c-bb3dfebf85fb.png)

![soracomAdCal2017_0002.png](https://qiita-image-store.s3.amazonaws.com/0/49240/c7fea261-6c5b-212e-03b9-96de72fd2cb3.png)

![soracomAdCal2017_0003.png](https://qiita-image-store.s3.amazonaws.com/0/49240/fbc5d491-7277-9bc1-0fd5-5e6f1abcec45.png)

実行例
![soracomAdCal2017_0015.png](https://qiita-image-store.s3.amazonaws.com/0/49240/79adc5c0-9b36-758b-d6e5-d61dad35cd2e.png)

## 例2：eメール でセンサーデータを通知する

![soracomAdCal2017_0020.png](https://qiita-image-store.s3.amazonaws.com/0/49240/6a26bc68-5cb7-8ed5-8e51-f77c8b5b3b67.png)

![soracomAdCal2017_0021.png](https://qiita-image-store.s3.amazonaws.com/0/49240/5b774dd1-405a-33e3-d0ea-8c9fa1c70332.png)

![soracomAdCal2017_0022.png](https://qiita-image-store.s3.amazonaws.com/0/49240/531f564f-2c53-b801-57b1-220d2b7aafd4.png)

実行例
<img width="320" alt="IMG_5244.PNG" src="https://qiita-image-store.s3.amazonaws.com/0/49240/325e5398-106b-6372-72fc-6dd0887e3f76.png">


## 例3：LINE のメッセージでセンサーデータを通知する

![soracomAdCal2017_0023.png](https://qiita-image-store.s3.amazonaws.com/0/49240/12730080-d527-219c-3c29-e7c14646e62f.png)

![soracomAdCal2017_0024.png](https://qiita-image-store.s3.amazonaws.com/0/49240/4bb1b44f-dce3-9a55-db6b-2aabe4fb1576.png)

![soracomAdCal2017_0025.png](https://qiita-image-store.s3.amazonaws.com/0/49240/dab20784-86bc-77c2-ac9b-411d8b475936.png)

実行例
<img width="320" alt="IMG_5245.PNG" src="https://qiita-image-store.s3.amazonaws.com/0/49240/336bba83-af8a-2077-f805-9e72a422d696.png">


# おわりに
IFTTT の連携サービスには色々ありますので、先ずは失敗してもいいやーというノリで色々試してみるのがよいかと思います。
ちょっとスキルアップをしたい！ということであれば、連携先の Webhook を設定して呼び出すことも可能ですよ！

参考：[IFTTT Maker ChannelでWebhook送受信ができるようになった。](http://senyoltw.hatenablog.jp/entry/2015/06/20/114005)

この辺り、ちょっとインパクトのありそうなネタを思いついたので、また後日お披露目したいと思います。
　
　
　
明日17日目は @chinoppy さんの投稿となります。
本日のイベントで会場を提供して頂いた、[GEEKLAB.NAGANO](http://geeklab-nagano.com/) の中の人です！
それでは！