この記事について
「源泉かけ流しのお風呂の温度をリアルタイムで把握したい」と思い立ち、市販の温度センサーとラズパイで動くところまで確認し、その後 ESP32(ESPHome)+ Wi-Fi 構成に移行するまでの記録です。
試行錯誤の過程も含め、将来の自分が「なんでこの構成にしたんだっけ?」と思ったときに読み返す用にもなっています。
想定読者:将来の自分(と、同じようなことをやりたい人)
- Home Assistant OS(HAOS)を使っている
- 温泉・旅館の湯温管理に興味がある
- ラズパイや ESP32 を触ったことがある(またはこれから触る)
1. やりたかったこと
源泉かけ流しの温泉施設では、湯温管理は日々の運用課題。
源泉の温度は外気温や天候で変動し、スタッフが定期的に温度計で計測してバルブを手動調整するのが一般的な運用です。
まずは第一歩として、浴槽の湯温をスマホや PC からリアルタイムで確認できるようにしたい。
制御(バルブの自動開閉)は後のステップとして、まずはデータ取得から。
要件:
- 湯温データをリアルタイムで取得し、Home Assistant などのダッシュボードに表示する
- センサーは防水であること(お湯に浸ける前提)
- できるだけ安価にプロトタイプしたい
2. 市販の IoT 湯温計を探す → 見つからない
最初に考えたのは「Wi-Fi 対応の湯温計をポンと置けば終わりでは?」ということ。
しかし、調べてみると意外と選択肢がない。
- 家庭用のWi-Fi水温計 — プール用の浮かべるタイプは見つけましたが、派手でお風呂には不向き、専用アプリ以外でデータが取り出せるのかも不明。
- 業務用の温泉温度管理システム — 存在するが、月額課金のクラウドサービスとセットだったりで初期費用も高い
- 防水の Bluetooth 温度計 — 一部あるが、Home Assistant への統合が難しそう
「お湯の温度をリアルタイムでスマートホームに飛ばす」というのは、ありそうでない製品だった。
3. DS18B20 という温度センサーにたどり着く
調べていくうちに、電子工作の定番センサーだという DS18B20 を発見。
DS18B20 の特徴:
測定範囲: -55°C 〜 +125°C(温泉の温度帯を十分カバー)
精度: ±0.5°C(-10°C 〜 +85°C の範囲)
通信方式: 1-Wire(データ線1本 + GND で通信可能)
防水: ステンレスの筒に封入されたプローブタイプあり
購入したもの
品名:DS18B20 防水温度センサー + 変換基板セット 防水プローブ、4.7kΩ プルアップ抵抗内蔵の変換基板付き ¥1,200 で5セット入り
https://www.amazon.co.jp/dp/B0FYGS6GF8?ref=fed_asin_title&th=1
⚠️ ハマったポイント:変換基板に抵抗が内蔵されていた
購入した商品には、センサー本体とは別に「変換基板」と「4.7kΩ 抵抗」が入っていました。
両方使うものだと思って、ブレッドボード上に抵抗も挿して使っていたのですが・・・
商品説明をよく読むと:
付属のアダプターボードには4.7KΩのプルアップ抵抗が内蔵されており、Raspberry Pi の GPIO へ直接、安定接続できます。
なので、変換基板を使うなら、外付けの抵抗は不要でした
- 変換基板は単なる端子変換板ではなく、4.7kΩ のプルアップ抵抗が基板上に実装されている
- 外付け抵抗を追加すると、二重にプルアップしていた可能性が高い
- 変換基板なしで DS18B20 を直接繋ぐ場合のみ、DATA と VCC の間に 4.7kΩ 抵抗を入れる
この発見でブレッドボードと外付け抵抗が不要になり、配線がシンプルになりました☺️
4. ラズパイの GPIO に直結して湯温を取得する(Step 1)
まずは Home Assistant OS(HAOS)が動いているラズパイに DS18B20 を直接接続して、データが取れることを確認しました。
4.1 ハードウェア接続
変換基板からラズパイへの配線は3本。
変換基板 Raspberry Pi 4
───────── ─────────
VCC ────────── 3.3V (Pin 1)
GND ────────── GND (Pin 6)
DATA ────────── GPIO4 (Pin 7) ← 1-Wire のデフォルトピン
4.2 1-Wire の有効化(HAOS 特有の注意ポイント)
通常の Raspberry Pi OS なら raspi-config コマンドで 1-Wire を有効化できるとのことですが
HAOS では raspi-config は使えない。(HAOS がラズパイの OS を独自管理しているため。)
代わりに /boot/config.txt へ設定を追加する。
ただし、HAOS 上からは /boot/config.txt は見えず直接編集できないので、ストレージ(SD カード)を直接編集する。
手順:
- ラズパイの電源を切り、SD カードを取り出す
- PC に SD カードを挿す
- CONFIG パーティション(FAT32 でマウントされる領域)を開く
config.txtをテキストエディタで開き、末尾に以下を追加:
dtoverlay=w1-gpio GPIO4 以外のピンを使う場合は dtoverlay=w1-gpio,gpiopin=4 のようにピン番号を明示する。GPIO4 なら省略可能。- 保存して SD カードをラズパイに戻す
- ラズパイの電源を入れて起動
起動後の確認(Terminal & SSH アドオン等で実行):
$ ls /sys/bus/w1/devices/
28-000000cb8888 w1_bus_master1 28- で始まるディレクトリが DS18B20 のデバイス(上記の値はダミー)。これが表示されれば 1-Wire の有効化は成功。
表示されない場合のチェックリスト:
config.txtの編集先が CONFIG パーティションか(別のパーティションを開いていないか)- 配線が正しいか(VCC / DATA / GND の3本)
- GPIO4 を使っているか
温度の読み取り確認:
$ cat /sys/bus/w1/devices/28-000000cb8888/w1_slave
73 01 4b 46 7f ff 0c 10 41 : crc=41 YES
73 01 4b 46 7f ff 0c 10 41 t=23187 t=23187 は温度の 1000 倍の値 = 23.187°C。
4.3 Home Assistant での設定
HAOS 上で Command Line センサーとして登録する。configuration.yaml に以下を記述:
command_line:
- sensor:
name: Water Temperature
unique_id: water_temperature_ds18b20
command: >
cat /sys/bus/w1/devices/28-000000cb8888/w1_slave
| grep 't='
| awk -F't=' '{print $2/1000}'
unit_of_measurement: "°C"
scan_interval: 30
動作の仕組み:
- 30秒ごとに
commandで指定したシェルコマンドを実行 w1_slaveファイルからt=の行を抽出awkで数値を 1000 で割って摂氏に変換- Home Assistant のセンサーエンティティとして表示
HA を再起動すると、ダッシュボードに湯温が表示される。
→ ここで「データが取れる」ことは確認できた。
5. 実運用に合わせて改良
とりあえずデータは取れましたが、このままだと使いづらいです。
問題 1:ラズパイとお風呂が物理的に遠い
ラズパイはルーター置き場(事務所)を想定しており、お風呂は別の場所。
DS18B20 のケーブルを延伸すれば届くが、1-Wire 通信はケーブルが長くなるとノイズや電圧降下で不安定になる。
一般的に 5m 超えで注意、10m 以上は環境次第で通信エラーが増えるとのこと。
延長したい場合、1-Wireアダプタを導入すると
ラズパイ --- 1-Wireアダプタ --- (LANケーブル 10m〜) --- DS18B20
という構成もあるようで、この場合1-Wireアダプタ側から給電ができ、DS18B20側で電源を取らなくて良いので、コンセントのない場所にはこの構成が良いかも。
■Guidelines for Reliable Long Line 1-Wire Networks ※英語記事です
私は電気工事士を持っているので実際は電源引いちゃいそうですが、この構成もそのうち試すつもりです(1-Wireアダプタは購入済み、長いLANケーブルが手元に無い)
問題 2:配線がごちゃつく
ブレッドボード、ジャンパ線、変換基板が宙ぶらりん……浴場のような湿気のある場所にそのまま持ち込むのは厳しい。
(※ 変換基板に抵抗が内蔵されていることに気づく前は、外付け抵抗もあってさらにごちゃついていた)
問題 3:設計上の密結合
そもそも HAOS が動いているラズパイに物理センサーを直結すること自体に設計上の問題がある。
- ラズパイの交換や HAOS の再インストール時に、センサーの配線もやり直しになる
- センサーの設置場所がラズパイの場所に制約される
- 将来的にセンサーを増やしたい場合、ラズパイの GPIO が足りなくなる
6. ESP32 + ESPHome + Wi-Fi 構成に移行する(Step 2)
そこで、センサーの読み取りを ESP32 に任せ、Wi-Fi 経由で Home Assistant にデータを送る構成に変更。
Before → After
Before(ラズパイ直結):
[DS18B20] ──GPIO──→ [Raspberry Pi (HAOS)] ──→ ダッシュボード
↑ 物理的に近い必要あり
After(ESP32 経由):
[DS18B20] ──GPIO──→ [ESP32 (ESPHome)] ──Wi-Fi──→ [Raspberry Pi (HAOS)] ──→ ダッシュボード
↑ お風呂の近くに設置 ↑ ルーター置き場でOK 今回使った ESP32 ボード
ESP32-S3-DevKitC-1 を採用。(手元にあった)
ESP32 への配線
変換基板から ESP32 への接続は3本。
変換基板 ESP32-S3-DevKitC-1
───────── ──────────────────
VCC ────────── J1-1 (3V3)
GND ────────── J3-1 (GND)
DATA ────────── J3-4 (GPIO1)
※先述の通り変換基板にプルアップ抵抗が入っているので、外付け抵抗は不要。
ESPHome の設定
ESPHome は「YAML ファイルを書くだけで ESP32 のファームウェアを作ってくれるツール」です。
Home Assistant のアドオンとして動くので、ブラウザだけで完結します。
前提
- Home Assistant に ESPHome アドオンがインストール済みであること
- ESP32-S3-DevKitC-1 が USB ケーブルで PC(または ラズパイ)に接続されていること
ESPHome アドオンが未導入の場合は、Home Assistant の「設定 → アドオン → アドオンストア」から「ESPHome」を検索してインストールしてください。
手順
1. ESPHome のダッシュボードを開く
Home Assistant のサイドバーから「ESPHome」をクリック。
2. 新しいデバイスを追加する
右下の「+ NEW DEVICE」を押し、デバイス名を入力します(例:onsen-sensor)。ボードの種類を聞かれたら ESP32-S3 を選択。
初回は USB 接続経由で書き込むため、「Plug into this computer」を選びます。
3. YAML を編集する
デバイスが追加されると、YAML の編集画面が開きます。自動生成された内容(esphome: や wifi: のブロック)はそのまま残し、末尾に以下を追加します。
one_wire:
- platform: gpio
pin: GPIO1 # DS18B20 の DATA ピンを接続した GPIO
sensor:
- platform: dallas_temp
address: 0x28000000CB588888 # DS18B20 の固有アドレス
name: "湯温"
id: hot_water_temp
update_interval: 60s
accuracy_decimals: 1
各行の意味:
one_wire:→ 1-Wire 通信を有効にする宣言pin: GPIO1→ DS18B20 の DATA 線を繋いだピン番号address:→ DS18B20 の固有アドレス(後述の方法で確認する)name: "湯温"→ Home Assistant 上での表示名update_interval: 60s→ 60秒ごとに温度を読み取るaccuracy_decimals: 1→ 小数第1位まで表示(23.2°C のように)
ESPHome でコンパイル・書き込みすると、Home Assistant が ESP32 を自動検出し、温度センサーのエンティティが追加されました。
4. DS18B20 の固有アドレス確認
DS18B20 の固有アドレスは、最初は address: の行を書かずに一度書き込むと、ESPHome のログに自動検出されたアドレスが表示されます。
[D][dallas.sensor:084]: Found sensors:
[D][dallas.sensor:086]: 0x28000000CB588888 このアドレスをコピーして YAML に貼り付け、再度書き込めばOKです。
5. コンパイル&書き込み
YAML の編集が終わったら、右上の「INSTALL」ボタンを押します。
- 初回は「Plug into the computer running ESPHome Dashboard」を選択(USB 経由)
- 2回目以降は Wi-Fi 経由(OTA = Over The Air)で書き込めるようになる
コンパイルには数分かかります。完了すると ESP32 が自動的に再起動し、Wi-Fi に接続します。
6. Home Assistant が自動検出する
書き込みが成功すると、Home Assistant の「設定 → デバイスとサービス」に ESPHome デバイスが自動的に表示されます。
「設定」を押して追加すれば、「湯温」というセンサーエンティティがダッシュボードに現れます。
動作確認
氷水にセンサーを入れて検証したところ、0.4°C 前後が出た。氷水検証としてはかなり自然な値。Wi-Fi 接続も安定し、Home Assistant からも問題なく認識できた。
7. ラズパイ側のクリーンアップ
ESP32 に移行したら、ラズパイ側で直結側の設定を掃除する。
configuration.yaml から削除
# 削除する部分:
command_line:
- sensor:
name: Water Temperature
unique_id: water_temperature_ds18b20
command: "cat /sys/bus/w1/devices/28-000000cb8888/w1_slave | grep 't=' | awk -F't=' '{print $2/1000}'"
unit_of_measurement: "°C"
scan_interval: 30
config.txt から 1-Wire 設定を削除
SD カードを PC に挿し、CONFIG パーティションの config.txt から dtoverlay=w1-gpio の行を削除(またはコメントアウト)する。
物理配線の取り外し
DS18B20 をラズパイの GPIO から取り外す。
8. 将来:2 本目のセンサーを追加するとき
DS18B20 は 1-Wire なので、同じ DATA 線に複数センサーをぶら下げられる。
管理しやすさを考えると、各センサーの固有アドレスを YAML に固定しておくのがおすすめ。例えば湯温・給湯配管温度・脱衣所温度のように増やす場合:
sensor:
- platform: dallas_temp
name: "湯温"
address: 0xbb000000caa58888
update_interval: 60s
accuracy_decimals: 1
- platform: dallas_temp
name: "配管温度"
address: 0xaaaaaaaaaaaaaaaa
update_interval: 60s
accuracy_decimals: 1
アドレスを固定しておけば、センサーの接続順が変わっても「どのセンサーがどのエンティティか」がぶれない。
9. まとめ
Step 1: 「湯温を知りたい」
↓
Step 2: 市販の IoT 湯温計が無い
↓
Step 3: DS18B20 + 変換基板を Amazon で購入(約 ¥1,000)
↓
Step 4: ラズパイ GPIO に直結 → 動いた!
↓
Step 5: ラズパイとお風呂が遠い & 配線がごちゃつく
↓
Step 6: ESP32 + ESPHome + Wi-Fi 構成に移行
→ センサーはお風呂の近くに、ラズパイは安全な場所に設置できそう
水温の IoT はまだまだ事例が少ない領域ですが、手間さえかければ1個200円のセンサー取得できました♪
No comments yet