Posted on 6 Comments

Mitsubishi Air Conditioner with Wi‑Fi using MHI‑AC‑Ctrl, ESPHome and Home Assistant

Mitsubishi airco voorzien van wifi verbinding

Last summer, I moved to a new house where air conditioners had already been installed. They are Mitsubishi Heavy Industries units, controlled via an infrared remote. Naturally, I wanted to control these air conditioners using Home Assistant over WiFi. During my search, I came across the MHI-AC-Ctrl project. Nodo-Shop turned out to sell complete kits, and there is also an ESPHome version of the MHI-AC-Ctrl project. Great! I ordered a kit for each air conditioner and got to work.

Translated with AI

This article was originally written in Dutch and translated into English using AI.

Step-by-step guide for adding your air conditioner to Home Assistant

Time needed: 1 hour

To enable WiFi control of your Mitsubishi air conditioner using Home Assistant, follow the steps below. A more detailed explanation is provided after the step-by-step guide.

  1. Check compatibility of the MHI-AC-CTRL project with your air conditioner.

    Check the list of supported devices for MHI-AC-CTRL and find the model number of your air conditioner. You’ll find the model number inside the front flap. In my case, it’s a SRK50ZS-W.

  2. Solder the components to the circuit board

    Order the ESPAC Wifi interface MHI-AC-Ctrl via Nodo-Shop. Don’t forget to order a Wemos D1 mini if you don’t already have one.

  3. Disassemble the air conditioner housing

    Unclip the air conditioner housing and locate the circuit board.

  4. Plug the MHI-AC-CTRL into the air conditioner

    Use the included connector to connect the MHI-AC-CTRL to the Mitsubishi air conditioner.

  5. Close the air conditioner housing and test

    Reassemble the housing and test the unit.

Shopping List

Check compatibility of the MHI-AC-CTRL with your air conditioner

Check the list of supported devices for MHI-AC-CTRL and locate your air conditioner’s model number. Most Mitsubishi Heavy Industries split-type air conditioners are supported. You can find the model number inside the flap. In my case, it’s an SRK50ZS-W. These units have a CNS connector header that allows connection of the official WiFi module. We take advantage of this to neatly connect our MHI-AC-CTRL.

Solder the components onto the PCB

Order the ESPAC WiFi interface MHI-AC-Ctrl from Nodo-Shop. Don’t forget to add a Wemos D1 mini to your cart if you don’t already have one. We will flash the ESPHome version of the MHI-AC-CTRL firmware onto the Wemos.

The kit includes 2 components, a cable, and a PCB. The two components need to be soldered onto the board. Pay close attention to polarity—there are clearly marked outlines on the PCB that match the correct orientation of the components. The headers supplied with the Wemos also need to be soldered onto the board. Be careful to solder everything on the correct side of the PCB.

You can now prepare the Wemos with headers. Once that’s done, you can start flashing. Connect the USB cable to the Wemos (without connecting it to the MHI-AC-CTRL board yet).

Flashing the ESPHome version of MHI-AC-CTRL

In ESPHome Builder, create a new device of type d1_mini. Paste the code below into the configuration screen, making sure to replace the placeholder values with your own secrets and encryption keys. The original example file can be found here, and corresponds to the code shown below. For convenience, you only need to change the value <<< AIRCO NAME >>> in two places.

Secrets and HTTPS

The code below makes use of a so-called secrets file. This is a separate file in ESPHome Builder where sensitive data such as your WiFi SSID and password can be stored. You can also store your OTA encryption key there. To retrieve a value from this file, you use for example: !secret ota_password. Make sure the secrets file contains a key named ota_password. You can view the secrets file by clicking on “secrets” in the top right corner of the ESPHome Builder dashboard.

Flashing an ESP via the browser only works over an HTTPS connection, so make sure you’re accessing Home Assistant via HTTPS. As an alternative, you can have ESPHome Builder compile the file, download the firmware, and flash it via the ESPHome Web Flasher.

esphome:
  name: "<<< AIRCO NAAM >>>"
  friendly_name: "<<< AIRCO NAAM >>>"
  min_version: 2024.6.0
  platformio_options:
    # Run CPU at 160Mhz to fix mhi_ac_ctrl_core.loop error: -2
    board_build.f_cpu: 160000000L

esp8266:
  board: d1_mini

logger:
  level: INFO
  baud_rate: 0

ota:
  - platform: esphome
    password: !secret ota_password

