RaspberryPiでセンサーデータの可視化(1) InfluxDBとGrafanaを使う。

# やったこと
・センサーデータ等の時系列データをGrafanaで可視化してダッシュボードにする。

最終的な画面のイメージ
<img src=https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/483299/34e1184a-f726-d789-7c50-c24b5cdf9d9c.jpeg width=640>

# システムの構成
今回RaspberryPiだけで完結させたいので、下記をすべてRaspberryPi上で構成。
* センサー値：ランダムに値を生成(ハードウエアの準備を省略するため)
* influx + Grafana

# ハードウエア
* RaspbrryPi 3
　※以下、ラズパイで実行する。

# InfluxDB準備
* インストール　Influxdbのリポジトリを登録します。

```php:インストールと設定
# ソースの設定
wget -qO- https://repos.influxdata.com/influxdb.key | sudo apt-key add -
source /etc/os-release
echo "deb https://repos.influxdata.com/debian $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/influxdb.list

# インストール
sudo apt update
sudo apt install influxdb

# サービスの起動設定
sudo systemctl unmask influxdb.service
sudo systemctl start influxdb
sudo systemctl enable influxdb.service
```

ターミナルでinfluxコマンドを入力するとでInfluxDBの操作ができます。

## InfluxDB初期設定
今回の為に下記の様なデータベースを作成します。
※必要に応じて変更してください。
`・データベース名：sensor_test`
`・ユーザー：test01_user`
`・パスワード：test01_pass`

```python:influxDBのシェルを起動
influx
```

続けて、">"（大なり記号）にの後に"create"コマンド等を入力します。

```
> create database sensor_test
> use sensor_test
Using database test01
> create user test01_user with password 'test01_pass' with all privileges
> grant all privileges on sensor_test to test01_user
> show users
 #userとadminの確認
> exit
 #influxコマンドを終了。

```

# センサーデータ生成と登録
　今回は値をランダムに生成してInfluxDBに登録する。
### ライブラリインストール
* InfluxDBへの書き込み：InfluxDB-Pythonライブラリを使う。
* Pythonで周期的に何かを実行する：scheduleライブラリを使う。
* 乱数の生成：randomモジュール(python標準ライブラリ)

```python:ライブラリーのインストール
pip install influxdb
pip install schedule
```

```python:データ生成＆登録コード
import influxdb
import schedule
import datetime
import sys, time
import random

# dbへのアクセス
influx = influxdb.InfluxDBClient(
    host='localhost',
    port=8086,
    database='sensor_test',
    username='test01_user',
    password='test01_pass'
)

device_id='sensor01'

def get_data():
    #センサー値をランダムに生成
    humidity=random.uniform(40, 100)
    temperature=random.uniform(20, 42)
    battery=random.uniform(0, 100)
    data = {}
    data['temperature'] = temperature
    data['humidity'] = humidity
    data['battery'] = battery
    return data

def write_to_influxdb(data):
    json_body = [{
        'measurement': 'sensor',
        'tags': {'macaddr': device_id},
        'time': datetime.datetime.utcnow(),
        'fields': data
    }]
    influx.write_points(json_body)

def on_minute():
    print('on_minute')
    try:
        data = get_data()
        print(data)
        write_to_influxdb(data)
    except KeyboardInterrupt:
        print("intrrupted Ctrl-C")
        sys.exit(1)

def main():
    try:
        schedule.every(10).seconds.do(on_minute)
        while True:
            schedule.run_pending()
            time.sleep(1)
    except KeyboardInterrupt:
        print("intrrupted Ctrl-C")
        time.sleep(1)
        print("Process end")
        time.sleep(1)
if __name__=='__main__':
    main()

```

## データ内容の確認

```
$ influx
Connected to http://localhost:8086
> USE sensor_test
Using database sensor_test
> SELECT * FROM sensor
```

<img src=https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/483299/96b64b82-f281-5f76-b8b1-b9b122a6f048.jpeg width=640>


# Grafanaで可視化
前手順でinfluxDBに一定時間データを蓄積したらGrafanaで可視化してみる。
詳細な手順は [このリンク](https://www.mikan-tech.net/entry/raspi-sensortag-grafana)が大変わかりやすいため、それにならって実施。

## Grafanaのインストール

```python:Grafanaのインストール
# ソースの設定
wget -q -O - https://packages.grafana.com/gpg.key | sudo apt-key add -
echo "deb https://packages.grafana.com/oss/deb stable main" | sudo tee /etc/apt/sources.list.d/grafana.list

# インストール
sudo apt update
sudo apt install grafana

# サービスの起動設定
sudo systemctl unmask grafana-server.service
sudo systemctl start grafana-server
sudo systemctl enable grafana-server.service
```

# 可視化
ブラウザーを立ち上げ、`http://raspberrypi.local:3000/` に接続。
初期IDはadmin
※`「無効なホスト」と表示される`等でアクセスできない場合はraspiのIPアドレスでアクセスする。[参考](https://users.soracom.io/ja-jp/guides/starter-kits/camera/setup-raspberry-pi/#%E3%83%88%E3%83%A9%E3%83%96%E3%83%AB%E3%82%B7%E3%83%A5%E3%83%BC%E3%83%88-1)
　Ex:`192.***.***.***:3000`

<img src=https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/483299/3377c356-6dce-5b82-7bba-741159fe479a.png width=520>

HTTP URL : `http://localhost:8086`
 <img src=https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/483299/febdcd46-7d12-4232-eacd-d05db036131a.png width=520>

# ダッシュボードの作成
<img src=https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/483299/08abcd59-d378-ec20-e18a-c56cab6534bb.png width=520> <img src=https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/483299/bb5e982a-9fc4-07f0-8345-1b9ee780eeb4.png width=520>

## クエリの例
 選択肢が出てくるのでほとんど迷わない。
<img src=https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/483299/8db0e941-86d6-607a-aa1f-86cd5e750484.png width=520>
 右側の選択項目でグラフの縦横軸の設定を行う。
<img src=https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/483299/dba2877f-ce65-25c4-62ea-2e50f015d666.jpeg width=520>
　
データ種類毎にパネルを作っていくと完成。
<img src=https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/483299/34e1184a-f726-d789-7c50-c24b5cdf9d9c.jpeg width=640>

以上

## 参考 引用元
* [Raspberry Piでセンサー情報グラフ化～その１ InfluxDBとGrafanaをインストール](https://www.mikan-tech.net/entry/influxdb-grafana-install)
* [Raspberry Piでセンサー情報グラフ化～その2 センサー情報をInfluxDBに投入！](https://www.mikan-tech.net/entry/raspi-sensortag-influxdb)
* [Raspberry Piでセンサー情報グラフ化～その3 Grafanaでグラフ化](https://www.mikan-tech.net/entry/raspi-sensortag-grafana)
* [時系列データベースとは](https://www.mikan-tech.net/entry/what-is-influxdb)
* [RaspberryPiでダッシュボードを作る（Grafana InfluxDB）備忘録](https://spotlight.soy/detail?article_id=2vhilhyp0)
* [[ラズパイ&Docker]GrafanaとInfluxDBでセンサデータをモニタリング](https://zenn.dev/mamamajohn/articles/82ef23bfeaaa02)
* [Scheduleモジュールを用いたイベント定期実行｜指定時間動作](https://di-acc2.com/programming/python/4574/)
* [InfluxDB入門 - 闘うITエンジニアの覚え書き](https://www.magata.net/memo/index.php?InfluxDB%C6%FE%CC%E7)
* [influxdbを触ってみた](https://www.intage-ts.com/entry/2020/06/09/180000)
* [Pythonで収集したデータをInfluxDBに格納してGrafanaで可視化する](https://qiita.com/Yokogawa_Ishino/items/c3467efb83e7fa342734)
* [【Grafana】基礎から応用まで、これで網羅！](https://qiita.com/MetricFire/items/f7ac1c9edf33eac48772)
* [InfluxDBについて最初に知るべき10のこと](https://qiita.com/nmrmsys/items/cdeb4afa76c591acfd3f)
* DBの構造
<img src=https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/483299/f729b06e-d2dd-ab9a-f5d5-e2e1f014408e.png width=520>