Address late review of deconz climate (#70148)

* Fix late comment

* Avoid unnecessary properties

* Add clip sensor test to increase coverage of climate

* Fix review_comment
This commit is contained in:
Robert Svensson 2022-04-16 21:14:54 +02:00 committed by GitHub
parent a2337f4a43
commit f0b1d35562
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 35 additions and 24 deletions

View File

@ -62,7 +62,6 @@ FAN_MODE_TO_DECONZ = {
FAN_ON: THERMOSTAT_FAN_MODE_ON,
FAN_OFF: THERMOSTAT_FAN_MODE_OFF,
}
DECONZ_TO_FAN_MODE = {value: key for key, value in FAN_MODE_TO_DECONZ.items()}
HVAC_MODE_TO_DECONZ: dict[str, str] = {
@ -86,7 +85,6 @@ PRESET_MODE_TO_DECONZ = {
DECONZ_PRESET_HOLIDAY: THERMOSTAT_PRESET_HOLIDAY,
DECONZ_PRESET_MANUAL: THERMOSTAT_PRESET_MANUAL,
}
DECONZ_TO_PRESET_MODE = {value: key for key, value in PRESET_MODE_TO_DECONZ.items()}
@ -147,23 +145,29 @@ class DeconzThermostat(DeconzDevice, ClimateEntity):
"""Set up thermostat device."""
super().__init__(device, gateway)
self.supported_hvac_modes = [
self._attr_hvac_modes = [
HVAC_MODE_HEAT,
HVAC_MODE_OFF,
]
if device.mode:
self.supported_hvac_modes.append(HVAC_MODE_AUTO)
self._attr_hvac_modes.append(HVAC_MODE_AUTO)
if "coolsetpoint" in device.raw["config"]:
self.supported_hvac_modes.append(HVAC_MODE_COOL)
self._attr_hvac_modes.append(HVAC_MODE_COOL)
self._deconz_to_hvac_mode = {
HVAC_MODE_TO_DECONZ[item]: item for item in self._attr_hvac_modes
}
self._attr_supported_features = ClimateEntityFeature.TARGET_TEMPERATURE
if device.fan_mode:
self._attr_supported_features |= ClimateEntityFeature.FAN_MODE
self._attr_fan_modes = list(FAN_MODE_TO_DECONZ)
if device.preset:
self._attr_supported_features |= ClimateEntityFeature.PRESET_MODE
self._attr_preset_modes = list(PRESET_MODE_TO_DECONZ)
# Fan control
@ -174,11 +178,6 @@ class DeconzThermostat(DeconzDevice, ClimateEntity):
return DECONZ_TO_FAN_MODE[self._device.fan_mode]
return DECONZ_TO_FAN_MODE[FAN_ON if self._device.state_on else FAN_OFF]
@property
def fan_modes(self) -> list[str]:
"""Return the list of available fan operation modes."""
return list(FAN_MODE_TO_DECONZ)
async def async_set_fan_mode(self, fan_mode: str) -> None:
"""Set new target fan mode."""
if fan_mode not in FAN_MODE_TO_DECONZ:
@ -194,21 +193,16 @@ class DeconzThermostat(DeconzDevice, ClimateEntity):
Need to be one of HVAC_MODE_*.
"""
if self._device.mode in self.supported_hvac_modes:
return HVAC_MODE_TO_DECONZ[self._device.mode]
if self._device.mode in self._deconz_to_hvac_mode:
return self._deconz_to_hvac_mode[self._device.mode]
return HVAC_MODE_HEAT if self._device.state_on else HVAC_MODE_OFF
@property
def hvac_modes(self) -> list[str]:
"""Return the list of available hvac operation modes."""
return self.supported_hvac_modes
async def async_set_hvac_mode(self, hvac_mode: str) -> None:
"""Set new target hvac mode."""
if hvac_mode not in self.supported_hvac_modes:
if hvac_mode not in self._attr_hvac_modes:
raise ValueError(f"Unsupported HVAC mode {hvac_mode}")
if len(self.supported_hvac_modes) == 2: # Only allow turn on and off thermostat
if len(self._attr_hvac_modes) == 2: # Only allow turn on and off thermostat
await self._device.set_config(on=hvac_mode != HVAC_MODE_OFF)
else:
await self._device.set_config(mode=HVAC_MODE_TO_DECONZ[hvac_mode])
@ -222,11 +216,6 @@ class DeconzThermostat(DeconzDevice, ClimateEntity):
return DECONZ_TO_PRESET_MODE[self._device.preset]
return None
@property
def preset_modes(self) -> list[str]:
"""Return the list of available preset modes."""
return list(PRESET_MODE_TO_DECONZ)
async def async_set_preset_mode(self, preset_mode: str) -> None:
"""Set new preset mode."""
if preset_mode not in PRESET_MODE_TO_DECONZ:

View File

@ -788,3 +788,25 @@ async def test_add_new_climate_device(hass, aioclient_mock, mock_deconz_websocke
assert len(hass.states.async_all()) == 2
assert hass.states.get("climate.thermostat").state == HVAC_MODE_AUTO
assert hass.states.get("sensor.thermostat_battery").state == "100"
async def test_not_allow_clip_thermostat(hass, aioclient_mock):
"""Test that CLIP thermostats are not allowed."""
data = {
"sensors": {
"1": {
"name": "CLIP thermostat sensor",
"type": "CLIPThermostat",
"state": {},
"config": {},
"uniqueid": "00:00:00:00:00:00:00:00-00",
},
}
}
with patch.dict(DECONZ_WEB_REQUEST, data):
await setup_deconz_integration(
hass, aioclient_mock, options={CONF_ALLOW_CLIP_SENSOR: False}
)
assert len(hass.states.async_all()) == 0