diff --git a/homeassistant/components/huawei_lte/binary_sensor.py b/homeassistant/components/huawei_lte/binary_sensor.py index 41f4638b713..c72dea2c191 100644 --- a/homeassistant/components/huawei_lte/binary_sensor.py +++ b/homeassistant/components/huawei_lte/binary_sensor.py @@ -3,7 +3,7 @@ from __future__ import annotations import logging -from typing import Any +from typing import Any, override from huawei_lte_api.enums.cradle import ConnectionStatusEnum @@ -59,9 +59,11 @@ class HuaweiLteBaseBinarySensor(HuaweiLteBaseEntityWithDevice, BinarySensorEntit _raw_state: str | None = None @property + @override def _device_unique_id(self) -> str: return f"{self.key}.{self.item}" + @override async def async_added_to_hass(self) -> None: """Subscribe to needed data on add.""" await super().async_added_to_hass() @@ -69,6 +71,7 @@ class HuaweiLteBaseBinarySensor(HuaweiLteBaseEntityWithDevice, BinarySensorEntit f"{BINARY_SENSOR_DOMAIN}/{self.item}" ) + @override async def async_will_remove_from_hass(self) -> None: """Unsubscribe from needed data on remove.""" await super().async_will_remove_from_hass() @@ -76,6 +79,7 @@ class HuaweiLteBaseBinarySensor(HuaweiLteBaseEntityWithDevice, BinarySensorEntit f"{BINARY_SENSOR_DOMAIN}/{self.item}" ) + @override async def async_update(self) -> None: """Update state.""" try: @@ -111,6 +115,7 @@ class HuaweiLteMobileConnectionBinarySensor(HuaweiLteBaseBinarySensor): item = "ConnectionStatus" @property + @override def is_on(self) -> bool: """Return whether the binary sensor is on.""" return bool( @@ -120,6 +125,7 @@ class HuaweiLteMobileConnectionBinarySensor(HuaweiLteBaseBinarySensor): ) @property + @override def assumed_state(self) -> bool: """Return True if real state is assumed, not known.""" return not self._raw_state or int(self._raw_state) not in ( @@ -129,6 +135,7 @@ class HuaweiLteMobileConnectionBinarySensor(HuaweiLteBaseBinarySensor): ) @property + @override def extra_state_attributes(self) -> dict[str, Any] | None: """Get additional attributes related to connection status.""" attributes = {} @@ -145,11 +152,13 @@ class HuaweiLteBaseWifiStatusBinarySensor(HuaweiLteBaseBinarySensor): _attr_device_class = BinarySensorDeviceClass.CONNECTIVITY @property + @override def is_on(self) -> bool: """Return whether the binary sensor is on.""" return self._raw_state is not None and int(self._raw_state) == 1 @property + @override def assumed_state(self) -> bool: """Return True if real state is assumed, not known.""" return self._raw_state is None @@ -191,11 +200,13 @@ class HuaweiLteSmsStorageFullBinarySensor(HuaweiLteBaseBinarySensor): item = "SmsStorageFull" @property + @override def is_on(self) -> bool: """Return whether the binary sensor is on.""" return self._raw_state is not None and int(self._raw_state) != 0 @property + @override def assumed_state(self) -> bool: """Return True if real state is assumed, not known.""" return self._raw_state is None diff --git a/homeassistant/components/huawei_lte/button.py b/homeassistant/components/huawei_lte/button.py index 44b35d51dd4..400aa42b540 100644 --- a/homeassistant/components/huawei_lte/button.py +++ b/homeassistant/components/huawei_lte/button.py @@ -3,6 +3,7 @@ from __future__ import annotations import logging +from typing import override from huawei_lte_api.enums.device import ControlModeEnum @@ -40,13 +41,16 @@ class BaseButton(HuaweiLteBaseEntityWithDevice, ButtonEntity): """Huawei LTE button base class.""" @property + @override def _device_unique_id(self) -> str: """Return unique ID for entity within a router.""" return f"button-{self.entity_description.key}" + @override async def async_update(self) -> None: """Update is not necessary for button entities.""" + @override def press(self) -> None: """Press button.""" if self.router.suspended: @@ -74,6 +78,7 @@ class ClearTrafficStatisticsButton(BaseButton): entity_category=EntityCategory.CONFIG, ) + @override def _press(self) -> str: """Call clear traffic statistics endpoint.""" return self.router.client.monitoring.set_clear_traffic() @@ -92,6 +97,7 @@ class RestartButton(BaseButton): entity_category=EntityCategory.CONFIG, ) + @override def _press(self) -> str: """Call restart endpoint.""" return self.router.client.device.set_control(ControlModeEnum.REBOOT) diff --git a/homeassistant/components/huawei_lte/config_flow.py b/homeassistant/components/huawei_lte/config_flow.py index 002f19bc9e0..fc9f0121047 100644 --- a/homeassistant/components/huawei_lte/config_flow.py +++ b/homeassistant/components/huawei_lte/config_flow.py @@ -4,7 +4,7 @@ from __future__ import annotations from collections.abc import Mapping import logging -from typing import TYPE_CHECKING, Any +from typing import TYPE_CHECKING, Any, override from urllib.parse import urlparse from huawei_lte_api.Client import Client @@ -75,6 +75,7 @@ class HuaweiLteConfigFlow(ConfigFlow, domain=DOMAIN): @staticmethod @callback + @override def async_get_options_flow( config_entry: ConfigEntry, ) -> HuaweiLteOptionsFlow: @@ -194,6 +195,7 @@ class HuaweiLteConfigFlow(ConfigFlow, domain=DOMAIN): except Exception: _LOGGER.exception("Disconnect error") + @override async def async_step_user( self, user_input: dict[str, Any] | None = None ) -> ConfigFlowResult: @@ -272,6 +274,7 @@ class HuaweiLteConfigFlow(ConfigFlow, domain=DOMAIN): return self.async_create_entry(title=title, data=user_input) + @override async def async_step_ssdp( self, discovery_info: SsdpServiceInfo ) -> ConfigFlowResult: diff --git a/homeassistant/components/huawei_lte/device_tracker.py b/homeassistant/components/huawei_lte/device_tracker.py index 83e82bf17ff..cc32866b554 100644 --- a/homeassistant/components/huawei_lte/device_tracker.py +++ b/homeassistant/components/huawei_lte/device_tracker.py @@ -4,7 +4,7 @@ from __future__ import annotations import logging import re -from typing import Any, cast +from typing import Any, cast, override from stringcase import snakecase @@ -186,39 +186,47 @@ class HuaweiLteScannerEntity(HuaweiLteBaseEntity, ScannerEntity): self._mac_address = mac_address @property + @override def name(self) -> str: """Return the name of the entity.""" return self.hostname or self.mac_address @property + @override def _device_unique_id(self) -> str: return self.mac_address @property + @override def ip_address(self) -> str | None: """Return the primary ip address of the device.""" return self._ip_address @property + @override def mac_address(self) -> str: """Return the mac address of the device.""" return self._mac_address @property + @override def hostname(self) -> str | None: """Return hostname of the device.""" return self._hostname @property + @override def is_connected(self) -> bool: """Get whether the entity is connected.""" return self._is_connected @property + @override def extra_state_attributes(self) -> dict[str, Any]: """Get additional attributes related to entity state.""" return self._extra_state_attributes + @override async def async_update(self) -> None: """Update state.""" if (hosts := _get_hosts(self.router)) is None: diff --git a/homeassistant/components/huawei_lte/entity.py b/homeassistant/components/huawei_lte/entity.py index b69d2e79fb6..49b28d24f93 100644 --- a/homeassistant/components/huawei_lte/entity.py +++ b/homeassistant/components/huawei_lte/entity.py @@ -3,6 +3,7 @@ from __future__ import annotations from datetime import timedelta +from typing import override from homeassistant.helpers.device_registry import DeviceInfo from homeassistant.helpers.dispatcher import async_dispatcher_connect @@ -31,11 +32,13 @@ class HuaweiLteBaseEntity(Entity): raise NotImplementedError @property + @override def unique_id(self) -> str: """Return unique ID for entity.""" return f"{self.router.config_entry.unique_id}-{self._device_unique_id}" @property + @override def available(self) -> bool: """Return whether the entity is available.""" return self._available @@ -44,6 +47,7 @@ class HuaweiLteBaseEntity(Entity): """Update state.""" raise NotImplementedError + @override async def async_added_to_hass(self) -> None: """Connect to update signals.""" self.async_on_remove( @@ -60,6 +64,7 @@ class HuaweiLteBaseEntityWithDevice(HuaweiLteBaseEntity): """Base entity with device info.""" @property + @override def device_info(self) -> DeviceInfo: """Get info for matching with parent router.""" return DeviceInfo( diff --git a/homeassistant/components/huawei_lte/notify.py b/homeassistant/components/huawei_lte/notify.py index 682470bafd0..74887045771 100644 --- a/homeassistant/components/huawei_lte/notify.py +++ b/homeassistant/components/huawei_lte/notify.py @@ -3,7 +3,7 @@ from __future__ import annotations import logging -from typing import Any +from typing import Any, override from huawei_lte_api.exceptions import ResponseErrorException @@ -41,6 +41,7 @@ class HuaweiLteSmsNotificationService(BaseNotificationService): self.router = router self.default_targets = default_targets + @override def send_message(self, message: str = "", **kwargs: Any) -> None: """Send message to target numbers.""" diff --git a/homeassistant/components/huawei_lte/select.py b/homeassistant/components/huawei_lte/select.py index 3df6fa53320..2e3defbe923 100644 --- a/homeassistant/components/huawei_lte/select.py +++ b/homeassistant/components/huawei_lte/select.py @@ -6,6 +6,7 @@ from collections.abc import Callable from dataclasses import dataclass from functools import partial import logging +from typing import override from huawei_lte_api.enums.net import LTEBandEnum, NetworkBandEnum, NetworkModeEnum @@ -100,29 +101,35 @@ class HuaweiLteSelectEntity(HuaweiLteBaseEntityWithDevice, SelectEntity): name = self.entity_description.name self._attr_name = name or self.item + @override def select_option(self, option: str) -> None: """Change the selected option.""" self.entity_description.setter_fn(option) @property + @override def current_option(self) -> str | None: """Return current option.""" return self._raw_state @property + @override def _device_unique_id(self) -> str: return f"{self.key}.{self.item}" + @override async def async_added_to_hass(self) -> None: """Subscribe to needed data on add.""" await super().async_added_to_hass() self.router.subscriptions[self.key].append(f"{SELECT_DOMAIN}/{self.item}") + @override async def async_will_remove_from_hass(self) -> None: """Unsubscribe from needed data on remove.""" await super().async_will_remove_from_hass() self.router.subscriptions[self.key].remove(f"{SELECT_DOMAIN}/{self.item}") + @override async def async_update(self) -> None: """Update state.""" try: diff --git a/homeassistant/components/huawei_lte/sensor.py b/homeassistant/components/huawei_lte/sensor.py index 003ba1f9823..445191433ef 100644 --- a/homeassistant/components/huawei_lte/sensor.py +++ b/homeassistant/components/huawei_lte/sensor.py @@ -8,6 +8,7 @@ from dataclasses import dataclass from datetime import datetime, timedelta import logging import re +from typing import override from homeassistant.components.sensor import ( DOMAIN as SENSOR_DOMAIN, @@ -790,6 +791,7 @@ class HuaweiLteSensor(HuaweiLteBaseEntityWithDevice, SensorEntity): self.item = item self.entity_description = entity_description + @override async def async_added_to_hass(self) -> None: """Subscribe to needed data on add.""" await super().async_added_to_hass() @@ -799,6 +801,7 @@ class HuaweiLteSensor(HuaweiLteBaseEntityWithDevice, SensorEntity): f"{SENSOR_DOMAIN}/{self.entity_description.last_reset_item}" ) + @override async def async_will_remove_from_hass(self) -> None: """Unsubscribe from needed data on remove.""" await super().async_will_remove_from_hass() @@ -809,15 +812,18 @@ class HuaweiLteSensor(HuaweiLteBaseEntityWithDevice, SensorEntity): ) @property + @override def _device_unique_id(self) -> str: return f"{self.key}.{self.item}" @property + @override def native_value(self) -> StateType: """Return sensor state.""" return self._state @property + @override def native_unit_of_measurement(self) -> str | None: """Return sensor's unit of measurement.""" return self.entity_description.native_unit_of_measurement or self._unit @@ -830,6 +836,7 @@ class HuaweiLteSensor(HuaweiLteBaseEntityWithDevice, SensorEntity): return super().icon @property + @override def device_class(self) -> SensorDeviceClass | None: """Return device class for sensor.""" if self.entity_description.device_class_fn: @@ -838,10 +845,12 @@ class HuaweiLteSensor(HuaweiLteBaseEntityWithDevice, SensorEntity): return super().device_class @property + @override def last_reset(self) -> datetime | None: """Return the time when the sensor was last reset, if any.""" return self._last_reset + @override async def async_update(self) -> None: """Update state.""" try: diff --git a/homeassistant/components/huawei_lte/switch.py b/homeassistant/components/huawei_lte/switch.py index ac8bca4234c..11014de693d 100644 --- a/homeassistant/components/huawei_lte/switch.py +++ b/homeassistant/components/huawei_lte/switch.py @@ -3,7 +3,7 @@ from __future__ import annotations import logging -from typing import Any +from typing import Any, override from homeassistant.components.switch import ( DOMAIN as SWITCH_DOMAIN, @@ -55,24 +55,29 @@ class HuaweiLteBaseSwitch(HuaweiLteBaseEntityWithDevice, SwitchEntity): def _turn(self, state: bool) -> None: raise NotImplementedError + @override def turn_on(self, **kwargs: Any) -> None: """Turn switch on.""" self._turn(state=True) + @override def turn_off(self, **kwargs: Any) -> None: """Turn switch off.""" self._turn(state=False) + @override async def async_added_to_hass(self) -> None: """Subscribe to needed data on add.""" await super().async_added_to_hass() self.router.subscriptions[self.key].append(f"{SWITCH_DOMAIN}/{self.item}") + @override async def async_will_remove_from_hass(self) -> None: """Unsubscribe from needed data on remove.""" await super().async_will_remove_from_hass() self.router.subscriptions[self.key].remove(f"{SWITCH_DOMAIN}/{self.item}") + @override async def async_update(self) -> None: """Update state.""" try: @@ -94,14 +99,17 @@ class HuaweiLteMobileDataSwitch(HuaweiLteBaseSwitch): item = "dataswitch" @property + @override def _device_unique_id(self) -> str: return f"{self.key}.{self.item}" @property + @override def is_on(self) -> bool: """Return whether the switch is on.""" return self._raw_state == "1" + @override def _turn(self, state: bool) -> None: value = 1 if state else 0 self.router.client.dial_up.set_mobile_dataswitch(dataswitch=value) @@ -118,20 +126,24 @@ class HuaweiLteWifiGuestNetworkSwitch(HuaweiLteBaseSwitch): item = "WifiEnable" @property + @override def _device_unique_id(self) -> str: return f"{self.key}.{self.item}" @property + @override def is_on(self) -> bool: """Return whether the switch is on.""" return self._raw_state == "1" + @override def _turn(self, state: bool) -> None: self.router.client.wlan.wifi_guest_network_switch(state) self._raw_state = "1" if state else "0" self.schedule_update_ha_state() @property + @override def extra_state_attributes(self) -> dict[str, str | None]: """Return the state attributes.""" return {"ssid": self.router.data[self.key].get("WifiSsid")}