ifttt
IoT
SORACOM
Seeedstudio
WioLTE
SORACOMDay 16

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

この記事は SORACOM Advent Calendar 2017 の16日目の記事です。

SORACOM UG 信州 の中の人こと @ko2a です。

本日開催の SORACOM UG 信州 #2 での LT ネタとして用意したいた内容です。
ただ、5分に収まらなそうだったので技術情報については Qiita の方へ記載することにしました。

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

はじめに

Seeed Wio LTEGrove センサー を使って IoT の モノ側を構築し、 SORACOM サービスと IFTTT を利用して インターネット側をサクッと用意して、 IoT を体験してみたいと思います。

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

今回使用するセンサーは、ちょうど手元にあった Grove - 温湿度センサー(SHT31) を使用します。

※他のセンサーを使って試してみたい!という方は、Seeed さんが公開している WioLTEforArduino のサンプルコードを参考にしてください。

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

準備

1. IFTTT Maker Webhooks と SORACOM Beam の設定

SORACOM イベントで使用している、超音波センサーハンズオンのテキスト「7章 Twitterと連携してみる」 の手順に従い、IFTTT Maker Webhooks のキーを確認します。

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

2. Wio LTE へスケッチを書き込む

WioLTEforArduino の IFTTT Maker Webhooks サンプルコード をベースに、 SORACOM Beam を使えるようカスタマイズします。
また Grove 温湿度センサー(SHT31) の温度を取得し、データ連携するための処理を実装する必要があります。

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

  • 温湿度センサー (SHT31) の初期化処理と取得処理の追加
  • IFTTT 連携用の JSON 形式テキストの生成
  • HTTP POST 先を IFTTT Maker Webhooks から SORACOM Beam へ変更
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形式のフォーマットへセットします。

sprintf(data,"{\"value1\":\"%s\",\"value2\":\"%.2f\",\"value3\":\"%.2f\"}", number, temp, humi);
Format
{ "value1" : "{PhoneNumber}", "value2" : "{Temperature}", "value3" : "{Humidity}" }

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

2017/12/19 Update
現在、Seeed さんの方で IMSI/IMEI を取得する処理を実装しているみたいです。
IMSIを取得する関数を提供してほしい

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

Base64 エンコードという罠

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

流石に IFTTT 側で Base64 デコード処理を組み込むわけにもいかず、どうしようと悩んだ末、IFTTT Maker Webhooks のサンプルコードを使って HTTP POST で送ることにしました。

この辺り、いい感じでドツボにハマったので、 ON/OFF 機能の実現を サンタさん にお願いしました!

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

何故 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

アプレットの this の箇所の設定方法は、超音波センサーハンズオンのテキスト「7章 Twitterと連携してみる」 に掲載されています。
that については、以下で説明します。

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

soracomAdCal2017_0001.png

soracomAdCal2017_0002.png

soracomAdCal2017_0003.png

実行例
soracomAdCal2017_0015.png

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

soracomAdCal2017_0020.png

soracomAdCal2017_0021.png

soracomAdCal2017_0022.png

実行例
IMG_5244.PNG

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

soracomAdCal2017_0023.png

soracomAdCal2017_0024.png

soracomAdCal2017_0025.png

実行例
IMG_5245.PNG

おわりに

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

参考:IFTTT Maker ChannelでWebhook送受信ができるようになった。

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