python-roborock 5.31.1__tar.gz → 5.32.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-5.31.1 → python_roborock-5.32.0}/PKG-INFO +1 -1
- {python_roborock-5.31.1 → python_roborock-5.32.0}/pyproject.toml +3 -1
- {python_roborock-5.31.1 → python_roborock-5.32.0}/roborock/map/b01_grid_layers.py +56 -0
- python_roborock-5.32.0/roborock/map/b01_q10_map_parser.py +683 -0
- python_roborock-5.32.0/roborock/map/b01_q10_overlays.py +162 -0
- python_roborock-5.31.1/roborock/map/b01_q10_map_parser.py +0 -399
- python_roborock-5.31.1/roborock/map/b01_q10_overlays.py +0 -99
- {python_roborock-5.31.1 → python_roborock-5.32.0}/.gitignore +0 -0
- {python_roborock-5.31.1 → python_roborock-5.32.0}/LICENSE +0 -0
- {python_roborock-5.31.1 → python_roborock-5.32.0}/README.md +0 -0
- {python_roborock-5.31.1 → python_roborock-5.32.0}/roborock/__init__.py +0 -0
- {python_roborock-5.31.1 → python_roborock-5.32.0}/roborock/broadcast_protocol.py +0 -0
- {python_roborock-5.31.1 → python_roborock-5.32.0}/roborock/callbacks.py +0 -0
- {python_roborock-5.31.1 → python_roborock-5.32.0}/roborock/cli.py +0 -0
- {python_roborock-5.31.1 → python_roborock-5.32.0}/roborock/const.py +0 -0
- {python_roborock-5.31.1 → python_roborock-5.32.0}/roborock/data/__init__.py +0 -0
- {python_roborock-5.31.1 → python_roborock-5.32.0}/roborock/data/b01_q10/__init__.py +0 -0
- {python_roborock-5.31.1 → python_roborock-5.32.0}/roborock/data/b01_q10/b01_q10_code_mappings.py +0 -0
- {python_roborock-5.31.1 → python_roborock-5.32.0}/roborock/data/b01_q10/b01_q10_containers.py +0 -0
- {python_roborock-5.31.1 → python_roborock-5.32.0}/roborock/data/b01_q7/__init__.py +0 -0
- {python_roborock-5.31.1 → python_roborock-5.32.0}/roborock/data/b01_q7/b01_q7_code_mappings.py +0 -0
- {python_roborock-5.31.1 → python_roborock-5.32.0}/roborock/data/b01_q7/b01_q7_containers.py +0 -0
- {python_roborock-5.31.1 → python_roborock-5.32.0}/roborock/data/code_mappings.py +0 -0
- {python_roborock-5.31.1 → python_roborock-5.32.0}/roborock/data/containers.py +0 -0
- {python_roborock-5.31.1 → python_roborock-5.32.0}/roborock/data/dyad/__init__.py +0 -0
- {python_roborock-5.31.1 → python_roborock-5.32.0}/roborock/data/dyad/dyad_code_mappings.py +0 -0
- {python_roborock-5.31.1 → python_roborock-5.32.0}/roborock/data/dyad/dyad_containers.py +0 -0
- {python_roborock-5.31.1 → python_roborock-5.32.0}/roborock/data/mower/__init__.py +0 -0
- {python_roborock-5.31.1 → python_roborock-5.32.0}/roborock/data/mower/mower_containers.py +0 -0
- {python_roborock-5.31.1 → python_roborock-5.32.0}/roborock/data/v1/__init__.py +0 -0
- {python_roborock-5.31.1 → python_roborock-5.32.0}/roborock/data/v1/v1_clean_modes.py +0 -0
- {python_roborock-5.31.1 → python_roborock-5.32.0}/roborock/data/v1/v1_code_mappings.py +0 -0
- {python_roborock-5.31.1 → python_roborock-5.32.0}/roborock/data/v1/v1_containers.py +0 -0
- {python_roborock-5.31.1 → python_roborock-5.32.0}/roborock/data/zeo/__init__.py +0 -0
- {python_roborock-5.31.1 → python_roborock-5.32.0}/roborock/data/zeo/zeo_code_mappings.py +0 -0
- {python_roborock-5.31.1 → python_roborock-5.32.0}/roborock/data/zeo/zeo_containers.py +0 -0
- {python_roborock-5.31.1 → python_roborock-5.32.0}/roborock/device_features.py +0 -0
- {python_roborock-5.31.1 → python_roborock-5.32.0}/roborock/devices/README.md +0 -0
- {python_roborock-5.31.1 → python_roborock-5.32.0}/roborock/devices/__init__.py +0 -0
- {python_roborock-5.31.1 → python_roborock-5.32.0}/roborock/devices/cache.py +0 -0
- {python_roborock-5.31.1 → python_roborock-5.32.0}/roborock/devices/device.py +0 -0
- {python_roborock-5.31.1 → python_roborock-5.32.0}/roborock/devices/device_manager.py +0 -0
- {python_roborock-5.31.1 → python_roborock-5.32.0}/roborock/devices/file_cache.py +0 -0
- {python_roborock-5.31.1 → python_roborock-5.32.0}/roborock/devices/rpc/__init__.py +0 -0
- {python_roborock-5.31.1 → python_roborock-5.32.0}/roborock/devices/rpc/a01_channel.py +0 -0
- {python_roborock-5.31.1 → python_roborock-5.32.0}/roborock/devices/rpc/b01_q10_channel.py +0 -0
- {python_roborock-5.31.1 → python_roborock-5.32.0}/roborock/devices/rpc/b01_q7_channel.py +0 -0
- {python_roborock-5.31.1 → python_roborock-5.32.0}/roborock/devices/rpc/v1_channel.py +0 -0
- {python_roborock-5.31.1 → python_roborock-5.32.0}/roborock/devices/traits/__init__.py +0 -0
- {python_roborock-5.31.1 → python_roborock-5.32.0}/roborock/devices/traits/a01/__init__.py +0 -0
- {python_roborock-5.31.1 → python_roborock-5.32.0}/roborock/devices/traits/b01/__init__.py +0 -0
- {python_roborock-5.31.1 → python_roborock-5.32.0}/roborock/devices/traits/b01/q10/__init__.py +0 -0
- {python_roborock-5.31.1 → python_roborock-5.32.0}/roborock/devices/traits/b01/q10/button_light.py +0 -0
- {python_roborock-5.31.1 → python_roborock-5.32.0}/roborock/devices/traits/b01/q10/child_lock.py +0 -0
- {python_roborock-5.31.1 → python_roborock-5.32.0}/roborock/devices/traits/b01/q10/clean_history.py +0 -0
- {python_roborock-5.31.1 → python_roborock-5.32.0}/roborock/devices/traits/b01/q10/command.py +0 -0
- {python_roborock-5.31.1 → python_roborock-5.32.0}/roborock/devices/traits/b01/q10/common.py +0 -0
- {python_roborock-5.31.1 → python_roborock-5.32.0}/roborock/devices/traits/b01/q10/consumable.py +0 -0
- {python_roborock-5.31.1 → python_roborock-5.32.0}/roborock/devices/traits/b01/q10/do_not_disturb.py +0 -0
- {python_roborock-5.31.1 → python_roborock-5.32.0}/roborock/devices/traits/b01/q10/dust_collection.py +0 -0
- {python_roborock-5.31.1 → python_roborock-5.32.0}/roborock/devices/traits/b01/q10/map.py +0 -0
- {python_roborock-5.31.1 → python_roborock-5.32.0}/roborock/devices/traits/b01/q10/network_info.py +0 -0
- {python_roborock-5.31.1 → python_roborock-5.32.0}/roborock/devices/traits/b01/q10/remote.py +0 -0
- {python_roborock-5.31.1 → python_roborock-5.32.0}/roborock/devices/traits/b01/q10/status.py +0 -0
- {python_roborock-5.31.1 → python_roborock-5.32.0}/roborock/devices/traits/b01/q10/vacuum.py +0 -0
- {python_roborock-5.31.1 → python_roborock-5.32.0}/roborock/devices/traits/b01/q10/volume.py +0 -0
- {python_roborock-5.31.1 → python_roborock-5.32.0}/roborock/devices/traits/b01/q7/__init__.py +0 -0
- {python_roborock-5.31.1 → python_roborock-5.32.0}/roborock/devices/traits/b01/q7/clean_summary.py +0 -0
- {python_roborock-5.31.1 → python_roborock-5.32.0}/roborock/devices/traits/b01/q7/map.py +0 -0
- {python_roborock-5.31.1 → python_roborock-5.32.0}/roborock/devices/traits/b01/q7/map_content.py +0 -0
- {python_roborock-5.31.1 → python_roborock-5.32.0}/roborock/devices/traits/common.py +0 -0
- {python_roborock-5.31.1 → python_roborock-5.32.0}/roborock/devices/traits/traits_mixin.py +0 -0
- {python_roborock-5.31.1 → python_roborock-5.32.0}/roborock/devices/traits/v1/__init__.py +0 -0
- {python_roborock-5.31.1 → python_roborock-5.32.0}/roborock/devices/traits/v1/child_lock.py +0 -0
- {python_roborock-5.31.1 → python_roborock-5.32.0}/roborock/devices/traits/v1/clean_summary.py +0 -0
- {python_roborock-5.31.1 → python_roborock-5.32.0}/roborock/devices/traits/v1/command.py +0 -0
- {python_roborock-5.31.1 → python_roborock-5.32.0}/roborock/devices/traits/v1/common.py +0 -0
- {python_roborock-5.31.1 → python_roborock-5.32.0}/roborock/devices/traits/v1/consumeable.py +0 -0
- {python_roborock-5.31.1 → python_roborock-5.32.0}/roborock/devices/traits/v1/device_features.py +0 -0
- {python_roborock-5.31.1 → python_roborock-5.32.0}/roborock/devices/traits/v1/do_not_disturb.py +0 -0
- {python_roborock-5.31.1 → python_roborock-5.32.0}/roborock/devices/traits/v1/dust_collection_mode.py +0 -0
- {python_roborock-5.31.1 → python_roborock-5.32.0}/roborock/devices/traits/v1/flow_led_status.py +0 -0
- {python_roborock-5.31.1 → python_roborock-5.32.0}/roborock/devices/traits/v1/home.py +0 -0
- {python_roborock-5.31.1 → python_roborock-5.32.0}/roborock/devices/traits/v1/led_status.py +0 -0
- {python_roborock-5.31.1 → python_roborock-5.32.0}/roborock/devices/traits/v1/map_content.py +0 -0
- {python_roborock-5.31.1 → python_roborock-5.32.0}/roborock/devices/traits/v1/maps.py +0 -0
- {python_roborock-5.31.1 → python_roborock-5.32.0}/roborock/devices/traits/v1/network_info.py +0 -0
- {python_roborock-5.31.1 → python_roborock-5.32.0}/roborock/devices/traits/v1/rooms.py +0 -0
- {python_roborock-5.31.1 → python_roborock-5.32.0}/roborock/devices/traits/v1/routines.py +0 -0
- {python_roborock-5.31.1 → python_roborock-5.32.0}/roborock/devices/traits/v1/smart_wash_params.py +0 -0
- {python_roborock-5.31.1 → python_roborock-5.32.0}/roborock/devices/traits/v1/status.py +0 -0
- {python_roborock-5.31.1 → python_roborock-5.32.0}/roborock/devices/traits/v1/valley_electricity_timer.py +0 -0
- {python_roborock-5.31.1 → python_roborock-5.32.0}/roborock/devices/traits/v1/volume.py +0 -0
- {python_roborock-5.31.1 → python_roborock-5.32.0}/roborock/devices/traits/v1/wash_towel_mode.py +0 -0
- {python_roborock-5.31.1 → python_roborock-5.32.0}/roborock/devices/transport/__init__.py +0 -0
- {python_roborock-5.31.1 → python_roborock-5.32.0}/roborock/devices/transport/channel.py +0 -0
- {python_roborock-5.31.1 → python_roborock-5.32.0}/roborock/devices/transport/local_channel.py +0 -0
- {python_roborock-5.31.1 → python_roborock-5.32.0}/roborock/devices/transport/mqtt_channel.py +0 -0
- {python_roborock-5.31.1 → python_roborock-5.32.0}/roborock/diagnostics.py +0 -0
- {python_roborock-5.31.1 → python_roborock-5.32.0}/roborock/exceptions.py +0 -0
- {python_roborock-5.31.1 → python_roborock-5.32.0}/roborock/map/__init__.py +0 -0
- {python_roborock-5.31.1 → python_roborock-5.32.0}/roborock/map/b01_map_parser.py +0 -0
- {python_roborock-5.31.1 → python_roborock-5.32.0}/roborock/map/map_parser.py +0 -0
- {python_roborock-5.31.1 → python_roborock-5.32.0}/roborock/map/proto/__init__.py +0 -0
- {python_roborock-5.31.1 → python_roborock-5.32.0}/roborock/map/proto/b01_scmap.proto +0 -0
- {python_roborock-5.31.1 → python_roborock-5.32.0}/roborock/map/proto/b01_scmap_pb2.py +0 -0
- {python_roborock-5.31.1 → python_roborock-5.32.0}/roborock/mqtt/__init__.py +0 -0
- {python_roborock-5.31.1 → python_roborock-5.32.0}/roborock/mqtt/health_manager.py +0 -0
- {python_roborock-5.31.1 → python_roborock-5.32.0}/roborock/mqtt/roborock_session.py +0 -0
- {python_roborock-5.31.1 → python_roborock-5.32.0}/roborock/mqtt/session.py +0 -0
- {python_roborock-5.31.1 → python_roborock-5.32.0}/roborock/protocol.py +0 -0
- {python_roborock-5.31.1 → python_roborock-5.32.0}/roborock/protocols/__init__.py +0 -0
- {python_roborock-5.31.1 → python_roborock-5.32.0}/roborock/protocols/a01_protocol.py +0 -0
- {python_roborock-5.31.1 → python_roborock-5.32.0}/roborock/protocols/b01_q10_protocol.py +0 -0
- {python_roborock-5.31.1 → python_roborock-5.32.0}/roborock/protocols/b01_q7_protocol.py +0 -0
- {python_roborock-5.31.1 → python_roborock-5.32.0}/roborock/protocols/v1_protocol.py +0 -0
- {python_roborock-5.31.1 → python_roborock-5.32.0}/roborock/py.typed +0 -0
- {python_roborock-5.31.1 → python_roborock-5.32.0}/roborock/roborock_message.py +0 -0
- {python_roborock-5.31.1 → python_roborock-5.32.0}/roborock/roborock_typing.py +0 -0
- {python_roborock-5.31.1 → python_roborock-5.32.0}/roborock/testing/__init__.py +0 -0
- {python_roborock-5.31.1 → python_roborock-5.32.0}/roborock/testing/b01_q10_simulator.py +0 -0
- {python_roborock-5.31.1 → python_roborock-5.32.0}/roborock/testing/channel.py +0 -0
- {python_roborock-5.31.1 → python_roborock-5.32.0}/roborock/testing/cloud.py +0 -0
- {python_roborock-5.31.1 → python_roborock-5.32.0}/roborock/testing/simulator.py +0 -0
- {python_roborock-5.31.1 → python_roborock-5.32.0}/roborock/testing/v1_simulator.py +0 -0
- {python_roborock-5.31.1 → python_roborock-5.32.0}/roborock/util.py +0 -0
- {python_roborock-5.31.1 → python_roborock-5.32.0}/roborock/web_api.py +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: python-roborock
|
|
3
|
-
Version: 5.
|
|
3
|
+
Version: 5.32.0
|
|
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.
|
|
3
|
+
version = "5.32.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"
|
|
@@ -52,6 +52,8 @@ dev = [
|
|
|
52
52
|
# Pull in the CLI dependencies so maintainers can run the `roborock`
|
|
53
53
|
# command and pdoc can import roborock.cli for docs generation.
|
|
54
54
|
"python-roborock[cli]",
|
|
55
|
+
# aioresponses is not compatible with aiohttp 3.14 yet. https://github.com/pnuckowski/aioresponses/issues/289
|
|
56
|
+
"aiohttp>=3.8.2,<3.14",
|
|
55
57
|
"pytest-asyncio>=1.1.0",
|
|
56
58
|
"pytest",
|
|
57
59
|
"pre-commit>=3.5,<5.0",
|
|
@@ -200,6 +200,62 @@ def solve_calibration(
|
|
|
200
200
|
return best[1]
|
|
201
201
|
|
|
202
202
|
|
|
203
|
+
def solve_calibration_with_origin(
|
|
204
|
+
layers: GridLayers,
|
|
205
|
+
points: list[tuple[float, float]],
|
|
206
|
+
origin: tuple[float, float],
|
|
207
|
+
*,
|
|
208
|
+
resolutions: Iterable[float],
|
|
209
|
+
y_signs: Iterable[int] = (1, -1),
|
|
210
|
+
min_on_floor: float = 0.5,
|
|
211
|
+
) -> GridCalibration | None:
|
|
212
|
+
"""Fit resolution + Y orientation around a *known* grid-pixel origin.
|
|
213
|
+
|
|
214
|
+
Unlike :func:`solve_calibration`, the pixel origin ``(ox, oy)`` is fixed --
|
|
215
|
+
e.g. read straight from the Q10 grid-frame header -- so this only sweeps the
|
|
216
|
+
candidate ``resolutions`` and ``y_signs`` and keeps the placement landing the
|
|
217
|
+
most ``points`` on floor. With the expensive 2-D offset slide gone, far fewer
|
|
218
|
+
points are needed to confirm the fit, so it works from a short path rather
|
|
219
|
+
than a dense clean. Returns ``None`` if no candidate lands a ``min_on_floor``
|
|
220
|
+
fraction of points on floor (e.g. the origin or points are bogus).
|
|
221
|
+
"""
|
|
222
|
+
if not points:
|
|
223
|
+
return None
|
|
224
|
+
w, h = layers.width, layers.height
|
|
225
|
+
ox, oy = origin
|
|
226
|
+
classify = layers.classifier
|
|
227
|
+
# 1 = floor, 2 = wall/background (blocked), 0 = other. Index by cell.
|
|
228
|
+
klass = bytes(
|
|
229
|
+
1 if (c := classify(v)) == LAYER_FLOOR else 2 if c in (LAYER_WALL, LAYER_BACKGROUND) else 0 for v in layers.grid
|
|
230
|
+
)
|
|
231
|
+
|
|
232
|
+
best: tuple[float, GridCalibration] | None = None
|
|
233
|
+
for resolution in resolutions:
|
|
234
|
+
if resolution <= 0:
|
|
235
|
+
continue
|
|
236
|
+
for y_sign in y_signs:
|
|
237
|
+
on_floor = 0
|
|
238
|
+
blocked = 0
|
|
239
|
+
for x, y in points:
|
|
240
|
+
px = int(x / resolution + ox)
|
|
241
|
+
py = int(oy - y_sign * y / resolution)
|
|
242
|
+
if not (0 <= px < w and 0 <= py < h):
|
|
243
|
+
blocked += 1
|
|
244
|
+
continue
|
|
245
|
+
k = klass[py * w + px]
|
|
246
|
+
if k == 1:
|
|
247
|
+
on_floor += 1
|
|
248
|
+
elif k == 2:
|
|
249
|
+
blocked += 1
|
|
250
|
+
score = on_floor - 1.5 * blocked
|
|
251
|
+
if best is None or score > best[0]:
|
|
252
|
+
best = (score, GridCalibration(float(resolution), float(ox), float(oy), y_sign))
|
|
253
|
+
|
|
254
|
+
if best is None or best[0] < len(points) * min_on_floor:
|
|
255
|
+
return None
|
|
256
|
+
return best[1]
|
|
257
|
+
|
|
258
|
+
|
|
203
259
|
def decompose_grid(
|
|
204
260
|
width: int,
|
|
205
261
|
height: int,
|