Fix cover, light, select, sensor, switch type hints in zha (#73770)
* Fix zha sensor type hints * Fix zha entity type hints * Fix switch type hints * Fix light type hints * Fix cover type hints * Fix select type hints
This commit is contained in:
parent
6c83ed4c9d
commit
243905ae3e
8 changed files with 25 additions and 45 deletions
|
@ -203,8 +203,8 @@ class Shade(ZhaEntity, CoverEntity):
|
||||||
super().__init__(unique_id, zha_device, channels, **kwargs)
|
super().__init__(unique_id, zha_device, channels, **kwargs)
|
||||||
self._on_off_channel = self.cluster_channels[CHANNEL_ON_OFF]
|
self._on_off_channel = self.cluster_channels[CHANNEL_ON_OFF]
|
||||||
self._level_channel = self.cluster_channels[CHANNEL_LEVEL]
|
self._level_channel = self.cluster_channels[CHANNEL_LEVEL]
|
||||||
self._position = None
|
self._position: int | None = None
|
||||||
self._is_open = None
|
self._is_open: bool | None = None
|
||||||
|
|
||||||
@property
|
@property
|
||||||
def current_cover_position(self):
|
def current_cover_position(self):
|
||||||
|
|
|
@ -128,9 +128,9 @@ class BaseZhaEntity(LogMixin, entity.Entity):
|
||||||
@callback
|
@callback
|
||||||
def async_accept_signal(
|
def async_accept_signal(
|
||||||
self,
|
self,
|
||||||
channel: ZigbeeChannel,
|
channel: ZigbeeChannel | None,
|
||||||
signal: str,
|
signal: str,
|
||||||
func: Callable[[], Any],
|
func: Callable[..., Any],
|
||||||
signal_override=False,
|
signal_override=False,
|
||||||
):
|
):
|
||||||
"""Accept a signal from a channel."""
|
"""Accept a signal from a channel."""
|
||||||
|
@ -138,6 +138,7 @@ class BaseZhaEntity(LogMixin, entity.Entity):
|
||||||
if signal_override:
|
if signal_override:
|
||||||
unsub = async_dispatcher_connect(self.hass, signal, func)
|
unsub = async_dispatcher_connect(self.hass, signal, func)
|
||||||
else:
|
else:
|
||||||
|
assert channel
|
||||||
unsub = async_dispatcher_connect(
|
unsub = async_dispatcher_connect(
|
||||||
self.hass, f"{channel.unique_id}_{signal}", func
|
self.hass, f"{channel.unique_id}_{signal}", func
|
||||||
)
|
)
|
||||||
|
@ -305,7 +306,7 @@ class ZhaGroupEntity(BaseZhaEntity):
|
||||||
if self._change_listener_debouncer is None:
|
if self._change_listener_debouncer is None:
|
||||||
self._change_listener_debouncer = Debouncer(
|
self._change_listener_debouncer = Debouncer(
|
||||||
self.hass,
|
self.hass,
|
||||||
self,
|
_LOGGER,
|
||||||
cooldown=UPDATE_GROUP_FROM_CHILD_DELAY,
|
cooldown=UPDATE_GROUP_FROM_CHILD_DELAY,
|
||||||
immediate=False,
|
immediate=False,
|
||||||
function=functools.partial(self.async_update_ha_state, True),
|
function=functools.partial(self.async_update_ha_state, True),
|
||||||
|
@ -325,6 +326,7 @@ class ZhaGroupEntity(BaseZhaEntity):
|
||||||
def async_state_changed_listener(self, event: Event):
|
def async_state_changed_listener(self, event: Event):
|
||||||
"""Handle child updates."""
|
"""Handle child updates."""
|
||||||
# Delay to ensure that we get updates from all members before updating the group
|
# Delay to ensure that we get updates from all members before updating the group
|
||||||
|
assert self._change_listener_debouncer
|
||||||
self.hass.create_task(self._change_listener_debouncer.async_call())
|
self.hass.create_task(self._change_listener_debouncer.async_call())
|
||||||
|
|
||||||
async def async_will_remove_from_hass(self) -> None:
|
async def async_will_remove_from_hass(self) -> None:
|
||||||
|
|
|
@ -340,13 +340,13 @@ class BaseLight(LogMixin, light.LightEntity):
|
||||||
class Light(BaseLight, ZhaEntity):
|
class Light(BaseLight, ZhaEntity):
|
||||||
"""Representation of a ZHA or ZLL light."""
|
"""Representation of a ZHA or ZLL light."""
|
||||||
|
|
||||||
_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: ZHADevice, 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[CHANNEL_ON_OFF]
|
||||||
self._state = bool(self._on_off_channel.on_off)
|
self._state = bool(self._on_off_channel.on_off)
|
||||||
self._level_channel = self.cluster_channels.get(CHANNEL_LEVEL)
|
self._level_channel = self.cluster_channels.get(CHANNEL_LEVEL)
|
||||||
self._color_channel = self.cluster_channels.get(CHANNEL_COLOR)
|
self._color_channel = self.cluster_channels.get(CHANNEL_COLOR)
|
||||||
|
@ -391,6 +391,7 @@ class Light(BaseLight, ZhaEntity):
|
||||||
if len(self._attr_supported_color_modes) == 1:
|
if len(self._attr_supported_color_modes) == 1:
|
||||||
self._color_mode = next(iter(self._attr_supported_color_modes))
|
self._color_mode = next(iter(self._attr_supported_color_modes))
|
||||||
else: # Light supports color_temp + hs, determine which mode the light is in
|
else: # Light supports color_temp + hs, determine which mode the light is in
|
||||||
|
assert self._color_channel
|
||||||
if self._color_channel.color_mode == Color.ColorMode.Color_temperature:
|
if self._color_channel.color_mode == Color.ColorMode.Color_temperature:
|
||||||
self._color_mode = ColorMode.COLOR_TEMP
|
self._color_mode = ColorMode.COLOR_TEMP
|
||||||
else:
|
else:
|
||||||
|
@ -440,6 +441,7 @@ class Light(BaseLight, ZhaEntity):
|
||||||
|
|
||||||
async def async_will_remove_from_hass(self) -> None:
|
async def async_will_remove_from_hass(self) -> None:
|
||||||
"""Disconnect entity object when removed."""
|
"""Disconnect entity object when removed."""
|
||||||
|
assert self._cancel_refresh_handle
|
||||||
self._cancel_refresh_handle()
|
self._cancel_refresh_handle()
|
||||||
await super().async_will_remove_from_hass()
|
await super().async_will_remove_from_hass()
|
||||||
|
|
||||||
|
|
|
@ -64,7 +64,7 @@ class ZHAEnumSelectEntity(ZhaEntity, SelectEntity):
|
||||||
"""Representation of a ZHA select entity."""
|
"""Representation of a ZHA select entity."""
|
||||||
|
|
||||||
_attr_entity_category = EntityCategory.CONFIG
|
_attr_entity_category = EntityCategory.CONFIG
|
||||||
_enum: Enum = None
|
_enum: type[Enum]
|
||||||
|
|
||||||
def __init__(
|
def __init__(
|
||||||
self,
|
self,
|
||||||
|
@ -87,7 +87,7 @@ class ZHAEnumSelectEntity(ZhaEntity, SelectEntity):
|
||||||
return None
|
return None
|
||||||
return option.name.replace("_", " ")
|
return option.name.replace("_", " ")
|
||||||
|
|
||||||
async def async_select_option(self, option: str | int) -> None:
|
async def async_select_option(self, option: str) -> None:
|
||||||
"""Change the selected option."""
|
"""Change the selected option."""
|
||||||
self._channel.data_cache[self._attr_name] = self._enum[option.replace(" ", "_")]
|
self._channel.data_cache[self._attr_name] = self._enum[option.replace(" ", "_")]
|
||||||
self.async_write_ha_state()
|
self.async_write_ha_state()
|
||||||
|
@ -116,7 +116,7 @@ class ZHADefaultToneSelectEntity(
|
||||||
):
|
):
|
||||||
"""Representation of a ZHA default siren tone select entity."""
|
"""Representation of a ZHA default siren tone select entity."""
|
||||||
|
|
||||||
_enum: Enum = IasWd.Warning.WarningMode
|
_enum = IasWd.Warning.WarningMode
|
||||||
|
|
||||||
|
|
||||||
@CONFIG_DIAGNOSTIC_MATCH(channel_names=CHANNEL_IAS_WD)
|
@CONFIG_DIAGNOSTIC_MATCH(channel_names=CHANNEL_IAS_WD)
|
||||||
|
@ -125,7 +125,7 @@ class ZHADefaultSirenLevelSelectEntity(
|
||||||
):
|
):
|
||||||
"""Representation of a ZHA default siren level select entity."""
|
"""Representation of a ZHA default siren level select entity."""
|
||||||
|
|
||||||
_enum: Enum = IasWd.Warning.SirenLevel
|
_enum = IasWd.Warning.SirenLevel
|
||||||
|
|
||||||
|
|
||||||
@CONFIG_DIAGNOSTIC_MATCH(channel_names=CHANNEL_IAS_WD)
|
@CONFIG_DIAGNOSTIC_MATCH(channel_names=CHANNEL_IAS_WD)
|
||||||
|
@ -134,14 +134,14 @@ class ZHADefaultStrobeLevelSelectEntity(
|
||||||
):
|
):
|
||||||
"""Representation of a ZHA default siren strobe level select entity."""
|
"""Representation of a ZHA default siren strobe level select entity."""
|
||||||
|
|
||||||
_enum: Enum = IasWd.StrobeLevel
|
_enum = IasWd.StrobeLevel
|
||||||
|
|
||||||
|
|
||||||
@CONFIG_DIAGNOSTIC_MATCH(channel_names=CHANNEL_IAS_WD)
|
@CONFIG_DIAGNOSTIC_MATCH(channel_names=CHANNEL_IAS_WD)
|
||||||
class ZHADefaultStrobeSelectEntity(ZHANonZCLSelectEntity, id_suffix=Strobe.__name__):
|
class ZHADefaultStrobeSelectEntity(ZHANonZCLSelectEntity, id_suffix=Strobe.__name__):
|
||||||
"""Representation of a ZHA default siren strobe select entity."""
|
"""Representation of a ZHA default siren strobe select entity."""
|
||||||
|
|
||||||
_enum: Enum = Strobe
|
_enum = Strobe
|
||||||
|
|
||||||
|
|
||||||
class ZCLEnumSelectEntity(ZhaEntity, SelectEntity):
|
class ZCLEnumSelectEntity(ZhaEntity, SelectEntity):
|
||||||
|
@ -149,7 +149,7 @@ class ZCLEnumSelectEntity(ZhaEntity, SelectEntity):
|
||||||
|
|
||||||
_select_attr: str
|
_select_attr: str
|
||||||
_attr_entity_category = EntityCategory.CONFIG
|
_attr_entity_category = EntityCategory.CONFIG
|
||||||
_enum: Enum
|
_enum: type[Enum]
|
||||||
|
|
||||||
@classmethod
|
@classmethod
|
||||||
def create_entity(
|
def create_entity(
|
||||||
|
@ -198,7 +198,7 @@ class ZCLEnumSelectEntity(ZhaEntity, SelectEntity):
|
||||||
option = self._enum(option)
|
option = self._enum(option)
|
||||||
return option.name.replace("_", " ")
|
return option.name.replace("_", " ")
|
||||||
|
|
||||||
async def async_select_option(self, option: str | int) -> None:
|
async def async_select_option(self, option: str) -> None:
|
||||||
"""Change the selected option."""
|
"""Change the selected option."""
|
||||||
await self._channel.cluster.write_attributes(
|
await self._channel.cluster.write_attributes(
|
||||||
{self._select_attr: self._enum[option.replace(" ", "_")]}
|
{self._select_attr: self._enum[option.replace(" ", "_")]}
|
||||||
|
@ -213,7 +213,7 @@ class ZHAStartupOnOffSelectEntity(
|
||||||
"""Representation of a ZHA startup onoff select entity."""
|
"""Representation of a ZHA startup onoff select entity."""
|
||||||
|
|
||||||
_select_attr = "start_up_on_off"
|
_select_attr = "start_up_on_off"
|
||||||
_enum: Enum = OnOff.StartUpOnOff
|
_enum = OnOff.StartUpOnOff
|
||||||
|
|
||||||
|
|
||||||
class AqaraMotionSensitivities(types.enum8):
|
class AqaraMotionSensitivities(types.enum8):
|
||||||
|
@ -229,4 +229,4 @@ class AqaraMotionSensitivity(ZCLEnumSelectEntity, id_suffix="motion_sensitivity"
|
||||||
"""Representation of a ZHA on off transition time configuration entity."""
|
"""Representation of a ZHA on off transition time configuration entity."""
|
||||||
|
|
||||||
_select_attr = "motion_sensitivity"
|
_select_attr = "motion_sensitivity"
|
||||||
_enum: Enum = AqaraMotionSensitivities
|
_enum = AqaraMotionSensitivities
|
||||||
|
|
|
@ -118,7 +118,7 @@ class Sensor(ZhaEntity, SensorEntity):
|
||||||
SENSOR_ATTR: int | str | None = None
|
SENSOR_ATTR: int | str | None = None
|
||||||
_decimals: int = 1
|
_decimals: int = 1
|
||||||
_divisor: int = 1
|
_divisor: int = 1
|
||||||
_multiplier: int = 1
|
_multiplier: int | float = 1
|
||||||
_unit: str | None = None
|
_unit: str | None = None
|
||||||
|
|
||||||
def __init__(
|
def __init__(
|
||||||
|
@ -455,7 +455,7 @@ class SmartEnergyMetering(Sensor):
|
||||||
return self._channel.demand_formatter(value)
|
return self._channel.demand_formatter(value)
|
||||||
|
|
||||||
@property
|
@property
|
||||||
def native_unit_of_measurement(self) -> str:
|
def native_unit_of_measurement(self) -> str | None:
|
||||||
"""Return Unit of measurement."""
|
"""Return Unit of measurement."""
|
||||||
return self.unit_of_measure_map.get(self._channel.unit_of_measurement)
|
return self.unit_of_measure_map.get(self._channel.unit_of_measurement)
|
||||||
|
|
||||||
|
@ -760,6 +760,7 @@ class RSSISensor(Sensor, id_suffix="rssi"):
|
||||||
_attr_device_class: SensorDeviceClass = SensorDeviceClass.SIGNAL_STRENGTH
|
_attr_device_class: SensorDeviceClass = SensorDeviceClass.SIGNAL_STRENGTH
|
||||||
_attr_entity_category = EntityCategory.DIAGNOSTIC
|
_attr_entity_category = EntityCategory.DIAGNOSTIC
|
||||||
_attr_entity_registry_enabled_default = False
|
_attr_entity_registry_enabled_default = False
|
||||||
|
unique_id_suffix: str
|
||||||
|
|
||||||
@classmethod
|
@classmethod
|
||||||
def create_entity(
|
def create_entity(
|
||||||
|
|
|
@ -29,7 +29,6 @@ from .entity import ZhaEntity, ZhaGroupEntity
|
||||||
|
|
||||||
if TYPE_CHECKING:
|
if TYPE_CHECKING:
|
||||||
from .core.channels.base import ZigbeeChannel
|
from .core.channels.base import ZigbeeChannel
|
||||||
from .core.channels.general import OnOffChannel
|
|
||||||
from .core.device import ZHADevice
|
from .core.device import ZHADevice
|
||||||
|
|
||||||
STRICT_MATCH = functools.partial(ZHA_ENTITIES.strict_match, Platform.SWITCH)
|
STRICT_MATCH = functools.partial(ZHA_ENTITIES.strict_match, Platform.SWITCH)
|
||||||
|
@ -72,7 +71,7 @@ class Switch(ZhaEntity, SwitchEntity):
|
||||||
) -> None:
|
) -> None:
|
||||||
"""Initialize the ZHA switch."""
|
"""Initialize the ZHA switch."""
|
||||||
super().__init__(unique_id, zha_device, channels, **kwargs)
|
super().__init__(unique_id, zha_device, channels, **kwargs)
|
||||||
self._on_off_channel: OnOffChannel = self.cluster_channels.get(CHANNEL_ON_OFF)
|
self._on_off_channel = self.cluster_channels[CHANNEL_ON_OFF]
|
||||||
|
|
||||||
@property
|
@property
|
||||||
def is_on(self) -> bool:
|
def is_on(self) -> bool:
|
||||||
|
|
18
mypy.ini
18
mypy.ini
|
@ -3020,21 +3020,3 @@ 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.cover]
|
|
||||||
ignore_errors = true
|
|
||||||
|
|
||||||
[mypy-homeassistant.components.zha.entity]
|
|
||||||
ignore_errors = true
|
|
||||||
|
|
||||||
[mypy-homeassistant.components.zha.light]
|
|
||||||
ignore_errors = true
|
|
||||||
|
|
||||||
[mypy-homeassistant.components.zha.select]
|
|
||||||
ignore_errors = true
|
|
||||||
|
|
||||||
[mypy-homeassistant.components.zha.sensor]
|
|
||||||
ignore_errors = true
|
|
||||||
|
|
||||||
[mypy-homeassistant.components.zha.switch]
|
|
||||||
ignore_errors = true
|
|
||||||
|
|
|
@ -156,12 +156,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.cover",
|
|
||||||
"homeassistant.components.zha.entity",
|
|
||||||
"homeassistant.components.zha.light",
|
|
||||||
"homeassistant.components.zha.select",
|
|
||||||
"homeassistant.components.zha.sensor",
|
|
||||||
"homeassistant.components.zha.switch",
|
|
||||||
]
|
]
|
||||||
|
|
||||||
# Component modules which should set no_implicit_reexport = true.
|
# Component modules which should set no_implicit_reexport = true.
|
||||||
|
|
Loading…
Add table
Reference in a new issue