python-roborock 5.21.0__tar.gz → 5.22.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 (116) hide show
  1. {python_roborock-5.21.0 → python_roborock-5.22.0}/PKG-INFO +1 -1
  2. {python_roborock-5.21.0 → python_roborock-5.22.0}/pyproject.toml +1 -1
  3. {python_roborock-5.21.0 → python_roborock-5.22.0}/roborock/cli.py +33 -0
  4. {python_roborock-5.21.0 → python_roborock-5.22.0}/roborock/devices/traits/b01/q10/vacuum.py +27 -5
  5. {python_roborock-5.21.0 → python_roborock-5.22.0}/.gitignore +0 -0
  6. {python_roborock-5.21.0 → python_roborock-5.22.0}/LICENSE +0 -0
  7. {python_roborock-5.21.0 → python_roborock-5.22.0}/README.md +0 -0
  8. {python_roborock-5.21.0 → python_roborock-5.22.0}/roborock/__init__.py +0 -0
  9. {python_roborock-5.21.0 → python_roborock-5.22.0}/roborock/broadcast_protocol.py +0 -0
  10. {python_roborock-5.21.0 → python_roborock-5.22.0}/roborock/callbacks.py +0 -0
  11. {python_roborock-5.21.0 → python_roborock-5.22.0}/roborock/const.py +0 -0
  12. {python_roborock-5.21.0 → python_roborock-5.22.0}/roborock/data/__init__.py +0 -0
  13. {python_roborock-5.21.0 → python_roborock-5.22.0}/roborock/data/b01_q10/__init__.py +0 -0
  14. {python_roborock-5.21.0 → python_roborock-5.22.0}/roborock/data/b01_q10/b01_q10_code_mappings.py +0 -0
  15. {python_roborock-5.21.0 → python_roborock-5.22.0}/roborock/data/b01_q10/b01_q10_containers.py +0 -0
  16. {python_roborock-5.21.0 → python_roborock-5.22.0}/roborock/data/b01_q7/__init__.py +0 -0
  17. {python_roborock-5.21.0 → python_roborock-5.22.0}/roborock/data/b01_q7/b01_q7_code_mappings.py +0 -0
  18. {python_roborock-5.21.0 → python_roborock-5.22.0}/roborock/data/b01_q7/b01_q7_containers.py +0 -0
  19. {python_roborock-5.21.0 → python_roborock-5.22.0}/roborock/data/code_mappings.py +0 -0
  20. {python_roborock-5.21.0 → python_roborock-5.22.0}/roborock/data/containers.py +0 -0
  21. {python_roborock-5.21.0 → python_roborock-5.22.0}/roborock/data/dyad/__init__.py +0 -0
  22. {python_roborock-5.21.0 → python_roborock-5.22.0}/roborock/data/dyad/dyad_code_mappings.py +0 -0
  23. {python_roborock-5.21.0 → python_roborock-5.22.0}/roborock/data/dyad/dyad_containers.py +0 -0
  24. {python_roborock-5.21.0 → python_roborock-5.22.0}/roborock/data/v1/__init__.py +0 -0
  25. {python_roborock-5.21.0 → python_roborock-5.22.0}/roborock/data/v1/v1_clean_modes.py +0 -0
  26. {python_roborock-5.21.0 → python_roborock-5.22.0}/roborock/data/v1/v1_code_mappings.py +0 -0
  27. {python_roborock-5.21.0 → python_roborock-5.22.0}/roborock/data/v1/v1_containers.py +0 -0
  28. {python_roborock-5.21.0 → python_roborock-5.22.0}/roborock/data/zeo/__init__.py +0 -0
  29. {python_roborock-5.21.0 → python_roborock-5.22.0}/roborock/data/zeo/zeo_code_mappings.py +0 -0
  30. {python_roborock-5.21.0 → python_roborock-5.22.0}/roborock/data/zeo/zeo_containers.py +0 -0
  31. {python_roborock-5.21.0 → python_roborock-5.22.0}/roborock/device_features.py +0 -0
  32. {python_roborock-5.21.0 → python_roborock-5.22.0}/roborock/devices/README.md +0 -0
  33. {python_roborock-5.21.0 → python_roborock-5.22.0}/roborock/devices/__init__.py +0 -0
  34. {python_roborock-5.21.0 → python_roborock-5.22.0}/roborock/devices/cache.py +0 -0
  35. {python_roborock-5.21.0 → python_roborock-5.22.0}/roborock/devices/device.py +0 -0
  36. {python_roborock-5.21.0 → python_roborock-5.22.0}/roborock/devices/device_manager.py +0 -0
  37. {python_roborock-5.21.0 → python_roborock-5.22.0}/roborock/devices/file_cache.py +0 -0
  38. {python_roborock-5.21.0 → python_roborock-5.22.0}/roborock/devices/rpc/__init__.py +0 -0
  39. {python_roborock-5.21.0 → python_roborock-5.22.0}/roborock/devices/rpc/a01_channel.py +0 -0
  40. {python_roborock-5.21.0 → python_roborock-5.22.0}/roborock/devices/rpc/b01_q10_channel.py +0 -0
  41. {python_roborock-5.21.0 → python_roborock-5.22.0}/roborock/devices/rpc/b01_q7_channel.py +0 -0
  42. {python_roborock-5.21.0 → python_roborock-5.22.0}/roborock/devices/rpc/v1_channel.py +0 -0
  43. {python_roborock-5.21.0 → python_roborock-5.22.0}/roborock/devices/traits/__init__.py +0 -0
  44. {python_roborock-5.21.0 → python_roborock-5.22.0}/roborock/devices/traits/a01/__init__.py +0 -0
  45. {python_roborock-5.21.0 → python_roborock-5.22.0}/roborock/devices/traits/b01/__init__.py +0 -0
  46. {python_roborock-5.21.0 → python_roborock-5.22.0}/roborock/devices/traits/b01/q10/__init__.py +0 -0
  47. {python_roborock-5.21.0 → python_roborock-5.22.0}/roborock/devices/traits/b01/q10/button_light.py +0 -0
  48. {python_roborock-5.21.0 → python_roborock-5.22.0}/roborock/devices/traits/b01/q10/child_lock.py +0 -0
  49. {python_roborock-5.21.0 → python_roborock-5.22.0}/roborock/devices/traits/b01/q10/command.py +0 -0
  50. {python_roborock-5.21.0 → python_roborock-5.22.0}/roborock/devices/traits/b01/q10/common.py +0 -0
  51. {python_roborock-5.21.0 → python_roborock-5.22.0}/roborock/devices/traits/b01/q10/consumable.py +0 -0
  52. {python_roborock-5.21.0 → python_roborock-5.22.0}/roborock/devices/traits/b01/q10/do_not_disturb.py +0 -0
  53. {python_roborock-5.21.0 → python_roborock-5.22.0}/roborock/devices/traits/b01/q10/dust_collection.py +0 -0
  54. {python_roborock-5.21.0 → python_roborock-5.22.0}/roborock/devices/traits/b01/q10/map.py +0 -0
  55. {python_roborock-5.21.0 → python_roborock-5.22.0}/roborock/devices/traits/b01/q10/network_info.py +0 -0
  56. {python_roborock-5.21.0 → python_roborock-5.22.0}/roborock/devices/traits/b01/q10/remote.py +0 -0
  57. {python_roborock-5.21.0 → python_roborock-5.22.0}/roborock/devices/traits/b01/q10/status.py +0 -0
  58. {python_roborock-5.21.0 → python_roborock-5.22.0}/roborock/devices/traits/b01/q10/volume.py +0 -0
  59. {python_roborock-5.21.0 → python_roborock-5.22.0}/roborock/devices/traits/b01/q7/__init__.py +0 -0
  60. {python_roborock-5.21.0 → python_roborock-5.22.0}/roborock/devices/traits/b01/q7/clean_summary.py +0 -0
  61. {python_roborock-5.21.0 → python_roborock-5.22.0}/roborock/devices/traits/b01/q7/map.py +0 -0
  62. {python_roborock-5.21.0 → python_roborock-5.22.0}/roborock/devices/traits/b01/q7/map_content.py +0 -0
  63. {python_roborock-5.21.0 → python_roborock-5.22.0}/roborock/devices/traits/common.py +0 -0
  64. {python_roborock-5.21.0 → python_roborock-5.22.0}/roborock/devices/traits/traits_mixin.py +0 -0
  65. {python_roborock-5.21.0 → python_roborock-5.22.0}/roborock/devices/traits/v1/__init__.py +0 -0
  66. {python_roborock-5.21.0 → python_roborock-5.22.0}/roborock/devices/traits/v1/child_lock.py +0 -0
  67. {python_roborock-5.21.0 → python_roborock-5.22.0}/roborock/devices/traits/v1/clean_summary.py +0 -0
  68. {python_roborock-5.21.0 → python_roborock-5.22.0}/roborock/devices/traits/v1/command.py +0 -0
  69. {python_roborock-5.21.0 → python_roborock-5.22.0}/roborock/devices/traits/v1/common.py +0 -0
  70. {python_roborock-5.21.0 → python_roborock-5.22.0}/roborock/devices/traits/v1/consumeable.py +0 -0
  71. {python_roborock-5.21.0 → python_roborock-5.22.0}/roborock/devices/traits/v1/device_features.py +0 -0
  72. {python_roborock-5.21.0 → python_roborock-5.22.0}/roborock/devices/traits/v1/do_not_disturb.py +0 -0
  73. {python_roborock-5.21.0 → python_roborock-5.22.0}/roborock/devices/traits/v1/dust_collection_mode.py +0 -0
  74. {python_roborock-5.21.0 → python_roborock-5.22.0}/roborock/devices/traits/v1/flow_led_status.py +0 -0
  75. {python_roborock-5.21.0 → python_roborock-5.22.0}/roborock/devices/traits/v1/home.py +0 -0
  76. {python_roborock-5.21.0 → python_roborock-5.22.0}/roborock/devices/traits/v1/led_status.py +0 -0
  77. {python_roborock-5.21.0 → python_roborock-5.22.0}/roborock/devices/traits/v1/map_content.py +0 -0
  78. {python_roborock-5.21.0 → python_roborock-5.22.0}/roborock/devices/traits/v1/maps.py +0 -0
  79. {python_roborock-5.21.0 → python_roborock-5.22.0}/roborock/devices/traits/v1/network_info.py +0 -0
  80. {python_roborock-5.21.0 → python_roborock-5.22.0}/roborock/devices/traits/v1/rooms.py +0 -0
  81. {python_roborock-5.21.0 → python_roborock-5.22.0}/roborock/devices/traits/v1/routines.py +0 -0
  82. {python_roborock-5.21.0 → python_roborock-5.22.0}/roborock/devices/traits/v1/smart_wash_params.py +0 -0
  83. {python_roborock-5.21.0 → python_roborock-5.22.0}/roborock/devices/traits/v1/status.py +0 -0
  84. {python_roborock-5.21.0 → python_roborock-5.22.0}/roborock/devices/traits/v1/valley_electricity_timer.py +0 -0
  85. {python_roborock-5.21.0 → python_roborock-5.22.0}/roborock/devices/traits/v1/volume.py +0 -0
  86. {python_roborock-5.21.0 → python_roborock-5.22.0}/roborock/devices/traits/v1/wash_towel_mode.py +0 -0
  87. {python_roborock-5.21.0 → python_roborock-5.22.0}/roborock/devices/transport/__init__.py +0 -0
  88. {python_roborock-5.21.0 → python_roborock-5.22.0}/roborock/devices/transport/channel.py +0 -0
  89. {python_roborock-5.21.0 → python_roborock-5.22.0}/roborock/devices/transport/local_channel.py +0 -0
  90. {python_roborock-5.21.0 → python_roborock-5.22.0}/roborock/devices/transport/mqtt_channel.py +0 -0
  91. {python_roborock-5.21.0 → python_roborock-5.22.0}/roborock/diagnostics.py +0 -0
  92. {python_roborock-5.21.0 → python_roborock-5.22.0}/roborock/exceptions.py +0 -0
  93. {python_roborock-5.21.0 → python_roborock-5.22.0}/roborock/map/__init__.py +0 -0
  94. {python_roborock-5.21.0 → python_roborock-5.22.0}/roborock/map/b01_grid_layers.py +0 -0
  95. {python_roborock-5.21.0 → python_roborock-5.22.0}/roborock/map/b01_map_parser.py +0 -0
  96. {python_roborock-5.21.0 → python_roborock-5.22.0}/roborock/map/b01_q10_map_parser.py +0 -0
  97. {python_roborock-5.21.0 → python_roborock-5.22.0}/roborock/map/b01_q10_overlays.py +0 -0
  98. {python_roborock-5.21.0 → python_roborock-5.22.0}/roborock/map/map_parser.py +0 -0
  99. {python_roborock-5.21.0 → python_roborock-5.22.0}/roborock/map/proto/__init__.py +0 -0
  100. {python_roborock-5.21.0 → python_roborock-5.22.0}/roborock/map/proto/b01_scmap.proto +0 -0
  101. {python_roborock-5.21.0 → python_roborock-5.22.0}/roborock/map/proto/b01_scmap_pb2.py +0 -0
  102. {python_roborock-5.21.0 → python_roborock-5.22.0}/roborock/mqtt/__init__.py +0 -0
  103. {python_roborock-5.21.0 → python_roborock-5.22.0}/roborock/mqtt/health_manager.py +0 -0
  104. {python_roborock-5.21.0 → python_roborock-5.22.0}/roborock/mqtt/roborock_session.py +0 -0
  105. {python_roborock-5.21.0 → python_roborock-5.22.0}/roborock/mqtt/session.py +0 -0
  106. {python_roborock-5.21.0 → python_roborock-5.22.0}/roborock/protocol.py +0 -0
  107. {python_roborock-5.21.0 → python_roborock-5.22.0}/roborock/protocols/__init__.py +0 -0
  108. {python_roborock-5.21.0 → python_roborock-5.22.0}/roborock/protocols/a01_protocol.py +0 -0
  109. {python_roborock-5.21.0 → python_roborock-5.22.0}/roborock/protocols/b01_q10_protocol.py +0 -0
  110. {python_roborock-5.21.0 → python_roborock-5.22.0}/roborock/protocols/b01_q7_protocol.py +0 -0
  111. {python_roborock-5.21.0 → python_roborock-5.22.0}/roborock/protocols/v1_protocol.py +0 -0
  112. {python_roborock-5.21.0 → python_roborock-5.22.0}/roborock/py.typed +0 -0
  113. {python_roborock-5.21.0 → python_roborock-5.22.0}/roborock/roborock_message.py +0 -0
  114. {python_roborock-5.21.0 → python_roborock-5.22.0}/roborock/roborock_typing.py +0 -0
  115. {python_roborock-5.21.0 → python_roborock-5.22.0}/roborock/util.py +0 -0
  116. {python_roborock-5.21.0 → python_roborock-5.22.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.21.0
3
+ Version: 5.22.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.21.0"
3
+ version = "5.22.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"
@@ -1482,6 +1482,39 @@ async def q10_vacuum_spot(ctx: click.Context, device_id: str) -> None:
1482
1482
  click.echo(f"Error: {e}")
1483
1483
 
1484
1484
 
1485
+ @session.command()
1486
+ @click.option("--device_id", required=True, help="Device ID")
1487
+ @click.option(
1488
+ "--segments",
1489
+ required=True,
1490
+ help="Comma-separated room/segment ids to clean (see the `rooms` command), e.g. 9,2",
1491
+ )
1492
+ @click.pass_context
1493
+ @async_command
1494
+ async def q10_clean_segments(ctx: click.Context, device_id: str, segments: str) -> None:
1495
+ """Start a room / segment clean on a Q10 device.
1496
+
1497
+ Room ids come from the `rooms` command (the device's map rooms).
1498
+ """
1499
+ context: RoborockContext = ctx.obj
1500
+ try:
1501
+ segment_ids = [int(s) for s in segments.split(",") if s.strip()]
1502
+ except ValueError:
1503
+ click.echo("--segments must be comma-separated integers, e.g. 9,2")
1504
+ return
1505
+ if not segment_ids:
1506
+ click.echo("No segment ids provided")
1507
+ return
1508
+ try:
1509
+ trait = await _q10_vacuum_trait(context, device_id)
1510
+ await trait.clean_segments(segment_ids)
1511
+ click.echo(f"Starting room clean of segments {segment_ids}...")
1512
+ except RoborockUnsupportedFeature:
1513
+ click.echo("Device does not support B01 Q10 protocol. Is it a Q10?")
1514
+ except RoborockException as e:
1515
+ click.echo(f"Error: {e}")
1516
+
1517
+
1485
1518
  async def _q10_set(ctx: click.Context, device_id: str, apply: Callable[[Any], Any], message: str) -> None:
1486
1519
  """Run a Q10 settings write and report the result."""
1487
1520
  context: RoborockContext = ctx.obj
@@ -3,6 +3,7 @@
3
3
  from roborock.data.b01_q10.b01_q10_code_mappings import (
4
4
  B01_Q10_DP,
5
5
  YXCleanType,
6
+ YXDeviceCleanTask,
6
7
  YXFanLevel,
7
8
  )
8
9
 
@@ -23,17 +24,38 @@ class VacuumTrait:
23
24
  async def start_clean(self) -> None:
24
25
  """Start a whole-home clean.
25
26
 
26
- The ``dpStartClean`` (201) command takes a bare integer task code:
27
- ``1`` = whole-home, ``2`` = segment/room, ``3`` = zone, ``4`` = build map,
28
- ``5`` = spot. Whole-home and spot take no extra parameters; segment and
29
- zone need a room/zone selection whose payload shape is not yet known, so
30
- only whole-home (here) and spot (:meth:`spot_clean`) are exposed.
27
+ The ``dpStartClean`` (201) command selects a task by code: ``1`` =
28
+ whole-home, ``2`` = segment/room (see :meth:`clean_segments`), ``3`` =
29
+ zone, ``4`` = build map, ``5`` = spot. Whole-home and spot accept the
30
+ bare integer code; segment cleaning needs a room selection (an object
31
+ payload) instead.
31
32
 
32
33
  Verified live against ss07 hardware: ``{"dps": {"201": 1}}`` starts a
33
34
  whole-home clean (clean_task_type -> 1).
34
35
  """
35
36
  await self._command.send(command=B01_Q10_DP.START_CLEAN, params=1)
36
37
 
38
+ async def clean_segments(self, segment_ids: list[int]) -> None:
39
+ """Start a room / segment clean for the given segment (room) ids.
40
+
41
+ The ids are the same room ids the device reports on its map (see the Q10
42
+ ``MapContentTrait`` -- ``map.rooms``, each with an ``id``).
43
+
44
+ Unlike whole-home and spot, ``dpStartClean`` (201) carries the room
45
+ selection as an object: ``{"cmd": <task>, "clean_paramters": [<id>, ...]}``,
46
+ where ``cmd`` is the segment-clean task code.
47
+
48
+ Verified live against ss07 hardware: sending
49
+ ``{"dps": {"201": {"cmd": 2, "clean_paramters": [9]}}}`` starts cleaning
50
+ room 9 (clean_task_type -> 2 / electoral).
51
+ """
52
+ await self._command.send(
53
+ command=B01_Q10_DP.START_CLEAN,
54
+ # "clean_paramters" intentionally mirrors the device's misspelling of
55
+ # "parameters" -- the firmware only accepts that exact key.
56
+ params={"cmd": YXDeviceCleanTask.ELECTORAL.code, "clean_paramters": segment_ids},
57
+ )
58
+
37
59
  async def spot_clean(self) -> None:
38
60
  """Start a spot / part clean around the robot's current position.
39
61