1 """Support for fetching data from Broadlink devices."""
3 from __future__
import annotations
5 from abc
import ABC, abstractmethod
6 from datetime
import datetime, timedelta
8 from typing
import TYPE_CHECKING, Any, Generic
10 import broadlink
as blk
11 from broadlink.exceptions
import AuthorizationError, BroadlinkException
12 from typing_extensions
import TypeVar
18 from .device
import BroadlinkDevice
20 _ApiT = TypeVar(
"_ApiT", bound=blk.Device)
22 _LOGGER = logging.getLogger(__name__)
26 """Return an update manager for a given Broadlink device."""
27 update_managers: dict[str, type[BroadlinkUpdateManager]] = {
28 "A1": BroadlinkA1UpdateManager,
29 "BG1": BroadlinkBG1UpdateManager,
30 "HYS": BroadlinkThermostatUpdateManager,
31 "LB1": BroadlinkLB1UpdateManager,
32 "LB2": BroadlinkLB1UpdateManager,
33 "MP1": BroadlinkMP1UpdateManager,
34 "MP1S": BroadlinkMP1SUpdateManager,
35 "RM4MINI": BroadlinkRMUpdateManager,
36 "RM4PRO": BroadlinkRMUpdateManager,
37 "RMMINI": BroadlinkRMUpdateManager,
38 "RMMINIB": BroadlinkRMUpdateManager,
39 "RMPRO": BroadlinkRMUpdateManager,
40 "SP1": BroadlinkSP1UpdateManager,
41 "SP2": BroadlinkSP2UpdateManager,
42 "SP2S": BroadlinkSP2UpdateManager,
43 "SP3": BroadlinkSP2UpdateManager,
44 "SP3S": BroadlinkSP2UpdateManager,
45 "SP4": BroadlinkSP4UpdateManager,
46 "SP4B": BroadlinkSP4UpdateManager,
48 return update_managers[device.api.type](device)
52 """Representation of a Broadlink update manager.
54 Implement this class to manage fetching data from the device and to
55 monitor device availability.
60 def __init__(self, device: BroadlinkDevice[_ApiT]) ->
None:
61 """Initialize the update manager."""
66 name=f
"{device.name} ({device.api.model} at {device.api.host[0]})",
70 self.
availableavailable: bool |
None =
None
74 """Fetch data from the device and update availability."""
78 except (BroadlinkException, OSError)
as err:
84 or isinstance(err, (AuthorizationError, OSError))
89 "Disconnected from %s (%s at %s)",
91 self.
devicedevice.api.model,
92 self.
devicedevice.api.host[0],
98 "Connected to %s (%s at %s)",
100 self.
devicedevice.api.model,
101 self.
devicedevice.api.host[0],
109 """Fetch data from the device."""
112 class BroadlinkA1UpdateManager(BroadlinkUpdateManager[blk.a1]):
113 """Manages updates for Broadlink A1 devices."""
118 """Fetch data from the device."""
119 return await self.
devicedevice.async_request(self.
devicedevice.api.check_sensors_raw)
123 """Manages updates for Broadlink MP1 devices."""
126 """Fetch data from the device."""
127 return await self.
devicedevice.async_request(self.
devicedevice.api.check_power)
131 """Manages updates for Broadlink MP1 devices."""
134 """Fetch data from the device."""
135 power = await self.
devicedevice.async_request(self.
devicedevice.api.check_power)
136 sensors = await self.
devicedevice.async_request(self.
devicedevice.api.get_state)
137 return {**power, **sensors}
141 """Manages updates for Broadlink remotes."""
144 """Fetch data from the device."""
145 device = self.
devicedevice
147 if hasattr(device.api,
"check_sensors"):
148 data = await device.async_request(device.api.check_sensors)
151 await device.async_request(device.api.update)
156 data: dict[str, Any], previous_data: dict[str, Any] |
None
158 """Fix firmware issue.
160 See https://github.com/home-assistant/core/issues/42100.
162 if data[
"temperature"] == -7:
163 if previous_data
is None or previous_data[
"temperature"]
is None:
164 data[
"temperature"] =
None
165 elif abs(previous_data[
"temperature"] - data[
"temperature"]) > 3:
166 data[
"temperature"] = previous_data[
"temperature"]
171 """Manages updates for Broadlink SP1 devices."""
174 """Fetch data from the device."""
179 """Manages updates for Broadlink SP2 devices."""
182 """Fetch data from the device."""
183 device = self.
devicedevice
186 data[
"pwr"] = await device.async_request(device.api.check_power)
188 if hasattr(device.api,
"get_energy"):
189 data[
"power"] = await device.async_request(device.api.get_energy)
195 """Manages updates for Broadlink BG1 devices."""
198 """Fetch data from the device."""
199 return await self.
devicedevice.async_request(self.
devicedevice.api.get_state)
203 """Manages updates for Broadlink SP4 devices."""
206 """Fetch data from the device."""
207 return await self.
devicedevice.async_request(self.
devicedevice.api.get_state)
211 """Manages updates for Broadlink LB1 devices."""
214 """Fetch data from the device."""
215 return await self.
devicedevice.async_request(self.
devicedevice.api.get_state)
219 """Manages updates for thermostats with Broadlink DNA."""
222 """Fetch data from the device."""
223 return await self.
devicedevice.async_request(self.
devicedevice.api.get_full_status)
dict[str, Any] async_fetch_data(self)
dict[str, Any] async_fetch_data(self)
dict[str, Any] async_fetch_data(self)
dict[str, Any] async_fetch_data(self)
dict[str, Any] async_fetch_data(self)
dict[str, Any] async_fetch_data(self)
dict[str, Any] normalize(dict[str, Any] data, dict[str, Any]|None previous_data)
dict[str, Any]|None async_fetch_data(self)
dict[str, Any] async_fetch_data(self)
dict[str, Any] async_fetch_data(self)
dict[str, Any] async_fetch_data(self)
None __init__(self, BroadlinkDevice[_ApiT] device)
dict[str, Any]|None async_update(self)
dict[str, Any]|None async_fetch_data(self)
BroadlinkUpdateManager[_ApiT] get_update_manager(BroadlinkDevice[_ApiT] device)