📟

ESPHomeを使用してHome Assistant用スマートホーム端末(ノード)を作る

に公開

概要

自宅をスマートホーム化する下記作業の続き。内容は随時アップデートする。
https://zenn.dev/kojiro/articles/4ffea280157e8c

まずは各部屋に置くスマートホーム端末(勝手にノードと命名)を作成する。

前回作成したHome Assistant PCを中心に、ESPHomeというESP32を使用したスマートホームデバイスを作るソフトウェアを使用して、各部屋用のノードを作る。

https://esphome.io/index.html

関連ページ

ESPHomeの各種機能について確認した際のノート。

ノードに欲しい機能の整理

まずは各部屋のノードに持たせたい機能を整理する。

  • センサ系
    明るさ、気温•湿度、人の検知
  • 操作系
    赤外線リモコン、部屋のスイッチ操作
  • 表示系
    LCDに時計、気温、湿度を表示
  • その他
    ボイスコントロール、NFCリーダー

※部屋のスイッチ操作は別デバイスにした方が使い勝手が良さそうなので、各部屋のスマートホーム端末とは分けて作成する。

ESPHomeアドオンのインストール

Home AssistantからESPHomeを使うには、Home AssistantのESP Homeアドオンをインストールする必要がある。

イントールガイド https://esphome.io/guides/getting_started_hassio

  1. SHOW ADD-ON ONボタンをクリック
  2. Home AssistantのURLを入力。SAVEを押す。
  3. Open Linkを押す。
  4. Home Assistantページが開いたらログインするとESPHome Device Builderが表示されるので、インストールをクリックする。
  5. ウォッチドッグとサイドバーに表示を有効にする。

ESPHomeデバイスの作成

ESPHome Device Builderを使用してESP32に書き込むソフトを作成、ESP32に書き込みを行う。

  1. サイドバーからESPHome Builderをクリック。
  2. New Deviceをクリック。
  3. このままESPHome Builderを使うか、ESPHome Webを使うかの選択が表示される。ここではContinueを選択。
  4. 「Create configuration」画面で、デバイス名とWiFiのアクセスポイント名、パスワードを入力する。
  5. 「Select your device type」画面で、デバイスの種類を選択する。ここではESP32を選択。
  6. 「Configuration created!」画面が表示されるので、インストールをクリック。
    ※Encryption keyはあとでも表示可能。
  7. 「How do you want to install living-node.yaml on your device?」画面が表示される。ここではPCとESP32を接続して書き込みたいので、Plug into this computerを選択。
  8. 「Install ESPHome via the browser」画面が表示される。Download projectが準備できるまで待つ。完了したらDownload projectをクリックしてFirmwareをダウンロード。Open ESPHome Webをクリック。
  9. ESP32をPCに接続する。
  10. 「ESP Device」画面で、CONNECTをクリック。ESP32のポートを選択する。
  11. 初回は「PREPARE FOR FIRST USE」をクリックし、書き込みを実施する。
    ※Connectingのままの場合はBootモードに入れていない可能性があるので、ESP32をブートボタンを押しながらリセットし、書き込みを実施してみる。
  12. 次にInstallをクリックし、先程ダウンロードしたFirmwareを選択、インストールをする。
  13. インストールが成功すると、Home AssistantのESPHome Builder画面でデバイスがOnlineになっている。
  14. サイドバーの設定ー>デバイスとサービスの発見に作成したデバイスが表示されるので、追加をする。
  15. 「Assign devices to area」でエリアを選択する。
  16. オーバービューに作成したESPHomeが追加されている。
    ※下記はスイッチコンポーネントを追加した状態。ON/OFFでESP32モジュール上のLEDが点灯/消灯する。

ESPHomeデバイスのカスタマイズ

ESPHomeは様々な機能に対応しており、YAMLファイルにデバイスの構成を記載することで各種機能を追加できる。

コンポーネントの一覧 https://esphome.io/components/

カスタマイズはESPHome Builderから対象のデバイスのEDITをクリックし、YAMLファイルを変更してSAVE、Installする。
デバイスが接続状態であれば、Wirelessでインストール出来る。

スイッチコンポーネント

スイッチコンポーネントは、様々な機器をON/OFFすることが出来るコンポーネント。
ここでは、ESP32モジュール上に搭載されているLED(GPIO02)をON/OFFしてみる。
GPIOの場合はGPIO Switchを使用する。

switch:
  - platform: gpio
    pin: GPIO02
    icon: "mdi:led-on"
    name: "Living Room Light"

※iconにはMaterial Design Iconsを指定できる。

I2Cバスの設定

I2Cバスを使用するには、i2cコンポーネントを用いる。
https://esphome.io/components/i2c
YAMLファイルにI2Cに使用するGPIOピンを指定する。scanが有効だとI2Cバスに接続されているデバイスをスキャンする。idは複数のI2Cバスが搭載されている時の識別用。

i2c:
  sda: GPIO04
  scl: GPIO15
  scan: true
  frequency: 100kHz
  id: bus_a

