python-roborock 7.12.2__tar.gz → 7.12.3__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.12.2 → python_roborock-7.12.3}/PKG-INFO +1 -1
  2. {python_roborock-7.12.2 → python_roborock-7.12.3}/pyproject.toml +1 -1
  3. {python_roborock-7.12.2 → python_roborock-7.12.3}/roborock/data/v1/v1_containers.py +53 -29
  4. {python_roborock-7.12.2 → python_roborock-7.12.3}/roborock/devices/traits/v1/status.py +17 -0
  5. {python_roborock-7.12.2 → python_roborock-7.12.3}/.gitignore +0 -0
  6. {python_roborock-7.12.2 → python_roborock-7.12.3}/LICENSE +0 -0
  7. {python_roborock-7.12.2 → python_roborock-7.12.3}/README.md +0 -0
  8. {python_roborock-7.12.2 → python_roborock-7.12.3}/roborock/__init__.py +0 -0
  9. {python_roborock-7.12.2 → python_roborock-7.12.3}/roborock/broadcast_protocol.py +0 -0
  10. {python_roborock-7.12.2 → python_roborock-7.12.3}/roborock/callbacks.py +0 -0
  11. {python_roborock-7.12.2 → python_roborock-7.12.3}/roborock/cli.py +0 -0
  12. {python_roborock-7.12.2 → python_roborock-7.12.3}/roborock/const.py +0 -0
  13. {python_roborock-7.12.2 → python_roborock-7.12.3}/roborock/data/__init__.py +0 -0
  14. {python_roborock-7.12.2 → python_roborock-7.12.3}/roborock/data/b01_q10/__init__.py +0 -0
  15. {python_roborock-7.12.2 → python_roborock-7.12.3}/roborock/data/b01_q10/b01_q10_code_mappings.py +0 -0
  16. {python_roborock-7.12.2 → python_roborock-7.12.3}/roborock/data/b01_q10/b01_q10_containers.py +0 -0
  17. {python_roborock-7.12.2 → python_roborock-7.12.3}/roborock/data/b01_q7/__init__.py +0 -0
  18. {python_roborock-7.12.2 → python_roborock-7.12.3}/roborock/data/b01_q7/b01_q7_code_mappings.py +0 -0
  19. {python_roborock-7.12.2 → python_roborock-7.12.3}/roborock/data/b01_q7/b01_q7_containers.py +0 -0
  20. {python_roborock-7.12.2 → python_roborock-7.12.3}/roborock/data/code_mappings.py +0 -0
  21. {python_roborock-7.12.2 → python_roborock-7.12.3}/roborock/data/containers.py +0 -0
  22. {python_roborock-7.12.2 → python_roborock-7.12.3}/roborock/data/dyad/__init__.py +0 -0
  23. {python_roborock-7.12.2 → python_roborock-7.12.3}/roborock/data/dyad/dyad_code_mappings.py +0 -0
  24. {python_roborock-7.12.2 → python_roborock-7.12.3}/roborock/data/dyad/dyad_containers.py +0 -0
  25. {python_roborock-7.12.2 → python_roborock-7.12.3}/roborock/data/mower/__init__.py +0 -0
  26. {python_roborock-7.12.2 → python_roborock-7.12.3}/roborock/data/mower/mower_code_mappings.py +0 -0
  27. {python_roborock-7.12.2 → python_roborock-7.12.3}/roborock/data/mower/mower_containers.py +0 -0
  28. {python_roborock-7.12.2 → python_roborock-7.12.3}/roborock/data/v1/__init__.py +0 -0
  29. {python_roborock-7.12.2 → python_roborock-7.12.3}/roborock/data/v1/v1_clean_modes.py +0 -0
  30. {python_roborock-7.12.2 → python_roborock-7.12.3}/roborock/data/v1/v1_code_mappings.py +0 -0
  31. {python_roborock-7.12.2 → python_roborock-7.12.3}/roborock/data/zeo/__init__.py +0 -0
  32. {python_roborock-7.12.2 → python_roborock-7.12.3}/roborock/data/zeo/zeo_code_mappings.py +0 -0
  33. {python_roborock-7.12.2 → python_roborock-7.12.3}/roborock/data/zeo/zeo_containers.py +0 -0
  34. {python_roborock-7.12.2 → python_roborock-7.12.3}/roborock/device_features.py +0 -0
  35. {python_roborock-7.12.2 → python_roborock-7.12.3}/roborock/devices/README.md +0 -0
  36. {python_roborock-7.12.2 → python_roborock-7.12.3}/roborock/devices/__init__.py +0 -0
  37. {python_roborock-7.12.2 → python_roborock-7.12.3}/roborock/devices/cache.py +0 -0
  38. {python_roborock-7.12.2 → python_roborock-7.12.3}/roborock/devices/device.py +0 -0
  39. {python_roborock-7.12.2 → python_roborock-7.12.3}/roborock/devices/device_manager.py +0 -0
  40. {python_roborock-7.12.2 → python_roborock-7.12.3}/roborock/devices/file_cache.py +0 -0
  41. {python_roborock-7.12.2 → python_roborock-7.12.3}/roborock/devices/rpc/__init__.py +0 -0
  42. {python_roborock-7.12.2 → python_roborock-7.12.3}/roborock/devices/rpc/a01_channel.py +0 -0
  43. {python_roborock-7.12.2 → python_roborock-7.12.3}/roborock/devices/rpc/b01_q10_channel.py +0 -0
  44. {python_roborock-7.12.2 → python_roborock-7.12.3}/roborock/devices/rpc/b01_q7_channel.py +0 -0
  45. {python_roborock-7.12.2 → python_roborock-7.12.3}/roborock/devices/rpc/v1_channel.py +0 -0
  46. {python_roborock-7.12.2 → python_roborock-7.12.3}/roborock/devices/traits/__init__.py +0 -0
  47. {python_roborock-7.12.2 → python_roborock-7.12.3}/roborock/devices/traits/a01/__init__.py +0 -0
  48. {python_roborock-7.12.2 → python_roborock-7.12.3}/roborock/devices/traits/a01/device_feature.py +0 -0
  49. {python_roborock-7.12.2 → python_roborock-7.12.3}/roborock/devices/traits/b01/__init__.py +0 -0
  50. {python_roborock-7.12.2 → python_roborock-7.12.3}/roborock/devices/traits/b01/q10/__init__.py +0 -0
  51. {python_roborock-7.12.2 → python_roborock-7.12.3}/roborock/devices/traits/b01/q10/button_light.py +0 -0
  52. {python_roborock-7.12.2 → python_roborock-7.12.3}/roborock/devices/traits/b01/q10/child_lock.py +0 -0
  53. {python_roborock-7.12.2 → python_roborock-7.12.3}/roborock/devices/traits/b01/q10/clean_history.py +0 -0
  54. {python_roborock-7.12.2 → python_roborock-7.12.3}/roborock/devices/traits/b01/q10/command.py +0 -0
  55. {python_roborock-7.12.2 → python_roborock-7.12.3}/roborock/devices/traits/b01/q10/common.py +0 -0
  56. {python_roborock-7.12.2 → python_roborock-7.12.3}/roborock/devices/traits/b01/q10/consumable.py +0 -0
  57. {python_roborock-7.12.2 → python_roborock-7.12.3}/roborock/devices/traits/b01/q10/do_not_disturb.py +0 -0
  58. {python_roborock-7.12.2 → python_roborock-7.12.3}/roborock/devices/traits/b01/q10/dust_collection.py +0 -0
  59. {python_roborock-7.12.2 → python_roborock-7.12.3}/roborock/devices/traits/b01/q10/goto.py +0 -0
  60. {python_roborock-7.12.2 → python_roborock-7.12.3}/roborock/devices/traits/b01/q10/map.py +0 -0
  61. {python_roborock-7.12.2 → python_roborock-7.12.3}/roborock/devices/traits/b01/q10/maps.py +0 -0
  62. {python_roborock-7.12.2 → python_roborock-7.12.3}/roborock/devices/traits/b01/q10/network_info.py +0 -0
  63. {python_roborock-7.12.2 → python_roborock-7.12.3}/roborock/devices/traits/b01/q10/remote.py +0 -0
  64. {python_roborock-7.12.2 → python_roborock-7.12.3}/roborock/devices/traits/b01/q10/status.py +0 -0
  65. {python_roborock-7.12.2 → python_roborock-7.12.3}/roborock/devices/traits/b01/q10/vacuum.py +0 -0
  66. {python_roborock-7.12.2 → python_roborock-7.12.3}/roborock/devices/traits/b01/q10/volume.py +0 -0
  67. {python_roborock-7.12.2 → python_roborock-7.12.3}/roborock/devices/traits/b01/q7/__init__.py +0 -0
  68. {python_roborock-7.12.2 → python_roborock-7.12.3}/roborock/devices/traits/b01/q7/clean_summary.py +0 -0
  69. {python_roborock-7.12.2 → python_roborock-7.12.3}/roborock/devices/traits/b01/q7/map.py +0 -0
  70. {python_roborock-7.12.2 → python_roborock-7.12.3}/roborock/devices/traits/b01/q7/map_content.py +0 -0
  71. {python_roborock-7.12.2 → python_roborock-7.12.3}/roborock/devices/traits/common.py +0 -0
  72. {python_roborock-7.12.2 → python_roborock-7.12.3}/roborock/devices/traits/traits_mixin.py +0 -0
  73. {python_roborock-7.12.2 → python_roborock-7.12.3}/roborock/devices/traits/v1/__init__.py +0 -0
  74. {python_roborock-7.12.2 → python_roborock-7.12.3}/roborock/devices/traits/v1/child_lock.py +0 -0
  75. {python_roborock-7.12.2 → python_roborock-7.12.3}/roborock/devices/traits/v1/clean_summary.py +0 -0
  76. {python_roborock-7.12.2 → python_roborock-7.12.3}/roborock/devices/traits/v1/command.py +0 -0
  77. {python_roborock-7.12.2 → python_roborock-7.12.3}/roborock/devices/traits/v1/common.py +0 -0
  78. {python_roborock-7.12.2 → python_roborock-7.12.3}/roborock/devices/traits/v1/consumeable.py +0 -0
  79. {python_roborock-7.12.2 → python_roborock-7.12.3}/roborock/devices/traits/v1/device_features.py +0 -0
  80. {python_roborock-7.12.2 → python_roborock-7.12.3}/roborock/devices/traits/v1/do_not_disturb.py +0 -0
  81. {python_roborock-7.12.2 → python_roborock-7.12.3}/roborock/devices/traits/v1/dust_collection_mode.py +0 -0
  82. {python_roborock-7.12.2 → python_roborock-7.12.3}/roborock/devices/traits/v1/flow_led_status.py +0 -0
  83. {python_roborock-7.12.2 → python_roborock-7.12.3}/roborock/devices/traits/v1/home.py +0 -0
  84. {python_roborock-7.12.2 → python_roborock-7.12.3}/roborock/devices/traits/v1/led_status.py +0 -0
  85. {python_roborock-7.12.2 → python_roborock-7.12.3}/roborock/devices/traits/v1/map_content.py +0 -0
  86. {python_roborock-7.12.2 → python_roborock-7.12.3}/roborock/devices/traits/v1/maps.py +0 -0
  87. {python_roborock-7.12.2 → python_roborock-7.12.3}/roborock/devices/traits/v1/mop_dryer.py +0 -0
  88. {python_roborock-7.12.2 → python_roborock-7.12.3}/roborock/devices/traits/v1/network_info.py +0 -0
  89. {python_roborock-7.12.2 → python_roborock-7.12.3}/roborock/devices/traits/v1/obstacle_photos.py +0 -0
  90. {python_roborock-7.12.2 → python_roborock-7.12.3}/roborock/devices/traits/v1/rooms.py +0 -0
  91. {python_roborock-7.12.2 → python_roborock-7.12.3}/roborock/devices/traits/v1/routines.py +0 -0
  92. {python_roborock-7.12.2 → python_roborock-7.12.3}/roborock/devices/traits/v1/smart_wash_params.py +0 -0
  93. {python_roborock-7.12.2 → python_roborock-7.12.3}/roborock/devices/traits/v1/valley_electricity_timer.py +0 -0
  94. {python_roborock-7.12.2 → python_roborock-7.12.3}/roborock/devices/traits/v1/volume.py +0 -0
  95. {python_roborock-7.12.2 → python_roborock-7.12.3}/roborock/devices/traits/v1/wash_towel_mode.py +0 -0
  96. {python_roborock-7.12.2 → python_roborock-7.12.3}/roborock/devices/transport/__init__.py +0 -0
  97. {python_roborock-7.12.2 → python_roborock-7.12.3}/roborock/devices/transport/channel.py +0 -0
  98. {python_roborock-7.12.2 → python_roborock-7.12.3}/roborock/devices/transport/local_channel.py +0 -0
  99. {python_roborock-7.12.2 → python_roborock-7.12.3}/roborock/devices/transport/mqtt_channel.py +0 -0
  100. {python_roborock-7.12.2 → python_roborock-7.12.3}/roborock/diagnostics.py +0 -0
  101. {python_roborock-7.12.2 → python_roborock-7.12.3}/roborock/exceptions.py +0 -0
  102. {python_roborock-7.12.2 → python_roborock-7.12.3}/roborock/map/__init__.py +0 -0
  103. {python_roborock-7.12.2 → python_roborock-7.12.3}/roborock/map/b01_grid_layers.py +0 -0
  104. {python_roborock-7.12.2 → python_roborock-7.12.3}/roborock/map/b01_map_parser.py +0 -0
  105. {python_roborock-7.12.2 → python_roborock-7.12.3}/roborock/map/b01_q10_map_parser.py +0 -0
  106. {python_roborock-7.12.2 → python_roborock-7.12.3}/roborock/map/b01_q10_overlays.py +0 -0
  107. {python_roborock-7.12.2 → python_roborock-7.12.3}/roborock/map/b01_q10_render.py +0 -0
  108. {python_roborock-7.12.2 → python_roborock-7.12.3}/roborock/map/map_parser.py +0 -0
  109. {python_roborock-7.12.2 → python_roborock-7.12.3}/roborock/map/proto/__init__.py +0 -0
  110. {python_roborock-7.12.2 → python_roborock-7.12.3}/roborock/map/proto/b01_scmap.proto +0 -0
  111. {python_roborock-7.12.2 → python_roborock-7.12.3}/roborock/map/proto/b01_scmap_pb2.py +0 -0
  112. {python_roborock-7.12.2 → python_roborock-7.12.3}/roborock/map/room_colors.py +0 -0
  113. {python_roborock-7.12.2 → python_roborock-7.12.3}/roborock/mqtt/__init__.py +0 -0
  114. {python_roborock-7.12.2 → python_roborock-7.12.3}/roborock/mqtt/health_manager.py +0 -0
  115. {python_roborock-7.12.2 → python_roborock-7.12.3}/roborock/mqtt/roborock_session.py +0 -0
  116. {python_roborock-7.12.2 → python_roborock-7.12.3}/roborock/mqtt/session.py +0 -0
  117. {python_roborock-7.12.2 → python_roborock-7.12.3}/roborock/protocol.py +0 -0
  118. {python_roborock-7.12.2 → python_roborock-7.12.3}/roborock/protocols/__init__.py +0 -0
  119. {python_roborock-7.12.2 → python_roborock-7.12.3}/roborock/protocols/a01_protocol.py +0 -0
  120. {python_roborock-7.12.2 → python_roborock-7.12.3}/roborock/protocols/b01_q10_protocol.py +0 -0
  121. {python_roborock-7.12.2 → python_roborock-7.12.3}/roborock/protocols/b01_q7_protocol.py +0 -0
  122. {python_roborock-7.12.2 → python_roborock-7.12.3}/roborock/protocols/v1_protocol.py +0 -0
  123. {python_roborock-7.12.2 → python_roborock-7.12.3}/roborock/py.typed +0 -0
  124. {python_roborock-7.12.2 → python_roborock-7.12.3}/roborock/roborock_message.py +0 -0
  125. {python_roborock-7.12.2 → python_roborock-7.12.3}/roborock/roborock_typing.py +0 -0
  126. {python_roborock-7.12.2 → python_roborock-7.12.3}/roborock/testing/__init__.py +0 -0
  127. {python_roborock-7.12.2 → python_roborock-7.12.3}/roborock/testing/a01_simulator.py +0 -0
  128. {python_roborock-7.12.2 → python_roborock-7.12.3}/roborock/testing/b01_q10_simulator.py +0 -0
  129. {python_roborock-7.12.2 → python_roborock-7.12.3}/roborock/testing/channel.py +0 -0
  130. {python_roborock-7.12.2 → python_roborock-7.12.3}/roborock/testing/cloud.py +0 -0
  131. {python_roborock-7.12.2 → python_roborock-7.12.3}/roborock/testing/simulator.py +0 -0
  132. {python_roborock-7.12.2 → python_roborock-7.12.3}/roborock/testing/v1_simulator.py +0 -0
  133. {python_roborock-7.12.2 → python_roborock-7.12.3}/roborock/util.py +0 -0
  134. {python_roborock-7.12.2 → python_roborock-7.12.3}/roborock/web_api.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.5
