最近、Home Assistantで部屋の環境を可視化するのにハマってて。最初はArduinoで温湿度センサー(DHT11)を動かすところから始めたんだけど、正直、WiFi接続とかMQTTでデータ飛ばすとか、全部コード書くのって結構骨が折れるじゃない?
で、ある週末に「もうちょっと楽な方法ないの?」って思って、ESPHomeを試してみることにしたんだ。ターゲットは空気質センサーのBME680。結果から言うと…はんだ付けの時間も含めて、たった2時間でHome Assistantのダッシュボードに気温、湿度、気圧、それに空気質まで表示できた。マジで衝撃だった。
この体験が、僕のIoTプロジェクトの考え方を根本から変えたかな。もうゼロからコード書くのはやめて、ESPHomeみたいなエコシステムに全力で乗っかろうって決めた。もちろん、事前にセンサーがESPHomeに対応してるか確認する必要はあるけど、公式ドキュメントに載ってるやつなら、まあ、だいたい動く。しかも、かなり安定して。
というわけで、これはBME680センサーをESP8266につないで、ESPHome経由でHome Assistantに統合するまでの、僕の作業メモみたいなもの。同じことやろうとしてる人の参考になれば嬉しい。
で、なんでArduinoじゃなくてESPHomeなの?
よく聞かれるんだけど、僕も最初は「Arduinoで書けば自由度高いじゃん」って思ってた。でもね、目的が「センサーの値をサクッと可視化したい」だけなら、ESPHomeの方が圧倒的に楽。どれくらい違うかというと…
| 比較項目 | Arduinoで自力実装 | ESPHomeを使う場合 |
|---|---|---|
| センサーの読み取り | まずライブラリ探しから。バージョン違いとかで動かないことも…。あー、あの沼ね。 | YAMLファイルに`platform: bme680_bsec`って書くだけ。え、マジで?ってなる。 |
| ネットワーク接続 | WiFi接続、切断時の再接続ロジック、MQTTブローカーへの接続…全部自分でコード書く。正直しんどい。 | `wifi:`と`mqtt:`のセクションにSSIDとかIPアドレス書けば、あとは勝手にやってくれる。神。 |
| Home Assistant連携 | MQTTのTopicを設計して、HA側で`configuration.yaml`にセンサー定義を延々と書く作業が待ってる。 | ESPHomeがHome Assistantを自動検出してくれる(API連携の場合)。追加ボタン押すだけ。えぇ…。 |
| OTAアップデート | 自分でOTA用のコードを組み込む必要がある。結構面倒。やらなくなるよね、正直。 | 標準機能。ESPHomeのダッシュボードからワイヤレスで書き込み可能。めっちゃ便利。 |
要するに、ESPHomeは「やりたいこと」を宣言的に書くだけで、面倒な「どうやるか」の部分を全部隠蔽してくれる感じ。車輪の再発明をしなくていいって、本当に楽だよ。
じゃ、何がいるの?
今回のプロジェクトで使ったのは、基本これだけ。
- ESP8266ボード (僕はWemos D1 Miniを使った。小さくて使いやすいから)
- BME680センサーモジュール (Amazonで評価と価格のバランスがいいやつを選んだ)
- デュポンワイヤー (いわゆるジャンパワイヤーね)
BME680はBosch製のセンサーで、温度、湿度、気圧だけじゃなくて、VOC(揮発性有機化合物)も測れるから、空気の質(IAQ: Indoor Air Quality)の指標が出せるのが面白いところ。ちなみに、こういう部品は日本の通販サイト、例えば秋月電子とかでも普通に手に入るやつで大丈夫。
配線:ここ、一番ハマりやすいポイントかも
BME680はI2Cっていう通信方式で接続するのが一般的。ESPHomeの公式ドキュメントもI2C接続を推奨してる。配線自体はシンプルなんだけど、僕、最初間違えてSPI接続のピン配置を見ちゃってて、「動かねー!」って少しハマった。だから、ここは慎重に。
Wemos D1 Mini (ESP8266) と BME680 のI2C接続はこう。
- ESP8266 5V → BME680 Vin (電源)
- ESP8266 GND → BME680 GND (グラウンド)
- ESP8266 D1 (GPIO5) → BME680 SCL (クロック線)
- ESP8266 D2 (GPIO4) → BME680 SDA (データ線)
ボードによってピンの名前(D1とかD2とか)が違うから、GPIOの番号で確認するのが確実かな。GPIO5がSCL、GPIO4がSDAね。
ESPHomeの設定:YAMLをちょこっと書くだけ
配線が終わったら、ESPHomeのダッシュボードで新しいデバイスを作成する。ボードの種類(d1_miniとか)とWiFiの情報を入れるのはいつも通り。
ここからがBME680の設定。大事なのは、コンポーネントとして古い`bme680`じゃなくて、新しい`bme680_bsec`を使うこと。こっちを使わないと、IAQとかCO2換算値が取れないから。Bosch Sensortec BSEC (Bosch Sensortec Environmental Cluster)っていう、Boschが提供してるライブラリを使って賢く計算してくれる方ね。
具体的に追加・修正するのは以下の部分。
- `i2c`の設定: どのピンをSDAとSCLに使ってるかESPHomeに教えてあげる。
- `bme680_bsec`の設定: I2Cのアドレスとか、測定間隔とかを設定。`sample_rate`は`ulp` (ultra-low power, 5分間隔) か`lp` (low power, 3秒間隔) が選べる。僕はバッテリー駆動じゃないから`lp`でもいいんだけど、まあ最初は`ulp`で。
- `sensor`の設定: どの測定値(温度、湿度、IAQとか)をHome Assistantに送りたいかリストアップする。
- `text_sensor`の設定: IAQの精度が今どんな状態か("Calibrating"とか"Excellent"とか)をテキストで取得するために追加。
僕の最終的な設定ファイルはこんな感じになった。コピペして自分の環境に合わせて修正すれば動くはず。
# Chip Info:
# - Chip Family: ESP8266
# - Chip Model: ESP8266EX
esphome:
name: esp8266-air-quality
platform: ESP8266
board: d1_mini
# WiFiやMQTT、APIなどの設定は省略...
i2c:
sda: 4 # GPIO4
scl: 5 # GPIO5
scan: true
id: bus_a
# Boschのライブラリを使うbme680_bsecコンポーネント
bme680_bsec:
address: 0x77 # 大抵0x77か0x76。scan:trueなら自動検出してくれる
temperature_offset: 0 # 必要に応じて温度の補正値を入れる
iaq_mode: static # 持ち運ばないならstaticでOK
sample_rate: ulp # 5分に1回の測定
state_save_interval: 6h # 6時間ごとに校正状態を保存
# Home Assistantに送るセンサーの定義
sensor:
- platform: bme680_bsec
temperature:
name: "書斎 BME680 温度"
pressure:
name: "書斎 BME680 気圧"
humidity:
name: "書斎 BME680 湿度"
iaq: # Indoor Air Quality Index
name: "書斎 BME680 IAQ"
co2_equivalent: # CO2換算値
name: "書斎 BME680 CO2換算値"
breath_voc_equivalent: # 呼吸由来のVOC換算値
name: "書斎 BME680 呼吸VOC"
# IAQの精度を文字列で表示するセンサー
text_sensor:
- platform: bme680_bsec
iaq_accuracy:
name: "書斎 BME680 IAQ精度"
書き込みと動作確認
YAMLが書けたら、あとは "Install" ボタンを押して書き込むだけ。USBで繋いで直接書き込んでもいいし、バイナリファイルをダウンロードして`esphome-flasher`みたいなツールで書き込んでもOK。僕は後者でやったけど、Arduino IDEで書き込むときみたいにログが流れて、なんか安心する。
書き込みが終わって、ESPがWiFiに接続されると、ESPHomeのログにセンサーの値が流れ始めるはず。
[19:48:29][D][sensor:121]: '書斎 BME680 IAQ': Sending state 25.00000 IAQ with 0 decimals of accuracy
[19:48:29][D][sensor:121]: '書斎 BME680 CO2換算値': Sending state 500.00000 ppm with 1 decimals of accuracy
...
[19:48:29][D][sensor:121]: '書斎 BME680 温度': Sending state 24.96941 °C with 1 decimals of accuracy
[19:48:29][D][sensor:121]: '書斎 BME680 湿度': Sending state 57.82278 % with 1 decimals of accuracy
こんな感じのログが出始めたら成功。最初のうちはIAQの値が安定しないけど、数時間から1日くらい動かしておくとセンサーが校正されて、`IAQ精度`が"Excellent"とかになってくる。
うまく動かない?ありがちなミスはこれ
- 配線の再確認: しつこいけど、もう一度。SDAとSCLが逆になってない?GNDはちゃんと繋がってる?
- I2Cアドレス: ログを見て`Found I2C device at 0x76`みたいに出てたら、YAMLの`address`を`0x76`に直す。`scan: true`にしておけば大抵は大丈夫だけど。
- ディープスリープモードの罠: もしバッテリー駆動でディープスリープモードを使ってるなら、書き込むときはD0(GPIO16)とRSTピンを繋ぐワイヤーを外さないと書き込みモードに入れないことがある。…これで15分くらい溶かしたことある。
- 再起動してみる: なんか変だなと思ったら、とりあえずESP8266の電源を入れ直してみる。案外それで直ったりする。
Home Assistantダッシュボードに追加
で、一番最高なのがHome Assistant側の設定。ESPHomeのデバイスがオンラインになると、HAが自動で「新しいデバイスが見つかりました」って通知してくれる。あとは「設定」→「デバイスとサービス」から見つかったデバイスを追加するだけ。
エンティティが全部自動で作成されてるから、ダッシュボードにカードを追加するのも超簡単。「エンティティで」タブから追加したいセンサーを選ぶだけで、いい感じのカードがプレビューされる。ポチッと追加すれば、完成。
まとめ:もうArduinoには戻れないかも
正直、Arduinoでゼロからやってたのが嘘みたいに楽だった。I2C接続でちょっとだけつまづいたけど、それ以外は本当にスムーズ。YAMLを数行書くだけで、複雑なセンサーの値をHAに統合できるESPHomeのエコシステムは、本当に強力だと思う。
スマートホームで「あれ測りたいな」「これ自動化したいな」って思ったときに、面倒なプログラミングをすっ飛ばして、すぐ形にできるのはめちゃくちゃ楽しい。もし同じようにセンサー遊びをしてる人がいたら、ESPHome、マジでおすすめ。
…さて、次は何のセンサーを繋いでみようかな。みんなは他にどんなセンサー使ってる?おすすめあったらぜひ教えて!
