mirror of
https://github.com/home-assistant/core.git
synced 2025-07-19 11:17:21 +00:00
Fix fibaro climate hvac mode (#132508)
This commit is contained in:
parent
af6948a911
commit
80e4d7ee12
@ -272,7 +272,9 @@ class FibaroThermostat(FibaroEntity, ClimateEntity):
|
|||||||
if isinstance(fibaro_operation_mode, str):
|
if isinstance(fibaro_operation_mode, str):
|
||||||
with suppress(ValueError):
|
with suppress(ValueError):
|
||||||
return HVACMode(fibaro_operation_mode.lower())
|
return HVACMode(fibaro_operation_mode.lower())
|
||||||
elif fibaro_operation_mode in OPMODES_HVAC:
|
# when the mode cannot be instantiated a preset_mode is selected
|
||||||
|
return HVACMode.AUTO
|
||||||
|
if fibaro_operation_mode in OPMODES_HVAC:
|
||||||
return OPMODES_HVAC[fibaro_operation_mode]
|
return OPMODES_HVAC[fibaro_operation_mode]
|
||||||
return None
|
return None
|
||||||
|
|
||||||
@ -280,8 +282,6 @@ class FibaroThermostat(FibaroEntity, ClimateEntity):
|
|||||||
"""Set new target operation mode."""
|
"""Set new target operation mode."""
|
||||||
if not self._op_mode_device:
|
if not self._op_mode_device:
|
||||||
return
|
return
|
||||||
if self.preset_mode:
|
|
||||||
return
|
|
||||||
|
|
||||||
if "setOperatingMode" in self._op_mode_device.fibaro_device.actions:
|
if "setOperatingMode" in self._op_mode_device.fibaro_device.actions:
|
||||||
self._op_mode_device.action("setOperatingMode", HA_OPMODES_HVAC[hvac_mode])
|
self._op_mode_device.action("setOperatingMode", HA_OPMODES_HVAC[hvac_mode])
|
||||||
|
@ -129,6 +129,62 @@ def mock_light() -> Mock:
|
|||||||
return light
|
return light
|
||||||
|
|
||||||
|
|
||||||
|
@pytest.fixture
|
||||||
|
def mock_thermostat() -> Mock:
|
||||||
|
"""Fixture for a thermostat."""
|
||||||
|
climate = Mock()
|
||||||
|
climate.fibaro_id = 4
|
||||||
|
climate.parent_fibaro_id = 0
|
||||||
|
climate.name = "Test climate"
|
||||||
|
climate.room_id = 1
|
||||||
|
climate.dead = False
|
||||||
|
climate.visible = True
|
||||||
|
climate.enabled = True
|
||||||
|
climate.type = "com.fibaro.thermostatDanfoss"
|
||||||
|
climate.base_type = "com.fibaro.device"
|
||||||
|
climate.properties = {"manufacturer": ""}
|
||||||
|
climate.actions = {"setThermostatMode": 1}
|
||||||
|
climate.supported_features = {}
|
||||||
|
climate.has_supported_thermostat_modes = True
|
||||||
|
climate.supported_thermostat_modes = ["Off", "Heat", "CustomerSpecific"]
|
||||||
|
climate.has_operating_mode = False
|
||||||
|
climate.has_thermostat_mode = True
|
||||||
|
climate.thermostat_mode = "CustomerSpecific"
|
||||||
|
value_mock = Mock()
|
||||||
|
value_mock.has_value = True
|
||||||
|
value_mock.int_value.return_value = 20
|
||||||
|
climate.value = value_mock
|
||||||
|
return climate
|
||||||
|
|
||||||
|
|
||||||
|
@pytest.fixture
|
||||||
|
def mock_thermostat_with_operating_mode() -> Mock:
|
||||||
|
"""Fixture for a thermostat."""
|
||||||
|
climate = Mock()
|
||||||
|
climate.fibaro_id = 4
|
||||||
|
climate.parent_fibaro_id = 0
|
||||||
|
climate.name = "Test climate"
|
||||||
|
climate.room_id = 1
|
||||||
|
climate.dead = False
|
||||||
|
climate.visible = True
|
||||||
|
climate.enabled = True
|
||||||
|
climate.type = "com.fibaro.thermostatDanfoss"
|
||||||
|
climate.base_type = "com.fibaro.device"
|
||||||
|
climate.properties = {"manufacturer": ""}
|
||||||
|
climate.actions = {"setOperationMode": 1}
|
||||||
|
climate.supported_features = {}
|
||||||
|
climate.has_supported_operating_modes = True
|
||||||
|
climate.supported_operating_modes = [0, 1, 15]
|
||||||
|
climate.has_operating_mode = True
|
||||||
|
climate.operating_mode = 15
|
||||||
|
climate.has_thermostat_mode = False
|
||||||
|
value_mock = Mock()
|
||||||
|
value_mock.has_value = True
|
||||||
|
value_mock.int_value.return_value = 20
|
||||||
|
climate.value = value_mock
|
||||||
|
return climate
|
||||||
|
|
||||||
|
|
||||||
@pytest.fixture
|
@pytest.fixture
|
||||||
def mock_config_entry(hass: HomeAssistant) -> MockConfigEntry:
|
def mock_config_entry(hass: HomeAssistant) -> MockConfigEntry:
|
||||||
"""Return the default mocked config entry."""
|
"""Return the default mocked config entry."""
|
||||||
|
134
tests/components/fibaro/test_climate.py
Normal file
134
tests/components/fibaro/test_climate.py
Normal file
@ -0,0 +1,134 @@
|
|||||||
|
"""Test the Fibaro climate platform."""
|
||||||
|
|
||||||
|
from unittest.mock import Mock, patch
|
||||||
|
|
||||||
|
from homeassistant.components.climate import ClimateEntityFeature, HVACMode
|
||||||
|
from homeassistant.const import Platform
|
||||||
|
from homeassistant.core import HomeAssistant
|
||||||
|
from homeassistant.helpers import entity_registry as er
|
||||||
|
|
||||||
|
from .conftest import init_integration
|
||||||
|
|
||||||
|
from tests.common import MockConfigEntry
|
||||||
|
|
||||||
|
|
||||||
|
async def test_climate_setup(
|
||||||
|
hass: HomeAssistant,
|
||||||
|
entity_registry: er.EntityRegistry,
|
||||||
|
mock_fibaro_client: Mock,
|
||||||
|
mock_config_entry: MockConfigEntry,
|
||||||
|
mock_thermostat: Mock,
|
||||||
|
mock_room: Mock,
|
||||||
|
) -> None:
|
||||||
|
"""Test that the climate creates an entity."""
|
||||||
|
|
||||||
|
# Arrange
|
||||||
|
mock_fibaro_client.read_rooms.return_value = [mock_room]
|
||||||
|
mock_fibaro_client.read_devices.return_value = [mock_thermostat]
|
||||||
|
|
||||||
|
with patch("homeassistant.components.fibaro.PLATFORMS", [Platform.CLIMATE]):
|
||||||
|
# Act
|
||||||
|
await init_integration(hass, mock_config_entry)
|
||||||
|
# Assert
|
||||||
|
entry = entity_registry.async_get("climate.room_1_test_climate_4")
|
||||||
|
assert entry
|
||||||
|
assert entry.unique_id == "hc2_111111.4"
|
||||||
|
assert entry.original_name == "Room 1 Test climate"
|
||||||
|
assert entry.supported_features == (
|
||||||
|
ClimateEntityFeature.TURN_ON
|
||||||
|
| ClimateEntityFeature.TURN_OFF
|
||||||
|
| ClimateEntityFeature.PRESET_MODE
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
|
async def test_hvac_mode_preset(
|
||||||
|
hass: HomeAssistant,
|
||||||
|
mock_fibaro_client: Mock,
|
||||||
|
mock_config_entry: MockConfigEntry,
|
||||||
|
mock_thermostat: Mock,
|
||||||
|
mock_room: Mock,
|
||||||
|
) -> None:
|
||||||
|
"""Test that the climate state is auto when a preset is selected."""
|
||||||
|
|
||||||
|
# Arrange
|
||||||
|
mock_fibaro_client.read_rooms.return_value = [mock_room]
|
||||||
|
mock_fibaro_client.read_devices.return_value = [mock_thermostat]
|
||||||
|
|
||||||
|
with patch("homeassistant.components.fibaro.PLATFORMS", [Platform.CLIMATE]):
|
||||||
|
# Act
|
||||||
|
await init_integration(hass, mock_config_entry)
|
||||||
|
# Assert
|
||||||
|
state = hass.states.get("climate.room_1_test_climate_4")
|
||||||
|
assert state.state == HVACMode.AUTO
|
||||||
|
assert state.attributes["preset_mode"] == "CustomerSpecific"
|
||||||
|
|
||||||
|
|
||||||
|
async def test_hvac_mode_heat(
|
||||||
|
hass: HomeAssistant,
|
||||||
|
mock_fibaro_client: Mock,
|
||||||
|
mock_config_entry: MockConfigEntry,
|
||||||
|
mock_thermostat: Mock,
|
||||||
|
mock_room: Mock,
|
||||||
|
) -> None:
|
||||||
|
"""Test that the preset mode is None if a hvac mode is active."""
|
||||||
|
|
||||||
|
# Arrange
|
||||||
|
mock_thermostat.thermostat_mode = "Heat"
|
||||||
|
mock_fibaro_client.read_rooms.return_value = [mock_room]
|
||||||
|
mock_fibaro_client.read_devices.return_value = [mock_thermostat]
|
||||||
|
|
||||||
|
with patch("homeassistant.components.fibaro.PLATFORMS", [Platform.CLIMATE]):
|
||||||
|
# Act
|
||||||
|
await init_integration(hass, mock_config_entry)
|
||||||
|
# Assert
|
||||||
|
state = hass.states.get("climate.room_1_test_climate_4")
|
||||||
|
assert state.state == HVACMode.HEAT
|
||||||
|
assert state.attributes["preset_mode"] is None
|
||||||
|
|
||||||
|
|
||||||
|
async def test_set_hvac_mode(
|
||||||
|
hass: HomeAssistant,
|
||||||
|
mock_fibaro_client: Mock,
|
||||||
|
mock_config_entry: MockConfigEntry,
|
||||||
|
mock_thermostat: Mock,
|
||||||
|
mock_room: Mock,
|
||||||
|
) -> None:
|
||||||
|
"""Test that set_hvac_mode() works."""
|
||||||
|
|
||||||
|
# Arrange
|
||||||
|
mock_fibaro_client.read_rooms.return_value = [mock_room]
|
||||||
|
mock_fibaro_client.read_devices.return_value = [mock_thermostat]
|
||||||
|
|
||||||
|
with patch("homeassistant.components.fibaro.PLATFORMS", [Platform.CLIMATE]):
|
||||||
|
# Act
|
||||||
|
await init_integration(hass, mock_config_entry)
|
||||||
|
await hass.services.async_call(
|
||||||
|
"climate",
|
||||||
|
"set_hvac_mode",
|
||||||
|
{"entity_id": "climate.room_1_test_climate_4", "hvac_mode": HVACMode.HEAT},
|
||||||
|
blocking=True,
|
||||||
|
)
|
||||||
|
|
||||||
|
# Assert
|
||||||
|
mock_thermostat.execute_action.assert_called_once()
|
||||||
|
|
||||||
|
|
||||||
|
async def test_hvac_mode_with_operation_mode_support(
|
||||||
|
hass: HomeAssistant,
|
||||||
|
mock_fibaro_client: Mock,
|
||||||
|
mock_config_entry: MockConfigEntry,
|
||||||
|
mock_thermostat_with_operating_mode: Mock,
|
||||||
|
mock_room: Mock,
|
||||||
|
) -> None:
|
||||||
|
"""Test that operating mode works."""
|
||||||
|
|
||||||
|
# Arrange
|
||||||
|
mock_fibaro_client.read_rooms.return_value = [mock_room]
|
||||||
|
mock_fibaro_client.read_devices.return_value = [mock_thermostat_with_operating_mode]
|
||||||
|
|
||||||
|
with patch("homeassistant.components.fibaro.PLATFORMS", [Platform.CLIMATE]):
|
||||||
|
# Act
|
||||||
|
await init_integration(hass, mock_config_entry)
|
||||||
|
# Assert
|
||||||
|
state = hass.states.get("climate.room_1_test_climate_4")
|
||||||
|
assert state.state == HVACMode.AUTO
|
Loading…
x
Reference in New Issue
Block a user