🏠

[ラズパイ&Docker]GrafanaとInfluxDBでセンサデータをモニタリング

2021/09/19に公開

インタラクティブな可視化OSSのGrafanaと時系列データベースのInfluxdbを用いてセンサデータをモニタリングする方法をまとめました。

環境

センサを扱うため、アプリケーションサーバーにはRaspberry piを用います。センサには温度・気圧・海抜が計測できるBME085を用いました。

  • Raspberry pi4
  • docker
  • docker-compose
  • センサ BMP085
  • PC Windows10

docker, docker-composeのインストール

Raspberry pi4 のDockerとDocker-composeのインストール方法は下記を参考にしてください。
https://qiita.com/camomile_cafe/items/54b1223e8acafe4cae50

BMP085のセットアップ

BMP085のセットアップは下記を参考にしてください。BMP180の記事ですが同じ方法で動きます。085, 180は生産終了していますのでBMP280を推奨します。
https://qiita.com/masato/items/d5c19a883b0ba3ec7d5b

docker-compose.ymlを作成

grafanaとinfluxdbコンテナを生成するdocker-composeファイルを作ります。
grafanaのイメージはgrafana/grafanaを、influxdbのイメージはhypriot/rpi-influxdbを用います。いずれもARMプロセッサで使えるファイルを選びます。grafanaの設定のdepends_onをinfluxdbに指定することで連携されます。

docker-compose.yml
version: "3"
services:
  influxdb:
    image: hypriot/rpi-influxdb
    ports:
      - "8086:8086"
    volumes:
      - ./influxdb/data:/var/lib/influxdb
  grafana:
    image: grafana/grafana
    ports:
      - "3000:3000"
    volumes:
      - ./grafana/dashboards:/etc/grafana/provisioning/dashboards
      - ./grafana/datasources:/etc/grafana/provisioning/datasources
    depends_on:
      - influxdb

コンテナ起動

docker-composeでコンテナを起動します。

cd ~/path/to/project
docker-compose up -d

データベースの作成

influxdbのpython-apiを用いてdbを作ります。
詳細はドキュメントを参照してください。
https://influxdb-python.readthedocs.io/en/latest/index.html

createdb.py
import os
from influxdb import InfluxDBClient


def main():
    host = os.environ.get('INFLUXDB_HOST', 'localhost')
    port = os.environ.get('INFLUXDB_PORT', 8086)
    user = os.environ.get('INFLUXDB_USER', 'root')
    password = os.environ.get('INFLUXDB_PASSWORD', 'root')
    dbuser = os.environ.get('INFLUXDB_DBUSER', 'user')
    dbuser_password = os.environ.get('INFLUXDB_DBUSER_PASS', 'user')
    dbname = os.environ.get('INFLUXDB_DBNAME', 'hogehoge')
    retension = '30d'

    client = InfluxDBClient(host, port, user, password, dbname)

    print(f"Create database: {dbname}")
    client.create_database(dbname)

    print(f"Create a retention policy: {retension}")
    client.create_retention_policy(
        'raw_data_policy', retension, 1, default=True)

    print(f"Create a db user: {dbuser}")
    client.create_user(dbuser, dbuser_password)

if __name__ == '__main__':
    main()
python3 createdb.py

センサデータの書き込み

センサデータを読み込んでinfluxdbのclientから書き込みます。今回はBMP085の温度、気圧、海抜を10秒おきにサンプリングします。

write.py
import os
import time
from datetime import datetime, timezone
from influxdb import InfluxDBClient
from requests.api import get
import Adafruit_BMP.BMP085 as BMP085
import sys

def main():
    # influxdb
    host = os.environ.get('INFLUXDB_HOST', 'localhost')
    port = os.environ.get('INFLUXDB_PORT', 8086)
    dbuser = os.environ.get('INFLUXDB_DBUSER', 'user')
    dbuser_password = os.environ.get('INFLUXDB_DBUSER_PASS', 'user')
    dbname = os.environ.get('INFLUXDB_DBNAME', 'hogehoge')
    client = InfluxDBClient(host, port, dbuser, dbuser_password, dbname)

    # bmp180
    sensor = BMP085.BMP085()

    while True:
	# データ収集
        temperature_bmp180 = sensor.read_temperature()
        airpressure_bmp180 = sensor.read_pressure()
        altitude_bmp180 = sensor.read_altitude()
        try:
	  # データ
            data = [
                {
                    "measurement": "hogehoge",
                    "tags": {
                        "host": "pi4-host"
                        },
                        "time": datetime.now(timezone.utc).isoformat(),
                        "fields": {
                            "temperature_bme180": float(temperature_bmp180),
                            "airpressure": float(airpressure_bmp180),
                            "alititude": float(altitude_bmp180),
                        }
                }
            ]
            print(data)
	    # 書き込み
            client.write_points(data)
	    # 10秒おきにサンプリング
            time.sleep(10)
        except:
            pass

if __name__ == "__main__":
    main()
python3 write.py

これにてデータ収集システムの完成です。

grafanaで可視化

それではPCからraspberry pi4にアクセスしてリモートでGrafanaのダッシュボードを作ります。

ブラウザからgrafanaにアクセス

PCのブラウザから http://{ip}:3000 にアクセスします。

grafanaにログイン

user, passともに初回はadminで入ります。ログイン後パスワードを設定します。

influxdbと連携

サイドバーのConfigurationからData sourcesを選択し、Add data sourceをクリックしinfluxDBをクリックします。

HTTPのURLにinfluxdbのurl http://{ip}:8086 を入力します。
Databaseに hogehogeを入力し、User, Passwordに設定された値を入力します。
Save & test をクリックして、Successと出れば成功です。

ダッシュボードの作成

いろんなグラフがありますので、ぜひかっこいいダッシュボードをデザインしてみてください。

grafanaのダッシュボード作りの詳細は公式をご参照ください。
https://grafana.com/

Discussion