InfluxDB + Grafana によるセンサー履歴グラフ化基盤 構築手順書

対象: 各部屋のESPHome気象センサー(温度・湿度・気圧)を長期保存し、Grafanaで可視化する


1. 全体構成

[Home Assistant] –influxdb統合(書き込み)–> [Ubuntu Server]
(別ホスト)                   ├─ InfluxDB v2 (ポート8086) Docker
                        └─ Grafana (ポート3000) Docker

[ブラウザ] — Cloudflare Tunnel経由–> ha.da30.org (Home Assistant)
[ブラウザ] — Cloudflare Tunnel経由–> grafana.da30.org (Grafana)

  • Home AssistantとInfluxDB/Grafanaは別ホスト
  • InfluxDBとGrafanaは同一Ubuntu Server上にDocker Composeで同居
  • 両方とも既存のCloudflare Tunnel(da30.org)経由で外部アクセス可能

採用技術の経緯(重要な注意点)

InfluxDB 3 Coreは採用しなかった。 物理CPUがAVX2命令セットに非対応だったため、コンテナが起動直後にexit code 132(SIGILL/不正命令)でクラッシュループした。ログも一切出力されず原因特定が難航した。AVX2非対応のCPU(古いIntel Gemini Lake等)では既知の問題。InfluxDB v2はAVX2を要求しないため、このハードウェア制約がある場合はv2一択。


2. Docker環境準備

Dockerのインストール確認

docker --version
docker compose version

未導入の場合は公式リポジトリからインストール(Ubuntu Serverインストール時のsnap選択画面でチェックし忘れると入らない)。

sudo apt update
sudo apt install ca-certificates curl gnupg
sudo install -m 0755 -d /etc/apt/keyrings
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg
sudo chmod a+r /etc/apt/keyrings/docker.gpg
echo "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/ubuntu $(. /etc/os-release && echo "$VERSION_CODENAME") stable" | sudo tee /etc/apt/sources.list.d/docker.list
sudo apt update
sudo apt install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin
sudo usermod -aG docker $USER   # 要ログアウト/再ログイン

ディレクトリ構成

/home/da30/monitoring/
               ├── docker-compose.yml
               ├── influxdb2/
               │       ├── data/
               │       └── config/
               └── grafana/
                        └── data/

docker-compose.yml内の相対パス(./influxdb2/data等)は、このファイルの設置場所が基準になる点に注意。


3. docker-compose.yml (InfluxDB v2 + Grafana)

name: home-monitoring

services:
  influxdb2:
    image: influxdb:2
    container_name: influxdb2
    restart: unless-stopped
    ports:
      - "8086:8086"
    environment:
      - DOCKER_INFLUXDB_INIT_MODE=setup
      - DOCKER_INFLUXDB_INIT_USERNAME=admin
      - DOCKER_INFLUXDB_INIT_PASSWORD=change-me-please
      - DOCKER_INFLUXDB_INIT_ORG=home
      - DOCKER_INFLUXDB_INIT_BUCKET=home_sensors
      - DOCKER_INFLUXDB_INIT_ADMIN_TOKEN=change-me-to-a-long-random-string
    volumes:
      - ./influxdb2/data:/var/lib/influxdb2
      - ./influxdb2/config:/etc/influxdb2
    networks:
      - monitoring

  grafana:
    image: grafana/grafana-oss:latest
    container_name: grafana
    restart: unless-stopped
    ports:
      - "3000:3000"
    environment:
      - GF_SECURITY_ADMIN_PASSWORD=change-me-on-first-login
    volumes:
      - ./grafana/data:/var/lib/grafana
    depends_on:
      - influxdb2
    networks:
      - monitoring

networks:
  monitoring:
    driver: bridge

起動

cd /home/da30/monitoring
mkdir -p influxdb2/data influxdb2/config grafana/data
docker compose up -d

Grafanaが再起動ループする場合./grafana/dataのパーミッション問題が典型的な原因。Grafanaコンテナ内はUID 472で動くため、以下で解消する。

docker compose down
sudo chown -R 472:472 /home/da30/monitoring/grafana/data
docker compose up -d

4. Home Assistant側 InfluxDB統合の設定

4.1 接続設定(UI)

設定 > デバイスとサービス > 統合を追加 > InfluxDB → 「InfluxDB v2.x / v3」を選択し、以下を入力。

項目
URLhttp://<Ubuntu ServerのIP>:8086 (https ではなく http)
組織home
バケットhome_sensors
APIトークンDOCKER_INFLUXDB_INIT_ADMIN_TOKENの値

4.2 エンティティの絞り込みについて(既知の制限)

当初、configuration.yamlに以下のようなinclude(entity_globsによるフィルター)を追記して特定センサーだけをInfluxDBに書き込む方式を試みたが、UIで接続設定済みの状態だとYAML側のフィルターが反映されない既知の不具合があり、機能しなかった(全エンティティが書き込まれ続けた)。

# 試みたが機能しなかった設定(参考)
influxdb:
  include:
    entity_globs:
      - "sensor.*_weather_station_*"
    entities:
      - weather.zi_zhai

