21
9

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

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

Last updated at Posted at 2017-12-16

この記事は 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 の中の人です!
それでは!

21
9
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
21
9

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?