Midea A/C and ESPHome component - list of all known working models and manufacturers

Brand: Pioneer
Model: CB018GMFILCFHD
Market: US

Requires “Pioneer Smart-WiFi Wired Wall Thermostat Kit for CYB, UYB, and RYB systems”, TST-LCACWIFIKP, which appears to be the Midea WF-60A1. I used the smartlight.me module, but had to trim the “USB” connector on the module and cut away a significant part of the housing to get everything to fit.

2 Likes

Brand: Bosch
Model: Climate 2000 - CL2000 35 E (indoor unit) / CL2000U W 35 E (outdoor unit)
Market: IT

There is no doubt my unit is a classic Midea, 2023/24 design with Info displayed via LED on the cover of the indoor unit and with the white, long remote controller with orange back-light.

Just today, arrived the SMARTLIGHT SLWF-01pro (v.2.1) that i order from Aliexpress with a proper cable. The setup was pretty straight forward, after giving the IoT Wifi to the stick, and setup a static IP, i quickly download the docker version of HA on my unRAID NAS, quick setup, add a new device, selected ESP Home and done.

It works pretty well. But, i was expecting to see more function compared to the remote, i was thinking that having a basic model, just mean that some function could be not visible on the remote but working or available on the mini split, because i noticed that the mainboard are almost all the same between models.
For example, i don’t see the humidity sensor, i don’t see the power draw, i can’t use the Boost/ECO mode.
But maybe, there is something from with my HA setup. I would try more setup in future.

I was mostly curious to see if my mini split was compatible too with the ESP Home key.

1 Like

Brand: Ballu Discovery
Model: BSVI-09HN8
Market: RU
Year: 2024

1 Like

Just wanted to confirm this is also working with my Samsung 3.5kW aircon-unit.

Brand: Samsung
Model: AR12TXHQASIXEU (AR35 12000 BTU)
Year: 2022
Market: EU

Using the ESPhome controller USB wifi adapter - SLWF-01pro (v.2.10)(Air conditioner Wi-Fi module for Midea, Idea, Neoclima, Electrolux, Beko and many more. Model SMARTLIGHT SLWF-01pro (v.2.1))

I didn’t manage to get the toggle buttons working (Display Toggle & Swing Step). Also the following sensors are not available/showing:

  • Indoor Humidity
  • Power Usage
  • Uptime Days

Even shows the WiFi symbol:

1 Like

Hey, i also would like to get some more photos or atleast instructions as how to open up the unit. I tried removing all the screws i could see but was still not able to open it up.
@redpersian Did you ever get a reply or figure it out on your own?

Edit: i found a diffrent post from him in another thread with pictures and a guy describing how to open the Midea Real Cool 35.

Take off all visible screws of the AC unit and then pull on the back. its held in by clips and they are strong, takes a bit of force to remove. Then the Rest is pretty easy. The USB is near the top of the front, roughly where the midea logo is. i just tilted the front a bit and switched the usb sticks.

Manufacturer: Midea Comfee
Model: Eco Friendly Pro
Year: 2019 (PCB date 2018)
Market: EU

A monoblock mobile unit that comes without WiFi.

It doesn’t have the pseudo USB, but a 4-pin JST XH 2.54 connector on the display PCB:

It is not necessary to get the display PCB out. The Wifi connector is accessible after removing the rear housing of the unit. It might be hidden under a grey foam sticker.

1 Like

Manufacturer: Mirage
Model: InverterX EMC181J
Year: 2024
Market: US/MX

1 Like

Manufacturer: Kaisai
Model: Eco
Year: probably 2020
Market: EU
Outdoor unit: KEX-12KTCO
Indoor unit: KEX-12KTCI

Everything works except indoor humidity and power usage.






1 Like

Brand: Samsung
Model: AR09TXHQASIN
Year: 2022
Market: RU
using esp8266 esp12f (“hw580b” board)
reports outdoor temp

2 Likes

Brand: hOmeLabs
Model: ‎HME030356N
Year: 2022
Market: US
using esp8266 esp12f (“smartlight” board)
reports outdoor temp

  • Unit did not have USB port, only JST Headers. used dupont cables soldered to smartlight board
1 Like

Brand: Alliance
Model: FOUSI12
Year: 2018
Market: South Africa
Using SLWF-01pro by SMLIGHT, purchased from AliExpress

Unit does not have “USB” port, but a JST-XH 4 pin header

1 Like

Successfully controlling following AC:

Brand: PITSOS
Model: NEFELI PSO09VW30
Year: 2022
Market: Greece / Cyprus

Used EPS01-1S as shown in previous posts.