2
2
  Name: python-roborock
3
- Version: 7.12.2
3
+ Version: 7.12.3
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.12.2"
3
+ version = "7.12.3"
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"
@@ -1,5 +1,6 @@
1
1
  import datetime
2
2
  import logging
3
+ import warnings
3
4
  from dataclasses import dataclass, field
4
5
  from enum import StrEnum
5
6
  from typing import Any
@@ -73,6 +74,39 @@ class StatusField(FieldNameBase):
73
74
  RDT = "rdt"
74
75
 
75
76
 
77
+ def get_dock_state(
78
+ state: RoborockStateCode | int | None,
79
+ battery: int | None,
80
+ charge_status: RoborockChargeStatus | int | None = None,
81
+ *,
82
+ is_supported_valley_electricity: bool = False,
83
+ ) -> RoborockDockState:
84
+ """Return the dock state, accounting for off-peak charging support."""
85
+ if state is None or state == RoborockStateCode.unknown:
86
+ return RoborockDockState.unknown
87
+
88
+ # 6. DUSTING
89
+ if state == RoborockStateCode.emptying_the_bin:
90
+ return RoborockDockState.dusting
91
+
92
+ # 5. FULL
93
+ if state == RoborockStateCode.charging_complete or (state == RoborockStateCode.charging and battery == 100):
94
+ return RoborockDockState.full
95
+
96
+ # 3 & 4. CHARGING and CHARGE_WAITING
97
+ if state == RoborockStateCode.charging:
98
+ if is_supported_valley_electricity and charge_status == RoborockChargeStatus.charge_waiting:
99
+ return RoborockDockState.off_peak_waiting
100
+ return RoborockDockState.charging
101
+
102
+ # 2. RECHARGING
103
+ if state in (RoborockStateCode.returning_home, RoborockStateCode.docking):
104
+ return RoborockDockState.returning
105
+
106
+ # 1. IDLE (Not on dock, or doing something else)
107
+ return RoborockDockState.idle
108
+
109
+
76
110
  @dataclass
