[ラズパイ&Docker]GrafanaとInfluxDBでセンサデータをモニタリング
インタラクティブな可視化OSSのGrafanaと時系列データベースのInfluxdbを用いてセンサデータをモニタリングする方法をまとめました。
環境
センサを扱うため、アプリケーションサーバーにはRaspberry piを用います。センサには温度・気圧・海抜が計測できるBME085を用いました。
- Raspberry pi4
- docker
- docker-compose
- センサ BMP085
- PC Windows10
docker, docker-composeのインストール
Raspberry pi4 のDockerとDocker-composeのインストール方法は下記を参考にしてください。
BMP085のセットアップ
BMP085のセットアップは下記を参考にしてください。BMP180の記事ですが同じ方法で動きます。085, 180は生産終了していますのでBMP280を推奨します。
docker-compose.ymlを作成
grafanaとinfluxdbコンテナを生成するdocker-composeファイルを作ります。
grafanaのイメージはgrafana/grafana
を、influxdbのイメージはhypriot/rpi-influxdb
を用います。いずれもARMプロセッサで使えるファイルを選びます。grafanaの設定のdepends_onをinfluxdbに指定することで連携されます。
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を作ります。
詳細はドキュメントを参照してください。
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秒おきにサンプリングします。
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のダッシュボード作りの詳細は公式をご参照ください。
Discussion