python-roborock 5.23.0__tar.gz → 5.24.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 (117) hide show
  1. {python_roborock-5.23.0 → python_roborock-5.24.0}/PKG-INFO +1 -1
  2. {python_roborock-5.23.0 → python_roborock-5.24.0}/pyproject.toml +1 -1
  3. {python_roborock-5.23.0 → python_roborock-5.24.0}/roborock/devices/rpc/v1_channel.py +8 -2
  4. {python_roborock-5.23.0 → python_roborock-5.24.0}/roborock/devices/traits/v1/home.py +32 -3
  5. {python_roborock-5.23.0 → python_roborock-5.24.0}/.gitignore +0 -0
  6. {python_roborock-5.23.0 → python_roborock-5.24.0}/LICENSE +0 -0
  7. {python_roborock-5.23.0 → python_roborock-5.24.0}/README.md +0 -0
  8. {python_roborock-5.23.0 → python_roborock-5.24.0}/roborock/__init__.py +0 -0
  9. {python_roborock-5.23.0 → python_roborock-5.24.0}/roborock/broadcast_protocol.py +0 -0
  10. {python_roborock-5.23.0 → python_roborock-5.24.0}/roborock/callbacks.py +0 -0
  11. {python_roborock-5.23.0 → python_roborock-5.24.0}/roborock/cli.py +0 -0
  12. {python_roborock-5.23.0 → python_roborock-5.24.0}/roborock/const.py +0 -0
  13. {python_roborock-5.23.0 → python_roborock-5.24.0}/roborock/data/__init__.py +0 -0
  14. {python_roborock-5.23.0 → python_roborock-5.24.0}/roborock/data/b01_q10/__init__.py +0 -0
  15. {python_roborock-5.23.0 → python_roborock-5.24.0}/roborock/data/b01_q10/b01_q10_code_mappings.py +0 -0
  16. {python_roborock-5.23.0 → python_roborock-5.24.0}/roborock/data/b01_q10/b01_q10_containers.py +0 -0
  17. {python_roborock-5.23.0 → python_roborock-5.24.0}/roborock/data/b01_q7/__init__.py +0 -0
  18. {python_roborock-5.23.0 → python_roborock-5.24.0}/roborock/data/b01_q7/b01_q7_code_mappings.py +0 -0
  19. {python_roborock-5.23.0 → python_roborock-5.24.0}/roborock/data/b01_q7/b01_q7_containers.py +0 -0
  20. {python_roborock-5.23.0 → python_roborock-5.24.0}/roborock/data/code_mappings.py +0 -0
  21. {python_roborock-5.23.0 → python_roborock-5.24.0}/roborock/data/containers.py +0 -0
  22. {python_roborock-5.23.0 → python_roborock-5.24.0}/roborock/data/dyad/__init__.py +0 -0
  23. {python_roborock-5.23.0 → python_roborock-5.24.0}/roborock/data/dyad/dyad_code_mappings.py +0 -0
  24. {python_roborock-5.23.0 → python_roborock-5.24.0}/roborock/data/dyad/dyad_containers.py +0 -0
  25. {python_roborock-5.23.0 → python_roborock-5.24.0}/roborock/data/v1/__init__.py +0 -0
  26. {python_roborock-5.23.0 → python_roborock-5.24.0}/roborock/data/v1/v1_clean_modes.py +0 -0
  27. {python_roborock-5.23.0 → python_roborock-5.24.0}/roborock/data/v1/v1_code_mappings.py +0 -0
  28. {python_roborock-5.23.0 → python_roborock-5.24.0}/roborock/data/v1/v1_containers.py +0 -0
  29. {python_roborock-5.23.0 → python_roborock-5.24.0}/roborock/data/zeo/__init__.py +0 -0
  30. {python_roborock-5.23.0 → python_roborock-5.24.0}/roborock/data/zeo/zeo_code_mappings.py +0 -0
  31. {python_roborock-5.23.0 → python_roborock-5.24.0}/roborock/data/zeo/zeo_containers.py +0 -0
  32. {python_roborock-5.23.0 → python_roborock-5.24.0}/roborock/device_features.py +0 -0
  33. {python_roborock-5.23.0 → python_roborock-5.24.0}/roborock/devices/README.md +0 -0
  34. {python_roborock-5.23.0 → python_roborock-5.24.0}/roborock/devices/__init__.py +0 -0
  35. {python_roborock-5.23.0 → python_roborock-5.24.0}/roborock/devices/cache.py +0 -0
  36. {python_roborock-5.23.0 → python_roborock-5.24.0}/roborock/devices/device.py +0 -0
  37. {python_roborock-5.23.0 → python_roborock-5.24.0}/roborock/devices/device_manager.py +0 -0
  38. {python_roborock-5.23.0 → python_roborock-5.24.0}/roborock/devices/file_cache.py +0 -0
  39. {python_roborock-5.23.0 → python_roborock-5.24.0}/roborock/devices/rpc/__init__.py +0 -0
  40. {python_roborock-5.23.0 → python_roborock-5.24.0}/roborock/devices/rpc/a01_channel.py +0 -0
  41. {python_roborock-5.23.0 → python_roborock-5.24.0}/roborock/devices/rpc/b01_q10_channel.py +0 -0
  42. {python_roborock-5.23.0 → python_roborock-5.24.0}/roborock/devices/rpc/b01_q7_channel.py +0 -0
  43. {python_roborock-5.23.0 → python_roborock-5.24.0}/roborock/devices/traits/__init__.py +0 -0
  44. {python_roborock-5.23.0 → python_roborock-5.24.0}/roborock/devices/traits/a01/__init__.py +0 -0
  45. {python_roborock-5.23.0 → python_roborock-5.24.0}/roborock/devices/traits/b01/__init__.py +0 -0
  46. {python_roborock-5.23.0 → python_roborock-5.24.0}/roborock/devices/traits/b01/q10/__init__.py +0 -0
  47. {python_roborock-5.23.0 → python_roborock-5.24.0}/roborock/devices/traits/b01/q10/button_light.py +0 -0
  48. {python_roborock-5.23.0 → python_roborock-5.24.0}/roborock/devices/traits/b01/q10/child_lock.py +0 -0
  49. {python_roborock-5.23.0 → python_roborock-5.24.0}/roborock/devices/traits/b01/q10/clean_history.py +0 -0
  50. {python_roborock-5.23.0 → python_roborock-5.24.0}/roborock/devices/traits/b01/q10/command.py +0 -0
  51. {python_roborock-5.23.0 → python_roborock-5.24.0}/roborock/devices/traits/b01/q10/common.py +0 -0
  52. {python_roborock-5.23.0 → python_roborock-5.24.0}/roborock/devices/traits/b01/q10/consumable.py +0 -0
  53. {python_roborock-5.23.0 → python_roborock-5.24.0}/roborock/devices/traits/b01/q10/do_not_disturb.py +0 -0
  54. {python_roborock-5.23.0 → python_roborock-5.24.0}/roborock/devices/traits/b01/q10/dust_collection.py +0 -0
  55. {python_roborock-5.23.0 → python_roborock-5.24.0}/roborock/devices/traits/b01/q10/map.py +0 -0
  56. {python_roborock-5.23.0 → python_roborock-5.24.0}/roborock/devices/traits/b01/q10/network_info.py +0 -0
  57. {python_roborock-5.23.0 → python_roborock-5.24.0}/roborock/devices/traits/b01/q10/remote.py +0 -0
  58. {python_roborock-5.23.0 → python_roborock-5.24.0}/roborock/devices/traits/b01/q10/status.py +0 -0
  59. {python_roborock-5.23.0 → python_roborock-5.24.0}/roborock/devices/traits/b01/q10/vacuum.py +0 -0
  60. {python_roborock-5.23.0 → python_roborock-5.24.0}/roborock/devices/traits/b01/q10/volume.py +0 -0
  61. {python_roborock-5.23.0 → python_roborock-5.24.0}/roborock/devices/traits/b01/q7/__init__.py +0 -0
  62. {python_roborock-5.23.0 → python_roborock-5.24.0}/roborock/devices/traits/b01/q7/clean_summary.py +0 -0
  63. {python_roborock-5.23.0 → python_roborock-5.24.0}/roborock/devices/traits/b01/q7/map.py +0 -0
  64. {python_roborock-5.23.0 → python_roborock-5.24.0}/roborock/devices/traits/b01/q7/map_content.py +0 -0
  65. {python_roborock-5.23.0 → python_roborock-5.24.0}/roborock/devices/traits/common.py +0 -0
  66. {python_roborock-5.23.0 → python_roborock-5.24.0}/roborock/devices/traits/traits_mixin.py +0 -0
  67. {python_roborock-5.23.0 → python_roborock-5.24.0}/roborock/devices/traits/v1/__init__.py +0 -0
  68. {python_roborock-5.23.0 → python_roborock-5.24.0}/roborock/devices/traits/v1/child_lock.py +0 -0
  69. {python_roborock-5.23.0 → python_roborock-5.24.0}/roborock/devices/traits/v1/clean_summary.py +0 -0
  70. {python_roborock-5.23.0 → python_roborock-5.24.0}/roborock/devices/traits/v1/command.py +0 -0
  71. {python_roborock-5.23.0 → python_roborock-5.24.0}/roborock/devices/traits/v1/common.py +0 -0
  72. {python_roborock-5.23.0 → python_roborock-5.24.0}/roborock/devices/traits/v1/consumeable.py +0 -0
  73. {python_roborock-5.23.0 → python_roborock-5.24.0}/roborock/devices/traits/v1/device_features.py +0 -0
  74. {python_roborock-5.23.0 → python_roborock-5.24.0}/roborock/devices/traits/v1/do_not_disturb.py +0 -0
  75. {python_roborock-5.23.0 → python_roborock-5.24.0}/roborock/devices/traits/v1/dust_collection_mode.py +0 -0
  76. {python_roborock-5.23.0 → python_roborock-5.24.0}/roborock/devices/traits/v1/flow_led_status.py +0 -0
  77. {python_roborock-5.23.0 → python_roborock-5.24.0}/roborock/devices/traits/v1/led_status.py +0 -0
  78. {python_roborock-5.23.0 → python_roborock-5.24.0}/roborock/devices/traits/v1/map_content.py +0 -0
  79. {python_roborock-5.23.0 → python_roborock-5.24.0}/roborock/devices/traits/v1/maps.py +0 -0
  80. {python_roborock-5.23.0 → python_roborock-5.24.0}/roborock/devices/traits/v1/network_info.py +0 -0
  81. {python_roborock-5.23.0 → python_roborock-5.24.0}/roborock/devices/traits/v1/rooms.py +0 -0
  82. {python_roborock-5.23.0 → python_roborock-5.24.0}/roborock/devices/traits/v1/routines.py +0 -0
  83. {python_roborock-5.23.0 → python_roborock-5.24.0}/roborock/devices/traits/v1/smart_wash_params.py +0 -0
  84. {python_roborock-5.23.0 → python_roborock-5.24.0}/roborock/devices/traits/v1/status.py +0 -0
  85. {python_roborock-5.23.0 → python_roborock-5.24.0}/roborock/devices/traits/v1/valley_electricity_timer.py +0 -0
  86. {python_roborock-5.23.0 → python_roborock-5.24.0}/roborock/devices/traits/v1/volume.py +0 -0
  87. {python_roborock-5.23.0 → python_roborock-5.24.0}/roborock/devices/traits/v1/wash_towel_mode.py +0 -0
  88. {python_roborock-5.23.0 → python_roborock-5.24.0}/roborock/devices/transport/__init__.py +0 -0
  89. {python_roborock-5.23.0 → python_roborock-5.24.0}/roborock/devices/transport/channel.py +0 -0
  90. {python_roborock-5.23.0 → python_roborock-5.24.0}/roborock/devices/transport/local_channel.py +0 -0
  91. {python_roborock-5.23.0 → python_roborock-5.24.0}/roborock/devices/transport/mqtt_channel.py +0 -0
  92. {python_roborock-5.23.0 → python_roborock-5.24.0}/roborock/diagnostics.py +0 -0
  93. {python_roborock-5.23.0 → python_roborock-5.24.0}/roborock/exceptions.py +0 -0
  94. {python_roborock-5.23.0 → python_roborock-5.24.0}/roborock/map/__init__.py +0 -0
  95. {python_roborock-5.23.0 → python_roborock-5.24.0}/roborock/map/b01_grid_layers.py +0 -0
  96. {python_roborock-5.23.0 → python_roborock-5.24.0}/roborock/map/b01_map_parser.py +0 -0
  97. {python_roborock-5.23.0 → python_roborock-5.24.0}/roborock/map/b01_q10_map_parser.py +0 -0
  98. {python_roborock-5.23.0 → python_roborock-5.24.0}/roborock/map/b01_q10_overlays.py +0 -0
  99. {python_roborock-5.23.0 → python_roborock-5.24.0}/roborock/map/map_parser.py +0 -0
  100. {python_roborock-5.23.0 → python_roborock-5.24.0}/roborock/map/proto/__init__.py +0 -0
  101. {python_roborock-5.23.0 → python_roborock-5.24.0}/roborock/map/proto/b01_scmap.proto +0 -0
  102. {python_roborock-5.23.0 → python_roborock-5.24.0}/roborock/map/proto/b01_scmap_pb2.py +0 -0
  103. {python_roborock-5.23.0 → python_roborock-5.24.0}/roborock/mqtt/__init__.py +0 -0
  104. {python_roborock-5.23.0 → python_roborock-5.24.0}/roborock/mqtt/health_manager.py +0 -0
  105. {python_roborock-5.23.0 → python_roborock-5.24.0}/roborock/mqtt/roborock_session.py +0 -0
  106. {python_roborock-5.23.0 → python_roborock-5.24.0}/roborock/mqtt/session.py +0 -0
  107. {python_roborock-5.23.0 → python_roborock-5.24.0}/roborock/protocol.py +0 -0
  108. {python_roborock-5.23.0 → python_roborock-5.24.0}/roborock/protocols/__init__.py +0 -0
  109. {python_roborock-5.23.0 → python_roborock-5.24.0}/roborock/protocols/a01_protocol.py +0 -0
  110. {python_roborock-5.23.0 → python_roborock-5.24.0}/roborock/protocols/b01_q10_protocol.py +0 -0
  111. {python_roborock-5.23.0 → python_roborock-5.24.0}/roborock/protocols/b01_q7_protocol.py +0 -0
  112. {python_roborock-5.23.0 → python_roborock-5.24.0}/roborock/protocols/v1_protocol.py +0 -0
  113. {python_roborock-5.23.0 → python_roborock-5.24.0}/roborock/py.typed +0 -0
  114. {python_roborock-5.23.0 → python_roborock-5.24.0}/roborock/roborock_message.py +0 -0
  115. {python_roborock-5.23.0 → python_roborock-5.24.0}/roborock/roborock_typing.py +0 -0
  116. {python_roborock-5.23.0 → python_roborock-5.24.0}/roborock/util.py +0 -0
  117. {python_roborock-5.23.0 → python_roborock-5.24.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.23.0
3
+ Version: 5.24.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.23.0"
3
+ version = "5.24.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"
@@ -204,8 +204,14 @@ class V1Channel(Channel):
204
204
 
205
205
  @property
206
206
  def is_mqtt_connected(self) -> bool:
207
- """Return whether MQTT connection is available."""
208
- return self._mqtt_channel.is_connected
207
+ """Return whether MQTT connection is available for the device.
208
+
209
+ This requires the MQTT session to be connected to the broker and
210
+ the subscription to the device's topic to have successfully
211
+ been established (to handle cases where the device is offline
212
+ or deleted).
213
+ """
214
+ return self._mqtt_channel.is_connected and self._mqtt_unsub is not None
209
215
 
210
216
  @property
211
217
  def rpc_channel(self) -> V1RpcChannel:
@@ -18,10 +18,12 @@ the current map's information and room names as needed.
18
18
  import asyncio
19
19
  import base64
20
20
  import logging
21
+ from collections.abc import Callable
21
22
 
22
23
  from roborock.data import CombinedMapInfo, MultiMapsListMapInfo, NamedRoomMapping, RoborockBase
23
24
  from roborock.data.v1.v1_code_mappings import RoborockStateCode
24
25
  from roborock.devices.cache import DeviceCache
26
+ from roborock.devices.traits.common import TraitUpdateListener
25
27
  from roborock.devices.traits.v1 import common
26
28
  from roborock.exceptions import RoborockDeviceBusy, RoborockException, RoborockInvalidStatus
27
29
  from roborock.roborock_typing import RoborockCommand
@@ -36,7 +38,7 @@ _LOGGER = logging.getLogger(__name__)
36
38
  MAP_SLEEP = 3
37
39
 
38
40
 
39
- class HomeTrait(RoborockBase, common.V1TraitMixin):
41
+ class HomeTrait(RoborockBase, common.V1TraitMixin, TraitUpdateListener):
40
42
  """Trait that represents a full view of the home layout."""
41
43
 
42
44
  command = RoborockCommand.GET_MAP_V1 # This is not used
@@ -66,6 +68,7 @@ class HomeTrait(RoborockBase, common.V1TraitMixin):
66
68
  accuracy.
67
69
  """
68
70
  super().__init__()
71
+ TraitUpdateListener.__init__(self, logger=_LOGGER)
69
72
  self._status_trait = status_trait
70
73
  self._maps_trait = maps_trait
71
74
  self._map_content = map_content
@@ -100,6 +103,7 @@ class HomeTrait(RoborockBase, common.V1TraitMixin):
100
103
  _LOGGER.warning("Failed to parse cached home map content, will re-discover: %s", ex)
101
104
  self._home_map_content = {}
102
105
  else:
106
+ self._notify_update()
103
107
  return
104
108
 
105
109
  if self._status_trait.state == RoborockStateCode.cleaning:
@@ -202,6 +206,7 @@ class HomeTrait(RoborockBase, common.V1TraitMixin):
202
206
  map_flag := self._maps_trait.current_map
203
207
  ) is None:
204
208
  _LOGGER.debug("Cannot refresh home data without current map info")
209
+ self._notify_update()
205
210
  return
206
211
 
207
212
  # Refresh the map content to ensure we have the latest image and object positions
@@ -212,10 +217,26 @@ class HomeTrait(RoborockBase, common.V1TraitMixin):
212
217
  map_flag, combined_map_info, new_map_content, update_cache=self._discovery_completed
213
218
  )
214
219
 
220
+ def add_update_listener(self, callback: Callable[[], None]) -> Callable[[], None]:
221
+ """Register a callback when the trait has been updated.
222
+
223
+ Overridden to immediately execute the callback with the current state if populated.
224
+ """
225
+ unsub = super().add_update_listener(callback)
226
+ if self._home_map_info is not None:
227
+ callback()
228
+ return unsub
229
+
215
230
  @property
216
231
  def home_map_info(self) -> dict[int, CombinedMapInfo] | None:
217
232
  """Returns the map information for all cached maps."""
218
- return self._home_map_info
233
+ if self._home_map_info is None or self._maps_trait.map_info is None:
234
+ return self._home_map_info
235
+ return {
236
+ mi.map_flag: value
237
+ for mi in self._maps_trait.map_info
238
+ if (value := self._home_map_info.get(mi.map_flag)) is not None
239
+ }
219
240
 
220
241
  @property
221
242
  def current_map_data(self) -> CombinedMapInfo | None:
@@ -235,7 +256,13 @@ class HomeTrait(RoborockBase, common.V1TraitMixin):
235
256
  @property
236
257
  def home_map_content(self) -> dict[int, MapContent] | None:
237
258
  """Returns the map content for all cached maps."""
238
- return self._home_map_content
259
+ if self._home_map_content is None or self._maps_trait.map_info is None:
260
+ return self._home_map_content
261
+ return {
262
+ mi.map_flag: value
263
+ for mi in self._maps_trait.map_info
264
+ if (value := self._home_map_content.get(mi.map_flag)) is not None
265
+ }
239
266
 
240
267
  async def _update_home_cache(
241
268
  self, home_map_info: dict[int, CombinedMapInfo], home_map_content: dict[int, MapContent]
@@ -251,6 +278,7 @@ class HomeTrait(RoborockBase, common.V1TraitMixin):
251
278
  await self._device_cache.set(device_cache_data)
252
279
  self._home_map_info = home_map_info
253
280
  self._home_map_content = home_map_content
281
+ self._notify_update()
254
282
 
255
283
  async def _update_current_map(
256
284
  self,
@@ -283,3 +311,4 @@ class HomeTrait(RoborockBase, common.V1TraitMixin):
283
311
  if self._home_map_content is None:
284
312
  self._home_map_content = {}
285
313
  self._home_map_content[map_flag] = map_content
314
+ self._notify_update()