生産現場IoTへの挑戦 #07　～ センシング → DBへ保存 → リアルタイム可視化 ～

# １．はじめに
生産現場IoTへの挑戦シリーズも第七回目で最初の山場です。
RPiにセンサーをぶら下げて様々なデータを取ると、設備が正しく動いていることを監視したり、万が一不良品が発生したときにどのような異常が発生していたかをデータをもって確認する事ができるようになります。
しかしながら、データが多くなりすぎると解析するのも大変ですので、なるべく自動的に可視化しておきたいところです。
「BIツール」で検索すると、ビッグデータを自動的に解析するツールが多くみつかりますが、今回はGrafanaというオープンソースツールでリアルタイムでグラフ化します。

いろいろ調査をしたのですが、クラウドを使わず無料で利用できるツールのなかではこれがピカイチではないかと思います。クラウド利用も良いのですが、費用面が不安、通信環境が不十分、会社の許可が得られにくいなど、さまざまな障壁もあります。イントラネット内だけで完結する簡単なシステムが必要な場合には今回のRPi+MariaDB+Grafanaは最強じゃないかと思います。

# ２．構成
###センサー
ここでは、BMP280で気温、気圧、湿度を測定します。
今回はBMP280のデータのみを扱うため、次の通り接続できていればOKです。
類似センサーのBME280も同様に使用できますが、気圧データは測定できません。

| ラズパイ | BMP280 |
|:-:|:-:|
|3V3(Pin1)|VIN|
|GND(Pin9)|GND|
|GPIO2(Pin3)|SDA|
|GPIO3(Pin5)|SCL|

