回到首页 返回首页
回到顶部 回到顶部
返回上一页 返回上一页

【FireBeetle 2 ESP32-C5】HomeAssistant 采集控制终端 简单

头像 无垠的广袤 2025.10.12 18 0

【FireBeetle 2 ESP32-C5】HomeAssistant 采集控制终端

本文介绍了 FireBeetle 2 ESP32-C5 开发套件接入 Home Assistant 智能家居平台,通过传感器数据采集和设备控制等项目设计,包括温湿度数据采集终端、彩色 LED 控制终端等。

ha_connect.jpg

项目介绍

Home Assistant (HA) 采集控制终端包括 传感器数据采集终端设备控制 两部分。

准备工作:包括开发板固件烧录、Thonny IDE 安装、硬件连接等;

流程图:开发板代码对应的流程图;

工程代码:包括开发板板端执行代码、 HA 平台 YAML 代码等;

工程测试:包括程序运行、数据传输、温湿度采集、效果演示等;

准备工作

ESP32-C5 开发板烧录 MicroPython 固件;

电脑安装 Thonny IDE 软件,用以调试板端程序;

电脑部署 Home Assistant 和 EMQX 平台;

详见:【FireBeetle 2 ESP32-C5】 介绍、固件上传、工程测试Home Assistant 物联网温度计 .

HA 采集终端

ESP32-C5 开发板调用 micropython 固件包含的 dht 库,通过单总线协议,读取 GPIO 连接的 DHT11 传感器模块数据;

开发板 WiFi 联网并通过 MQTT 协议上传采集的数据至 EMQX 服务器;

进一步将数据转发至 Home Assistant 智能家具平台,实现智能物联网温湿度计的项目设计。

硬件连接

ESP32-C5DHT11Note
Pin 2DataSignal
3.3VVCCPower
GNDGNDGround

流程图

flowchart_dht11_mqtt.jpg

 

工程代码

运行 Thonny IDE 并连接开发板,新建文件,添加如下代码

 

import time, network, machine, dht, ujson, uos
from umqtt.simple import MQTTClient

WIFI_SSID = "xxx"
WIFI_PW   = "xxx"
MQTT_BROKER = "192.168.1.103"   # EMQX 服务器地址
MQTT_PORT   = 1883
MQTT_USER   = "xxx" # 用户名
MQTT_PW     = "xxx" # 密码
MQTT_CLIENT = "esp32c5_dht11"
# 上报主题
TOPIC_TEMP  = b"esp/dht/temp" # 主题
TOPIC_HUMI  = b"esp/dht/humi" # 主题
TOPIC_ONL   = b"esp/dht/online"   # 遗嘱主题

led = machine.Pin(15, machine.Pin.OUT)   # 板载 LED 指示
dht11 = dht.DHT11(machine.Pin(2))

# ---------- Wi-Fi ----------
def wifi_connect():
    sta = network.WLAN(network.STA_IF)
    sta.active(True)
    sta.connect(WIFI_SSID, WIFI_PW)
    while not sta.isconnected():
        led.value(not led.value())
        time.sleep(0.5)
    led.value(0)
    print("IP:", sta.ifconfig()[0])

# ---------- MQTT ----------
def mqtt_connect():
    will = { "online": False, "ts": time.time() }
    mqtt = MQTTClient(MQTT_CLIENT, MQTT_BROKER, MQTT_PORT,
                      MQTT_USER, MQTT_PW, keepalive=60)
    mqtt.set_last_will(TOPIC_ONL, ujson.dumps(will), retain=True)
    mqtt.connect()
    # 上线通知
    mqtt.publish(TOPIC_ONL, ujson.dumps({"online": True, "ts": time.time()}), retain=True)
    return mqtt

# ---------- 主循环 ----------
wifi_connect()
mqtt = mqtt_connect()

try:
    while True:
        try:
            dht11.measure()
            t = dht11.temperature()
            h = dht11.humidity()
            print("T:", t, "°C  H:", h, "%")
            mqtt.publish(TOPIC_TEMP, str(t), retain=True)
            mqtt.publish(TOPIC_HUMI, str(h), retain=True)
        except Exception as e:
            print("DHT11/MQTT error:", e)
            time.sleep(5)
            machine.reset()
        time.sleep(10)
except KeyboardInterrupt:
    print("Ctrl+C pressed, program terminated")
    mqtt.disconnect()                       # 断开 MQTT
    led.value(0)                            # LED 熄灭

 

