Raspberry Pi+DHT11のデータをInfluxDB+Grafanaで本格ダッシュボード化する方法【温湿度モニター上級編】
「DHT11で温湿度は取れるようになった。でも、ターミナルに数字が流れるだけじゃ物足りない…」
そんなフェーズに来た方に向けた記事です。今回は InfluxDB+Grafana を使って、Raspberry Pi+DHT11の計測データを 本格的な時系列ダッシュボード に仕立てる方法をゼロから解説します。
単にグラフを表示するだけでなく、長期データの保持ポリシー設定 や Grafanaのアラート通知 まで踏み込むので、「ちゃんと運用できるIoT監視システム」が完成します。
🔄 自作Flask版との使い分け

本ブログには、FlaskでシンプルなWebダッシュボードを自作する記事もあります。どちらを選ぶか迷った方のために、最初に比較表を置いておきます。
| 項目 | Flask自作版 | InfluxDB+Grafana版(本記事) |
|---|---|---|
| セットアップ難易度 | 低い(Pythonだけで完結) | やや高い(複数ミドルウェアが必要) |
| データ保存 | メモリ上(再起動で消える) | 時系列DBに永続保存 |
| グラフ・可視化 | 自前でHTML/JSを書く | Grafanaが高機能GUIで提供 |
| アラート通知 | 別途自前実装が必要 | Grafana標準機能で設定可 |
| 長期ログ分析 | 難しい | 得意(クエリで自在に集計) |
| 向いている用途 | 手軽に今すぐ確認したい | 継続運用・分析・監視 |
「まずFlask版を試してみたい」という方は、先に Raspberry Pi + PythonでIoTダッシュボードを自作|DHT11温湿度センサーで自宅をリアルタイム監視 をご覧ください。本記事はその「次のステップ」として読むのがおすすめです。
📋 この記事で作るもの・対象読者
完成イメージ:DHT11が1分ごとに温湿度を計測 → InfluxDBに書き込み → Grafanaで時系列グラフ+アラートを表示する、24時間365日動く本格IoT監視システム
対象読者:
- ✅ DHT11センサーでの計測は経験済みの方
- ✅ Pythonの基本(変数・ループ・関数)はわかる方
- ✅ InfluxDBやGrafanaを触ったことがない方(ゼロから解説します)
DHT11のセットアップや配線がまだの方は、先に Raspberry Pi+PythonでDHT11温湿度センサーを動かすIoT入門ガイド で基礎を押さえてから戻ってきてください。
難易度:⭐⭐⭐☆☆(中級)
🛠️ システム全体構成
まず全体の流れをざっくり把握しておきましょう。
DHT11センサー
↓(GPIO読み取り)
Python スクリプト(dht_to_influx.py)
↓(HTTP / Line Protocol で書き込み)
InfluxDB 2.x(時系列データベース)
↓(データソースとして接続)
Grafana(ダッシュボード・アラート)
↓(ブラウザで確認 / メール・Slack通知)
InfluxDB と Grafana はどちらも Raspberry Pi 上に直接インストール します。外部クラウドは不要なのでランニングコストゼロです。
📦 STEP 1:InfluxDB 2.x をインストールする
InfluxDB は時系列データ(タイムスタンプ付きの数値)を高速に読み書きするために設計されたデータベースです。センサーログの保存に最適です。
インストール手順(Raspberry Pi OS 64bit 推奨)
# 公式リポジトリを追加
curl https://repos.influxdata.com/influxdata-archive.key | sudo gpg --dearmor -o /usr/share/keyrings/influxdata-archive-keyring.gpg
echo 'deb [signed-by=/usr/share/keyrings/influxdata-archive-keyring.gpg] https://repos.influxdata.com/debian stable main' \
| sudo tee /etc/apt/sources.list.d/influxdata.list
sudo apt update
sudo apt install influxdb2 -y
# 起動 & 自動起動設定
sudo systemctl start influxdb
sudo systemctl enable influxdb
初期セットアップ
インストール後、ブラウザで http://<RaspberryPiのIPアドレス>:8086 を開くと初期設定ウィザードが起動します。
- Username / Password:任意で設定
- Organization name:例)
home - Bucket name:例)
sensors(データを入れる「バケツ」のイメージです)
設定完了後、画面に表示される APIトークン を必ずコピーしておいてください。後でPythonスクリプトから使います。
🐍 STEP 2:PythonからInfluxDBに書き込む
必要なライブラリをインストール
pip3 install adafruit-circuitpython-dht influxdb-client
sudo apt install libgpiod2 -y
書き込みスクリプト(dht_to_influx.py)
# dht_to_influx.py
import adafruit_dht
import board
import time
from influxdb_client import InfluxDBClient, Point
from influxdb_client.client.write_api import SYNCHRONOUS
# ---- InfluxDB 接続設定 ----
INFLUX_URL = "http://localhost:8086"
INFLUX_TOKEN = "ここにAPIトークンを貼り付ける"
INFLUX_ORG = "home"
INFLUX_BUCKET = "sensors"
# ---- DHT11 センサー設定 ----
dht_sensor = adafruit_dht.DHT11(board.D4)
client = InfluxDBClient(url=INFLUX_URL, token=INFLUX_TOKEN, org=INFLUX_ORG)
write_api = client.write_api(write_options=SYNCHRONOUS)
print("InfluxDB書き込み開始... Ctrl+Cで終了")
while True:
try:
temperature = dht_sensor.temperature
humidity = dht_sensor.humidity
# DHT11は読み取り直後にNoneを返すことがあるためチェック
if temperature is None or humidity is None:
print("読み取り値がNoneのためスキップ")
time.sleep(2)
continue
# Pointオブジェクトでデータを構造化
point = (
Point("room_environment") # measurment名
.tag("location", "living") # タグ(フィルタリングに使う)
.field("temperature", float(temperature))
.field("humidity", float(humidity))
)
write_api.write(bucket=INFLUX_BUCKET, org=INFLUX_ORG, record=point)
print(f"書き込み成功 💾 温度: {temperature:.1f}℃ 湿度: {humidity:.1f}%")
except RuntimeError as e:
# DHT11の読み取り失敗は頻繁に起きるので無視してリトライ
print(f"センサー読み取りエラー(スキップ): {e}")
time.sleep(60) # 1分間隔で計測
ポイントを整理します:
- 📌
Point("room_environment")はInfluxDBの「テーブル名」に相当するmeasurement名です - 📌
.tag()は文字列のメタ情報。部屋が複数ある場合は"bedroom"など追加できます - 📌
.field()が実際に記録される数値データです - 📌
time.sleep(60)で1分ごとに書き込み。DHT11の仕様と長期保存の効率を両立しています
動作確認
python3 dht_to_influx.py
「書き込み成功 💾」が表示されたら、InfluxDBのWeb UI(ポート8086)の「Data Explorer」でデータが入っているか確認してみてください。
📊 STEP 3:Grafanaをインストールする
# Grafana OSS をインストール
sudo apt install -y apt-transport-https software-properties-common wget
wget -q -O - https://apt.grafana.com/gpg.key | sudo gpg --dearmor -o /usr/share/keyrings/grafana.gpg
echo "deb [signed-by=/usr/share/keyrings/grafana.gpg] https://apt.grafana.com stable main" \
| sudo tee /etc/apt/sources.list.d/grafana.list
sudo apt update
sudo apt install grafana -y
sudo systemctl start grafana-server
sudo systemctl enable grafana-server
ブラウザで http://<RaspberryPiのIPアドレス>:3000 を開いてください。初期ログインは admin / admin です(初回ログイン時にパスワード変更を求められます)。
🔗 STEP 4:GrafanaにInfluxDBを接続する
Grafana の左メニューから Connections → Data sources → Add data source を選び、InfluxDB を選択します。
設定値はこのように入力します:
| 設定項目 | 入力値 |
|---|---|
| Query Language | Flux |
| URL | http://localhost:8086 |
| Organization | home(InfluxDB設定時と同じ) |
| Token | InfluxDBのAPIトークン |
| Default Bucket | sensors |
「Save & test」をクリックして 「Data source connected」 と表示されれば接続完了です ✅
📈 STEP 5:温湿度パネルを作る
左メニューの Dashboards → New → New dashboard → Add visualization を選択し、先ほど追加したInfluxDBデータソースを選びます。
温度グラフのFluxクエリ
from(bucket: "sensors")
|> range(start: -24h)
|> filter(fn: (r) => r["_measurement"] == "room_environment")
|> filter(fn: (r) => r["_field"] == "temperature")
|> aggregateWindow(every: 5m, fn: mean, createEmpty: false)
|> yield(name: "mean")
湿度パネルは "temperature" を "humidity" に変えるだけです。
パネル右側の設定で以下をカスタマイズするとグッとそれらしくなります:
- 📌 Unit:温度は
Celsius (°C)、湿度はPercent (0-100)を選択 - 📌 Min / Max:温度は 0〜50、湿度は 0〜100 に固定すると見やすい
- 📌 Thresholds:温度30℃以上を赤、25℃以上をオレンジなどに色分け可能
Stat パネルで「現在値」を大きく表示
時系列グラフに加えて、Stat タイプのパネルを追加すると現在の値を数字で大きく表示できます。ダッシュボードをスマホで見るときに便利です。Fluxクエリは同じで、パネルタイプを「Stat」に切り替えるだけです。
🔔 STEP 6:Grafanaでアラートを設定する
「室温が30℃を超えたら通知する」といったアラートも簡単に設定できます。
アラートルールの作成手順
- 温度パネルの編集画面を開き、上部タブから Alert を選択
- New alert rule をクリック
- クエリの下の Expressions で Threshold 条件を設定:
IS ABOVE 30 - Evaluation group で評価間隔を
1m、Pending period を5mに設定 - Labels / Notification policy で Contact point(メール・Slackなどの通知先)を紐付けて保存
通知先の追加(メール / Slack)
左メニューの Alerting → Contact points → Add contact point から通知先を追加します。メール・Slack・Webhook など多数に対応しています。LINEへの通知実装に興味がある方は Raspberry PiとPythonで作るIoTスマートホーム:温湿度センサーをLINEに通知する方法 も参考にしてください。
🗄️ STEP 7:データ保持ポリシーを設定する
センサーデータを無制限に保存し続けるとストレージが枯渇します。InfluxDB 2.x では Bucket の Retention Period(保持期間) で自動削除の期間を制御できます。
保持期間の変更方法
InfluxDB Web UI(ポート8086)の Load Data → Buckets から対象のバケツをクリックし、Retention Period を編集します。
| 用途 | 推奨保持期間 | 備考 |
|---|---|---|
| 生データ(1分間隔) | 30日〜90日 | Raspberry Piのストレージ容量に合わせて調整 |
| 5分平均ダウンサンプル | 1年 | 別Bucketに保存(後述) |
| 1時間平均ダウンサンプル | 無期限 | 長期トレンド分析用 |
ダウンサンプリングタスクの設定
生データを粗くまとめて別バケツに長期保存するのが運用のコツです。InfluxDB の Tasks 機能で自動化できます。
// InfluxDB Tasks の Flux スクリプト例
// 1時間ごとに実行して5分平均を「sensors_downsampled」バケツに保存
option task = {name: "downsample_sensors", every: 1h}
from(bucket: "sensors")
|> range(start: -task.every)
|> filter(fn: (r) => r["_measurement"] == "room_environment")
|> aggregateWindow(every: 5m, fn: mean, createEmpty: false)
|> to(bucket: "sensors_downsampled", org: "home")
InfluxDB Web UIの Tasks → Create Task にこのスクリプトを貼り付けて保存するだけです。あとは自動で動き続けます。
🔄 スクリプトをサービス化して自動起動させる
Raspberry Piを再起動するたびに手動でスクリプトを起動するのは面倒です。systemd でサービス化しましょう。
sudo nano /etc/systemd/system/dht-influx.service
[Unit]
Description=DHT11 to InfluxDB Logger
After=network.target influxdb.service
[Service]
ExecStart=/usr/bin/python3 /home/pi/dht_to_influx.py
Restart=always
RestartSec=10
User=pi
[Install]
WantedBy=multi-user.target
sudo systemctl daemon-reload
sudo systemctl enable dht-influx
sudo systemctl start dht-influx
# 動作確認
sudo systemctl status dht-influx
Active: active (running) と表示されれば完了です。これでRaspberry Piが起動するたびに自動的に計測&書き込みが始まります 🎉
💡 よくあるトラブルと対処法
| 症状 | 原因と対処 |
|---|---|
| InfluxDB への接続が拒否される | サービスが起動しているか systemctl status influxdb で確認。ファイアウォールがポート8086を塞いでいる可能性も |
| Grafana にデータが表示されない | Fluxクエリの range(start:) の期間にデータが存在するか確認。InfluxDB Data Explorerで先に確認する |
| DHT11 が RuntimeError を連発する | 仕様上よくある現象。スクリプトの except RuntimeError で無視しているので問題なし。配線が緩んでいないか確認 |
| SDカードの空き容量が減り続ける | Bucket の Retention Period を短く設定する。または外付けUSB-SSDにInfluxDBのデータディレクトリを移す |
🚀 さらに発展させるには
ここまでできたら、次のステップとして以下もおすすめです:
- 📌 複数センサーの追加:タグに
locationを追加するだけで寝室・リビングなど複数拠点を1ダッシュボードで管理できます - 📌 家電の自動制御と組み合わせる:温度が閾値を超えたらエアコンをONにする自動化は Raspberry PiとPythonで作るスマートホームIoT:家電を自動制御してみよう が参考になります
- 📌 MQTTと組み合わせる:複数のデバイスからデータを集約するアーキテクチャは ArduinoとMQTTでスマートホームを自作!IoTセンサーデータをクラウドに送る方法 が詳しいです
📝 まとめ
本記事では、Raspberry Pi+DHT11のセンサーデータを InfluxDB+Grafana で本格ダッシュボード化する方法を解説しました。
- ✅ InfluxDB 2.x のインストールと初期設定
- ✅ PythonスクリプトからInfluxDBへの書き込み
- ✅ GrafanaでInfluxDBを接続して温湿度グラフ・Statパネルを作成
- ✅ 温度アラートの設定(メール・Slack通知)
- ✅ データ保持ポリシーとダウンサンプリングで長期運用に対応
- ✅ systemdでスクリプトをサービス化して自動起動
Flask版と比べると導入コストは少し高めですが、一度動かしてしまえば データは自動で貯まり続け、Grafanaが勝手にグラフを更新 してくれます。「ちゃんと運用できるIoT監視システム」を目指している方は、ぜひこの構成に挑戦してみてください!
こちらも読まれています
📡 Arduinoをもっと深く学ぼう!
Arduino・ラズパイ・ロボットプログラミングを体系的に学びたい方へ。おすすめのUdemyコースや電子部品もまとめています。
📚 関連商品・おすすめ書籍
※本記事にはアフィリエイトリンクが含まれます。





