diff --git a/homeassistant/components/huawei_lte/__init__.py b/homeassistant/components/huawei_lte/__init__.py index c0db281d768..8deed67e62b 100644 --- a/homeassistant/components/huawei_lte/__init__.py +++ b/homeassistant/components/huawei_lte/__init__.py @@ -146,7 +146,7 @@ class Router: suspended = attr.ib(init=False, default=False) notify_last_attempt: float = attr.ib(init=False, default=-1) - def __attrs_post_init__(self): + def __attrs_post_init__(self) -> None: """Set up internal state on init.""" self.client = Client(self.connection) @@ -176,7 +176,7 @@ class Router: """Get router connections for device registry.""" return {(dr.CONNECTION_NETWORK_MAC, self.mac)} if self.mac else set() - def _get_data(self, key: str, func: Callable[[None], Any]) -> None: + def _get_data(self, key: str, func: Callable[[], Any]) -> None: if not self.subscriptions.get(key): return if key in self.inflight_gets: @@ -275,7 +275,7 @@ class Router: except Exception: # pylint: disable=broad-except _LOGGER.warning("Logout error", exc_info=True) - def cleanup(self, *_) -> None: + def cleanup(self, *_: Any) -> None: """Clean up resources.""" self.subscriptions.clear() @@ -359,7 +359,7 @@ async def async_setup_entry(hass: HomeAssistantType, config_entry: ConfigEntry) username = config_entry.data.get(CONF_USERNAME) password = config_entry.data.get(CONF_PASSWORD) if username or password: - connection = AuthorizedConnection( + connection: Connection = AuthorizedConnection( url, username=username, password=password, timeout=CONNECTION_TIMEOUT ) else: diff --git a/homeassistant/components/huawei_lte/binary_sensor.py b/homeassistant/components/huawei_lte/binary_sensor.py index 2b55245719b..f5c60963aa7 100644 --- a/homeassistant/components/huawei_lte/binary_sensor.py +++ b/homeassistant/components/huawei_lte/binary_sensor.py @@ -1,7 +1,7 @@ """Support for Huawei LTE binary sensors.""" import logging -from typing import Optional +from typing import List, Optional import attr from huawei_lte_api.enums.cradle import ConnectionStatusEnum @@ -11,6 +11,7 @@ from homeassistant.components.binary_sensor import ( BinarySensorEntity, ) from homeassistant.const import CONF_URL +from homeassistant.helpers.entity import Entity from . import HuaweiLteBaseEntity from .const import ( @@ -26,7 +27,7 @@ _LOGGER = logging.getLogger(__name__) async def async_setup_entry(hass, config_entry, async_add_entities): """Set up from config entry.""" router = hass.data[DOMAIN].routers[config_entry.data[CONF_URL]] - entities = [] + entities: List[Entity] = [] if router.data.get(KEY_MONITORING_STATUS): entities.append(HuaweiLteMobileConnectionBinarySensor(router)) @@ -57,19 +58,19 @@ class HuaweiLteBaseBinarySensor(HuaweiLteBaseEntity, BinarySensorEntity): def _device_unique_id(self) -> str: return f"{self.key}.{self.item}" - async def async_added_to_hass(self): + 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].add(f"{BINARY_SENSOR_DOMAIN}/{self.item}") - async def async_will_remove_from_hass(self): + 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"{BINARY_SENSOR_DOMAIN}/{self.item}" ) - async def async_update(self): + async def async_update(self) -> None: """Update state.""" try: value = self.router.data[self.key][self.item] @@ -94,7 +95,7 @@ CONNECTION_STATE_ATTRIBUTES = { class HuaweiLteMobileConnectionBinarySensor(HuaweiLteBaseBinarySensor): """Huawei LTE mobile connection binary sensor.""" - def __attrs_post_init__(self): + def __attrs_post_init__(self) -> None: """Initialize identifiers.""" self.key = KEY_MONITORING_STATUS self.item = "ConnectionStatus" @@ -121,7 +122,7 @@ class HuaweiLteMobileConnectionBinarySensor(HuaweiLteBaseBinarySensor): ) @property - def icon(self): + def icon(self) -> str: """Return mobile connectivity sensor icon.""" return "mdi:signal" if self.is_on else "mdi:signal-off" @@ -157,7 +158,7 @@ class HuaweiLteBaseWifiStatusBinarySensor(HuaweiLteBaseBinarySensor): return self._raw_state is None @property - def icon(self): + def icon(self) -> str: """Return WiFi status sensor icon.""" return "mdi:wifi" if self.is_on else "mdi:wifi-off" @@ -166,7 +167,7 @@ class HuaweiLteBaseWifiStatusBinarySensor(HuaweiLteBaseBinarySensor): class HuaweiLteWifiStatusBinarySensor(HuaweiLteBaseWifiStatusBinarySensor): """Huawei LTE WiFi status binary sensor.""" - def __attrs_post_init__(self): + def __attrs_post_init__(self) -> None: """Initialize identifiers.""" self.key = KEY_MONITORING_STATUS self.item = "WifiStatus" @@ -180,7 +181,7 @@ class HuaweiLteWifiStatusBinarySensor(HuaweiLteBaseWifiStatusBinarySensor): class HuaweiLteWifi24ghzStatusBinarySensor(HuaweiLteBaseWifiStatusBinarySensor): """Huawei LTE 2.4GHz WiFi status binary sensor.""" - def __attrs_post_init__(self): + def __attrs_post_init__(self) -> None: """Initialize identifiers.""" self.key = KEY_WLAN_WIFI_FEATURE_SWITCH self.item = "wifi24g_switch_enable" @@ -194,7 +195,7 @@ class HuaweiLteWifi24ghzStatusBinarySensor(HuaweiLteBaseWifiStatusBinarySensor): class HuaweiLteWifi5ghzStatusBinarySensor(HuaweiLteBaseWifiStatusBinarySensor): """Huawei LTE 5GHz WiFi status binary sensor.""" - def __attrs_post_init__(self): + def __attrs_post_init__(self) -> None: """Initialize identifiers.""" self.key = KEY_WLAN_WIFI_FEATURE_SWITCH self.item = "wifi5g_enabled" @@ -208,7 +209,7 @@ class HuaweiLteWifi5ghzStatusBinarySensor(HuaweiLteBaseWifiStatusBinarySensor): class HuaweiLteSmsStorageFullBinarySensor(HuaweiLteBaseBinarySensor): """Huawei LTE SMS storage full binary sensor.""" - def __attrs_post_init__(self): + def __attrs_post_init__(self) -> None: """Initialize identifiers.""" self.key = KEY_MONITORING_CHECK_NOTIFICATIONS self.item = "SmsStorageFull" @@ -228,6 +229,6 @@ class HuaweiLteSmsStorageFullBinarySensor(HuaweiLteBaseBinarySensor): return self._raw_state is None @property - def icon(self): + def icon(self) -> str: """Return WiFi status sensor icon.""" return "mdi:email-alert" if self.is_on else "mdi:email-off" diff --git a/homeassistant/components/huawei_lte/config_flow.py b/homeassistant/components/huawei_lte/config_flow.py index c70b96297b7..af45f7e59bd 100644 --- a/homeassistant/components/huawei_lte/config_flow.py +++ b/homeassistant/components/huawei_lte/config_flow.py @@ -121,7 +121,7 @@ class ConfigFlowHandler(config_entries.ConfigFlow, domain=DOMAIN): if self._already_configured(user_input): return self.async_abort(reason="already_configured") - conn = None + conn: Optional[Connection] = None def logout(): if hasattr(conn, "user"): diff --git a/homeassistant/components/huawei_lte/device_tracker.py b/homeassistant/components/huawei_lte/device_tracker.py index 80578fce7d9..781f2dfcf11 100644 --- a/homeassistant/components/huawei_lte/device_tracker.py +++ b/homeassistant/components/huawei_lte/device_tracker.py @@ -16,6 +16,7 @@ from homeassistant.const import CONF_URL from homeassistant.core import callback from homeassistant.helpers import entity_registry from homeassistant.helpers.dispatcher import async_dispatcher_connect +from homeassistant.helpers.entity import Entity from . import HuaweiLteBaseEntity from .const import DOMAIN, KEY_WLAN_HOST_LIST, UPDATE_SIGNAL @@ -81,7 +82,7 @@ def async_add_new_entities(hass, router_url, async_add_entities, tracked): _LOGGER.debug("%s[%s][%s] not in data", KEY_WLAN_HOST_LIST, "Hosts", "Host") return - new_entities = [] + new_entities: List[Entity] = [] for host in (x for x in hosts if x.get("MacAddress")): entity = HuaweiLteScannerEntity(router, host["MacAddress"]) if entity.unique_id in tracked: @@ -116,7 +117,7 @@ class HuaweiLteScannerEntity(HuaweiLteBaseEntity, ScannerEntity): _hostname: Optional[str] = attr.ib(init=False, default=None) _device_state_attributes: Dict[str, Any] = attr.ib(init=False, factory=dict) - def __attrs_post_init__(self): + def __attrs_post_init__(self) -> None: """Initialize internal state.""" self._device_state_attributes["mac_address"] = self.mac @@ -148,7 +149,7 @@ class HuaweiLteScannerEntity(HuaweiLteBaseEntity, ScannerEntity): hosts = self.router.data[KEY_WLAN_HOST_LIST]["Hosts"]["Host"] host = next((x for x in hosts if x.get("MacAddress") == self.mac), None) self._is_connected = host is not None - if self._is_connected: + if host is not None: self._hostname = host.get("HostName") self._device_state_attributes = { _better_snakecase(k): v for k, v in host.items() if k != "HostName" diff --git a/homeassistant/components/huawei_lte/sensor.py b/homeassistant/components/huawei_lte/sensor.py index 591506df652..64f5f8176a9 100644 --- a/homeassistant/components/huawei_lte/sensor.py +++ b/homeassistant/components/huawei_lte/sensor.py @@ -2,7 +2,7 @@ import logging import re -from typing import Callable, Dict, NamedTuple, Optional, Pattern, Tuple, Union +from typing import Callable, Dict, List, NamedTuple, Optional, Pattern, Tuple, Union import attr @@ -17,6 +17,7 @@ from homeassistant.const import ( STATE_UNKNOWN, TIME_SECONDS, ) +from homeassistant.helpers.entity import Entity from homeassistant.helpers.typing import StateType from . import HuaweiLteBaseEntity @@ -324,7 +325,7 @@ SENSOR_META: Dict[Union[str, Tuple[str, str]], SensorMeta] = { async def async_setup_entry(hass, config_entry, async_add_entities): """Set up from config entry.""" router = hass.data[DOMAIN].routers[config_entry.data[CONF_URL]] - sensors = [] + sensors: List[Entity] = [] for key in SENSOR_KEYS: items = router.data.get(key) if not items: @@ -370,15 +371,15 @@ class HuaweiLteSensor(HuaweiLteBaseEntity): item: str = attr.ib() meta: SensorMeta = attr.ib() - _state = attr.ib(init=False, default=STATE_UNKNOWN) - _unit: str = attr.ib(init=False) + _state: StateType = attr.ib(init=False, default=STATE_UNKNOWN) + _unit: Optional[str] = attr.ib(init=False) - async def async_added_to_hass(self): + 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].add(f"{SENSOR_DOMAIN}/{self.item}") - async def async_will_remove_from_hass(self): + 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"{SENSOR_DOMAIN}/{self.item}") @@ -392,7 +393,7 @@ class HuaweiLteSensor(HuaweiLteBaseEntity): return f"{self.key}.{self.item}" @property - def state(self): + def state(self) -> StateType: """Return sensor state.""" return self._state @@ -402,12 +403,12 @@ class HuaweiLteSensor(HuaweiLteBaseEntity): return self.meta.device_class @property - def unit_of_measurement(self): + def unit_of_measurement(self) -> Optional[str]: """Return sensor's unit of measurement.""" return self.meta.unit or self._unit @property - def icon(self): + def icon(self) -> Optional[str]: """Return icon for sensor.""" icon = self.meta.icon if callable(icon): @@ -419,7 +420,7 @@ class HuaweiLteSensor(HuaweiLteBaseEntity): """Return if the entity should be enabled when first added to the entity registry.""" return self.meta.enabled_default - async def async_update(self): + async def async_update(self) -> None: """Update state.""" try: value = self.router.data[self.key][self.item] diff --git a/homeassistant/components/huawei_lte/switch.py b/homeassistant/components/huawei_lte/switch.py index 45b179f470f..853fe3f40e7 100644 --- a/homeassistant/components/huawei_lte/switch.py +++ b/homeassistant/components/huawei_lte/switch.py @@ -1,7 +1,7 @@ """Support for Huawei LTE switches.""" import logging -from typing import Optional +from typing import Any, List, Optional import attr @@ -11,6 +11,7 @@ from homeassistant.components.switch import ( SwitchEntity, ) from homeassistant.const import CONF_URL +from homeassistant.helpers.entity import Entity from . import HuaweiLteBaseEntity from .const import DOMAIN, KEY_DIALUP_MOBILE_DATASWITCH @@ -21,7 +22,7 @@ _LOGGER = logging.getLogger(__name__) async def async_setup_entry(hass, config_entry, async_add_entities): """Set up from config entry.""" router = hass.data[DOMAIN].routers[config_entry.data[CONF_URL]] - switches = [] + switches: List[Entity] = [] if router.data.get(KEY_DIALUP_MOBILE_DATASWITCH): switches.append(HuaweiLteMobileDataSwitch(router)) @@ -40,30 +41,30 @@ class HuaweiLteBaseSwitch(HuaweiLteBaseEntity, SwitchEntity): def _turn(self, state: bool) -> None: raise NotImplementedError - def turn_on(self, **kwargs): + def turn_on(self, **kwargs: Any) -> None: """Turn switch on.""" self._turn(state=True) - def turn_off(self, **kwargs): + def turn_off(self, **kwargs: Any) -> None: """Turn switch off.""" self._turn(state=False) @property - def device_class(self): + def device_class(self) -> str: """Return device class.""" return DEVICE_CLASS_SWITCH - async def async_added_to_hass(self): + 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].add(f"{SWITCH_DOMAIN}/{self.item}") - async def async_will_remove_from_hass(self): + 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}") - async def async_update(self): + async def async_update(self) -> None: """Update state.""" try: value = self.router.data[self.key][self.item] @@ -79,7 +80,7 @@ class HuaweiLteBaseSwitch(HuaweiLteBaseEntity, SwitchEntity): class HuaweiLteMobileDataSwitch(HuaweiLteBaseSwitch): """Huawei LTE mobile data switch device.""" - def __attrs_post_init__(self): + def __attrs_post_init__(self) -> None: """Initialize identifiers.""" self.key = KEY_DIALUP_MOBILE_DATASWITCH self.item = "dataswitch" @@ -104,6 +105,6 @@ class HuaweiLteMobileDataSwitch(HuaweiLteBaseSwitch): self.schedule_update_ha_state() @property - def icon(self): + def icon(self) -> str: """Return switch icon.""" return "mdi:signal" if self.is_on else "mdi:signal-off"