python-roborock 3.6.0__tar.gz → 3.7.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 (94) hide show
  1. {python_roborock-3.6.0 → python_roborock-3.7.0}/PKG-INFO +1 -1
  2. {python_roborock-3.6.0 → python_roborock-3.7.0}/pyproject.toml +1 -1
  3. {python_roborock-3.6.0 → python_roborock-3.7.0}/roborock/devices/device_manager.py +1 -0
  4. {python_roborock-3.6.0 → python_roborock-3.7.0}/roborock/devices/traits/v1/__init__.py +9 -0
  5. python_roborock-3.7.0/roborock/devices/traits/v1/routines.py +26 -0
  6. {python_roborock-3.6.0 → python_roborock-3.7.0}/roborock/web_api.py +8 -0
  7. {python_roborock-3.6.0 → python_roborock-3.7.0}/.gitignore +0 -0
  8. {python_roborock-3.6.0 → python_roborock-3.7.0}/LICENSE +0 -0
  9. {python_roborock-3.6.0 → python_roborock-3.7.0}/README.md +0 -0
  10. {python_roborock-3.6.0 → python_roborock-3.7.0}/roborock/__init__.py +0 -0
  11. {python_roborock-3.6.0 → python_roborock-3.7.0}/roborock/api.py +0 -0
  12. {python_roborock-3.6.0 → python_roborock-3.7.0}/roborock/broadcast_protocol.py +0 -0
  13. {python_roborock-3.6.0 → python_roborock-3.7.0}/roborock/callbacks.py +0 -0
  14. {python_roborock-3.6.0 → python_roborock-3.7.0}/roborock/cli.py +0 -0
  15. {python_roborock-3.6.0 → python_roborock-3.7.0}/roborock/cloud_api.py +0 -0
  16. {python_roborock-3.6.0 → python_roborock-3.7.0}/roborock/command_cache.py +0 -0
  17. {python_roborock-3.6.0 → python_roborock-3.7.0}/roborock/const.py +0 -0
  18. {python_roborock-3.6.0 → python_roborock-3.7.0}/roborock/data/__init__.py +0 -0
  19. {python_roborock-3.6.0 → python_roborock-3.7.0}/roborock/data/b01_q10/__init__.py +0 -0
  20. {python_roborock-3.6.0 → python_roborock-3.7.0}/roborock/data/b01_q10/b01_q10_code_mappings.py +0 -0
  21. {python_roborock-3.6.0 → python_roborock-3.7.0}/roborock/data/b01_q10/b01_q10_containers.py +0 -0
  22. {python_roborock-3.6.0 → python_roborock-3.7.0}/roborock/data/b01_q7/__init__.py +0 -0
  23. {python_roborock-3.6.0 → python_roborock-3.7.0}/roborock/data/b01_q7/b01_q7_code_mappings.py +0 -0
  24. {python_roborock-3.6.0 → python_roborock-3.7.0}/roborock/data/b01_q7/b01_q7_containers.py +0 -0
  25. {python_roborock-3.6.0 → python_roborock-3.7.0}/roborock/data/code_mappings.py +0 -0
  26. {python_roborock-3.6.0 → python_roborock-3.7.0}/roborock/data/containers.py +0 -0
  27. {python_roborock-3.6.0 → python_roborock-3.7.0}/roborock/data/dyad/__init__.py +0 -0
  28. {python_roborock-3.6.0 → python_roborock-3.7.0}/roborock/data/dyad/dyad_code_mappings.py +0 -0
  29. {python_roborock-3.6.0 → python_roborock-3.7.0}/roborock/data/dyad/dyad_containers.py +0 -0
  30. {python_roborock-3.6.0 → python_roborock-3.7.0}/roborock/data/v1/__init__.py +0 -0
  31. {python_roborock-3.6.0 → python_roborock-3.7.0}/roborock/data/v1/v1_clean_modes.py +0 -0
  32. {python_roborock-3.6.0 → python_roborock-3.7.0}/roborock/data/v1/v1_code_mappings.py +0 -0
  33. {python_roborock-3.6.0 → python_roborock-3.7.0}/roborock/data/v1/v1_containers.py +0 -0
  34. {python_roborock-3.6.0 → python_roborock-3.7.0}/roborock/data/zeo/__init__.py +0 -0
  35. {python_roborock-3.6.0 → python_roborock-3.7.0}/roborock/data/zeo/zeo_code_mappings.py +0 -0
  36. {python_roborock-3.6.0 → python_roborock-3.7.0}/roborock/data/zeo/zeo_containers.py +0 -0
  37. {python_roborock-3.6.0 → python_roborock-3.7.0}/roborock/device_features.py +0 -0
  38. {python_roborock-3.6.0 → python_roborock-3.7.0}/roborock/devices/README.md +0 -0
  39. {python_roborock-3.6.0 → python_roborock-3.7.0}/roborock/devices/__init__.py +0 -0
  40. {python_roborock-3.6.0 → python_roborock-3.7.0}/roborock/devices/a01_channel.py +0 -0
  41. {python_roborock-3.6.0 → python_roborock-3.7.0}/roborock/devices/b01_channel.py +0 -0
  42. {python_roborock-3.6.0 → python_roborock-3.7.0}/roborock/devices/cache.py +0 -0
  43. {python_roborock-3.6.0 → python_roborock-3.7.0}/roborock/devices/channel.py +0 -0
  44. {python_roborock-3.6.0 → python_roborock-3.7.0}/roborock/devices/device.py +0 -0
  45. {python_roborock-3.6.0 → python_roborock-3.7.0}/roborock/devices/local_channel.py +0 -0
  46. {python_roborock-3.6.0 → python_roborock-3.7.0}/roborock/devices/mqtt_channel.py +0 -0
  47. {python_roborock-3.6.0 → python_roborock-3.7.0}/roborock/devices/traits/__init__.py +0 -0
  48. {python_roborock-3.6.0 → python_roborock-3.7.0}/roborock/devices/traits/a01/__init__.py +0 -0
  49. {python_roborock-3.6.0 → python_roborock-3.7.0}/roborock/devices/traits/b01/__init__.py +0 -0
  50. {python_roborock-3.6.0 → python_roborock-3.7.0}/roborock/devices/traits/traits_mixin.py +0 -0
  51. {python_roborock-3.6.0 → python_roborock-3.7.0}/roborock/devices/traits/v1/child_lock.py +0 -0
  52. {python_roborock-3.6.0 → python_roborock-3.7.0}/roborock/devices/traits/v1/clean_summary.py +0 -0
  53. {python_roborock-3.6.0 → python_roborock-3.7.0}/roborock/devices/traits/v1/command.py +0 -0
  54. {python_roborock-3.6.0 → python_roborock-3.7.0}/roborock/devices/traits/v1/common.py +0 -0
  55. {python_roborock-3.6.0 → python_roborock-3.7.0}/roborock/devices/traits/v1/consumeable.py +0 -0
  56. {python_roborock-3.6.0 → python_roborock-3.7.0}/roborock/devices/traits/v1/device_features.py +0 -0
  57. {python_roborock-3.6.0 → python_roborock-3.7.0}/roborock/devices/traits/v1/do_not_disturb.py +0 -0
  58. {python_roborock-3.6.0 → python_roborock-3.7.0}/roborock/devices/traits/v1/dust_collection_mode.py +0 -0
  59. {python_roborock-3.6.0 → python_roborock-3.7.0}/roborock/devices/traits/v1/flow_led_status.py +0 -0
  60. {python_roborock-3.6.0 → python_roborock-3.7.0}/roborock/devices/traits/v1/home.py +0 -0
  61. {python_roborock-3.6.0 → python_roborock-3.7.0}/roborock/devices/traits/v1/led_status.py +0 -0
  62. {python_roborock-3.6.0 → python_roborock-3.7.0}/roborock/devices/traits/v1/map_content.py +0 -0
  63. {python_roborock-3.6.0 → python_roborock-3.7.0}/roborock/devices/traits/v1/maps.py +0 -0
  64. {python_roborock-3.6.0 → python_roborock-3.7.0}/roborock/devices/traits/v1/network_info.py +0 -0
  65. {python_roborock-3.6.0 → python_roborock-3.7.0}/roborock/devices/traits/v1/rooms.py +0 -0
  66. {python_roborock-3.6.0 → python_roborock-3.7.0}/roborock/devices/traits/v1/smart_wash_params.py +0 -0
  67. {python_roborock-3.6.0 → python_roborock-3.7.0}/roborock/devices/traits/v1/status.py +0 -0
  68. {python_roborock-3.6.0 → python_roborock-3.7.0}/roborock/devices/traits/v1/valley_electricity_timer.py +0 -0
  69. {python_roborock-3.6.0 → python_roborock-3.7.0}/roborock/devices/traits/v1/volume.py +0 -0
  70. {python_roborock-3.6.0 → python_roborock-3.7.0}/roborock/devices/traits/v1/wash_towel_mode.py +0 -0
  71. {python_roborock-3.6.0 → python_roborock-3.7.0}/roborock/devices/v1_channel.py +0 -0
  72. {python_roborock-3.6.0 → python_roborock-3.7.0}/roborock/devices/v1_rpc_channel.py +0 -0
  73. {python_roborock-3.6.0 → python_roborock-3.7.0}/roborock/exceptions.py +0 -0
  74. {python_roborock-3.6.0 → python_roborock-3.7.0}/roborock/map/__init__.py +0 -0
  75. {python_roborock-3.6.0 → python_roborock-3.7.0}/roborock/map/map_parser.py +0 -0
  76. {python_roborock-3.6.0 → python_roborock-3.7.0}/roborock/mqtt/__init__.py +0 -0
  77. {python_roborock-3.6.0 → python_roborock-3.7.0}/roborock/mqtt/roborock_session.py +0 -0
  78. {python_roborock-3.6.0 → python_roborock-3.7.0}/roborock/mqtt/session.py +0 -0
  79. {python_roborock-3.6.0 → python_roborock-3.7.0}/roborock/protocol.py +0 -0
  80. {python_roborock-3.6.0 → python_roborock-3.7.0}/roborock/protocols/a01_protocol.py +0 -0
  81. {python_roborock-3.6.0 → python_roborock-3.7.0}/roborock/protocols/b01_protocol.py +0 -0
  82. {python_roborock-3.6.0 → python_roborock-3.7.0}/roborock/protocols/v1_protocol.py +0 -0
  83. {python_roborock-3.6.0 → python_roborock-3.7.0}/roborock/py.typed +0 -0
  84. {python_roborock-3.6.0 → python_roborock-3.7.0}/roborock/roborock_future.py +0 -0
  85. {python_roborock-3.6.0 → python_roborock-3.7.0}/roborock/roborock_message.py +0 -0
  86. {python_roborock-3.6.0 → python_roborock-3.7.0}/roborock/roborock_typing.py +0 -0
  87. {python_roborock-3.6.0 → python_roborock-3.7.0}/roborock/util.py +0 -0
  88. {python_roborock-3.6.0 → python_roborock-3.7.0}/roborock/version_1_apis/__init__.py +0 -0
  89. {python_roborock-3.6.0 → python_roborock-3.7.0}/roborock/version_1_apis/roborock_client_v1.py +0 -0
  90. {python_roborock-3.6.0 → python_roborock-3.7.0}/roborock/version_1_apis/roborock_local_client_v1.py +0 -0
  91. {python_roborock-3.6.0 → python_roborock-3.7.0}/roborock/version_1_apis/roborock_mqtt_client_v1.py +0 -0
  92. {python_roborock-3.6.0 → python_roborock-3.7.0}/roborock/version_a01_apis/__init__.py +0 -0
  93. {python_roborock-3.6.0 → python_roborock-3.7.0}/roborock/version_a01_apis/roborock_client_a01.py +0 -0
  94. {python_roborock-3.6.0 → python_roborock-3.7.0}/roborock/version_a01_apis/roborock_mqtt_client_a01.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: python-roborock
