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.
- {python_roborock-4.3.0 → python_roborock-4.5.0}/PKG-INFO +1 -1
- {python_roborock-4.3.0 → python_roborock-4.5.0}/pyproject.toml +1 -1
- {python_roborock-4.3.0 → python_roborock-4.5.0}/roborock/web_api.py +14 -6
- {python_roborock-4.3.0 → python_roborock-4.5.0}/.gitignore +0 -0
- {python_roborock-4.3.0 → python_roborock-4.5.0}/LICENSE +0 -0
- {python_roborock-4.3.0 → python_roborock-4.5.0}/README.md +0 -0
- {python_roborock-4.3.0 → python_roborock-4.5.0}/roborock/__init__.py +0 -0
- {python_roborock-4.3.0 → python_roborock-4.5.0}/roborock/broadcast_protocol.py +0 -0
- {python_roborock-4.3.0 → python_roborock-4.5.0}/roborock/callbacks.py +0 -0
- {python_roborock-4.3.0 → python_roborock-4.5.0}/roborock/cli.py +0 -0
- {python_roborock-4.3.0 → python_roborock-4.5.0}/roborock/const.py +0 -0
- {python_roborock-4.3.0 → python_roborock-4.5.0}/roborock/data/__init__.py +0 -0
- {python_roborock-4.3.0 → python_roborock-4.5.0}/roborock/data/b01_q10/__init__.py +0 -0
- {python_roborock-4.3.0 → python_roborock-4.5.0}/roborock/data/b01_q10/b01_q10_code_mappings.py +0 -0
- {python_roborock-4.3.0 → python_roborock-4.5.0}/roborock/data/b01_q10/b01_q10_containers.py +0 -0
- {python_roborock-4.3.0 → python_roborock-4.5.0}/roborock/data/b01_q7/__init__.py +0 -0
- {python_roborock-4.3.0 → python_roborock-4.5.0}/roborock/data/b01_q7/b01_q7_code_mappings.py +0 -0
- {python_roborock-4.3.0 → python_roborock-4.5.0}/roborock/data/b01_q7/b01_q7_containers.py +0 -0
- {python_roborock-4.3.0 → python_roborock-4.5.0}/roborock/data/code_mappings.py +0 -0
- {python_roborock-4.3.0 → python_roborock-4.5.0}/roborock/data/containers.py +0 -0
- {python_roborock-4.3.0 → python_roborock-4.5.0}/roborock/data/dyad/__init__.py +0 -0
- {python_roborock-4.3.0 → python_roborock-4.5.0}/roborock/data/dyad/dyad_code_mappings.py +0 -0
- {python_roborock-4.3.0 → python_roborock-4.5.0}/roborock/data/dyad/dyad_containers.py +0 -0
- {python_roborock-4.3.0 → python_roborock-4.5.0}/roborock/data/v1/__init__.py +0 -0
- {python_roborock-4.3.0 → python_roborock-4.5.0}/roborock/data/v1/v1_clean_modes.py +0 -0
- {python_roborock-4.3.0 → python_roborock-4.5.0}/roborock/data/v1/v1_code_mappings.py +0 -0
- {python_roborock-4.3.0 → python_roborock-4.5.0}/roborock/data/v1/v1_containers.py +0 -0
- {python_roborock-4.3.0 → python_roborock-4.5.0}/roborock/data/zeo/__init__.py +0 -0
- {python_roborock-4.3.0 → python_roborock-4.5.0}/roborock/data/zeo/zeo_code_mappings.py +0 -0
- {python_roborock-4.3.0 → python_roborock-4.5.0}/roborock/data/zeo/zeo_containers.py +0 -0
- {python_roborock-4.3.0 → python_roborock-4.5.0}/roborock/device_features.py +0 -0
- {python_roborock-4.3.0 → python_roborock-4.5.0}/roborock/devices/README.md +0 -0
- {python_roborock-4.3.0 → python_roborock-4.5.0}/roborock/devices/__init__.py +0 -0
- {python_roborock-4.3.0 → python_roborock-4.5.0}/roborock/devices/cache.py +0 -0
- {python_roborock-4.3.0 → python_roborock-4.5.0}/roborock/devices/device.py +0 -0
- {python_roborock-4.3.0 → python_roborock-4.5.0}/roborock/devices/device_manager.py +0 -0
- {python_roborock-4.3.0 → python_roborock-4.5.0}/roborock/devices/file_cache.py +0 -0
- {python_roborock-4.3.0 → python_roborock-4.5.0}/roborock/devices/rpc/__init__.py +0 -0
- {python_roborock-4.3.0 → python_roborock-4.5.0}/roborock/devices/rpc/a01_channel.py +0 -0
- {python_roborock-4.3.0 → python_roborock-4.5.0}/roborock/devices/rpc/b01_q10_channel.py +0 -0
- {python_roborock-4.3.0 → python_roborock-4.5.0}/roborock/devices/rpc/b01_q7_channel.py +0 -0
- {python_roborock-4.3.0 → python_roborock-4.5.0}/roborock/devices/rpc/v1_channel.py +0 -0
- {python_roborock-4.3.0 → python_roborock-4.5.0}/roborock/devices/traits/__init__.py +0 -0
- {python_roborock-4.3.0 → python_roborock-4.5.0}/roborock/devices/traits/a01/__init__.py +0 -0
- {python_roborock-4.3.0 → python_roborock-4.5.0}/roborock/devices/traits/b01/__init__.py +0 -0
- {python_roborock-4.3.0 → python_roborock-4.5.0}/roborock/devices/traits/b01/q10/__init__.py +0 -0
- {python_roborock-4.3.0 → python_roborock-4.5.0}/roborock/devices/traits/b01/q10/command.py +0 -0
- {python_roborock-4.3.0 → python_roborock-4.5.0}/roborock/devices/traits/b01/q7/__init__.py +0 -0
- {python_roborock-4.3.0 → python_roborock-4.5.0}/roborock/devices/traits/traits_mixin.py +0 -0
- {python_roborock-4.3.0 → python_roborock-4.5.0}/roborock/devices/traits/v1/__init__.py +0 -0
- {python_roborock-4.3.0 → python_roborock-4.5.0}/roborock/devices/traits/v1/child_lock.py +0 -0
- {python_roborock-4.3.0 → python_roborock-4.5.0}/roborock/devices/traits/v1/clean_summary.py +0 -0
- {python_roborock-4.3.0 → python_roborock-4.5.0}/roborock/devices/traits/v1/command.py +0 -0
- {python_roborock-4.3.0 → python_roborock-4.5.0}/roborock/devices/traits/v1/common.py +0 -0
- {python_roborock-4.3.0 → python_roborock-4.5.0}/roborock/devices/traits/v1/consumeable.py +0 -0
- {python_roborock-4.3.0 → python_roborock-4.5.0}/roborock/devices/traits/v1/device_features.py +0 -0
- {python_roborock-4.3.0 → python_roborock-4.5.0}/roborock/devices/traits/v1/do_not_disturb.py +0 -0
- {python_roborock-4.3.0 → python_roborock-4.5.0}/roborock/devices/traits/v1/dust_collection_mode.py +0 -0
- {python_roborock-4.3.0 → python_roborock-4.5.0}/roborock/devices/traits/v1/flow_led_status.py +0 -0
- {python_roborock-4.3.0 → python_roborock-4.5.0}/roborock/devices/traits/v1/home.py +0 -0
- {python_roborock-4.3.0 → python_roborock-4.5.0}/roborock/devices/traits/v1/led_status.py +0 -0
- {python_roborock-4.3.0 → python_roborock-4.5.0}/roborock/devices/traits/v1/map_content.py +0 -0
- {python_roborock-4.3.0 → python_roborock-4.5.0}/roborock/devices/traits/v1/maps.py +0 -0
- {python_roborock-4.3.0 → python_roborock-4.5.0}/roborock/devices/traits/v1/network_info.py +0 -0
- {python_roborock-4.3.0 → python_roborock-4.5.0}/roborock/devices/traits/v1/rooms.py +0 -0
- {python_roborock-4.3.0 → python_roborock-4.5.0}/roborock/devices/traits/v1/routines.py +0 -0
- {python_roborock-4.3.0 → python_roborock-4.5.0}/roborock/devices/traits/v1/smart_wash_params.py +0 -0
- {python_roborock-4.3.0 → python_roborock-4.5.0}/roborock/devices/traits/v1/status.py +0 -0
- {python_roborock-4.3.0 → python_roborock-4.5.0}/roborock/devices/traits/v1/valley_electricity_timer.py +0 -0
- {python_roborock-4.3.0 → python_roborock-4.5.0}/roborock/devices/traits/v1/volume.py +0 -0
- {python_roborock-4.3.0 → python_roborock-4.5.0}/roborock/devices/traits/v1/wash_towel_mode.py +0 -0
- {python_roborock-4.3.0 → python_roborock-4.5.0}/roborock/devices/transport/__init__.py +0 -0
- {python_roborock-4.3.0 → python_roborock-4.5.0}/roborock/devices/transport/channel.py +0 -0
- {python_roborock-4.3.0 → python_roborock-4.5.0}/roborock/devices/transport/local_channel.py +0 -0
- {python_roborock-4.3.0 → python_roborock-4.5.0}/roborock/devices/transport/mqtt_channel.py +0 -0
- {python_roborock-4.3.0 → python_roborock-4.5.0}/roborock/diagnostics.py +0 -0
- {python_roborock-4.3.0 → python_roborock-4.5.0}/roborock/exceptions.py +0 -0
- {python_roborock-4.3.0 → python_roborock-4.5.0}/roborock/map/__init__.py +0 -0
- {python_roborock-4.3.0 → python_roborock-4.5.0}/roborock/map/map_parser.py +0 -0
- {python_roborock-4.3.0 → python_roborock-4.5.0}/roborock/mqtt/__init__.py +0 -0
- {python_roborock-4.3.0 → python_roborock-4.5.0}/roborock/mqtt/health_manager.py +0 -0
- {python_roborock-4.3.0 → python_roborock-4.5.0}/roborock/mqtt/roborock_session.py +0 -0
- {python_roborock-4.3.0 → python_roborock-4.5.0}/roborock/mqtt/session.py +0 -0
- {python_roborock-4.3.0 → python_roborock-4.5.0}/roborock/protocol.py +0 -0
- {python_roborock-4.3.0 → python_roborock-4.5.0}/roborock/protocols/__init__.py +0 -0
- {python_roborock-4.3.0 → python_roborock-4.5.0}/roborock/protocols/a01_protocol.py +0 -0
- {python_roborock-4.3.0 → python_roborock-4.5.0}/roborock/protocols/b01_q10_protocol.py +0 -0
- {python_roborock-4.3.0 → python_roborock-4.5.0}/roborock/protocols/b01_q7_protocol.py +0 -0
- {python_roborock-4.3.0 → python_roborock-4.5.0}/roborock/protocols/v1_protocol.py +0 -0
- {python_roborock-4.3.0 → python_roborock-4.5.0}/roborock/py.typed +0 -0
- {python_roborock-4.3.0 → python_roborock-4.5.0}/roborock/roborock_message.py +0 -0
- {python_roborock-4.3.0 → python_roborock-4.5.0}/roborock/roborock_typing.py +0 -0
- {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
|
+
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
|
+
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
|
-
|
|
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.
|
|
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.
|
|
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.
|
|
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
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{python_roborock-4.3.0 → python_roborock-4.5.0}/roborock/data/b01_q10/b01_q10_code_mappings.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
{python_roborock-4.3.0 → python_roborock-4.5.0}/roborock/data/b01_q7/b01_q7_code_mappings.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{python_roborock-4.3.0 → python_roborock-4.5.0}/roborock/devices/traits/v1/device_features.py
RENAMED
|
File without changes
|
{python_roborock-4.3.0 → python_roborock-4.5.0}/roborock/devices/traits/v1/do_not_disturb.py
RENAMED
|
File without changes
|
{python_roborock-4.3.0 → python_roborock-4.5.0}/roborock/devices/traits/v1/dust_collection_mode.py
RENAMED
|
File without changes
|
{python_roborock-4.3.0 → python_roborock-4.5.0}/roborock/devices/traits/v1/flow_led_status.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{python_roborock-4.3.0 → python_roborock-4.5.0}/roborock/devices/traits/v1/smart_wash_params.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{python_roborock-4.3.0 → python_roborock-4.5.0}/roborock/devices/traits/v1/wash_towel_mode.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|