# MQTT配置 - 包含OTA触发标记监听
mqtt:
id: mqtt_client
broker: "192.168.1.100"
port: 1883
username: "esphome"
password: "esphome123"
client_id: "esp32mqttota"
keepalive: 15s
reboot_timeout: 0s
# 遗嘱和在线状态
birth_message:
topic: "esp32mqttota/status"
payload: "online"
retain: true
will_message:
topic: "esp32mqttota/status"
payload: "offline"
retain: true
# MQTT连接事件
on_connect:
- logger.log: "MQTT连接成功"
- lambda: |-
ESP_LOGI("mqtt", "MQTT连接已建立,订阅OTA控制主题");
id(mqtt_client)->publish("esp32mqttota/device/status", "ready", 0, true);
// 订阅OTA控制主题
id(mqtt_client)->subscribe("esp32mqttota/ota/force", 0);
id(mqtt_client)->subscribe("esp32mqttota/ota/url", 0);
on_disconnect:
- logger.log: "MQTT连接断开"
# MQTT消息监听
on_message:
- topic: "esp32mqttota/ota/force"
then:
- lambda: |-
ESP_LOGI("mqtt", "收到OTA强制更新命令: %s", x.c_str());
if (x == "on" || x == "ON" || x == "true" || x == "1") {
ESP_LOGI("ota", "触发强制OTA更新");
id(ota_status_sensor).publish_state("准备下载");
id(mqtt_client)->publish("esp32mqttota/ota/status", "triggered_by_mqtt", 0, true);
}
- ota.http_request.flash:
url: !lambda "return id(global_ota_url);"
md5_url: !lambda "return id(global_ota_url) + ".md5";"
- logger.log: "This message should be not displayed because the device reboots"
- lambda: |-
else if (x == "off" || x == "OFF" || x == "false" || x == "0") {
ESP_LOGI("mqtt", "取消OTA更新");
id(ota_status_sensor).publish_state("已取消");
id(mqtt_client)->publish("esp32mqttota/ota/status", "cancelled", 0, true);
}
- topic: "esp32mqttota/ota/url"
then:
- lambda: |-
ESP_LOGI("mqtt", "收到OTA URL配置: %s", x.c_str());
if (x.length() > 10) {
global_ota_url = x;
ESP_LOGI("ota", "OTA URL已更新: %s", global_ota_url.c_str());
id(mqtt_client)->publish("esp32mqttota/ota/url/confirmed", x, 0, true);
} else {
ESP_LOGW("mqtt", "无效的OTA URL: %s", x.c_str());
id(mqtt_client)->publish("esp32mqttota/ota/error", "Invalid URL", 0, true);
}
# OTA更新配置
ota:
- platform: esphome
password: "ota_secure_password_123"
on_begin:
then:
- logger.log: "OTA更新开始"
- lambda: |-
ESP_LOGI("ota", "开始固件更新过程");
id(ota_status_sensor).publish_state("下载中");
id(ota_progress_sensor).publish_state(0);
id(mqtt_client)->publish("esp32mqttota/ota/status", "started", 0, true);
on_progress:
then:
- lambda: |-
int progress = (int)(x * 100);
ESP_LOGI("ota", "OTA更新进度: %d%%", progress);
id(ota_progress_sensor).publish_state(progress);
std::string progress_msg = std::to_string(progress);
id(mqtt_client)->publish("esp32mqttota/ota/progress", progress_msg, 0, true);
on_end:
then:
- logger.log: "OTA更新完成"
- lambda: |-
ESP_LOGI("ota", "OTA更新成功完成");
id(ota_status_sensor).publish_state("更新完成");
id(ota_progress_sensor).publish_state(100);
id(mqtt_client)->publish("esp32mqttota/ota/status", "completed", 0, true);
on_error:
then:
- logger.log: "OTA更新出错"
- lambda: |-
ESP_LOGE("ota", "OTA更新过程中出现错误");
id(ota_status_sensor).publish_state("更新失败");
id(mqtt_client)->publish("esp32mqttota/ota/status", "failed", 0, true);
- platform: http_request
# HTTP请求组件
http_request:
id: http_request_component
useragent: esphome/1.0
timeout: 60s
verify_ssl: false