import time
import network
import ujson
from umqtt.simple import MQTTClient
from machine import Pin

# 定义全局变量
MQTT_CLIENT = None
LED = None

# ---配置区域,根据实际情况修改---
homeassistant_device_name = 'ESP32-LED'
homeassistant_device_sensor_name = 'led_light'
homeassistant_device_sensor_type = 'LED'
# ---配置区域结束---

# 主题定义
control_esp32_led_topic = f'HA-{homeassistant_device_name}/{homeassistant_device_sensor_name}/set'
homeassistant_config_topic = f'homeassistant/switch/HA/{homeassistant_device_name}-{homeassistant_device_sensor_name}/config'
homeassistant_state_topic = f'HA-{homeassistant_device_name}/{homeassistant_device_sensor_name}/state'

# Home Assistant配置信息
homeassistant_config_content = {
    'unique_id': f'HA-{homeassistant_device_name}-{homeassistant_device_sensor_name}',
    'name': homeassistant_device_sensor_type,
    'icon': 'mdi:lightbulb',
    'state_topic': homeassistant_state_topic,
    'command_topic': control_esp32_led_topic,
    'device': {
        'identifiers': homeassistant_device_name,
        'manufacturer': 'wangmingdong',
        'model': 'HA',
        'name': homeassistant_device_name,
        'sw_version': '1.0'
    }
}


def do_connect():
    '''连接WiFi网络'''
    wlan = network.WLAN(network.STA_IF)
    wlan.active(True)
    if not wlan.isconnected():
        print('正在连接WiFi...')
        wlan.connect('jxf666888', 'jxf666888')
        i = 1
        while not wlan.isconnected():
            print(f'正在连接...{i}')
            i += 1
            time.sleep(1)
    print(f'网络配置: {wlan.ifconfig()}')


def sub_cb(topic, msg):
    '''MQTT消息回调函数'''
    global MQTT_CLIENT
    print(topic, msg)
    if topic == control_esp32_led_topic.encode():
        send_led_state_to_ha(msg)


def send_led_state_to_ha(state):
    '''发送LED灯状态给Home Assistant'''
    if state == b'ON':
        MQTT_CLIENT.publish(homeassistant_state_topic, 'ON')
        LED.value(1)
    else:
        MQTT_CLIENT.publish(homeassistant_state_topic, 'OFF')
        LED.value(0)


def main():
    global MQTT_CLIENT, LED

    # 1. 连接WiFi
    do_connect()

    # 2. 创建MQTT客户端并连接
    MQTT_CLIENT = MQTTClient(homeassistant_device_name, '124.222.210.193', 1883, 'admin', 'sk7671121SH', keepalive=60)
    MQTT_CLIENT.set_callback(sub_cb)
    MQTT_CLIENT.connect()
    MQTT_CLIENT.subscribe(control_esp32_led_topic)

    time.sleep(0.5)

    # 3. 发送Home Assistant配置信息
    MQTT_CLIENT.publish(homeassistant_config_topic, ujson.dumps(homeassistant_config_content))

    # 4. 初始化LED灯
    LED = Pin(2, Pin.OUT)
    LED.value(0)
    send_led_state_to_ha(b'OFF')

    # 5. 主循环
    for i in range(1000):
        MQTT_CLIENT.check_msg()
        time.sleep(0.5)
        # 可在此添加传感器数据发送代码
        # MQTT_CLIENT.publish(homeassistant_state_topic, f'{i}')
        print(f'esp32...{i}')
        time.sleep(1)


if __name__ == '__main__':
    main()

代码说明:

  1. 配置区域: 根据实际情况修改设备名称、传感器名称、WiFi信息、MQTT服务器信息等。
  2. 主题定义: 定义了控制LED灯、配置信息、状态信息等主题,方便后续使用和修改。
  3. Home Assistant配置信息: 定义了设备在Home Assistant中的显示名称、图标、状态主题、控制主题等信息。
  4. 函数定义:
    • do_connect(): 连接WiFi网络。
    • sub_cb(topic, msg): MQTT消息回调函数,处理接收到的控制指令。
    • send_led_state_to_ha(state): 发送LED灯状态给Home Assistant。
    • main(): 主函数,程序入口。
  5. 主循环: 不断检查MQTT消息,并根据接收到的指令控制LED灯,同时可以添加传感器数据发送代码。

使用说明:

  1. 将代码烧录到ESP32开发板。
  2. 修改代码中的配置信息,确保与实际环境一致。
  3. 在Home Assistant中配置MQTT服务,并将设备添加到Home Assistant。
  4. 远程控制LED灯。
ESP32通过MQTT控制LED灯,接入HomeAssistant

原文地址: https://www.cveoy.top/t/topic/ls2 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录