77
111
  class StatusV2(RoborockBase):
78
112
  """The result of a GET_STATUS API request."""
@@ -219,36 +253,26 @@ class StatusV2(RoborockBase):
219
253
  def dock_state(self) -> RoborockDockState:
220
254
  """A synthesized, high-level dock state reflecting the UI's display.
221
255
 
222
- This property simplifies integration by handling the complex logic
223
- of checking state, charge_status, and battery level simultaneously. It handles
224
- newer off-peak charging logic seamlessly while maintaining backwards compatibility
225
- with older devices.
256
+ .. deprecated::
257
+ Use StatusTrait.dock_state or get_dock_state instead.
226
258
  """
227
- if self.state is None or self.state == RoborockStateCode.unknown:
228
- return RoborockDockState.unknown
229
-
230
- # 6. DUSTING
231
- if self.state == RoborockStateCode.emptying_the_bin:
232
- return RoborockDockState.dusting
233
-
234
- # 5. FULL
235
- if self.state == RoborockStateCode.charging_complete or (
236
- self.state == RoborockStateCode.charging and self.battery == 100
237
- ):
238
- return RoborockDockState.full
239
-
240
- # 3 & 4. CHARGING and CHARGE_WAITING
241
- if self.state == RoborockStateCode.charging:
242
- if self.charge_status == RoborockChargeStatus.charge_waiting:
243
- return RoborockDockState.off_peak_waiting
244
- return RoborockDockState.charging
245
-
246
- # 2. RECHARGING
247
- if self.state in (RoborockStateCode.returning_home, RoborockStateCode.docking):
248
- return RoborockDockState.returning
249
-
250
- # 1. IDLE (Not on dock, or doing something else)
251
- return RoborockDockState.idle
259
+ warnings.warn(
260
+ "StatusV2.dock_state is deprecated and will be removed in a future release. "
261
+ "Use StatusTrait.dock_state or get_dock_state instead.",
262
+ DeprecationWarning,
263
+ stacklevel=2,
264
+ )
265
+ return get_dock_state(
266
+ state=self.state,
267
+ battery=self.battery,
268
+ charge_status=self.charge_status,
269
+ is_supported_valley_electricity=True,
270
+ )
271
+
272
+ @property
273
+ def is_battery_charging(self) -> bool:
274
+ """Return whether the battery is actively charging."""
275
+ return self.dock_state == RoborockDockState.charging
252
276
 
