mirror of
https://github.com/home-assistant/core.git
synced 2025-07-24 21:57:51 +00:00
Use scheduled current preset (if set), when setting HVAC mode in AVM Fritz!Smarthome (#126044)
* Use temperature of current preset when set fritz HVAC mode to HEAT If the HVAC mode of the Fritzbox thermostats changes from `HVACMode.OFF` to `HVAMode.HEAT`, the current preset (COMFORT / ECO) should be observed. Depending on the status of the current preset, the set temperature of comfort / eco is set as the new temperature. * fixup do not use value_scheduled_preset Co-authored-by: Michael <35783820+mib1185@users.noreply.github.com> * Add current_preset value to test_set_hvac_mode The current_preset parameter allows the mock to be set to an active preset. When setting HVACMode.HEAT, the respective temperature of the ECO/COMFORT preset should be set. * fixup Use the updated value_scheduled_preset function To distinguish which temperature should be used when setting the `HVAMode.HEAT`, `value_schedules_preset` is now used again, which has been updated since the first commit. If no schedule is active, the comfort_temperature is used. Otherwise, the respective temperature of the current preset. Co-authored-by: Michael <35783820+mib1185@users.noreply.github.com> --------- Co-authored-by: Michael <35783820+mib1185@users.noreply.github.com>
This commit is contained in:
parent
c92169cb20
commit
74931071de
@ -33,6 +33,7 @@ from .const import (
|
|||||||
from .coordinator import FritzboxConfigEntry, FritzboxDataUpdateCoordinator
|
from .coordinator import FritzboxConfigEntry, FritzboxDataUpdateCoordinator
|
||||||
from .entity import FritzBoxDeviceEntity
|
from .entity import FritzBoxDeviceEntity
|
||||||
from .model import ClimateExtraAttributes
|
from .model import ClimateExtraAttributes
|
||||||
|
from .sensor import value_scheduled_preset
|
||||||
|
|
||||||
HVAC_MODES = [HVACMode.HEAT, HVACMode.OFF]
|
HVAC_MODES = [HVACMode.HEAT, HVACMode.OFF]
|
||||||
PRESET_HOLIDAY = "holiday"
|
PRESET_HOLIDAY = "holiday"
|
||||||
@ -177,7 +178,11 @@ class FritzboxThermostat(FritzBoxDeviceEntity, ClimateEntity):
|
|||||||
if hvac_mode == HVACMode.OFF:
|
if hvac_mode == HVACMode.OFF:
|
||||||
await self.async_set_temperature(temperature=OFF_REPORT_SET_TEMPERATURE)
|
await self.async_set_temperature(temperature=OFF_REPORT_SET_TEMPERATURE)
|
||||||
else:
|
else:
|
||||||
await self.async_set_temperature(temperature=self.data.comfort_temperature)
|
if value_scheduled_preset(self.data) == PRESET_ECO:
|
||||||
|
target_temp = self.data.eco_temperature
|
||||||
|
else:
|
||||||
|
target_temp = self.data.comfort_temperature
|
||||||
|
await self.async_set_temperature(temperature=target_temp)
|
||||||
|
|
||||||
@property
|
@property
|
||||||
def preset_mode(self) -> str | None:
|
def preset_mode(self) -> str | None:
|
||||||
|
@ -313,12 +313,24 @@ async def test_set_temperature(
|
|||||||
|
|
||||||
|
|
||||||
@pytest.mark.parametrize(
|
@pytest.mark.parametrize(
|
||||||
("service_data", "target_temperature", "expected_call_args"),
|
("service_data", "target_temperature", "current_preset", "expected_call_args"),
|
||||||
[
|
[
|
||||||
({ATTR_HVAC_MODE: HVACMode.OFF}, 22, [call(0)]),
|
# mode off always sets target temperature to 0
|
||||||
({ATTR_HVAC_MODE: HVACMode.HEAT}, 0.0, [call(22)]),
|
({ATTR_HVAC_MODE: HVACMode.OFF}, 22, PRESET_COMFORT, [call(0)]),
|
||||||
({ATTR_HVAC_MODE: HVACMode.HEAT}, 18, []),
|
({ATTR_HVAC_MODE: HVACMode.OFF}, 16, PRESET_ECO, [call(0)]),
|
||||||
({ATTR_HVAC_MODE: HVACMode.HEAT}, 22, []),
|
({ATTR_HVAC_MODE: HVACMode.OFF}, 16, None, [call(0)]),
|
||||||
|
# mode heat sets target temperature based on current scheduled preset,
|
||||||
|
# when not already in mode heat
|
||||||
|
({ATTR_HVAC_MODE: HVACMode.HEAT}, 0.0, PRESET_COMFORT, [call(22)]),
|
||||||
|
({ATTR_HVAC_MODE: HVACMode.HEAT}, 0.0, PRESET_ECO, [call(16)]),
|
||||||
|
({ATTR_HVAC_MODE: HVACMode.HEAT}, 0.0, None, [call(22)]),
|
||||||
|
# mode heat does not set target temperature, when already in mode heat
|
||||||
|
({ATTR_HVAC_MODE: HVACMode.HEAT}, 16, PRESET_COMFORT, []),
|
||||||
|
({ATTR_HVAC_MODE: HVACMode.HEAT}, 16, PRESET_ECO, []),
|
||||||
|
({ATTR_HVAC_MODE: HVACMode.HEAT}, 16, None, []),
|
||||||
|
({ATTR_HVAC_MODE: HVACMode.HEAT}, 22, PRESET_COMFORT, []),
|
||||||
|
({ATTR_HVAC_MODE: HVACMode.HEAT}, 22, PRESET_ECO, []),
|
||||||
|
({ATTR_HVAC_MODE: HVACMode.HEAT}, 22, None, []),
|
||||||
],
|
],
|
||||||
)
|
)
|
||||||
async def test_set_hvac_mode(
|
async def test_set_hvac_mode(
|
||||||
@ -326,11 +338,20 @@ async def test_set_hvac_mode(
|
|||||||
fritz: Mock,
|
fritz: Mock,
|
||||||
service_data: dict,
|
service_data: dict,
|
||||||
target_temperature: float,
|
target_temperature: float,
|
||||||
|
current_preset: str,
|
||||||
expected_call_args: list[_Call],
|
expected_call_args: list[_Call],
|
||||||
) -> None:
|
) -> None:
|
||||||
"""Test setting hvac mode."""
|
"""Test setting hvac mode."""
|
||||||
device = FritzDeviceClimateMock()
|
device = FritzDeviceClimateMock()
|
||||||
device.target_temperature = target_temperature
|
device.target_temperature = target_temperature
|
||||||
|
|
||||||
|
if current_preset is PRESET_COMFORT:
|
||||||
|
device.nextchange_temperature = device.eco_temperature
|
||||||
|
elif current_preset is PRESET_ECO:
|
||||||
|
device.nextchange_temperature = device.comfort_temperature
|
||||||
|
else:
|
||||||
|
device.nextchange_endperiod = 0
|
||||||
|
|
||||||
assert await setup_config_entry(
|
assert await setup_config_entry(
|
||||||
hass, MOCK_CONFIG[FB_DOMAIN][CONF_DEVICES][0], ENTITY_ID, device, fritz
|
hass, MOCK_CONFIG[FB_DOMAIN][CONF_DEVICES][0], ENTITY_ID, device, fritz
|
||||||
)
|
)
|
||||||
|
Loading…
x
Reference in New Issue
Block a user