1 Like

Hi, Sorry I haven’t logged on to forums in a while. I used an esp8266 12f and a regulator to utilize the space they left for their module. as far the code is concerned, here is what I used for the pins.

logger:
  baud_rate: 0

uart:
  tx_pin: 1
  rx_pin: 3
  baud_rate: 9600


## IR part:
  - platform: template
    name: AC Display Toggle IR
    id: ac_display_toggle
    on_press:
      - remote_transmitter.transmit_toshiba_ac:
          rc_code_1: 0xB54AF50AA55A

it works well, just let me know if you need full yaml config.

台灣三洋速捷淨

Brand: SANLUX
Model: SAE-V41HJ
Year: 2024
Market: TW

Note: No power and humidity information



Works even without 5v-3.3v level shifter (ESP32 / ESP32c3 tested)

2 Likes

This PCB is also used on Ariston Prios 80 Trial XD0. I will come back with an update.

Can I ask how you put a switch to enable and disable follow me?
I tried with the display setting but every time it always goes back to “OFF” and the log shows [W][component:237]: Component web_server took a long time for an operation (189 ms)"
and “[W][component:238]: Components should block for at most 30 ms” every time I press it.

Another question:
How did you implement “Prevent direct blowing” ?
The esphome wiki does not have the IR code for this feature, and I have no idea what it could be.

  1. I use template switch and remember and restore switch state
  2. I recorded some functions on the infrared remote control. The functions provided by each air conditioner will be different.

Below is a snippet of my air conditioner settings for your reference

substitutions:
  device_name: air-conditioner
  friendly_name: "air conditioner"
  model_name: "SAE-V41HJ"
  min_outdoor_temperature: "-20"
  max_outdoor_temperature: "80"
  follow_me_temperature_sensor: "sensor.temperature_humidity_sensor_67c2_temperature"
  min_photoresistor_threshold: "0"
  max_photoresistor_threshold: "1000000"
  default_display_photoresistor_threshold: "14000"

packages:
  base: !include base.yaml
  board: !include board/xiao_esp32c3.yaml

esphome:
  comment: SANLUX $model_name

remote_transmitter:
  pin:
    number: GPIO7
  carrier_duty_percent: 50%

climate:
  - platform: midea
    id: midea_climate
    name: Climate
    period: 1s
    timeout: 2s
    num_attempts: 3
    autoconf: true
    beeper: true
    visual:
      min_temperature: 16 °C
      max_temperature: 30 °C
      temperature_step: 1 °C
    supported_modes:
      - FAN_ONLY
      - HEAT_COOL
      - COOL
      - HEAT
      - DRY
    custom_fan_modes:
      - SILENT
      - TURBO
    supported_presets:
      - ECO
      - BOOST
      - SLEEP
    supported_swing_modes:
      - VERTICAL
      - HORIZONTAL
      - BOTH
    outdoor_temperature:
      name: "Outdoor Temperature"
      filters:
        - lambda: |-
            if (!isnan(x) && x >= $min_outdoor_temperature && x <= $max_outdoor_temperature) {
              return x;
            }
            return NAN;