253
277
  def __repr__(self) -> str:
254
278
  return _attr_repr(self)
@@ -5,6 +5,7 @@ from typing import Any
5
5
  from roborock import (
6
6
  CleaningMode,
7
7
  CleanRoutes,
8
+ RoborockDockState,
8
9
  StatusV2,
9
10
  VacuumModes,
10
11
  WaterModes,
@@ -13,6 +14,7 @@ from roborock import (
13
14
  get_cleaning_mode_options,
14
15
  get_cleaning_mode_parameters,
15
16
  get_current_cleaning_mode,
17
+ get_dock_state,
16
18
  get_water_mode_mapping,
17
19
  get_water_modes,
18
20
  get_water_slide_mode_name,
@@ -66,6 +68,21 @@ class StatusTrait(StatusV2, common.V1TraitMixin, TraitUpdateListener):
66
68
  self._device_features_trait = device_feature_trait
67
69
  self._region = region
68
70
 
71
+ @property
72
+ def dock_state(self) -> RoborockDockState:
73
+ """Return the feature-aware dock state used by the Roborock app."""
74
+ return get_dock_state(
75
+ state=self.state,
76
+ battery=self.battery,
77
+ charge_status=self.charge_status,
78
+ is_supported_valley_electricity=self._device_features_trait.is_supported_valley_electricity,
79
+ )
80
+
81
+ @property
82
+ def is_battery_charging(self) -> bool:
83
+ """Return whether the battery is actively charging."""
84
+ return self.dock_state == RoborockDockState.charging
85
+
69
86
  @cached_property
70
87
  def fan_speed_options(self) -> list[VacuumModes]:
71
88
  return get_clean_modes(self._device_features_trait)