ESP32-C2 + MicroPython + MQTT 完美接入 Home Assistant

ESP32-C2 + MicroPython + MQTT 完美接入 Home Assistant(含 Node-RED 双向同步)

简介:ESP32-C2(MicroPython)通过 MQTT 控制灯并与 Home Assistant、Node-RED 完全双向同步的全流程

1.Home Assistant 添加 MQTT 手动实体写法

官方文档链接:MQTT Light - Home Assistant

编辑configuration.yaml示例如下

mqtt:
  - light:
      - name: "demolight1"
        command_topic: "demolight1/command"
        state_topic: "demolight1/state"
        payload_on: "ON"
        payload_off: "OFF"
        qos: 1
        retain: true

  - binary_sensor:
      - name: "demosensor"
        state_topic: "demosensor/state"
        payload_on: "ON"
        payload_off: "OFF"

开发者工具>检查配置 没有问题重启HA

2. 面板中添加mqtt实体

image-20251122231023943

3. Node-RED控制

3.1 node-red 更新light状态与ha实体同步

image-20251122231939173

//state_topic: "demolight1/state"
//command_topic: "demolight1/command"
msg.topic ="demolight1/state"
msg.payload="ON"
return msg;

3.2 node-red通过订阅demolight1/command获取light状态

image-20251122232439978

4. eps32-c2 micropython物理设备端示例

# ESP32-C2 完整可用的 MQTT 灯代码(2025 年最新版)
import machine
from umqtt.simple import MQTTClient
import time

# ======== 配置区 ========
SSID = "WIFI-NAME"
PASSWORD = "WIFI-PASSWORD"

MQTT_SERVER = "MQTT-BORKEN"   # HA 或 Mosquitto 或EMQX IP 
MQTT_PORT = 1883
MQTT_USER = "mqtt-user"            # ← 新增:账号
MQTT_PASS = "mqtt-password"            # ← 新增:密码
CLIENT_ID = "esp32c2_led"
COMMAND_TOPIC = b"demolight1/command"    # 要和 HA 里 command_topic 完全一样
STATE_TOPIC = b"demolight1/state"        # 要和 HA 里 state_topic 完全一样

LED_PIN = 10                    # ESP32-C2 上随便一个 GPIO
# ========================

# LED 初始化(低电平点亮常见开发板,必要时改成 1-led.value())
led = machine.Pin(LED_PIN, machine.Pin.OUT)
led.off()   # 初始关灯

# WiFi 连接
import network
wlan = network.WLAN(network.STA_IF)
wlan.active(True)
if not wlan.isconnected():
    print('Connecting to WiFi...')
    wlan.connect(SSID, PASSWORD)
    while not wlan.isconnected():
        time.sleep(1)
print('WiFi connected:', wlan.ifconfig())

# MQTT 回调函数
def sub_cb(topic, msg):
    print("收到:", topic, msg)
    if topic == COMMAND_TOPIC:
        if msg == b"ON":
            led.on() #led高电平点亮
            client.publish(STATE_TOPIC, b"ON", retain=True)#更新led状态
            print("灯已开")
        elif msg == b"OFF":
            led.off() #led低电平点亮
            client.publish(STATE_TOPIC, b"OFF", retain=True)#更新led状态
            print("灯已关")

# 连接 MQTT(带账号密码)
client = MQTTClient(CLIENT_ID, MQTT_SERVER, port=MQTT_PORT,
                    user=MQTT_USER, password=MQTT_PASS, keepalive=60)
client.set_callback(sub_cb)
print("Connecting to MQTT...")
client.connect()
print("MQTT 已连接")

# 订阅控制主题 + 发布上线状态
client.subscribe(COMMAND_TOPIC)
client.publish(STATE_TOPIC, b"ON" if led.value() else b"OFF", retain=True)
print("已订阅:", COMMAND_TOPIC)

# 主循环
while True:
    client.check_msg()    # 非阻塞检查消息
    time.sleep(0.1)       # 省电一点

eps32c2 micropytho GPIO 高电平输出就是 3.3V 低电平为 0V

官方文档Quick reference for the ESP32 — MicroPython latest documentation

最后运行截图

image-20251122233914894