0
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?

はじめに

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)

配線図

image.png

実際の写真

image.png

詳細は以前の記事をご参照ください。


1. MQTTブローカーへの接続設定

Node-RED上で mqtt in / mqtt out ノードから使うMQTTブローカーの接続(サーバ)設定を1つ作成します。

項目
サーバ Mosquittoブローカーのホスト(例: 192.168.0.8
ポート 1883
プロトコル MQTT V3.1.1
自動接続 有効
キープアライブ時間 60
セッションの初期化 有効

image.png

esp32io-mqtt-firmwareは PubSubClient ライブラリを使用しており、デフォルトでMQTT V3.1.1で動作するため、Node-RED側もV3.1.1に合わせています。

デバイスの device_idESP32IO_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

image.png

  • ui_switch ノード
    • On Payload: 文字列 ON
    • Off Payload: 文字列 OFF

image.png

  • mqtt out ノード
    • サーバ: 上記で作成したMQTTブローカー接続
    • トピック: esp32io/<device_id>/do/0/set

image.png

http://<Node-REDのIP>:1880/uiに接続し、ダッシュボード上のスイッチをトグルすると、LEDが点灯/消灯します。

image.png
image.png


3. ボタン入力(デジタル入力の状態表示)

di/0 はタクトスイッチの押下状態を esp32io/<device_id>/di/0/state にpublishします(文字列 ON / OFF)。

mqtt in (di/0/state) → text

image.png

  • mqtt in ノード
    • トピック: esp32io/<device_id>/di/0/state
    • 出力: 自動判定

image.png

  • text ノード
    • Value format: {{msg.payload}}

image.png

ボタンを押すと、ダッシュボード上のテキスト表示が即座に OFFON に切り替わります。制御は行わず監視のみのシンプルな構成です。

image.png
image.png


4. I2Cセンサー値の表示

BME280の温度・湿度・気圧は、以下のトピックにそれぞれpublishされます。

esp32io/<device_id>/bme280/temp
esp32io/<device_id>/bme280/hum
esp32io/<device_id>/bme280/press

image.png

mqtt in (bme280/temp)  → gauge(温度、0〜40℃)
mqtt in (bme280/hum)   → gauge(湿度、0〜100%)
mqtt in (bme280/press) → text(気圧)

温度によってゲージの色が変わるように設定しています。使用環境で試しやすい温度に変更してください。

image.png
image.png

温度・湿度は gauge ノードでメーター表示、気圧は text ノードでそのまま数値表示にしています。ダッシュボードの各Group内でのウィジェット表示順は、Node-RED右サイドバーの「dashboard」→「配置」タブからドラッグ&ドロップで並び替えられます。

image.png

センサを温めると、温度によって色が変わることが確認できます。
image.png


5. 温度に応じたオンボードNeoPixelの色制御

ここまではHome Assistant版と同じく「監視」の範囲でしたが、ここからはNode-REDならではの制御ロジックです。BME280の温度値をトリガーに、しきい値で色を切り替えてオンボードNeoPixel(rgb/set)に反映し、ダッシュボードの温度ゲージの色と連動させます。

mqtt in (bme280/temp) → function(温度→カラーコード変換) → mqtt out (rgb/set)

image.png

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/setlight(JSON schema)としてDiscoveryに登録されているエンティティ用のcommandトピックで、statecolor(r/g/b) を持つJSONをpublishすることで色や点灯状態を制御できます。

mqtt out ノード
  サーバ: MQTTブローカー接続
  トピック: esp32io/<device_id>/rgb/set

温度がしきい値をまたぐと、NeoPixelの色が自動的に切り替わります。「センサー値を条件に別のアクチュエータを動かす」という制御の一例です。

指でセンサを温めると、NeoPixelの色が青→緑→赤と変化します。4章で試した温度ゲージの色と連動していることが確認できます。

image.png


まとめ

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ノードだけで)柔軟に組めるのが特徴だと感じました。

今回は温度としきい値による単純な色分けでしたが、複数センサーを組み合わせた条件分岐や、複数デバイスをまたいだ連携などにも応用できそうです。

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


参考リンク

0
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
0
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?