python-roborock 5.10.0__tar.gz → 5.10.1__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (103) hide show
  1. {python_roborock-5.10.0 → python_roborock-5.10.1}/PKG-INFO +1 -1
  2. {python_roborock-5.10.0 → python_roborock-5.10.1}/pyproject.toml +1 -1
  3. {python_roborock-5.10.0 → python_roborock-5.10.1}/roborock/devices/device_manager.py +17 -3
  4. {python_roborock-5.10.0 → python_roborock-5.10.1}/roborock/web_api.py +29 -5
  5. {python_roborock-5.10.0 → python_roborock-5.10.1}/.gitignore +0 -0
  6. {python_roborock-5.10.0 → python_roborock-5.10.1}/LICENSE +0 -0
  7. {python_roborock-5.10.0 → python_roborock-5.10.1}/README.md +0 -0
  8. {python_roborock-5.10.0 → python_roborock-5.10.1}/roborock/__init__.py +0 -0
  9. {python_roborock-5.10.0 → python_roborock-5.10.1}/roborock/broadcast_protocol.py +0 -0
  10. {python_roborock-5.10.0 → python_roborock-5.10.1}/roborock/callbacks.py +0 -0
  11. {python_roborock-5.10.0 → python_roborock-5.10.1}/roborock/cli.py +0 -0
  12. {python_roborock-5.10.0 → python_roborock-5.10.1}/roborock/const.py +0 -0
  13. {python_roborock-5.10.0 → python_roborock-5.10.1}/roborock/data/__init__.py +0 -0
  14. {python_roborock-5.10.0 → python_roborock-5.10.1}/roborock/data/b01_q10/__init__.py +0 -0
  15. {python_roborock-5.10.0 → python_roborock-5.10.1}/roborock/data/b01_q10/b01_q10_code_mappings.py +0 -0
  16. {python_roborock-5.10.0 → python_roborock-5.10.1}/roborock/data/b01_q10/b01_q10_containers.py +0 -0
  17. {python_roborock-5.10.0 → python_roborock-5.10.1}/roborock/data/b01_q7/__init__.py +0 -0
  18. {python_roborock-5.10.0 → python_roborock-5.10.1}/roborock/data/b01_q7/b01_q7_code_mappings.py +0 -0
  19. {python_roborock-5.10.0 → python_roborock-5.10.1}/roborock/data/b01_q7/b01_q7_containers.py +0 -0
  20. {python_roborock-5.10.0 → python_roborock-5.10.1}/roborock/data/code_mappings.py +0 -0
  21. {python_roborock-5.10.0 → python_roborock-5.10.1}/roborock/data/containers.py +0 -0
  22. {python_roborock-5.10.0 → python_roborock-5.10.1}/roborock/data/dyad/__init__.py +0 -0
  23. {python_roborock-5.10.0 → python_roborock-5.10.1}/roborock/data/dyad/dyad_code_mappings.py +0 -0
  24. {python_roborock-5.10.0 → python_roborock-5.10.1}/roborock/data/dyad/dyad_containers.py +0 -0
  25. {python_roborock-5.10.0 → python_roborock-5.10.1}/roborock/data/v1/__init__.py +0 -0
  26. {python_roborock-5.10.0 → python_roborock-5.10.1}/roborock/data/v1/v1_clean_modes.py +0 -0
  27. {python_roborock-5.10.0 → python_roborock-5.10.1}/roborock/data/v1/v1_code_mappings.py +0 -0
  28. {python_roborock-5.10.0 → python_roborock-5.10.1}/roborock/data/v1/v1_containers.py +0 -0
  29. {python_roborock-5.10.0 → python_roborock-5.10.1}/roborock/data/zeo/__init__.py +0 -0
  30. {python_roborock-5.10.0 → python_roborock-5.10.1}/roborock/data/zeo/zeo_code_mappings.py +0 -0
  31. {python_roborock-5.10.0 → python_roborock-5.10.1}/roborock/data/zeo/zeo_containers.py +0 -0
  32. {python_roborock-5.10.0 → python_roborock-5.10.1}/roborock/device_features.py +0 -0
  33. {python_roborock-5.10.0 → python_roborock-5.10.1}/roborock/devices/README.md +0 -0
  34. {python_roborock-5.10.0 → python_roborock-5.10.1}/roborock/devices/__init__.py +0 -0
  35. {python_roborock-5.10.0 → python_roborock-5.10.1}/roborock/devices/cache.py +0 -0
  36. {python_roborock-5.10.0 → python_roborock-5.10.1}/roborock/devices/device.py +0 -0
  37. {python_roborock-5.10.0 → python_roborock-5.10.1}/roborock/devices/file_cache.py +0 -0
  38. {python_roborock-5.10.0 → python_roborock-5.10.1}/roborock/devices/rpc/__init__.py +0 -0
  39. {python_roborock-5.10.0 → python_roborock-5.10.1}/roborock/devices/rpc/a01_channel.py +0 -0
  40. {python_roborock-5.10.0 → python_roborock-5.10.1}/roborock/devices/rpc/b01_q10_channel.py +0 -0
  41. {python_roborock-5.10.0 → python_roborock-5.10.1}/roborock/devices/rpc/b01_q7_channel.py +0 -0
  42. {python_roborock-5.10.0 → python_roborock-5.10.1}/roborock/devices/rpc/v1_channel.py +0 -0
  43. {python_roborock-5.10.0 → python_roborock-5.10.1}/roborock/devices/traits/__init__.py +0 -0
  44. {python_roborock-5.10.0 → python_roborock-5.10.1}/roborock/devices/traits/a01/__init__.py +0 -0
  45. {python_roborock-5.10.0 → python_roborock-5.10.1}/roborock/devices/traits/b01/__init__.py +0 -0
  46. {python_roborock-5.10.0 → python_roborock-5.10.1}/roborock/devices/traits/b01/q10/__init__.py +0 -0
  47. {python_roborock-5.10.0 → python_roborock-5.10.1}/roborock/devices/traits/b01/q10/command.py +0 -0
  48. {python_roborock-5.10.0 → python_roborock-5.10.1}/roborock/devices/traits/b01/q10/status.py +0 -0
  49. {python_roborock-5.10.0 → python_roborock-5.10.1}/roborock/devices/traits/b01/q10/vacuum.py +0 -0
  50. {python_roborock-5.10.0 → python_roborock-5.10.1}/roborock/devices/traits/b01/q7/__init__.py +0 -0
  51. {python_roborock-5.10.0 → python_roborock-5.10.1}/roborock/devices/traits/b01/q7/clean_summary.py +0 -0
  52. {python_roborock-5.10.0 → python_roborock-5.10.1}/roborock/devices/traits/b01/q7/map.py +0 -0
  53. {python_roborock-5.10.0 → python_roborock-5.10.1}/roborock/devices/traits/b01/q7/map_content.py +0 -0
  54. {python_roborock-5.10.0 → python_roborock-5.10.1}/roborock/devices/traits/common.py +0 -0
  55. {python_roborock-5.10.0 → python_roborock-5.10.1}/roborock/devices/traits/traits_mixin.py +0 -0
  56. {python_roborock-5.10.0 → python_roborock-5.10.1}/roborock/devices/traits/v1/__init__.py +0 -0
  57. {python_roborock-5.10.0 → python_roborock-5.10.1}/roborock/devices/traits/v1/child_lock.py +0 -0
  58. {python_roborock-5.10.0 → python_roborock-5.10.1}/roborock/devices/traits/v1/clean_summary.py +0 -0
  59. {python_roborock-5.10.0 → python_roborock-5.10.1}/roborock/devices/traits/v1/command.py +0 -0
  60. {python_roborock-5.10.0 → python_roborock-5.10.1}/roborock/devices/traits/v1/common.py +0 -0
  61. {python_roborock-5.10.0 → python_roborock-5.10.1}/roborock/devices/traits/v1/consumeable.py +0 -0
  62. {python_roborock-5.10.0 → python_roborock-5.10.1}/roborock/devices/traits/v1/device_features.py +0 -0
  63. {python_roborock-5.10.0 → python_roborock-5.10.1}/roborock/devices/traits/v1/do_not_disturb.py +0 -0
  64. {python_roborock-5.10.0 → python_roborock-5.10.1}/roborock/devices/traits/v1/dust_collection_mode.py +0 -0
  65. {python_roborock-5.10.0 → python_roborock-5.10.1}/roborock/devices/traits/v1/flow_led_status.py +0 -0
  66. {python_roborock-5.10.0 → python_roborock-5.10.1}/roborock/devices/traits/v1/home.py +0 -0
  67. {python_roborock-5.10.0 → python_roborock-5.10.1}/roborock/devices/traits/v1/led_status.py +0 -0
  68. {python_roborock-5.10.0 → python_roborock-5.10.1}/roborock/devices/traits/v1/map_content.py +0 -0
  69. {python_roborock-5.10.0 → python_roborock-5.10.1}/roborock/devices/traits/v1/maps.py +0 -0
  70. {python_roborock-5.10.0 → python_roborock-5.10.1}/roborock/devices/traits/v1/network_info.py +0 -0
  71. {python_roborock-5.10.0 → python_roborock-5.10.1}/roborock/devices/traits/v1/rooms.py +0 -0
  72. {python_roborock-5.10.0 → python_roborock-5.10.1}/roborock/devices/traits/v1/routines.py +0 -0
  73. {python_roborock-5.10.0 → python_roborock-5.10.1}/roborock/devices/traits/v1/smart_wash_params.py +0 -0
  74. {python_roborock-5.10.0 → python_roborock-5.10.1}/roborock/devices/traits/v1/status.py +0 -0
  75. {python_roborock-5.10.0 → python_roborock-5.10.1}/roborock/devices/traits/v1/valley_electricity_timer.py +0 -0
  76. {python_roborock-5.10.0 → python_roborock-5.10.1}/roborock/devices/traits/v1/volume.py +0 -0
  77. {python_roborock-5.10.0 → python_roborock-5.10.1}/roborock/devices/traits/v1/wash_towel_mode.py +0 -0
  78. {python_roborock-5.10.0 → python_roborock-5.10.1}/roborock/devices/transport/__init__.py +0 -0
  79. {python_roborock-5.10.0 → python_roborock-5.10.1}/roborock/devices/transport/channel.py +0 -0
  80. {python_roborock-5.10.0 → python_roborock-5.10.1}/roborock/devices/transport/local_channel.py +0 -0
  81. {python_roborock-5.10.0 → python_roborock-5.10.1}/roborock/devices/transport/mqtt_channel.py +0 -0
  82. {python_roborock-5.10.0 → python_roborock-5.10.1}/roborock/diagnostics.py +0 -0
  83. {python_roborock-5.10.0 → python_roborock-5.10.1}/roborock/exceptions.py +0 -0
  84. {python_roborock-5.10.0 → python_roborock-5.10.1}/roborock/map/__init__.py +0 -0
  85. {python_roborock-5.10.0 → python_roborock-5.10.1}/roborock/map/b01_map_parser.py +0 -0
  86. {python_roborock-5.10.0 → python_roborock-5.10.1}/roborock/map/map_parser.py +0 -0
  87. {python_roborock-5.10.0 → python_roborock-5.10.1}/roborock/map/proto/__init__.py +0 -0
  88. {python_roborock-5.10.0 → python_roborock-5.10.1}/roborock/map/proto/b01_scmap.proto +0 -0
  89. {python_roborock-5.10.0 → python_roborock-5.10.1}/roborock/map/proto/b01_scmap_pb2.py +0 -0
  90. {python_roborock-5.10.0 → python_roborock-5.10.1}/roborock/mqtt/__init__.py +0 -0
  91. {python_roborock-5.10.0 → python_roborock-5.10.1}/roborock/mqtt/health_manager.py +0 -0
  92. {python_roborock-5.10.0 → python_roborock-5.10.1}/roborock/mqtt/roborock_session.py +0 -0
  93. {python_roborock-5.10.0 → python_roborock-5.10.1}/roborock/mqtt/session.py +0 -0
  94. {python_roborock-5.10.0 → python_roborock-5.10.1}/roborock/protocol.py +0 -0
  95. {python_roborock-5.10.0 → python_roborock-5.10.1}/roborock/protocols/__init__.py +0 -0
  96. {python_roborock-5.10.0 → python_roborock-5.10.1}/roborock/protocols/a01_protocol.py +0 -0
  97. {python_roborock-5.10.0 → python_roborock-5.10.1}/roborock/protocols/b01_q10_protocol.py +0 -0
  98. {python_roborock-5.10.0 → python_roborock-5.10.1}/roborock/protocols/b01_q7_protocol.py +0 -0
  99. {python_roborock-5.10.0 → python_roborock-5.10.1}/roborock/protocols/v1_protocol.py +0 -0
  100. {python_roborock-5.10.0 → python_roborock-5.10.1}/roborock/py.typed +0 -0
  101. {python_roborock-5.10.0 → python_roborock-5.10.1}/roborock/roborock_message.py +0 -0
  102. {python_roborock-5.10.0 → python_roborock-5.10.1}/roborock/roborock_typing.py +0 -0
  103. {python_roborock-5.10.0 → python_roborock-5.10.1}/roborock/util.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: python-roborock