switch:
  - platform: template
    name: Beeper
    icon: mdi:volume-source
    optimistic: true
    restore_mode: RESTORE_DEFAULT_ON
    turn_on_action:
      midea_ac.beeper_on:

    turn_off_action:
      midea_ac.beeper_off:

  - platform: template
    name: "Display Switch"
    id: display_switch
    turn_on_action:
      if:
        condition:
          and:
            - lambda: return id(midea_climate).mode != CLIMATE_MODE_OFF;
            - switch.is_off: display_switch
        then:
          midea_ac.display_toggle:

    turn_off_action:
      if:
        condition:
          and:
            - lambda: return id(midea_climate).mode != CLIMATE_MODE_OFF;
            - switch.is_on: display_switch
        then:
          midea_ac.display_toggle:

  - platform: template
    name: "Follow Me"
    id: follow_me
    optimistic: true
    restore_mode: RESTORE_DEFAULT_OFF

    # Supports cool, fan only, dry modes
  - platform: template
    name: "Prevent Direct Blowing"
    id: prevent_direct_blowing
    optimistic: true
    assumed_state: true
    turn_on_action:
      if:
        condition:
          lambda: return id(midea_climate).mode != CLIMATE_MODE_OFF;
        then:
          - remote_transmitter.transmit_pronto:
              data: "0000 0073 0000 0064 009e 009f 0012 003b 0012 0013 0012 003b 0012 003a 0013 003a 0013 0013 0012 0013 0012 003b 0012 0013 0013 003a 0012 0013 0013 0013 0012 0013 0012 003b 0012 003a 0013 0013 0012 003b 0012 003a 0013 003a 0012 003b 0012 0013 0013 003a 0012 0013 0013 003a 0012 0013 0013 0013 0012 0013 0013 0012 0013 003a 0013 0013 0012 003a 0013 0013 0012 0013 0013 003a 0012 0013 0013 003a 0012 003b 0012 0013 0012 003b 0012 003a 0013 003a 0013 0013 0012 003a 0013 0013 0012 0013 0013 003a 0012 0013 0013 0013 0012 00bb 009f 009f 0012 003a 0013 0013 0012 003a 0013 003a 0013 003a 0012 0013 0013 0013 0012 003a 0013 0013 0012 003a 0013 0013 0012 0013 0013 0013 0012 003a 0013 003a 0013 0012 0013 003a 0013 003a 0012 003b 0012 003a 0013 0013 0012 003a 0013 0013 0012 003b 0012 0013 0012 0013 0013 0013 0012 0013 0013 003a 0012 0013 0013 003a 0012 0013 0013 0013 0012 003a 0013 0013 0012 003b 0012 003a 0013 0013 0012 003a 0013 003a 0013 003a 0012 0013 0013 003a 0012 0013 0013 0013 0012 003a 0013 0013 0012 0013 0013 0e4a"

    turn_off_action:
      if:
        condition:
          lambda: return id(midea_climate).mode != CLIMATE_MODE_OFF;
        then:
          - remote_transmitter.transmit_pronto:
              data: "0000 0073 0000 0064 00a1 009b 0015 0037 0014 0011 0015 0037 0015 0037 0014 0039 0014 0011 0014 0011 0015 0037 0015 0011 0014 0037 0015 0011 0014 0011 0014 0011 0015 0037 0014 0039 0014 0011 0015 0037 0014 0039 0014 0037 0015 0037 0014 0012 0013 0039 0014 0012 0014 0037 0014 0012 0013 0012 0014 0012 0014 0011 0014 0039 0013 0012 0014 0039 0013 0012 0014 0011 0014 0039 0015 0011 0014 0037 0015 0037 0014 0039 0013 0012 0014 0012 0014 0037 0015 0011 0013 0039 0015 0011 0013 0012 0015 0011 0014 0037 0015 0037 0013 00bb 00a0 009c 0014 0039 0014 0011 0014 0039 0014 0037 0015 0037 0014 0012 0014 0011 0014 0039 0014 0011 0014 0039 0014 0011 0014 0012 0013 0012 0013 003a 0013 0039 0014 0012 0013 003a 0013 0039 0014 0039 0013 003a 0014 0011 0014 0039 0013 0012 0014 0039 0013 0012 0014 0012 0013 0012 0014 0011 0014 0039 0014 0012 0013 0039 0014 0012 0013 0012 0013 003a 0013 0012 0014 0039 0013 003a 0013 0039 0014 0012 0013 0012 0014 0039 0013 0012 0014 0039 0013 0012 0014 0012 0013 0012 0014 0039 0013 003a 0013 0e4a"

sensor:
  - platform: template
    name: "Target Temperature"
    device_class: "temperature"
    state_class: "measurement"
    unit_of_measurement: °C
    icon: mdi:thermometer
    lambda: |-
      if (id(midea_climate).mode != CLIMATE_MODE_OFF) {
        return id(midea_climate).target_temperature;
      }
      return NAN;

  - platform: template
    name: "Indoor Temperature"
    device_class: "temperature"
    state_class: "measurement"
    unit_of_measurement: °C
    icon: mdi:thermometer
    lambda: return id(midea_climate).current_temperature;

  - platform: resistance
    sensor: source_sensor
    configuration: UPSTREAM
    resistor: 10kOhm
    id: photoresistor_sensor
    name: Display Photoresistor
    disabled_by_default: true
    entity_category: diagnostic
    filters:
      - clamp:
          min_value: $min_photoresistor_threshold
          max_value: $max_photoresistor_threshold
    on_value:
      - lambda: |-
          if(id(midea_climate).mode == CLIMATE_MODE_OFF){
            id(display_switch).publish_state(false);
          }else if(id(display_photoresistor_threshold).has_state() && x < id(display_photoresistor_threshold).state){
            id(display_switch).publish_state(true);
          }else{
            id(display_switch).publish_state(false);
          }

  - platform: adc
    pin: GPIO2
    id: source_sensor
    attenuation: auto
    update_interval: 1s

  - platform: homeassistant
    id: follow_me_temp
    entity_id: $follow_me_temperature_sensor
    filters:
      - throttle: 10s
      - heartbeat: 2min
      - debounce: 1s
    on_value:
      if:
        condition:
          and:
            - lambda: return id(midea_climate).mode != CLIMATE_MODE_OFF;
            - switch.is_on: follow_me
        then:
          midea_ac.follow_me:
            temperature: !lambda "return x;"
            beeper: false