スキャンが有効な設定でインストールすると、起動ログにスキャン結果が表示される。

[03:16:22][C][i2c.arduino:071]: I2C Bus:
[03:16:22][C][i2c.arduino:072]:   SDA Pin: GPIO4
[03:16:22][C][i2c.arduino:073]:   SCL Pin: GPIO15
[03:16:22][C][i2c.arduino:074]:   Frequency: 100000 Hz
[03:16:22][C][i2c.arduino:086]:   Recovery: bus successfully recovered
[03:16:22][I][i2c.arduino:096]: Results from i2c bus scan:
[03:16:22][I][i2c.arduino:102]: Found i2c device at address 0x44

SHT3X-D温湿度センサーコンポーネントの追加

SHT3X-D温湿度コンポーネントは、SHT31-D/SHT3x/SHT85に対応する温湿度センサーのコンポーネント。
https://esphome.io/components/sensor/sht3xd

YAMLファイルに温度センサーと湿度センサーに付ける名前と、I2Cバスのスキャンで見つかったデバイスのアドレス、更新周期を記載する。

sensor:
  - platform: sht3xd
    temperature:
      name: "Living Room Temperature"
    humidity:
      name: "Living Room Humidity"
    address: 0x44
    update_interval: 60s

正常にインストールが完了すると、下記のようにログが表示される。測定インターバルは指定した60秒毎となっており、ログにも測定値が表示される。測定結果はTANITAのTT-558と近い値となっていた。

[03:32:13][C][sht3xd:049]: SHT3xD:
[03:32:13][D][sht3xd:064]:   Setup successful
[03:32:13][D][sht3xd:065]:   Serial Number: 0x**
[03:32:13][D][sht3xd:066]:   Heater Enabled: false
[03:32:13][C][sht3xd:068]:   Address: 0x44
[03:32:13][C][sht3xd:069]:   Update Interval: 60.0s
[03:32:13][C][sht3xd:071]:   Temperature 'Living Room Temperature'
[03:32:13][C][sht3xd:071]:     Device Class: 'temperature'
[03:32:14][C][sht3xd:071]:     State Class: 'measurement'
[03:32:14][C][sht3xd:071]:     Unit of Measurement: '°C'
[03:32:14][C][sht3xd:071]:     Accuracy Decimals: 1
[03:32:14][C][sht3xd:072]:   Humidity 'Living Room Humidity'
[03:32:14][C][sht3xd:072]:     Device Class: 'humidity'
[03:32:14][C][sht3xd:072]:     State Class: 'measurement'
[03:32:14][C][sht3xd:072]:     Unit of Measurement: '%'
[03:32:14][C][sht3xd:072]:     Accuracy Decimals: 1
[03:33:09][D][sht3xd:097]: Got temperature=26.98°C humidity=62.03%
[03:33:09][D][sensor:094]: 'Living Room Temperature': Sending state 26.97871 °C with 1 decimals of accuracy
[03:33:09][D][sensor:094]: 'Living Room Humidity': Sending state 62.02640 % with 1 decimals of accuracy
[03:34:09][D][sht3xd:097]: Got temperature=27.01°C humidity=62.02%
[03:34:09][D][sensor:094]: 'Living Room Temperature': Sending state 27.00809 °C with 1 decimals of accuracy
[03:34:09][D][sensor:094]: 'Living Room Humidity': Sending state 62.02029 % with 1 decimals of accuracy
[03:35:09][D][sht3xd:097]: Got temperature=27.01°C humidity=61.97%

ダッシュボードにもセンター値が自動的に追加される。

HDC1080温湿度センサーコンポーネントの追加

HDC1080に対応する温湿度センサーのコンポーネント。
HDC1080 Temperature+Humidity Sensor

YAMLファイルに温度センサーと湿度センサーに付ける名前、更新周期を記載する。

sensor:
  - platform: hdc1080
    temperature:
      name: "Living Room Temperature"
    humidity:
      name: "Living Room Humidity"
    update_interval: 60s

各ノードのデバイス一覧とYAMLコンフィグ

今回作成したリビング用ノード、寝室用ノード、作業部屋用ノードのESP32に接続したデバイスの一覧とYAMLコンフィグを記載。

デバイスの種類 リビング用ノード 寝室用ノード 作業場用ノード
明るさセンサー S13948-01SB - -
気温・湿度センサー SHT31-D(Addr:0x44) HDC1080(Addr:0x40) HDC1080(Addr:0x40)
人感センサー - - -
赤外線リモコン(送信) - - -
赤外線リモコン(受信) - - -
LCD - - -
Audio Out - - -
Audio In - - -
NFC Reader - - -

購入先:
フォトICダイオード S13948-01SB
温湿度センサー モジュール AHT25
焦電型赤外線センサー SB612B

living-node.yaml
esphome:
  name: living-node
  friendly_name: Living node

esp32:
  board: esp32dev
  framework:
    type: arduino

