1 """Roborock Coordinator."""
3 from __future__
import annotations
5 from datetime
import timedelta
8 from propcache
import cached_property
9 from roborock
import HomeDataRoom
10 from roborock.code_mappings
import RoborockCategory
11 from roborock.containers
import DeviceData, HomeDataDevice, HomeDataProduct, NetworkInfo
12 from roborock.exceptions
import RoborockException
13 from roborock.roborock_message
import RoborockDyadDataProtocol, RoborockZeoProtocol
14 from roborock.roborock_typing
import DeviceProp
15 from roborock.version_1_apis.roborock_local_client_v1
import RoborockLocalClientV1
16 from roborock.version_1_apis.roborock_mqtt_client_v1
import RoborockMqttClientV1
17 from roborock.version_a01_apis
import RoborockClientA01
27 from .const
import DOMAIN
28 from .models
import RoborockA01HassDeviceInfo, RoborockHassDeviceInfo, RoborockMapInfo
32 _LOGGER = logging.getLogger(__name__)
36 """Class to manage fetching data from the API."""
41 device: HomeDataDevice,
42 device_networking: NetworkInfo,
43 product_info: HomeDataProduct,
44 cloud_api: RoborockMqttClientV1,
45 home_data_rooms: list[HomeDataRoom],
48 super().
__init__(hass, _LOGGER, name=DOMAIN, update_interval=SCAN_INTERVAL)
55 device_data = DeviceData(device, product_info.model, device_networking.ip)
56 self.
apiapi: RoborockLocalClientV1 | RoborockMqttClientV1 = RoborockLocalClientV1(
57 device_data, queue_timeout=5
63 manufacturer=
"Roborock",
71 self.
device_infodevice_info[ATTR_CONNECTIONS] = {(dr.CONNECTION_NETWORK_MAC, mac)}
73 self.maps: dict[int, RoborockMapInfo] = {}
77 """Verify that the api is reachable. If it is not, switch clients."""
78 if isinstance(self.
apiapi, RoborockLocalClientV1):
80 await self.
apiapi.ping()
81 except RoborockException:
83 "Using the cloud API for device %s. This is not recommended as it can lead to rate limiting. We recommend making your vacuum accessible by your Home Assistant instance",
86 await self.
apiapi.async_disconnect()
93 """Disconnect from API."""
94 await self.
apiapi.async_release()
95 await self.
cloud_apicloud_api.async_release()
98 """Update device properties."""
99 device_prop = await self.
apiapi.get_prop()
107 """Update data via library."""
115 except RoborockException
as ex:
131 """Add a map to the coordinators mapping."""
132 maps = await self.
apiapi.get_multi_maps_list()
133 if maps
and maps.map_info:
134 for roborock_map
in maps.map_info:
136 flag=roborock_map.mapFlag, name=roborock_map.name, rooms={}
140 """Get all of the rooms for the current map."""
145 iot_rooms = await self.
apiapi.get_room_mapping()
146 if iot_rooms
is not None:
147 for room
in iot_rooms:
148 self.maps[self.
current_mapcurrent_map].rooms[room.segment_id] = (
154 """Get the unique id of the device as specified by Roborock."""
159 """Get the slug of the duid."""
164 DataUpdateCoordinator[
165 dict[RoborockDyadDataProtocol | RoborockZeoProtocol, StateType]
168 """Class to manage fetching data from the API for A01 devices."""
173 device: HomeDataDevice,
174 product_info: HomeDataProduct,
175 api: RoborockClientA01,
178 super().
__init__(hass, _LOGGER, name=DOMAIN, update_interval=SCAN_INTERVAL)
182 identifiers={(DOMAIN, device.duid)},
183 manufacturer=
"Roborock",
184 model=product_info.model,
185 sw_version=device.fv,
188 RoborockDyadDataProtocol | RoborockZeoProtocol
190 if product_info.category == RoborockCategory.WET_DRY_VAC:
192 RoborockDyadDataProtocol.STATUS,
193 RoborockDyadDataProtocol.POWER,
194 RoborockDyadDataProtocol.MESH_LEFT,
195 RoborockDyadDataProtocol.BRUSH_LEFT,
196 RoborockDyadDataProtocol.ERROR,
197 RoborockDyadDataProtocol.TOTAL_RUN_TIME,
199 elif product_info.category == RoborockCategory.WASHING_MACHINE:
201 RoborockZeoProtocol.STATE,
202 RoborockZeoProtocol.COUNTDOWN,
203 RoborockZeoProtocol.WASHING_LEFT,
204 RoborockZeoProtocol.ERROR,
207 _LOGGER.warning(
"The device you added is not yet supported")
212 ) -> dict[RoborockDyadDataProtocol | RoborockZeoProtocol, StateType]:
216 """Disconnect from API."""
217 await self.
apiapi.async_release()
221 """Get the unique id of the device as specified by Roborock."""
226 """Get the slug of the duid."""
dict[RoborockDyadDataProtocol|RoborockZeoProtocol, StateType] _async_update_data(self)
None __init__(self, HomeAssistant hass, HomeDataDevice device, HomeDataProduct product_info, RoborockClientA01 api)
None __init__(self, HomeAssistant hass, HomeDataDevice device, NetworkInfo device_networking, HomeDataProduct product_info, RoborockMqttClientV1 cloud_api, list[HomeDataRoom] home_data_rooms)
None _set_current_map(self)
None _update_device_prop(self)
DeviceProp _async_update_data(self)
web.Response get(self, web.Request request, str config_key)