Here is what I am thinking on doing, this is still working in progress:
substitutions:
name: midea-thermostat
friendly_name: Thermostat
esphome:
name: ${name}
friendly_name: ${friendly_name}
name_add_mac_suffix: false
min_version: 2025.11.0
external_components:
- source: github://HomeOps/ESPHome-Midea-XYE@virtual_climate
components: [midea_xye, virtual_thermostat]
refresh: 0s
esp32:
board: m5stack-atom
framework:
type: arduino
logger:
level: VERY_VERBOSE
# Enable Home Assistant API
api:
# Allow Over-The-Air updates
ota:
- platform: esphome
wifi:
ssid: !secret wifi_ssid
password: !secret wifi_password
uart:
rx_pin: GPIO22
tx_pin: GPIO19
baud_rate: 4800
data_bits: 8
stop_bits: 1
parity: NONE
debug:
direction: BOTH
dummy_receiver: false
after:
delimiter: [0x55]
sequence:
- lambda: UARTDebug::log_hex(direction, bytes, ' ');
sensor:
- platform: homeassistant
entity_id: sensor.whole_home_temperature
id: thermostat_follow_me
name: "Whole Home Temperature Sensor"
internal: true
filters:
- throttle: 10s
- heartbeat: 45s
- debounce: 1s
on_value:
midea_ac.follow_me:
temperature: !lambda "return x;"
- platform: wifi_signal
name: ${friendly_name} Wi-Fi Signal
update_interval: 60s
- platform: uptime
name: "Uptime"
id: uptime_sec
internal: true
- platform: template
name: ${friendly_name} Uptime Days
lambda: |-
return (id(uptime_sec).state/60)/60/24;
icon: mdi:clock-start
unit_of_measurement: days
update_interval: 60s
# ---------------------------------------------------------
# PRESET CONFIG VALUES (EDITABLE IN HOME ASSISTANT)
# ---------------------------------------------------------
number:
- platform: template
name: "Home Min Temp"
id: home_min
min_value: 16
max_value: 26
step: 1
initial_value: 21
optimistic: true
- platform: template
name: "Home Max Temp"
id: home_max
min_value: 17
max_value: 30
step: 1
initial_value: 23
optimistic: true
- platform: template
name: "Sleep Min Temp"
id: sleep_min
min_value: 16
max_value: 26
step: 1
initial_value: 19
optimistic: true
- platform: template
name: "Sleep Max Temp"
id: sleep_max
min_value: 17
max_value: 30
step: 1
initial_value: 21
optimistic: true
- platform: template
name: "Away Min Temp"
id: away_min
min_value: 16
max_value: 26
step: 1
initial_value: 16
optimistic: true
- platform: template
name: "Away Max Temp"
id: away_max
min_value: 17
max_value: 30
step: 1
initial_value: 25
optimistic: true
climate:
- platform: midea_xye
id: real_climate
#internal: true # Hide in HASS
name: "Hidden Midea Climate"
period: 1s
timeout: 200ms
beeper: false
use_fahrenheit: false
visual:
min_temperature: 17 °C
max_temperature: 30 °C
temperature_step: 1.0 °C
supported_modes:
- COOL
- HEAT
outdoor_temperature:
name: Outside Temp
temperature_2a:
name: Inside Coil Inlet Temp
temperature_3:
name: Outside Coil Temperature
timer_start:
name: Timer Start
timer_stop:
name: Timer Stop
error_flags:
name: Error Flags
protect_flags:
name: Protect Flags
- platform: virtual_thermostat
id: virtual_climate
name: ${friendly_name}
# REQUIRED INPUTS
room_sensor: thermostat_follow_me
real_climate: real_climate
# PRESET MAPPINGS (YAML → C++)
home_min: home_min
home_max: home_max
sleep_min: sleep_min
sleep_max: sleep_max
away_min: away_min
away_max: away_max
This implements a virtual climate device that provides auto mode and presets.
Basically moves the brain to the ESP device.






