新潟 IoT ハッカソン：Raspberry Pi と CANDY Pi Lite + S でセンサータグデータを扱う

# はじめに
本コンテンツは 2019年2月16日(土)、17日(日)に開催される、新潟 IoT ハッカソンのハンズオンの記事となります。
Raspberry Pi と CANDY Pi Lite + S を用いてセンサータグのデータを取得し、MotionBoard Cloud にセンサーデータを送信する例を示します。


# 準備するもの

* PC
* SSH 接続用クライアント
* Raspberry Pi、CANDY Pi Lite + S、microSD、電源ケーブル (当日配布)
* センサータグ (CC2650STK SimpleLink SensorTag) (当日配布)

ハッカソンでは、PC、Raspberry Pi 間の接続には、会場で準備する WiFi 環境を利用します。
Windows の方は、[Tera Term](https://ja.osdn.net/projects/ttssh2/releases/) など SSH クライアントをインストールしておいてください。


# 構成

センサータグでセンシングしたデータを、Raspberry Pi と CANDY Pi Lite + S を使って MotionBoard Cloud へデータを転送します。

![ハッカソン構成画像.png](https://qiita-image-store.s3.amazonaws.com/0/72495/7fa439ea-dca0-8987-9d7b-8f568b39eb74.png)


## センサータグ

センサータグは小型でワイヤレス([BLE](https://ja.wikipedia.org/wiki/Bluetooth_Low_Energy)通信)で電池式といった特徴があるため、まずはどんなデータが集まるか確認したいといったプロトタイピングを行う場合に便利です。また、価格も安価($29)であるためハードルが低いです。

センサータグでは以下のデータが取得できます。

* 温度、湿度
* 大気圧
* 照度
* 加速度、ジャイロスコープ(角速度)、磁力 (それぞれ 3 軸)
* ボタン (ボタンの押し込み状況)
* 磁気センサー (磁石の近接に反応)


スマートフォンアプリで簡単にセンサータグのデータを確認することもできます。
AWS や Azure、IBM Cloud などの [MQTT](https://ja.wikipedia.org/wiki/MQ_Telemetry_Transport) サーバーにスマホアプリ経由でセンサータグのデータを送信できます。
アプリダウンロード先：[App Store](https://itunes.apple.com/jp/app/ti-sensortag/id552918064?mt=8)　[Google Play](https://play.google.com/store/apps/details?id=com.ti.ble.sensortag&hl=ja)

## CANDY Pi Lite + S

「CANDY Pi Lite」（キャンディパイ・ライト）は、低速〜中速通信に適した「Raspberry Pi（ラズベリーパイ、またはラズパイ）」及び「ASUS Tinker Board」向け3G/LTE通信ボードです。([製品ページ](https://www.candy-line.io/%E8%A3%BD%E5%93%81%E4%B8%80%E8%A6%A7/candy-pi-lite/)より抜粋)

CANDY Pi Lite の公式のマニュアルは以下を参照してください。
https://candy-line.gitbooks.io/candy-pi-lite/content/

ハッカソンで利用するのモデルは SoftBank 様モデルです。

## LTE Cat.4
LTE の通信規格の一つです。
最大通信速度は受信 150Mbps、送信 50Mbps。
画像や動画など容量の大きいデータや高頻度のデータ送信などパフォーマンスが求められる IoT アプリケーションに向いています。

LTE Cat.M1、NB-IoT はセルラー [LPWA](https://ja.wikipedia.org/wiki/LPWA_(%E7%84%A1%E7%B7%9A)) と呼ばれ、低消費電力と低コストを実現しているのが特徴です。

* Cat.M1：LPWAとしては高速。
* NB-IoT：低速で、遅延があるが、非常に低コスト。

詳細は SoftBank 様 [プレスリリース](https://www.softbank.jp/corp/group/sbm/news/press/2018/20180426_02/) を参照。

# ハンズオン

## Raspberry Pi - 起動とログイン

Raspberry Pi に電源ケーブル (micro USB 端子) を差し込みます。
電源投入後しばらくすると、会場の Wi-Fi に接続され、IP アドレスが付与されます。

PC も会場の Wi-Fi に接続してください。DHCP で IP アドレスが付与されますので Wi-Fi のネットワークインターフェースに固定 IP アドレスを設定している場合は、DHCP で取得するに設定してください。

SSH で Raspberry Pi に接続します。

| 項目 | 値 |
|:-----------:|:------------:|
| Wi-Fi SSID |ハッカソン会場でご案内します|
| SSH 接続先 IP アドレス |ハッカソン会場でご案内します|
| Username |pi|
| Password |ハッカソン会場でご案内します|

* Windows の場合、[Tera Term](https://ja.osdn.net/projects/ttssh2/releases/) など SSH クライアントをインストールしてください。
* Mac の場合、ターミナルから SSH 接続できます。

``` Mac.Terminal
ssh pi@<RaspberryPi のIP アドレス>
```

## Raspberry Pi - インターネットへの疎通確認

ログイン後 Google の DNS サーバー (8.8.8.8) 宛に `ping` を実行して、インターネットに接続できていることを確認します。

``` RaspberryPi.Console
ping 8.8.8.8
```

現在のモバイルネットワーク (LTE) 接続状態を表示するには、以下のコマンドを実行してください。

``` RaspberryPi.Console
sudo candy connection status
```

* `ONLINE` ... モバイルネットワークに接続中です。
* `OFFLINE` ... モバイルネットワークに接続していません。


## Raspberry Pi - BLE モジュールインストール

CANDY RED でセンサータグを利用するため、以下の 2 つのコマンドをそれぞれ実行します。処理は数分で完了します。

``` RaspberryPi.Console
sudo apt-get install libbluetooth-dev libudev-dev pi-bluetooth -y
sudo setcap cap_net_raw+eip $(eval readlink -f `which node`)
```

上記のコマンド実行後、`reboot` コマンドで Raspberry Pi を再起動します。

``` RaspberryPi.Console
sudo reboot
```

再起動は 1 分程度で完了します。再起動後は、pi ユーザーで SSH で接続してください。


## CANDY RED - ログイン

PC のブラウザで以下 URL にアクセスします。

`http://＜RaspberryPi のIP アドレス＞:8100`

![login.png](https://qiita-image-store.s3.amazonaws.com/0/72495/ff565f52-0edd-0af6-9346-b3fc910c8273.png)

ログインユーザー名と、パスワードは以下の通りです。

| 項目 | 値 |
|:-----------:|:------------:|
| Username: |pi|
| Password: |ハッカソン会場でご案内します|


## CANDY RED - センサータグ用ノード追加

CANDY RED にセンサータグ用ノードを追加します。
CANDY RED にログイン後、右上のハンバーガーメニューより、`Manage palette` をクリックします。

![Install01.png](https://qiita-image-store.s3.amazonaws.com/0/72495/b11c36cb-7896-61b0-4a4e-00a1cf71d661.png)

`Install` タブをクリックし、`node-red-node-sensortag` と検索し、`node-red-node-sensortag` の `Install` をクリックします。
※ `@ppatiemo/node-red-node-sensortag` も候補に出てきますが、間違わないようにしてください。

![Install01-2.png](https://qiita-image-store.s3.amazonaws.com/0/72495/e333ad1e-801a-355f-0264-3a37d99b067e.png)

`Install` をクリックします。インストール完了まで 3 分ほど待ちます。

![Install02.png](https://qiita-image-store.s3.amazonaws.com/0/72495/83b85133-1b22-1bd8-b5df-227319e4a3af.png)

`Node added to palette: sensorTag` と表示されたらインストール完了です。

![Install03.png](https://qiita-image-store.s3.amazonaws.com/0/72495/a15abb97-ba82-2a7e-e38c-159d3ecb1f7d.png)


## CANDY RED - センサータグ用ノードを差し替え

センサータグ用ノードの内のファイルを以下のコマンドを実行し差し替えます。
オリジナルの `node-red-node-sensortag` ノードはセンサータグを指定した処理にバグがあるため修正しています。

``` RaspberryPi.Console
cd /opt/candy-red/.node-red/node_modules/node-red-node-sensortag/
sudo cp 79-sensorTag.html 79-sensorTag.html.bkp
sudo cp 79-sensorTag.js 79-sensorTag.js.bkp
sudo wget https://raw.githubusercontent.com/kuronekomaron/node-red-node-sensortag/master/79-sensorTag.html -O 79-sensorTag.html
sudo wget https://raw.githubusercontent.com/kuronekomaron/node-red-node-sensortag/master/79-sensorTag.js -O 79-sensorTag.js
```

以下のコマンドを実行し CANDY RED を再起動します。

``` RaspberryPi.Console
sudo systemctl restart candy-red
```


## CANDY RED - センサータグ接続

`+` で新しいタブ (フロー) を作成します。

![Sensor00.png](https://qiita-image-store.s3.amazonaws.com/0/72495/e05e4cdb-26a5-e91f-1fdd-f04d109dd439.png)

左側のパレットより `sensorTag` ノードを探し、中央のワークスペースにドラッグ&ドロップします。
![Sensor01_.png](https://qiita-image-store.s3.amazonaws.com/0/72495/cf185242-6c3b-6f75-b3cc-4f94aa6349f5.png)

同様に、左側のパレットより `debug` ノードを探し、中央のワークスペースにドラッグ&ドロップします。
`sensorTag` ノードの右側の〇(出力端子)をクリックしたまま、 `debug` ノードの左側の〇(入力端子)までマウスを動かしボタンを離します。
![Sensor02_.png](https://qiita-image-store.s3.amazonaws.com/0/72495/9f7b8dca-2db9-16f4-800f-1726eb5e65cf.png)

`sensorTag` ノードをダブルクリックし、`sensorTag` ノードの設定画面を開きます。
`UUID` に センサータグの MAC アドレスを入力します。 
`Outputs` では取得したいデータを選択します。
![Sensor03_.png](https://qiita-image-store.s3.amazonaws.com/0/72495/d437c790-ad96-c2d6-b76a-f1d83b221a72.png)


センサータグで取得できるデータは以下の通りです。

| 項目 | センサー | 取得例 |
|:-------------:|:--------------:|:------------------------:|
| Temperature and Humidity| 温度、湿度 |{ topic: sensorTag/humidity , payload: { temperature: 25.2, humidity: 58.1} }|
| Pressure                | 大気圧 |{ topic: sensorTag/pressure, payload: { pressure: 1000.1 } }|
| Magnetometer ※          | 地磁気計 |{ topic: sensorTag/magnetometer , payload: { magX:0.01, magY:0.01, magZ:0.01 } }|
| Accelerometer ※          | 加速度計 |{ topic: sensorTag/accelerometer , payload: { accelX:0.01, accelY:1.01, accelZ:0.01 } }|
| Gyroscope ※              |ジャイロスコープ (角速度) | { topic: sensorTag/gyroscope , payload: { gyroX:0.01, gyroY:0.01, gyroZ:0.01 } }|
| Luminosity              |照度|{ topic: sensorTag/luxometer , payload: { lux: 123 } }|
| Button press            |ボタン 押込、磁石 近接|{ topic: sensorTag/keys , payload: { left: true, right: false, magnet: false}}|

* 各センサーから 1 秒間隔でデータが出力されます。ボタンと磁石については、ボタンの押し込みや磁石の近接を検知したタイミングでデータが出力されます。
* `Magnetometer`, `Accelerometer`, `Gyroscope` のいずれかの値を取得したい場合は、`Magnetometer`, `Accelerometer`, `Gyroscope` のチェックをすべて ON にしてください。 後続のノードで `Topic` の値で区別してください。
* `IR Temperature`：最近のロットでは、IR 温度センサが未搭載のため機能しません。

設定が完了したら、 `Done` で設定画面を閉じ、`Deploy` をクリックします。

右ペインの `debug` タブに、センサー情報が表示されることを確認します。

![Sensor04.png](https://qiita-image-store.s3.amazonaws.com/0/72495/75aedae5-0e64-1593-fc76-ef91a8d8b279.png)


### センサータグが接続できない場合

#### センサータグの電源が入っているか確認する

センサータグの電源ボタンを押すと電源が入ります。
センサータグの LED のステータスは以下の通りです。

| LED | ステータス |
|:-------------:|:--------------:|
| 緑点滅 | 接続待ち。接続待ちのまま 2 分程度時間がたつと電源OFF。 |
| なし | 電源 OFF、接続中 |

LED が光っていないときは電源 OFF もしくは Raspberry Pi と接続中のステータスです。
電池が切れている可能性もあるので、なかなか接続できない際は技術メンターにお声がけください。

#### sensorTag ノードの制限

CANDY RED 上では `sensorTag` のノードは同時に 1 つしか利用できません。
`sensorTag` のノードを複数利用したときの動作は保証されません。
このため、1 つの CANDY RED では 2 つ以上のセンサータグを同時に利用できません。

#### CANDY RED の再起動を試す

`UUID` を間違えた後、正しい MAC アドレスを指定しているのに sensorTag ノードが、`discovering...` のままで接続できないときなどうまく接続できない場合、以下のコマンドで CANDY RED の再起動を行ってから再度試してください。

``` RaspberryPi.Console
sudo systemctl restart candy-red
```

## MotionBoard Cloud へのデータ送信

Motionboard Cloud へセンサーデータを送信するために、`node-red-contrib-motionboard` ノードをインストールします。
※ CANDY RED の ハンバーガーメニュー - `Manage palette` - `Install` タブよりインストールします。

ここでは 5 秒に 1 回 MotionBoard Cloud に `temperature` (気温) データを送信する例を示します。
以下のようにノードを配置します。
![Motionboard01_.png](https://qiita-image-store.s3.amazonaws.com/0/72495/1efcb7e7-5477-e3da-48e2-29ec26d3ec53.png)

### sensorTag ノード設定

* `Outputs` で `Temperature and Humidity` のみを選択し、`temperature` と `humidity` のみ取得するように設定します。
![Motionboard09.png](https://qiita-image-store.s3.amazonaws.com/0/72495/19675798-ef47-3d2a-fb17-99c44cd83822.png)


### delay ノード設定

`delay` ノードではデータ転送の遅延や送信制限を設定できます。
5 秒に 1 回データを送る設定は以下の通りです。

| 項目 | 設定値 |
|:-----------:|:------------:|
| Action | Rate Limit - All messages|
| Rate   |**1** msg(s) per  **5** Seconds |
|        | drop intermediate messages : ON |
`drop intermediate messages` を `ON` とすると、 5 秒に 1 回送信されるデータ以外は破棄されます。
![Motionboard05.png](https://qiita-image-store.s3.amazonaws.com/0/72495/6e76b154-9c86-223f-f085-e9636eb2d34e.png)

### change ノード設定

MotionBorad Cloud の WebAPI ではデータ送信時の仕様として、データ送信元の識別用に `id` を付与する必要があります。
`change` ノードで以下のように設定し、`id` を設定します。

| 項目 | 設定値 |
|:-----------:|:------------:|
| Rules| Set , msg.payload.id |
|  | to  任意の値 |

![Motionboard04.png](https://qiita-image-store.s3.amazonaws.com/0/72495/9cbb87fe-0d6c-d417-d0a7-b0b130e0b7d0.png)

ここまで設定を行うと、`Chanege` ノードから出力される msg.payload のデータは以下のようになります。

```msg.payload
{temperature: 25.8, humidity: 19.2, id: "送信元識別用ID"}
```

### MotionBoard ノード設定

`MotionBoard` ノードにはデータの送信先の接続先や認証情報を設定します。

| 項目 | 設定値 |
|:-----------:|:------------:|
| WebAPIのベースURL| https://iot-cloud.motionboard.jp/motionboard |

![Motionboard02_.png](https://qiita-image-store.s3.amazonaws.com/0/72495/d01e36e4-3dd5-637f-15a5-65a7a371da5c.png)
* `テナント名` は、配布資料をご確認ください。
* `テンプレート名`、`認証キー` は
Motionboard Cloud の `管理` - `システム設定` - `接続/認証` - `リアルタイム連携` で確認します。
![MotionBoardリアルタイム連携画面.png](https://qiita-image-store.s3.amazonaws.com/0/72495/6c62e831-fcfb-bc5a-3d3a-9fa05423f358.png)


`temperature` データを MotionBoard Cloud に送信します。
`リアルタイム連携` の `ステータス` タブで、受信したいデータ名 `temperature` を設定しておきます。
![Motionboard06.png](https://qiita-image-store.s3.amazonaws.com/0/72495/83c5eba1-f76d-8d71-f133-0c5382de20b3.png)


## MotionBoard Cloud 側データ確認

ここまでの設定が完了したら、`Deploy` をクリックします。
MotionBoard Cloud 側で、CANDY RED から送信したデータが確認できたら成功です。
![Motionboard07.png](https://qiita-image-store.s3.amazonaws.com/0/72495/9b2cafd6-0ba1-196d-2d9b-4217237b5c69.png)
![Motionboard08.png](https://qiita-image-store.s3.amazonaws.com/0/72495/373e7cc8-d507-b883-c9ff-0d0ea2eab9ce.png)



# トラブルシューティング

この章の内容はトラブル時に利用してください。

## Raspberry Pi - 有線 LAN 固定 IP アドレス設定

CandyPi では、micro SD カードの boot フォルダーに `boot-ip.json` ファイルを作成して IP アドレス情報を記載しておくことで、有線 LAN に固定 IP アドレスを設定できます。

※ ゲートウェイや DNS サーバーが不要な際は `""` と設定してください。

```/boot/boot-ip.json
{
  "ip_address":"192.168.10.2/24",
  "routers":"",
  "domain_name_servers":""
}
```


## Raspberry Pi - HDMI から映像を出力するための準備

SSH が利用できない場合など、ディスプレイが必要になった場合は以下の設定を行ってください。

Raspberry Pi から micro SD カードを抜き、PC で読み込みます。
`/boot/config.txt` を開き、以下の設定を変更します。

```/boot/config.txt
# セーフモードで動作させる
hdmi_safe=1

# コンポジットではなく強制的にHDMIから出力する
hdmi_force_hotplug=1

# 信号強度を強くする
config_hdmi_boost=4
```

参考: https://qiita.com/locatw/items/44320cec2456bf104716