「DHT11で温湿度は取れるようになった。でも、ターミナルに数字が流れるだけじゃ物足りない…」

そんなフェーズに来た方に向けた記事です。今回は InfluxDB+Grafana を使って、Raspberry Pi+DHT11の計測データを 本格的な時系列ダッシュボード に仕立てる方法をゼロから解説します。

単にグラフを表示するだけでなく、長期データの保持ポリシー設定Grafanaのアラート通知 まで踏み込むので、「ちゃんと運用できるIoT監視システム」が完成します。

🔄 自作Flask版との使い分け

Grafana dashboard temperature humidity
Grafana dashboard temperature humidity / Photo by FOX ^.ᆽ.^= ∫ via Pexels

本ブログには、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℃を超えたら通知する」といったアラートも簡単に設定できます。

アラートルールの作成手順

  1. 温度パネルの編集画面を開き、上部タブから Alert を選択
  2. New alert rule をクリック
  3. クエリの下の ExpressionsThreshold 条件を設定:IS ABOVE 30
  4. Evaluation group で評価間隔を 1m、Pending period を 5m に設定
  5. 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のデータディレクトリを移す

🚀 さらに発展させるには

ここまでできたら、次のステップとして以下もおすすめです:

📝 まとめ

本記事では、Raspberry Pi+DHT11のセンサーデータを InfluxDB+Grafana で本格ダッシュボード化する方法を解説しました。

  • ✅ InfluxDB 2.x のインストールと初期設定
  • ✅ PythonスクリプトからInfluxDBへの書き込み
  • ✅ GrafanaでInfluxDBを接続して温湿度グラフ・Statパネルを作成
  • ✅ 温度アラートの設定(メール・Slack通知)
  • ✅ データ保持ポリシーとダウンサンプリングで長期運用に対応
  • ✅ systemdでスクリプトをサービス化して自動起動

Flask版と比べると導入コストは少し高めですが、一度動かしてしまえば データは自動で貯まり続け、Grafanaが勝手にグラフを更新 してくれます。「ちゃんと運用できるIoT監視システム」を目指している方は、ぜひこの構成に挑戦してみてください!

📡 Arduinoをもっと深く学ぼう!

Arduino・ラズパイ・ロボットプログラミングを体系的に学びたい方へ。おすすめのUdemyコースや電子部品もまとめています。

Arduinoロボット入門のおすすめコース・部品を見る →

📚 関連商品・おすすめ書籍

スッキリわかるPython入門 第2版 (スッキリわかる入門シリーズ)

もしも

スッキリわかるPython入門 第2版 (スッキリわかる入門シリーズ)

初心者に定番のPython入門書

Amazonで見る

Arduinoをはじめよう 第4版 (Make: PROJECTS)

もしも

Arduinoをはじめよう 第4版 (Make: PROJECTS)

Arduino公式推薦の定番入門書

Amazonで見る

徹底攻略! 電子工作&プログラミング Arduinoで学ぶ電子工作完全ガイド

もしも

徹底攻略! 電子工作&プログラミング Arduinoで学ぶ電子工作完全ガイド

電子工作とプログラミングを同時に学べる

Amazonで見る

※本記事にはアフィリエイトリンクが含まれます。

ABOUT ME
やまちゃん
これまで学生と社会人を合わせて5000人以上にプログラミング学習を指導。 ゼロからイチをわかりやすく解説する専門家として活動しており、本業ではArduinoを用いたIoT開発とロボットプログラミングが専門。 Pythonを用いたアプリ開発、ウェブアプリケーションの開発で業務の効率化をサポートしています。