はじめに
esp32io-mqtt-firmware は、ESP32-S3開発ボード向けに自作したMQTTベースの汎用リモートI/Oファームウェアです。
Home AssistantのMQTT Discoveryに対応しており、デバイスをMQTTブローカーに繋ぐだけで、スイッチ・バイナリセンサー・数値センサー・ライトなどが自動的にエンティティとして登録されます。
以前の記事では、Home AssistantのMQTT Discoveryによって、LED点灯やNeoPixelの色制御、ボタン状態やセンサー値の監視までをYAML不要で自動的にエンティティ化できることを紹介しました。esp32io-mqtt-firmwareはHome Assistant専用ではなく、MQTTブローカーに接続できる環境なら何でも制御できる汎用設計になっています。
そこで今回は、Home Assistantと同じMosquittoブローカーに対して、Node-REDから直接デバイスを制御・監視してみます。回路や機材は以前の記事と全く同じものを流用しています。
- デジタル出力LEDのON/OFF制御(
ui_switch+mqtt out) - デジタル入力ボタンの状態表示(
mqtt in+text) - BME280の温度に応じたオンボードNeoPixelの色制御(
mqtt in+function+mqtt out)
をNode-RED上でノーコード〜ローコードで組んだ手順をまとめます。
Node-REDサーバやMQTT BrokerをRaspberry Pi上で構築する方法はこちらにまとめています。本記事ではこの記事で構築した環境を使用しています。
使用機材
| 項目 | 内容 |
|---|---|
| マイコン | ESP32-S3 開発ボード(ESP32-S3-DevkitC-1) |
| ファームウェア | esp32io-mqtt-firmware |
| Node-RED | Raspberry Pi 4B 8GB上で動作(Docker) |
| MQTTブローカー | Mosquitto broker(Docker、Home Assistantと共用) |
| LED | デジタル出力用LED × 1個、抵抗 220Ω × 1個 |
| ボタン | タクトスイッチ × 1個 |
| I2Cセンサー | BME280(温湿度・気圧) |
回路・配線・ファームウェアの書き込み手順は以前のHome Assistant記事と完全に同じです。本記事ではNode-RED側の構築手順のみ扱います。
ピン配置(本ファームウェア固定)
| 機能 | 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. MQTTブローカーへの接続設定
Node-RED上で mqtt in / mqtt out ノードから使うMQTTブローカーの接続(サーバ)設定を1つ作成します。
| 項目 | 値 |
|---|---|
| サーバ | Mosquittoブローカーのホスト(例: 192.168.0.8) |
| ポート | 1883 |
| プロトコル | MQTT V3.1.1 |
| 自動接続 | 有効 |
| キープアライブ時間 | 60 |
| セッションの初期化 | 有効 |
esp32io-mqtt-firmwareは PubSubClient ライブラリを使用しており、デフォルトでMQTT V3.1.1で動作するため、Node-RED側もV3.1.1に合わせています。
デバイスの device_id は ESP32IO_MQTT_<MACサフィックス> の形式(例: ESP32IO_MQTT_34B584)です。ESP32IOのファームウェアを書き込むと自動で設定されるSSIDと同じです。
2. LED点灯(デジタル出力のON/OFF制御)
do/0 はcommandトピック esp32io/<device_id>/do/0/set に文字列 ON / OFF をpublishすることでLEDを制御できます。
ui_switch → mqtt out
-
ui_switchノード- On Payload: 文字列
ON - Off Payload: 文字列
OFF
- On Payload: 文字列
-
mqtt outノード- サーバ: 上記で作成したMQTTブローカー接続
- トピック:
esp32io/<device_id>/do/0/set
http://<Node-REDのIP>:1880/uiに接続し、ダッシュボード上のスイッチをトグルすると、LEDが点灯/消灯します。
3. ボタン入力(デジタル入力の状態表示)
di/0 はタクトスイッチの押下状態を esp32io/<device_id>/di/0/state にpublishします(文字列 ON / OFF)。
mqtt in (di/0/state) → text
-
mqtt inノード- トピック:
esp32io/<device_id>/di/0/state - 出力: 自動判定
- トピック:
-
textノード- Value format:
{{msg.payload}}
- Value format:
ボタンを押すと、ダッシュボード上のテキスト表示が即座に OFF → ON に切り替わります。制御は行わず監視のみのシンプルな構成です。
4. I2Cセンサー値の表示
BME280の温度・湿度・気圧は、以下のトピックにそれぞれpublishされます。
esp32io/<device_id>/bme280/temp
esp32io/<device_id>/bme280/hum
esp32io/<device_id>/bme280/press
mqtt in (bme280/temp) → gauge(温度、0〜40℃)
mqtt in (bme280/hum) → gauge(湿度、0〜100%)
mqtt in (bme280/press) → text(気圧)
温度によってゲージの色が変わるように設定しています。使用環境で試しやすい温度に変更してください。
温度・湿度は gauge ノードでメーター表示、気圧は text ノードでそのまま数値表示にしています。ダッシュボードの各Group内でのウィジェット表示順は、Node-RED右サイドバーの「dashboard」→「配置」タブからドラッグ&ドロップで並び替えられます。
センサを温めると、温度によって色が変わることが確認できます。

