python-roborock 7.10.0__tar.gz → 7.11.1__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 (134) hide show
  1. {python_roborock-7.10.0 → python_roborock-7.11.1}/PKG-INFO +1 -1
  2. {python_roborock-7.10.0 → python_roborock-7.11.1}/pyproject.toml +1 -1
  3. {python_roborock-7.10.0 → python_roborock-7.11.1}/roborock/cli.py +15 -0
  4. {python_roborock-7.10.0 → python_roborock-7.11.1}/roborock/devices/traits/v1/home.py +1 -1
  5. {python_roborock-7.10.0 → python_roborock-7.11.1}/roborock/devices/traits/v1/map_content.py +34 -0
  6. {python_roborock-7.10.0 → python_roborock-7.11.1}/roborock/devices/traits/v1/status.py +17 -0
  7. {python_roborock-7.10.0 → python_roborock-7.11.1}/.gitignore +0 -0
  8. {python_roborock-7.10.0 → python_roborock-7.11.1}/LICENSE +0 -0
  9. {python_roborock-7.10.0 → python_roborock-7.11.1}/README.md +0 -0
  10. {python_roborock-7.10.0 → python_roborock-7.11.1}/roborock/__init__.py +0 -0
  11. {python_roborock-7.10.0 → python_roborock-7.11.1}/roborock/broadcast_protocol.py +0 -0
  12. {python_roborock-7.10.0 → python_roborock-7.11.1}/roborock/callbacks.py +0 -0
  13. {python_roborock-7.10.0 → python_roborock-7.11.1}/roborock/const.py +0 -0
  14. {python_roborock-7.10.0 → python_roborock-7.11.1}/roborock/data/__init__.py +0 -0
  15. {python_roborock-7.10.0 → python_roborock-7.11.1}/roborock/data/b01_q10/__init__.py +0 -0
  16. {python_roborock-7.10.0 → python_roborock-7.11.1}/roborock/data/b01_q10/b01_q10_code_mappings.py +0 -0
  17. {python_roborock-7.10.0 → python_roborock-7.11.1}/roborock/data/b01_q10/b01_q10_containers.py +0 -0
  18. {python_roborock-7.10.0 → python_roborock-7.11.1}/roborock/data/b01_q7/__init__.py +0 -0
  19. {python_roborock-7.10.0 → python_roborock-7.11.1}/roborock/data/b01_q7/b01_q7_code_mappings.py +0 -0
  20. {python_roborock-7.10.0 → python_roborock-7.11.1}/roborock/data/b01_q7/b01_q7_containers.py +0 -0
  21. {python_roborock-7.10.0 → python_roborock-7.11.1}/roborock/data/code_mappings.py +0 -0
  22. {python_roborock-7.10.0 → python_roborock-7.11.1}/roborock/data/containers.py +0 -0
  23. {python_roborock-7.10.0 → python_roborock-7.11.1}/roborock/data/dyad/__init__.py +0 -0
  24. {python_roborock-7.10.0 → python_roborock-7.11.1}/roborock/data/dyad/dyad_code_mappings.py +0 -0
  25. {python_roborock-7.10.0 → python_roborock-7.11.1}/roborock/data/dyad/dyad_containers.py +0 -0
  26. {python_roborock-7.10.0 → python_roborock-7.11.1}/roborock/data/mower/__init__.py +0 -0
  27. {python_roborock-7.10.0 → python_roborock-7.11.1}/roborock/data/mower/mower_code_mappings.py +0 -0
  28. {python_roborock-7.10.0 → python_roborock-7.11.1}/roborock/data/mower/mower_containers.py +0 -0
  29. {python_roborock-7.10.0 → python_roborock-7.11.1}/roborock/data/v1/__init__.py +0 -0
  30. {python_roborock-7.10.0 → python_roborock-7.11.1}/roborock/data/v1/v1_clean_modes.py +0 -0
  31. {python_roborock-7.10.0 → python_roborock-7.11.1}/roborock/data/v1/v1_code_mappings.py +0 -0
  32. {python_roborock-7.10.0 → python_roborock-7.11.1}/roborock/data/v1/v1_containers.py +0 -0
  33. {python_roborock-7.10.0 → python_roborock-7.11.1}/roborock/data/zeo/__init__.py +0 -0
  34. {python_roborock-7.10.0 → python_roborock-7.11.1}/roborock/data/zeo/zeo_code_mappings.py +0 -0
  35. {python_roborock-7.10.0 → python_roborock-7.11.1}/roborock/data/zeo/zeo_containers.py +0 -0
  36. {python_roborock-7.10.0 → python_roborock-7.11.1}/roborock/device_features.py +0 -0
  37. {python_roborock-7.10.0 → python_roborock-7.11.1}/roborock/devices/README.md +0 -0
  38. {python_roborock-7.10.0 → python_roborock-7.11.1}/roborock/devices/__init__.py +0 -0
  39. {python_roborock-7.10.0 → python_roborock-7.11.1}/roborock/devices/cache.py +0 -0
  40. {python_roborock-7.10.0 → python_roborock-7.11.1}/roborock/devices/device.py +0 -0
  41. {python_roborock-7.10.0 → python_roborock-7.11.1}/roborock/devices/device_manager.py +0 -0
  42. {python_roborock-7.10.0 → python_roborock-7.11.1}/roborock/devices/file_cache.py +0 -0
  43. {python_roborock-7.10.0 → python_roborock-7.11.1}/roborock/devices/rpc/__init__.py +0 -0
  44. {python_roborock-7.10.0 → python_roborock-7.11.1}/roborock/devices/rpc/a01_channel.py +0 -0
  45. {python_roborock-7.10.0 → python_roborock-7.11.1}/roborock/devices/rpc/b01_q10_channel.py +0 -0
  46. {python_roborock-7.10.0 → python_roborock-7.11.1}/roborock/devices/rpc/b01_q7_channel.py +0 -0
  47. {python_roborock-7.10.0 → python_roborock-7.11.1}/roborock/devices/rpc/v1_channel.py +0 -0
  48. {python_roborock-7.10.0 → python_roborock-7.11.1}/roborock/devices/traits/__init__.py +0 -0
  49. {python_roborock-7.10.0 → python_roborock-7.11.1}/roborock/devices/traits/a01/__init__.py +0 -0
  50. {python_roborock-7.10.0 → python_roborock-7.11.1}/roborock/devices/traits/a01/device_feature.py +0 -0
  51. {python_roborock-7.10.0 → python_roborock-7.11.1}/roborock/devices/traits/b01/__init__.py +0 -0
  52. {python_roborock-7.10.0 → python_roborock-7.11.1}/roborock/devices/traits/b01/q10/__init__.py +0 -0
  53. {python_roborock-7.10.0 → python_roborock-7.11.1}/roborock/devices/traits/b01/q10/button_light.py +0 -0
  54. {python_roborock-7.10.0 → python_roborock-7.11.1}/roborock/devices/traits/b01/q10/child_lock.py +0 -0
  55. {python_roborock-7.10.0 → python_roborock-7.11.1}/roborock/devices/traits/b01/q10/clean_history.py +0 -0
  56. {python_roborock-7.10.0 → python_roborock-7.11.1}/roborock/devices/traits/b01/q10/command.py +0 -0
  57. {python_roborock-7.10.0 → python_roborock-7.11.1}/roborock/devices/traits/b01/q10/common.py +0 -0
  58. {python_roborock-7.10.0 → python_roborock-7.11.1}/roborock/devices/traits/b01/q10/consumable.py +0 -0
  59. {python_roborock-7.10.0 → python_roborock-7.11.1}/roborock/devices/traits/b01/q10/do_not_disturb.py +0 -0
  60. {python_roborock-7.10.0 → python_roborock-7.11.1}/roborock/devices/traits/b01/q10/dust_collection.py +0 -0
  61. {python_roborock-7.10.0 → python_roborock-7.11.1}/roborock/devices/traits/b01/q10/goto.py +0 -0
  62. {python_roborock-7.10.0 → python_roborock-7.11.1}/roborock/devices/traits/b01/q10/map.py +0 -0
  63. {python_roborock-7.10.0 → python_roborock-7.11.1}/roborock/devices/traits/b01/q10/maps.py +0 -0
  64. {python_roborock-7.10.0 → python_roborock-7.11.1}/roborock/devices/traits/b01/q10/network_info.py +0 -0
  65. {python_roborock-7.10.0 → python_roborock-7.11.1}/roborock/devices/traits/b01/q10/remote.py +0 -0
  66. {python_roborock-7.10.0 → python_roborock-7.11.1}/roborock/devices/traits/b01/q10/status.py +0 -0
  67. {python_roborock-7.10.0 → python_roborock-7.11.1}/roborock/devices/traits/b01/q10/vacuum.py +0 -0
  68. {python_roborock-7.10.0 → python_roborock-7.11.1}/roborock/devices/traits/b01/q10/volume.py +0 -0
  69. {python_roborock-7.10.0 → python_roborock-7.11.1}/roborock/devices/traits/b01/q7/__init__.py +0 -0
  70. {python_roborock-7.10.0 → python_roborock-7.11.1}/roborock/devices/traits/b01/q7/clean_summary.py +0 -0
  71. {python_roborock-7.10.0 → python_roborock-7.11.1}/roborock/devices/traits/b01/q7/map.py +0 -0
  72. {python_roborock-7.10.0 → python_roborock-7.11.1}/roborock/devices/traits/b01/q7/map_content.py +0 -0
  73. {python_roborock-7.10.0 → python_roborock-7.11.1}/roborock/devices/traits/common.py +0 -0
  74. {python_roborock-7.10.0 → python_roborock-7.11.1}/roborock/devices/traits/traits_mixin.py +0 -0
  75. {python_roborock-7.10.0 → python_roborock-7.11.1}/roborock/devices/traits/v1/__init__.py +0 -0
  76. {python_roborock-7.10.0 → python_roborock-7.11.1}/roborock/devices/traits/v1/child_lock.py +0 -0
  77. {python_roborock-7.10.0 → python_roborock-7.11.1}/roborock/devices/traits/v1/clean_summary.py +0 -0
  78. {python_roborock-7.10.0 → python_roborock-7.11.1}/roborock/devices/traits/v1/command.py +0 -0
  79. {python_roborock-7.10.0 → python_roborock-7.11.1}/roborock/devices/traits/v1/common.py +0 -0
  80. {python_roborock-7.10.0 → python_roborock-7.11.1}/roborock/devices/traits/v1/consumeable.py +0 -0
  81. {python_roborock-7.10.0 → python_roborock-7.11.1}/roborock/devices/traits/v1/device_features.py +0 -0
  82. {python_roborock-7.10.0 → python_roborock-7.11.1}/roborock/devices/traits/v1/do_not_disturb.py +0 -0
  83. {python_roborock-7.10.0 → python_roborock-7.11.1}/roborock/devices/traits/v1/dust_collection_mode.py +0 -0
  84. {python_roborock-7.10.0 → python_roborock-7.11.1}/roborock/devices/traits/v1/flow_led_status.py +0 -0
  85. {python_roborock-7.10.0 → python_roborock-7.11.1}/roborock/devices/traits/v1/led_status.py +0 -0
  86. {python_roborock-7.10.0 → python_roborock-7.11.1}/roborock/devices/traits/v1/maps.py +0 -0
  87. {python_roborock-7.10.0 → python_roborock-7.11.1}/roborock/devices/traits/v1/mop_dryer.py +0 -0
  88. {python_roborock-7.10.0 → python_roborock-7.11.1}/roborock/devices/traits/v1/network_info.py +0 -0
  89. {python_roborock-7.10.0 → python_roborock-7.11.1}/roborock/devices/traits/v1/obstacle_photos.py +0 -0
  90. {python_roborock-7.10.0 → python_roborock-7.11.1}/roborock/devices/traits/v1/rooms.py +0 -0
  91. {python_roborock-7.10.0 → python_roborock-7.11.1}/roborock/devices/traits/v1/routines.py +0 -0
  92. {python_roborock-7.10.0 → python_roborock-7.11.1}/roborock/devices/traits/v1/smart_wash_params.py +0 -0
  93. {python_roborock-7.10.0 → python_roborock-7.11.1}/roborock/devices/traits/v1/valley_electricity_timer.py +0 -0
  94. {python_roborock-7.10.0 → python_roborock-7.11.1}/roborock/devices/traits/v1/volume.py +0 -0
  95. {python_roborock-7.10.0 → python_roborock-7.11.1}/roborock/devices/traits/v1/wash_towel_mode.py +0 -0
  96. {python_roborock-7.10.0 → python_roborock-7.11.1}/roborock/devices/transport/__init__.py +0 -0
  97. {python_roborock-7.10.0 → python_roborock-7.11.1}/roborock/devices/transport/channel.py +0 -0
  98. {python_roborock-7.10.0 → python_roborock-7.11.1}/roborock/devices/transport/local_channel.py +0 -0
  99. {python_roborock-7.10.0 → python_roborock-7.11.1}/roborock/devices/transport/mqtt_channel.py +0 -0
  100. {python_roborock-7.10.0 → python_roborock-7.11.1}/roborock/diagnostics.py +0 -0
  101. {python_roborock-7.10.0 → python_roborock-7.11.1}/roborock/exceptions.py +0 -0
  102. {python_roborock-7.10.0 → python_roborock-7.11.1}/roborock/map/__init__.py +0 -0
  103. {python_roborock-7.10.0 → python_roborock-7.11.1}/roborock/map/b01_grid_layers.py +0 -0
  104. {python_roborock-7.10.0 → python_roborock-7.11.1}/roborock/map/b01_map_parser.py +0 -0
  105. {python_roborock-7.10.0 → python_roborock-7.11.1}/roborock/map/b01_q10_map_parser.py +0 -0
  106. {python_roborock-7.10.0 → python_roborock-7.11.1}/roborock/map/b01_q10_overlays.py +0 -0
  107. {python_roborock-7.10.0 → python_roborock-7.11.1}/roborock/map/b01_q10_render.py +0 -0
  108. {python_roborock-7.10.0 → python_roborock-7.11.1}/roborock/map/map_parser.py +0 -0
  109. {python_roborock-7.10.0 → python_roborock-7.11.1}/roborock/map/proto/__init__.py +0 -0
  110. {python_roborock-7.10.0 → python_roborock-7.11.1}/roborock/map/proto/b01_scmap.proto +0 -0
  111. {python_roborock-7.10.0 → python_roborock-7.11.1}/roborock/map/proto/b01_scmap_pb2.py +0 -0
  112. {python_roborock-7.10.0 → python_roborock-7.11.1}/roborock/map/room_colors.py +0 -0
  113. {python_roborock-7.10.0 → python_roborock-7.11.1}/roborock/mqtt/__init__.py +0 -0
  114. {python_roborock-7.10.0 → python_roborock-7.11.1}/roborock/mqtt/health_manager.py +0 -0
  115. {python_roborock-7.10.0 → python_roborock-7.11.1}/roborock/mqtt/roborock_session.py +0 -0
  116. {python_roborock-7.10.0 → python_roborock-7.11.1}/roborock/mqtt/session.py +0 -0
  117. {python_roborock-7.10.0 → python_roborock-7.11.1}/roborock/protocol.py +0 -0
  118. {python_roborock-7.10.0 → python_roborock-7.11.1}/roborock/protocols/__init__.py +0 -0
  119. {python_roborock-7.10.0 → python_roborock-7.11.1}/roborock/protocols/a01_protocol.py +0 -0
  120. {python_roborock-7.10.0 → python_roborock-7.11.1}/roborock/protocols/b01_q10_protocol.py +0 -0
  121. {python_roborock-7.10.0 → python_roborock-7.11.1}/roborock/protocols/b01_q7_protocol.py +0 -0
  122. {python_roborock-7.10.0 → python_roborock-7.11.1}/roborock/protocols/v1_protocol.py +0 -0
  123. {python_roborock-7.10.0 → python_roborock-7.11.1}/roborock/py.typed +0 -0
  124. {python_roborock-7.10.0 → python_roborock-7.11.1}/roborock/roborock_message.py +0 -0
  125. {python_roborock-7.10.0 → python_roborock-7.11.1}/roborock/roborock_typing.py +0 -0
  126. {python_roborock-7.10.0 → python_roborock-7.11.1}/roborock/testing/__init__.py +0 -0
  127. {python_roborock-7.10.0 → python_roborock-7.11.1}/roborock/testing/a01_simulator.py +0 -0
  128. {python_roborock-7.10.0 → python_roborock-7.11.1}/roborock/testing/b01_q10_simulator.py +0 -0
  129. {python_roborock-7.10.0 → python_roborock-7.11.1}/roborock/testing/channel.py +0 -0
  130. {python_roborock-7.10.0 → python_roborock-7.11.1}/roborock/testing/cloud.py +0 -0
  131. {python_roborock-7.10.0 → python_roborock-7.11.1}/roborock/testing/simulator.py +0 -0
  132. {python_roborock-7.10.0 → python_roborock-7.11.1}/roborock/testing/v1_simulator.py +0 -0
  133. {python_roborock-7.10.0 → python_roborock-7.11.1}/roborock/util.py +0 -0
  134. {python_roborock-7.10.0 → python_roborock-7.11.1}/roborock/web_api.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.5
