Mitsubishi MELCloud / MELCloud Home: external room-temperature control for better AUTO mode


I wanted to share a setup that may save other Mitsubishi / MELCloud users some trial and error.

I use Mitsubishi Electric air conditioners with Home Assistant. The project now contains examples for both:

- the legacy **MELCloud** integration
- the newer **MELCloud Home** integration

The main problem I wanted to solve is that the temperature sensor inside the Mitsubishi indoor unit does not necessarily represent the actual comfort temperature in the room.

In my setup I therefore use external room-temperature sensors as the real comfort reference.

- **Bedroom:** one external room-temperature sensor
- **Living room:** several external temperature sensors combined as a mean value

Home Assistant keeps a separate desired-room-temperature helper and compensates only the Mitsubishi target temperature.

The important point in the current MELCloud Home version is:

- **AUTO stays AUTO**
- **HEAT stays HEAT**
- **COOL stays COOL**

Home Assistant does not force mode changes during normal operation.

Instead, it applies a target-temperature offset based on the external room temperature.

For MELCloud Home AUTO mode:

```text
error = external room temperature - desired room temperature

virtual error = error * 1.5

Mitsubishi target =
Mitsubishi internal temperature - virtual error

Example:


external room temperature = 23.8 °C
desired room temperature  = 22.0 °C
Mitsubishi internal temp  = 22.0 °C

error = 1.8 °C
virtual error = 1.8 * 1.5 = 2.7 °C

target = 22.0 - 2.7 = 19.3 °C
rounded target = 19.5 °C

The Mitsubishi unit remains in native AUTO and still performs its own compressor and fan control.

For explicit HEAT or COOL, the correction factor remains 1.0:


target =
Mitsubishi internal temperature
- (external room temperature - desired room temperature)

A small neutral zone is used around the real desired room temperature:


desired ±0.25 °C

Inside this range, the artificial offset is removed so the Mitsubishi can reduce output naturally near the real room target.

The correction is limited to:


±3.0 °C

and the final target is rounded to the nearest:


0.5 °C

The current public MELCloud Home example also includes protection against duplicate cloud writes.

A normal 5-minute automation check is kept as a retry / safety check in case the cloud has not yet confirmed the requested target.

Important:

This is not a forced 5-minute MELCloud Home refresh.

The older forced homeassistant.update_entity refresh workaround is only relevant to the legacy MELCloud integration.

The newer MELCloud Home integration already performs its own regular cloud polling.

Optional horizontal swing control is also included in the public example.

When enabled, the example uses horizontal swing while the real room temperature is still clearly away from the desired value and returns the vane to centre near the target.

The public example intentionally does not include installation-specific logic such as:

  • radiator control
  • FRITZ!DECT logic
  • auxiliary electric heaters
  • weather-based heating lockouts
  • holiday logic
  • house-specific schedules
  • local network details

GitHub repository:

Current MELCloud Home public example:

melcloud_home_external_temperature_control_public.yaml

The original Mitsubishi infrared remote was not tested because I do not normally use it.

The tested control paths are:

  • Home Assistant
  • MELCloud / MELCloud Home
  • supported app controls
  • voice control

Feedback from other Mitsubishi / MELCloud Home users is very welcome, especially regarding:

  • native AUTO behavior
  • suitable offset factors
  • different Mitsubishi indoor-unit models
  • single vs multiple external room sensors
  • horizontal vane behavior
  • original IR remote synchronization
  • cloud update delays

The current AUTO factor of 1.5 is based on practical testing in one installation. It is not claimed to be an official Mitsubishi parameter and may need tuning for other rooms or units.

Update – current status, three solution paths and new AUTO + idle findings

The project has developed quite a bit since my original post.

Important: This update represents the current project status and supersedes the technical details in the original post wherever they differ.

In particular, the fixed AUTO factor of 1.5 described in the original post is no longer used in the current controller.

The GitHub repository now documents three separate solution paths for using external room-temperature sensors with Mitsubishi Electric air conditioners in Home Assistant.

The approaches are intentionally kept separately so users can choose the one that best fits their installation.


1. Legacy / simulated AUTO

This is the oldest approach.

Home Assistant uses the external room-temperature sensor(s) as the real room reference and makes the HEAT / COOL decision itself.

This can still be useful if Mitsubishi native AUTO does not behave satisfactorily in a particular installation.


2. MELCloud Home primary control with native Mitsubishi AUTO

In this version:

  • AUTO stays AUTO
  • HEAT stays HEAT
  • COOL stays COOL

Home Assistant does not normally switch between heating and cooling modes.

Instead, it compensates the Mitsubishi target temperature according to the difference between:

  • the desired room temperature
  • the external room-temperature sensor
  • the internal Mitsubishi room sensor

3. Local-primary control with MELCloud Home kept as fallback

This is now my preferred architecture.

Primary control:


Home Assistant
-> local LAN/WLAN
-> MAC-577IF2-E
-> Mitsubishi indoor unit

MELCloud Home remains available as a separate manual/fallback path.

The local Home Assistant integration used is:


pymitsubishi/homeassistant-mitsubishi

Native Mitsubishi AUTO is still preserved:


AUTO stays AUTO
HEAT stays HEAT
COOL stays COOL

Home Assistant only adjusts the device target temperature.


Current AUTO correction

The current controller uses fixed 0.5 °C correction steps:


room error <= 0.25 °C       -> 0.0 °C correction
> 0.25 to 0.75 °C           -> 0.5 °C
> 0.75 to 1.25 °C           -> 1.0 °C
> 1.25 to 1.75 °C           -> 1.5 °C
> 1.75 to 2.25 °C           -> 2.0 °C
> 2.25 to 2.75 °C           -> 2.5 °C
> 2.75 °C                    -> 3.0 °C

HEAT and COOL use the same ±0.25 °C neutral zone, but outside it use linear 1:1 compensation.

The AUTO curve has deliberately not been made more aggressive yet.


Important new finding: hvac_action

The local integration exposes the current operating state through Home Assistant hvac_action.

Typical values are:


heating
cooling
idle

This is very useful for optional auxiliary heating.

However, one important detail became clear during real testing:

AUTO + idle does not mean that the external room has reached the desired temperature.

In the local integration, idle means that the compressor is currently not operating.

It does not reliably tell us whether the room still needs heating or whether the previous AUTO phase was heating or cooling.

I observed a real case where:


desired room temperature: 22.5 °C
external room temperature: about 23.8 °C
Mitsubishi internal sensor: about 24 °C
hvac_action: idle

After some time, the Mitsubishi changed by itself from:


AUTO + idle

to:


AUTO + cooling

without Home Assistant forcing the HVAC mode to COOL.

This is an important result because it confirms that native AUTO can still make the heating/cooling decision itself after an idle period.


Updated auxiliary-heating logic

Because of that observation, AUTO + idle is no longer treated as a blanket heating-block state.

The current logic is:


HEAT
-> auxiliary heating may be allowed

AUTO + heating
-> auxiliary heating may be allowed

AUTO + idle
-> neutral state
-> external temperature conditions still decide

AUTO + cooling
-> hard block

AUTO + unclear / switching / None
-> hard block

COOL / DRY / FAN
-> hard block

OFF
-> normal auxiliary heating blocked
-> separate winter reserve may still apply

idle is therefore not interpreted as heating.

It simply no longer cancels auxiliary-heating permission automatically.

The external temperature sensors still have to prove that heating is actually required.


Why this matters in winter

Imagine the Mitsubishi internal sensor is already satisfied and the compressor goes idle, while the external room sensor is still clearly below the desired temperature.

If idle immediately removed auxiliary-heating permission:

  • the auxiliary radiator release would be cancelled
  • the 25-minute demand timer would restart
  • an electric auxiliary heater could be switched off

exactly when the colder part of the room still needs support.

With the updated logic, AUTO + idle keeps the external demand logic alive.


Auxiliary radiator behavior

The example auxiliary radiator thermostats are released only if:

  • away mode is off
  • Mitsubishi is in HEAT, or AUTO with heating / idle
  • external room temperature is at least 0.5 °C below desired
  • outdoor temperature is valid and <= 20 °C
  • outdoor temperature is not warmer than the room
  • the condition remains true for 25 minutes

When released, the example radiator target is:


desired temperature - 1.0 °C

AUTO + cooling immediately blocks the auxiliary heaters again.


Winter reserve when the Mitsubishi is OFF

The AC-OFF logic is deliberately separated from the AC-active auxiliary-heating logic.

Example behavior:


23:00–08:00
-> 18 °C night reserve

daytime
-> normally OFF

room below 16 °C
-> daytime reserve starts

reserve remains active until
-> 18 °C

The daytime reserve now also requires a valid outdoor temperature <= 20 °C.


Desired temperature is authoritative

Another important change in the current local controller:

The desired-temperature helper is now the source of truth.

Automatic Mitsubishi device-target changes are not written back into the desired-temperature helper.

This prevents race conditions and target bouncing caused by asynchronous device updates.

In other words:


desired-temperature helper = actual user intent
climate target              = compensated device target

Current status

The latest real-world test showed that Mitsubishi native AUTO can remain in idle for a while even when the external room temperature is outside the desired range, and then later switch itself to cooling.

Because of that, I am currently not changing the AUTO correction curve again.

I want to observe several more real heating / idle / cooling cycles before making the target-offset curve more aggressive.

That avoids solving a one-time transition delay by unnecessarily overcorrecting an otherwise working controller.


GitHub

The latest neutral example and the detailed technical reasoning are available in:


playtec101/home-assistant-melcloud-external-temperature-control

Relevant files:


local_primary_hvac_action_aux_heating_example.yaml
local_primary_helpers_example.yaml
LOCAL_CONTROLLER_DESIGN_NOTES.md
LOCAL_CONTROL_WITH_MELCLOUD_FALLBACK.md

Feedback from other Mitsubishi / MAC-577IF2-E users is very welcome, especially regarding:

  • AUTO -> idle -> heating
  • AUTO -> idle -> cooling
  • how long AUTO remains idle before restarting
  • internal sensor vs external room-temperature differences
  • auxiliary-heating interaction
  • different Mitsubishi indoor-unit models

The more real installations we can compare, the easier it will be to determine whether the current AUTO correction curve needs further tuning.