Remove invalid type definitions in zha (#73596)

This commit is contained in:
epenet 2022-06-20 11:28:53 +02:00 committed by GitHub
parent 120479acef
commit 06e45893aa
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
21 changed files with 135 additions and 132 deletions

View file

@ -1,5 +1,8 @@
"""Alarm control panels on Zigbee Home Automation networks.""" """Alarm control panels on Zigbee Home Automation networks."""
from __future__ import annotations
import functools import functools
from typing import TYPE_CHECKING
from zigpy.zcl.clusters.security import IasAce from zigpy.zcl.clusters.security import IasAce
@ -38,9 +41,11 @@ from .core.const import (
) )
from .core.helpers import async_get_zha_config_value from .core.helpers import async_get_zha_config_value
from .core.registries import ZHA_ENTITIES from .core.registries import ZHA_ENTITIES
from .core.typing import ZhaDeviceType
from .entity import ZhaEntity from .entity import ZhaEntity
if TYPE_CHECKING:
from .core.device import ZHADevice
STRICT_MATCH = functools.partial( STRICT_MATCH = functools.partial(
ZHA_ENTITIES.strict_match, Platform.ALARM_CONTROL_PANEL ZHA_ENTITIES.strict_match, Platform.ALARM_CONTROL_PANEL
) )
@ -83,7 +88,7 @@ class ZHAAlarmControlPanel(ZhaEntity, AlarmControlPanelEntity):
| AlarmControlPanelEntityFeature.TRIGGER | AlarmControlPanelEntityFeature.TRIGGER
) )
def __init__(self, unique_id, zha_device: ZhaDeviceType, channels, **kwargs): def __init__(self, unique_id, zha_device: ZHADevice, channels, **kwargs):
"""Initialize the ZHA alarm control device.""" """Initialize the ZHA alarm control device."""
super().__init__(unique_id, zha_device, channels, **kwargs) super().__init__(unique_id, zha_device, channels, **kwargs)
cfg_entry = zha_device.gateway.config_entry cfg_entry = zha_device.gateway.config_entry

View file

@ -69,11 +69,11 @@ from .core.helpers import (
get_matched_clusters, get_matched_clusters,
qr_to_install_code, qr_to_install_code,
) )
from .core.typing import ZhaDeviceType
if TYPE_CHECKING: if TYPE_CHECKING:
from homeassistant.components.websocket_api.connection import ActiveConnection from homeassistant.components.websocket_api.connection import ActiveConnection
from .core.device import ZHADevice
from .core.gateway import ZHAGateway from .core.gateway import ZHAGateway
_LOGGER = logging.getLogger(__name__) _LOGGER = logging.getLogger(__name__)
@ -559,7 +559,7 @@ async def websocket_reconfigure_node(
"""Reconfigure a ZHA nodes entities by its ieee address.""" """Reconfigure a ZHA nodes entities by its ieee address."""
zha_gateway: ZHAGateway = hass.data[DATA_ZHA][DATA_ZHA_GATEWAY] zha_gateway: ZHAGateway = hass.data[DATA_ZHA][DATA_ZHA_GATEWAY]
ieee: EUI64 = msg[ATTR_IEEE] ieee: EUI64 = msg[ATTR_IEEE]
device: ZhaDeviceType = zha_gateway.get_device(ieee) device: ZHADevice = zha_gateway.get_device(ieee)
async def forward_messages(data): async def forward_messages(data):
"""Forward events to websocket.""" """Forward events to websocket."""
@ -1084,7 +1084,7 @@ def async_load_api(hass: HomeAssistant) -> None:
"""Remove a node from the network.""" """Remove a node from the network."""
zha_gateway: ZHAGateway = hass.data[DATA_ZHA][DATA_ZHA_GATEWAY] zha_gateway: ZHAGateway = hass.data[DATA_ZHA][DATA_ZHA_GATEWAY]
ieee: EUI64 = service.data[ATTR_IEEE] ieee: EUI64 = service.data[ATTR_IEEE]
zha_device: ZhaDeviceType = zha_gateway.get_device(ieee) zha_device: ZHADevice = zha_gateway.get_device(ieee)
if zha_device is not None and ( if zha_device is not None and (
zha_device.is_coordinator zha_device.is_coordinator
and zha_device.ieee == zha_gateway.application_controller.ieee and zha_device.ieee == zha_gateway.application_controller.ieee

View file

@ -4,7 +4,7 @@ from __future__ import annotations
import abc import abc
import functools import functools
import logging import logging
from typing import Any from typing import TYPE_CHECKING, Any
import zigpy.exceptions import zigpy.exceptions
from zigpy.zcl.foundation import Status from zigpy.zcl.foundation import Status
@ -20,9 +20,13 @@ from homeassistant.helpers.entity_platform import AddEntitiesCallback
from .core import discovery from .core import discovery
from .core.const import CHANNEL_IDENTIFY, DATA_ZHA, SIGNAL_ADD_ENTITIES from .core.const import CHANNEL_IDENTIFY, DATA_ZHA, SIGNAL_ADD_ENTITIES
from .core.registries import ZHA_ENTITIES from .core.registries import ZHA_ENTITIES
from .core.typing import ChannelType, ZhaDeviceType
from .entity import ZhaEntity from .entity import ZhaEntity
if TYPE_CHECKING:
from .core.channels.base import ZigbeeChannel
from .core.device import ZHADevice
MULTI_MATCH = functools.partial(ZHA_ENTITIES.multipass_match, Platform.BUTTON) MULTI_MATCH = functools.partial(ZHA_ENTITIES.multipass_match, Platform.BUTTON)
CONFIG_DIAGNOSTIC_MATCH = functools.partial( CONFIG_DIAGNOSTIC_MATCH = functools.partial(
ZHA_ENTITIES.config_diagnostic_match, Platform.BUTTON ZHA_ENTITIES.config_diagnostic_match, Platform.BUTTON
@ -60,13 +64,13 @@ class ZHAButton(ZhaEntity, ButtonEntity):
def __init__( def __init__(
self, self,
unique_id: str, unique_id: str,
zha_device: ZhaDeviceType, zha_device: ZHADevice,
channels: list[ChannelType], channels: list[ZigbeeChannel],
**kwargs, **kwargs,
) -> None: ) -> None:
"""Init this button.""" """Init this button."""
super().__init__(unique_id, zha_device, channels, **kwargs) super().__init__(unique_id, zha_device, channels, **kwargs)
self._channel: ChannelType = channels[0] self._channel: ZigbeeChannel = channels[0]
@abc.abstractmethod @abc.abstractmethod
def get_args(self) -> list[Any]: def get_args(self) -> list[Any]:
@ -87,8 +91,8 @@ class ZHAIdentifyButton(ZHAButton):
def create_entity( def create_entity(
cls, cls,
unique_id: str, unique_id: str,
zha_device: ZhaDeviceType, zha_device: ZHADevice,
channels: list[ChannelType], channels: list[ZigbeeChannel],
**kwargs, **kwargs,
) -> ZhaEntity | None: ) -> ZhaEntity | None:
"""Entity Factory. """Entity Factory.
@ -120,13 +124,13 @@ class ZHAAttributeButton(ZhaEntity, ButtonEntity):
def __init__( def __init__(
self, self,
unique_id: str, unique_id: str,
zha_device: ZhaDeviceType, zha_device: ZHADevice,
channels: list[ChannelType], channels: list[ZigbeeChannel],
**kwargs, **kwargs,
) -> None: ) -> None:
"""Init this button.""" """Init this button."""
super().__init__(unique_id, zha_device, channels, **kwargs) super().__init__(unique_id, zha_device, channels, **kwargs)
self._channel: ChannelType = channels[0] self._channel: ZigbeeChannel = channels[0]
async def async_press(self) -> None: async def async_press(self) -> None:
"""Write attribute with defined value.""" """Write attribute with defined value."""

View file

@ -5,7 +5,7 @@ import asyncio
from enum import Enum from enum import Enum
from functools import partialmethod, wraps from functools import partialmethod, wraps
import logging import logging
from typing import Any from typing import TYPE_CHECKING, Any
import zigpy.exceptions import zigpy.exceptions
from zigpy.zcl.foundation import ( from zigpy.zcl.foundation import (
@ -40,6 +40,9 @@ from ..const import (
) )
from ..helpers import LogMixin, retryable_req, safe_read from ..helpers import LogMixin, retryable_req, safe_read
if TYPE_CHECKING:
from . import ChannelPool
_LOGGER = logging.getLogger(__name__) _LOGGER = logging.getLogger(__name__)
@ -105,7 +108,7 @@ class ZigbeeChannel(LogMixin):
ZCL_INIT_ATTRS: dict[int | str, bool] = {} ZCL_INIT_ATTRS: dict[int | str, bool] = {}
def __init__( def __init__(
self, cluster: zha_typing.ZigpyClusterType, ch_pool: zha_typing.ChannelPoolType self, cluster: zha_typing.ZigpyClusterType, ch_pool: ChannelPool
) -> None: ) -> None:
"""Initialize ZigbeeChannel.""" """Initialize ZigbeeChannel."""
self._generic_id = f"channel_0x{cluster.cluster_id:04x}" self._generic_id = f"channel_0x{cluster.cluster_id:04x}"

View file

@ -3,7 +3,7 @@ from __future__ import annotations
import asyncio import asyncio
from collections.abc import Coroutine from collections.abc import Coroutine
from typing import Any from typing import TYPE_CHECKING, Any
import zigpy.exceptions import zigpy.exceptions
import zigpy.types as t import zigpy.types as t
@ -28,6 +28,9 @@ from ..const import (
) )
from .base import ClientChannel, ZigbeeChannel, parse_and_log_command from .base import ClientChannel, ZigbeeChannel, parse_and_log_command
if TYPE_CHECKING:
from . import ChannelPool
@registries.ZIGBEE_CHANNEL_REGISTRY.register(general.Alarms.cluster_id) @registries.ZIGBEE_CHANNEL_REGISTRY.register(general.Alarms.cluster_id)
class Alarms(ZigbeeChannel): class Alarms(ZigbeeChannel):
@ -305,7 +308,7 @@ class OnOffChannel(ZigbeeChannel):
} }
def __init__( def __init__(
self, cluster: zha_typing.ZigpyClusterType, ch_pool: zha_typing.ChannelPoolType self, cluster: zha_typing.ZigpyClusterType, ch_pool: ChannelPool
) -> None: ) -> None:
"""Initialize OnOffChannel.""" """Initialize OnOffChannel."""
super().__init__(cluster, ch_pool) super().__init__(cluster, ch_pool)

View file

@ -1,5 +1,8 @@
"""Manufacturer specific channels module for Zigbee Home Automation.""" """Manufacturer specific channels module for Zigbee Home Automation."""
from __future__ import annotations
import logging import logging
from typing import TYPE_CHECKING
from homeassistant.core import callback from homeassistant.core import callback
@ -16,6 +19,9 @@ from ..const import (
) )
from .base import ClientChannel, ZigbeeChannel from .base import ClientChannel, ZigbeeChannel
if TYPE_CHECKING:
from . import ChannelPool
_LOGGER = logging.getLogger(__name__) _LOGGER = logging.getLogger(__name__)
@ -55,7 +61,7 @@ class OppleRemote(ZigbeeChannel):
REPORT_CONFIG = [] REPORT_CONFIG = []
def __init__( def __init__(
self, cluster: zha_typing.ZigpyClusterType, ch_pool: zha_typing.ChannelPoolType self, cluster: zha_typing.ZigpyClusterType, ch_pool: ChannelPool
) -> None: ) -> None:
"""Initialize Opple channel.""" """Initialize Opple channel."""
super().__init__(cluster, ch_pool) super().__init__(cluster, ch_pool)

View file

@ -7,6 +7,7 @@ https://home-assistant.io/integrations/zha/
from __future__ import annotations from __future__ import annotations
import asyncio import asyncio
from typing import TYPE_CHECKING
from zigpy.exceptions import ZigbeeException from zigpy.exceptions import ZigbeeException
from zigpy.zcl.clusters import security from zigpy.zcl.clusters import security
@ -26,6 +27,9 @@ from ..const import (
from ..typing import CALLABLE_T from ..typing import CALLABLE_T
from .base import ChannelStatus, ZigbeeChannel from .base import ChannelStatus, ZigbeeChannel
if TYPE_CHECKING:
from . import ChannelPool
IAS_ACE_ARM = 0x0000 # ("arm", (t.enum8, t.CharacterString, t.uint8_t), False), IAS_ACE_ARM = 0x0000 # ("arm", (t.enum8, t.CharacterString, t.uint8_t), False),
IAS_ACE_BYPASS = 0x0001 # ("bypass", (t.LVList(t.uint8_t), t.CharacterString), False), IAS_ACE_BYPASS = 0x0001 # ("bypass", (t.LVList(t.uint8_t), t.CharacterString), False),
IAS_ACE_EMERGENCY = 0x0002 # ("emergency", (), False), IAS_ACE_EMERGENCY = 0x0002 # ("emergency", (), False),
@ -48,7 +52,7 @@ class IasAce(ZigbeeChannel):
"""IAS Ancillary Control Equipment channel.""" """IAS Ancillary Control Equipment channel."""
def __init__( def __init__(
self, cluster: zha_typing.ZigpyClusterType, ch_pool: zha_typing.ChannelPoolType self, cluster: zha_typing.ZigpyClusterType, ch_pool: ChannelPool
) -> None: ) -> None:
"""Initialize IAS Ancillary Control Equipment channel.""" """Initialize IAS Ancillary Control Equipment channel."""
super().__init__(cluster, ch_pool) super().__init__(cluster, ch_pool)

View file

@ -3,6 +3,7 @@ from __future__ import annotations
import enum import enum
from functools import partialmethod from functools import partialmethod
from typing import TYPE_CHECKING
from zigpy.zcl.clusters import smartenergy from zigpy.zcl.clusters import smartenergy
@ -15,6 +16,9 @@ from ..const import (
) )
from .base import ZigbeeChannel from .base import ZigbeeChannel
if TYPE_CHECKING:
from . import ChannelPool
@registries.ZIGBEE_CHANNEL_REGISTRY.register(smartenergy.Calendar.cluster_id) @registries.ZIGBEE_CHANNEL_REGISTRY.register(smartenergy.Calendar.cluster_id)
class Calendar(ZigbeeChannel): class Calendar(ZigbeeChannel):
@ -115,7 +119,7 @@ class Metering(ZigbeeChannel):
SUMMATION = 1 SUMMATION = 1
def __init__( def __init__(
self, cluster: zha_typing.ZigpyClusterType, ch_pool: zha_typing.ChannelPoolType self, cluster: zha_typing.ZigpyClusterType, ch_pool: ChannelPool
) -> None: ) -> None:
"""Initialize Metering.""" """Initialize Metering."""
super().__init__(cluster, ch_pool) super().__init__(cluster, ch_pool)

View file

@ -78,6 +78,7 @@ from .helpers import LogMixin, async_get_zha_config_value
if TYPE_CHECKING: if TYPE_CHECKING:
from ..api import ClusterBinding from ..api import ClusterBinding
from .gateway import ZHAGateway
_LOGGER = logging.getLogger(__name__) _LOGGER = logging.getLogger(__name__)
_UPDATE_ALIVE_INTERVAL = (60, 90) _UPDATE_ALIVE_INTERVAL = (60, 90)
@ -100,7 +101,7 @@ class ZHADevice(LogMixin):
self, self,
hass: HomeAssistant, hass: HomeAssistant,
zigpy_device: zha_typing.ZigpyDeviceType, zigpy_device: zha_typing.ZigpyDeviceType,
zha_gateway: zha_typing.ZhaGatewayType, zha_gateway: ZHAGateway,
) -> None: ) -> None:
"""Initialize the gateway.""" """Initialize the gateway."""
self.hass = hass self.hass = hass
@ -155,12 +156,12 @@ class ZHADevice(LogMixin):
return self._zigpy_device return self._zigpy_device
@property @property
def channels(self) -> zha_typing.ChannelsType: def channels(self) -> channels.Channels:
"""Return ZHA channels.""" """Return ZHA channels."""
return self._channels return self._channels
@channels.setter @channels.setter
def channels(self, value: zha_typing.ChannelsType) -> None: def channels(self, value: channels.Channels) -> None:
"""Channels setter.""" """Channels setter."""
assert isinstance(value, channels.Channels) assert isinstance(value, channels.Channels)
self._channels = value self._channels = value
@ -332,7 +333,7 @@ class ZHADevice(LogMixin):
cls, cls,
hass: HomeAssistant, hass: HomeAssistant,
zigpy_dev: zha_typing.ZigpyDeviceType, zigpy_dev: zha_typing.ZigpyDeviceType,
gateway: zha_typing.ZhaGatewayType, gateway: ZHAGateway,
restored: bool = False, restored: bool = False,
): ):
"""Create new device.""" """Create new device."""

View file

@ -35,7 +35,7 @@ from .const import (
DATA_ZHA_GATEWAY, DATA_ZHA_GATEWAY,
) )
from .registries import BINDABLE_CLUSTERS from .registries import BINDABLE_CLUSTERS
from .typing import ZhaDeviceType, ZigpyClusterType from .typing import ZigpyClusterType
if TYPE_CHECKING: if TYPE_CHECKING:
from .device import ZHADevice from .device import ZHADevice
@ -82,7 +82,7 @@ async def safe_read(
async def get_matched_clusters( async def get_matched_clusters(
source_zha_device: ZhaDeviceType, target_zha_device: ZhaDeviceType source_zha_device: ZHADevice, target_zha_device: ZHADevice
) -> list[BindingPair]: ) -> list[BindingPair]:
"""Get matched input/output cluster pairs for 2 devices.""" """Get matched input/output cluster pairs for 2 devices."""
source_clusters = source_zha_device.async_get_std_clusters() source_clusters = source_zha_device.async_get_std_clusters()

View file

@ -17,7 +17,7 @@ from homeassistant.const import Platform
# importing channels updates registries # importing channels updates registries
from . import channels as zha_channels # noqa: F401 pylint: disable=unused-import from . import channels as zha_channels # noqa: F401 pylint: disable=unused-import
from .decorators import DictRegistry, SetRegistry from .decorators import DictRegistry, SetRegistry
from .typing import CALLABLE_T, ChannelType from .typing import CALLABLE_T
if TYPE_CHECKING: if TYPE_CHECKING:
from .channels.base import ClientChannel, ZigbeeChannel from .channels.base import ClientChannel, ZigbeeChannel
@ -161,7 +161,7 @@ class MatchRule:
weight += 1 * len(self.aux_channels) weight += 1 * len(self.aux_channels)
return weight return weight
def claim_channels(self, channel_pool: list[ChannelType]) -> list[ChannelType]: def claim_channels(self, channel_pool: list[ZigbeeChannel]) -> list[ZigbeeChannel]:
"""Return a list of channels this rule matches + aux channels.""" """Return a list of channels this rule matches + aux channels."""
claimed = [] claimed = []
if isinstance(self.channel_names, frozenset): if isinstance(self.channel_names, frozenset):
@ -216,7 +216,7 @@ class EntityClassAndChannels:
"""Container for entity class and corresponding channels.""" """Container for entity class and corresponding channels."""
entity_class: CALLABLE_T entity_class: CALLABLE_T
claimed_channel: list[ChannelType] claimed_channel: list[ZigbeeChannel]
class ZHAEntityRegistry: class ZHAEntityRegistry:
@ -247,9 +247,9 @@ class ZHAEntityRegistry:
component: str, component: str,
manufacturer: str, manufacturer: str,
model: str, model: str,
channels: list[ChannelType], channels: list[ZigbeeChannel],
default: CALLABLE_T = None, default: CALLABLE_T = None,
) -> tuple[CALLABLE_T, list[ChannelType]]: ) -> tuple[CALLABLE_T, list[ZigbeeChannel]]:
"""Match a ZHA Channels to a ZHA Entity class.""" """Match a ZHA Channels to a ZHA Entity class."""
matches = self._strict_registry[component] matches = self._strict_registry[component]
for match in sorted(matches, key=lambda x: x.weight, reverse=True): for match in sorted(matches, key=lambda x: x.weight, reverse=True):
@ -263,11 +263,11 @@ class ZHAEntityRegistry:
self, self,
manufacturer: str, manufacturer: str,
model: str, model: str,
channels: list[ChannelType], channels: list[ZigbeeChannel],
) -> tuple[dict[str, list[EntityClassAndChannels]], list[ChannelType]]: ) -> tuple[dict[str, list[EntityClassAndChannels]], list[ZigbeeChannel]]:
"""Match ZHA Channels to potentially multiple ZHA Entity classes.""" """Match ZHA Channels to potentially multiple ZHA Entity classes."""
result: dict[str, list[EntityClassAndChannels]] = collections.defaultdict(list) result: dict[str, list[EntityClassAndChannels]] = collections.defaultdict(list)
all_claimed: set[ChannelType] = set() all_claimed: set[ZigbeeChannel] = set()
for component, stop_match_groups in self._multi_entity_registry.items(): for component, stop_match_groups in self._multi_entity_registry.items():
for stop_match_grp, matches in stop_match_groups.items(): for stop_match_grp, matches in stop_match_groups.items():
sorted_matches = sorted(matches, key=lambda x: x.weight, reverse=True) sorted_matches = sorted(matches, key=lambda x: x.weight, reverse=True)
@ -287,11 +287,11 @@ class ZHAEntityRegistry:
self, self,
manufacturer: str, manufacturer: str,
model: str, model: str,
channels: list[ChannelType], channels: list[ZigbeeChannel],
) -> tuple[dict[str, list[EntityClassAndChannels]], list[ChannelType]]: ) -> tuple[dict[str, list[EntityClassAndChannels]], list[ZigbeeChannel]]:
"""Match ZHA Channels to potentially multiple ZHA Entity classes.""" """Match ZHA Channels to potentially multiple ZHA Entity classes."""
result: dict[str, list[EntityClassAndChannels]] = collections.defaultdict(list) result: dict[str, list[EntityClassAndChannels]] = collections.defaultdict(list)
all_claimed: set[ChannelType] = set() all_claimed: set[ZigbeeChannel] = set()
for ( for (
component, component,
stop_match_groups, stop_match_groups,

View file

@ -5,7 +5,7 @@ from collections import OrderedDict
from collections.abc import MutableMapping from collections.abc import MutableMapping
import datetime import datetime
import time import time
from typing import cast from typing import TYPE_CHECKING, cast
import attr import attr
@ -13,7 +13,8 @@ from homeassistant.core import HomeAssistant, callback
from homeassistant.helpers.storage import Store from homeassistant.helpers.storage import Store
from homeassistant.loader import bind_hass from homeassistant.loader import bind_hass
from .typing import ZhaDeviceType if TYPE_CHECKING:
from .device import ZHADevice
DATA_REGISTRY = "zha_storage" DATA_REGISTRY = "zha_storage"
@ -42,7 +43,7 @@ class ZhaStorage:
self._store = Store(hass, STORAGE_VERSION, STORAGE_KEY) self._store = Store(hass, STORAGE_VERSION, STORAGE_KEY)
@callback @callback
def async_create_device(self, device: ZhaDeviceType) -> ZhaDeviceEntry: def async_create_device(self, device: ZHADevice) -> ZhaDeviceEntry:
"""Create a new ZhaDeviceEntry.""" """Create a new ZhaDeviceEntry."""
device_entry: ZhaDeviceEntry = ZhaDeviceEntry( device_entry: ZhaDeviceEntry = ZhaDeviceEntry(
name=device.name, ieee=str(device.ieee), last_seen=device.last_seen name=device.name, ieee=str(device.ieee), last_seen=device.last_seen
@ -52,7 +53,7 @@ class ZhaStorage:
return device_entry return device_entry
@callback @callback
def async_get_or_create_device(self, device: ZhaDeviceType) -> ZhaDeviceEntry: def async_get_or_create_device(self, device: ZHADevice) -> ZhaDeviceEntry:
"""Create a new ZhaDeviceEntry.""" """Create a new ZhaDeviceEntry."""
ieee_str: str = str(device.ieee) ieee_str: str = str(device.ieee)
if ieee_str in self.devices: if ieee_str in self.devices:
@ -60,14 +61,14 @@ class ZhaStorage:
return self.async_create_device(device) return self.async_create_device(device)
@callback @callback
def async_create_or_update_device(self, device: ZhaDeviceType) -> ZhaDeviceEntry: def async_create_or_update_device(self, device: ZHADevice) -> ZhaDeviceEntry:
"""Create or update a ZhaDeviceEntry.""" """Create or update a ZhaDeviceEntry."""
if str(device.ieee) in self.devices: if str(device.ieee) in self.devices:
return self.async_update_device(device) return self.async_update_device(device)
return self.async_create_device(device) return self.async_create_device(device)
@callback @callback
def async_delete_device(self, device: ZhaDeviceType) -> None: def async_delete_device(self, device: ZHADevice) -> None:
"""Delete ZhaDeviceEntry.""" """Delete ZhaDeviceEntry."""
ieee_str: str = str(device.ieee) ieee_str: str = str(device.ieee)
if ieee_str in self.devices: if ieee_str in self.devices:
@ -75,7 +76,7 @@ class ZhaStorage:
self.async_schedule_save() self.async_schedule_save()
@callback @callback
def async_update_device(self, device: ZhaDeviceType) -> ZhaDeviceEntry: def async_update_device(self, device: ZHADevice) -> ZhaDeviceEntry:
"""Update name of ZhaDeviceEntry.""" """Update name of ZhaDeviceEntry."""
ieee_str: str = str(device.ieee) ieee_str: str = str(device.ieee)
old = self.devices[ieee_str] old = self.devices[ieee_str]

View file

@ -1,6 +1,6 @@
"""Typing helpers for ZHA component.""" """Typing helpers for ZHA component."""
from collections.abc import Callable from collections.abc import Callable
from typing import TYPE_CHECKING, TypeVar from typing import TypeVar
import zigpy.device import zigpy.device
import zigpy.endpoint import zigpy.endpoint
@ -10,33 +10,8 @@ import zigpy.zdo
# pylint: disable=invalid-name # pylint: disable=invalid-name
CALLABLE_T = TypeVar("CALLABLE_T", bound=Callable) CALLABLE_T = TypeVar("CALLABLE_T", bound=Callable)
ChannelType = "ZigbeeChannel"
ChannelsType = "Channels"
ChannelPoolType = "ChannelPool"
ClientChannelType = "ClientChannel"
ZDOChannelType = "ZDOChannel"
ZhaDeviceType = "ZHADevice"
ZhaEntityType = "ZHAEntity"
ZhaGatewayType = "ZHAGateway"
ZhaGroupType = "ZHAGroupType"
ZigpyClusterType = zigpy.zcl.Cluster ZigpyClusterType = zigpy.zcl.Cluster
ZigpyDeviceType = zigpy.device.Device ZigpyDeviceType = zigpy.device.Device
ZigpyEndpointType = zigpy.endpoint.Endpoint ZigpyEndpointType = zigpy.endpoint.Endpoint
ZigpyGroupType = zigpy.group.Group ZigpyGroupType = zigpy.group.Group
ZigpyZdoType = zigpy.zdo.ZDO ZigpyZdoType = zigpy.zdo.ZDO
if TYPE_CHECKING:
import homeassistant.components.zha.entity
from . import channels, device, gateway, group
from .channels import base as base_channels
ChannelType = base_channels.ZigbeeChannel
ChannelsType = channels.Channels
ChannelPoolType = channels.ChannelPool
ClientChannelType = base_channels.ClientChannel
ZDOChannelType = base_channels.ZDOChannel
ZhaDeviceType = device.ZHADevice
ZhaEntityType = homeassistant.components.zha.entity.ZhaEntity
ZhaGatewayType = gateway.ZHAGateway
ZhaGroupType = group.ZHAGroup

View file

@ -4,6 +4,7 @@ from __future__ import annotations
import asyncio import asyncio
import functools import functools
import logging import logging
from typing import TYPE_CHECKING
from zigpy.zcl.foundation import Status from zigpy.zcl.foundation import Status
@ -37,9 +38,12 @@ from .core.const import (
SIGNAL_SET_LEVEL, SIGNAL_SET_LEVEL,
) )
from .core.registries import ZHA_ENTITIES from .core.registries import ZHA_ENTITIES
from .core.typing import ChannelType, ZhaDeviceType
from .entity import ZhaEntity from .entity import ZhaEntity
if TYPE_CHECKING:
from .core.channels.base import ZigbeeChannel
from .core.device import ZHADevice
_LOGGER = logging.getLogger(__name__) _LOGGER = logging.getLogger(__name__)
MULTI_MATCH = functools.partial(ZHA_ENTITIES.multipass_match, Platform.COVER) MULTI_MATCH = functools.partial(ZHA_ENTITIES.multipass_match, Platform.COVER)
@ -191,8 +195,8 @@ class Shade(ZhaEntity, CoverEntity):
def __init__( def __init__(
self, self,
unique_id: str, unique_id: str,
zha_device: ZhaDeviceType, zha_device: ZHADevice,
channels: list[ChannelType], channels: list[ZigbeeChannel],
**kwargs, **kwargs,
) -> None: ) -> None:
"""Initialize the ZHA light.""" """Initialize the ZHA light."""

View file

@ -29,7 +29,7 @@ from .core.const import (
SIGNAL_REMOVE, SIGNAL_REMOVE,
) )
from .core.helpers import LogMixin from .core.helpers import LogMixin
from .core.typing import CALLABLE_T, ChannelType, ZhaDeviceType from .core.typing import CALLABLE_T
if TYPE_CHECKING: if TYPE_CHECKING:
from .core.channels.base import ZigbeeChannel from .core.channels.base import ZigbeeChannel
@ -127,7 +127,11 @@ class BaseZhaEntity(LogMixin, entity.Entity):
@callback @callback
def async_accept_signal( def async_accept_signal(
self, channel: ChannelType, signal: str, func: CALLABLE_T, signal_override=False self,
channel: ZigbeeChannel,
signal: str,
func: CALLABLE_T,
signal_override=False,
): ):
"""Accept a signal from a channel.""" """Accept a signal from a channel."""
unsub = None unsub = None
@ -181,8 +185,8 @@ class ZhaEntity(BaseZhaEntity, RestoreEntity):
def create_entity( def create_entity(
cls, cls,
unique_id: str, unique_id: str,
zha_device: ZhaDeviceType, zha_device: ZHADevice,
channels: list[ChannelType], channels: list[ZigbeeChannel],
**kwargs, **kwargs,
) -> ZhaEntity | None: ) -> ZhaEntity | None:
"""Entity Factory. """Entity Factory.

View file

@ -7,7 +7,7 @@ import functools
import itertools import itertools
import logging import logging
import random import random
from typing import Any, cast from typing import TYPE_CHECKING, Any, cast
from zigpy.zcl.clusters.general import Identify, LevelControl, OnOff from zigpy.zcl.clusters.general import Identify, LevelControl, OnOff
from zigpy.zcl.clusters.lighting import Color from zigpy.zcl.clusters.lighting import Color
@ -62,9 +62,11 @@ from .core.const import (
) )
from .core.helpers import LogMixin, async_get_zha_config_value from .core.helpers import LogMixin, async_get_zha_config_value
from .core.registries import ZHA_ENTITIES from .core.registries import ZHA_ENTITIES
from .core.typing import ZhaDeviceType
from .entity import ZhaEntity, ZhaGroupEntity from .entity import ZhaEntity, ZhaGroupEntity
if TYPE_CHECKING:
from .core.device import ZHADevice
_LOGGER = logging.getLogger(__name__) _LOGGER = logging.getLogger(__name__)
CAPABILITIES_COLOR_LOOP = 0x4 CAPABILITIES_COLOR_LOOP = 0x4
@ -341,7 +343,7 @@ class Light(BaseLight, ZhaEntity):
_attr_supported_color_modes: set(ColorMode) _attr_supported_color_modes: set(ColorMode)
_REFRESH_INTERVAL = (45, 75) _REFRESH_INTERVAL = (45, 75)
def __init__(self, unique_id, zha_device: ZhaDeviceType, channels, **kwargs): def __init__(self, unique_id, zha_device: ZHADevice, channels, **kwargs):
"""Initialize the ZHA light.""" """Initialize the ZHA light."""
super().__init__(unique_id, zha_device, channels, **kwargs) super().__init__(unique_id, zha_device, channels, **kwargs)
self._on_off_channel = self.cluster_channels.get(CHANNEL_ON_OFF) self._on_off_channel = self.cluster_channels.get(CHANNEL_ON_OFF)

View file

@ -4,6 +4,7 @@ from __future__ import annotations
from enum import Enum from enum import Enum
import functools import functools
import logging import logging
from typing import TYPE_CHECKING
from zigpy import types from zigpy import types
from zigpy.zcl.clusters.general import OnOff from zigpy.zcl.clusters.general import OnOff
@ -26,9 +27,13 @@ from .core.const import (
Strobe, Strobe,
) )
from .core.registries import ZHA_ENTITIES from .core.registries import ZHA_ENTITIES
from .core.typing import ChannelType, ZhaDeviceType
from .entity import ZhaEntity from .entity import ZhaEntity
if TYPE_CHECKING:
from .core.channels.base import ZigbeeChannel
from .core.device import ZHADevice
CONFIG_DIAGNOSTIC_MATCH = functools.partial( CONFIG_DIAGNOSTIC_MATCH = functools.partial(
ZHA_ENTITIES.config_diagnostic_match, Platform.SELECT ZHA_ENTITIES.config_diagnostic_match, Platform.SELECT
) )
@ -64,14 +69,14 @@ class ZHAEnumSelectEntity(ZhaEntity, SelectEntity):
def __init__( def __init__(
self, self,
unique_id: str, unique_id: str,
zha_device: ZhaDeviceType, zha_device: ZHADevice,
channels: list[ChannelType], channels: list[ZigbeeChannel],
**kwargs, **kwargs,
) -> None: ) -> None:
"""Init this select entity.""" """Init this select entity."""
self._attr_name = self._enum.__name__ self._attr_name = self._enum.__name__
self._attr_options = [entry.name.replace("_", " ") for entry in self._enum] self._attr_options = [entry.name.replace("_", " ") for entry in self._enum]
self._channel: ChannelType = channels[0] self._channel: ZigbeeChannel = channels[0]
super().__init__(unique_id, zha_device, channels, **kwargs) super().__init__(unique_id, zha_device, channels, **kwargs)
@property @property
@ -150,8 +155,8 @@ class ZCLEnumSelectEntity(ZhaEntity, SelectEntity):
def create_entity( def create_entity(
cls, cls,
unique_id: str, unique_id: str,
zha_device: ZhaDeviceType, zha_device: ZHADevice,
channels: list[ChannelType], channels: list[ZigbeeChannel],
**kwargs, **kwargs,
) -> ZhaEntity | None: ) -> ZhaEntity | None:
"""Entity Factory. """Entity Factory.
@ -175,13 +180,13 @@ class ZCLEnumSelectEntity(ZhaEntity, SelectEntity):
def __init__( def __init__(
self, self,
unique_id: str, unique_id: str,
zha_device: ZhaDeviceType, zha_device: ZHADevice,
channels: list[ChannelType], channels: list[ZigbeeChannel],
**kwargs, **kwargs,
) -> None: ) -> None:
"""Init this select entity.""" """Init this select entity."""
self._attr_options = [entry.name.replace("_", " ") for entry in self._enum] self._attr_options = [entry.name.replace("_", " ") for entry in self._enum]
self._channel: ChannelType = channels[0] self._channel: ZigbeeChannel = channels[0]
super().__init__(unique_id, zha_device, channels, **kwargs) super().__init__(unique_id, zha_device, channels, **kwargs)
@property @property

View file

@ -3,7 +3,7 @@ from __future__ import annotations
import functools import functools
import numbers import numbers
from typing import Any from typing import TYPE_CHECKING, Any
from homeassistant.components.climate.const import HVACAction from homeassistant.components.climate.const import HVACAction
from homeassistant.components.sensor import ( from homeassistant.components.sensor import (
@ -63,9 +63,12 @@ from .core.const import (
SIGNAL_ATTR_UPDATED, SIGNAL_ATTR_UPDATED,
) )
from .core.registries import SMARTTHINGS_HUMIDITY_CLUSTER, ZHA_ENTITIES from .core.registries import SMARTTHINGS_HUMIDITY_CLUSTER, ZHA_ENTITIES
from .core.typing import ChannelType, ZhaDeviceType
from .entity import ZhaEntity from .entity import ZhaEntity
if TYPE_CHECKING:
from .core.channels.base import ZigbeeChannel
from .core.device import ZHADevice
PARALLEL_UPDATES = 5 PARALLEL_UPDATES = 5
BATTERY_SIZES = { BATTERY_SIZES = {
@ -121,20 +124,20 @@ class Sensor(ZhaEntity, SensorEntity):
def __init__( def __init__(
self, self,
unique_id: str, unique_id: str,
zha_device: ZhaDeviceType, zha_device: ZHADevice,
channels: list[ChannelType], channels: list[ZigbeeChannel],
**kwargs, **kwargs,
) -> None: ) -> None:
"""Init this sensor.""" """Init this sensor."""
super().__init__(unique_id, zha_device, channels, **kwargs) super().__init__(unique_id, zha_device, channels, **kwargs)
self._channel: ChannelType = channels[0] self._channel: ZigbeeChannel = channels[0]
@classmethod @classmethod
def create_entity( def create_entity(
cls, cls,
unique_id: str, unique_id: str,
zha_device: ZhaDeviceType, zha_device: ZHADevice,
channels: list[ChannelType], channels: list[ZigbeeChannel],
**kwargs, **kwargs,
) -> ZhaEntity | None: ) -> ZhaEntity | None:
"""Entity Factory. """Entity Factory.
@ -213,8 +216,8 @@ class Battery(Sensor):
def create_entity( def create_entity(
cls, cls,
unique_id: str, unique_id: str,
zha_device: ZhaDeviceType, zha_device: ZHADevice,
channels: list[ChannelType], channels: list[ZigbeeChannel],
**kwargs, **kwargs,
) -> ZhaEntity | None: ) -> ZhaEntity | None:
"""Entity Factory. """Entity Factory.
@ -637,8 +640,8 @@ class ThermostatHVACAction(Sensor, id_suffix="hvac_action"):
def create_entity( def create_entity(
cls, cls,
unique_id: str, unique_id: str,
zha_device: ZhaDeviceType, zha_device: ZHADevice,
channels: list[ChannelType], channels: list[ZigbeeChannel],
**kwargs, **kwargs,
) -> ZhaEntity | None: ) -> ZhaEntity | None:
"""Entity Factory. """Entity Factory.
@ -762,8 +765,8 @@ class RSSISensor(Sensor, id_suffix="rssi"):
def create_entity( def create_entity(
cls, cls,
unique_id: str, unique_id: str,
zha_device: ZhaDeviceType, zha_device: ZHADevice,
channels: list[ChannelType], channels: list[ZigbeeChannel],
**kwargs, **kwargs,
) -> ZhaEntity | None: ) -> ZhaEntity | None:
"""Entity Factory. """Entity Factory.

View file

@ -2,7 +2,7 @@
from __future__ import annotations from __future__ import annotations
import functools import functools
from typing import Any from typing import TYPE_CHECKING, Any
from zigpy.zcl.clusters.security import IasWd as WD from zigpy.zcl.clusters.security import IasWd as WD
@ -38,9 +38,12 @@ from .core.const import (
Strobe, Strobe,
) )
from .core.registries import ZHA_ENTITIES from .core.registries import ZHA_ENTITIES
from .core.typing import ChannelType, ZhaDeviceType
from .entity import ZhaEntity from .entity import ZhaEntity
if TYPE_CHECKING:
from .core.channels.base import ZigbeeChannel
from .core.device import ZHADevice
MULTI_MATCH = functools.partial(ZHA_ENTITIES.multipass_match, Platform.SIREN) MULTI_MATCH = functools.partial(ZHA_ENTITIES.multipass_match, Platform.SIREN)
DEFAULT_DURATION = 5 # seconds DEFAULT_DURATION = 5 # seconds
@ -72,8 +75,8 @@ class ZHASiren(ZhaEntity, SirenEntity):
def __init__( def __init__(
self, self,
unique_id: str, unique_id: str,
zha_device: ZhaDeviceType, zha_device: ZHADevice,
channels: list[ChannelType], channels: list[ZigbeeChannel],
**kwargs, **kwargs,
) -> None: ) -> None:
"""Init this siren.""" """Init this siren."""

View file

@ -3000,9 +3000,6 @@ ignore_errors = true
[mypy-homeassistant.components.xiaomi_miio.switch] [mypy-homeassistant.components.xiaomi_miio.switch]
ignore_errors = true ignore_errors = true
[mypy-homeassistant.components.zha.alarm_control_panel]
ignore_errors = true
[mypy-homeassistant.components.zha.api] [mypy-homeassistant.components.zha.api]
ignore_errors = true ignore_errors = true
@ -3018,9 +3015,6 @@ ignore_errors = true
[mypy-homeassistant.components.zha.config_flow] [mypy-homeassistant.components.zha.config_flow]
ignore_errors = true ignore_errors = true
[mypy-homeassistant.components.zha.core.channels]
ignore_errors = true
[mypy-homeassistant.components.zha.core.channels.base] [mypy-homeassistant.components.zha.core.channels.base]
ignore_errors = true ignore_errors = true
@ -3039,27 +3033,18 @@ ignore_errors = true
[mypy-homeassistant.components.zha.core.channels.lighting] [mypy-homeassistant.components.zha.core.channels.lighting]
ignore_errors = true ignore_errors = true
[mypy-homeassistant.components.zha.core.channels.lightlink]
ignore_errors = true
[mypy-homeassistant.components.zha.core.channels.manufacturerspecific] [mypy-homeassistant.components.zha.core.channels.manufacturerspecific]
ignore_errors = true ignore_errors = true
[mypy-homeassistant.components.zha.core.channels.measurement] [mypy-homeassistant.components.zha.core.channels.measurement]
ignore_errors = true ignore_errors = true
[mypy-homeassistant.components.zha.core.channels.protocol]
ignore_errors = true
[mypy-homeassistant.components.zha.core.channels.security] [mypy-homeassistant.components.zha.core.channels.security]
ignore_errors = true ignore_errors = true
[mypy-homeassistant.components.zha.core.channels.smartenergy] [mypy-homeassistant.components.zha.core.channels.smartenergy]
ignore_errors = true ignore_errors = true
[mypy-homeassistant.components.zha.core.decorators]
ignore_errors = true
[mypy-homeassistant.components.zha.core.device] [mypy-homeassistant.components.zha.core.device]
ignore_errors = true ignore_errors = true
@ -3081,9 +3066,6 @@ ignore_errors = true
[mypy-homeassistant.components.zha.core.store] [mypy-homeassistant.components.zha.core.store]
ignore_errors = true ignore_errors = true
[mypy-homeassistant.components.zha.core.typing]
ignore_errors = true
[mypy-homeassistant.components.zha.cover] [mypy-homeassistant.components.zha.cover]
ignore_errors = true ignore_errors = true

View file

@ -149,26 +149,21 @@ IGNORED_MODULES: Final[list[str]] = [
"homeassistant.components.xiaomi_miio.light", "homeassistant.components.xiaomi_miio.light",
"homeassistant.components.xiaomi_miio.sensor", "homeassistant.components.xiaomi_miio.sensor",
"homeassistant.components.xiaomi_miio.switch", "homeassistant.components.xiaomi_miio.switch",
"homeassistant.components.zha.alarm_control_panel",
"homeassistant.components.zha.api", "homeassistant.components.zha.api",
"homeassistant.components.zha.binary_sensor", "homeassistant.components.zha.binary_sensor",
"homeassistant.components.zha.button", "homeassistant.components.zha.button",
"homeassistant.components.zha.climate", "homeassistant.components.zha.climate",
"homeassistant.components.zha.config_flow", "homeassistant.components.zha.config_flow",
"homeassistant.components.zha.core.channels",
"homeassistant.components.zha.core.channels.base", "homeassistant.components.zha.core.channels.base",
"homeassistant.components.zha.core.channels.closures", "homeassistant.components.zha.core.channels.closures",
"homeassistant.components.zha.core.channels.general", "homeassistant.components.zha.core.channels.general",
"homeassistant.components.zha.core.channels.homeautomation", "homeassistant.components.zha.core.channels.homeautomation",
"homeassistant.components.zha.core.channels.hvac", "homeassistant.components.zha.core.channels.hvac",
"homeassistant.components.zha.core.channels.lighting", "homeassistant.components.zha.core.channels.lighting",
"homeassistant.components.zha.core.channels.lightlink",
"homeassistant.components.zha.core.channels.manufacturerspecific", "homeassistant.components.zha.core.channels.manufacturerspecific",
"homeassistant.components.zha.core.channels.measurement", "homeassistant.components.zha.core.channels.measurement",
"homeassistant.components.zha.core.channels.protocol",
"homeassistant.components.zha.core.channels.security", "homeassistant.components.zha.core.channels.security",
"homeassistant.components.zha.core.channels.smartenergy", "homeassistant.components.zha.core.channels.smartenergy",
"homeassistant.components.zha.core.decorators",
"homeassistant.components.zha.core.device", "homeassistant.components.zha.core.device",
"homeassistant.components.zha.core.discovery", "homeassistant.components.zha.core.discovery",
"homeassistant.components.zha.core.gateway", "homeassistant.components.zha.core.gateway",
@ -176,7 +171,6 @@ IGNORED_MODULES: Final[list[str]] = [
"homeassistant.components.zha.core.helpers", "homeassistant.components.zha.core.helpers",
"homeassistant.components.zha.core.registries", "homeassistant.components.zha.core.registries",
"homeassistant.components.zha.core.store", "homeassistant.components.zha.core.store",
"homeassistant.components.zha.core.typing",
"homeassistant.components.zha.cover", "homeassistant.components.zha.cover",
"homeassistant.components.zha.device_action", "homeassistant.components.zha.device_action",
"homeassistant.components.zha.device_tracker", "homeassistant.components.zha.device_tracker",