3
- Version: 5.10.0
3
+ Version: 5.10.1
4
4
  Summary: A package to control Roborock vacuums.
5
5
  Project-URL: Repository, https://github.com/python-roborock/python-roborock
6
6
  Project-URL: Documentation, https://python-roborock.readthedocs.io/
@@ -1,6 +1,6 @@
1
1
  [project]
2
2
  name = "python-roborock"
3
- version = "5.10.0"
3
+ version = "5.10.1"
4
4
  description = "A package to control Roborock vacuums."
5
5
  authors = [{ name = "humbertogontijo", email = "humbertogontijo@users.noreply.github.com" }, {name="Lash-L"}, {name="allenporter"}]
6
6
  requires-python = ">=3.11, <4"
@@ -13,6 +13,7 @@ from roborock.data import (
13
13
  HomeData,
14
14
  HomeDataDevice,
15
15
  HomeDataProduct,
16
+ RoborockCategory,
16
17
  UserData,
17
18
  )
18
19
  from roborock.devices.device import DeviceReadyCallback, RoborockDevice
@@ -173,6 +174,7 @@ def create_web_api_wrapper(
173
174
  *,
174
175
  cache: Cache | None = None,
175
176
  session: aiohttp.ClientSession | None = None,
177
+ unauthorized_hook: SessionUnauthorizedHook | None = None,
176
178
  ) -> UserWebApiClient:
177
179
  """Create a home data API wrapper from an existing API client."""
178
180
 
@@ -180,7 +182,7 @@ def create_web_api_wrapper(
180
182
  # by caching this next to `UserData` if needed to avoid unnecessary API calls.
181
183
  client = RoborockApiClient(username=user_params.username, base_url=user_params.base_url, session=session)
182
184
 
183
- return UserWebApiClient(client, user_params.user_data)
185
+ return UserWebApiClient(client, user_params.user_data, unauthorized_hook=unauthorized_hook)
184
186
 
185
187
 
186
188
  async def create_device_manager(
@@ -212,7 +214,9 @@ async def create_device_manager(
212
214
  if cache is None:
213
215
  cache = NoCache()
214
216
 
215
- web_api = create_web_api_wrapper(user_params, session=session, cache=cache)
217
+ web_api = create_web_api_wrapper(
218
+ user_params, session=session, cache=cache, unauthorized_hook=mqtt_session_unauthorized_hook
219
+ )
216
220
  user_data = user_params.user_data
217
221
 
218
222
  diagnostics = Diagnostics()
@@ -228,6 +232,10 @@ async def create_device_manager(
228
232
  device_cache: DeviceCache = DeviceCache(device.duid, cache)
229
233
  match device.pv:
230
234
  case DeviceVersion.V1:
235
+ if product.category != RoborockCategory.VACUUM:
236
+ raise UnsupportedDeviceError(
237
+ f"Device {device.name} has unsupported V1 category {product.category}: {product.model}"
238
+ )
231
239
  channel = create_v1_channel(user_data, mqtt_params, mqtt_session, device, device_cache)
232
240
  trait = v1.create(
233
241
  device.duid,
@@ -265,6 +273,12 @@ async def create_device_manager(
265
273
  dev.add_ready_callback(ready_callback)
266
274
  return dev
267
275
 
268
- manager = DeviceManager(web_api, device_creator, mqtt_session=mqtt_session, cache=cache, diagnostics=diagnostics)
276
+ manager = DeviceManager(
277
+ web_api,
278
+ device_creator,
279
+ mqtt_session=mqtt_session,
280
+ cache=cache,
281
+ diagnostics=diagnostics,
282
+ )
269
283
  await manager.discover_devices(prefer_cache)
270
284
  return manager
@@ -6,6 +6,7 @@ import math
6
6
  import secrets
7
7
  import string
8
8
  import time
9
+ from collections.abc import Callable
9
10
  from dataclasses import dataclass
10
11
 
11
12
  import aiohttp
@@ -737,23 +738,46 @@ class UserWebApiClient:
737
738
  to avoid needing to pass UserData around and mock out the web API.
738
739
  """
739
740
 
740
- def __init__(self, web_api: RoborockApiClient, user_data: UserData) -> None:
741
+ def __init__(
742
+ self, web_api: RoborockApiClient, user_data: UserData, unauthorized_hook: Callable[[], None] | None = None
743
+ ) -> None:
741
744
  """Initialize the wrapper with the API client and user data."""
742
745
  self._web_api = web_api
743
746
  self._user_data = user_data
747
+ self._unauthorized_hook = unauthorized_hook
744
748
 
745
749
  async def get_home_data(self) -> HomeData:
746
750
  """Fetch home data using the API client."""
747
- return await self._web_api.get_home_data_v3(self._user_data)
751
+ try:
752
+ return await self._web_api.get_home_data_v3(self._user_data)
753
+ except RoborockInvalidCredentials:
754
+ if self._unauthorized_hook:
755
+ self._unauthorized_hook()
756
+ raise
748
757
 
749
758
  async def get_routines(self, device_id: str) -> list[HomeDataScene]:
750
759
  """Fetch routines (scenes) for a specific device."""
751
- return await self._web_api.get_scenes(self._user_data, device_id)
760
+ try:
761
+ return await self._web_api.get_scenes(self._user_data, device_id)
762
+ except RoborockInvalidCredentials:
763
+ if self._unauthorized_hook:
764
+ self._unauthorized_hook()
765
+ raise
752
766
 
753
767
  async def get_rooms(self) -> list[HomeDataRoom]:
754
768
  """Fetch rooms using the API client."""
755
- return await self._web_api.get_rooms(self._user_data)
769
+ try:
770
+ return await self._web_api.get_rooms(self._user_data)
771
+ except RoborockInvalidCredentials:
772
+ if self._unauthorized_hook:
773
+ self._unauthorized_hook()
774
+ raise
756
775
 
757
776
  async def execute_routine(self, scene_id: int) -> None:
758
777
  """Execute a specific routine (scene) by its ID."""
759
- await self._web_api.execute_scene(self._user_data, scene_id)
778
+ try:
779
+ await self._web_api.execute_scene(self._user_data, scene_id)
780
+ except RoborockInvalidCredentials:
781
+ if self._unauthorized_hook:
782
+ self._unauthorized_hook()
783
+ raise