From 542c3cbf90a8daca58ba5438b36d2ed3e59cb486 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C3=81lvaro=20Fern=C3=A1ndez=20Rojas?= Date: Wed, 9 Mar 2022 20:51:39 +0100 Subject: [PATCH] Address late Airzone PR comments and fix Fahrenheit temperatures (#67904) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * airzone: address late PR comments Signed-off-by: Álvaro Fernández Rojas * airzone: fix fahrenheit temperatures Signed-off-by: Álvaro Fernández Rojas * airzone: add changes suggested by @MartinHjelmare Signed-off-by: Álvaro Fernández Rojas --- homeassistant/components/airzone/__init__.py | 10 ++++++++++ homeassistant/components/airzone/config_flow.py | 15 ++++++++------- homeassistant/components/airzone/const.py | 9 +++++++++ homeassistant/components/airzone/coordinator.py | 2 +- homeassistant/components/airzone/sensor.py | 16 ++++++++-------- tests/components/airzone/test_config_flow.py | 6 +++--- tests/components/airzone/test_init.py | 10 +++++----- tests/components/airzone/util.py | 16 ++++++++-------- 8 files changed, 52 insertions(+), 32 deletions(-) diff --git a/homeassistant/components/airzone/__init__.py b/homeassistant/components/airzone/__init__.py index 183a759122a..687e4426d76 100644 --- a/homeassistant/components/airzone/__init__.py +++ b/homeassistant/components/airzone/__init__.py @@ -2,6 +2,7 @@ from __future__ import annotations from aioairzone.common import ConnectionOptions +from aioairzone.const import AZD_ZONES from aioairzone.localapi_device import AirzoneLocalApi from homeassistant.config_entries import ConfigEntry @@ -37,6 +38,15 @@ class AirzoneEntity(CoordinatorEntity): } self.system_zone_id = system_zone_id + def get_zone_value(self, key): + """Return zone value by key.""" + value = None + if self.system_zone_id in self.coordinator.data[AZD_ZONES]: + zone = self.coordinator.data[AZD_ZONES][self.system_zone_id] + if key in zone: + value = zone[key] + return value + async def async_setup_entry(hass: HomeAssistant, entry: ConfigEntry) -> bool: """Set up Airzone from a config entry.""" diff --git a/homeassistant/components/airzone/config_flow.py b/homeassistant/components/airzone/config_flow.py index c78f43a7db7..47281deab73 100644 --- a/homeassistant/components/airzone/config_flow.py +++ b/homeassistant/components/airzone/config_flow.py @@ -34,14 +34,15 @@ class ConfigFlow(config_entries.ConfigFlow, domain=DOMAIN): } ) + airzone = AirzoneLocalApi( + aiohttp_client.async_get_clientsession(self.hass), + ConnectionOptions( + user_input[CONF_HOST], + user_input[CONF_PORT], + ), + ) + try: - airzone = AirzoneLocalApi( - aiohttp_client.async_get_clientsession(self.hass), - ConnectionOptions( - user_input[CONF_HOST], - user_input[CONF_PORT], - ), - ) await airzone.validate_airzone() except (ClientConnectorError, InvalidHost): errors["base"] = "cannot_connect" diff --git a/homeassistant/components/airzone/const.py b/homeassistant/components/airzone/const.py index 8c48cc1aca1..f1818334914 100644 --- a/homeassistant/components/airzone/const.py +++ b/homeassistant/components/airzone/const.py @@ -2,8 +2,17 @@ from typing import Final +from aioairzone.common import TemperatureUnit + +from homeassistant.const import TEMP_CELSIUS, TEMP_FAHRENHEIT + DOMAIN: Final = "airzone" MANUFACTURER: Final = "Airzone" AIOAIRZONE_DEVICE_TIMEOUT_SEC: Final = 10 DEFAULT_LOCAL_API_PORT: Final = 3000 + +TEMP_UNIT_LIB_TO_HASS: Final[dict[TemperatureUnit, str]] = { + TemperatureUnit.CELSIUS: TEMP_CELSIUS, + TemperatureUnit.FAHRENHEIT: TEMP_FAHRENHEIT, +} diff --git a/homeassistant/components/airzone/coordinator.py b/homeassistant/components/airzone/coordinator.py index b12305e7913..40d87a16b27 100644 --- a/homeassistant/components/airzone/coordinator.py +++ b/homeassistant/components/airzone/coordinator.py @@ -37,6 +37,6 @@ class AirzoneUpdateCoordinator(DataUpdateCoordinator): async with async_timeout.timeout(AIOAIRZONE_DEVICE_TIMEOUT_SEC): try: await self.airzone.update_airzone() - return self.airzone.data() except ClientConnectorError as error: raise UpdateFailed(error) from error + return self.airzone.data() diff --git a/homeassistant/components/airzone/sensor.py b/homeassistant/components/airzone/sensor.py index e860eba1ad1..3d8912641cb 100644 --- a/homeassistant/components/airzone/sensor.py +++ b/homeassistant/components/airzone/sensor.py @@ -3,7 +3,7 @@ from __future__ import annotations from typing import Final -from aioairzone.const import AZD_HUMIDITY, AZD_NAME, AZD_TEMP, AZD_ZONES +from aioairzone.const import AZD_HUMIDITY, AZD_NAME, AZD_TEMP, AZD_TEMP_UNIT, AZD_ZONES from homeassistant.components.sensor import ( STATE_CLASS_MEASUREMENT, @@ -21,7 +21,7 @@ from homeassistant.core import HomeAssistant from homeassistant.helpers.entity_platform import AddEntitiesCallback from . import AirzoneEntity -from .const import DOMAIN +from .const import DOMAIN, TEMP_UNIT_LIB_TO_HASS from .coordinator import AirzoneUpdateCoordinator SENSOR_TYPES: Final[tuple[SensorEntityDescription, ...]] = ( @@ -84,12 +84,12 @@ class AirzoneSensor(AirzoneEntity, SensorEntity): self._attr_unique_id = f"{entry.entry_id}_{system_zone_id}_{description.key}" self.entity_description = description + if description.key == AZD_TEMP: + self._attr_native_unit_of_measurement = TEMP_UNIT_LIB_TO_HASS.get( + self.get_zone_value(AZD_TEMP_UNIT) + ) + @property def native_value(self): """Return the state.""" - value = None - if self.system_zone_id in self.coordinator.data[AZD_ZONES]: - zone = self.coordinator.data[AZD_ZONES][self.system_zone_id] - if self.entity_description.key in zone: - value = zone[self.entity_description.key] - return value + return self.get_zone_value(self.entity_description.key) diff --git a/tests/components/airzone/test_config_flow.py b/tests/components/airzone/test_config_flow.py index bb878ea6fc8..aeea960c554 100644 --- a/tests/components/airzone/test_config_flow.py +++ b/tests/components/airzone/test_config_flow.py @@ -53,13 +53,13 @@ async def test_form(hass): async def test_form_duplicated_id(hass): """Test setting up duplicated entry.""" + entry = MockConfigEntry(domain=DOMAIN, data=CONFIG) + entry.add_to_hass(hass) + with patch( "aioairzone.localapi_device.AirzoneLocalApi.get_hvac", return_value=HVAC_MOCK, ): - entry = MockConfigEntry(domain=DOMAIN, data=CONFIG) - entry.add_to_hass(hass) - result = await hass.config_entries.flow.async_init( DOMAIN, context={"source": SOURCE_USER}, data=CONFIG ) diff --git a/tests/components/airzone/test_init.py b/tests/components/airzone/test_init.py index 8443148af65..a529907a246 100644 --- a/tests/components/airzone/test_init.py +++ b/tests/components/airzone/test_init.py @@ -13,15 +13,15 @@ from tests.common import MockConfigEntry async def test_unload_entry(hass): """Test unload.""" + config_entry = MockConfigEntry( + domain=DOMAIN, unique_id="airzone_unique_id", data=CONFIG + ) + config_entry.add_to_hass(hass) + with patch( "aioairzone.localapi_device.AirzoneLocalApi.get_hvac", return_value=HVAC_MOCK, ): - config_entry = MockConfigEntry( - domain=DOMAIN, unique_id="airzone_unique_id", data=CONFIG - ) - config_entry.add_to_hass(hass) - assert await hass.config_entries.async_setup(config_entry.entry_id) await hass.async_block_till_done() assert config_entry.state is ConfigEntryState.LOADED diff --git a/tests/components/airzone/util.py b/tests/components/airzone/util.py index 268a7fd1d2b..bc0332c959c 100644 --- a/tests/components/airzone/util.py +++ b/tests/components/airzone/util.py @@ -107,17 +107,17 @@ HVAC_MOCK = { API_ZONE_ID: 4, API_NAME: "Despacho", API_ON: 0, - API_MAX_TEMP: 30, - API_MIN_TEMP: 15, - API_SET_POINT: 19.5, - API_ROOM_TEMP: 21.2, + API_MAX_TEMP: 86, + API_MIN_TEMP: 59, + API_SET_POINT: 67.1, + API_ROOM_TEMP: 70.16, API_MODE: 3, API_COLD_STAGES: 1, API_COLD_STAGE: 1, API_HEAT_STAGES: 1, API_HEAT_STAGE: 1, API_HUMIDITY: 36, - API_UNITS: 0, + API_UNITS: 1, API_ERRORS: [], API_AIR_DEMAND: 0, API_FLOOR_DEMAND: 0, @@ -153,12 +153,12 @@ async def async_init_integration( ): """Set up the Airzone integration in Home Assistant.""" + entry = MockConfigEntry(domain=DOMAIN, data=CONFIG) + entry.add_to_hass(hass) + with patch( "aioairzone.localapi_device.AirzoneLocalApi.get_hvac", return_value=HVAC_MOCK, ): - entry = MockConfigEntry(domain=DOMAIN, data=CONFIG) - entry.add_to_hass(hass) - await hass.config_entries.async_setup(entry.entry_id) await hass.async_block_till_done()