python-roborock 4.17.0__tar.gz → 4.17.2__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 (97) hide show
  1. {python_roborock-4.17.0 → python_roborock-4.17.2}/PKG-INFO +2 -2
  2. {python_roborock-4.17.0 → python_roborock-4.17.2}/pyproject.toml +2 -2
  3. {python_roborock-4.17.0 → python_roborock-4.17.2}/roborock/data/v1/v1_clean_modes.py +0 -3
  4. {python_roborock-4.17.0 → python_roborock-4.17.2}/roborock/web_api.py +14 -32
  5. {python_roborock-4.17.0 → python_roborock-4.17.2}/.gitignore +0 -0
  6. {python_roborock-4.17.0 → python_roborock-4.17.2}/LICENSE +0 -0
  7. {python_roborock-4.17.0 → python_roborock-4.17.2}/README.md +0 -0
  8. {python_roborock-4.17.0 → python_roborock-4.17.2}/roborock/__init__.py +0 -0
  9. {python_roborock-4.17.0 → python_roborock-4.17.2}/roborock/broadcast_protocol.py +0 -0
  10. {python_roborock-4.17.0 → python_roborock-4.17.2}/roborock/callbacks.py +0 -0
  11. {python_roborock-4.17.0 → python_roborock-4.17.2}/roborock/cli.py +0 -0
  12. {python_roborock-4.17.0 → python_roborock-4.17.2}/roborock/const.py +0 -0
  13. {python_roborock-4.17.0 → python_roborock-4.17.2}/roborock/data/__init__.py +0 -0
  14. {python_roborock-4.17.0 → python_roborock-4.17.2}/roborock/data/b01_q10/__init__.py +0 -0
  15. {python_roborock-4.17.0 → python_roborock-4.17.2}/roborock/data/b01_q10/b01_q10_code_mappings.py +0 -0
  16. {python_roborock-4.17.0 → python_roborock-4.17.2}/roborock/data/b01_q10/b01_q10_containers.py +0 -0
  17. {python_roborock-4.17.0 → python_roborock-4.17.2}/roborock/data/b01_q7/__init__.py +0 -0
  18. {python_roborock-4.17.0 → python_roborock-4.17.2}/roborock/data/b01_q7/b01_q7_code_mappings.py +0 -0
  19. {python_roborock-4.17.0 → python_roborock-4.17.2}/roborock/data/b01_q7/b01_q7_containers.py +0 -0
  20. {python_roborock-4.17.0 → python_roborock-4.17.2}/roborock/data/code_mappings.py +0 -0
  21. {python_roborock-4.17.0 → python_roborock-4.17.2}/roborock/data/containers.py +0 -0
  22. {python_roborock-4.17.0 → python_roborock-4.17.2}/roborock/data/dyad/__init__.py +0 -0
  23. {python_roborock-4.17.0 → python_roborock-4.17.2}/roborock/data/dyad/dyad_code_mappings.py +0 -0
  24. {python_roborock-4.17.0 → python_roborock-4.17.2}/roborock/data/dyad/dyad_containers.py +0 -0
  25. {python_roborock-4.17.0 → python_roborock-4.17.2}/roborock/data/v1/__init__.py +0 -0
  26. {python_roborock-4.17.0 → python_roborock-4.17.2}/roborock/data/v1/v1_code_mappings.py +0 -0
  27. {python_roborock-4.17.0 → python_roborock-4.17.2}/roborock/data/v1/v1_containers.py +0 -0
  28. {python_roborock-4.17.0 → python_roborock-4.17.2}/roborock/data/zeo/__init__.py +0 -0
  29. {python_roborock-4.17.0 → python_roborock-4.17.2}/roborock/data/zeo/zeo_code_mappings.py +0 -0
  30. {python_roborock-4.17.0 → python_roborock-4.17.2}/roborock/data/zeo/zeo_containers.py +0 -0
  31. {python_roborock-4.17.0 → python_roborock-4.17.2}/roborock/device_features.py +0 -0
  32. {python_roborock-4.17.0 → python_roborock-4.17.2}/roborock/devices/README.md +0 -0
  33. {python_roborock-4.17.0 → python_roborock-4.17.2}/roborock/devices/__init__.py +0 -0
  34. {python_roborock-4.17.0 → python_roborock-4.17.2}/roborock/devices/cache.py +0 -0
  35. {python_roborock-4.17.0 → python_roborock-4.17.2}/roborock/devices/device.py +0 -0
  36. {python_roborock-4.17.0 → python_roborock-4.17.2}/roborock/devices/device_manager.py +0 -0
  37. {python_roborock-4.17.0 → python_roborock-4.17.2}/roborock/devices/file_cache.py +0 -0
  38. {python_roborock-4.17.0 → python_roborock-4.17.2}/roborock/devices/rpc/__init__.py +0 -0
  39. {python_roborock-4.17.0 → python_roborock-4.17.2}/roborock/devices/rpc/a01_channel.py +0 -0
  40. {python_roborock-4.17.0 → python_roborock-4.17.2}/roborock/devices/rpc/b01_q10_channel.py +0 -0
  41. {python_roborock-4.17.0 → python_roborock-4.17.2}/roborock/devices/rpc/b01_q7_channel.py +0 -0
  42. {python_roborock-4.17.0 → python_roborock-4.17.2}/roborock/devices/rpc/v1_channel.py +0 -0
  43. {python_roborock-4.17.0 → python_roborock-4.17.2}/roborock/devices/traits/__init__.py +0 -0
  44. {python_roborock-4.17.0 → python_roborock-4.17.2}/roborock/devices/traits/a01/__init__.py +0 -0
  45. {python_roborock-4.17.0 → python_roborock-4.17.2}/roborock/devices/traits/b01/__init__.py +0 -0
  46. {python_roborock-4.17.0 → python_roborock-4.17.2}/roborock/devices/traits/b01/q10/__init__.py +0 -0
  47. {python_roborock-4.17.0 → python_roborock-4.17.2}/roborock/devices/traits/b01/q10/command.py +0 -0
  48. {python_roborock-4.17.0 → python_roborock-4.17.2}/roborock/devices/traits/b01/q10/common.py +0 -0
  49. {python_roborock-4.17.0 → python_roborock-4.17.2}/roborock/devices/traits/b01/q10/status.py +0 -0
  50. {python_roborock-4.17.0 → python_roborock-4.17.2}/roborock/devices/traits/b01/q10/vacuum.py +0 -0
  51. {python_roborock-4.17.0 → python_roborock-4.17.2}/roborock/devices/traits/b01/q7/__init__.py +0 -0
  52. {python_roborock-4.17.0 → python_roborock-4.17.2}/roborock/devices/traits/b01/q7/clean_summary.py +0 -0
  53. {python_roborock-4.17.0 → python_roborock-4.17.2}/roborock/devices/traits/traits_mixin.py +0 -0
  54. {python_roborock-4.17.0 → python_roborock-4.17.2}/roborock/devices/traits/v1/__init__.py +0 -0
  55. {python_roborock-4.17.0 → python_roborock-4.17.2}/roborock/devices/traits/v1/child_lock.py +0 -0
  56. {python_roborock-4.17.0 → python_roborock-4.17.2}/roborock/devices/traits/v1/clean_summary.py +0 -0
  57. {python_roborock-4.17.0 → python_roborock-4.17.2}/roborock/devices/traits/v1/command.py +0 -0
  58. {python_roborock-4.17.0 → python_roborock-4.17.2}/roborock/devices/traits/v1/common.py +0 -0
  59. {python_roborock-4.17.0 → python_roborock-4.17.2}/roborock/devices/traits/v1/consumeable.py +0 -0
  60. {python_roborock-4.17.0 → python_roborock-4.17.2}/roborock/devices/traits/v1/device_features.py +0 -0
  61. {python_roborock-4.17.0 → python_roborock-4.17.2}/roborock/devices/traits/v1/do_not_disturb.py +0 -0
  62. {python_roborock-4.17.0 → python_roborock-4.17.2}/roborock/devices/traits/v1/dust_collection_mode.py +0 -0
  63. {python_roborock-4.17.0 → python_roborock-4.17.2}/roborock/devices/traits/v1/flow_led_status.py +0 -0
  64. {python_roborock-4.17.0 → python_roborock-4.17.2}/roborock/devices/traits/v1/home.py +0 -0
  65. {python_roborock-4.17.0 → python_roborock-4.17.2}/roborock/devices/traits/v1/led_status.py +0 -0
  66. {python_roborock-4.17.0 → python_roborock-4.17.2}/roborock/devices/traits/v1/map_content.py +0 -0
  67. {python_roborock-4.17.0 → python_roborock-4.17.2}/roborock/devices/traits/v1/maps.py +0 -0
  68. {python_roborock-4.17.0 → python_roborock-4.17.2}/roborock/devices/traits/v1/network_info.py +0 -0
  69. {python_roborock-4.17.0 → python_roborock-4.17.2}/roborock/devices/traits/v1/rooms.py +0 -0
  70. {python_roborock-4.17.0 → python_roborock-4.17.2}/roborock/devices/traits/v1/routines.py +0 -0
  71. {python_roborock-4.17.0 → python_roborock-4.17.2}/roborock/devices/traits/v1/smart_wash_params.py +0 -0
  72. {python_roborock-4.17.0 → python_roborock-4.17.2}/roborock/devices/traits/v1/status.py +0 -0
  73. {python_roborock-4.17.0 → python_roborock-4.17.2}/roborock/devices/traits/v1/valley_electricity_timer.py +0 -0
  74. {python_roborock-4.17.0 → python_roborock-4.17.2}/roborock/devices/traits/v1/volume.py +0 -0
  75. {python_roborock-4.17.0 → python_roborock-4.17.2}/roborock/devices/traits/v1/wash_towel_mode.py +0 -0
  76. {python_roborock-4.17.0 → python_roborock-4.17.2}/roborock/devices/transport/__init__.py +0 -0
  77. {python_roborock-4.17.0 → python_roborock-4.17.2}/roborock/devices/transport/channel.py +0 -0
  78. {python_roborock-4.17.0 → python_roborock-4.17.2}/roborock/devices/transport/local_channel.py +0 -0
  79. {python_roborock-4.17.0 → python_roborock-4.17.2}/roborock/devices/transport/mqtt_channel.py +0 -0
  80. {python_roborock-4.17.0 → python_roborock-4.17.2}/roborock/diagnostics.py +0 -0
  81. {python_roborock-4.17.0 → python_roborock-4.17.2}/roborock/exceptions.py +0 -0
  82. {python_roborock-4.17.0 → python_roborock-4.17.2}/roborock/map/__init__.py +0 -0
  83. {python_roborock-4.17.0 → python_roborock-4.17.2}/roborock/map/map_parser.py +0 -0
  84. {python_roborock-4.17.0 → python_roborock-4.17.2}/roborock/mqtt/__init__.py +0 -0
  85. {python_roborock-4.17.0 → python_roborock-4.17.2}/roborock/mqtt/health_manager.py +0 -0
  86. {python_roborock-4.17.0 → python_roborock-4.17.2}/roborock/mqtt/roborock_session.py +0 -0
  87. {python_roborock-4.17.0 → python_roborock-4.17.2}/roborock/mqtt/session.py +0 -0
  88. {python_roborock-4.17.0 → python_roborock-4.17.2}/roborock/protocol.py +0 -0
  89. {python_roborock-4.17.0 → python_roborock-4.17.2}/roborock/protocols/__init__.py +0 -0
  90. {python_roborock-4.17.0 → python_roborock-4.17.2}/roborock/protocols/a01_protocol.py +0 -0
  91. {python_roborock-4.17.0 → python_roborock-4.17.2}/roborock/protocols/b01_q10_protocol.py +0 -0
  92. {python_roborock-4.17.0 → python_roborock-4.17.2}/roborock/protocols/b01_q7_protocol.py +0 -0
  93. {python_roborock-4.17.0 → python_roborock-4.17.2}/roborock/protocols/v1_protocol.py +0 -0
  94. {python_roborock-4.17.0 → python_roborock-4.17.2}/roborock/py.typed +0 -0
  95. {python_roborock-4.17.0 → python_roborock-4.17.2}/roborock/roborock_message.py +0 -0
  96. {python_roborock-4.17.0 → python_roborock-4.17.2}/roborock/roborock_typing.py +0 -0
  97. {python_roborock-4.17.0 → python_roborock-4.17.2}/roborock/util.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: python-roborock
