mirror of
https://github.com/home-assistant/core.git
synced 2025-07-14 16:57:10 +00:00
Fix set temperature action in AVM FRITZ!SmartHome (#126072)
* fix set_temperature logic * improvements
This commit is contained in:
parent
c94bb6c1db
commit
e40a853fdb
@ -135,14 +135,16 @@ class FritzboxThermostat(FritzBoxDeviceEntity, ClimateEntity):
|
|||||||
|
|
||||||
async def async_set_temperature(self, **kwargs: Any) -> None:
|
async def async_set_temperature(self, **kwargs: Any) -> None:
|
||||||
"""Set new target temperature."""
|
"""Set new target temperature."""
|
||||||
if kwargs.get(ATTR_HVAC_MODE) is not None:
|
target_temp = kwargs.get(ATTR_TEMPERATURE)
|
||||||
hvac_mode = kwargs[ATTR_HVAC_MODE]
|
hvac_mode = kwargs.get(ATTR_HVAC_MODE)
|
||||||
|
if hvac_mode == HVACMode.OFF:
|
||||||
await self.async_set_hvac_mode(hvac_mode)
|
await self.async_set_hvac_mode(hvac_mode)
|
||||||
elif kwargs.get(ATTR_TEMPERATURE) is not None:
|
elif target_temp is not None:
|
||||||
temperature = kwargs[ATTR_TEMPERATURE]
|
|
||||||
await self.hass.async_add_executor_job(
|
await self.hass.async_add_executor_job(
|
||||||
self.data.set_target_temperature, temperature
|
self.data.set_target_temperature, target_temp
|
||||||
)
|
)
|
||||||
|
else:
|
||||||
|
return
|
||||||
await self.coordinator.async_refresh()
|
await self.coordinator.async_refresh()
|
||||||
|
|
||||||
@property
|
@property
|
||||||
|
@ -1,7 +1,7 @@
|
|||||||
"""Tests for AVM Fritz!Box climate component."""
|
"""Tests for AVM Fritz!Box climate component."""
|
||||||
|
|
||||||
from datetime import timedelta
|
from datetime import timedelta
|
||||||
from unittest.mock import Mock, call
|
from unittest.mock import Mock, _Call, call
|
||||||
|
|
||||||
from freezegun.api import FrozenDateTimeFactory
|
from freezegun.api import FrozenDateTimeFactory
|
||||||
import pytest
|
import pytest
|
||||||
@ -15,6 +15,8 @@ from homeassistant.components.climate import (
|
|||||||
ATTR_MIN_TEMP,
|
ATTR_MIN_TEMP,
|
||||||
ATTR_PRESET_MODE,
|
ATTR_PRESET_MODE,
|
||||||
ATTR_PRESET_MODES,
|
ATTR_PRESET_MODES,
|
||||||
|
ATTR_TARGET_TEMP_HIGH,
|
||||||
|
ATTR_TARGET_TEMP_LOW,
|
||||||
DOMAIN as CLIMATE_DOMAIN,
|
DOMAIN as CLIMATE_DOMAIN,
|
||||||
PRESET_COMFORT,
|
PRESET_COMFORT,
|
||||||
PRESET_ECO,
|
PRESET_ECO,
|
||||||
@ -270,8 +272,40 @@ async def test_update_error(hass: HomeAssistant, fritz: Mock) -> None:
|
|||||||
assert fritz().login.call_count == 4
|
assert fritz().login.call_count == 4
|
||||||
|
|
||||||
|
|
||||||
async def test_set_temperature_temperature(hass: HomeAssistant, fritz: Mock) -> None:
|
@pytest.mark.parametrize(
|
||||||
"""Test setting temperature by temperature."""
|
("service_data", "expected_call_args"),
|
||||||
|
[
|
||||||
|
({ATTR_TEMPERATURE: 23}, [call(23)]),
|
||||||
|
(
|
||||||
|
{
|
||||||
|
ATTR_HVAC_MODE: HVACMode.OFF,
|
||||||
|
ATTR_TEMPERATURE: 23,
|
||||||
|
},
|
||||||
|
[call(0)],
|
||||||
|
),
|
||||||
|
(
|
||||||
|
{
|
||||||
|
ATTR_HVAC_MODE: HVACMode.HEAT,
|
||||||
|
ATTR_TEMPERATURE: 23,
|
||||||
|
},
|
||||||
|
[call(23)],
|
||||||
|
),
|
||||||
|
(
|
||||||
|
{
|
||||||
|
ATTR_TARGET_TEMP_HIGH: 16,
|
||||||
|
ATTR_TARGET_TEMP_LOW: 10,
|
||||||
|
},
|
||||||
|
[],
|
||||||
|
),
|
||||||
|
],
|
||||||
|
)
|
||||||
|
async def test_set_temperature(
|
||||||
|
hass: HomeAssistant,
|
||||||
|
fritz: Mock,
|
||||||
|
service_data: dict,
|
||||||
|
expected_call_args: list[_Call],
|
||||||
|
) -> None:
|
||||||
|
"""Test setting temperature."""
|
||||||
device = FritzDeviceClimateMock()
|
device = FritzDeviceClimateMock()
|
||||||
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
|
||||||
@ -280,56 +314,32 @@ async def test_set_temperature_temperature(hass: HomeAssistant, fritz: Mock) ->
|
|||||||
await hass.services.async_call(
|
await hass.services.async_call(
|
||||||
CLIMATE_DOMAIN,
|
CLIMATE_DOMAIN,
|
||||||
SERVICE_SET_TEMPERATURE,
|
SERVICE_SET_TEMPERATURE,
|
||||||
{ATTR_ENTITY_ID: ENTITY_ID, ATTR_TEMPERATURE: 23},
|
{ATTR_ENTITY_ID: ENTITY_ID, **service_data},
|
||||||
True,
|
True,
|
||||||
)
|
)
|
||||||
assert device.set_target_temperature.call_args_list == [call(23)]
|
assert device.set_target_temperature.call_count == len(expected_call_args)
|
||||||
|
assert device.set_target_temperature.call_args_list == expected_call_args
|
||||||
|
|
||||||
|
|
||||||
async def test_set_temperature_mode_off(hass: HomeAssistant, fritz: Mock) -> None:
|
@pytest.mark.parametrize(
|
||||||
"""Test setting temperature by mode."""
|
("service_data", "target_temperature", "expected_call_args"),
|
||||||
device = FritzDeviceClimateMock()
|
[
|
||||||
assert await setup_config_entry(
|
({ATTR_HVAC_MODE: HVACMode.OFF}, 22, [call(0)]),
|
||||||
hass, MOCK_CONFIG[FB_DOMAIN][CONF_DEVICES][0], ENTITY_ID, device, fritz
|
({ATTR_HVAC_MODE: HVACMode.HEAT}, 0.0, [call(22)]),
|
||||||
)
|
({ATTR_HVAC_MODE: HVACMode.HEAT}, 18, []),
|
||||||
|
({ATTR_HVAC_MODE: HVACMode.HEAT}, 22, []),
|
||||||
await hass.services.async_call(
|
],
|
||||||
CLIMATE_DOMAIN,
|
)
|
||||||
SERVICE_SET_TEMPERATURE,
|
async def test_set_hvac_mode(
|
||||||
{
|
hass: HomeAssistant,
|
||||||
ATTR_ENTITY_ID: ENTITY_ID,
|
fritz: Mock,
|
||||||
ATTR_HVAC_MODE: HVACMode.OFF,
|
service_data: dict,
|
||||||
ATTR_TEMPERATURE: 23,
|
target_temperature: float,
|
||||||
},
|
expected_call_args: list[_Call],
|
||||||
True,
|
) -> None:
|
||||||
)
|
|
||||||
assert device.set_target_temperature.call_args_list == [call(0)]
|
|
||||||
|
|
||||||
|
|
||||||
async def test_set_temperature_mode_heat(hass: HomeAssistant, fritz: Mock) -> None:
|
|
||||||
"""Test setting temperature by mode."""
|
|
||||||
device = FritzDeviceClimateMock()
|
|
||||||
device.target_temperature = 0.0
|
|
||||||
assert await setup_config_entry(
|
|
||||||
hass, MOCK_CONFIG[FB_DOMAIN][CONF_DEVICES][0], ENTITY_ID, device, fritz
|
|
||||||
)
|
|
||||||
|
|
||||||
await hass.services.async_call(
|
|
||||||
CLIMATE_DOMAIN,
|
|
||||||
SERVICE_SET_TEMPERATURE,
|
|
||||||
{
|
|
||||||
ATTR_ENTITY_ID: ENTITY_ID,
|
|
||||||
ATTR_HVAC_MODE: HVACMode.HEAT,
|
|
||||||
ATTR_TEMPERATURE: 23,
|
|
||||||
},
|
|
||||||
True,
|
|
||||||
)
|
|
||||||
assert device.set_target_temperature.call_args_list == [call(22)]
|
|
||||||
|
|
||||||
|
|
||||||
async def test_set_hvac_mode_off(hass: HomeAssistant, fritz: Mock) -> None:
|
|
||||||
"""Test setting hvac mode."""
|
"""Test setting hvac mode."""
|
||||||
device = FritzDeviceClimateMock()
|
device = FritzDeviceClimateMock()
|
||||||
|
device.target_temperature = target_temperature
|
||||||
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
|
||||||
)
|
)
|
||||||
@ -337,43 +347,12 @@ async def test_set_hvac_mode_off(hass: HomeAssistant, fritz: Mock) -> None:
|
|||||||
await hass.services.async_call(
|
await hass.services.async_call(
|
||||||
CLIMATE_DOMAIN,
|
CLIMATE_DOMAIN,
|
||||||
SERVICE_SET_HVAC_MODE,
|
SERVICE_SET_HVAC_MODE,
|
||||||
{ATTR_ENTITY_ID: ENTITY_ID, ATTR_HVAC_MODE: HVACMode.OFF},
|
{ATTR_ENTITY_ID: ENTITY_ID, **service_data},
|
||||||
True,
|
True,
|
||||||
)
|
)
|
||||||
assert device.set_target_temperature.call_args_list == [call(0)]
|
|
||||||
|
|
||||||
|
assert device.set_target_temperature.call_count == len(expected_call_args)
|
||||||
async def test_no_reset_hvac_mode_heat(hass: HomeAssistant, fritz: Mock) -> None:
|
assert device.set_target_temperature.call_args_list == expected_call_args
|
||||||
"""Test setting hvac mode."""
|
|
||||||
device = FritzDeviceClimateMock()
|
|
||||||
assert await setup_config_entry(
|
|
||||||
hass, MOCK_CONFIG[FB_DOMAIN][CONF_DEVICES][0], ENTITY_ID, device, fritz
|
|
||||||
)
|
|
||||||
|
|
||||||
await hass.services.async_call(
|
|
||||||
CLIMATE_DOMAIN,
|
|
||||||
SERVICE_SET_HVAC_MODE,
|
|
||||||
{ATTR_ENTITY_ID: ENTITY_ID, ATTR_HVAC_MODE: HVACMode.HEAT},
|
|
||||||
True,
|
|
||||||
)
|
|
||||||
assert device.set_target_temperature.call_count == 0
|
|
||||||
|
|
||||||
|
|
||||||
async def test_set_hvac_mode_heat(hass: HomeAssistant, fritz: Mock) -> None:
|
|
||||||
"""Test setting hvac mode."""
|
|
||||||
device = FritzDeviceClimateMock()
|
|
||||||
device.target_temperature = 0.0
|
|
||||||
assert await setup_config_entry(
|
|
||||||
hass, MOCK_CONFIG[FB_DOMAIN][CONF_DEVICES][0], ENTITY_ID, device, fritz
|
|
||||||
)
|
|
||||||
|
|
||||||
await hass.services.async_call(
|
|
||||||
CLIMATE_DOMAIN,
|
|
||||||
SERVICE_SET_HVAC_MODE,
|
|
||||||
{ATTR_ENTITY_ID: ENTITY_ID, ATTR_HVAC_MODE: HVACMode.HEAT},
|
|
||||||
True,
|
|
||||||
)
|
|
||||||
assert device.set_target_temperature.call_args_list == [call(22)]
|
|
||||||
|
|
||||||
|
|
||||||
async def test_set_preset_mode_comfort(hass: HomeAssistant, fritz: Mock) -> None:
|
async def test_set_preset_mode_comfort(hass: HomeAssistant, fritz: Mock) -> None:
|
||||||
|
Loading…
x
Reference in New Issue
Block a user