Midea branded AC’s with ESPhome (no cloud)

With the latest version of esphome, compilation fails with the following error:

/data/cache/platformio/packages/toolchain-riscv32-esp/bin/../lib/gcc/riscv32-esp-elf/13.2.0/../../../../riscv32-esp-elf/bin/ld: .pioenvs/bosch-climate-3000i/src/esphome/components/midea/air_conditioner.cpp.o: in function `esphome::midea::IrFollowMeData::IrFollowMeData(unsigned char, bool, bool)':
/data/build/bosch-climate-3000i/src/esphome/components/midea/ir_transmitter.h:28:(.text._ZN7esphome5midea14IrFollowMeDataC2Ehbb[_ZN7esphome5midea14IrFollowMeDataC5Ehbb]+0x8e): undefined reference to `esphome::midea::IrFollowMeData::MIN_TEMP_F'
/data/cache/platformio/packages/toolchain-riscv32-esp/bin/../lib/gcc/riscv32-esp-elf/13.2.0/../../../../riscv32-esp-elf/bin/ld: .pioenvs/bosch-climate-3000i/src/esphome/components/midea/air_conditioner.cpp.o: in function `unsigned char const& std::min<unsigned char>(unsigned char const&, unsigned char const&)':
/data/cache/platformio/packages/toolchain-riscv32-esp/riscv32-esp-elf/include/c++/13.2.0/bits/stl_algobase.h:240:(.text._ZN7esphome5midea14IrFollowMeDataC2Ehbb[_ZN7esphome5midea14IrFollowMeDataC5Ehbb]+0x92): undefined reference to `esphome::midea::IrFollowMeData::MIN_TEMP_F'
/data/cache/platformio/packages/toolchain-riscv32-esp/bin/../lib/gcc/riscv32-esp-elf/13.2.0/../../../../riscv32-esp-elf/bin/ld: /data/cache/platformio/packages/toolchain-riscv32-esp/riscv32-esp-elf/include/c++/13.2.0/bits/stl_algobase.h:240:(.text._ZN7esphome5midea14IrFollowMeDataC2Ehbb[_ZN7esphome5midea14IrFollowMeDataC5Ehbb]+0x98): undefined reference to `esphome::midea::IrFollowMeData::MAX_TEMP_F'
/data/cache/platformio/packages/toolchain-riscv32-esp/bin/../lib/gcc/riscv32-esp-elf/13.2.0/../../../../riscv32-esp-elf/bin/ld: /data/cache/platformio/packages/toolchain-riscv32-esp/riscv32-esp-elf/include/c++/13.2.0/bits/stl_algobase.h:239:(.text._ZN7esphome5midea14IrFollowMeDataC2Ehbb[_ZN7esphome5midea14IrFollowMeDataC5Ehbb]+0x9c): undefined reference to `esphome::midea::IrFollowMeData::MAX_TEMP_F'
collect2: error: ld returned 1 exit status
*** [.pioenvs/bosch-climate-3000i/firmware.elf] Error 1

Hey

sorry for the late reply! Yes, there is a PM system here, just click on somebodies profile pic and there you can send PMs.
And yes, I offered to send you the parts for a stick, it’s just a few Euros. PM me and we talk details.

Greetings,

Andy!

Sorry, actually can’t find it (maybe not available for new users?), can you send a DM?

PM’D you :slight_smile:

This seems to be a massive collection of attempts to control different HVAC systems so I figured I’d add my experience with a MrCool 5th gen.

I used SLWF-01PRO r2.1 with my brand new MrCool 5th gen 36K DIY minisplit and so far seems like everything works in Home Assistant. I haven’t tried using it in automations, my primary motivation here is to turn off the minisplit if the garage door is open more than 5 minutes.

The hardest thing for me was to find where the USB dongle went, the obvious place was the narrow rectangle with two wires coming out of it, but turned out the larger control panel is where the dongle goes. I needed to use a screwdriver to pry the larger cover over, and there was just barely enough room for the SLWF-001PRO to fit.