3
- Version: 4.17.0
3
+ Version: 4.17.2
4
4
  Summary: A package to control Roborock vacuums.
5
5
  Project-URL: Repository, https://github.com/humbertogontijo/python-roborock
6
6
  Project-URL: Documentation, https://python-roborock.readthedocs.io/
@@ -23,7 +23,7 @@ Requires-Dist: construct<3,>=2.10.57
23
23
  Requires-Dist: paho-mqtt<3.0.0,>=1.6.1
24
24
  Requires-Dist: pycryptodomex~=3.18; sys_platform == 'darwin'
25
25
  Requires-Dist: pycryptodome~=3.18
26
- Requires-Dist: pyrate-limiter<4,>=3.7.0
26
+ Requires-Dist: pyrate-limiter<5,>=4.0.0
27
27
  Requires-Dist: vacuum-map-parser-roborock
28
28
  Description-Content-Type: text/markdown
29
29
 
@@ -1,6 +1,6 @@
1
1
  [project]
2
2
  name = "python-roborock"
3
- version = "4.17.0"
3
+ version = "4.17.2"
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"
@@ -26,7 +26,7 @@ dependencies = [
26
26
  "paho-mqtt>=1.6.1,<3.0.0",
27
27
  "construct>=2.10.57,<3",
28
28
  "vacuum-map-parser-roborock",
29
- "pyrate-limiter>=3.7.0,<4",
29
+ "pyrate-limiter>=4.0.0,<5",
30
30
  "aiomqtt>=2.5.0,<3",
31
31
  "click-shell~=2.1",
32
32
  ]