5. 温度に応じたオンボードNeoPixelの色制御
ここまではHome Assistant版と同じく「監視」の範囲でしたが、ここからはNode-REDならではの制御ロジックです。BME280の温度値をトリガーに、しきい値で色を切り替えてオンボードNeoPixel(rgb/set)に反映し、ダッシュボードの温度ゲージの色と連動させます。
mqtt in (bme280/temp) → function(温度→カラーコード変換) → mqtt out (rgb/set)
function ノードの中身は次のようになります(しきい値は室温に合わせて調整)。
const temp = parseFloat(msg.payload);
let color;
if (temp < 30.5) {
color = { r: 0, g: 100, b: 255 }; // 低温: 青
} else if (temp < 32) {
color = { r: 0, g: 255, b: 0 }; // 中間: 緑
} else {
color = { r: 255, g: 0, b: 0 }; // 高温: 赤
}
msg.payload = JSON.stringify({
state: "ON",
color: color
});
return msg;
rgb/set は light(JSON schema)としてDiscoveryに登録されているエンティティ用のcommandトピックで、state と color(r/g/b) を持つJSONをpublishすることで色や点灯状態を制御できます。
mqtt out ノード
サーバ: MQTTブローカー接続
トピック: esp32io/<device_id>/rgb/set
温度がしきい値をまたぐと、NeoPixelの色が自動的に切り替わります。「センサー値を条件に別のアクチュエータを動かす」という制御の一例です。
指でセンサを温めると、NeoPixelの色が青→緑→赤と変化します。4章で試した温度ゲージの色と連動していることが確認できます。
まとめ
esp32io-mqtt-firmwareは、Home Assistant専用ではなく、MQTTブローカーに接続できる環境であれば何でも制御・監視できることを、Node-REDを使って確認しました。
- LED点灯 →
ui_switch+mqtt outでON/OFF制御 - ボタン入力 →
mqtt in+textで状態表示 - I2Cセンサー値 →
mqtt in+gauge/textでダッシュボード表示 - 温度連動制御 →
functionで条件分岐しmqtt outでNeoPixelの色を変更
Home Assistantが「エンティティとして自動登録・可視化する」ことに強みがある一方、Node-REDは「センサー値を条件に別の出力を動かす」ようなロジックを、コードをほとんど書かずに(あるいは数行のfunctionノードだけで)柔軟に組めるのが特徴だと感じました。
今回は温度としきい値による単純な色分けでしたが、複数センサーを組み合わせた条件分岐や、複数デバイスをまたいだ連携などにも応用できそうです。
質問や不明点、「こういう使い方はできる?」といったご要望があれば、コメント欄で気軽に聞いてください。可能な範囲でお答えします。
参考リンク
- GitHub:https://github.com/noritama-lab/esp32io-mqtt-firmware
- ハブ記事:https://qiita.com/Noritama-Lab/items/4532265ec6197ea5deee
- 以前の記事(Home Assistant MQTT Discovery編):https://qiita.com/Noritama-Lab/items/2c3b7bda0aadf82f27a6


