In the 5th gen 36K DIY unit there are no side tabs so I didn’t need to trim anything off of the dongle, it fits perfectly.

As soon as I connected to the dongle’s wifi on my phone a page popped up with all nearby wifi SSIDs and after picking mine and entering the password it automatically disconnected from my phone and (since I use google home) I immediately got a message that it had joined my network. I’m running the latest Home Assistant version and the SLWY-01PRO was automatically discovered and I was able to add it to my ESP Home setup (it’s my fifth device) with one click.

1 Like

Hello, I’m trying to control a Mundoclima A/C (Spanish brand based on Midea) with an ESP32 C3, based on this video:
ESP32 - Midea A/C

this is the code I use:

esphome:
  name: ac1
  friendly_name: AC Despacho

esp32:
  board: esp32-c3-devkitm-1
  framework:
    type: arduino

# Enable logging
logger:
  baud_rate: 0

# Enable Home Assistant API
api:
  encryption:
    key: 

ota:
  - platform: esphome
    password: 

wifi:
  ssid: 
  password: 
  fast_connect: true
  # Enable fallback hotspot (captive portal) in case wifi connection fails
  ap:
    ssid: "Ac1 Fallback Hotspot"
    password: 

captive_portal:

uart:
  - id: puerto_aire
    tx_pin: GPIO01
    rx_pin: GPIO03
    baud_rate: 9600

# Main settings
climate:
  - platform: midea
    name: ac_despacho         # Use a unique name.
    uart_id: puerto_aire
    period: 1s                  # Optional
    timeout: 2s                 # Optional
    num_attempts: 2             # Optional
    autoconf: true              # Autoconfigure most options.
    beeper: true                # Beep on commands.
    visual:                     # Optional. Example of visual settings override.
      min_temperature: 17 °C    # min: 17
      max_temperature: 30 °C    # max: 30
      temperature_step: 0.5 °C  # min: 0.5
    supported_modes:            # Optional. All capabilities in this section may be detected by autoconf.
      - FAN_ONLY
      - HEAT_COOL
      - COOL
      - HEAT
      - DRY
    custom_fan_modes:           # Optional
      - SILENT
      - TURBO
    supported_presets:          # Optional. All capabilities in this section may be detected by autoconf.
      - ECO
      - BOOST
      - SLEEP
    custom_presets:             # Optional. All capabilities in this section may be detected by autoconf.
      - FREEZE_PROTECTION
    supported_swing_modes:      # Optional
      - VERTICAL
      - HORIZONTAL
      - BOTH
    outdoor_temperature:        # Optional. Outdoor temperature sensor (may display incorrect values after long inactivity).
      name: Temp
    power_usage:                # Optional. Power usage sensor (only for devices that support this feature).
      name: Power
    humidity_setpoint:          # Optional. Indoor humidity sensor (only for devices that support this feature).
      name: Humidity

# Enable Web server.
web_server:
  port: 80

# Sync time with Home Assistant.
time:
  - platform: homeassistant
    id: homeassistant_time

# Text sensors with general information.
text_sensor:
  # Expose ESPHome version as sensor.
  - platform: version
    name: ac1
  # Expose WiFi information as sensors.
  - platform: wifi_info
    ip_address:
      name: ac1 IP
    ssid:
      name: ac1 SSID
    bssid:
      name: ac1 BSSID

But all I get is this on the log:

