6
2

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.

IoTLTAdvent Calendar 2017

Day 13

ミニマリストのためのIoT開発 〜Cloud Functions とウェビオ で、サーバレスかつハードレス な温度アラートシステムを作る

Last updated at Posted at 2017-12-11

今回はIoTLTのアドベントカレンダーのための投稿です。

ご挨拶

こんにちは、IoTLTではお馴染み(?)の「しおげん@ウェビオ」です。普段は、IoT専門の受託開発とIoT向けセンシングサービス「ウェビオ」をやっております。

時代は「サーバレス」

昨年ぐらいから、「サーバレス」なる用語が流行り始めているようです。
Googleトレンドで見てみると、2016年の初め頃からどんどん伸びて、成長中。
サーバレス.png

サーバのことは気にせずに、純粋にロジックだけを記述してクラウド上に「関数」としてデプロイしてしまおうという、ミニマリストにはなんとも嬉しい概念であります。AWSのLambdaに始まり、GoogleやMicrosoftも同様のサービスを出してきています。

いいですねー。サーバの事は何も考えずに、純粋にロジックに集中できるって。

ならばIoTも「ハードレス」で

IoTのクラウド側が「サーバレス」なら、ハードウェア側も「ハード(開発)レス」にしたいと思いませんか?そこで、弊社の センサーas a Service「ウェビオ」 の出番となるわけです。ウェビオは、クラウドに直結された色々なセンサーをレンタルしてくれるサービスです。データを取りたい場所にウェビオのセンサーを置くと、データがHTTPSで、JSON形式で飛んできます。これがあれば、もうハード開発を行う事なく、IoTシステムを構築できるという訳です。

ウェビオの温度センサー
webiot_tmp_photo.jpg

この記事で作るもの

今回は、サーバレスアーキテクチャを提供するGoogle Cloud Functions と ウェビオの温度センサーを使って、温度アラートシステムをサーバレスかつハードレスで作って見たいと思います。

具体的には、温度が30度を超えたら、「暑い!」とメールしてくれるシステムです。

これ自体は何の役にも立たないシステムですが、一定の閾値を超えたらアラートを出して欲しいというニーズは色々あると思うので、記事のネタにして見ました。

システム構成

ウェビオ(温度センサー)

Google Cloud Functions

SendGrid

メールボックス

Step 1 ウェビオの入手とセットアップ

https://webiot.io/ から、「ウェビオ温度/湿度/気圧センサー BLEタイプ」と「ウェビオ 3G/LTEゲートウェイ」 を申し込みます。

届いたら、ゲートウェイをコンセントに繋ぎます。

ウェビオコンソール https://console.webiot.io/ にログインして、
データが届いているか確認します。

以上で、ハードウェアの準備は終わりです。

Step 2 SendgridのAPIキーを取得

Sendgridはお馴染みかと思いますが、メール送信APIです。
https://app.sendgrid.com/ にログインし、
左メニュー「Setting」 > 「API Keys」を開きます。
右上「Create API Key」から今回使うAPIキーを作成し、どこかにコピペしておきます。

Sendgridの準備は以上です。

Step 3 Google Cloud Functions のセットアップ

https://console.cloud.google.com/ にログインして、
左メニューから「Cloud Functions」を選択します。
上部に出てくる「Create Function」 から関数を作成します。

作る関数はこんな感じです。 (CloudFunctionsの詳細は、公式ドキュメントをご覧ください。)
呼び出しタイプはもちろんHTTPトリガーです。

//セキュリティー 設定
const SendgridKey = 'ここにセンドグリッドのAPIキー(良い子はベタ書きしないでね)';
const demo01Key = '自分で決めたランダム文字列'; //パスワードみたいなものをつけておく

// Sendgrid 設定
const sgMail = require('@sendgrid/mail');
sgMail.setApiKey(SendgridKey);
const msgTo = ['hoge@example.com', 'fuga@example.com']; //送付先メールアドレス
const msgFrom = 'whobar@example.com'; //送信元メールアドレス

// 関数本体
exports.demo01 = function demo01 (req, res) {
  console.log(req.body);

  if (req.body.key !== demo01Key) {  //パスワードみたいなものをチェック
    console.log('403');
    res.status(403).send('Invalid API Key\n');
    return;
  }
  
  //一応ウェビオID(所定のセンサーかどうか)のチェック
  if(req.body.id==='BTXX00'){
    const temperature = Number(req.body.value);  //文字列を数値に変換

    //30度以上の時だけ
    if(temperature >=30){ 
      const msg = {
        to: msgTo,
        from: msgFrom,
        subject: '暑い!',
        text: '暑い!30度超えてるよ。'
      };
      sgMail.send(msg); //メール送信

      const responseText = 'メールを送信しました\n'+JSON.stringify(msg);
      console.log(responseText);
      res.status(200).send(responseText);
      return;
    }

    //30度以上じゃない時は
    const responseText = 'メールは送信しませんでした\n';
    console.log(responseText);
    res.status(200).send(responseText);
    return;
  }

  //ウェビオIDがおかしい時はスルー
  console.log('何か変です');
  res.status(200).send('OK\n');
};

関数が作成できたら、
https://us-central1-hoge-fuga.cloudfunctions.net/demo01
のような呼び出し用URLができるので、メモります。

Step 4 ウェビオからCloud Functionsを呼び出す

https://console.webiot.io/ の左から「データ連携」を開きます。
HTTP Post を選択し、
温度センサーを選択し、
設定をしていきます。
URLを先ほど作成したCloudFunctionsの呼び出しURLにして、
BODY JSON には

{
  "value":"{{value}}",
  "id":"{{id}}",
  "key":"自分で決めたランダム文字列"
}

といった感じで、必要なデータを放り込みます。

以上で完成です 。

テスト

ウェビオの温度センサーに息を吹きかけ、30度以上にして見てください。
無事、メールが送信されれば完成です!

まとめ

非常に駆け足での紹介となってしまいましたが、
Google Cloud Functions と ウェビオ を使うことで、
非常に少ない量のコーディングで、IoTシステムを構築できることが、
体感いただけたのではないかと思います。

Let's エンジョイ IoT !

6
2
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
6
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?