3
- Version: 3.6.0
3
+ Version: 3.7.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 = "3.6.0"
3
+ version = "3.7.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"
@@ -187,6 +187,7 @@ async def create_device_manager(
187
187
  channel.rpc_channel,
188
188
  channel.mqtt_rpc_channel,
189
189
  channel.map_rpc_channel,
190
+ web_api,
190
191
  cache,
191
192
  map_parser_config=map_parser_config,
192
193
  )
@@ -40,6 +40,7 @@ from roborock.devices.cache import Cache
40
40
  from roborock.devices.traits import Trait
41
41
  from roborock.devices.v1_rpc_channel import V1RpcChannel
42
42
  from roborock.map.map_parser import MapParserConfig
43
+ from roborock.web_api import UserWebApiClient
43
44
 
44
45
  from .child_lock import ChildLockTrait
45
46
  from .clean_summary import CleanSummaryTrait
@@ -56,6 +57,7 @@ from .map_content import MapContentTrait
56
57
  from .maps import MapsTrait
57
58
  from .network_info import NetworkInfoTrait
58
59
  from .rooms import RoomsTrait
60
+ from .routines import RoutinesTrait
59
61
  from .smart_wash_params import SmartWashParamsTrait
60
62
  from .status import StatusTrait
61
63
  from .valley_electricity_timer import ValleyElectricityTimerTrait
