home-assistant/core · warning · HomeAssistantError

Mode can't be changed on slave zone {self.entity_id}

Error message

Mode can't be changed on slave zone {self.entity_id}

What it means

HomeAssistantError raised by the Airzone (local API) climate entity's async_set_hvac_mode when the user requests a mode change on a slave (non-master) zone. In an Airzone installation only the master zone of a system can change the operation mode (heat/cool/dry/fan/vent); slave zones must follow the master. The integration still sends the power-on parameter (API_ON=1) before raising, so the zone is turned on but its mode is left untouched.

Source

Thrown at homeassistant/components/airzone/climate.py:237

    async def async_set_hvac_mode(self, hvac_mode: HVACMode) -> None:
        """Set hvac mode."""
        slave_raise = False

        params = {}
        if hvac_mode == HVACMode.OFF:
            params[API_ON] = 0
        else:
            mode = HVAC_MODE_HASS_TO_LIB[hvac_mode]
            if mode != self.get_airzone_value(AZD_MODE):
                if self.get_airzone_value(AZD_MASTER):
                    params[API_MODE] = mode
                else:
                    slave_raise = True
            params[API_ON] = 1
        await self._async_update_hvac_params(params)

        if slave_raise:
            raise HomeAssistantError(
                f"Mode can't be changed on slave zone {self.entity_id}"
            )

    @override
    async def async_set_temperature(self, **kwargs: Any) -> None:
        """Set new target temperature."""
        params = {}
        if ATTR_TEMPERATURE in kwargs:
            params[API_SET_POINT] = kwargs[ATTR_TEMPERATURE]
        if ATTR_TARGET_TEMP_LOW in kwargs and ATTR_TARGET_TEMP_HIGH in kwargs:
            params[API_COOL_SET_POINT] = kwargs[ATTR_TARGET_TEMP_HIGH]
            params[API_HEAT_SET_POINT] = kwargs[ATTR_TARGET_TEMP_LOW]
        await self._async_update_hvac_params(params)

        if ATTR_HVAC_MODE in kwargs:
            await self.async_set_hvac_mode(kwargs[ATTR_HVAC_MODE])

    @callback

View on GitHub (pinned to 58a3fdb3ea)

Solutions

  1. Target only the master zone of the Airzone system when changing hvac_mode; slave zones inherit the mode.
  2. In automations, filter zones via the zone's master/slave attribute before calling climate.set_hvac_mode.
  3. For slave zones, adjust temperature setpoints instead of mode — slave zones accept setpoint changes.
  4. Wrap the call in try/except HomeAssistantError if you intentionally broadcast to all zones and want to ignore slave failures.

Example fix

# before
action:
  - service: climate.set_hvac_mode
    target:
      entity_id: all
    data:
      hvac_mode: "heat"

# after
action:
  - service: climate.set_hvac_mode
    target:
      entity_id: climate.living_room_master
    data:
      hvac_mode: "heat"
Defensive patterns

Strategy: validation

Validate before calling

# Skip slave zones before setting mode (local Airzone)
if entity.get_airzone_value(AZD_MASTER):
    await entity.async_set_hvac_mode(HVACMode.HEAT)

Type guard

def is_master_zone(entity) -> bool:
    return bool(entity.get_airzone_value(AZD_MASTER))

Try / catch

try:
    await entity.async_set_hvac_mode(mode)
except HomeAssistantError as err:
    if "slave zone" in str(err):
        _LOGGER.debug("Skipping slave zone %s", entity.entity_id)
    else:
        raise

Prevention

When it happens

Trigger: Calling the climate.set_hvac_mode action on an Airzone zone whose AZD_MASTER value is false, while the requested HVACMode maps to a library mode different from the zone's current AZD_MODE. E.g. setting hvac_mode=heat on a slave zone currently reporting mode=cool.

Common situations: Automations or dashboard cards that loop over every climate entity in an Airzone system and set the same hvac_mode on all of them; voice assistants applying a mode to a whole area; a user assuming each zone thermostat is independent.

Related errors


AI-assisted analysis of home-assistant/core@58a3fdb3ea (2026-08-14). Data as JSON: /api/errors/15343ccaeebcf394. Report an issue: GitHub.