1 """Base entity for Sensibo integration."""
3 from __future__
import annotations
6 from collections.abc
import Callable, Coroutine
7 from typing
import TYPE_CHECKING, Any, Concatenate
9 from pysensibo.model
import MotionSensor, SensiboDevice
15 from .const
import DOMAIN, LOGGER, SENSIBO_ERRORS, TIMEOUT
16 from .coordinator
import SensiboDataUpdateCoordinator
19 def async_handle_api_call[_T: SensiboDeviceBaseEntity, **_P](
20 function: Callable[Concatenate[_T, _P], Coroutine[Any, Any, Any]],
21 ) -> Callable[Concatenate[_T, _P], Coroutine[Any, Any, Any]]:
22 """Decorate api calls."""
24 async
def wrap_api_call(entity: _T, *args: _P.args, **kwargs: _P.kwargs) ->
None:
25 """Wrap services for api calls."""
28 assert isinstance(entity.name, str)
30 async
with asyncio.timeout(TIMEOUT):
31 res = await function(entity, *args, **kwargs)
32 except SENSIBO_ERRORS
as err:
34 translation_domain=DOMAIN,
35 translation_key=
"service_raised",
36 translation_placeholders={
"error":
str(err),
"name": entity.name},
39 LOGGER.debug(
"Result %s for entity %s with arguments %s", res, entity, kwargs)
42 translation_domain=DOMAIN,
43 translation_key=
"service_result_not_true",
44 translation_placeholders={
"name": entity.name},
47 isinstance(key := kwargs.get(
"key"), str)
48 and (value := kwargs.get(
"value"))
is not None
50 setattr(entity.device_data, key, value)
51 LOGGER.debug(
"Debug check key %s is now %s", key, value)
52 entity.async_write_ha_state()
53 await entity.coordinator.async_request_refresh()
59 """Representation of a Sensibo Base Entity."""
61 _attr_has_entity_name =
True
65 coordinator: SensiboDataUpdateCoordinator,
68 """Initiate Sensibo Number."""
75 """Return data for device."""
76 return self.coordinator.data.parsed[self.
_device_id_device_id]
80 """Representation of a Sensibo Device."""
84 coordinator: SensiboDataUpdateCoordinator,
87 """Initiate Sensibo Device."""
88 super().
__init__(coordinator, device_id)
90 identifiers={(DOMAIN, self.
device_datadevice_data.id)},
92 connections={(CONNECTION_NETWORK_MAC, self.
device_datadevice_data.mac)},
93 manufacturer=
"Sensibo",
94 configuration_url=
"https://home.sensibo.com/",
104 """Representation of a Sensibo Motion Entity."""
108 coordinator: SensiboDataUpdateCoordinator,
111 sensor_data: MotionSensor,
113 """Initiate Sensibo Number."""
114 super().
__init__(coordinator, device_id)
117 identifiers={(DOMAIN, sensor_id)},
118 name=f
"{self.device_data.name} Motion Sensor",
119 via_device=(DOMAIN, device_id),
120 manufacturer=
"Sensibo",
121 configuration_url=
"https://home.sensibo.com/",
122 model=sensor_data.model,
123 sw_version=sensor_data.fw_ver,
124 hw_version=sensor_data.fw_type,
129 """Return data for Motion Sensor."""
None __init__(self, SensiboDataUpdateCoordinator coordinator, str device_id)
SensiboDevice device_data(self)
None __init__(self, SensiboDataUpdateCoordinator coordinator, str device_id)
MotionSensor|None sensor_data(self)
None __init__(self, SensiboDataUpdateCoordinator coordinator, str device_id, str sensor_id, MotionSensor sensor_data)