対象: 各部屋の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」を選択し、以下を入力。
| 項目 | 値 |
|---|---|
| URL | http://<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.yamlのinfluxdb:ブロックに接続情報(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 language | Flux |
| URL | http://influxdb2:8086 (docker network内のコンテナ名で到達) |
| Organization | home |
| Token | 管理者トークン |
| Default Bucket | home_sensors |
| Basic auth | OFF(トークン認証を使うため不要。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 columns | distinct(columns: ...)は誤り。正しくは単数形column |
invalid expression (` | >`直後などで発生) |
_measurement == "sensor"で常にNo data | HAの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により作成した。