2
2
  Name: python-roborock
3
- Version: 7.10.0
3
+ Version: 7.11.1
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 = "7.10.0"
3
+ version = "7.11.1"
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"
@@ -749,6 +749,20 @@ async def reset_consumable(ctx, device_id: str, consumable: str):
749
749
  click.echo(f"Reset {consumable} for device {device_id}")
750
750
 
751
751
 
752
+ @session.command()
753
+ @click.option("--device_id", required=True)
754
+ @click.option("--error_code", type=int, help="Error code to resolve. Defaults to the current dock or robot error.")
755
+ @click.pass_context
756
+ @async_command
757
+ async def resolve_error(ctx, device_id: str, error_code: int | None):
758
+ """Resolve the current dock or robot error, like "Resolved" in the app."""
759
+ context: RoborockContext = ctx.obj
760
+ trait = await _v1_trait(context, device_id, lambda v1: v1.status)
761
+ await trait.refresh()
762
+ await trait.resolve_error(error_code)
763
+ click.echo(f"Dock error: {trait.dock_error_status}, error: {trait.error_code}")
764
+
765
+
752
766
  @session.command()
753
767
  @click.option("--device_id", required=True)
754
768
  @click.option("--enabled", type=bool, help="Enable (True) or disable (False) the child lock.")