保存代码并运行;

终端输出开发板 ip 地址以及上传的温湿度数据;

dht11_ha_print.jpg

MQTTX 测试

使用 MQTTX 测试数据上传状态。

新建连接,输入 ip 地址、端口、用户名及密码;

添加订阅主题 esp/dht/temp 和 esp/dht/humi ;

dht11_mqttx.jpg

此时可正常接收开发板上传的温湿度数据;

接入 Home Assistant

进入 HA 主页,依次进入 设置 - 设备与服务,点击右下角的 添加集成 按钮;

搜索 MQTT 并添加,输入目标配置,包括 MQTT Broker 对应的 IP 地址及端口、用户名及密码,点击 提交 按钮;

MQTT_config.jpg

进入 HA 文件夹,修改 .../config/configuration.yaml 文件

ha_config.jpg

添加如下代码

 

mqtt:
  sensor:
    - name: "温度"
      state_topic: "esp/dht/temp"
      unit_of_measurement: "°C"
    - name: "湿度"
      state_topic: "esp/dht/humi"
      unit_of_measurement: "%"

 

进入 HA 主页,开发者工具 选项中重新加载配置,刷新页面;

yaml_config_restart.jpg

添加传感器

进入概览界面,选择右上角编辑仪表盘,进入配置界面

HA_add_sensor.jpg

点击右下角 添加卡片 选项,在弹出的窗口选择传感器卡片;

进一步选择前面 YAML 添加的温湿度设备,点击 完成 即可;

效果

网页端界面

dht11_mqtt.jpg

移动端界面

dht11_ha.gif

HA 控制终端

ESP32-C5 开发板调用 micropython 固件包含的 neopixel 库,控制 GPIO 连接的 WS2812 模块三色 LED;

开发板 WiFi 联网并结合 MQTT 协议,接收指令并反馈状态信息;

在 Home Assistant 智能家具平台添加灯光卡片,实现智能远程控制灯光的项目设计。

硬件连接

ESP32-C5WS2812Note
Pin 8DINSignal
3.3VVCCPower
GNDGNDGround

流程图

flowchart_ws2812_mqtt.jpg

 

工程代码

运行 Thonny IDE 并连接开发板,新建 ws2812_mqtt_ha.py 文件,添加如下代码

 

# WS2812 本地EMQX控制
# 控制指令 {"state": "ON", "brightness": 75, "color": {"r": 255, "g": 100, "b": 50}}
from machine import Pin
import neopixel, network, time
import ujson
from umqtt.simple import MQTTClient

# 配置
WIFI_SSID = "xxx"
WIFI_PSW = "xxx"
LED_PIN = 8
LED_NUM = 30

# EMQX配置
MQTT_HOST = "192.168.1.103"  # 本地EMQX服务器IP
MQTT_PORT = 1883
MQTT_USER = "xxx" # 用户名
MQTT_PASS = "xxx" # 密码
CLIENT_ID = "esp32_led"

# 主题
TOPIC_CMD = "led/control"    # 控制指令主题
TOPIC_STATUS = "led/status"  # 状态反馈主题

# 初始化
np = neopixel.NeoPixel(Pin(LED_PIN), LED_NUM)
np.fill((0, 0, 0))
np.write()

brightness = 80
color = (255, 255, 255)

def set_led(r, g, b, bright=100):
    """设置LED颜色和亮度"""
    factor = bright / 100.0
    r_adj = int(r * factor)
    g_adj = int(g * factor)
    b_adj = int(b * factor)
    np.fill((r_adj, g_adj, b_adj))  # GRB顺序
    np.write()
    print(f"LED: RGB({r},{g},{b}) 亮度{bright}%")

def connect_wifi():
    """连接WiFi"""
    wlan = network.WLAN(network.STA_IF)
    wlan.active(True)
    if not wlan.isconnected():
        print(f"连接WiFi: {WIFI_SSID}")
        wlan.connect(WIFI_SSID, WIFI_PSW)
        for _ in range(20):
            if wlan.isconnected():
                break
            time.sleep(0.5)
    if wlan.isconnected():
        print(f"WiFi连接成功! IP: {wlan.ifconfig()[0]}")
        return True
    return False

