はじめに
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) |
配線図
実際の写真
1. 事前準備:Home Assistant側のMQTT設定
こちらの記事を参考に、Raspberry Pi上でHome AssistantとMosquitto brokerを起動しておきます。
2. ファームウェア書き込みと初期セットアップ
-
Arduino IDE(またはPlatformIO等)で以下のライブラリを導入します。
- ArduinoJson (v7)
- PubSubClient(Nick O'Leary氏)
- Adafruit BME280 / MPU6050 / SSD1306 / VL53L1X(使用しないセンサもすべて導入してください)
-
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)
-
起動後、
ESP32IO_MQTT_<MACサフィックス>という名前のWiFi APが立ち上がるので、スマホ等から接続します(パスワード:esp32setup)。 -
ブラウザで
http://192.168.4.1/を開き、自宅WiFiのSSID/パスワードと、MQTTブローカー(Raspberry PiのIPアドレス)のホスト/ポート/ユーザー名/パスワードを入力して保存します。今回の記事では以下の設定を使用します。
-
デバイスが再起動し、WiFiとMQTTブローカーに接続します。Home Assistant側のMQTT integrationが有効であれば、この時点で自動的にデバイスと各IOエンティティが検出されます。
「設定」→「デバイスとサービス」→「統合を追加」→「MQTT」から、
ESP32IO_MQTT_XXXXXXというデバイスが追加されていることを確認します。
3. LED点灯(デジタル出力のスイッチ制御)
デジタル出力(GPIO10〜15、do/0〜do/5)はHome Assistant上で switch エンティティとして自動登録されます。
Home Assistantのデバイス詳細画面にはDO 0のエンティティが表示されます。LEDをGPIO10(do/0)に接続した場合、このDO 0をONするとLEDが点灯します。
トグルをタップするとLEDが点灯/消灯します。裏側では以下のMQTTトピックがpublish/subscribeされています。
State: esp32io/<device_id>/do/0/state
Command: esp32io/<device_id>/do/0/set
4. ボタン入力(デジタル入力のバイナリセンサー)
デジタル入力(GPIO4〜9、di/0〜di/5)は binary_sensor として登録され、ボタンの押下状態をHome Assistant上で監視できます。
Home Assistantのデバイス詳細画面にはDI 0のエンティティが表示されます。タクトスイッチをGPIO4(di/0)に接続した場合、タクトスイッチを押すとDI 0がONします。
裏側では以下のMQTTトピックがpublishされています。
State: esp32io/<device_id>/di/0/state
5. オンボードLED(NeoPixel ステータスLED)の制御
GPIO38に接続されたNeoPixelは、Home Assistant上で light(JSON schema、rgb/set)と select(LEDモード、led_mode/set)の2つのエンティティとして登録されます。
light エンティティからは色(RGB)や明るさを直接指定でき、カラーマップで選んだ色に光ります。
6. I2Cセンサー値の表示
I2C(SDA: GPIO40, SCL: GPIO41)に接続したBME280などのセンサーは、接続するだけで自動的に sensor エンティティとして登録されます(例:BME280の場合、温度・湿度・気圧の3エンティティ)。
まとめ
esp32io-mqtt-firmwareを使うことで、YAMLでの手動設定なしにESP32-S3のI/OやI2CセンサーをHome Assistantのエンティティとして扱えることが確認できました。
- LED点灯 →
switchエンティティで制御 - ボタン入力 →
binary_sensorエンティティで検知 - オンボードLED →
light/selectエンティティで制御 - I2Cセンサー値 →
sensorエンティティで自動表示
今回紹介したのは基本機能の一部で、esp32io-mqtt-firmwareにはこの他にもさまざまな機能が実装されています。詳しくはリポジトリのREADMEをご覧ください。ほかの機能についても、今後順次記事化していく予定です。
質問や不明点、「こういう使い方はできる?」といったご要望があれば、コメント欄で気軽に聞いてください。可能な範囲でお答えします。














