From e8348221d488da6086c9db756a1c5f78db21061f Mon Sep 17 00:00:00 2001 From: SukramJ Date: Tue, 12 Nov 2019 11:32:32 +0100 Subject: [PATCH] Allow preset boost for Homematic IP Cloud power switches (#28713) * Allow preset boost for Homematic IP Cloud power switches * Sort Imports * Add test * align test data --- .../components/homematicip_cloud/climate.py | 18 ++++++++++++++--- .../homematicip_cloud/test_climate.py | 20 +++++++++++++++++++ tests/fixtures/homematicip_cloud.json | 16 ++++++++++----- 3 files changed, 46 insertions(+), 8 deletions(-) diff --git a/homeassistant/components/homematicip_cloud/climate.py b/homeassistant/components/homematicip_cloud/climate.py index a8ea424b207..9673459e820 100644 --- a/homeassistant/components/homematicip_cloud/climate.py +++ b/homeassistant/components/homematicip_cloud/climate.py @@ -5,6 +5,7 @@ from typing import Awaitable from homematicip.aio.device import AsyncHeatingThermostat, AsyncHeatingThermostatCompact from homematicip.aio.group import AsyncHeatingGroup from homematicip.base.enums import AbsenceType +from homematicip.device import Switch from homematicip.functionalHomes import IndoorClimateHome from homeassistant.components.climate import ClimateDevice @@ -116,7 +117,7 @@ class HomematicipHeatingGroup(HomematicipGenericDevice, ClimateDevice): @property def hvac_mode(self) -> str: """Return hvac operation ie.""" - if self._disabled_by_cooling_mode: + if self._disabled_by_cooling_mode and not self._has_switch: return HVAC_MODE_OFF if self._device.boostMode: return HVAC_MODE_HEAT @@ -128,7 +129,7 @@ class HomematicipHeatingGroup(HomematicipGenericDevice, ClimateDevice): @property def hvac_modes(self): """Return the list of available hvac operation modes.""" - if self._disabled_by_cooling_mode: + if self._disabled_by_cooling_mode and not self._has_switch: return [HVAC_MODE_OFF] return ( @@ -168,7 +169,9 @@ class HomematicipHeatingGroup(HomematicipGenericDevice, ClimateDevice): profile_names = self._device_profile_names presets = [] - if self._heat_mode_enabled and self._has_radiator_thermostat: + if ( + self._heat_mode_enabled and self._has_radiator_thermostat + ) or self._has_switch: if not profile_names: presets.append(PRESET_NONE) presets.append(PRESET_BOOST) @@ -290,6 +293,15 @@ class HomematicipHeatingGroup(HomematicipGenericDevice, ClimateDevice): return HEATING_PROFILES if self._heat_mode_enabled else COOLING_PROFILES + @property + def _has_switch(self) -> bool: + """Return, if a switch is in the hmip heating group.""" + for device in self._device.devices: + if isinstance(device, Switch): + return True + + return False + @property def _has_radiator_thermostat(self) -> bool: """Return, if a radiator thermostat is in the hmip heating group.""" diff --git a/tests/components/homematicip_cloud/test_climate.py b/tests/components/homematicip_cloud/test_climate.py index 6a05a880864..858fba29563 100644 --- a/tests/components/homematicip_cloud/test_climate.py +++ b/tests/components/homematicip_cloud/test_climate.py @@ -333,6 +333,26 @@ async def test_hmip_heating_group_cool(hass, default_mock_hap): assert hmip_device.mock_calls[-1][1] == (4,) +async def test_hmip_heating_group_heat_with_switch(hass, default_mock_hap): + """Test HomematicipHeatingGroup.""" + entity_id = "climate.schlafzimmer" + entity_name = "Schlafzimmer" + device_model = None + + ha_state, hmip_device = get_and_check_entity_basics( + hass, default_mock_hap, entity_id, entity_name, device_model + ) + + assert ha_state.state == HVAC_MODE_AUTO + assert ha_state.attributes["current_temperature"] == 24.7 + assert ha_state.attributes["min_temp"] == 5.0 + assert ha_state.attributes["max_temp"] == 30.0 + assert ha_state.attributes["temperature"] == 5.0 + assert ha_state.attributes["current_humidity"] == 43 + assert ha_state.attributes[ATTR_PRESET_MODE] == "STD" + assert ha_state.attributes[ATTR_PRESET_MODES] == [PRESET_BOOST, "STD", "P2"] + + async def test_hmip_climate_services(hass, mock_hap_with_service): """Test HomematicipHeatingGroup.""" diff --git a/tests/fixtures/homematicip_cloud.json b/tests/fixtures/homematicip_cloud.json index d1ef82f4234..8cec2462f32 100644 --- a/tests/fixtures/homematicip_cloud.json +++ b/tests/fixtures/homematicip_cloud.json @@ -5,6 +5,12 @@ "id": "00000000-0000-0000-0000-000000000000", "label": "TEST-Client", "clientType": "APP" + }, + "AA000000-0000-0000-0000-000000000000": { + "homeId": "00000000-0000-0000-0000-000000000001", + "id": "AA000000-0000-0000-0000-000000000000", + "label": "REMOVE_ME", + "clientType": "APP" } }, "devices": { @@ -1485,7 +1491,7 @@ "modelType": "HmIP-SMI", "oem": "eQ-3", "permanentlyReachable": true, - "serializedGlobalTradeItemNumber": "3014F7110000000000000011", + "serializedGlobalTradeItemNumber": "3014F711000000000000BB11", "type": "MOTION_DETECTOR_INDOOR", "updateState": "UP_TO_DATE" }, @@ -2202,7 +2208,7 @@ } }, "homeId": "00000000-0000-0000-0000-000000000001", - "id": "3014F7110000000000000011", + "id": "3014F7110000000000000109", "label": "Ausschalter Terrasse Bewegungsmelder", "lastStatusUpdate": 1570366291250, "liveUpdateState": "LIVE_UPDATE_NOT_SUPPORTED", @@ -4075,7 +4081,7 @@ }, { "channelIndex": 1, - "deviceId": "3014F7110000000000000011" + "deviceId": "3014F7110000000000000008" } ], "controlMode": "AUTOMATIC", @@ -4109,7 +4115,7 @@ "enabled": true, "groupId": "00000000-0000-0000-0000-000000000012", "index": "PROFILE_1", - "name": "", + "name": "STD", "profileId": "00000000-0000-0000-0000-000000000023", "visible": true }, @@ -4117,7 +4123,7 @@ "enabled": true, "groupId": "00000000-0000-0000-0000-000000000012", "index": "PROFILE_2", - "name": "", + "name": "P2", "profileId": "00000000-0000-0000-0000-000000000024", "visible": true },