obniz+Integromat+Googleスプレッドシートでほぼプログラミング不要なIoTセンサーロガー

従来、センサデータを長期間に渡って取得し、蓄積するシステムを作るには、ローカルに保存するとすればデータを取り出す手間やハードウェア損傷、データ消失のリスク、メンテナンスコスト等の問題がありました。インターネットを経由するとしても通信機能やサーバー構築のコストがあり、非常に面倒でした。

システムが複雑だと、センサやメモリ、サーバーのどこか1ヶ所でも障害が発生すると、気づいたときにはもうずっとデータを記録できていなかったなんていう悲劇が起こる可能性も高くなるので、不安定なシステム構成は避けたいものです。

しかし現在ではIoT技術やサービスのおかげで、初心者でも安定したIoTセンサーロガーを低コストで素早くシンプルに構築できるようになっています！今回は**obniz**と**Integromat**というサービスを連携して、**センサのデータを定期的にGoogle スプレッドシートに保存**するIoTシステムを、ほぼプログラム不要で作ります。

---
※ IFTTTを介して同様のセンサーロガーを作成した事例がこちらにあります。
[obniz+IFTTT+Googleスプレッドシートでほぼプログラミング不要なIoTセンサーロガー](https://qiita.com/y-hira/items/de7e8d5c2e8e4c1c4acd)

# システム構成
以下の図のように、センサ-obniz-obniz Cloud-Integromat-Google Driveの順に繋がっています。
<img width="960" alt="obniz_integromat.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/401669/df6df7bf-15b9-c466-87d0-19494853b73c.png">


# この開発手法のメリット
- **ハードウェアが非常にシンプル**（obnizは様々なセンサが直接繋げられるようになっているため、ハードウェアの作成はほぼセンサを刺すだけです）
- **プログラミングが必要なのは1ヶ所だけ、しかもほぼコピペ**（センサ測定部のプログラムは、[obniz公式パーツライブラリ](https://obniz.io/ja/sdk/parts)に載っているセンサであれば、ほぼコピペです）
- **停電からの復旧に強い、安定**（obnizは電源を入れるとすぐにWi-Fiに接続され、遠隔操作可能）
- **取得データをあらゆる場所から確認可能**（Google スプレッドシートに保存されるので、グラフ化してスマホアプリから閲覧も可能）
- **データ分析との連携も容易**（Google Colabとも簡単に連携できてPythonで分析したり機械学習も可能）

# 用意するもの
## obniz
[obniz（オブナイズ）](https://obniz.io/ja/)は日本のCambrianRobotics社が開発したマイコンボードで、Wi-Fiに接続してインターネット経由で操作します。JavaScriptやPython, ブロックプログラミングで記述することができます。Amazonや、秋月電子などの秋葉原のお店で手に入ります。

## センサ
使用したいセンサを用意してください。[obniz公式パーツライブラリ](https://obniz.io/ja/sdk/parts)に載っているセンサであれば、センサ測定部のプログラムはほぼコピペでできます。ここでは、温度センサ `LM60` を使用します。

## Integromat
[Integromat](https://www.integromat.com/)は、フローを作成して処理の自動化をすることができるサービスです。アカウントを作成してください。

## Google スプレッドシート
Google スプレッドシートは、ブラウザ上で利用できる表計算ソフトです。Integromatから記録させるためのGoogleアカウントと、スプレッドシートを用意してください。

## 周辺部品
- 5VのUSB電源とmicro USBケーブル
- Wi-Fiアクセスポイント

# Integromatで連携の準備
[Integromat](https://www.integromat.com/)にアクセスし、`Sign up`からアカウントを作成します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/401669/ca343fce-7148-1a5f-8c3d-4526783240de.png)

`Create a new scenario`から新しいシナリオを作成します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/401669/fb44547c-319a-283b-e690-ce3d63055d5f.png)

今回は、**obniz cloudからweb リクエストを受け取ったら Google スプレッドシートに記録する**というようなイメージです。利用するサービスとして、`Webhooks`と`Google Sheets`を選択した後に`Continue`を押します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/401669/f9d400d1-8684-302d-cb8a-0c4a01703265.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/401669/0945ef8f-e026-8b1a-f947-0cabd7e1b4e8.png)


まず、`Webhooks`の`Custom Webhook`を追加します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/401669/456399f9-c20a-d34a-28d2-3bdfefa6fb29.png)

`Webhooks`の設定の中で`Add`を押して、特に設定はいじらなくていいので`Save`を押すと、赤い`Stop`ボタンが回り始めているのが分かると思います。これは、Webhookで送られてくるデータ形式を認識するために、一度Web リクエストが送られてくるのを待機している状態です。`Stop` ボタンの上にあるURLがWeb リクエストの送り先URLなので、コピーしておいてください。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/401669/e770c3a6-d7a9-c111-3790-7fd03cbcd4b4.png)


# ハードウェアの作成
といってもセンサを刺すだけでした。USB電源に繋げると、電源が入ってWi-Fiを選択する画面が出てきます。左上のスイッチを使用してパスワードを入力すれば、電源を抜き差ししても、次回以降は自動的にそのアクセスポイントに接続されます。
![IMG_1841 2.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/401669/0d428be1-7c68-b965-ec44-1b353c9ca86c.jpeg)
obnizのIOは12ピンありますが、**プログラムでピンアサインを自在に設定**することができるため、このようにセンサのピンアサインそのままに接続することができます。

# obnizの定期実行機能
obnizは、マイコンのIO制御をクラウドのAPI経由で行える仕組みになっており、スマートフォンやPCのブラウザ、またはnode.js等から遠隔で操作することができます。
[obniz開発者コンソール](https://obniz.io/ja/console)のメニューから「イベント」を選択して作成することができます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/401669/130492d6-e526-6361-f61c-ebeed9a3e63f.png)

きっかけとして

- Webhook
- 毎日この時間で
- 繰り返し（○分、○時間おき）
- obniz Hardware Event (obnizがオンラインになった、ボタンが押された)

から選ぶことができ、それをきっかけとして選択したプログラムを実行することができます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/401669/38cc7b36-e6fc-2206-74bd-ea13f91f5bec.png)

なので、今回例えば30分おきに温度センサの値を記録したければ、**実行されるたびに一度obnizの温度を取得してIntegromatにWeb リクエストを送るプログラム**を作成し、それを`30 minutes`おきの**繰り返し**で実行させるよう指定すれば良いことが分かります。

# obnizのプログラム作成
**実行されるたびに一度obnizの温度を取得してIntegromatにWeb リクエストを送るプログラム**を作成します。
[obniz開発者コンソール](https://obniz.io/ja/console)のメニューから「リポジトリ」を選択します。右上の「新規作成」を押して適当なファイル名を付けて「作成」すると、エディタ画面に移ります。

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/401669/7f21c82f-c36a-8399-fa69-fa8c65eedc7b.png" width="70%">

ここで`<body>`~`</body>`の中身を書き換えます。

## センサ値測定部のプログラム
[obniz公式パーツライブラリ](https://obniz.io/ja/sdk/parts)に載っているセンサであれば、センサ測定部のプログラムはほぼコピペでできます。ここでは、温度センサ `LM60` を使用します。
[LM60 | JS Parts Library | obniz](https://obniz.io/ja/sdk/parts/LM60/README.md)にあるサンプルに従えば、センサ値を1回取得するためのプログラムは以下の3行で済みます。

```javascript
// Javascript Example
var tempsens = obniz.wired("LM60",   { gnd:0 , output:1, vcc:2});
var temp = await tempsens.getWait();
console.log(temp);
```

## センサ値送信部のプログラム
そしてIntegromatにWeb リクエストでセンサー値を送信します。基本的な送信方法は以下のようになります。ここではjQueryのPOST `$.post` を使いました。

```javascript
var url="https://hook.integromat.com/XXXXXXXXXX";//Integromatで確認できるWeb リクエストの送り先URLに書き換えてください。
$.post(url, { temperature: temp, });
```

## 全体のプログラム
これらを踏まえ、実際に`LM60`で温度を測定してIntegromatに送信するプログラムは以下のようになります。
obnizのID, IntegromatのWeb リクエストの送り先URLは環境に応じて書き換える必要があります。
送信するデータには、ついでにタイムスタンプとobnizのIDも含めています。

```html:obniz_integromat.html
<html>

<head>
    <meta charset="utf-8">
    <meta name="viewport" content="width=device-width, initial-scale=1">
    <script src="https://obniz.io/js/jquery-3.2.1.min.js"></script>
    <script src="https://unpkg.com/obniz@latest/obniz.js"></script>
</head>

<body>
    <div id="obniz-debug"></div>
    <h1>obniz Integromat sensor logger</h1>

    <script>
        var obniz = new Obniz("OBNIZ_ID_HERE");//obnizのIDを指定してください
        var lm60;
        var url="https://hook.integromat.com/XXXXXXXXXX";//Integromatで確認できるWeb リクエストの送り先URLに書き換えてください。

        obniz.onconnect = async function () {
            lm60 = obniz.wired("LM60", { gnd: 0, output: 1, vcc: 2 });//他のセンサを使う場合はそれぞれ書き換えてください。
            send_sensor_value();
        }

        async function send_sensor_value() {
            const temp = await lm60.getWait();
            var timestamp = new Date();
            var data={
                timestamp: timestamp,
                obniz_id: obniz.id,
                temperature: temp,
            };

            $.post(url, data).done(function (ret) {
                console.dir(ret);
            });
        }
    </script>
</body>

</html>
```

完成したら、プログラムを一度「実行」してください。うまくいけば、IntegromatのWebhooksトリガーに反応があり、`Stop`ボタンが消えて`Successfuly determined.`と表示されると思います。

# IntegromatでGoogle スプレッドシートと連携

`Add another module`を押して`Google Sheets`の`Add a row`を追加します。

<img width="1173" alt="スクリーンショット 2019-08-30 19.23.35.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/401669/d1b2361b-d4d8-9fe3-257a-abc8bbe3da15.png">

Google アカウントとの連携を追加します。
<img width="1172" alt="スクリーンショット 2019-08-30 19.26.34.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/401669/0b3c120a-9819-6921-9b2b-e31c92e610ec.png">

途中でGoogle アカウントへのアクセス許可が求められると思います。

<img width="360" alt="スクリーンショット 2019-08-30 19.27.52.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/401669/f33b4b6c-9a3e-be7a-6bc5-5c33c15fd16d.png">

Googleアカウントと連携できると、記録するためのスプレッドシートを選択します。
[Google ドライブ](https://drive.google.com/)で、保存したい場所にスプレッドシートを作成しておいてください。既存のワークブックでも構いませんが、記録用のシートを用意しておいてください。

<img width="1028" alt="スクリーンショット 2019-08-30 19.31.43.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/401669/c1a8ae0a-6021-7d09-58f8-f29e902f8722.png">

Integromatで、記録したいスプレッドシートを選択します。Google ドライブにあるスプレッドシートの名前一覧から選択することもできますが、スプレッドシートのIDとシート名を手動で入力して選択することもできます。

<img width="1158" alt="スクリーンショット 2019-08-30 19.29.17.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/401669/571f5b20-8d63-a897-99a5-f1ca904c0710.png">

手動で指定する場合、シート名を、Web リクエストのデータを含む関数で指定するなど、やや複雑な処理の分岐を作成することも可能です。
<img width="1172" alt="スクリーンショット 2019-08-30 19.36.00.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/401669/f7322e00-6a8d-532c-ce8b-4bfd2ae25ea3.png">

そして何列目にどんな値を記録するか指定します。単純にWeb リクエストで送られたデータを記録するだけでなく、`if`や数学的な関数、UUIDの生成、日付、タイムスタンプをIntegromat内で計算させて記録させることもできます。
<img width="1170" alt="スクリーンショット 2019-08-30 19.43.54.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/401669/cfd9d722-e830-04de-bf54-5f4e3e8818e0.png">

完成したら、下にある`Save`ボタンを忘れずに押して、トグルスイッチをオンにすることで有効化します。

<img width="1171" alt="スクリーンショット 2019-08-30 19.47.42.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/401669/d668f08d-e430-dca7-1356-c2a9a46bea94.png">
<img width="1171" alt="スクリーンショット 2019-08-30 19.48.53.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/401669/d82d32ce-7e64-a6aa-b2f0-0651efec9f92.png">

ダッシュボードで、作成したシナリオがアクティブになっていることを確認しましょう。
<img width="1173" alt="スクリーンショット 2019-08-30 19.50.06.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/401669/7c5a366b-34bf-cd79-afc7-087960ef8d7b.png">


## obnizのイベントを登録
プログラムを作成して[obniz開発者コンソール](https://obniz.io/ja/console)のリポジトリに保存したら、[obniz開発者コンソール](https://obniz.io/ja/console)の「イベント」から「新規作成」を選択し、作成したプログラムのファイル名を選択して、定期的に実行されるように設定します。
後ほど述べますが、Integromatフリープランの動作回数の制限のため、一定間隔でずっと記録したければ、ここでは記録間隔は`2 hour`以上にする必要があります。

<img width="924" alt="スクリーンショット 2019-08-30 19.52.54.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/401669/77e7cbc3-015e-6c7a-04ed-3ba442be76a2.png">

設定したら、「テスト実行」を押して一度確認してみると良いでしょう。

# 動作確認
うまく動作すれば、指定したスプレッドシートに、センサ値が一行ずつ記録されていきます。

<img width="863" alt="スクリーンショット 2019-08-30 19.55.00.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/401669/6ae08fc4-0bb5-4132-2216-86cfed6e903d.png">

# Integromatの制限
Integromatのフリープランでは動作回数が1ヶ月あたり1000回までとなっています。1回の記録動作につき`Webhooks`と`Google Sheets`の`Add a Row`という2つの要素を用いているため、記録できるのは1ヶ月に500回までです。一定間隔で記録するならおよそ90分に1回までですね…

Integromatのダッシュボードから、動作状況を詳しく見ることができることができます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/401669/dcc75f32-71b7-6b1a-f699-02def7b8a446.png)


# 最後に
Integromatを通じて、obnizとGoogle スプレッドシートを結びつけることで、サーバー側のプログラミングなしに簡単にIoTセンサーロガーを作成することができました。

**1週間以上に渡って温度を記録していますが、問題なく記録され続けています。**

個人的に、従来のマイコンボードではSDカードが破損したり、インターネットへの接続が面倒だったり、Wi-Fiもすぐに切断されて不安定だったりした経験があるので、**obnizはずっとUSB電源に繋いで放置していれば**、仮に一時的に電源やWi-Fiから切断されることがあったとしても**すぐに復帰**して接続し続け、起動、停止やプログラムの変更もいつでも遠隔でブラウザから行うことができるので非常に快適です。

**Integromat**ではGmailやTwitter, FacebookといったWebサービス, アプリを利用してAndroid, iOS端末との連携も豊富なので、ただスプレッドシートに記録していくだけでなく、通知や何かアクションすることも難しくありません。

**obniz**の回路やプログラムもちょっと工夫するだけで、温度の値に応じて**スマートフォンに通知**したり、**エアコンのオン・オフを自動化**したりと、応用が広がります。

さらに**Google スプレッドシート**に蓄積されたデータは、**Google Colab**を使えば簡単にデータを取り込んでPythonで解析することもできます。Pythonなら**AIを利用したプログラムの事例も豊富**です。

obnizやIntegromat, Google スプレッドシートのおかげで、自宅のIoT化がますます加速しそうですね！