ESP32通过MQTT控制LED灯,接入HomeAssistant
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()
代码说明:
- 配置区域: 根据实际情况修改设备名称、传感器名称、WiFi信息、MQTT服务器信息等。
- 主题定义: 定义了控制LED灯、配置信息、状态信息等主题,方便后续使用和修改。
- Home Assistant配置信息: 定义了设备在Home Assistant中的显示名称、图标、状态主题、控制主题等信息。
- 函数定义:
do_connect(): 连接WiFi网络。sub_cb(topic, msg): MQTT消息回调函数,处理接收到的控制指令。send_led_state_to_ha(state): 发送LED灯状态给Home Assistant。main(): 主函数,程序入口。
- 主循环: 不断检查MQTT消息,并根据接收到的指令控制LED灯,同时可以添加传感器数据发送代码。
使用说明:
- 将代码烧录到ESP32开发板。
- 修改代码中的配置信息,确保与实际环境一致。
- 在Home Assistant中配置MQTT服务,并将设备添加到Home Assistant。
- 远程控制LED灯。
原文地址: https://www.cveoy.top/t/topic/ls2 著作权归作者所有。请勿转载和采集!