###データベース
データベースは、[生産現場IoTへの挑戦 #05](https://qiita.com/airpocket/items/5e73444459b7ad5b0666)でセットアップしたMariaDBを使用し、センサーデータを格納します。今回の作業を行う前に、#05の通りにデータベースを作成しておいてください。
可視化ツール：いろいろ試した中で、一番使いやすかった（私にも理解できた）Grafanaというツールを使用します。

# ３．センサデータをDBに格納する
生産現場IoTへの挑戦 #06では、データ収集までは行いましたが、DBへの格納はしていませんでいた。
前回のコードにDBへ記録するコマンドを追加したコードを作成します。

# ３－１．pythonでデータベースを扱うライブラリをインストールする

```sh
sudo pip3 install PyMySQL
```
念のため、データベースの項目は次の通りです。

データベース名：IoT_TEST
テーブル名　　：BMP280
カラム名　　　：ID,time,temperrature,pressure,humidity

データの測定、DBへの記録を実施するコードは次の通りです。

```python
import pymysql.cursors    #pythonでmysqlを使用するライブラリ
import datetime
import time

import board
from adafruit_bme280 import basic as adafruit_bme280

i2c = board.I2C()
bme280 = adafruit_bme280.Adafruit_BME280_I2C(i2c,address = 0x76)

#出力先データベースの定義
connection  = pymysql.connect(
    user    = "root",          #ユーザー名はDB作成時に使用したものを入力
    passwd  = "パスワード",     #パスワードはDB作成時に使用したものを入力
    host    = "127.0.0.1",     #実行しているraspi自体を指定している。
    db      = "IoT_TEST",      #書き込み先のDB名
    charset = "utf8mb4",       #使用する文字コード
    )

while True:
    recordTime = datetime.datetime.now()
    temp  = bme280.temperature
    hum   = bme280.relative_humidity
    press = bme280.pressure
    
    print(recordTime,"===================")
    print("Temperature :","{:>8.1f}".format(temp),"(C*)")
    print("Humidity    :","{:>8.1f}".format(hum),"(%)")
    print("pressure    :","{:>8.1f}".format(press),"(hPa)\n")
    
    try:
        cur = connection.cursor()
        cur.execute("INSERT INTO BME280 (time,temperature,pressure,humidity) VALUES(%s,%s,%s,%s)",(recordTime,temp,press,hum))
        connection.commit()
    
    except:
        print("DB write failure.")

    time.sleep(5)
```

# ４．MariaDBのデータをGrafanaで可視化する
Grafanaはさまざまなデータベースを利用する機能があり、MariaDBも利用可能です。
接続先の対象としてMariaDBという選択肢はありませんが、MySQLの互換DBなので、MySQLとして利用できます。

##４－１．Grafanaをインストールする。
GrafanaをRPiへインストールする方法は[公式サイトで説明されています](https://grafana.com/tutorials/install-grafana-on-raspberry-pi/)のでこの通りに進めていきます。

①パッケージの認証に使用されるAPTキーを追加する。

```sh
wget -q -O - https://packages.grafana.com/gpg.key | sudo apt-key add -
```

②GrafanaAPTリポジトリを追加する。

```sh
echo "deb https://packages.grafana.com/oss/deb stable main" | sudo tee -a /etc/apt/sources.list.d/grafana.list
```

③Grafanaをインストールする。

```sh
sudo apt-get update
sudo apt-get install -y grafana
```

④Grafanaサーバーを有効にする。

```sh
sudo /bin/systemctl enable grafana-server
```

⑤Grafanaサーバーを起動する。

```sh
sudo /bin/systemctl start grafana-server
```

以上でRPi上でGrafanaが動き始めました。

# ４－２．Grafanaにログインする
Grafanaへは、webブラウザからアクセスします。インストールしたRPiのほか、同じLANに接続しているほかのPCからも接続可能です。
ブラウザのアドレスバーにRPiのアドレスとGrafanaのポート番号である「3000」を入力します。
私の環境の場合、アドレスが「192.168.1.65」ですので、「192.168.1.65:3000」と入力します。

![login.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/496179/d50479f2-2915-b9ce-4511-1f3127bfeefb.png)
前項のインストールが成功していれば、この様なログイン画面が表示されます。
初期設定では、username＝「admin」、password＝「admin」 でログインできます。

## ４－３．GrafanaでMariaDBにアクセスする
まずは、GrafanaでMariaDBにアクセスするための設定を行います。
画面左のメニューバーから、歯車マークの「Configulation」→「Data sources」を選択します。
![linkDB.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/496179/c806a1da-4f28-bf9e-602c-ff1558791080.png)

続いて、「Add data source」
![add data sources.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/496179/687534f7-7649-47b5-c084-7384fbc37917.png)


下の方へスクロールして、MySQLを「select」

![select mysql.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/496179/b4493ea0-78d5-5f78-1b42-6df3db4a59cc.png)


データベースへの接続情報の入力画面が出るため、次の項目を埋めて「Save & test」
Host ：　localhost:3306
Database ：　IoT_TEST
User　：　root（データベース設定時のユーザー名）
Password　：　データベース設定時のパスワード

![DBlogin.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/496179/0063f448-9139-5c45-7a54-296889da2325.png)

以上でGrafanaでMariaDBにアクセスできる様になりました。

## ４－４．Grafanaでグラフを表示する
いよいよ大詰めです。
ここでは、BME280で測定したデータをトレンドグラフを描画し、リアルタイムで更新するダッシュボードを作成します。

### ４－４－１．新しいダッシュボードの作成
Grafanaにログインすると、次のような初期のダッシュボードが表示されますので、グラフ表示を行うダッシュボードを作成してみます。

![makedashboard.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/496179/b603ee05-df90-afb9-9c26-d1e152f0b165.png)

画面の左にあるメニューバーのプラスマークのアイコン「Create」から、「Dashboard」を選択すると新しいダッシュボードを作成する画面に移ります。

### ４－４－２．グラフ（panel）を追加する
新しいダッシュボードにはまだ何も配置されていないため、panelを作成してグラフを表示させます。
![makenewpanel.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/496179/a6ad4fc3-850a-206e-6a68-2cc4adef3285.png)

「Add panel」の「Add an empty panel」を選択すると、グラフ入力画面が開き、グラフの種類やパラメータが設定できます。
詳細な使い方はGrafanaのサイトに譲るとして、今回作成したDBをさくっとグラフ化してみます。
まず、画面下部にデータベースからデータを読み込む際の設定を行う画面があります。この画面の鉛筆アイコン「Toggle text edit mode」をクリックします。
![edit graph.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/496179/3ef9ce60-4fdb-e183-7045-650c1670c407.png)

すると、データベースからデータを読み込むためのSQLコマンドを編集する画面になりますので、
次のコマンドに書き換えてください。

```sql
SELECT
  CONVERT_TZ(time, '+00:00', '-09:00') AS "time",
  temperature
FROM BME280
WHERE
  $__timeFilter(time)
ORDER BY time
```

合せて右上の「Panel options」の「Title」に「温度推移」と入力し、画面上中央部の時計印のセルを「Last 5 minutes」に変更して右上の「Apply」をクリックします。

![input sql.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/496179/1639287c-7730-8f52-79d6-6ed6771bb691.png)

ダッシュボード画面に戻り、温度のトレンドグラフが表示されたはずです。

さらに画面右上の丸い矢印アイコンの「Refresh dashboard」を一度クリックすると、アイコンの右にドロップダウンメニューが表示されるため、「5s」を選択すると、グラフが5秒おきに更新されます。先ほど作ったBME280を5秒ごとに測定、DBへ記録するプログラムを実行していれば、5秒おきに新しい測定データが更新されるはずです。


![dashboard.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/496179/9d415dc6-638d-9557-66d7-374abe80f48e.png)


最後に、新しく作ったダッシュボードは画面上のフロッピーディスク（！）型の「Save dashboard」アイコンから保存しておきましょう。

５．まとめ
今回は、RPiで作るオンプレミス型のIoTデータサーバづくりのハイライトでした。私自身データベース化までは想定通り進められたものの、可視化する際になかなか思い通りのツールが見つからず苦労しました。ようやく見つけたGrafanaはオープンソースとは思えない完成度のツールで、とても助かりました。

最後にグラフを作成する段で、少しずるをしてSQLコマンド直接入力する方法を提示しています。
タイムゾーンの設定がうまくいかず、いろいろ試行錯誤して編み出した方法ですが、もっとスマートに解決する方法があるはずだと思います。Grafana自体は、SQLを書かなくてもGUIだけでグラフ表示を設定できる機能を備えていますので、もっとうまいやり方を知っている方は是非コメント欄で教えてください。