@@ -16,7 +16,6 @@ class VacuumModes(RoborockModeEnum):
16
16
  TURBO = ("turbo", 103)
17
17
  MAX = ("max", 104)
18
18
  MAX_PLUS = ("max_plus", 108)
19
- CARPET = ("carpet", 107)
20
19
  OFF_RAISE_MAIN_BRUSH = ("off_raise_main_brush", 109)
21
20
  CUSTOMIZED = ("custom", 106)
22
21
  SMART_MODE = ("smart_mode", 110)
@@ -85,8 +84,6 @@ def get_clean_modes(features: DeviceFeatures) -> list[VacuumModes]:
85
84
  if features.is_max_plus_mode_supported or features.is_none_pure_clean_mop_with_max_plus:
86
85
  # If the vacuum has max plus mode supported
87
86
  modes.append(VacuumModes.MAX_PLUS)
88
- if features.is_carpet_deep_clean_supported:
89
- modes.append(VacuumModes.CARPET)
90
87
  if features.is_pure_clean_mop_supported:
91
88
  # If the vacuum is capable of 'pure mop clean' aka no vacuum
92
89
  if features.is_support_main_brush_up_down_supported:
@@ -12,7 +12,7 @@ from dataclasses import dataclass
12
12
 
13
13
  import aiohttp