def mqtt_callback(topic, msg):
    """MQTT消息处理"""
    global brightness, color
    
    try:
        data = ujson.loads(msg)
        print("收到命令:", data)
        
        # 处理命令
        if 'state' in data:
            if data['state'].upper() == "ON":
                brightness = 80 if brightness == 0 else brightness
            else:
                brightness = 0
        
        if 'brightness' in data:
            brightness = max(0, min(100, data['brightness']))
        
        if 'color' in data:
            c = data['color']
            if isinstance(c, dict):
                color = (c.get('r', 255), c.get('g', 255), c.get('b', 255))
            elif isinstance(c, str) and c.startswith('#'):
                hex = c[1:]
                if len(hex) == 6:
                    color = (int(hex[0:2],16), int(hex[2:4],16), int(hex[4:6],16))
        
        # 更新LED
        set_led(color[0], color[1], color[2], brightness)
        
        # 发布状态
        publish_status()
        
    except Exception as e:
        print("命令处理错误:", e)

def publish_status():
    """发布状态"""
    current_state = "ON" if brightness > 0 else "OFF"
    status = {
        "state": current_state,
        "brightness": brightness,
        "color": {"r": color[0], "g": color[1], "b": color[2]},
        "online": True
    }
    client.publish(TOPIC_STATUS, ujson.dumps(status))
    print("状态已发布")

def connect_mqtt():
    """连接MQTT"""
    global client
    try:
        client = MQTTClient(CLIENT_ID, MQTT_HOST, MQTT_PORT, MQTT_USER, MQTT_PASS)
        client.set_callback(mqtt_callback)
        client.connect()
        client.subscribe(TOPIC_CMD)
        print(f"MQTT连接成功! 主题: {TOPIC_CMD}")
        return True
    except Exception as e:
        print(f"MQTT连接失败: {e}")
        return False

# 主程序
print("=== WS2812 EMQX控制 ===")

if connect_wifi() and connect_mqtt():
    publish_status()
    print("设备就绪,等待控制命令...")
    
    while True:
        try:
            client.check_msg()
            time.sleep(0.1)
        except Exception as e:
            print("连接异常:", e)
            time.sleep(5)
            connect_mqtt()
else:
    print("初始化失败!")

 

保存代码并运行;

终端输出开发板 ip 地址以及 WS2812 状态回传;

 

HA 配置

进入 HA 文件夹,修改 .../config/configuration.yaml 文件,添加如下代码

 

mqtt:
  light:   
    - name: "WS2812"
      schema: json
      command_topic: "led/control"
      state_topic: "led/status"
      supported_color_modes: ["rgb"]
      brightness_scale: 100
      optimistic: false
      qos: 0
      retain: false

 

进入 HA 主页,开发者工具 选项中重新加载配置,刷新网页;

指令控制

依次进入 设置 - 设备与服务 - MQTT ,点击齿轮图标进入配置界面;

输入发送和监听主题,输入控制指令 {"state": "ON", "brightness": 75, "color": {"r": 255, "g": 100, "b": 50}} ,点击 发送 按钮;

此时 WS2812 点亮,监听回传对应的参数信息;

ha_mqtt_message.jpg

添加卡片

进入概览界面,选择右上角编辑仪表盘,进入卡片编辑界面;

点击右下角 添加卡片 选项,在弹出的窗口选择 灯光 卡片;

ha_light_card_add.jpg

选择前面 YAML 添加的 WS2812 设备,点击 完成 即可;

效果

网页端界面

通过卡片主界面可实现开关控制和亮度控制;

ha_ws2812_card.jpg

通过卡片右上角的 更多 选项,可实现颜色、亮度、开关控制,具体如下

颜色控制

ha_light_color.jpg

亮度控制

ha_light_brightness.jpg

开关控制

ha_light_OFF.jpg

终端状态输出

ha_ws2812_mqtt_print.jpg

移动端测试

在 Light 卡片主界面可实现灯光的基础控制,包括开关和亮度控制,效果如下

亮度控制

ha_brightness_control.gif

开关控制

ha_switch_control.gif

在更多选项下可实现颜色、亮度、开关控制,效果如下

开关控制

ha_switch_control2.gif

亮度控制

ha_brightness_control2.gif

颜色控制

ha_color_control.gif

 

总结

本文介绍了 FireBeetle 2 ESP32-C5 开发套件接入 Home Assistant 智能家居平台,通过 DHT11 传感器数据采集和 WS2812 设备控制的项目设计,展示了该开发板的强大性能和多场景应用,为相关产品的开发设计和快速应用提供了参考。

评论

user-avatar