mirror of
https://github.com/home-assistant/core.git
synced 2025-07-09 14:27:07 +00:00
Remove deprecated aux_heat from ecobee (#125246)
This commit is contained in:
parent
6976a66758
commit
e58cf00a96
@ -36,7 +36,6 @@ from homeassistant.helpers import entity_platform
|
|||||||
import homeassistant.helpers.config_validation as cv
|
import homeassistant.helpers.config_validation as cv
|
||||||
from homeassistant.helpers.device_registry import DeviceInfo
|
from homeassistant.helpers.device_registry import DeviceInfo
|
||||||
from homeassistant.helpers.entity_platform import AddEntitiesCallback
|
from homeassistant.helpers.entity_platform import AddEntitiesCallback
|
||||||
from homeassistant.helpers.issue_registry import IssueSeverity, async_create_issue
|
|
||||||
from homeassistant.util.unit_conversion import TemperatureConverter
|
from homeassistant.util.unit_conversion import TemperatureConverter
|
||||||
|
|
||||||
from . import EcobeeData
|
from . import EcobeeData
|
||||||
@ -387,8 +386,6 @@ class Thermostat(ClimateEntity):
|
|||||||
supported = SUPPORT_FLAGS
|
supported = SUPPORT_FLAGS
|
||||||
if self.has_humidifier_control:
|
if self.has_humidifier_control:
|
||||||
supported = supported | ClimateEntityFeature.TARGET_HUMIDITY
|
supported = supported | ClimateEntityFeature.TARGET_HUMIDITY
|
||||||
if self.has_aux_heat:
|
|
||||||
supported = supported | ClimateEntityFeature.AUX_HEAT
|
|
||||||
if len(self.hvac_modes) > 1 and HVACMode.OFF in self.hvac_modes:
|
if len(self.hvac_modes) > 1 and HVACMode.OFF in self.hvac_modes:
|
||||||
supported = (
|
supported = (
|
||||||
supported | ClimateEntityFeature.TURN_OFF | ClimateEntityFeature.TURN_ON
|
supported | ClimateEntityFeature.TURN_OFF | ClimateEntityFeature.TURN_ON
|
||||||
@ -449,11 +446,6 @@ class Thermostat(ClimateEntity):
|
|||||||
and self.settings.get("humidifierMode") == HUMIDIFIER_MANUAL_MODE
|
and self.settings.get("humidifierMode") == HUMIDIFIER_MANUAL_MODE
|
||||||
)
|
)
|
||||||
|
|
||||||
@property
|
|
||||||
def has_aux_heat(self) -> bool:
|
|
||||||
"""Return true if the ecobee has a heat pump."""
|
|
||||||
return bool(self.settings.get(HAS_HEAT_PUMP))
|
|
||||||
|
|
||||||
@property
|
@property
|
||||||
def target_humidity(self) -> int | None:
|
def target_humidity(self) -> int | None:
|
||||||
"""Return the desired humidity set point."""
|
"""Return the desired humidity set point."""
|
||||||
@ -573,46 +565,6 @@ class Thermostat(ClimateEntity):
|
|||||||
"fan_min_on_time": self.settings["fanMinOnTime"],
|
"fan_min_on_time": self.settings["fanMinOnTime"],
|
||||||
}
|
}
|
||||||
|
|
||||||
@property
|
|
||||||
def is_aux_heat(self) -> bool:
|
|
||||||
"""Return true if aux heater."""
|
|
||||||
return self.settings["hvacMode"] == ECOBEE_AUX_HEAT_ONLY
|
|
||||||
|
|
||||||
async def async_turn_aux_heat_on(self) -> None:
|
|
||||||
"""Turn auxiliary heater on."""
|
|
||||||
async_create_issue(
|
|
||||||
self.hass,
|
|
||||||
DOMAIN,
|
|
||||||
"migrate_aux_heat",
|
|
||||||
breaks_in_ha_version="2024.10.0",
|
|
||||||
is_fixable=True,
|
|
||||||
is_persistent=True,
|
|
||||||
translation_key="migrate_aux_heat",
|
|
||||||
severity=IssueSeverity.WARNING,
|
|
||||||
)
|
|
||||||
_LOGGER.debug("Setting HVAC mode to auxHeatOnly to turn on aux heat")
|
|
||||||
self._last_hvac_mode_before_aux_heat = self.hvac_mode
|
|
||||||
await self.hass.async_add_executor_job(
|
|
||||||
self.data.ecobee.set_hvac_mode, self.thermostat_index, ECOBEE_AUX_HEAT_ONLY
|
|
||||||
)
|
|
||||||
self.update_without_throttle = True
|
|
||||||
|
|
||||||
async def async_turn_aux_heat_off(self) -> None:
|
|
||||||
"""Turn auxiliary heater off."""
|
|
||||||
async_create_issue(
|
|
||||||
self.hass,
|
|
||||||
DOMAIN,
|
|
||||||
"migrate_aux_heat",
|
|
||||||
breaks_in_ha_version="2024.10.0",
|
|
||||||
is_fixable=True,
|
|
||||||
is_persistent=True,
|
|
||||||
translation_key="migrate_aux_heat",
|
|
||||||
severity=IssueSeverity.WARNING,
|
|
||||||
)
|
|
||||||
_LOGGER.debug("Setting HVAC mode to last mode to disable aux heat")
|
|
||||||
await self.async_set_hvac_mode(self._last_hvac_mode_before_aux_heat)
|
|
||||||
self.update_without_throttle = True
|
|
||||||
|
|
||||||
def set_preset_mode(self, preset_mode: str) -> None:
|
def set_preset_mode(self, preset_mode: str) -> None:
|
||||||
"""Activate a preset."""
|
"""Activate a preset."""
|
||||||
preset_mode = HASS_TO_ECOBEE_PRESET.get(preset_mode, preset_mode)
|
preset_mode = HASS_TO_ECOBEE_PRESET.get(preset_mode, preset_mode)
|
||||||
|
@ -1,24 +1,16 @@
|
|||||||
"""The test for the Ecobee thermostat module."""
|
"""The test for the Ecobee thermostat module."""
|
||||||
|
|
||||||
import copy
|
|
||||||
from http import HTTPStatus
|
from http import HTTPStatus
|
||||||
from unittest import mock
|
from unittest import mock
|
||||||
from unittest.mock import MagicMock
|
|
||||||
|
|
||||||
import pytest
|
import pytest
|
||||||
|
|
||||||
from homeassistant import const
|
from homeassistant import const
|
||||||
from homeassistant.components import climate
|
|
||||||
from homeassistant.components.climate import ClimateEntityFeature
|
from homeassistant.components.climate import ClimateEntityFeature
|
||||||
from homeassistant.components.ecobee.climate import (
|
from homeassistant.components.ecobee.climate import PRESET_AWAY_INDEFINITELY, Thermostat
|
||||||
ECOBEE_AUX_HEAT_ONLY,
|
from homeassistant.const import ATTR_SUPPORTED_FEATURES, STATE_OFF
|
||||||
PRESET_AWAY_INDEFINITELY,
|
|
||||||
Thermostat,
|
|
||||||
)
|
|
||||||
from homeassistant.const import ATTR_ENTITY_ID, ATTR_SUPPORTED_FEATURES, STATE_OFF
|
|
||||||
from homeassistant.core import HomeAssistant
|
from homeassistant.core import HomeAssistant
|
||||||
|
|
||||||
from . import GENERIC_THERMOSTAT_INFO_WITH_HEATPUMP
|
|
||||||
from .common import setup_platform
|
from .common import setup_platform
|
||||||
|
|
||||||
ENTITY_ID = "climate.ecobee"
|
ENTITY_ID = "climate.ecobee"
|
||||||
@ -111,25 +103,6 @@ async def test_aux_heat_not_supported_by_default(hass: HomeAssistant) -> None:
|
|||||||
)
|
)
|
||||||
|
|
||||||
|
|
||||||
async def test_aux_heat_supported_with_heat_pump(hass: HomeAssistant) -> None:
|
|
||||||
"""Aux Heat should be supported if thermostat has heatpump."""
|
|
||||||
mock_get_thermostat = mock.Mock()
|
|
||||||
mock_get_thermostat.return_value = GENERIC_THERMOSTAT_INFO_WITH_HEATPUMP
|
|
||||||
with mock.patch("pyecobee.Ecobee.get_thermostat", mock_get_thermostat):
|
|
||||||
await setup_platform(hass, const.Platform.CLIMATE)
|
|
||||||
state = hass.states.get(ENTITY_ID)
|
|
||||||
assert (
|
|
||||||
state.attributes.get(ATTR_SUPPORTED_FEATURES)
|
|
||||||
== ClimateEntityFeature.PRESET_MODE
|
|
||||||
| ClimateEntityFeature.FAN_MODE
|
|
||||||
| ClimateEntityFeature.TARGET_TEMPERATURE_RANGE
|
|
||||||
| ClimateEntityFeature.TARGET_TEMPERATURE
|
|
||||||
| ClimateEntityFeature.AUX_HEAT
|
|
||||||
| ClimateEntityFeature.TURN_OFF
|
|
||||||
| ClimateEntityFeature.TURN_ON
|
|
||||||
)
|
|
||||||
|
|
||||||
|
|
||||||
async def test_current_temperature(ecobee_fixture, thermostat) -> None:
|
async def test_current_temperature(ecobee_fixture, thermostat) -> None:
|
||||||
"""Test current temperature."""
|
"""Test current temperature."""
|
||||||
assert thermostat.current_temperature == 30
|
assert thermostat.current_temperature == 30
|
||||||
@ -255,29 +228,6 @@ async def test_extra_state_attributes(ecobee_fixture, thermostat) -> None:
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
async def test_is_aux_heat_on(hass: HomeAssistant) -> None:
|
|
||||||
"""Test aux heat property is only enabled for auxHeatOnly."""
|
|
||||||
mock_get_thermostat = mock.Mock()
|
|
||||||
mock_get_thermostat.return_value = copy.deepcopy(
|
|
||||||
GENERIC_THERMOSTAT_INFO_WITH_HEATPUMP
|
|
||||||
)
|
|
||||||
mock_get_thermostat.return_value["settings"]["hvacMode"] = "auxHeatOnly"
|
|
||||||
with mock.patch("pyecobee.Ecobee.get_thermostat", mock_get_thermostat):
|
|
||||||
await setup_platform(hass, const.Platform.CLIMATE)
|
|
||||||
state = hass.states.get(ENTITY_ID)
|
|
||||||
assert state.attributes[climate.ATTR_AUX_HEAT] == "on"
|
|
||||||
|
|
||||||
|
|
||||||
async def test_is_aux_heat_off(hass: HomeAssistant) -> None:
|
|
||||||
"""Test aux heat property is only enabled for auxHeatOnly."""
|
|
||||||
mock_get_thermostat = mock.Mock()
|
|
||||||
mock_get_thermostat.return_value = GENERIC_THERMOSTAT_INFO_WITH_HEATPUMP
|
|
||||||
with mock.patch("pyecobee.Ecobee.get_thermostat", mock_get_thermostat):
|
|
||||||
await setup_platform(hass, const.Platform.CLIMATE)
|
|
||||||
state = hass.states.get(ENTITY_ID)
|
|
||||||
assert state.attributes[climate.ATTR_AUX_HEAT] == "off"
|
|
||||||
|
|
||||||
|
|
||||||
async def test_set_temperature(ecobee_fixture, thermostat, data) -> None:
|
async def test_set_temperature(ecobee_fixture, thermostat, data) -> None:
|
||||||
"""Test set temperature."""
|
"""Test set temperature."""
|
||||||
# Auto -> Auto
|
# Auto -> Auto
|
||||||
@ -400,36 +350,6 @@ async def test_set_fan_mode_auto(thermostat, data) -> None:
|
|||||||
)
|
)
|
||||||
|
|
||||||
|
|
||||||
async def test_turn_aux_heat_on(hass: HomeAssistant, mock_ecobee: MagicMock) -> None:
|
|
||||||
"""Test when aux heat is set on. This must change the HVAC mode."""
|
|
||||||
mock_ecobee.get_thermostat.return_value = GENERIC_THERMOSTAT_INFO_WITH_HEATPUMP
|
|
||||||
mock_ecobee.thermostats = [GENERIC_THERMOSTAT_INFO_WITH_HEATPUMP]
|
|
||||||
await setup_platform(hass, const.Platform.CLIMATE)
|
|
||||||
await hass.services.async_call(
|
|
||||||
climate.DOMAIN,
|
|
||||||
climate.SERVICE_SET_AUX_HEAT,
|
|
||||||
{ATTR_ENTITY_ID: ENTITY_ID, climate.ATTR_AUX_HEAT: True},
|
|
||||||
blocking=True,
|
|
||||||
)
|
|
||||||
assert mock_ecobee.set_hvac_mode.call_count == 1
|
|
||||||
assert mock_ecobee.set_hvac_mode.call_args == mock.call(0, ECOBEE_AUX_HEAT_ONLY)
|
|
||||||
|
|
||||||
|
|
||||||
async def test_turn_aux_heat_off(hass: HomeAssistant, mock_ecobee: MagicMock) -> None:
|
|
||||||
"""Test when aux heat is tuned off. Must change HVAC mode back to last used."""
|
|
||||||
mock_ecobee.get_thermostat.return_value = GENERIC_THERMOSTAT_INFO_WITH_HEATPUMP
|
|
||||||
mock_ecobee.thermostats = [GENERIC_THERMOSTAT_INFO_WITH_HEATPUMP]
|
|
||||||
await setup_platform(hass, const.Platform.CLIMATE)
|
|
||||||
await hass.services.async_call(
|
|
||||||
climate.DOMAIN,
|
|
||||||
climate.SERVICE_SET_AUX_HEAT,
|
|
||||||
{ATTR_ENTITY_ID: ENTITY_ID, climate.ATTR_AUX_HEAT: False},
|
|
||||||
blocking=True,
|
|
||||||
)
|
|
||||||
assert mock_ecobee.set_hvac_mode.call_count == 1
|
|
||||||
assert mock_ecobee.set_hvac_mode.call_args == mock.call(0, "auto")
|
|
||||||
|
|
||||||
|
|
||||||
async def test_preset_indefinite_away(ecobee_fixture, thermostat) -> None:
|
async def test_preset_indefinite_away(ecobee_fixture, thermostat) -> None:
|
||||||
"""Test indefinite away showing correctly, and not as temporary away."""
|
"""Test indefinite away showing correctly, and not as temporary away."""
|
||||||
ecobee_fixture["program"]["currentClimateRef"] = "away"
|
ecobee_fixture["program"]["currentClimateRef"] = "away"
|
||||||
|
@ -3,11 +3,6 @@
|
|||||||
from http import HTTPStatus
|
from http import HTTPStatus
|
||||||
from unittest.mock import MagicMock
|
from unittest.mock import MagicMock
|
||||||
|
|
||||||
from homeassistant.components.climate import (
|
|
||||||
ATTR_AUX_HEAT,
|
|
||||||
DOMAIN as CLIMATE_DOMAIN,
|
|
||||||
SERVICE_SET_AUX_HEAT,
|
|
||||||
)
|
|
||||||
from homeassistant.components.ecobee import DOMAIN
|
from homeassistant.components.ecobee import DOMAIN
|
||||||
from homeassistant.components.notify import DOMAIN as NOTIFY_DOMAIN
|
from homeassistant.components.notify import DOMAIN as NOTIFY_DOMAIN
|
||||||
from homeassistant.components.repairs.issue_handler import (
|
from homeassistant.components.repairs.issue_handler import (
|
||||||
@ -17,7 +12,6 @@ from homeassistant.components.repairs.websocket_api import (
|
|||||||
RepairsFlowIndexView,
|
RepairsFlowIndexView,
|
||||||
RepairsFlowResourceView,
|
RepairsFlowResourceView,
|
||||||
)
|
)
|
||||||
from homeassistant.const import ATTR_ENTITY_ID
|
|
||||||
from homeassistant.core import HomeAssistant
|
from homeassistant.core import HomeAssistant
|
||||||
from homeassistant.helpers import issue_registry as ir
|
from homeassistant.helpers import issue_registry as ir
|
||||||
|
|
||||||
@ -83,32 +77,3 @@ async def test_ecobee_notify_repair_flow(
|
|||||||
issue_id=f"migrate_notify_{DOMAIN}_{DOMAIN}",
|
issue_id=f"migrate_notify_{DOMAIN}_{DOMAIN}",
|
||||||
)
|
)
|
||||||
assert len(issue_registry.issues) == 0
|
assert len(issue_registry.issues) == 0
|
||||||
|
|
||||||
|
|
||||||
async def test_ecobee_aux_heat_repair_flow(
|
|
||||||
hass: HomeAssistant,
|
|
||||||
mock_ecobee: MagicMock,
|
|
||||||
hass_client: ClientSessionGenerator,
|
|
||||||
issue_registry: ir.IssueRegistry,
|
|
||||||
) -> None:
|
|
||||||
"""Test the ecobee aux_heat service repair flow is triggered."""
|
|
||||||
await setup_platform(hass, CLIMATE_DOMAIN)
|
|
||||||
await async_process_repairs_platforms(hass)
|
|
||||||
|
|
||||||
ENTITY_ID = "climate.ecobee2"
|
|
||||||
|
|
||||||
# Simulate legacy service being used
|
|
||||||
assert hass.services.has_service(CLIMATE_DOMAIN, SERVICE_SET_AUX_HEAT)
|
|
||||||
await hass.services.async_call(
|
|
||||||
CLIMATE_DOMAIN,
|
|
||||||
SERVICE_SET_AUX_HEAT,
|
|
||||||
{ATTR_ENTITY_ID: ENTITY_ID, ATTR_AUX_HEAT: True},
|
|
||||||
blocking=True,
|
|
||||||
)
|
|
||||||
|
|
||||||
# Assert the issue is present
|
|
||||||
assert issue_registry.async_get_issue(
|
|
||||||
domain="ecobee",
|
|
||||||
issue_id="migrate_aux_heat",
|
|
||||||
)
|
|
||||||
assert len(issue_registry.issues) == 1
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user