方針転換: HA側は全エンティティを書き込ませ、Grafana側のクエリで絞り込む。 ディスク容量に十分な余裕があれば実用上問題ない。2026.9のアップデートでUI側にフィルター機能が実装される可能性があるため、その際に改めて対応する。

なお、configuration.yamlinfluxdb:ブロックに接続情報(host/token等)を書くこと自体は2026.9で廃止予定。接続情報はUIで管理し、YAMLにはinclude/exclude/tagsなどの追加オプションのみを残す(現状は効果がなくても警告回避のため形だけ残している状態)。


5. Grafana ダッシュボード構築

5.1 ダッシュボード作成

Dashboards > New > New Dashboard → レイアウトは Auto grid を選択(パネル追加時に自動整列、部屋が増えても手動調整不要)。

さらにMax columnsを1に設定すると全パネルが縦一列に並ぶ(ダッシュボード設定の歯車アイコン→Layout)。

5.2 データソース設定

Connections > Data sources > Add data source > InfluxDB

項目
Query languageFlux
URLhttp://influxdb2:8086 (docker network内のコンテナ名で到達)
Organizationhome
Token管理者トークン
Default Buckethome_sensors
Basic authOFF(トークン認証を使うため不要。ONのままだと空認証情報で失敗する)

5.3 パネル設計(項目別に分割)

温度・湿度・気圧は値のスケールが大きく異なるため、1グラフにまとめず項目ごとに別パネルにする。部屋ごとの命名規則(<room_id>_weather_station_<項目>)を利用し、正規表現で全部屋を一括カバーする。

温度パネル

from(bucket: "home_sensors")
  |> range(start: v.timeRangeStart, stop: v.timeRangeStop)
  |> filter(fn: (r) => r._field == "value")
  |> filter(fn: (r) => r.entity_id =~ /_temperature$/)

湿度パネル(絶対湿度を除外)

from(bucket: "home_sensors")
  |> range(start: v.timeRangeStart, stop: v.timeRangeStop)
  |> filter(fn: (r) => r._field == "value")
  |> filter(fn: (r) => r.entity_id =~ /_humidity$/ and not r.entity_id =~ /absolute/)

気圧パネル(水蒸気圧系を除外)

from(bucket: "home_sensors")
  |> range(start: v.timeRangeStart, stop: v.timeRangeStop)
  |> filter(fn: (r) => r._field == "value")
  |> filter(fn: (r) => r.entity_id =~ /_pressure$/ and not r.entity_id =~ /vapor/)

部屋を追加した場合: ESPHome側で<room_id>_weather_stationの命名規則を守っている限り、上記クエリは変更不要。自動的にグラフへ追加される。

Legend(凡例)設定: パネル右側 Legend > Legend placement をRightにすると、部屋数が増えても横幅を圧迫しにくい。

5.4 遭遇したFluxクエリのトラブルまとめ

症状原因
distinct: schema collision型の異なる列をgroup()しようとした。keep()で列を絞ってからgroup()する
found unexpected argument columnsdistinct(columns: ...)は誤り。正しくは単数形column
invalid expression (`>`直後などで発生)
_measurement == "sensor"で常にNo dataHAのInfluxDB連携は_measurement単位名(°C等)またはentity_idを使う仕様。_measurementでのフィルターは行わずentity_idの正規表現のみで絞り込む

6. 外部アクセス設定(Cloudflare Tunnel)

Home Assistant用に構築済みのda30.orgのCloudflare Tunnelに、Grafana用のホスト名を追加する。

このトンネルは「Home Assistant App (Add-on): Cloudflared」(ローカル管理型)を使用しているため、Cloudflare Zero Trustダッシュボードからはルート編集不可。アドオンの「構成」タブから設定する。

1.HAの 設定 > アドオン > Cloudflared > 構成 タブを開く

2.additional_hosts に以下を追加

•hostname: grafana.da30.org

•service: http://192.168.0.8:3000

3.アドオンを再起動(起動時にDNSレコードも自動作成される)

これでhttps://grafana.da30.orgから外出先でもアクセス可能になる。


7. 管理者パスワードの変更

Grafana

アカウント設定 > Change password からUIで変更可能。

InfluxDB v2

UIからは変更不可。CLI必須。

docker exec -it influxdb2 influx user password \
  --name admin \
  --host http://localhost:8086 \
  --token <管理者APIトークン>

プロンプトに従って新しいパスワードを入力する。

注意: パスワードとAPIトークンは別物。パスワードを変更してもHome Assistant側のInfluxDB統合(トークン認証)には一切影響しない。再設定は不要。


8. 今後の部屋追加チェックリスト

1.ESPHomeで<room_id>_weather_stationの命名規則を守ってデバイスを作成・書き込み(手順書1参照)

2.Home Assistantに統合されたら、Entity ID formatの設定に従って自動的にきれいなentity_idが生成されることを確認(日本語デバイス名を使う場合は手順書1の4章を実施)

3.Grafana側のパネル設定変更は不要(正規表現が自動的にカバーする)

4.InfluxDBへの書き込みは全エンティティ対象のため、特別な設定変更は不要


※Claudeにより作成した。