wifi:
  ssid: !secret wifi_ssid
  password: !secret wifi_password
  # use_address: 192.168.2.51

  # Enable fallback hotspot (captive portal) in case wifi connection fails
  ap:
    ssid: <<< AIRCO NAAM >>>

captive_portal:

web_server:
  

external_components:
  - source: github://ginkage/MHI-AC-Ctrl-ESPHome@master
    components: [MhiAcCtrl]

api:
  encryption:
    key: <<< Secret >>>

  reboot_timeout: 0s
  services:
    - service: set_vertical_vanes
      variables:
        position_value: int # 1-4: static positions, 5: swing, 0: unknown
      then:
        - climate.mhi.set_vertical_vanes:
            position: !lambda "return position_value;"
    - service: set_horizontal_vanes
      variables:
        position_value: int # 1-7: static positions, 8: swing, 0: unknown
      then:
        - climate.mhi.set_horizontal_vanes:
            position: !lambda "return position_value;"
    - service: set_external_room_temperature
      variables:
        temperature_value: float # temperature to set in Celsius
      then:
        - climate.mhi.set_external_room_temperature:
            temperature: !lambda "return temperature_value;"

# Version 4.0

MhiAcCtrl:
  # Only 20 (legacy) or 33 (includes 3D auto and vertical vanes) possible.
  # If you encounter mhi_ac_ctrl_core.loop error: -2 errors, change the frame_size to 20
  frame_size: 33
  initial_vertical_vanes_position: 5
  initial_horizontal_vanes_position: 8
  # Update the following to change the default room temp timeout
  room_temp_timeout: 60

button:
  - platform: restart
    name: Restart
    entity_category: diagnostic

climate:
  - platform: MhiAcCtrl
    id: <<< AIRCO NAAM >>>
    name: "<<< AIRCO NAAM >>>"
    visual:
      temperature_step:
        target_temperature: 0.5
        current_temperature: 0.1

time:
  - platform: homeassistant
    id: homeassistant_time

binary_sensor:
  - platform: MhiAcCtrl
    defrost:
      name: "Defrost"
    vanes_3d_auto_enabled:
      name: "3D Auto"

sensor:
  - platform: uptime
    name: Uptime
  - platform: wifi_signal
    name: WiFi Signal
    update_interval: 60s
  - platform: MhiAcCtrl
    outdoor_temperature:
      name: "Outdoor temperature"
    return_air_temperature:
      name: "Return air temperature"
    outdoor_unit_fan_speed:
      name: "Outdoor unit fan speed"
    indoor_unit_fan_speed:
      name: "Indoor unit fan speed"
    compressor_frequency:
      name: "Compressor frequency"
    indoor_unit_total_run_time:
      name: "Indoor unit total run time"
    compressor_total_run_time:
      name: "Compressor total run time"
    current_power:
      name: "Current power"
    energy_used:
      name: "Energy used"
    indoor_unit_thi_r1:
      name: "Indoor (U-bend) HE temp 1"
    indoor_unit_thi_r2:
      name: "Indoor (capillary) HE temp 2"
    indoor_unit_thi_r3:
      name: "Indoor (suction header) HE temp 3"
    outdoor_unit_tho_r1:
      name: "Outdoor HE temp"
    outdoor_unit_expansion_valve:
      name: "Outdoor unit exp. valve"
    outdoor_unit_discharge_pipe:
      name: "Outdoor unit discharge pipe"
    outdoor_unit_discharge_pipe_super_heat:
      name: "Outdoor unit discharge pipe super heat"
    protection_state_number:
      name: "Compressor protection code"
    error_code:
      name: "Error code"
    vanes_pos:
      name: "Vanes"
    vanesLR_pos:
      name: "Vanes Left/Right"

text_sensor:
  - platform: version
    name: ESPHome Version
  - platform: wifi_info
    ip_address:
      name: IP
    ssid:
      name: SSID
    bssid:
      name: BSSID
  - platform: MhiAcCtrl
    protection_state:
      name: "Compressor protection status"

select:
  - platform: MhiAcCtrl
    vertical_vanes:
      name: Fan Control Up Down
    horizontal_vanes:
      name: Fan Control Left Right

switch:
  - platform: MhiAcCtrl
    vanes_3d_auto:
      name: "3D Auto"

Now flash the code to the connected Wemos D1 mini using the “Install” button in ESPHome Builder.

Warning

Starting from ESPHome version 2025.3, custom components are no longer supported. Many comments below this article are about this issue, which has since been resolved as of June 2025. The code above has been updated and is now compatible with ESPHome 2025.3 and later.

