1 """Ecovacs mqtt entity module."""
3 from __future__
import annotations
5 from collections.abc
import Callable, Coroutine
6 from dataclasses
import dataclass
7 from typing
import Any, Generic, TypeVar
9 from deebot_client.capabilities
import Capabilities
10 from deebot_client.device
import Device
11 from deebot_client.events
import AvailabilityEvent
12 from deebot_client.events.base
import Event
13 from sucks
import EventListener, VacBot
19 from .const
import DOMAIN
21 CapabilityEntity = TypeVar(
"CapabilityEntity")
22 EventT = TypeVar(
"EventT", bound=Event)
28 _attr_should_poll =
False
29 _attr_has_entity_name =
True
30 _always_available: bool =
False
35 capability: CapabilityEntity,
38 """Initialize entity."""
41 f
"{device.device_info['did']}_{self.entity_description.key}"
46 self._subscribed_events: set[type[Event]] = set()
50 """Return device specific attributes."""
51 device_info = self.
_device_device.device_info
53 identifiers={(DOMAIN, device_info[
"did"])},
54 manufacturer=
"Ecovacs",
55 sw_version=self.
_device_device.fw_version,
56 serial_number=device_info[
"name"],
57 model_id=device_info[
"class"],
60 if nick := device_info.get(
"nick"):
63 if model := device_info.get(
"deviceName"):
66 if mac := self.
_device_device.mac:
67 info[
"connections"] = {(dr.CONNECTION_NETWORK_MAC, mac)}
72 """Set up the event listeners now that hass is ready."""
75 if not self._always_available:
77 async
def on_available(event: AvailabilityEvent) ->
None:
81 self.
_subscribe_subscribe(AvailabilityEvent, on_available)
85 event_type: type[EventT],
86 callback: Callable[[EventT], Coroutine[Any, Any,
None]],
88 """Subscribe to events."""
89 self._subscribed_events.
add(event_type)
95 Only used by the generic entity update service.
97 for event_type
in self._subscribed_events:
98 self.
_device_device.events.request_refresh(event_type)
102 """Ecovacs entity."""
107 capability: CapabilityEntity,
108 entity_description: EntityDescription,
111 """Initialize entity."""
113 super().
__init__(device, capability, **kwargs)
116 @dataclass(kw_only=True, frozen=True)
119 Generic[CapabilityEntity],
121 """Ecovacs entity description."""
123 capability_fn: Callable[[Capabilities], CapabilityEntity |
None]
127 """Ecovacs legacy bot entity."""
129 _attr_has_entity_name =
True
130 _attr_should_poll =
False
133 """Initialize the legacy Ecovacs entity."""
135 vacuum = device.vacuum
137 self.error: str |
None =
None
140 if (name := vacuum.get(
"nick"))
is None:
144 identifiers={(DOMAIN, vacuum[
"did"])},
145 manufacturer=
"Ecovacs",
146 model=vacuum.get(
"deviceName"),
148 serial_number=vacuum[
"did"],
151 self._event_listeners: list[EventListener] = []
155 """Return True if the entity is available."""
156 return super().available
and self.
statestate
is not None
159 """Remove event listeners on entity remove."""
160 for listener
in self._event_listeners:
161 listener.unsubscribe()
None __init__(self, Device device, CapabilityEntity capability, EntityDescription entity_description, **Any kwargs)
None __init__(self, Device device, CapabilityEntity capability, **Any kwargs)
None _subscribe(self, type[EventT] event_type, Callable[[EventT], Coroutine[Any, Any, None]] callback)
DeviceInfo|None device_info(self)
None async_added_to_hass(self)
None async_will_remove_from_hass(self)
None __init__(self, VacBot device)
None async_write_ha_state(self)
None async_on_remove(self, CALLBACK_TYPE func)
bool add(self, _T matcher)