@@ -1369,6 +1383,7 @@ cli.add_command(map_data)
1369
1383
  cli.add_command(q10_position)
1370
1384
  cli.add_command(consumables)
1371
1385
  cli.add_command(reset_consumable)
1386
+ cli.add_command(resolve_error)
1372
1387
  cli.add_command(rooms)
1373
1388
  cli.add_command(home)
1374
1389
  cli.add_command(features)
@@ -96,7 +96,7 @@ class HomeTrait(RoborockBase, common.V1TraitMixin, TraitUpdateListener):
96
96
  self._discovery_completed = True
97
97
  try:
98
98
  self._home_map_content = {
99
- k: self._map_content.converter.parse_map_content(base64.b64decode(v))
99
+ k: await self._map_content.converter.async_parse_map_content(base64.b64decode(v))
100
100
  for k, v in (device_cache_data.home_map_content_base64 or {}).items()
101
101
  }
102
102
  except (ValueError, RoborockException) as ex:
@@ -1,5 +1,6 @@
1
1
  """Trait for fetching the map content from Roborock devices."""
2
2
 
3
+ import asyncio
3
4
  import logging
4
5
  from dataclasses import dataclass
5
6
 
@@ -7,6 +8,7 @@ from vacuum_map_parser_base.map_data import MapData
7
8
 
