3
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

YAML不要!ESP32-S3とMQTT Discoveryで作る自宅IoTデバイス(Home Assistant自動連携)

3
Last updated at Posted at 2026-07-27

はじめに

esp32io-mqtt-firmware は、ESP32-S3開発ボード向けに自作したMQTTベースの汎用リモートI/Oファームウェアです。
Home AssistantのMQTT Discoveryに対応しており、デバイスをMQTTブローカーに繋ぐだけで、スイッチ・バイナリセンサー・数値センサー・ライトなどが自動的にエンティティとして登録されます。

この記事では、以前の記事で構築したHome Assistantサーバを使用して、

  • デジタル出力によるLED点灯(スイッチ制御)
  • デジタル入力によるボタン検知
  • オンボードNeoPixel(ステータスLED)のRGB制御
  • I2Cセンサー(BME280)の値表示

を実際に試した手順をまとめます。


使用機材

項目 内容
マイコン ESP32-S3 開発ボード(ESP32-S3-DevkitC-1)
ファームウェア esp32io-mqtt-firmware
Home Assistant Raspberry Pi 4B 8GB上で動作(Docker)
MQTTブローカー Mosquitto broker(Docker)
LED デジタル出力用LED × 1個、抵抗 220Ω × 1個
ボタン タクトスイッチ × 1個
I2Cセンサー BME280(温湿度・気圧)

ピン配置(本ファームウェア固定)

機能 pin_id GPIO
Digital Input 0–5 4, 5, 6, 7, 8, 9
Digital Output 0–5 10, 11, 12, 13, 14, 15
ADC Input 0–1 1, 2
PWM Output 0–1 36, 37
ステータスLED(NeoPixel) - 38
I2C(SDA, SCL) - 40, 41
リセットボタン - 0(BOOT)

配線図

image.png

実際の写真

image.png


1. 事前準備:Home Assistant側のMQTT設定

こちらの記事を参考に、Raspberry Pi上でHome AssistantとMosquitto brokerを起動しておきます。

image.png

2. ファームウェア書き込みと初期セットアップ

  1. Arduino IDE(またはPlatformIO等)で以下のライブラリを導入します。

    • ArduinoJson (v7)
    • PubSubClient(Nick O'Leary氏)
    • Adafruit BME280 / MPU6050 / SSD1306 / VL53L1X(使用しないセンサもすべて導入してください)
  2. ESP32IO_MQTT フォルダのスケッチをESP32-S3に書き込みます。

    本記事ではESP32-S3-DevkitC-1 PCB Rev1.1を使用しています。PCB Rev1.0やサードパーティ製ボードを使う場合は、使用する基板に合わせてConfig.hの以下の部分を変更してください(サードパーティ製ボードではRGB_PINが48の場合が多いようです)。

   // --- ピンマッピング (ESP32-S3 DevKitC-1) ---
   const int DIO_IN_PINS[]   = {4, 5, 6, 7, 8, 9};
   const int DIO_OUT_PINS[]  = {10, 11, 12, 13, 14, 15};
   const int ADC_PINS[]      = {1, 2};
   const int PWM_PINS[]      = {36, 37};
   const int BOOT_BUTTON_PIN = 0;   // 内蔵Bootボタン (ファクトリーリセット用)
   const int RGB_PIN         = 38;  // 内蔵WS2812 (NeoPixel)
  1. 起動後、ESP32IO_MQTT_<MACサフィックス> という名前のWiFi APが立ち上がるので、スマホ等から接続します(パスワード: esp32setup)。

    image.png

  2. ブラウザで http://192.168.4.1/ を開き、自宅WiFiのSSID/パスワードと、MQTTブローカー(Raspberry PiのIPアドレス)のホスト/ポート/ユーザー名/パスワードを入力して保存します。

    image.png

    今回の記事では以下の設定を使用します。

    image.png

  3. デバイスが再起動し、WiFiとMQTTブローカーに接続します。Home Assistant側のMQTT integrationが有効であれば、この時点で自動的にデバイスと各IOエンティティが検出されます。

    「設定」→「デバイスとサービス」→「統合を追加」→「MQTT」から、ESP32IO_MQTT_XXXXXX というデバイスが追加されていることを確認します。

    image.png


3. LED点灯(デジタル出力のスイッチ制御)

デジタル出力(GPIO10〜15、do/0do/5)はHome Assistant上で switch エンティティとして自動登録されます。

Home Assistantのデバイス詳細画面にはDO 0のエンティティが表示されます。LEDをGPIO10(do/0)に接続した場合、このDO 0をONするとLEDが点灯します。

image.png
image.png

トグルをタップするとLEDが点灯/消灯します。裏側では以下のMQTTトピックがpublish/subscribeされています。

State:   esp32io/<device_id>/do/0/state
Command: esp32io/<device_id>/do/0/set

4. ボタン入力(デジタル入力のバイナリセンサー)

デジタル入力(GPIO4〜9、di/0di/5)は binary_sensor として登録され、ボタンの押下状態をHome Assistant上で監視できます。

Home Assistantのデバイス詳細画面にはDI 0のエンティティが表示されます。タクトスイッチをGPIO4(di/0)に接続した場合、タクトスイッチを押すとDI 0がONします。

裏側では以下のMQTTトピックがpublishされています。

State: esp32io/<device_id>/di/0/state

image.pngimage.png


5. オンボードLED(NeoPixel ステータスLED)の制御

GPIO38に接続されたNeoPixelは、Home Assistant上で light(JSON schema、rgb/set)と select(LEDモード、led_mode/set)の2つのエンティティとして登録されます。

light エンティティからは色(RGB)や明るさを直接指定でき、カラーマップで選んだ色に光ります。

image.pngimage.png


6. I2Cセンサー値の表示

I2C(SDA: GPIO40, SCL: GPIO41)に接続したBME280などのセンサーは、接続するだけで自動的に sensor エンティティとして登録されます(例:BME280の場合、温度・湿度・気圧の3エンティティ)。

image.pngimage.png


まとめ

esp32io-mqtt-firmwareを使うことで、YAMLでの手動設定なしにESP32-S3のI/OやI2CセンサーをHome Assistantのエンティティとして扱えることが確認できました。

  • LED点灯 → switch エンティティで制御
  • ボタン入力 → binary_sensor エンティティで検知
  • オンボードLED → light / select エンティティで制御
  • I2Cセンサー値 → sensor エンティティで自動表示

今回紹介したのは基本機能の一部で、esp32io-mqtt-firmwareにはこの他にもさまざまな機能が実装されています。詳しくはリポジトリのREADMEをご覧ください。ほかの機能についても、今後順次記事化していく予定です。

質問や不明点、「こういう使い方はできる?」といったご要望があれば、コメント欄で気軽に聞いてください。可能な範囲でお答えします。


参考リンク

3
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?