From 86b43544779b71ea4a03e5df1047377e65a7973f Mon Sep 17 00:00:00 2001 From: epenet <6771947+epenet@users.noreply.github.com> Date: Tue, 21 Mar 2023 11:40:06 +0100 Subject: [PATCH] Improve native_value type hints in integrations (#90033) --- homeassistant/components/fivem/sensor.py | 4 +-- .../components/fully_kiosk/sensor.py | 8 +++--- .../components/kostal_plenticore/sensor.py | 3 ++- homeassistant/components/metoffice/sensor.py | 3 ++- .../components/nissan_leaf/sensor.py | 8 +++--- homeassistant/components/pi_hole/sensor.py | 9 +++---- .../components/synology_dsm/sensor.py | 26 +++++++++++-------- homeassistant/components/tibber/sensor.py | 5 ++-- 8 files changed, 35 insertions(+), 31 deletions(-) diff --git a/homeassistant/components/fivem/sensor.py b/homeassistant/components/fivem/sensor.py index 31e23565a6f..9afe5890162 100644 --- a/homeassistant/components/fivem/sensor.py +++ b/homeassistant/components/fivem/sensor.py @@ -1,11 +1,11 @@ """The FiveM sensor platform.""" from dataclasses import dataclass -from typing import Any from homeassistant.components.sensor import SensorEntity, SensorEntityDescription from homeassistant.config_entries import ConfigEntry from homeassistant.core import HomeAssistant from homeassistant.helpers.entity_platform import AddEntitiesCallback +from homeassistant.helpers.typing import StateType from . import FiveMEntity, FiveMEntityDescription from .const import ( @@ -73,6 +73,6 @@ class FiveMSensorEntity(FiveMEntity, SensorEntity): entity_description: FiveMSensorEntityDescription @property - def native_value(self) -> Any: + def native_value(self) -> StateType: """Return the state of the sensor.""" return self.coordinator.data[self.entity_description.key] diff --git a/homeassistant/components/fully_kiosk/sensor.py b/homeassistant/components/fully_kiosk/sensor.py index cf7dd62decc..60009eb6ae4 100644 --- a/homeassistant/components/fully_kiosk/sensor.py +++ b/homeassistant/components/fully_kiosk/sensor.py @@ -3,7 +3,6 @@ from __future__ import annotations from collections.abc import Callable from dataclasses import dataclass -from typing import Any from homeassistant.components.sensor import ( SensorDeviceClass, @@ -15,6 +14,7 @@ from homeassistant.config_entries import ConfigEntry from homeassistant.const import PERCENTAGE, EntityCategory, UnitOfInformation from homeassistant.core import HomeAssistant from homeassistant.helpers.entity_platform import AddEntitiesCallback +from homeassistant.helpers.typing import StateType from .const import DOMAIN from .coordinator import FullyKioskDataUpdateCoordinator @@ -30,7 +30,7 @@ def round_storage(value: int) -> float: class FullySensorEntityDescription(SensorEntityDescription): """Fully Kiosk Browser sensor description.""" - state_fn: Callable | None = None + state_fn: Callable[[int], float] | None = None SENSORS: tuple[FullySensorEntityDescription, ...] = ( @@ -130,7 +130,7 @@ class FullySensor(FullyKioskEntity, SensorEntity): super().__init__(coordinator) @property - def native_value(self) -> Any: + def native_value(self) -> StateType: """Return the state of the sensor.""" if (value := self.coordinator.data.get(self.entity_description.key)) is None: return None @@ -138,4 +138,4 @@ class FullySensor(FullyKioskEntity, SensorEntity): if self.entity_description.state_fn is not None: return self.entity_description.state_fn(value) - return value + return value # type: ignore[no-any-return] diff --git a/homeassistant/components/kostal_plenticore/sensor.py b/homeassistant/components/kostal_plenticore/sensor.py index f919d15d6b3..a9b9433c1b6 100644 --- a/homeassistant/components/kostal_plenticore/sensor.py +++ b/homeassistant/components/kostal_plenticore/sensor.py @@ -24,6 +24,7 @@ from homeassistant.const import ( from homeassistant.core import HomeAssistant from homeassistant.helpers.entity import DeviceInfo from homeassistant.helpers.entity_platform import AddEntitiesCallback +from homeassistant.helpers.typing import StateType from homeassistant.helpers.update_coordinator import CoordinatorEntity from .const import DOMAIN @@ -791,7 +792,7 @@ class PlenticoreDataSensor( return f"{self.platform_name} {self._sensor_name}" @property - def native_value(self) -> Any | None: + def native_value(self) -> StateType: """Return the state of the sensor.""" if self.coordinator.data is None: # None is translated to STATE_UNKNOWN diff --git a/homeassistant/components/metoffice/sensor.py b/homeassistant/components/metoffice/sensor.py index 544dabd018a..3bf50525ca9 100644 --- a/homeassistant/components/metoffice/sensor.py +++ b/homeassistant/components/metoffice/sensor.py @@ -20,6 +20,7 @@ from homeassistant.const import ( ) from homeassistant.core import HomeAssistant from homeassistant.helpers.entity_platform import AddEntitiesCallback +from homeassistant.helpers.typing import StateType from homeassistant.helpers.update_coordinator import ( CoordinatorEntity, DataUpdateCoordinator, @@ -207,7 +208,7 @@ class MetOfficeCurrentSensor( ) @property - def native_value(self) -> Any | None: + def native_value(self) -> StateType: """Return the state of the sensor.""" value = None diff --git a/homeassistant/components/nissan_leaf/sensor.py b/homeassistant/components/nissan_leaf/sensor.py index 5b2f99b997b..cd3524eaf87 100644 --- a/homeassistant/components/nissan_leaf/sensor.py +++ b/homeassistant/components/nissan_leaf/sensor.py @@ -3,14 +3,12 @@ from __future__ import annotations import logging -from voluptuous.validators import Number - from homeassistant.components.sensor import SensorDeviceClass, SensorEntity from homeassistant.const import PERCENTAGE, UnitOfLength from homeassistant.core import HomeAssistant from homeassistant.helpers.entity_platform import AddEntitiesCallback from homeassistant.helpers.icon import icon_for_battery_level -from homeassistant.helpers.typing import ConfigType, DiscoveryInfoType +from homeassistant.helpers.typing import ConfigType, DiscoveryInfoType, StateType from homeassistant.util.unit_conversion import DistanceConverter from homeassistant.util.unit_system import US_CUSTOMARY_SYSTEM @@ -63,11 +61,11 @@ class LeafBatterySensor(LeafEntity, SensorEntity): return f"{self.car.leaf.nickname} Charge" @property - def native_value(self) -> Number | None: + def native_value(self) -> StateType: """Battery state percentage.""" if self.car.data[DATA_BATTERY] is None: return None - return round(self.car.data[DATA_BATTERY]) + return round(self.car.data[DATA_BATTERY]) # type: ignore[no-any-return] @property def icon(self) -> str: diff --git a/homeassistant/components/pi_hole/sensor.py b/homeassistant/components/pi_hole/sensor.py index dbca8661377..5d36ba67e83 100644 --- a/homeassistant/components/pi_hole/sensor.py +++ b/homeassistant/components/pi_hole/sensor.py @@ -1,8 +1,6 @@ """Support for getting statistical data from a Pi-hole system.""" from __future__ import annotations -from typing import Any - from hole import Hole from homeassistant.components.sensor import SensorEntity, SensorEntityDescription @@ -10,6 +8,7 @@ from homeassistant.config_entries import ConfigEntry from homeassistant.const import CONF_NAME, PERCENTAGE from homeassistant.core import HomeAssistant from homeassistant.helpers.entity_platform import AddEntitiesCallback +from homeassistant.helpers.typing import StateType from homeassistant.helpers.update_coordinator import DataUpdateCoordinator from . import PiHoleEntity @@ -113,9 +112,9 @@ class PiHoleSensor(PiHoleEntity, SensorEntity): self._attr_unique_id = f"{self._server_unique_id}/{description.name}" @property - def native_value(self) -> Any: + def native_value(self) -> StateType: """Return the state of the device.""" try: - return round(self.api.data[self.entity_description.key], 2) + return round(self.api.data[self.entity_description.key], 2) # type: ignore[no-any-return] except TypeError: - return self.api.data[self.entity_description.key] + return self.api.data[self.entity_description.key] # type: ignore[no-any-return] diff --git a/homeassistant/components/synology_dsm/sensor.py b/homeassistant/components/synology_dsm/sensor.py index 06bfd166bb5..4031a921a7f 100644 --- a/homeassistant/components/synology_dsm/sensor.py +++ b/homeassistant/components/synology_dsm/sensor.py @@ -3,7 +3,6 @@ from __future__ import annotations from dataclasses import dataclass from datetime import datetime, timedelta -from typing import Any from synology_dsm.api.core.utilization import SynoCoreUtilization from synology_dsm.api.dsm.information import SynoDSMInformation @@ -26,6 +25,7 @@ from homeassistant.const import ( ) from homeassistant.core import HomeAssistant from homeassistant.helpers.entity_platform import AddEntitiesCallback +from homeassistant.helpers.typing import StateType from homeassistant.util.dt import utcnow from . import SynoApi @@ -349,7 +349,7 @@ class SynoDSMUtilSensor(SynoDSMSensor): """Representation a Synology Utilisation sensor.""" @property - def native_value(self) -> Any | None: + def native_value(self) -> StateType: """Return the state.""" attr = getattr(self._api.utilisation, self.entity_description.key) if callable(attr): @@ -357,19 +357,23 @@ class SynoDSMUtilSensor(SynoDSMSensor): if attr is None: return None + result: StateType = attr # Data (RAM) if self.native_unit_of_measurement == UnitOfInformation.MEGABYTES: - return round(attr / 1024.0**2, 1) + result = round(attr / 1024.0**2, 1) + return result # Network if self.native_unit_of_measurement == UnitOfDataRate.KILOBYTES_PER_SECOND: - return round(attr / 1024.0, 1) + result = round(attr / 1024.0, 1) + return result # CPU load average if self.native_unit_of_measurement == ENTITY_UNIT_LOAD: - return round(attr / 100, 2) + result = round(attr / 100, 2) + return result - return attr + return result @property def available(self) -> bool: @@ -393,7 +397,7 @@ class SynoDSMStorageSensor(SynologyDSMDeviceEntity, SynoDSMSensor): super().__init__(api, coordinator, description, device_id) @property - def native_value(self) -> Any | None: + def native_value(self) -> StateType: """Return the state.""" attr = getattr(self._api.storage, self.entity_description.key)(self._device_id) if attr is None: @@ -401,9 +405,9 @@ class SynoDSMStorageSensor(SynologyDSMDeviceEntity, SynoDSMSensor): # Data (disk space) if self.native_unit_of_measurement == UnitOfInformation.TERABYTES: - return round(attr / 1024.0**4, 2) + return round(attr / 1024.0**4, 2) # type: ignore[no-any-return] - return attr + return attr # type: ignore[no-any-return] class SynoDSMInfoSensor(SynoDSMSensor): @@ -421,7 +425,7 @@ class SynoDSMInfoSensor(SynoDSMSensor): self._last_boot: datetime | None = None @property - def native_value(self) -> Any | None: + def native_value(self) -> StateType | datetime: """Return the state.""" attr = getattr(self._api.information, self.entity_description.key) if attr is None: @@ -434,4 +438,4 @@ class SynoDSMInfoSensor(SynoDSMSensor): self._previous_uptime = attr return self._last_boot - return attr + return attr # type: ignore[no-any-return] diff --git a/homeassistant/components/tibber/sensor.py b/homeassistant/components/tibber/sensor.py index 874ec5be673..a2f1db7536f 100644 --- a/homeassistant/components/tibber/sensor.py +++ b/homeassistant/components/tibber/sensor.py @@ -41,6 +41,7 @@ from homeassistant.helpers.device_registry import async_get as async_get_dev_reg from homeassistant.helpers.entity import DeviceInfo from homeassistant.helpers.entity_platform import AddEntitiesCallback from homeassistant.helpers.entity_registry import async_get as async_get_entity_reg +from homeassistant.helpers.typing import StateType from homeassistant.helpers.update_coordinator import ( CoordinatorEntity, DataUpdateCoordinator, @@ -426,9 +427,9 @@ class TibberDataSensor(TibberSensor, CoordinatorEntity["TibberDataCoordinator"]) self._device_name = self._home_name @property - def native_value(self) -> Any: + def native_value(self) -> StateType: """Return the value of the sensor.""" - return getattr(self._tibber_home, self.entity_description.key) + return getattr(self._tibber_home, self.entity_description.key) # type: ignore[no-any-return] class TibberSensorRT(TibberSensor, CoordinatorEntity["TibberRtDataCoordinator"]):