8
9
  from roborock.data import RoborockBase
9
10
  from roborock.devices.traits.v1 import common
11
+ from roborock.exceptions import RoborockParsingException
10
12
  from roborock.map.map_parser import MapParser, MapParserConfig
11
13
  from roborock.roborock_typing import RoborockCommand
12
14
 
@@ -78,6 +80,20 @@ class MapContentConverter(common.V1TraitDataConverter):
78
80
  raw_api_response=response,
79
81
  )
80
82
 
83
+ async def async_parse_map_content(self, response: bytes) -> MapContent:
84
+ """Parse the map content from raw bytes asynchronously.
85
+
86
+ Args:
87
+ response: The raw bytes of the map data from the API.
88
+
89
+ Returns:
90
+ MapContent: The parsed map content.
91
+
92
+ Raises:
93
+ RoborockException: If the map data cannot be parsed.
94
+ """
95
+ return await asyncio.to_thread(self.parse_map_content, response)
96
+
81
97
 
82
98
  @common.map_rpc_channel
83
99
  class MapContentTrait(MapContent, common.V1TraitMixin):
@@ -90,3 +106,21 @@ class MapContentTrait(MapContent, common.V1TraitMixin):
90
106
  """Initialize MapContentTrait."""
91
107
  super().__init__()