# Enable logging
logger:

# Enable Home Assistant API
api:
  encryption:
    key: "***"

ota:
  - platform: esphome
    password: "***"

wifi:
  ssid: !secret wifi_ssid
  password: !secret wifi_password

  # Enable fallback hotspot (captive portal) in case wifi connection fails
  ap:
    ssid: "Living-Node Fallback Hotspot"
    password: "***"

captive_portal:
    
switch:
  - platform: gpio
    pin: GPIO02
    icon: "mdi:led-on"
    name: "Living Room Light"

i2c:
  sda: GPIO04
  scl: GPIO15
  scan: true
  frequency: 100kHz
  id: bus_a

sensor:
  - platform: sht3xd
    temperature:
      name: "Living Room Temperature"
    humidity:
      name: "Living Room Humidity"
    address: 0x44
    update_interval: 60s

実現方法検討時のメモ

上記内容を実施する前に検討したメモ。

メモ

実現に必要なコントローラやセンサー部品の検討をする。特性の確認が必要な場合はいくつか試してみる。

基本構成

ノードは家のWi-Fiにリモート接続して使いたいので、技適マークがあるWi-Fi付きのコントローラーを使う。電源はUSBチャージャーから取る。

コントローラの検討

ESPHomeはESP32系、Raspberry Pi Pico(RP2040)系のコントローラに対応している。
※2025/5/14時点だとRaspberry Pi Picoは開発中扱いでPicoとPico Wのみ対応との記載。

秋月電子で見つかったコントローラ

Raspberry Pi Pico W系 1個1200円程度。

ESP32系 デバイス単体だと500円程度、DIPに変換されているものだとSeeed Studio XIAO ESP32C3が1080円。
ESP32が有望なので、以降ESP32で検討。

屋外のモニタ用にカメラ付きのESP32も発見。https://akizukidenshi.com/catalog/g/g117211/

Wi-Fiでは無いがBLEのコントローラーが550円と安いので、スイッチ操作と窓の開閉、カーテン開閉用に購入する。
スイッチ:4個、窓用:2個、予備:2個
https://akizukidenshi.com/catalog/g/g115567/

明るさセンサーの検討

明るさセンサーはADC接続のものを使う。
フォトICダイオード 560nm S13948-01SB
https://akizukidenshi.com/catalog/g/g113874/
RL=2K
CL=0.1uF
fc=1/(2PiRL*CL)=796 Hz

温湿度センサーの検討

温湿度センサーはI2C接続のものを使う。ESPHomeが対応していて購入できそうなものの一覧。
https://akizukidenshi.com/catalog/g/g116731/

デバイス 仕様 備考
SENSIRION社SHT30 -40~125°C(測定精度±0.3°C)、0~100%RH(測定精度±3%RH)
SENSIRION社SHT31 -40~125°C(測定精度±0.3°C)、0~100%RH(測定精度±2%RH)
SENSIRION社SHT35 -40~125°C(測定精度±0.2°C)、0~100%RH(測定精度±1.5%RH)
Silicon Labs社Si7021 -10~85°C(測定精度±0.4°C)、0~80%RH(測定精度±3%RH)

※SHT31とSi7021を購入。

赤外線リモコン

赤外線リモコン送信用LEDの検討

赤外線リモコン用のLEDはPWMでパルス駆動する。天井と床に設置した機器をコントロールしたいので、上下左右に光が届くよう複数個設置。個数は実験で決める。

5mm赤外LED 940nm OSI5LA5A33A-B 1 ¥20
NchパワーMOSFET 60V5A 2SK4017(Q) 1個¥30
カーボン抵抗(炭素皮膜抵抗) 1W5.1Ω 1袋100本入¥310

赤外線リモコン受信用モジュールの検討

赤外線リモコンモジュールはデジタル出力のものを使う。

赤外線リモコン受信モジュール GP1UXC41QS 1個 ¥50

カーボン抵抗(炭素皮膜抵抗) 1/6W47kΩ 1袋100本入¥100
電解コンデンサー 47μF25V105℃ ルビコンMH7 1個¥10

ディスプレイ表示の検討

ディスプレイ表示はI2CのOLEDもしくはSPIのLCDを使用する。
タッチパネルは無し。
バックライト信号はPWMで制御もしくは、ポート固定。
LCDにはSDカードスロットが搭載されているが、接続は一旦保留。

オーディオ入出力

オーディオはI2Sインタフェース経由でオーディオコーデックとマイクの2デバイスを接続する。
オーディオコーデックにはモノラルスピーカーアンプが内蔵されているxを使う。
マイクは超小型シリコンマイクモジュール SPU0414HR5H-SBを検討。

ボイスコントロール

ボイスコントロールはローカル環境で動かしたいので、HAのOllama integrationを使用する。Ollama integrationはOllamaというローカルLLMサーバと連携可能なintegration。別途ollamaサーバを立てる必要がある。

NFCリーダー

T.B.D

Discussion