[18:21:04][I][app:149]: ESPHome version 2025.7.4 compiled on Aug  1 2025, 18:17:17
[18:21:04][C][wifi:613]: WiFi:
[18:21:04][C][wifi:434]:   Local MAC: xx:xx:xx:xx:xx
[18:21:04][C][wifi:439]:   SSID: [redacted]
[18:21:04][C][wifi:442]:   IP Address: 192.168.1.xx
[18:21:04][C][wifi:446]:   BSSID: [redacted]
[18:21:04][C][wifi:446]:   Hostname: 'ac1'
[18:21:04][C][wifi:446]:   Signal strength: -66 dB ▂▄▆█
[18:21:04][C][wifi:455]:   Channel: 11
[18:21:04][C][wifi:455]:   Subnet: 255.255.255.0
[18:21:04][C][wifi:455]:   Gateway: 192.168.1.1
[18:21:04][C][wifi:455]:   DNS1: 94.140.14.14
[18:21:04][C][wifi:455]:   DNS2: 94.140.15.15
[18:21:04][C][logger:246]: Logger:
[18:21:04][C][logger:246]:   Max Level: DEBUG
[18:21:04][C][logger:246]:   Initial Level: DEBUG
[18:21:04][C][logger:252]:   Log Baud Rate: 0
[18:21:04][C][logger:252]:   Hardware UART: USB_CDC
[18:21:04][C][logger:259]:   Task Log Buffer Size: 768
[18:21:04][C][logger:264]:   Level for 'binary_sensor': ERROR
[18:21:04][C][logger:264]:   Level for 'duty_cycle': ERROR
[18:21:04][C][logger:264]:   Level for 'light': ERROR
[18:21:04][C][logger:264]:   Level for 'sensor': ERROR
[18:21:04][C][uart.arduino_esp32:151]: UART Bus 0:
[18:21:04][C][uart.arduino_esp32:152]:   TX Pin: GPIO1
[18:21:04][C][uart.arduino_esp32:153]:   RX Pin: GPIO3
[18:21:04][C][uart.arduino_esp32:155]:   RX Buffer Size: 256
[18:21:04][C][uart.arduino_esp32:157]:   Baud Rate: 9600 baud
[18:21:04][C][uart.arduino_esp32:157]:   Data Bits: 8
[18:21:04][C][uart.arduino_esp32:157]:   Parity: NONE
[18:21:04][C][uart.arduino_esp32:157]:   Stop bits: 1
[18:21:04][C][captive_portal:099]: Captive Portal:
[18:21:04][C][midea:106]: MideaDongle:
[18:21:04][C][midea:106]:   [x] Period: 1000ms
[18:21:04][C][midea:106]:   [x] Response timeout: 2000ms
[18:21:04][C][midea:106]:   [x] Request attempts: 3
[18:21:04][W][midea:118]: Failed to get 0xB5 capabilities report. Suggest to disable it in config and manually set your appliance options.
[18:21:04][C][midea:571]: ClimateTraits:
[18:21:04][C][midea:572]:   [x] Visual settings:
[18:21:04][C][midea:572]:       - Min temperature: 17.0
[18:21:04][C][midea:572]:       - Max temperature: 30.0
[18:21:04][C][midea:572]:       - Temperature step:
[18:21:04][C][midea:572]:           Target: 0.5
[18:21:04][C][esphome.ota:073]: Over-The-Air updates:
[18:21:04][C][esphome.ota:073]:   Address: ac1.local:3232
[18:21:04][C][esphome.ota:073]:   Version: 2
[18:21:04][C][esphome.ota:080]:   Password configured
[18:21:04][C][safe_mode:018]: Safe Mode:
[18:21:04][C][safe_mode:019]:   Boot considered successful after 60 seconds
[18:21:04][C][safe_mode:019]:   Invoke after 10 boot attempts
[18:21:04][C][safe_mode:019]:   Remain for 300 seconds
[18:21:04][C][web_server.ota:224]: Web Server OTA
[18:21:04][C][api:207]: API Server:
[18:21:04][C][api:207]:   Address: ac1.local:6053
[18:21:04][C][api:212]:   Using noise encryption: YES
[18:21:04][C][mdns:122]: mDNS:
[18:21:04][C][mdns:122]:   Hostname: ac1
[18:21:05][D][ApplianceBase:139]: Response timeout...
[18:21:05][D][ApplianceBase:146]: Sending request again. Attempts left: 2...
[18:21:05][D][ApplianceBase:162]: TX: AA 21 AC 8D 00 00 00 00 00 03 41 81 00 FF 03 FF 00 02 00 00 00 00 00 00 00 00 00 00 00 00 03 00 37 A4 
[18:21:07][D][ApplianceBase:139]: Response timeout...
[18:21:07][D][ApplianceBase:146]: Sending request again. Attempts left: 1...
[18:21:07][D][ApplianceBase:162]: TX: AA 21 AC 8D 00 00 00 00 00 03 41 81 00 FF 03 FF 00 02 00 00 00 00 00 00 00 00 00 00 00 00 03 00 37 A4 
[18:21:09][D][ApplianceBase:139]: Response timeout...
[18:21:09][D][ApplianceBase:154]: Destroying the request...
[18:21:09][D][AirConditioner:177]: Enqueuing a GET_STATUS(0x41) request...
[18:21:09][D][ApplianceBase:173]: Enqueuing the request...
[18:21:09][D][ApplianceBase:075]: Getting and sending a request from the queue...
[18:21:09][D][ApplianceBase:162]: TX: AA 21 AC 8D 00 00 00 00 00 03 41 81 00 FF 03 FF 00 02 00 00 00 00 00 00 00 00 00 00 00 00 03 01 69 71 
[18:21:11][D][ApplianceBase:139]: Response timeout...
[18:21:11][D][ApplianceBase:146]: Sending request again. Attempts left: 2...
[18:21:11][D][ApplianceBase:162]: TX: AA 21 AC 8D 00 00 00 00 00 03 41 81 00 FF 03 FF 00 02 00 00 00 00 00 00 00 00 00 00 00 00 03 01 69 71 
[18:21:13][D][ApplianceBase:139]: Response timeout...
[18:21:13][D][ApplianceBase:146]: Sending request again. Attempts left: 1...
[18:21:13][D][ApplianceBase:162]: TX: AA 21 AC 8D 00 00 00 00 00 03 41 81 00 FF 03 FF 00 02 00 00 00 00 00 00 00 00 00 00 00 00 03 01 69 71 
[18:21:15][D][ApplianceBase:139]: Response timeout...
[18:21:15][D][ApplianceBase:154]: Destroying the request...
[18:21:15][D][AirConditioner:177]: Enqueuing a GET_STATUS(0x41) request...
[18:21:16][D][ApplianceBase:173]: Enqueuing the request...
[18:21:16][D][ApplianceBase:075]: Getting and sending a request from the queue...
[18:21:16][D][ApplianceBase:162]: TX: AA 21 AC 8D 00 00 00 00 00 03 41 81 00 FF 03 FF 00 02 00 00 00 00 00 00 00 00 00 00 00 00 03 02 8B 4E 
[18:21:17][D][ApplianceBase:139]: Response timeout...
[18:21:17][D][ApplianceBase:146]: Sending request again. Attempts left: 2...
[18:21:18][D][ApplianceBase:162]: TX: AA 21 AC 8D 00 00 00 00 00 03 41 81 00 FF 03 FF 00 02 00 00 00 00 00 00 00 00 00 00 00 00 03 02 8B 4E 
[18:21:20][D][ApplianceBase:139]: Response timeout...
[18:21:20][D][ApplianceBase:146]: Sending request again. Attempts left: 1...
[18:21:20][D][ApplianceBase:162]: TX: AA 21 AC 8D 00 00 00 00 00 03 41 81 00 FF 03 FF 00 02 00 00 00 00 00 00 00 00 00 00 00 00 03 02 8B 4E 
[18:21:22][D][ApplianceBase:139]: Response timeout...
[18:21:22][D][ApplianceBase:154]: Destroying the request...
[18:21:22][D][AirConditioner:177]: Enqueuing a GET_STATUS(0x41) request...
[18:21:22][D][ApplianceBase:173]: Enqueuing the request...
[18:21:22][D][ApplianceBase:075]: Getting and sending a request from the queue...
[18:21:22][D][ApplianceBase:162]: TX: AA 21 AC 8D 00 00 00 00 00 03 41 81 00 FF 03 FF 00 02 00 00 00 00 00 00 00 00 00 00 00 00 03 03 D5 03 
[18:21:23][D][AirConditioner:131]: Enqueuing a GET_POWERUSAGE(0x41) request...
[18:21:23][D][ApplianceBase:173]: Enqueuing the request...
[18:21:24][D][ApplianceBase:139]: Response timeout...
[18:21:24][D][ApplianceBase:146]: Sending request again. Attempts left: 2...
[18:21:24][D][ApplianceBase:162]: TX: AA 21 AC 8D 00 00 00 00 00 03 41 81 00 FF 03 FF 00 02 00 00 00 00 00 00 00 00 00 00 00 00 03 03 D5 03 
[18:21:26][D][ApplianceBase:139]: Response timeout...
[18:21:26][D][ApplianceBase:146]: Sending request again. Attempts left: 1...
[18:21:26][D][ApplianceBase:162]: TX: AA 21 AC 8D 00 00 00 00 00 03 41 81 00 FF 03 FF 00 02 00 00 00 00 00 00 00 00 00 00 00 00 03 03 D5 03 
[18:21:28][D][ApplianceBase:139]: Response timeout...
[18:21:28][D][ApplianceBase:154]: Destroying the request...
[18:21:28][D][ApplianceBase:075]: Getting and sending a request from the queue...
[18:21:28][D][ApplianceBase:162]: TX: AA 22 AC 8E 00 00 00 00 00 03 41 21 01 44 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 04 04 76 7C 
[18:21:30][D][ApplianceBase:139]: Response timeout...
[18:21:30][D][ApplianceBase:146]: Sending request again. Attempts left: 2...
[18:21:30][D][ApplianceBase:162]: TX: AA 22 AC 8E 00 00 00 00 00 03 41 21 01 44 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 04 04 76 7C 
[18:21:32][D][ApplianceBase:139]: Response timeout...
[18:21:32][D][ApplianceBase:146]: Sending request again. Attempts left: 1...
[18:21:32][D][ApplianceBase:162]: TX: AA 22 AC 8E 00 00 00 00 00 03 41 21 01 44 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 04 04 76 7C 
[18:21:34][D][ApplianceBase:139]: Response timeout...
[18:21:34][D][ApplianceBase:154]: Destroying the request...
[18:21:34][D][AirConditioner:177]: Enqueuing a GET_STATUS(0x41) request...
[18:21:34][D][ApplianceBase:173]: Enqueuing the request...
[18:21:34][D][ApplianceBase:075]: Getting and sending a request from the queue...
[18:21:34][D][ApplianceBase:162]: TX: AA 21 AC 8D 00 00 00 00 00 03 41 81 00 FF 03 FF 00 02 00 00 00 00 00 00 00 00 00 00 00 00 03 05 08 CE 
[18:21:36][D][ApplianceBase:139]: Response timeout...
[18:21:36][D][ApplianceBase:146]: Sending request again. Attempts left: 2...
[18:21:36][D][ApplianceBase:162]: TX: AA 21 AC 8D 00 00 00 00 00 03 41 81 00 FF 03 FF 00 02 00 00 00 00 00 00 00 00 00 00 00 00 03 05 08 CE

