ESP32-C2 + MicroPython + MQTT 完美接入 Home Assistant
- 嵌入式开发
- 2025-11-22
- 144热度
- 0评论
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实体

3. Node-RED控制
3.1 node-red 更新light状态与ha实体同步

//state_topic: "demolight1/state"
//command_topic: "demolight1/command"
msg.topic ="demolight1/state"
msg.payload="ON"
return msg;
3.2 node-red通过订阅demolight1/command获取light状态

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
最后运行截图