14
14
  from aiohttp import ContentTypeError, FormData
15
- from pyrate_limiter import BucketFullException, Duration, Limiter, Rate
15
+ from pyrate_limiter import Duration, Limiter, Rate
16
16
 
17
17
  from roborock import HomeDataSchedule
18
18
  from roborock.data import HomeData, HomeDataRoom, HomeDataScene, ProductResponse, RRiot, UserData
@@ -62,7 +62,7 @@ class RoborockApiClient:
62
62
  Rate(40, Duration.DAY),
63
63
  ]
64
64
 
65
- _login_limiter = Limiter(_LOGIN_RATES, max_delay=1000)
65
+ _login_limiter = Limiter(_LOGIN_RATES)
66
66
  _home_data_limiter = Limiter(_HOME_DATA_RATES)
67
67
 
68
68
  def __init__(
@@ -204,11 +204,8 @@ class RoborockApiClient:
204
204
  return add_device_response["result"]
205
205
 
206
206
  async def request_code(self) -> None:
207
- try:
208
- await self._login_limiter.try_acquire_async("login")
209
- except BucketFullException as ex:
210
- _LOGGER.info(ex.meta_info)
211
- raise RoborockRateLimit("Reached maximum requests for login. Please try again later.") from ex
207
+ if not await self._login_limiter.try_acquire_async("login", blocking=True, timeout=1):
208
+ raise RoborockRateLimit("Reached maximum requests for login. Please try again later.")
212
209
  base_url = await self.base_url
213
210
  header_clientid = self._get_header_client_id()
214
211
  code_request = PreparedRequest(base_url, self.session, {"header_clientid": header_clientid})
@@ -238,11 +235,8 @@ class RoborockApiClient:
238
235
  if await self.country_code is None or await self.country is None:
239
236
  _LOGGER.info("No country code or country found, trying old version of request code.")
240
237
  return await self.request_code()
241
- try:
242
- await self._login_limiter.try_acquire_async("login")
243
- except BucketFullException as ex:
244
- _LOGGER.info(ex.meta_info)
245
- raise RoborockRateLimit("Reached maximum requests for login. Please try again later.") from ex
238
+ if not await self._login_limiter.try_acquire_async("login", blocking=True, timeout=1):
239
+ raise RoborockRateLimit("Reached maximum requests for login. Please try again later.")
246
240
  base_url = await self.base_url
247
241
  header_clientid = self._get_header_client_id()
248
242
  code_request = PreparedRequest(
@@ -370,11 +364,8 @@ class RoborockApiClient:
370
364
  return UserData.from_dict(user_data)
371
365
 
372
366
  async def pass_login(self, password: str) -> UserData:
373
- try:
374
- await self._login_limiter.try_acquire_async("login")
375
- except BucketFullException as ex:
376
- _LOGGER.info(ex.meta_info)
377
- raise RoborockRateLimit("Reached maximum requests for login. Please try again later.") from ex
367
+ if not await self._login_limiter.try_acquire_async("login", blocking=True, timeout=1):
368
+ raise RoborockRateLimit("Reached maximum requests for login. Please try again later.")
378
369
  base_url = await self.base_url
379
370
  header_clientid = self._get_header_client_id()
380
371
 
@@ -468,11 +459,8 @@ class RoborockApiClient:
468
459
  return home_id_response["data"]["rrHomeId"]
469
460
 
470
461
  async def get_home_data(self, user_data: UserData) -> HomeData:
471
- try:
472
- self._home_data_limiter.try_acquire("home_data")
473
- except BucketFullException as ex:
474
- _LOGGER.info(ex.meta_info)
475
- raise RoborockRateLimit("Reached maximum requests for home data. Please try again later.") from ex
462
+ if not self._home_data_limiter.try_acquire("home_data", blocking=False):
463
+ raise RoborockRateLimit("Reached maximum requests for home data. Please try again later.")
476
464
  rriot = user_data.rriot
477
465
  if rriot is None:
478
466
  raise RoborockException("rriot is none")
@@ -497,11 +485,8 @@ class RoborockApiClient:
497
485
 
498
486
  async def get_home_data_v2(self, user_data: UserData) -> HomeData:
499
487
  """This is the same as get_home_data, but uses a different endpoint and includes non-robotic vacuums."""
500
- try:
501
- self._home_data_limiter.try_acquire("home_data")
502
- except BucketFullException as ex:
503
- _LOGGER.info(ex.meta_info)
504
- raise RoborockRateLimit("Reached maximum requests for home data. Please try again later.") from ex
488
+ if not self._home_data_limiter.try_acquire("home_data", blocking=False):
489
+ raise RoborockRateLimit("Reached maximum requests for home data. Please try again later.")
505
490
  rriot = user_data.rriot
506
491
  if rriot is None:
507
492
  raise RoborockException("rriot is none")
@@ -526,11 +511,8 @@ class RoborockApiClient:
526
511
 
527
512
  async def get_home_data_v3(self, user_data: UserData) -> HomeData:
528
513
  """This is the same as get_home_data, but uses a different endpoint and includes non-robotic vacuums."""
529
- try:
530
- self._home_data_limiter.try_acquire("home_data")
531
- except BucketFullException as ex:
532
- _LOGGER.info(ex.meta_info)
533
- raise RoborockRateLimit("Reached maximum requests for home data. Please try again later.") from ex
514
+ if not self._home_data_limiter.try_acquire("home_data", blocking=False):
515
+ raise RoborockRateLimit("Reached maximum requests for home data. Please try again later.")
534
516
  rriot = user_data.rriot
535
517
  home_id = await self._get_home_id(user_data)
536
518
  if rriot.r.a is None: