python-roborock 4.3.0__tar.gz → 4.5.0__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 (93) hide show
  1. {python_roborock-4.3.0 → python_roborock-4.5.0}/PKG-INFO +1 -1
  2. {python_roborock-4.3.0 → python_roborock-4.5.0}/pyproject.toml +1 -1
  3. {python_roborock-4.3.0 → python_roborock-4.5.0}/roborock/web_api.py +14 -6
  4. {python_roborock-4.3.0 → python_roborock-4.5.0}/.gitignore +0 -0
  5. {python_roborock-4.3.0 → python_roborock-4.5.0}/LICENSE +0 -0
  6. {python_roborock-4.3.0 → python_roborock-4.5.0}/README.md +0 -0
  7. {python_roborock-4.3.0 → python_roborock-4.5.0}/roborock/__init__.py +0 -0
  8. {python_roborock-4.3.0 → python_roborock-4.5.0}/roborock/broadcast_protocol.py +0 -0
  9. {python_roborock-4.3.0 → python_roborock-4.5.0}/roborock/callbacks.py +0 -0
  10. {python_roborock-4.3.0 → python_roborock-4.5.0}/roborock/cli.py +0 -0
  11. {python_roborock-4.3.0 → python_roborock-4.5.0}/roborock/const.py +0 -0
  12. {python_roborock-4.3.0 → python_roborock-4.5.0}/roborock/data/__init__.py +0 -0
  13. {python_roborock-4.3.0 → python_roborock-4.5.0}/roborock/data/b01_q10/__init__.py +0 -0
  14. {python_roborock-4.3.0 → python_roborock-4.5.0}/roborock/data/b01_q10/b01_q10_code_mappings.py +0 -0
  15. {python_roborock-4.3.0 → python_roborock-4.5.0}/roborock/data/b01_q10/b01_q10_containers.py +0 -0
  16. {python_roborock-4.3.0 → python_roborock-4.5.0}/roborock/data/b01_q7/__init__.py +0 -0
  17. {python_roborock-4.3.0 → python_roborock-4.5.0}/roborock/data/b01_q7/b01_q7_code_mappings.py +0 -0
  18. {python_roborock-4.3.0 → python_roborock-4.5.0}/roborock/data/b01_q7/b01_q7_containers.py +0 -0
  19. {python_roborock-4.3.0 → python_roborock-4.5.0}/roborock/data/code_mappings.py +0 -0
  20. {python_roborock-4.3.0 → python_roborock-4.5.0}/roborock/data/containers.py +0 -0
  21. {python_roborock-4.3.0 → python_roborock-4.5.0}/roborock/data/dyad/__init__.py +0 -0
  22. {python_roborock-4.3.0 → python_roborock-4.5.0}/roborock/data/dyad/dyad_code_mappings.py +0 -0
  23. {python_roborock-4.3.0 → python_roborock-4.5.0}/roborock/data/dyad/dyad_containers.py +0 -0
  24. {python_roborock-4.3.0 → python_roborock-4.5.0}/roborock/data/v1/__init__.py +0 -0
  25. {python_roborock-4.3.0 → python_roborock-4.5.0}/roborock/data/v1/v1_clean_modes.py +0 -0
  26. {python_roborock-4.3.0 → python_roborock-4.5.0}/roborock/data/v1/v1_code_mappings.py +0 -0
  27. {python_roborock-4.3.0 → python_roborock-4.5.0}/roborock/data/v1/v1_containers.py +0 -0
  28. {python_roborock-4.3.0 → python_roborock-4.5.0}/roborock/data/zeo/__init__.py +0 -0
  29. {python_roborock-4.3.0 → python_roborock-4.5.0}/roborock/data/zeo/zeo_code_mappings.py +0 -0
  30. {python_roborock-4.3.0 → python_roborock-4.5.0}/roborock/data/zeo/zeo_containers.py +0 -0
  31. {python_roborock-4.3.0 → python_roborock-4.5.0}/roborock/device_features.py +0 -0
  32. {python_roborock-4.3.0 → python_roborock-4.5.0}/roborock/devices/README.md +0 -0
  33. {python_roborock-4.3.0 → python_roborock-4.5.0}/roborock/devices/__init__.py +0 -0
  34. {python_roborock-4.3.0 → python_roborock-4.5.0}/roborock/devices/cache.py +0 -0
  35. {python_roborock-4.3.0 → python_roborock-4.5.0}/roborock/devices/device.py +0 -0
  36. {python_roborock-4.3.0 → python_roborock-4.5.0}/roborock/devices/device_manager.py +0 -0
  37. {python_roborock-4.3.0 → python_roborock-4.5.0}/roborock/devices/file_cache.py +0 -0
  38. {python_roborock-4.3.0 → python_roborock-4.5.0}/roborock/devices/rpc/__init__.py +0 -0
  39. {python_roborock-4.3.0 → python_roborock-4.5.0}/roborock/devices/rpc/a01_channel.py +0 -0
  40. {python_roborock-4.3.0 → python_roborock-4.5.0}/roborock/devices/rpc/b01_q10_channel.py +0 -0
  41. {python_roborock-4.3.0 → python_roborock-4.5.0}/roborock/devices/rpc/b01_q7_channel.py +0 -0
  42. {python_roborock-4.3.0 → python_roborock-4.5.0}/roborock/devices/rpc/v1_channel.py +0 -0
  43. {python_roborock-4.3.0 → python_roborock-4.5.0}/roborock/devices/traits/__init__.py +0 -0
  44. {python_roborock-4.3.0 → python_roborock-4.5.0}/roborock/devices/traits/a01/__init__.py +0 -0
  45. {python_roborock-4.3.0 → python_roborock-4.5.0}/roborock/devices/traits/b01/__init__.py +0 -0
  46. {python_roborock-4.3.0 → python_roborock-4.5.0}/roborock/devices/traits/b01/q10/__init__.py +0 -0
  47. {python_roborock-4.3.0 → python_roborock-4.5.0}/roborock/devices/traits/b01/q10/command.py +0 -0
  48. {python_roborock-4.3.0 → python_roborock-4.5.0}/roborock/devices/traits/b01/q7/__init__.py +0 -0
  49. {python_roborock-4.3.0 → python_roborock-4.5.0}/roborock/devices/traits/traits_mixin.py +0 -0
  50. {python_roborock-4.3.0 → python_roborock-4.5.0}/roborock/devices/traits/v1/__init__.py +0 -0
  51. {python_roborock-4.3.0 → python_roborock-4.5.0}/roborock/devices/traits/v1/child_lock.py +0 -0
  52. {python_roborock-4.3.0 → python_roborock-4.5.0}/roborock/devices/traits/v1/clean_summary.py +0 -0
  53. {python_roborock-4.3.0 → python_roborock-4.5.0}/roborock/devices/traits/v1/command.py +0 -0
  54. {python_roborock-4.3.0 → python_roborock-4.5.0}/roborock/devices/traits/v1/common.py +0 -0
  55. {python_roborock-4.3.0 → python_roborock-4.5.0}/roborock/devices/traits/v1/consumeable.py +0 -0
  56. {python_roborock-4.3.0 → python_roborock-4.5.0}/roborock/devices/traits/v1/device_features.py +0 -0
  57. {python_roborock-4.3.0 → python_roborock-4.5.0}/roborock/devices/traits/v1/do_not_disturb.py +0 -0
  58. {python_roborock-4.3.0 → python_roborock-4.5.0}/roborock/devices/traits/v1/dust_collection_mode.py +0 -0
  59. {python_roborock-4.3.0 → python_roborock-4.5.0}/roborock/devices/traits/v1/flow_led_status.py +0 -0
  60. {python_roborock-4.3.0 → python_roborock-4.5.0}/roborock/devices/traits/v1/home.py +0 -0
  61. {python_roborock-4.3.0 → python_roborock-4.5.0}/roborock/devices/traits/v1/led_status.py +0 -0
  62. {python_roborock-4.3.0 → python_roborock-4.5.0}/roborock/devices/traits/v1/map_content.py +0 -0
  63. {python_roborock-4.3.0 → python_roborock-4.5.0}/roborock/devices/traits/v1/maps.py +0 -0
  64. {python_roborock-4.3.0 → python_roborock-4.5.0}/roborock/devices/traits/v1/network_info.py +0 -0
  65. {python_roborock-4.3.0 → python_roborock-4.5.0}/roborock/devices/traits/v1/rooms.py +0 -0
  66. {python_roborock-4.3.0 → python_roborock-4.5.0}/roborock/devices/traits/v1/routines.py +0 -0
  67. {python_roborock-4.3.0 → python_roborock-4.5.0}/roborock/devices/traits/v1/smart_wash_params.py +0 -0
  68. {python_roborock-4.3.0 → python_roborock-4.5.0}/roborock/devices/traits/v1/status.py +0 -0
  69. {python_roborock-4.3.0 → python_roborock-4.5.0}/roborock/devices/traits/v1/valley_electricity_timer.py +0 -0
  70. {python_roborock-4.3.0 → python_roborock-4.5.0}/roborock/devices/traits/v1/volume.py +0 -0
  71. {python_roborock-4.3.0 → python_roborock-4.5.0}/roborock/devices/traits/v1/wash_towel_mode.py +0 -0
  72. {python_roborock-4.3.0 → python_roborock-4.5.0}/roborock/devices/transport/__init__.py +0 -0
  73. {python_roborock-4.3.0 → python_roborock-4.5.0}/roborock/devices/transport/channel.py +0 -0
  74. {python_roborock-4.3.0 → python_roborock-4.5.0}/roborock/devices/transport/local_channel.py +0 -0
  75. {python_roborock-4.3.0 → python_roborock-4.5.0}/roborock/devices/transport/mqtt_channel.py +0 -0
  76. {python_roborock-4.3.0 → python_roborock-4.5.0}/roborock/diagnostics.py +0 -0
  77. {python_roborock-4.3.0 → python_roborock-4.5.0}/roborock/exceptions.py +0 -0
  78. {python_roborock-4.3.0 → python_roborock-4.5.0}/roborock/map/__init__.py +0 -0
  79. {python_roborock-4.3.0 → python_roborock-4.5.0}/roborock/map/map_parser.py +0 -0
  80. {python_roborock-4.3.0 → python_roborock-4.5.0}/roborock/mqtt/__init__.py +0 -0
  81. {python_roborock-4.3.0 → python_roborock-4.5.0}/roborock/mqtt/health_manager.py +0 -0
  82. {python_roborock-4.3.0 → python_roborock-4.5.0}/roborock/mqtt/roborock_session.py +0 -0
  83. {python_roborock-4.3.0 → python_roborock-4.5.0}/roborock/mqtt/session.py +0 -0
  84. {python_roborock-4.3.0 → python_roborock-4.5.0}/roborock/protocol.py +0 -0
  85. {python_roborock-4.3.0 → python_roborock-4.5.0}/roborock/protocols/__init__.py +0 -0
  86. {python_roborock-4.3.0 → python_roborock-4.5.0}/roborock/protocols/a01_protocol.py +0 -0
  87. {python_roborock-4.3.0 → python_roborock-4.5.0}/roborock/protocols/b01_q10_protocol.py +0 -0
  88. {python_roborock-4.3.0 → python_roborock-4.5.0}/roborock/protocols/b01_q7_protocol.py +0 -0
  89. {python_roborock-4.3.0 → python_roborock-4.5.0}/roborock/protocols/v1_protocol.py +0 -0
  90. {python_roborock-4.3.0 → python_roborock-4.5.0}/roborock/py.typed +0 -0
  91. {python_roborock-4.3.0 → python_roborock-4.5.0}/roborock/roborock_message.py +0 -0
  92. {python_roborock-4.3.0 → python_roborock-4.5.0}/roborock/roborock_typing.py +0 -0
  93. {python_roborock-4.3.0 → python_roborock-4.5.0}/roborock/util.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: python-roborock
3
- Version: 4.3.0
3
+ Version: 4.5.0
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/
@@ -1,6 +1,6 @@
1
1
  [project]
2
2
  name = "python-roborock"
3
- version = "4.3.0"
3
+ version = "4.5.0"
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"
@@ -62,7 +62,7 @@ class RoborockApiClient:
62
62
  Rate(40, Duration.DAY),
63
63
  ]
64
64
 
65
- _login_limiter = Limiter(_LOGIN_RATES)
65
+ _login_limiter = Limiter(_LOGIN_RATES, max_delay=1000)
66
66
  _home_data_limiter = Limiter(_HOME_DATA_RATES)
67
67
 
68
68
  def __init__(
@@ -74,11 +74,11 @@ class RoborockApiClient:
74
74
  self._device_identifier = secrets.token_urlsafe(16)
75
75
  self.session = session
76
76
  self._iot_login_info: IotLoginInfo | None = None
77
+ self._base_urls = BASE_URLS if base_url is None else [base_url]
77
78
 
78
79
  async def _get_iot_login_info(self) -> IotLoginInfo:
79
80
  if self._iot_login_info is None:
80
- valid_urls = BASE_URLS if self._base_url is None else [self._base_url]
81
- for iot_url in valid_urls:
81
+ for iot_url in self._base_urls:
82
82
  url_request = PreparedRequest(iot_url, self.session)
83
83
  response = await url_request.request(
84
84
  "post",
@@ -205,7 +205,7 @@ class RoborockApiClient:
205
205
 
206
206
  async def request_code(self) -> None:
207
207
  try:
208
- self._login_limiter.try_acquire("login")
208
+ await self._login_limiter.try_acquire_async("login")
209
209
  except BucketFullException as ex:
210
210
  _LOGGER.info(ex.meta_info)
211
211
  raise RoborockRateLimit("Reached maximum requests for login. Please try again later.") from ex
@@ -239,7 +239,7 @@ class RoborockApiClient:
239
239
  _LOGGER.info("No country code or country found, trying old version of request code.")
240
240
  return await self.request_code()
241
241
  try:
242
- self._login_limiter.try_acquire("login")
242
+ await self._login_limiter.try_acquire_async("login")
243
243
  except BucketFullException as ex:
244
244
  _LOGGER.info(ex.meta_info)
245
245
  raise RoborockRateLimit("Reached maximum requests for login. Please try again later.") from ex
@@ -269,6 +269,10 @@ class RoborockApiClient:
269
269
  raise RoborockAccountDoesNotExist("Account does not exist - check your login and try again.")
270
270
  elif response_code == 9002:
271
271
  raise RoborockTooFrequentCodeRequests("You have attempted to request too many codes. Try again later")
272
+ elif response_code == 3030 and len(self._base_urls) > 1:
273
+ self._base_urls = self._base_urls[1:]
274
+ self._iot_login_info = None
275
+ return await self.request_code_v4()
272
276
  else:
273
277
  raise RoborockException(f"{code_response.get('msg')} - response code: {code_response.get('code')}")
274
278
 
@@ -355,6 +359,10 @@ class RoborockApiClient:
355
359
  raise RoborockInvalidUserAgreement(
356
360
  "User agreement must be accepted again - or you are attempting to use the Mi Home app account."
357
361
  )
362
+ if response_code == 3039:
363
+ raise RoborockAccountDoesNotExist(
364
+ "This account does not exist - please ensure that you selected the right region and email."
365
+ )
358
366
  raise RoborockException(f"{login_response.get('msg')} - response code: {response_code}")
359
367
  user_data = login_response.get("data")
360
368
  if not isinstance(user_data, dict):
@@ -363,7 +371,7 @@ class RoborockApiClient:
363
371
 
364
372
  async def pass_login(self, password: str) -> UserData:
365
373
  try:
366
- self._login_limiter.try_acquire("login")
374
+ await self._login_limiter.try_acquire_async("login")
367
375
  except BucketFullException as ex:
368
376
  _LOGGER.info(ex.meta_info)
369
377
  raise RoborockRateLimit("Reached maximum requests for login. Please try again later.") from ex
File without changes