LoginSignup
7
5

More than 1 year has passed since last update.

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

Last updated at Posted at 2022-05-26

やったこと

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

最終的な画面のイメージ

システムの構成

今回RaspberryPiだけで完結させたいので、下記をすべてRaspberryPi上で構成。

  • センサー値:ランダムに値を生成(ハードウエアの準備を省略するため)
  • influx + Grafana

ハードウエア

  • RaspbrryPi 3
     ※以下、ラズパイで実行する。

InfluxDB準備

  • インストール Influxdbのリポジトリを登録します。
インストールと設定
# ソースの設定
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

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標準ライブラリ)
ライブラリーのインストール
pip install influxdb
pip install schedule
データ生成&登録コード
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

Grafanaで可視化

前手順でinfluxDBに一定時間データを蓄積したらGrafanaで可視化してみる。
詳細な手順は このリンクが大変わかりやすいため、それにならって実施。

Grafanaのインストール

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アドレスでアクセスする。参考
 Ex:192.***.***.***:3000

HTTP URL : http://localhost:8086

ダッシュボードの作成

クエリの例

選択肢が出てくるのでほとんど迷わない。

右側の選択項目でグラフの縦横軸の設定を行う。

 
データ種類毎にパネルを作っていくと完成。

以上

参考 引用元

7
5
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
7
5