Use climate enums in deconz (#70630)

* Use climate enums in deconz

* Adjust tests

* Adjust type hint

* Update climate.py

* Update climate.py

* Update climate.py

* Don't edit files in Github!
This commit is contained in:
epenet 2022-04-25 16:18:44 +02:00 committed by GitHub
parent b2b99417c9
commit 9dcbc8469e
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 46 additions and 52 deletions

View File

@ -25,7 +25,7 @@ from pydeconz.models.sensor.thermostat import (
Thermostat,
)
from homeassistant.components.climate import DOMAIN, ClimateEntity, ClimateEntityFeature
from homeassistant.components.climate import DOMAIN, ClimateEntity
from homeassistant.components.climate.const import (
FAN_AUTO,
FAN_HIGH,
@ -33,13 +33,11 @@ from homeassistant.components.climate.const import (
FAN_MEDIUM,
FAN_OFF,
FAN_ON,
HVAC_MODE_AUTO,
HVAC_MODE_COOL,
HVAC_MODE_HEAT,
HVAC_MODE_OFF,
PRESET_BOOST,
PRESET_COMFORT,
PRESET_ECO,
ClimateEntityFeature,
HVACMode,
)
from homeassistant.config_entries import ConfigEntry
from homeassistant.const import ATTR_TEMPERATURE, TEMP_CELSIUS
@ -64,11 +62,11 @@ FAN_MODE_TO_DECONZ = {
}
DECONZ_TO_FAN_MODE = {value: key for key, value in FAN_MODE_TO_DECONZ.items()}
HVAC_MODE_TO_DECONZ: dict[str, str] = {
HVAC_MODE_AUTO: THERMOSTAT_MODE_AUTO,
HVAC_MODE_COOL: THERMOSTAT_MODE_COOL,
HVAC_MODE_HEAT: THERMOSTAT_MODE_HEAT,
HVAC_MODE_OFF: THERMOSTAT_MODE_OFF,
HVAC_MODE_TO_DECONZ: dict[HVACMode, str] = {
HVACMode.AUTO: THERMOSTAT_MODE_AUTO,
HVACMode.COOL: THERMOSTAT_MODE_COOL,
HVACMode.HEAT: THERMOSTAT_MODE_HEAT,
HVACMode.OFF: THERMOSTAT_MODE_OFF,
}
DECONZ_PRESET_AUTO = "auto"
@ -146,14 +144,14 @@ class DeconzThermostat(DeconzDevice, ClimateEntity):
super().__init__(device, gateway)
self._attr_hvac_modes = [
HVAC_MODE_HEAT,
HVAC_MODE_OFF,
HVACMode.HEAT,
HVACMode.OFF,
]
if device.mode:
self._attr_hvac_modes.append(HVAC_MODE_AUTO)
self._attr_hvac_modes.append(HVACMode.AUTO)
if "coolsetpoint" in device.raw["config"]:
self._attr_hvac_modes.append(HVAC_MODE_COOL)
self._attr_hvac_modes.append(HVACMode.COOL)
self._deconz_to_hvac_mode = {
HVAC_MODE_TO_DECONZ[item]: item for item in self._attr_hvac_modes
@ -188,22 +186,22 @@ class DeconzThermostat(DeconzDevice, ClimateEntity):
# HVAC control
@property
def hvac_mode(self) -> str:
def hvac_mode(self) -> HVACMode:
"""Return hvac operation ie. heat, cool mode.
Need to be one of HVAC_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
return HVACMode.HEAT if self._device.state_on else HVACMode.OFF
async def async_set_hvac_mode(self, hvac_mode: str) -> None:
async def async_set_hvac_mode(self, hvac_mode: HVACMode) -> None:
"""Set new target hvac mode."""
if hvac_mode not in self._attr_hvac_modes:
raise ValueError(f"Unsupported HVAC mode {hvac_mode}")
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)
await self._device.set_config(on=hvac_mode != HVACMode.OFF)
else:
await self._device.set_config(mode=HVAC_MODE_TO_DECONZ[hvac_mode])

View File

@ -1,5 +1,4 @@
"""deCONZ climate platform tests."""
from unittest.mock import patch
import pytest
@ -23,13 +22,10 @@ from homeassistant.components.climate.const import (
FAN_MEDIUM,
FAN_OFF,
FAN_ON,
HVAC_MODE_AUTO,
HVAC_MODE_COOL,
HVAC_MODE_HEAT,
HVAC_MODE_OFF,
PRESET_BOOST,
PRESET_COMFORT,
PRESET_ECO,
HVACMode,
)
from homeassistant.components.deconz.climate import (
DECONZ_FAN_SMART,
@ -103,10 +99,10 @@ async def test_simple_climate_device(hass, aioclient_mock, mock_deconz_websocket
assert len(hass.states.async_all()) == 2
climate_thermostat = hass.states.get("climate.thermostat")
assert climate_thermostat.state == HVAC_MODE_HEAT
assert climate_thermostat.state == HVACMode.HEAT
assert climate_thermostat.attributes["hvac_modes"] == [
HVAC_MODE_HEAT,
HVAC_MODE_OFF,
HVACMode.HEAT,
HVACMode.OFF,
]
assert climate_thermostat.attributes["current_temperature"] == 21.0
assert climate_thermostat.attributes["temperature"] == 21.0
@ -139,7 +135,7 @@ async def test_simple_climate_device(hass, aioclient_mock, mock_deconz_websocket
await mock_deconz_websocket(data=event_changed_sensor)
await hass.async_block_till_done()
assert hass.states.get("climate.thermostat").state == HVAC_MODE_HEAT
assert hass.states.get("climate.thermostat").state == HVACMode.HEAT
# Verify service calls
@ -150,7 +146,7 @@ async def test_simple_climate_device(hass, aioclient_mock, mock_deconz_websocket
await hass.services.async_call(
CLIMATE_DOMAIN,
SERVICE_SET_HVAC_MODE,
{ATTR_ENTITY_ID: "climate.thermostat", ATTR_HVAC_MODE: HVAC_MODE_HEAT},
{ATTR_ENTITY_ID: "climate.thermostat", ATTR_HVAC_MODE: HVACMode.HEAT},
blocking=True,
)
assert aioclient_mock.mock_calls[1][2] == {"on": True}
@ -160,7 +156,7 @@ async def test_simple_climate_device(hass, aioclient_mock, mock_deconz_websocket
await hass.services.async_call(
CLIMATE_DOMAIN,
SERVICE_SET_HVAC_MODE,
{ATTR_ENTITY_ID: "climate.thermostat", ATTR_HVAC_MODE: HVAC_MODE_OFF},
{ATTR_ENTITY_ID: "climate.thermostat", ATTR_HVAC_MODE: HVACMode.OFF},
blocking=True,
)
assert aioclient_mock.mock_calls[2][2] == {"on": False}
@ -171,7 +167,7 @@ async def test_simple_climate_device(hass, aioclient_mock, mock_deconz_websocket
await hass.services.async_call(
CLIMATE_DOMAIN,
SERVICE_SET_HVAC_MODE,
{ATTR_ENTITY_ID: "climate.thermostat", ATTR_HVAC_MODE: HVAC_MODE_AUTO},
{ATTR_ENTITY_ID: "climate.thermostat", ATTR_HVAC_MODE: HVACMode.AUTO},
blocking=True,
)
@ -202,11 +198,11 @@ async def test_climate_device_without_cooling_support(
assert len(hass.states.async_all()) == 2
climate_thermostat = hass.states.get("climate.thermostat")
assert climate_thermostat.state == HVAC_MODE_AUTO
assert climate_thermostat.state == HVACMode.AUTO
assert climate_thermostat.attributes["hvac_modes"] == [
HVAC_MODE_HEAT,
HVAC_MODE_OFF,
HVAC_MODE_AUTO,
HVACMode.HEAT,
HVACMode.OFF,
HVACMode.AUTO,
]
assert climate_thermostat.attributes["current_temperature"] == 22.6
assert climate_thermostat.attributes["temperature"] == 22.0
@ -242,7 +238,7 @@ async def test_climate_device_without_cooling_support(
await mock_deconz_websocket(data=event_changed_sensor)
await hass.async_block_till_done()
assert hass.states.get("climate.thermostat").state == HVAC_MODE_HEAT
assert hass.states.get("climate.thermostat").state == HVACMode.HEAT
# Event signals thermostat state off
@ -267,7 +263,7 @@ async def test_climate_device_without_cooling_support(
await hass.services.async_call(
CLIMATE_DOMAIN,
SERVICE_SET_HVAC_MODE,
{ATTR_ENTITY_ID: "climate.thermostat", ATTR_HVAC_MODE: HVAC_MODE_AUTO},
{ATTR_ENTITY_ID: "climate.thermostat", ATTR_HVAC_MODE: HVACMode.AUTO},
blocking=True,
)
assert aioclient_mock.mock_calls[1][2] == {"mode": "auto"}
@ -277,7 +273,7 @@ async def test_climate_device_without_cooling_support(
await hass.services.async_call(
CLIMATE_DOMAIN,
SERVICE_SET_HVAC_MODE,
{ATTR_ENTITY_ID: "climate.thermostat", ATTR_HVAC_MODE: HVAC_MODE_HEAT},
{ATTR_ENTITY_ID: "climate.thermostat", ATTR_HVAC_MODE: HVACMode.HEAT},
blocking=True,
)
assert aioclient_mock.mock_calls[2][2] == {"mode": "heat"}
@ -287,7 +283,7 @@ async def test_climate_device_without_cooling_support(
await hass.services.async_call(
CLIMATE_DOMAIN,
SERVICE_SET_HVAC_MODE,
{ATTR_ENTITY_ID: "climate.thermostat", ATTR_HVAC_MODE: HVAC_MODE_OFF},
{ATTR_ENTITY_ID: "climate.thermostat", ATTR_HVAC_MODE: HVACMode.OFF},
blocking=True,
)
assert aioclient_mock.mock_calls[3][2] == {"mode": "off"}
@ -298,7 +294,7 @@ async def test_climate_device_without_cooling_support(
await hass.services.async_call(
CLIMATE_DOMAIN,
SERVICE_SET_HVAC_MODE,
{ATTR_ENTITY_ID: "climate.thermostat", ATTR_HVAC_MODE: HVAC_MODE_COOL},
{ATTR_ENTITY_ID: "climate.thermostat", ATTR_HVAC_MODE: HVACMode.COOL},
blocking=True,
)
@ -376,12 +372,12 @@ async def test_climate_device_with_cooling_support(
assert len(hass.states.async_all()) == 2
climate_thermostat = hass.states.get("climate.zen_01")
assert climate_thermostat.state == HVAC_MODE_HEAT
assert climate_thermostat.state == HVACMode.HEAT
assert climate_thermostat.attributes["hvac_modes"] == [
HVAC_MODE_HEAT,
HVAC_MODE_OFF,
HVAC_MODE_AUTO,
HVAC_MODE_COOL,
HVACMode.HEAT,
HVACMode.OFF,
HVACMode.AUTO,
HVACMode.COOL,
]
assert climate_thermostat.attributes["current_temperature"] == 23.2
assert climate_thermostat.attributes["temperature"] == 22.2
@ -400,7 +396,7 @@ async def test_climate_device_with_cooling_support(
await hass.async_block_till_done()
await hass.async_block_till_done()
assert hass.states.get("climate.zen_01").state == HVAC_MODE_COOL
assert hass.states.get("climate.zen_01").state == HVACMode.COOL
assert hass.states.get("climate.zen_01").attributes["temperature"] == 11.1
# Verify service calls
@ -456,7 +452,7 @@ async def test_climate_device_with_fan_support(
assert len(hass.states.async_all()) == 2
climate_thermostat = hass.states.get("climate.zen_01")
assert climate_thermostat.state == HVAC_MODE_HEAT
assert climate_thermostat.state == HVACMode.HEAT
assert climate_thermostat.attributes["fan_mode"] == FAN_AUTO
assert climate_thermostat.attributes["fan_modes"] == [
DECONZ_FAN_SMART,
@ -584,7 +580,7 @@ async def test_climate_device_with_preset(hass, aioclient_mock, mock_deconz_webs
assert len(hass.states.async_all()) == 2
climate_zen_01 = hass.states.get("climate.zen_01")
assert climate_zen_01.state == HVAC_MODE_HEAT
assert climate_zen_01.state == HVACMode.HEAT
assert climate_zen_01.attributes["current_temperature"] == 23.2
assert climate_zen_01.attributes["temperature"] == 22.2
assert climate_zen_01.attributes["preset_mode"] == DECONZ_PRESET_AUTO
@ -696,7 +692,7 @@ async def test_clip_climate_device(hass, aioclient_mock):
)
assert len(hass.states.async_all()) == 3
assert hass.states.get("climate.clip_thermostat").state == HVAC_MODE_HEAT
assert hass.states.get("climate.clip_thermostat").state == HVACMode.HEAT
# Disallow clip sensors
@ -716,7 +712,7 @@ async def test_clip_climate_device(hass, aioclient_mock):
await hass.async_block_till_done()
assert len(hass.states.async_all()) == 3
assert hass.states.get("climate.clip_thermostat").state == HVAC_MODE_HEAT
assert hass.states.get("climate.clip_thermostat").state == HVACMode.HEAT
async def test_verify_state_update(hass, aioclient_mock, mock_deconz_websocket):
@ -741,7 +737,7 @@ async def test_verify_state_update(hass, aioclient_mock, mock_deconz_websocket):
with patch.dict(DECONZ_WEB_REQUEST, data):
await setup_deconz_integration(hass, aioclient_mock)
assert hass.states.get("climate.thermostat").state == HVAC_MODE_AUTO
assert hass.states.get("climate.thermostat").state == HVACMode.AUTO
event_changed_sensor = {
"t": "event",
@ -753,7 +749,7 @@ async def test_verify_state_update(hass, aioclient_mock, mock_deconz_websocket):
await mock_deconz_websocket(data=event_changed_sensor)
await hass.async_block_till_done()
assert hass.states.get("climate.thermostat").state == HVAC_MODE_AUTO
assert hass.states.get("climate.thermostat").state == HVACMode.AUTO
async def test_add_new_climate_device(hass, aioclient_mock, mock_deconz_websocket):
@ -786,7 +782,7 @@ async def test_add_new_climate_device(hass, aioclient_mock, mock_deconz_websocke
await hass.async_block_till_done()
assert len(hass.states.async_all()) == 2
assert hass.states.get("climate.thermostat").state == HVAC_MODE_AUTO
assert hass.states.get("climate.thermostat").state == HVACMode.AUTO
assert hass.states.get("sensor.thermostat_battery").state == "100"