Any idea of what could be wrong? What could I do to make it work?

I’ve got it!
Some esp32 devices need Rx and tx inverted, so I inverted the pins by software and now it works like charm!.

1 Like

Hello,
is anybody try to change original tuya dongle (WBR3 model) for SLWF-01Pro maybe? My AC is Rotenso Teta.

Hello everyone,
I have followed the instructions in the original post, and I was able to successfully control my Midea AC split 12000 BTU Inverter from 2021 (model 42MACT12S5). The only thing that isn’t working is the power consumption measurement, but all other functions are working fine.
Thank you all!

@foxx99
What kind of Wi-Fi module is officially supported by the Teta unit? Is it OSK103/105/etc?
Could you show a photo of the display board where the Wi-Fi module is connected (both sides)?
Rotenso (Midea) often uses the same board across several models.

@mabusdogma
swap tx/rx, and/or bad level voltage converter or fried a IO in esp.
Have you tried to enable wifi via remote, usually it’s not needed, but maybe midea changed something for your model (and/or for mundoclima) …

ah, checked the vid, yeah, no voltage level translator on Tx&Rx - pretty much you might killed the IO in esp. Or your AC use protocol that esphome-midea-ac don’t recognize.

Hi. The TTL-RS485-SCM module should be connected to A+ and B-? It has to be set the HMI to 1?

I know this was ages ago, but if anyone (else) is trying to make a SLWF-01 v1.1 [esp-12e] work with IR, then mode (above) is the key. Soldered from GPIO5 to TSOP on the Midea board.

The SLWF-01 v2.1 provides a “follow me” pad on GPIO13 and does not require anything more than the pin and the carrier_duty_percent to work.

So just need to solder the wire still and the more simplified config?
ie:

remote_transmitter:
pin:
number: GPIO13
carrier_duty_percent: 100%

is this right?

Correct (at least for the SLWF-01 module) - 1 wire soldered from signal leg of the TSOP on the display pcb in the minisplit to a GPIO pin on the SLWF module.

I have both a SLWF-01 v1.1 and 2.1 on different units.

Unit with v1.1:

remote_transmitter:
  pin:
      number: GPIO5
      inverted: true
      mode: OUTPUT_OPEN_DRAIN
  carrier_duty_percent: 100%

Unit with v2.1:

remote_transmitter:
  pin: GPIO13
  carrier_duty_percent: 100%  

Can confirm that am able to turn off the LED, have not tried the follow me function as yet.
Edit: Can confirm, follow me is also working.

Factory remotes still work on both units.

1 Like

and what integration are u using this with @jamdz ? i am currently using midea air conditioner from HACS

Good day everyone. Recently acquired and adopted the SLWF-01PRO. It was a seamless adoption as an ESP device to control my Midea U-inverter window AC. I can control all climate settings on the device; however, it does expose things like “beeper” which toggling does nothing, and “power” which always shows 0W.

I’ve done some initial education on ESPHome, but I’m still very new. This dongle allowed adoption without “building” the ESP device.

Is there anything for me to do to maybe try and fix these entities? Would it involve building the device myself and flashing the dongle?

I’ve seen some “fixes” to things in this thread, but because it’s not a device in my ESP Home Builder…I can’t really change the YAML and push the update…sooo. As a newbie in this realm, I’m lost for options.

Thank you.

Greetings! @ MikeScottCAD
Some answers to your questions:

  1. You don’t need to assemble your device. This is an ideal dongle, which is specially designed for air conditioners.
  2. The firmware uses the data exchange protocol used by Midea and many other air conditioners. But the functions or sensors are displayed (and work) depending on the firmware of a particular air conditioner.
  3. In order to download your (fixed or custom) firmware, simply create a new project in ESPHome Builder and insert all the lines into it, for example from the message mabusdogma . Generate the firmware file and connect the USB - TYPE-C cable to the dongle. Flash the dongle. And you will have it in ESPHome Builder, edit and update.
    If you want to return to the factory firmware, connect the dongle via the USB - TYPE-C cable to the computer and follow this link smlight. Select the firmware version and flash the dongle.
1 Like

Thank you! Will dive down this. Thank you for the links and concise explanation

I have an ESP32-C6 and i can’t install my yaml file.
If I use ESP-IDF framwork i got error that ask to use adurino and if I use adurino framwork, it ask to use esp-idf…
How can I correct it?
Thanks