Google SpreadSheetとBluetooth LE BeaconキットでIoTハードウェア開発からデータの可視化まで1時間で完成させる

# はじめに
この記事ではRaspberry PiとLeafonyを使って短時間でIoT環境センサを作り、Google SpreadSheetを使って簡単にグラフ化する方法について紹介します。
実際にサンプルコードを動かして、ハードからソフトまでIoTサービスの開発をとても簡単に体験できます。

<img width="640" alt="image.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/410452/d1d4a598-2a5b-34c6-0c12-a55a1c9b1a98.png">

# 用意するもの
* Raspberry Pi
* [Leafony Basic Kit](https://leafony.com/)
* [サンプルコード](https://github.com/Leafony/leafony-beacon/tree/master/spreadsheet-logger)

# 1. Leafony Beaconの作成
ハードウェアはArduino互換ボードLeafonyで作成します。
[サンプルリポジトリ](https://github.com/Leafony/leafony-beacon/tree/master/spreadsheet-logger)にある[leafony_beacon.ino](https://github.com/Leafony/leafony-beacon/blob/master/spreadsheet-logger/Arduino/leafony_beacon/leafony_beacon.ino)が今回使用するスケッチです。
このスケッチはLeafonyをBluetooth Beacon (以下BLE Beacon)として動作させるもので、非常に省電力な動作が可能です。
([参考: 回路設計なしで省電力なBluetooth LE Beaconを開発する](https://qiita.com/s_nkg/items/b97dd7e733699731e349))


使用する基板はBasic Kitに含まれる下記の5枚です。

* 4-Sensorsリーフ (温度・湿度・照度・加速度)
* AVR MCUリーフ (ATmega328P)
* USBリーフ
* BLE Sugarリーフ
* CR2032コイン電池リーフ


組み立てをを終えたら[leafony_beacon.ino](https://github.com/Leafony/leafony-beacon/blob/master/spreadsheet-logger/Arduino/leafony_beacon/leafony_beacon.ino)を書き込んでください。

<img width="640" alt="ファイル名" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/410452/47ee715f-862a-86e0-9f8a-9b29a00324cf.png">


# 2. Raspberry Piの環境構築
BLE Beaconの受信機にはRaspberry Piを使います。
今回使用する[サンプルコード](https://github.com/Leafony/leafony-beacon/tree/master/spreadsheet-logger)では、Node.jsで[noble](https://github.com/noble/noble)を使ってBLE Beaconを受信します。受信したデータはGoogle API経由でSpreadSheetに書き込んでいます。


下記のスクリプトを実行して環境構築をします。

```bash:bash
sudo apt update
sudo apt upgrade
# 必要なパッケージのインストール
sudo apt install -y bluetooth libbluetooth-dev libudev-dev git nodejs npm
# サンプルコードのリポジトリをclone
git clone https://github.com/Leafony/leafony-beacon
cd leafony-beacon/spreadsheet-logger
# 必要なモジュールをインストール
npm install
```

# 3. Google SpreadSheet APIの取得

Google SpreadSheetをNode.jsで操作するためにはAPIを取得する必要があります。

下記の記事の`Step.1`で自分のGoogleアカウントのSpreadSheet APIを有効にして、`credentials.json`を取得できます。
`credentials.json`を`leafony-beacon/spreadsheet-logger`ディレクトリに
コピーしてください。

* [Node.js Quickstart | Sheets API | Google Developers](https://developers.google.com/sheets/api/quickstart/nodejs)

# 4. 実行

Google Driveにシートを作成しましょう。シート名は何でも良いです。
シートには赤線の位置に**シートID**と**シート名**があります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/410452/1f5bac79-2293-2e9d-a5b3-85496daa7a5e.png)


これらをコピーして`index.js`の下記の部分に貼り付けます。

```Javascript:index.js
const spreadsheetId = '<YOUR SPREADSHEET ID HERE>';
const sheetName = 'Sheet1';
```

下記のコマンドでサンプルコードを実行しましょう。
初回起動時はGoogle APIの認証用URLにブラウザでアクセスして、表示された認証コードを入力します。
Raspberry Piはブラウザの動作が重いこともあるため、SSH経由で操作することをお勧めします。

```bash:bash
$ sudo node .
Authorize this app by visiting this url: <認証用URL>
Enter the code from that page here: <認証コードを入力>
```

データが送られてきました。　シートをみていると、どんどん新しいデータが更新されていって楽しいです。
![sheet1.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/410452/4297d6ec-2bca-9086-e990-5f586668431d.gif)



# 5. データの可視化
今回使ったシートを共有します。グラフ化の方法は下記のシートを参考

* [spreadsheet-logger測定結果](https://docs.google.com/spreadsheets/d/1Uz_WhGLoCUkfBZzvTp75LpIQRTv194SI_xdC-uZOMWU/edit#gid=1699233297)

QUERYを使うと、最新のデータから順に指定した個数だけ別のシートに取ってくることができます。
デバイス名ごとに下図のように整理しました。
<img width="640" alt="image.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/410452/f129441d-b60b-8f17-2963-65a1554ffc0f.png">


すべてのグラフを1ページ目にまとめると非常に見やすいです。
最終受信日時なんかも追加して、ちゃんとRaspberry Piが動いているのかも確認できます。
<img width="640" alt="image.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/410452/f2ef0036-3aac-c89b-d2b8-b38c7c232952.png">

Google SpreadSheetはスマートフォンやタブレットでも表示できるため、これで簡単に外出先からでもモニタリングできるようになりました。

# まとめ
Raspberry PiとLeafonyを使ってBLE Beaconのサンプルアプリを動かしました。
Google SpreadSheetをデータベース兼UIとして用いることで、ほぼノーコードで簡単にリモートでセンシングを行うことができました。

# 次回
ここまではLeafonyオリジナルのセンサ基板で温湿度や照度の測定を行いました。
次回は圧力やガスセンサを搭載した自分オリジナルの基板を設計しサンプルコードをいじってみようと思います。

* [Leafony向けセンサ基板を自作する](https://qiita.com/s_nkg/items/e33b3417daf1d7b9253b)

# 補足説明

## nobleをRaspberry Piで使う上の注意点
Raspberry PiでBLEのAdvertisementをスキャンするために、nobleというNode.js向けBluetoothライブラリを使用しています。

```
npm install noble
```

で入るものはRaspberry Piではうまく動きませんでした。(2019年12月現在)
nobleをフォークした下記のライブラリではRaspberry Piで動作可能です。
* https://www.npmjs.com/package/@abandonware/noble

```
npm install @abandonware/noble
```

とすることで、Raspberry Piだけでなく、WindowsやMac OSで動かすことが可能となります。