@@ -85,6 +87,7 @@ __all__ = [
85
87
  "WashTowelModeTrait",
86
88
  "SmartWashParamsTrait",
87
89
  "NetworkInfoTrait",
90
+ "RoutinesTrait",
88
91
  ]
89
92
 
90
93
 
@@ -108,6 +111,7 @@ class PropertiesApi(Trait):
108
111
  home: HomeTrait
109
112
  device_features: DeviceFeaturesTrait
110
113
  network_info: NetworkInfoTrait
114
+ routines: RoutinesTrait
111
115
 
112
116
  # Optional features that may not be supported on all devices
113
117
  child_lock: ChildLockTrait | None = None
@@ -126,6 +130,7 @@ class PropertiesApi(Trait):
126
130
  rpc_channel: V1RpcChannel,
127
131
  mqtt_rpc_channel: V1RpcChannel,
128
132
  map_rpc_channel: V1RpcChannel,
133
+ web_api: UserWebApiClient,
129
134
  cache: Cache,
130
135
  map_parser_config: MapParserConfig | None = None,
131
136
  ) -> None:
@@ -134,6 +139,7 @@ class PropertiesApi(Trait):
134
139
  self._rpc_channel = rpc_channel
135
140
  self._mqtt_rpc_channel = mqtt_rpc_channel