92
108
  self.converter = MapContentConverter(MapParser(map_parser_config or MapParserConfig()))
109
+
110
+ async def refresh(self) -> None:
111
+ """Refresh the contents of this trait without blocking the event loop."""
112
+ response = await self.rpc_channel.send_command(self.command)
113
+ if self.raw_api_response is not None and self.raw_api_response == response:
114
+ return
115
+ if not isinstance(response, bytes):
116
+ raise ValueError(f"Unexpected MapContentTrait response format: {type(response)}")
117
+ try:
118
+ new_data = await self.converter.async_parse_map_content(response)
119
+ except (TypeError, ValueError) as err:
120
+ raise RoborockParsingException(
121
+ trait_name=type(self).__name__,
122
+ command=self.command,
123
+ payload=response,
124
+ inner_error=err,
125
+ ) from err
126
+ common.merge_trait_values(self, new_data)
@@ -133,6 +133,23 @@ class StatusTrait(StatusV2, common.V1TraitMixin, TraitUpdateListener):
133
133
  params=get_cleaning_mode_parameters(resolve_cleaning_mode(cleaning_mode), self._device_features_trait),
134
134
  )
135
135
 
136
+ async def resolve_error(self, error_code: int | None = None) -> None:
137
+ """Resolve an error, like tapping "Resolved" in the Roborock app.
138
+
139
+ Without an explicit code this resolves the current dock error if there is one,
140
+ otherwise the current robot error. A dock error such as water_empty stays latched
141
+ on the device until it is resolved, even after the cause has been fixed.
142
+ """
143
+ if error_code is None:
144
+ if self.dock_error_status:
145
+ error_code = int(self.dock_error_status)
146
+ elif self.error_code:
147
+ error_code = int(self.error_code)
148
+ else:
149
+ return
150
+ await self.rpc_channel.send_command(RoborockCommand.RESOLVE_ERROR, params={"error_code": error_code})
151
+ await self.refresh()
152
+
136
153
  def update_from_dps(self, decoded_dps: dict[RoborockDataProtocol, Any]) -> None:
137
154
  """Update the trait from data protocol push message data.
138
155