From e616583badc9b7cd7dd9f04be05117f38b5af38d Mon Sep 17 00:00:00 2001 From: Simone Chemelli Date: Tue, 11 May 2021 17:41:27 +0200 Subject: [PATCH] Improve types for Fritz (#50327) Co-authored-by: Ruslan Sayfutdinov Co-authored-by: Maciej Bieniek --- homeassistant/components/fritz/sensor.py | 71 +++++++++++++----------- mypy.ini | 3 - script/hassfest/mypy_config.py | 1 - 3 files changed, 40 insertions(+), 35 deletions(-) diff --git a/homeassistant/components/fritz/sensor.py b/homeassistant/components/fritz/sensor.py index 21c121ea295..19c2859b7f0 100644 --- a/homeassistant/components/fritz/sensor.py +++ b/homeassistant/components/fritz/sensor.py @@ -3,13 +3,16 @@ from __future__ import annotations import datetime import logging +from typing import Callable, TypedDict from fritzconnection.core.exceptions import FritzConnectionException +from fritzconnection.lib.fritzstatus import FritzStatus from homeassistant.components.binary_sensor import BinarySensorEntity from homeassistant.config_entries import ConfigEntry from homeassistant.const import DEVICE_CLASS_TIMESTAMP from homeassistant.core import HomeAssistant +from homeassistant.helpers.entity_platform import AddEntitiesCallback from homeassistant.util.dt import utcnow from .common import FritzBoxBaseEntity, FritzBoxTools @@ -18,7 +21,7 @@ from .const import DOMAIN, UPTIME_DEVIATION _LOGGER = logging.getLogger(__name__) -def _retrieve_uptime_state(status, last_value): +def _retrieve_uptime_state(status: FritzStatus, last_value: str) -> str: """Return uptime from device.""" delta_uptime = utcnow() - datetime.timedelta(seconds=status.uptime) @@ -34,30 +37,38 @@ def _retrieve_uptime_state(status, last_value): return last_value -def _retrieve_external_ip_state(status, last_value): +def _retrieve_external_ip_state(status: FritzStatus, last_value: str) -> str: """Return external ip from device.""" - return status.external_ip + return status.external_ip # type: ignore[no-any-return] -SENSOR_NAME = 0 -SENSOR_DEVICE_CLASS = 1 -SENSOR_ICON = 2 -SENSOR_STATE_PROVIDER = 3 +class SensorData(TypedDict): + """Sensor data class.""" + + name: str + device_class: str | None + icon: str | None + state_provider: Callable + -# sensor_type: [name, device_class, icon, state_provider] SENSOR_DATA = { - "external_ip": [ - "External IP", - None, - "mdi:earth", - _retrieve_external_ip_state, - ], - "uptime": ["Uptime", DEVICE_CLASS_TIMESTAMP, None, _retrieve_uptime_state], + "external_ip": SensorData( + name="External IP", + device_class=None, + icon="mdi:earth", + state_provider=_retrieve_external_ip_state, + ), + "uptime": SensorData( + name="Uptime", + device_class=DEVICE_CLASS_TIMESTAMP, + icon=None, + state_provider=_retrieve_uptime_state, + ), } async def async_setup_entry( - hass: HomeAssistant, entry: ConfigEntry, async_add_entities + hass: HomeAssistant, entry: ConfigEntry, async_add_entities: AddEntitiesCallback ) -> None: """Set up entry.""" _LOGGER.debug("Setting up FRITZ!Box sensors") @@ -81,36 +92,36 @@ class FritzBoxSensor(FritzBoxBaseEntity, BinarySensorEntity): self, fritzbox_tools: FritzBoxTools, device_friendlyname: str, sensor_type: str ) -> None: """Init FRITZ!Box connectivity class.""" - self._sensor_data = SENSOR_DATA[sensor_type] + self._sensor_data: SensorData = SENSOR_DATA[sensor_type] self._unique_id = f"{fritzbox_tools.unique_id}-{sensor_type}" - self._name = f"{device_friendlyname} {self._sensor_data[SENSOR_NAME]}" + self._name = f"{device_friendlyname} {self._sensor_data['name']}" self._is_available = True self._last_value: str | None = None self._state: str | None = None super().__init__(fritzbox_tools, device_friendlyname) @property - def _state_provider(self): + def _state_provider(self) -> Callable: """Return the state provider for the binary sensor.""" - return self._sensor_data[SENSOR_STATE_PROVIDER] + return self._sensor_data["state_provider"] @property - def name(self): + def name(self) -> str: """Return name.""" return self._name @property def device_class(self) -> str | None: """Return device class.""" - return self._sensor_data[SENSOR_DEVICE_CLASS] + return self._sensor_data["device_class"] @property - def icon(self): + def icon(self) -> str | None: """Return icon.""" - return self._sensor_data[SENSOR_ICON] + return self._sensor_data["icon"] @property - def unique_id(self): + def unique_id(self) -> str: """Return unique id.""" return self._unique_id @@ -129,13 +140,11 @@ class FritzBoxSensor(FritzBoxBaseEntity, BinarySensorEntity): _LOGGER.debug("Updating FRITZ!Box sensors") try: - status = self._fritzbox_tools.fritzstatus + status: FritzStatus = self._fritzbox_tools.fritzstatus self._is_available = True - - self._state = self._last_value = self._state_provider( - status, self._last_value - ) - except FritzConnectionException: _LOGGER.error("Error getting the state from the FRITZ!Box", exc_info=True) self._is_available = False + return + + self._state = self._last_value = self._state_provider(status, self._last_value) diff --git a/mypy.ini b/mypy.ini index 92c40569fac..d501c482dd6 100644 --- a/mypy.ini +++ b/mypy.ini @@ -770,9 +770,6 @@ ignore_errors = true [mypy-homeassistant.components.freebox.*] ignore_errors = true -[mypy-homeassistant.components.fritz.*] -ignore_errors = true - [mypy-homeassistant.components.fritzbox.*] ignore_errors = true diff --git a/script/hassfest/mypy_config.py b/script/hassfest/mypy_config.py index f7ec869b654..0bc97412bc0 100644 --- a/script/hassfest/mypy_config.py +++ b/script/hassfest/mypy_config.py @@ -69,7 +69,6 @@ IGNORED_MODULES: Final[list[str]] = [ "homeassistant.components.fortios.*", "homeassistant.components.foscam.*", "homeassistant.components.freebox.*", - "homeassistant.components.fritz.*", "homeassistant.components.fritzbox.*", "homeassistant.components.garmin_connect.*", "homeassistant.components.geniushub.*",