136
141
  self._map_rpc_channel = map_rpc_channel
142
+ self._web_api = web_api
137
143
  self._cache = cache
138
144
 
139
145
  self.status = StatusTrait(product)
@@ -144,6 +150,7 @@ class PropertiesApi(Trait):
144
150
  self.home = HomeTrait(self.status, self.maps, self.map_content, self.rooms, cache)
145
151
  self.device_features = DeviceFeaturesTrait(product.product_nickname, cache)
146
152
  self.network_info = NetworkInfoTrait(device_uid, cache)
153
+ self.routines = RoutinesTrait(device_uid, web_api)
147
154
 
148
155
  # Dynamically create any traits that need to be populated
149
156
  for item in fields(self):
@@ -267,6 +274,7 @@ def create(
267
274
  rpc_channel: V1RpcChannel,
268
275
  mqtt_rpc_channel: V1RpcChannel,
269
276
  map_rpc_channel: V1RpcChannel,
277
+ web_api: UserWebApiClient,
270
278
  cache: Cache,
271
279
  map_parser_config: MapParserConfig | None = None,
272
280
  ) -> PropertiesApi:
@@ -278,6 +286,7 @@ def create(
278
286
  rpc_channel,
279
287
  mqtt_rpc_channel,
280
288
  map_rpc_channel,
289
+ web_api,
281
290
  cache,
282
291
  map_parser_config,
283
292
  )
@@ -0,0 +1,26 @@
1
+ """Routines trait for V1 devices."""
2
+
3
+ from roborock.data.containers import HomeDataScene
4
+ from roborock.web_api import UserWebApiClient
5
+
6
+
7
+ class RoutinesTrait:
8
+ """Trait for interacting with routines."""
9
+
10
+ def __init__(self, device_id: str, web_api: UserWebApiClient) -> None:
11
+ """Initialize the routines trait."""
12
+ self._device_id = device_id
13
+ self._web_api = web_api
14
+
15
+ async def get_routines(self) -> list[HomeDataScene]:
16
+ """Get available routines."""
17
+ return await self._web_api.get_routines(self._device_id)
18
+
19
+ async def execute_routine(self, routine_id: int) -> None:
20
+ """Execute a routine by its ID.
21
+
22
+ Technically, routines are per-device, but the API does not
23
+ require the device ID to execute them. This can execute a
24
+ routine for any device but it is exposed here for convenience.
25
+ """
26
+ await self._web_api.execute_routine(routine_id)
@@ -725,3 +725,11 @@ class UserWebApiClient:
725
725
  async def get_home_data(self) -> HomeData:
726
726
  """Fetch home data using the API client."""
727
727
  return await self._web_api.get_home_data_v3(self._user_data)
728
+
729
+ async def get_routines(self, device_id: str) -> list[HomeDataScene]:
730
+ """Fetch routines (scenes) for a specific device."""
731
+ return await self._web_api.get_scenes(self._user_data, device_id)
732
+
733
+ async def execute_routine(self, scene_id: int) -> None:
734
+ """Execute a specific routine (scene) by its ID."""
735
+ await self._web_api.execute_scene(self._user_data, scene_id)
File without changes