Disassemble the air conditioner housing

Before you start, make sure to turn off the power. Unclip the housing of the air conditioner. This involves loosening several screws on the front — some are hidden under the flap, which also needs to be unclipped, and between the lower flaps. On the back side at the top, you can press some clips to detach the cover. You will then be left with the following situation:

Be aware that water may leak while handling the housing. In my unit, there was still some water in the drainage tray under the lower flaps.

On the side, there’s a black cover that can easily be unscrewed. This gives access to the control board we’re looking for.

Plug the MHI-AC-CTRL into the air conditioner

Locate the CNS header on the motherboard and use the provided cable to connect your MHI-AC-CTRL to the air conditioner’s control board. The plug only fits one way. Isolate the Wemos D1 mini using the casing supplied by Nodo-Shop or, as I did, with a good piece of tape (at your own risk!). Tuck the Wemos inside the black housing of the control board and screw the cover back onto the air conditioner. Reattach all other covers and screw everything back in place. Turn the power back on and check whether the air conditioner works as usual with the remote control.

Add your Mitsubishi Heavy Industries air conditioner to Home Assistant

Home Assistant should now automatically detect the new ESPHome device and add the entities.

Save money on your energy bill

Below are two screenshots showing the difference between heating with the gas boiler and heating with the air conditioner. The first screenshot clearly shows high gas costs for heating the house (between 04:00–08:00), while the second shows that it can be done much more cheaply with an air conditioner (between 05:00–08:00). In this example, the savings are already around €1, but there were mornings where heating with gas cost €3.50, while electricity was cheap and heating with the air conditioner would only have cost €0.60.

With a dynamic energy contract, you can save significantly on your energy bill through smart and simple adjustments. Curious how to get this working within Home Assistant? Then read my article about a dynamic energy contract in Home Assistant. Ready for a cheaper energy contract? Take a look at gaslicht.com or go with Frank Energie and get €50 off.

It works!

It works! You can now control your Mitsubishi Heavy Industries air conditioner via WiFi using Home Assistant, while still being able to use the regular remote control. Did it work for you too or do you have a question? Leave a comment!

You can now also use your air conditioner with automated heating automations. Heat your space based on presence, room temperature, schedule… It’s all possible with the Advanced Heating Control blueprint or the Versatile Thermostat.

Wat vond je van deze blogpost?

Klik op een ster om een beoordeling te geven!

Gemiddelde score 5 / 5. Aantal stemmen: 2

Er heeft nog niemand gestemd. Wees de eerste, het kost niets en geen registratie!

Jammer dat de post niet behulpzaam was.

Laten we deze post verbeteren!

Wat zou er beter kunnen?

6 thoughts on “Mitsubishi Air Conditioner with Wi‑Fi using MHI‑AC‑Ctrl, ESPHome and Home Assistant

  1. Voor de Nederlandse lezers: via nodo-shop kun je de boel ook voorgesoldeert bestellen. (dat vond ik wel prettig, want de laatste keer dat ik gesoldeert heb was op de middelbare school).

    Mocht je niet helemaal weten wat te bestellen dan adviseren ze je daar (volgens mij) ook graag bij. Ik had een foutje gemaakt bij mijn bestelling, en dat hebben ze keurig opgemerkt, teruggekoppeld, en geadviseerd hoe het op te lossen.

  2. Hoi, zou je mij een beetje willen helpen daar ik wat foutmeldingen krijg met de yaml?

    1. Hoi Robert,

      Wat zijn de foutmeldingen precies? Dan kijk ik mee!

      1. Op zich valt het mee en lijkt het gelukt echter de / die gebruikt wordt gaat verdwijnen in de nabije toekomst. Die staat in de yaml bij vanes.
        Is dat gewoon een tekst?

        1. Oh ja ik zie denk ik wat je bedoeld. De entity vanes left/right bevat een /. Blijkbaar mag dat binnenkort niet meer. Zo te zien is dat inmiddels in het full example opgelost door de slash te vervangen voor een spatie. https://github.com/ginkage/MHI-AC-Ctrl-ESPHome/blob/master/examples%2Ffull.yaml

          Ik zal mijn code eens updaten 😉

          Groet Wouter

          1. Yep, en de wifi ‘moet’ tegenwoordig iets bijgezet worden.
            Verder kijk ik even wat ik nog tegenkom.

Did you like this article?

This site uses Akismet to reduce spam. Learn how your comment data is processed.