From f1305cd5a3b3c15842017d2b19a60277c5d7e6d0 Mon Sep 17 00:00:00 2001 From: epenet <6771947+epenet@users.noreply.github.com> Date: Tue, 28 Jan 2025 11:45:24 +0100 Subject: [PATCH] Improve type hints in econet (#136693) Co-authored-by: Marc Mueller <30130371+cdce8p@users.noreply.github.com> --- .../components/econet/binary_sensor.py | 4 +-- homeassistant/components/econet/climate.py | 28 +++++++++++-------- homeassistant/components/econet/entity.py | 12 ++++---- homeassistant/components/econet/switch.py | 6 ++-- .../components/econet/water_heater.py | 14 +++++----- 5 files changed, 35 insertions(+), 29 deletions(-) diff --git a/homeassistant/components/econet/binary_sensor.py b/homeassistant/components/econet/binary_sensor.py index d66a8536bd0..13ef8c4713b 100644 --- a/homeassistant/components/econet/binary_sensor.py +++ b/homeassistant/components/econet/binary_sensor.py @@ -2,7 +2,7 @@ from __future__ import annotations -from pyeconet.equipment import EquipmentType +from pyeconet.equipment import Equipment, EquipmentType from homeassistant.components.binary_sensor import ( BinarySensorDeviceClass, @@ -63,7 +63,7 @@ class EcoNetBinarySensor(EcoNetEntity, BinarySensorEntity): """Define a Econet binary sensor.""" def __init__( - self, econet_device, description: BinarySensorEntityDescription + self, econet_device: Equipment, description: BinarySensorEntityDescription ) -> None: """Initialize.""" super().__init__(econet_device) diff --git a/homeassistant/components/econet/climate.py b/homeassistant/components/econet/climate.py index 1ebb7e483d4..d46dbd8750a 100644 --- a/homeassistant/components/econet/climate.py +++ b/homeassistant/components/econet/climate.py @@ -3,7 +3,11 @@ from typing import Any from pyeconet.equipment import EquipmentType -from pyeconet.equipment.thermostat import ThermostatFanMode, ThermostatOperationMode +from pyeconet.equipment.thermostat import ( + Thermostat, + ThermostatFanMode, + ThermostatOperationMode, +) from homeassistant.components.climate import ( ATTR_TARGET_TEMP_HIGH, @@ -65,13 +69,13 @@ async def async_setup_entry( ) -class EcoNetThermostat(EcoNetEntity, ClimateEntity): +class EcoNetThermostat(EcoNetEntity[Thermostat], ClimateEntity): """Define an Econet thermostat.""" _attr_should_poll = True _attr_temperature_unit = UnitOfTemperature.FAHRENHEIT - def __init__(self, thermostat): + def __init__(self, thermostat: Thermostat) -> None: """Initialize.""" super().__init__(thermostat) self._attr_hvac_modes = [] @@ -92,24 +96,24 @@ class EcoNetThermostat(EcoNetEntity, ClimateEntity): ) @property - def current_temperature(self): + def current_temperature(self) -> int: """Return the current temperature.""" return self._econet.set_point @property - def current_humidity(self): + def current_humidity(self) -> int: """Return the current humidity.""" return self._econet.humidity @property - def target_humidity(self): + def target_humidity(self) -> int | None: """Return the humidity we try to reach.""" if self._econet.supports_humidifier: return self._econet.dehumidifier_set_point return None @property - def target_temperature(self): + def target_temperature(self) -> int | None: """Return the temperature we try to reach.""" if self.hvac_mode == HVACMode.COOL: return self._econet.cool_set_point @@ -118,14 +122,14 @@ class EcoNetThermostat(EcoNetEntity, ClimateEntity): return None @property - def target_temperature_low(self): + def target_temperature_low(self) -> int | None: """Return the lower bound temperature we try to reach.""" if self.hvac_mode == HVACMode.HEAT_COOL: return self._econet.heat_set_point return None @property - def target_temperature_high(self): + def target_temperature_high(self) -> int | None: """Return the higher bound temperature we try to reach.""" if self.hvac_mode == HVACMode.HEAT_COOL: return self._econet.cool_set_point @@ -142,7 +146,7 @@ class EcoNetThermostat(EcoNetEntity, ClimateEntity): self._econet.set_set_point(None, target_temp_high, target_temp_low) @property - def is_aux_heat(self): + def is_aux_heat(self) -> bool: """Return true if aux heater.""" return self._econet.mode == ThermostatOperationMode.EMERGENCY_HEAT @@ -171,7 +175,7 @@ class EcoNetThermostat(EcoNetEntity, ClimateEntity): self._econet.set_dehumidifier_set_point(humidity) @property - def fan_mode(self): + def fan_mode(self) -> str: """Return the current fan mode.""" econet_fan_mode = self._econet.fan_mode @@ -185,7 +189,7 @@ class EcoNetThermostat(EcoNetEntity, ClimateEntity): return _current_fan_mode @property - def fan_modes(self): + def fan_modes(self) -> list[str]: """Return the fan modes.""" return [ ECONET_FAN_STATE_TO_HA[mode] diff --git a/homeassistant/components/econet/entity.py b/homeassistant/components/econet/entity.py index 44488f0b133..2ec8af83dd0 100644 --- a/homeassistant/components/econet/entity.py +++ b/homeassistant/components/econet/entity.py @@ -1,5 +1,7 @@ """Support for EcoNet products.""" +from pyeconet.equipment import Equipment + from homeassistant.core import callback from homeassistant.helpers.device_registry import DeviceInfo from homeassistant.helpers.dispatcher import async_dispatcher_connect @@ -8,18 +10,18 @@ from homeassistant.helpers.entity import Entity from .const import DOMAIN, PUSH_UPDATE -class EcoNetEntity(Entity): +class EcoNetEntity[_EquipmentT: Equipment = Equipment](Entity): """Define a base EcoNet entity.""" _attr_should_poll = False - def __init__(self, econet): + def __init__(self, econet: _EquipmentT) -> None: """Initialize.""" self._econet = econet self._attr_name = econet.device_name self._attr_unique_id = f"{econet.device_id}_{econet.device_name}" - async def async_added_to_hass(self): + async def async_added_to_hass(self) -> None: """Subscribe to device events.""" await super().async_added_to_hass() self.async_on_remove( @@ -27,12 +29,12 @@ class EcoNetEntity(Entity): ) @callback - def on_update_received(self): + def on_update_received(self) -> None: """Update was pushed from the ecoent API.""" self.async_write_ha_state() @property - def available(self): + def available(self) -> bool: """Return if the device is online or not.""" return self._econet.connected diff --git a/homeassistant/components/econet/switch.py b/homeassistant/components/econet/switch.py index 283256f25e3..9fcd38c860e 100644 --- a/homeassistant/components/econet/switch.py +++ b/homeassistant/components/econet/switch.py @@ -6,7 +6,7 @@ import logging from typing import Any from pyeconet.equipment import EquipmentType -from pyeconet.equipment.thermostat import ThermostatOperationMode +from pyeconet.equipment.thermostat import Thermostat, ThermostatOperationMode from homeassistant.components.switch import SwitchEntity from homeassistant.core import HomeAssistant @@ -31,10 +31,10 @@ async def async_setup_entry( ) -class EcoNetSwitchAuxHeatOnly(EcoNetEntity, SwitchEntity): +class EcoNetSwitchAuxHeatOnly(EcoNetEntity[Thermostat], SwitchEntity): """Representation of a aux_heat_only EcoNet switch.""" - def __init__(self, thermostat) -> None: + def __init__(self, thermostat: Thermostat) -> None: """Initialize EcoNet ventilator platform.""" super().__init__(thermostat) self._attr_name = f"{thermostat.device_name} emergency heat" diff --git a/homeassistant/components/econet/water_heater.py b/homeassistant/components/econet/water_heater.py index fc3fe5e4bdf..cfbff70b580 100644 --- a/homeassistant/components/econet/water_heater.py +++ b/homeassistant/components/econet/water_heater.py @@ -5,7 +5,7 @@ import logging from typing import Any from pyeconet.equipment import EquipmentType -from pyeconet.equipment.water_heater import WaterHeaterOperationMode +from pyeconet.equipment.water_heater import WaterHeater, WaterHeaterOperationMode from homeassistant.components.water_heater import ( STATE_ECO, @@ -61,24 +61,24 @@ async def async_setup_entry( ) -class EcoNetWaterHeater(EcoNetEntity, WaterHeaterEntity): +class EcoNetWaterHeater(EcoNetEntity[WaterHeater], WaterHeaterEntity): """Define an Econet water heater.""" _attr_should_poll = True # Override False default from EcoNetEntity _attr_temperature_unit = UnitOfTemperature.FAHRENHEIT - def __init__(self, water_heater): + def __init__(self, water_heater: WaterHeater) -> None: """Initialize.""" super().__init__(water_heater) self.water_heater = water_heater @property - def is_away_mode_on(self): + def is_away_mode_on(self) -> bool: """Return true if away mode is on.""" return self._econet.away @property - def current_operation(self): + def current_operation(self) -> str: """Return current operation.""" econet_mode = self.water_heater.mode _current_op = STATE_OFF @@ -88,7 +88,7 @@ class EcoNetWaterHeater(EcoNetEntity, WaterHeaterEntity): return _current_op @property - def operation_list(self): + def operation_list(self) -> list[str]: """List of available operation modes.""" econet_modes = self.water_heater.modes op_list = [] @@ -131,7 +131,7 @@ class EcoNetWaterHeater(EcoNetEntity, WaterHeaterEntity): _LOGGER.error("Invalid operation mode: %s", operation_mode) @property - def target_temperature(self): + def target_temperature(self) -> int: """Return the temperature we try to reach.""" return self.water_heater.set_point