RaspberryPiでダッシュボードを作る(Grafana InfluxDB)備忘録
ダッシュボードは、データをグラフに表示して見やすくまとめたサイトやアプリです(下の画像は昔のdatamish.comです)。
今回はRaspberry Pi(ラズパイ)でダッシュボードを作りたくなったので、方法を調べました。家庭内のネットワーク用にセットアップしているので、セキュリティ対策は最低限なのでご注意ください。
- InfluxDB(データベース)のインストール
- データをInfluxDBに取り込む
- Grafana(ダッシュボード)のインストール
- Grafanaでグラフを表示する
今回の環境など
- Raspberry Pi 3 Model B
- Raspberry Pi OS Lite (Released: 2021-05-07)
- InfluxDB version 1.8.9
- Grafana v8.1.0
- Python 3.7.3
- 全体の構成:
今回は仮想通貨の価格をAPIで取得してダッシュボードを作ります。
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
初期設定
今回の為に下記の様なデータベースを作成します。
- データベース名:test01
- ユーザー:test01_user
- パスワード:test01_pass
$ influx
(influxDBのシェルを起動)
続けて、">"(大なり記号)にの後に"create"コマンド等を入力します。
Connected to http://localhost:8086 version 1.8.9
InfluxDB shell version: 1.8.9
> create database test01
> use test01
Using database test01
> create user test01_user with password 'test01_pass' with all privileges
> grant all privileges on test01 to test01_user
> exit
パスワード認証を有効にする(省略可)
$ sudo vi /etc/influxdb/influxdb.conf
(設定ファイルを管理者権限で編集)
[http]の項目に"auth-enabled = true"を追加します。
[http]
auth-enabled = true
$ sudo systemctl stop influxdb
$ sudo systemctl start influxdb
(stop->startでinfluxDBを再起動)
(追記)
バージョン1.8.9の場合は、influxDBが起動しなくなるバグがあります。githubにとりあえずの対策が投稿されていたので、その通りにします。
$ sudo vi /usr/lib/influxdb/scripts/influxd-systemd-start.sh
influxd-systemd-start.sh 29行目のsleep 1 -> sleep 5に変更
while [ "$result" != "200" ]; do
sleep 5
$ sudo systemctl stop influxdb
$ sudo systemctl start influxdb
面倒な場合には、パスワード認証を使用しない手もありです。
データをInfluxDBに取り込む
InfluxDBのデータベースの構造について
InfluxDBは、時刻にひもづいたデータの保存に適したデータベースです。データ取り込みに少し手間取ったので、用語をまとめておきます。
- database: データベースの単位。Grafanaの1つのグラフは1つのdatabaseを参照します
- measurement: データ(time, tags, fields)のグループの名前。名前に"/" (スラッシュ)が含まれると正しく動作しませんでした
- time: データの時刻情報で、形式はUNIX timeです。指定しない場合はデータベースに書き込まれた時刻が自動で入ります
- tags: データのタグを複数指定できます。
類似のデータはmeasurementを同じ名前、tagsを別の名前としてフィルタで区別します - fields: データベースに保存するデータ本体です。複数指定できます
- retention policy: measurementのデータを保存する期限を設定できます。今回は未使用です
pythonスクリプトの例
およそ1分毎にビットコインの価格を取得して、データベースに書き込みを行うスクリプトです。スクリプトは何でも良いのですが、簡単だったpythonを例にしています。
$ pip3 install influxdb ccxt
(pythonモジュールのインストール)
import influxdb
import ccxt
from datetime import datetime
from time import sleep
influx = influxdb.InfluxDBClient(
host='localhost',
port=8086,
database='test01',
username='test01_user',
password='test01_pass'
)
bitflyer = ccxt.bitflyer()
bitbank = ccxt.bitbank()
symbol = "BTC/JPY"
def get_data(exchange):
try:
result = exchange.fetch_ticker(symbol = symbol)
#print(result)
json_point = [{
'measurement': symbol.replace('/','_'),
'time': result['timestamp'],
'tags': {'exchange': exchange.id},
'fields': {'bid': result['bid'], 'ask': result['ask'], 'baseVolume': result['baseVolume']}
}]
#print(json_point)
influx.write_points(json_point)
except ccxt.BaseError as e:
print("Error", e)
while( True ):
now_time = datetime.now() # time control
if (now_time.second > 30):
get_data(bitflyer)
get_data(bitbank)
sleep(30)
sleep(1)
Grafanaで表示するデータを作る為に、上のpythonスクリプトを適当な時間だけ実行しておきます。
データベースに取り込まれたデータは、influxDBシェルの"select"コマンドで確認できます。
$ influx
Connected to http://localhost:8086 version 1.8.9
InfluxDB shell version: 1.8.9
> auth
username: test01_user
password:
> use test01
Using database test01
> precision rfc3339
> select * from BTC_JPY tz('Asia/Tokyo')
name: BTC_JPY
time ask baseVolume bid exchange
---- --- ---------- --- --------
2021-08-08T16:11:30.276+09:00 4975225 917.4672 4974919 bitbank
2021-08-08T16:11:31.637+09:00 4978072 5015.2753066 4976564 bitflyer
...
> exit
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
初期設定
Grafanaの設定はブラウザから行います。
まずラズパイのIPアドレスにアクセスします(IPアドレスの例:192.168.1.149)。
http://192.168.1.149:3000/
(ラズパイからアクセスする場合は、"localhost:3000"も可)
初期パスワード"admin"を入力してログイン、その後パスワードを変更します。
(追記)
バージョン8.1.1ではブラウザからパスワードが設定できませんでした。下記のコマンドラインで設定してください。パスワードを忘れた場合に、パスワードを変更できます。
$ sudo grafana-cli admin reset-admin-password <NEWPASS>
(<NEWPASS>にはパスワードを設定してください)
次にグラフの元になるデータベースを選択します。
- Grafanaホーム画面の"Add your first data source"をクリック
- データベース一覧からInfluxDBをクリック
- Settingsに下記の項目を入力
認証を使わない場合はUser/Passwordは必要ありません。- URL: http://localhost:8086
- Database: test01
- User: test01_user
- Password: test01_pass
- 一番下にある"Save & Test"をクリック
正しく設定できた場合は、"Data source is working"と表示されます。
とりあえずグラフを表示してみたい場合は、ランダムなデータが使用できます。データベース一覧から"TestData DB"を選択してください。
Grafanaでグラフを表示する
ここでは価格のグラフを作る方法を説明します。
- Grafanaホーム画面の"Create your first dashboard"をクリック
- "Add an empty panel"をクリック
- グラフの設定を入力
- グラフで表示するデータ: Data source -> "InfluxDB"
- measurement: "select measurement" -> "BTC_JPY"
- tags: WHERE右の"+"記号 -> "exchange" -> "select tag value" -> "bitflyer"
- fields: "field(value)" -> "bid"
- データの表示: "ALIAS" -> "bitflyer bid"
- グラフ名: "Title" -> "BTC/JPY"
パネルの変更の反映は、画面右上の"Apply"をクリックします(グラフ表示画面に移動)。
グラフにデータ追加は、画面左下の"+ Query"をクリックします。
- グラフ表示画面の右上から、"Save Dashboard"で名前を付けて保存できます
別のグラフを追加する場合は画面右上の"Add panel"をクリックします。
グラフを編集する場合は、グラフ名クリック -> Editをクリックです。
(追記)
- データ同士を計算してグラフ化する(例:価格のスプレッド)
- PanelのQueryへ適当なFROMやSELECTを選択する
- "FROM"の右端にある"🖊" (ペンのマーク)をクリック
- 下の様なQueryに編集する(SELECTのすぐ右側がデータ同士の計算です)
SELECT (mean("ask") - mean("bid")) FROM "BTC_JPY" WHERE ("exchange" = 'bitflyer') AND $timeFilter GROUP BY time($__interval) fill(null)
- "Apply"をクリック
(ペンのマークを再度クリックすると編集したQueryが消えてしまいます)
おわりに
想像していたよりも簡単にダッシュボードが作れました。Grafanaを見やすく設定するには、少し慣れが必要ですね。理解が進んだら内容を追加するかもしれません。