RaspberryPiでダッシュボードを作る(Grafana InfluxDB)備忘録

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を見やすく設定するには、少し慣れが必要ですね。理解が進んだら内容を追加するかもしれません。

    参考

    Remaining : 0 characters / 0 images
    100

    Sign up / Continue after login

    Related stories

    Writer

    The Shiba Inu (柴犬) is a most popular dog in Japan.

    Share

    Popular stories

    RaspberryPi小ネタ(OS起動でLED点滅、シャットダウンスイッチ、Lチカ)備忘録

    5028

    太陽電池でビットコインをマイニング3 ~RaspberryPi採用で効率アップ~

    1076

    裁定取引bot R2の実験(2020年2月~7月)

    1050