IoT ハッカソン LoRaWAN ハンズオン手順

# はじめに

本コンテンツは、LoRaWAN デバイスを用いた
IoT ハッカソンで使用する技術ハンズオンの資料です。
環境は参加者が自由選択できますので、参考としてご活用ください。

## 概要

SORACOM Air サービスを使用して、センサーから取得したデータを可視化するまでの手順を説明します。
温度センサーのデータを可視化する方法として 2 つの手段を説明します。

## 目次

<!-- prettier-ignore-start -->
<!-- TOC depthTo:4 -->

- [はじめに](#はじめに)
    - [概要](#概要)
    - [目次](#目次)
    - [構成](#構成)
    - [開発環境](#開発環境)
        - [機材](#機材)
        - [開発環境構築(Arduino IDE)](#開発環境構築arduino-ide)
            - [IDE の立ち上げとセットアップ](#ide-の立ち上げとセットアップ)
            - [動作確認](#動作確認)
            - [組み立て](#組み立て)
    - [enebular のサービスを使った可視化の手順](#enebular-のサービスを使った可視化の手順)
        - [デバイス](#デバイス)
            - [デバイスのプログラム](#デバイスのプログラム)
        - [クラウド](#クラウド)
            - [Firebase の設定](#firebase-の設定)
            - [enebular の設定](#enebular-の設定)
        - [ネットワーク](#ネットワーク)
            - [SORACOM の設定](#soracom-の設定)
    - [kintone を利用した可視化](#kintone-を利用した可視化)
        - [デバイス](#デバイス-1)
        - [クラウド](#クラウド-1)
            - [kintone の設定](#kintone-の設定)
            - [enebular の設定](#enebular-の設定-1)
        - [ネットワーク](#ネットワーク-1)
    - [enebular リファレンス](#enebular-リファレンス)
    - [スターターキット付属センサーの使い方](#スターターキット付属センサーの使い方)

<!-- /TOC -->
<!-- prettier-ignore-end -->

## 構成

- enebular のサービス を使った可視化
  - データ転送: SORACOM Beam
  - データ操作: enebular
  - データストア: firebase
  - 可視化: InfoType + InfoMotion

![setup_enebular.png](https://qiita-image-store.s3.amazonaws.com/0/281420/b038120c-0da5-899e-11ba-d662bb5dadec.png)

- enebular + kintone を使った可視化
  - データ転送: SORACOM Beam
  - データ操作: enebular
  - データストア・可視化: kintone

![setup_kintone.png](https://qiita-image-store.s3.amazonaws.com/0/281420/05dcbcd6-08b6-d798-ef23-fde1e459755a.png)

---

## 開発環境

### 機材

ハンズオンで使用する機材は、以下の物を使用します。

1. [Arduino Uno R3](https://www.switch-science.com/catalog/789/)  
   <img src="https://qiita-image-store.s3.amazonaws.com/0/281420/5f05d82d-2b2c-8847-fec0-4bba0ceea2e9.jpeg" alt="arduino_uno_r3" width="45%"/>
2. [LoRa Arduino 開発シールド AL-050](https://soracom.jp/products/lora/al-050/)  
   <img src="https://qiita-image-store.s3.amazonaws.com/0/281420/0a6066cb-5de0-9096-f881-904ca88d9b0e.jpeg" alt="AL-050" width="45%" />
3. [GROVE - スターターキット V3](https://www.switch-science.com/catalog/1812/)   
   <img src="https://qiita-image-store.s3.amazonaws.com/0/281420/72b967b4-9e24-9fb7-6a69-b9c638346ce7.jpeg" alt="starter kit v3" width="45%"/>

### 開発環境構築(Arduino IDE)

Arduino の公式ベージ - [SOFTWARE] - [DOWNLOADS]から IDE をダウンロードします
[https://www.arduino.cc/en/Main/Software](https://www.arduino.cc/en/Main/Software)
各 OS にあったものを選択して、導入してください。

- Windows (次のどちらかを選ぶ):
  - Installer, for Windows XP and up(XP 以降)を選択
- macOS:
  - Max OS X 10.7 Lion or newer(Lion 以上)を選択

<img src="https://qiita-image-store.s3.amazonaws.com/0/281420/ad0f260f-990c-06e0-2b76-33908aaa01a7.png" alt="Arduino IDE インストール" width="70%" />

寄付をしてダウンロードか、寄付なしでダウンロードするかを選択できます。
ここでは、[JUST DOWNLOAD]を選択していきます。

<img src="https://qiita-image-store.s3.amazonaws.com/0/281420/dd348ebd-4e1a-90c9-f1cd-c848088c01cb.png" alt="Arduino IDEダウンロード" width="70%" />

ダウンロードが完了したら、
インストールガイドページ にしたがってインストールします。
[https://www.arduino.cc/en/Guide/HomePage](https://www.arduino.cc/en/Guide/HomePage)

- [Windows 向け](https://www.arduino.cc/en/Guide/Windows)
- [macOS 向け](https://www.arduino.cc/en/Guide/MacOSX)

#### IDE の立ち上げとセットアップ

- Arduino IDE を立ち上げる
- PC と Arduino を USB で接続
- スケッチ画面が立ち上がったら、開発対象のボードを選択する
  - [メニューバー] - [ツール] - [ボード] - [Arduino/Genuino Uno]を選択
- Arduino と PC を接続する
  - [メニューバー] - [ツール] - [シリアルポート] - [Arduino/Genuino Uno]を選択

(※ここでは Arduino Uno R3 のみ PC と接続し、Arduino Uno R3 と GROVE ベースシールドや LoRa デバイスの接続はしないでください)

![ボード選択](https://qiita-image-store.s3.amazonaws.com/0/281420/b32b67f2-5371-9ff8-24cf-a484244d94b9.png)

![ポート選択](https://qiita-image-store.s3.amazonaws.com/0/281420/18d479b9-0704-a0ad-059d-e3297f2a0c59.png)

#### 動作確認

以下手順で、Arduino 本体についている LED が点灯し動作することを確認します。

- [メニューバー] - [ファイル] - [スケッチ例] - [01.Basics] - [Blink]を選択
- ツールバー左から 2 番目の`右矢印`アイコンをクリックし、マイコンボードに書き込む

<img width="600" alt="Blinkスケッチを選択" src="https://qiita-image-store.s3.amazonaws.com/0/281420/7e8ed4a7-ce27-9eb4-b302-e74949b55fb3.png">

![ボードへの書き込み](https://qiita-image-store.s3.amazonaws.com/0/281420/70f37b3d-1dfc-3bea-b0b6-362a5f0a76ff.png)

正常に書き込みが完了すると、"ボードへの書き込みが完了しました。"と表示されます。この状態でプログラムが動いている状態になります。

![書き込み完了](https://qiita-image-store.s3.amazonaws.com/0/281420/6901b1a2-b775-0e06-b90d-cafff76d8147.png)

ボードの以下の"L"と書かれた LED が点滅していると、サンプルが動作していることがわかります。
<img src="https://qiita-image-store.s3.amazonaws.com/0/281420/c27eae8d-d65f-8bd2-7056-1b212dc53d39.jpeg" alt="LED点滅" width="45%" />

#### 組み立て

以降のハンズオンで使うための接続を行なって行きます。

GROVE スターターキット V3 から、ベースシールドを取り出してください。  
<img src="https://qiita-image-store.s3.amazonaws.com/0/281420/cbb0ae10-255d-fca3-f523-934c14d050ef.jpeg" alt="GROVEベースシールド" width="45%" />

次に、LoRaWAN モジュール(AL-050)にアンテナを接続します。
<img src="https://qiita-image-store.s3.amazonaws.com/0/281420/a86fca2d-5d78-9a2e-9151-7772195d96bd.jpeg" alt="アンテナ接続" width="45%" />

準備ができたら、サンドイッチ構造で下から

- Arduino Uno R3
- LoRa Arduino 開発シールド AL-050
- GROVE ベースシールド
  の順番で接続してください。

<img src="https://qiita-image-store.s3.amazonaws.com/0/281420/0fe038b9-5f8e-6355-15ff-26d48f286707.jpeg" alt="接続" width="45%" />

次に、GROVE 温度センサーを取り出し、A0 に接続してください。  
※ 温度センサーは裏に"Temperature Sensor"と記載されています。

<img src="https://qiita-image-store.s3.amazonaws.com/0/281420/f189d5e7-9f35-d678-59e3-1a813d0bafd5.jpeg" alt="温度センサー接続" width="50%">

以上で、組み立てが完了です。

---

## enebular のサービスを使った可視化の手順

デバイス、クラウド、ネットワークの順に可視化のための手順を説明して行きます。
あらかじめ、[enebular のアカウント](https://enebular.com/)の準備をしておいてください。

### デバイス

#### デバイスのプログラム

##### Arduino library for LoRaWAN Device 準備

[SORACOM-LoRaWAN](https://github.com/soracom/SORACOM-LoRaWAN/releases)のページから最新の"Source code (zip)"を選択して、ライブラリをダウンロードします。

![Releases_·_soracom_SORACOM-LoRaWAN.png](https://qiita-image-store.s3.amazonaws.com/0/281420/7bece96c-23fc-2078-ba3f-ee62e769b28d.png)


ダウンロードが完了したら、Arduino IDE の
[メニューバー] - [スケッチ] - [ライブラリをインクルード] - [.ZIP 形式のライブラリをインストール...]を選択して、先ほどダウンロードした zip ファイルを選択して読み込みます。

![210_library_import.png](https://qiita-image-store.s3.amazonaws.com/0/281420/0dbcf4aa-34cb-da0d-156f-b60b489300f6.png)

##### スケッチ(コード)作成

続いて、温度センサーの値を取得してクラウドにデータを送信するプログラムを作成します。

Arduino IDE の新規ファイル作成で、ファイル名`handson_tmpr_lorawan.ino`で以下スケッチ(コード)を入力します。

```Cpp:handson_tmpr_lorawan.ino
#include <math.h>
#include <lorawan_client.h>

LoRaWANClient lorawan;

const int B = 4275;               // B value of the thermistor
const int R0 = 100000;            // R0 = 100k
const int pinTempSensor = A0;     // Grove - Temperature Sensor connect to A0

// 初期化処理
void setup()
{
  Serial.begin(9600);
  Serial.println("LoRaWAN module init");

  // LoRaデバイスへ接続
  if (!lorawan.connect(true))
  {
    Serial.println(" failed to connect. Halt...");
    for (;;) {};
  }
  Serial.println("\nConnected.\n");
}

// 定期処理
void loop()
{
  int a = analogRead(pinTempSensor);

  float R = 1023.0/a-1.0;
  R = R0*R;

  float temperature = 1.0/(log(R/R0)/B+1/298.15)-273.15; // convert to temperature via datasheet

  Serial.print("temperature = ");
  Serial.println(temperature);

  // 温度データを送信
  lorawan.sendData(temperature);
  delay(5000); // // 5秒間待機
}
```

##### スケッチ(コード)の解説

###### 温度センサー取得

Seeed Studio 社の公式 Wiki で公開されている[Grove - Temperature Sensor V1.2](http://wiki.seeedstudio.com/Grove-Temperature_Sensor_V1.2/)をベースにしています。

`analogRead`でセンサーから電圧を読み取り、以下の計算で抵抗値`R`を求めています。
続いてデータシートを参照して、抵抗値`R`から温度`temperature`へ変換を行います。

###### ネットワークへ接続

1. 接続  
   `LoRaWANClient lorawan;`で準備した、オブジェクトを介して、`lorawan.connect(true)`でネットワークへ接続します。
   接続が完了するまで、次の処理へは進みません。
2. 送信  
   `lorawan.sendData(temperature);`で温度の値を送信します。

### クラウド

#### Firebase の設定

enebular のページで["DataBase のセットアップ"](https://docs.enebular.com/ja/infomotion/datasource/firebase/setup#database-%E3%81%AE%E3%82%BB%E3%83%83%E3%83%88%E3%82%A2%E3%83%83%E3%83%97)と["DataSource の作成"](https://docs.enebular.com/ja/infomotion/datasource/firebase/CreateDataSource.html)を実施してください。

次に、Firebase の"ウェブアプリに Firebase を追加"の内容を控えてください。

![ウェブアプリに FireBase を追加1](https://qiita-image-store.s3.amazonaws.com/0/281420/1e2ad03d-ab92-da72-1089-1fc043468668.png)

![ウェブアプリに FireBase を追加2](https://qiita-image-store.s3.amazonaws.com/0/281420/fcdc292c-cbf7-b180-d81f-98ec63eb4c83.png)

#### enebular の設定

##### enebular プロジェクト作成

コンソールから[Create Projet]を選択し、プロジェクトを作成します。

![コンソール-プロジェクト作成](https://qiita-image-store.s3.amazonaws.com/0/281420/a514fdae-b0ff-13ca-1879-d8e7a3f681d2.png)

プロジェクト名には任意の名前をつけて、[Submit]を選択する(図では"iot-hackathon")

![プロジェクト名](https://qiita-image-store.s3.amazonaws.com/0/281420/7f203637-2464-fff9-858f-77aefb3857d8.png)

続いて作成したプロジェクトを選択し、フローを作成して行きます。

![プロジェクト選択](https://qiita-image-store.s3.amazonaws.com/0/281420/c2db0ce7-02cd-5ac6-130d-f6af2d587c8d.png)

enebular のプロジェクトの右下の +ボタンをクリックし、新しいフローを作成します。

![フロー作成](https://qiita-image-store.s3.amazonaws.com/0/281420/9ceac863-203f-d00e-6372-7a2cd64eb330.png)

フローに任意の名前を設定して、[Continue]を選択します。

![フロー設定](https://qiita-image-store.s3.amazonaws.com/0/281420/008bd1e9-71f4-a940-f919-5827cea93c22.png)

[Edit Flow]を選択して、フローを作成を開始します。

![フロー編集](https://qiita-image-store.s3.amazonaws.com/0/281420/0193a75f-08b8-3c98-69fa-d3a71e1ebda3.png)

##### Flow 作成

enebular の Flow から NODE-RED を使用してフローを作成します。
設定は各ノードをダブルクリックすることで編集できます。

- [input] - [http]ノードを配置して以下内容を設定
  - Method: POST
  - URL: /test
  - Name: SORACOM Beam
- [function] - [function]ノードを配置

  - "time_and_tmpr_c"の名前をつけて、Function に以下内容を記載

<!-- prettier-ignore-start -->

  ```javascript
var timestamp = Date.now();
var tmpr_c = msg.payload["tmpr_c"];

var data = {
  timestamp: timestamp,
  value: {
    id: "1",
    tmpr_c: tmpr_c,
    created: timestamp
  }
};

msg.payload = data;
return msg;
  ```

<!-- prettier-ignore-end -->

- [firebase] - [firebase modify]を配置して以下内容を設定
  - Firebase:
    - Firebase: https://`<ウェブアプリに FireBase を追加で控えた projectId>`/firebaseio.com/
    - Auth Type: None
  - Child Path: test
  - Method: push
  - Value: msg.payload
  - Name: push_tmpr_c
- [Output] - [debug]
- [Input] - [inject] ... デバッグ用途で使用します
  - Payload 左側で`JSON({}のアイコン)`を選択(図を参照)
  - Payload: `{"date": "2018-08-21T21:58:09.182071+09:00","data": "0000001b","tmpr_c": 27,"binaryParserEnabled": true}`
  - 他(Topic/Repeat/inject once at start?/Name)はそのまま変更しない
    <img src="https://qiita-image-store.s3.amazonaws.com/0/281420/7ea80702-dda6-9d9c-4c96-0d8303474b8c.png" alt="Inject設定" width="70%"/>

最後に、以下の全体の接続にしたがって、ノード間を接続します。

###### 全体の接続

<img width="647" alt="フロー全体図" src="https://qiita-image-store.s3.amazonaws.com/0/281420/1c1fc341-f21c-bfde-e633-954b34ad9359.png">

##### DataSource 作成

ダッシュボードのプロジェクトまで戻ります。
左側の[Data Sources]を選択し、 右下の+ボタンをクリックし、新しいデータソースを作成します。

![データソースへ遷移](https://qiita-image-store.s3.amazonaws.com/0/281420/d3e9cb53-c335-b9d8-f8e0-00b736313f08.png)

名前には任意の名前をつけます(ここでは"firebase-ds"としています)  
"ウェブアプリに FireBase を追加"で控えた内容を入力して行きます。  
"Ref"には Firebase で作成したコレクション名を入れます(ここでは"/test"で、/(スラッシュ)が必要なので注意)  
入力が完了したら、[Update]ボタンを選択します。

![Firebase設定](https://qiita-image-store.s3.amazonaws.com/0/281420/fca4ff53-c2e6-441b-5cb2-3e231fcb18d8.png)

##### InfoType 作成

###### 事前準備

- InfoMotion Tool を使うために、事前に以下の準備/ツールを導入してください
  - Node.js

###### 導入(Windows 向け)

###### Node 導入

[Node.js](https://nodejs.org/en/download/)のページから、インストーラーをダウンロードしてインストールしてください。
バージョンは、LTS(Version: 8)を導入します。

###### 導入(macOS 向け)

###### Homebrew 導入

ターミナルを立ち上げ、以下の内容を貼り付け、Homebrew を導入します。

```bash
/usr/bin/ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"
```

####### Node 導入

ターミナルから　 nodebrew を利用して Node.js(Version 8) を導入します。
すでに、Homebrew で node をインストールしている場合は、削除してください。

アンインストール:

```bash
brew uninstall --force node
```

インストール:

```bash
brew install nodebrew
echo 'export PATH=$HOME/.nodebrew/current/bin:$PATH' >> ~/.bash_profile
echo 'export NODEBREW_ROOT=/usr/local/var/nodebrew' >> ~/.bash_profile
source ~/.bash_profile
nodebrew install-binary v8
```

###### Windows/macOS 共通

###### InfoMotion Tool 導入

端末を起動させ、以下コマンドで InfoMotion Tool を導入します。

```
npm install @uhuru/enebular-infomotion-tool-v2 -g
```

###### InfoType のファイルを作成

次にグラフで可視化するための InfoType でグラフの種類の設定をします。
折れ線グラフのテンプレートを作成後、InfoType の依存するパッケージを導入します。

```console
eit create tmpr_c_chart -t linechart
cd tmpr_c_chart
npm install
cd ../
```

上記コマンドを実行すると、`tmpr_c_chart`フォルダが生成され、配下には以下ファイルが生成されます。

- datasource.json
- package.json
- plugin.css
- plugin.js
- plugin.json
- README.md

次に、tmpr_c_chart フォルダは以下の`plugin.json`と`plugin.js`を編集していきます。

`plugin.json`の defaultSettings を以下のように書き換える。

```json:plugin.json
{
  "defaultSettings": {
    "label" : "id",
    "value": "tmpr_c",
    "limit": "20"
  },
...(省略)...
```

`plugin.js`の LineChart.defaultSettings を以下のように書き換える

```javascript:plugin.js
LineChart.defaultSettings = {
    "label" : "id",
    "value": "tmpr_c",
    "limit": "20"
};
...(省略)...
```

編集が終わったら、端末からパッケージのコマンドを実行する

```console
eit package tmpr_c_chart
```

上記のコマンドを実行すると、`<作業フォルダ>/tmpr_c_chart/build/target`に以下の アップロードするために最適化された 4 ファイルが生成されます。

- datasource.json
- plugin.css
- plugin.js
- plugin.json

上記の`plugin.*`の 3 ファイルを enebular の infotype にアップロードします。

![InfoTypeのメニュー](https://qiita-image-store.s3.amazonaws.com/0/281420/480edf68-87ba-76d7-b728-412a7f16ab91.png)

以下画面で、plugin.js, plugin.css, plugin.json の 3 ファイルをドラッグ・アンド・ドロップし、[upload]ボタンを選択します。

![pluginのアップロード](https://qiita-image-store.s3.amazonaws.com/0/281420/ddc123b6-9712-375d-7a08-946764224784.png)

アップロードが完了したら、プレビューで以下内容を記載し、[Preview]ボタンを選択します。
実行結果として、線が表示されることを確認してください。

```
[{
  "id": "1",
  "tmpr_c": "20",
  "created": 1533703436128
}, {
  "id": "1",
  "tmpr_c": "30",
  "created": 1533703437128
}]
```

実行結果

![infotypeプレビュー結果](https://qiita-image-store.s3.amazonaws.com/0/281420/9e4d4fe3-9e6d-a451-06aa-e501e9e4b941.png)

> infotype 作成の参考ページ: [https://docs.enebular.com/ja/infomotion/InfoMotionTool.html](https://docs.enebular.com/ja/infomotion/InfoMotionTool.html)

##### InfoMotion 作成

ダッシュボードのプロジェクトまで戻ります。
左側の[InfoMotions]を選択し、 右下の+ボタンをクリックし、新しい InfoMotion を作成します。

![InfoMotion メニュー](https://qiita-image-store.s3.amazonaws.com/0/281420/3d079f94-244f-feb6-c82a-99d3822ae19e.png)

以下の画面では、タイトルと概要(概要はなくても良い)を記載し、他は変更せず[continue]を選択します。

![InfoMotion概要設定](https://qiita-image-store.s3.amazonaws.com/0/281420/1f0a1ed7-15bc-53d1-33d9-da454f41e512.png)

InfoMotion の編集画面へ遷移したら、([+)Add Graph]を選択後、[New Graph]を選択します。

![グラフ追加](https://qiita-image-store.s3.amazonaws.com/0/281420/f77b6618-76f4-56e9-3193-2ca07165e7b9.png)
![新規グラフ作成](https://qiita-image-store.s3.amazonaws.com/0/281420/bc982216-aa31-7398-8bf7-b15b3cd6bcfa.png)

項目には以下を設定してください。

| 項目名     | 設定値                                                                |
| ---------- | --------------------------------------------------------------------- |
| NAME       | 任意のグラフの名前(ここでは温度表示)                                  |
| TYPE       | Info Type で作成した名前(ここでは linechart)                          |
| DATASOURCE | Data Source で作成した Firebase の Data Source(ここでは、firebase-ds) |
| Label      | plugin.js で設定したラベル名(ここでは id)                             |
| Value      | plugin.js で設定した値名(ここでは tmpr_c)                             |
| Limit      | 一度に同時表示するサンプル数(ここでは 20 個のデータ)                  |

![グラフ設定](https://qiita-image-store.s3.amazonaws.com/0/281420/8ebf8047-6632-51a0-6617-54f189c31257.png)

上記までの設定が完了したら[Create Graph]を選択、
作成が完了したら追加された、グラフ名の左側(+)ボタンを選択します。

![グラフをOverviewに追加](https://qiita-image-store.s3.amazonaws.com/0/281420/ee4e90ba-12b2-b484-5f0b-8a28950a4fbf.png)

データが Firebase に格納されていない状態では何も表示されませんが、温度データが格納されると以下の表に表示されます。

![温度表示](https://qiita-image-store.s3.amazonaws.com/0/281420/975a647f-acf2-7e76-00dd-84a08d50c789.png)

最後に下側のスライダーや右上の日付の範囲を選択して、表示したい範囲を設定できます。
設定した内容を保存するためには、(+)Add Graphe ボタンの右側にある[Save]ボタンを選択すると、上記までの設定が保存されます。

### ネットワーク

#### SORACOM の設定

##### SORACOM Beam

上記までの設定が完了したら、デバイスからの送信されたデータが enebular まで転送されるよう、SORACOM Beam の設定を行います。
ここでは、デバイス から 通信を使ってデータを送る方法を説明します。

まず、enebular の Flow 編集画面から、URL を控えておいてください。

![enebularホスト](https://qiita-image-store.s3.amazonaws.com/0/281420/f149d736-fa08-1fa2-ce45-948e5be1825b.png)

ソラコムのコンソールへログインします。
[menu] - [LoRa グループ]を選択して、設定をしたいグループを選択します。

![menu選択](https://qiita-image-store.s3.amazonaws.com/0/281420/bab77764-df80-a07e-f9be-b8a46827575d.png)
<img width="1000" alt="LoRaグループ設定選択" src="https://qiita-image-store.s3.amazonaws.com/0/281420/04ef490b-1e40-8251-9ef4-781e8eb119d4.png">

グループの[基本設定] - [SORACOM Beam 設定]のアコーディオンを開き、左下の[+]を選択、
[LoRa→HTTP/HTTPS エントリーポイント]を選択します。

<img width="600" alt="Beam LoRa設定開始" src="https://qiita-image-store.s3.amazonaws.com/0/281420/010b96b8-3d9a-737a-49f2-23b3145c643c.png">

以下設定を行い[保存]を選択してください。

| 項目名           | 設定値                               |
| ---------------- | ------------------------------------ |
| 設定名           | 任意の設定名(ここでは test-enebular) |
| プロトコル       | HTTPS                                |
| ホスト名         | 上記 enebular Flow で控えた URL      |
| ポート番号       | 443                                  |
| パス             | /test                                |
| デバイス ID 付与 | OFF                                  |
| 署名ヘッダ付与   | OFF                                  |
| 事前共有鍵       | なし                                 |
| カスタムヘッダ   | なし                                 |

<img width="597" alt="201_soracom_beam_config_list1.png" src="https://qiita-image-store.s3.amazonaws.com/0/281420/d6e5d93f-2558-18ae-fafe-708796d6f79e.png">

<img width="598" alt="201_soracom_beam_config_list2.png" src="https://qiita-image-store.s3.amazonaws.com/0/281420/bf00ceb7-4a0d-066f-fbc0-6fc64001e1fa.png">

##### バイナリパーサー設定

デバイスから送信されたバイナリデータを変換するため、 バイナリパーサの設定を行なって行きます。
SORACOM Beam と同じグループ設定から [SORACOM Air for LoRaWAN 設定]のアコーディオンを開きます。

| 項目                       | 設定値                                               |
| -------------------------- | ---------------------------------------------------- |
| SORACOM LoRa Space         | 利用する (※設定済みのため、設定されていることを確認) |
| LoRa ネットワークセット ID | -------- (※設定済みのため、設定されていることを確認) |
| バイナリパーサーの設定     | ON                                                   |
| フォーマット               | `tmpr_c:2:uint:16`                                   |

<img width="880" alt="203_soracom_binary_parser.png" src="https://qiita-image-store.s3.amazonaws.com/0/281420/0f995995-9d36-98d3-ef3a-fa26108c19b2.png">

以上で、enebular + Firebase を使った温度センサーの値の可視化設定が完了です。

---

## kintone を利用した可視化

enebular と kintone を使った可視化の方法を説明して行きます。
あらかじめ、[enebular のアカウント](https://enebular.com/)と[kintone](https://kintone.cybozu.co.jp/jp/)の両方のアカウントの準備をしておいてください。

### デバイス

[デバイスのプログラム](#デバイスのプログラム)は、上記の enebular の可視化で説明したプログラムと同じため、`handson_tmpr_lorawan.ino`をそのまま利用してください。

### クラウド

クラウドの環境では、kintone でアプリを作成、enebular の NODE-RED で kintone へ転送するデータを作成の順番で説明して行きます。

#### kintone の設定

##### kintone アプリ作成

enebular の NODE-RED から転送されたデータを可視化するためのアプリを作成して行きます。

- Kintone のポータルへログインしたら、アプリの右上の(+)ボタンを選択

<img width="600" alt="300_kintone_ポータル.png" src="https://qiita-image-store.s3.amazonaws.com/0/281420/318ec810-6f3b-58e2-f2e2-d070275b8aea.png">

- はじめから作成を選択
  <img width="600" alt="301_kintone_アプリストア.png" src="https://qiita-image-store.s3.amazonaws.com/0/281420/3486aee5-eec7-99a0-389f-4821eeed08f2.png">

- アプリの設定で、アプリ名を記入し、`日付`、`数値`をそれぞれ右側のフォームへドラッグ・ドロップ
  - 日付のアイテムではフィールドレコードを`date`を設定し[保存]を選択
  - 数値のアイテムでは、フィールド名を`温度[℃]`、フィールドレコードを`tmpr_c`を設定し[保存]を選択

<img width="600" alt="kintone_アプリの設定.png" src="https://qiita-image-store.s3.amazonaws.com/0/281420/853e32e0-39fa-56f0-881b-66a660b14cd3.png">

<img width="600" alt="kintone_アプリの設定_日時.png" src="https://qiita-image-store.s3.amazonaws.com/0/281420/2fa495a3-67a1-5e16-af8e-21258f6eba2f.png">

<img width="600" alt="kintone_アプリの設定_温度.png" src="https://qiita-image-store.s3.amazonaws.com/0/281420/7d3e2566-c906-9efd-010d-53738cb39e24.png">

- 最後に[アプリを公開]を選択します。

<img width="600" alt="kintone_アプリの設定.png" src="https://qiita-image-store.s3.amazonaws.com/0/281420/96d03d95-7fb3-8592-e563-754d803c3238.png">

##### API トークン生成

次に、enebular からデータを格納するための API トークンの生成をします。
作成したアプリの設定画面から、ギアアイコンを選択します。

<img width="600" alt="kintone_温度表示_-_レコードの一覧_setting_token.png" src="https://qiita-image-store.s3.amazonaws.com/0/281420/8c896331-8154-16e6-0245-1e6ef538b8e2.png">

[設定]タブを選択肢、"カスタマイズ/サービス連携"の項目から[API トークン]を選択します。

<img width="600" alt="kintone_アプリの設定_api_token.png" src="https://qiita-image-store.s3.amazonaws.com/0/281420/751bb805-8feb-46f1-bc9e-a437e60f1127.png">

API トークンのページで[生成する]を選択して、[レコード追加]にチェックを入れます。
次に以下の内容を控えてください。
控えたら、最後に[保存]を選択します。

| 内容             |
| ---------------- |
| API トークン     |
| app=\*の右辺の値 |

<img width="600" alt="kintone_APIトークン.png" src="https://qiita-image-store.s3.amazonaws.com/0/281420/2b2f8a34-f612-02f0-9056-e04b3fcd070d.png">

トークンを取得したら、アプリの更新します。
<img width="600" alt="308_kintone_アプリを更新.png" src="https://qiita-image-store.s3.amazonaws.com/0/281420/1bf69722-bfad-744a-e263-a62ebabfd723.png">

##### グラフ作成

続いて、可視化するためのグラフを作成して行きます。
作成したアプリの設定画面から、グラフのアイコンを選択します。

<img width="600" alt="kintone_make_graph.png" src="https://qiita-image-store.s3.amazonaws.com/0/281420/e2aa56fc-f932-e4d4-7e8a-89013d765b21.png">

グラフのレコード一覧から、[折れ線グラフ]を選択します。

<img width="600" alt="310_kintone_温度表示_-_レコードの一覧.png" src="https://qiita-image-store.s3.amazonaws.com/0/281420/e0e0fc2a-3e36-7f16-da19-02fbddd8edfb.png">

集計の設定で、分類する項目を[日時]、集計する間隔を[分単位]にします。
集計方法は、[平均]、集計対象は[温度[℃]]にします。
設定が終わったら、[保存する]を選択します。

<img width="600" alt="kintone_温度表示_-_集計設定.png" src="https://qiita-image-store.s3.amazonaws.com/0/281420/c975e874-2034-010e-4efd-ec00aad69691.png">

表示された画面では、任意の名前を設定します(ここでは、温度グラフ)

<img width="332" alt="kintone_温度表示_-_グラフ.png" src="https://qiita-image-store.s3.amazonaws.com/0/281420/04869f4b-b31c-5ac5-483b-bf15a8d53b78.png">

以上で設定完了です。
現状ではデータが無いため表示されませんが、
データが enebular から転送されてくると以下のようなグラフが表示されるようになりました。

<img width="600" alt="313_kintone_温度表示_-_グラフ.png" src="https://qiita-image-store.s3.amazonaws.com/0/281420/3717336e-9250-a12d-c8c1-0b3b2c10d19a.png">

#### enebular の設定

##### Flow 作成

enebular の Flow から NODE-RED を使用して kintone へデータを転送するフローを作成します。
設定は各ノードをダブルクリックすることで編集できます。
なお、先に説明した Flow と別のフローを作成する場合事前に[enebular-プロジェクト作成](#enebular-プロジェクト作成)を参考にプロジェクトを作成してください。

- [input] - [http]ノードを配置して以下内容を設定
  - Method: POST
  - URL: /test
  - Name: SORACOM Beam
- [function] - [function]ノードを 2 つ配置

  - 1 つ目: `datetime`の名前をつけて、Function に以下内容を記載

        <!-- prettier-ignore-start -->

        ```javascript:datetime
        function pad(number) {
          if (number < 10) {
            return "0" + number;
          }
          return number;
        }

        function getISOString(){
        var date = new Date();
        return date.getFullYear() +
            '-' + pad(date.getUTCMonth() + 1) +
            '-' + pad(date.getUTCDate()) +
            'T' + pad(date.getUTCHours()) +
            ':' + pad(date.getUTCMinutes()) +
            ':' + pad(date.getUTCSeconds()) +
            '.' + (date.getUTCMilliseconds() / 1000).toFixed(3).slice(2, 5) +
            'Z';
        }

        msg.datetime = getISOString();
        return msg;
        ```

        - 2つ目: `time_and_tmpr_c`の名前をつけて、Function に以下内容を記載

        ```javascript:time_and_tmpr_c
        var timestamp = msg.datetime;
        var tmpr_c = msg.payload["tmpr_c"];

        var data = {
          app: "<kintoneのAPIトークンで控えた'app'の値>",
          record: {
            "date": {"value": timestamp },
            "tmpr_c": { "value": tmpr_c }
          }
        };

        msg.payload = data;
        return msg;
        ```

    <!-- prettier-ignore-end -->

- [function] - [template]を配置し、以下を設定

| 項目         | 設定値                                                   |
| ------------ | -------------------------------------------------------- |
| Name         | 任意の設定名(ここでは、kintone Token)                    |
| Set Property | msg.headers.X-Cybozu-API-Token                           |
| template     | &lt;kintone の API トークンで控えた API トークンの値&gt; |
| Format       | mustache template                                        |

- [function] - [http request]を配置し、以下を設定

| 項目   | 設定値                                                           |
| ------ | ---------------------------------------------------------------- |
| Method | POST                                                             |
| URL    | https://<アカウントのサブドメイン名>.cybozu.com/k/v1/record.json |
| Return | a parsed JSON object                                             |
| Name   | 任意の設定名(ここでは、Post kintone)                             |

- [Output] - [debug]
- [Input] - [inject] ... デバッグ用途で使用します
  - Payload 左側で JSON({}のアイコン)を選択
  - Payload: `{"date": "2018-08-21T21:58:09.182071+09:00","data": "0000001b","tmpr_c": 27,"binaryParserEnabled": true}`
  - 他(Topic/Repeat/inject once at start?/Name)はそのまま変更しない

##### 全体の接続

<img width="803" alt="フロー全体(kintone用)" src="https://qiita-image-store.s3.amazonaws.com/0/281420/84187406-b98a-ea50-c526-f56d9546390e.png">

以上で、enebular の設定が完了です。

### ネットワーク

ネットワークは[SORACOM の設定](#soracom-の設定)と同じため、そちらの手順を参考にしてください。

以上で、enebular + kintone を使った温度センサーの値の可視化設定が完了です。

---

## enebular リファレンス

[https://docs.enebular.com/ja/](https://docs.enebular.com/ja/)

## スターターキット付属センサーの使い方

| センサー/アクチュエータ | リンク                                                     |
| ----------------------- | ---------------------------------------------------------- |
| ブザー                  | http://wiki.seeedstudio.com/Grove-Buzzer/                  |
| タッチセンサー          | http://wiki.seeedstudio.com/Grove-Touch_Sensor/            |
| 音圧センサー            | http://wiki.seeedstudio.com/Grove-Sound_Sensor/            |
| ライトセンサー          | http://wiki.seeedstudio.com/Grove-Light_Sensor/            |
| ボタン                  | http://wiki.seeedstudio.com/Grove-Button/                  |
| 回転角センサー          | http://wiki.seeedstudio.com/Grove-Rotary_Angle_Sensor/     |
| 温度センサー            | http://wiki.seeedstudio.com/Grove-Temperature_Sensor_V1.2/ |
| LED ソケット            | http://wiki.seeedstudio.com/Grove-LED_Socket_Kit/          |
| リレー                  | http://wiki.seeedstudio.com/Grove-Relay/                   |
| LCD RGB Backlight(※)   | http://wiki.seeedstudio.com/Grove-LCD_RGB_Backlight/       |

※ LCDは、5V駆動のため、VCCのスイッチ(A0端子の横にあります)を5Vにして使用してください。

また、[スターターキット](https://github.com/Seeed-Studio/Sketchbook_Starter_Kit_for_Arduino)のページから
センサーごとのスケッチ(コード)をダウンロードすることもできます。

## 追加センサーの使い方

| センサー/アクチュエータ | リンク                                                        |
| ----------------------- | ------------------------------------------------------------- |
| マルチガスセンサー      | http://wiki.seeedstudio.com/Grove-Multichannel_Gas_Sensor/    |
| 火災センサー            | http://wiki.seeedstudio.com/Grove-Flame_Sensor/               |
| 気圧センサー            | http://wiki.seeedstudio.com/Grove-Barometer_Sensor-BMP280/    |
| 水センサー              | http://wiki.seeedstudio.com/Grove-Water_Sensor/               |
| 水分センサー            | http://wiki.seeedstudio.com/Grove-Moisture_Sensor/            |
| 衝突センサー            | http://wiki.seeedstudio.com/Grove-Collision_Sensor/           |
| 傾きセンサー            | http://wiki.seeedstudio.com/Grove-Tilt_Switch/                |
| ラインセンサー          | http://wiki.seeedstudio.com/Grove-Line_Finder/                |
| 心拍センサー            | http://wiki.seeedstudio.com/Grove-Ear-clip_Heart_Rate_Sensor/ |
| PIRモーションセンサー   | http://wiki.seeedstudio.com/Grove-PIR_Motion_Sensor/          |
| RGB LED                 | http://wiki.seeedstudio.com/Grove-Chainable_RGB_LED/          |
| 磁気スイッチ            | http://wiki.seeedstudio.com/Grove-Magnetic_Switch/            |
| 超音波センサー          | http://wiki.seeedstudio.com/Grove-Ultrasonic_Ranger/          |
| GPS                     | http://wiki.seeedstudio.com/Grove-GPS/                        |