number:
  - platform: template
    name: "Display Photoresistor Threshold"
    id: display_photoresistor_threshold
    icon: "mdi:alarm-light-outline"
    unit_of_measurement: "ohm"
    optimistic: true
    min_value: $min_photoresistor_threshold
    max_value: $max_photoresistor_threshold
    initial_value: $default_display_photoresistor_threshold
    restore_value: true
    step: 1
    entity_category: config

button:
  - platform: template
    name: Swing Step
    icon: mdi:tailwind
    on_press:
      if:
        condition:
          lambda: return id(midea_climate).mode != CLIMATE_MODE_OFF;
        then:
          midea_ac.swing_step:

  - platform: template
    name: Active Clean
    on_press:
      - remote_transmitter.transmit_pronto:
          data: "0000 0073 0000 0064 00a0 009c 0015 0037 0014 0011 0014 0039 0014 0039 0014 0037 0014 0012 0014 0011 0014 0039 0014 0011 0014 0039 0014 0011 0014 0013 0013 0011 0014 0039 0014 0039 0014 0011 0014 0039 0014 0037 0014 0039 0014 0039 0014 0011 0014 0039 0014 0012 0013 0039 0014 0012 0014 0011 0014 0011 0014 0012 0014 0037 0014 0012 0014 0039 0013 0012 0014 0011 0014 0039 0014 0011 0014 0012 0014 0037 0014 0039 0014 0039 0014 0039 0014 0039 0013 0012 0014 0039 0014 0037 0014 0012 0014 0011 0014 0012 0013 0012 0014 00ba 00a0 009c 0015 0037 0013 0012 0014 0039 0014 0037 0014 0039 0014 0012 0013 0012 0014 0039 0014 0011 0014 0039 0014 0011 0014 0012 0013 0013 0013 0039 0014 0037 0014 0012 0014 0039 0013 0039 0014 0039 0014 0039 0014 0011 0014 0039 0014 0011 0014 0039 0014 0011 0014 0012 0014 0011 0014 0012 0013 0039 0014 0012 0014 0037 0014 0012 0014 0012 0013 0039 0014 0011 0014 0012 0013 0039 0014 0039 0014 0039 0014 0039 0013 0039 0014 0012 0014 0037 0014 0039 0014 0012 0013 0012 0014 0011 0014 0012 0014 0e4a"

  - platform: template
    name: Dump Config
    entity_category: diagnostic
    on_press:
      lambda: |-
        id(midea_climate).dump_config();
1 Like

Thank you very much
Everything works except the display, the switch when I press it then returns to the OFF position by itself, I can’t understand why, at the moment I have no way of testing if the display actually turns off and on because the IR LED has yet to arrive at my home, but it’s a matter of a week at most.

  - platform: template
    name: "Accendi/Spegni Display"
    id: display_switch
    turn_on_action:
      if:
        condition:
          and:
            - lambda: return id(midea_climate).mode != CLIMATE_MODE_OFF;
            - switch.is_off: display_switch
        then:
          midea_ac.display_toggle:

    turn_off_action:
      if:
        condition:
          and:
            - lambda: return id(midea_climate).mode != CLIMATE_MODE_OFF;
            - switch.is_on: display_switch
        then:
          midea_ac.display_toggle:

I was thinking of adding

optimistic: true

Could this work or is it irrelevant?
In the log I find when I press the display switch I always find this:

[D][switch:012]: 'Accendi/Spegni Display' Turning ON.

OFF is never displayed in the Log

The uart communication protocol cannot know whether the display is on, nor can it only control on or off. It can only control display toggle.

I use template switches because there are additional sensor(photoresistor) that automatically recognize the display state. If you don’t need to automate turning the display on or off, you can simply use the template button to control the display.

button:
 - platform: template
   name: Display Toggle
   icon: mdi:theme-light-dark
   on_press:
      midea_ac.display_toggle:

Display switch and photoresistor sensor combination

Drilled a hole above the WIFI sign, installed a photoresistor facing the hole, and covered it with tape to avoid interference from other light sources.


The configuration part is in the previous reply.

2 Likes

I added optimistic: true to the display switch configuration and it works as it should.
I mounted the IR LED and everything works.