python-roborock 7.2.0__tar.gz → 7.2.2__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 (132) hide show
  1. {python_roborock-7.2.0 → python_roborock-7.2.2}/PKG-INFO +1 -1
  2. {python_roborock-7.2.0 → python_roborock-7.2.2}/pyproject.toml +1 -1
  3. {python_roborock-7.2.0 → python_roborock-7.2.2}/roborock/device_features.py +21 -1
  4. {python_roborock-7.2.0 → python_roborock-7.2.2}/roborock/map/b01_q10_render.py +4 -2
  5. {python_roborock-7.2.0 → python_roborock-7.2.2}/.gitignore +0 -0
  6. {python_roborock-7.2.0 → python_roborock-7.2.2}/LICENSE +0 -0
  7. {python_roborock-7.2.0 → python_roborock-7.2.2}/README.md +0 -0
  8. {python_roborock-7.2.0 → python_roborock-7.2.2}/roborock/__init__.py +0 -0
  9. {python_roborock-7.2.0 → python_roborock-7.2.2}/roborock/broadcast_protocol.py +0 -0
  10. {python_roborock-7.2.0 → python_roborock-7.2.2}/roborock/callbacks.py +0 -0
  11. {python_roborock-7.2.0 → python_roborock-7.2.2}/roborock/cli.py +0 -0
  12. {python_roborock-7.2.0 → python_roborock-7.2.2}/roborock/const.py +0 -0
  13. {python_roborock-7.2.0 → python_roborock-7.2.2}/roborock/data/__init__.py +0 -0
  14. {python_roborock-7.2.0 → python_roborock-7.2.2}/roborock/data/b01_q10/__init__.py +0 -0
  15. {python_roborock-7.2.0 → python_roborock-7.2.2}/roborock/data/b01_q10/b01_q10_code_mappings.py +0 -0
  16. {python_roborock-7.2.0 → python_roborock-7.2.2}/roborock/data/b01_q10/b01_q10_containers.py +0 -0
  17. {python_roborock-7.2.0 → python_roborock-7.2.2}/roborock/data/b01_q7/__init__.py +0 -0
  18. {python_roborock-7.2.0 → python_roborock-7.2.2}/roborock/data/b01_q7/b01_q7_code_mappings.py +0 -0
  19. {python_roborock-7.2.0 → python_roborock-7.2.2}/roborock/data/b01_q7/b01_q7_containers.py +0 -0
  20. {python_roborock-7.2.0 → python_roborock-7.2.2}/roborock/data/code_mappings.py +0 -0
  21. {python_roborock-7.2.0 → python_roborock-7.2.2}/roborock/data/containers.py +0 -0
  22. {python_roborock-7.2.0 → python_roborock-7.2.2}/roborock/data/dyad/__init__.py +0 -0
  23. {python_roborock-7.2.0 → python_roborock-7.2.2}/roborock/data/dyad/dyad_code_mappings.py +0 -0
  24. {python_roborock-7.2.0 → python_roborock-7.2.2}/roborock/data/dyad/dyad_containers.py +0 -0
  25. {python_roborock-7.2.0 → python_roborock-7.2.2}/roborock/data/mower/__init__.py +0 -0
  26. {python_roborock-7.2.0 → python_roborock-7.2.2}/roborock/data/mower/mower_code_mappings.py +0 -0
  27. {python_roborock-7.2.0 → python_roborock-7.2.2}/roborock/data/mower/mower_containers.py +0 -0
  28. {python_roborock-7.2.0 → python_roborock-7.2.2}/roborock/data/v1/__init__.py +0 -0
  29. {python_roborock-7.2.0 → python_roborock-7.2.2}/roborock/data/v1/v1_clean_modes.py +0 -0
  30. {python_roborock-7.2.0 → python_roborock-7.2.2}/roborock/data/v1/v1_code_mappings.py +0 -0
  31. {python_roborock-7.2.0 → python_roborock-7.2.2}/roborock/data/v1/v1_containers.py +0 -0
  32. {python_roborock-7.2.0 → python_roborock-7.2.2}/roborock/data/zeo/__init__.py +0 -0
  33. {python_roborock-7.2.0 → python_roborock-7.2.2}/roborock/data/zeo/zeo_code_mappings.py +0 -0
  34. {python_roborock-7.2.0 → python_roborock-7.2.2}/roborock/data/zeo/zeo_containers.py +0 -0
  35. {python_roborock-7.2.0 → python_roborock-7.2.2}/roborock/devices/README.md +0 -0
  36. {python_roborock-7.2.0 → python_roborock-7.2.2}/roborock/devices/__init__.py +0 -0
  37. {python_roborock-7.2.0 → python_roborock-7.2.2}/roborock/devices/cache.py +0 -0
  38. {python_roborock-7.2.0 → python_roborock-7.2.2}/roborock/devices/device.py +0 -0
  39. {python_roborock-7.2.0 → python_roborock-7.2.2}/roborock/devices/device_manager.py +0 -0
  40. {python_roborock-7.2.0 → python_roborock-7.2.2}/roborock/devices/file_cache.py +0 -0
  41. {python_roborock-7.2.0 → python_roborock-7.2.2}/roborock/devices/rpc/__init__.py +0 -0
  42. {python_roborock-7.2.0 → python_roborock-7.2.2}/roborock/devices/rpc/a01_channel.py +0 -0
  43. {python_roborock-7.2.0 → python_roborock-7.2.2}/roborock/devices/rpc/b01_q10_channel.py +0 -0
  44. {python_roborock-7.2.0 → python_roborock-7.2.2}/roborock/devices/rpc/b01_q7_channel.py +0 -0
  45. {python_roborock-7.2.0 → python_roborock-7.2.2}/roborock/devices/rpc/v1_channel.py +0 -0
  46. {python_roborock-7.2.0 → python_roborock-7.2.2}/roborock/devices/traits/__init__.py +0 -0
  47. {python_roborock-7.2.0 → python_roborock-7.2.2}/roborock/devices/traits/a01/__init__.py +0 -0
  48. {python_roborock-7.2.0 → python_roborock-7.2.2}/roborock/devices/traits/a01/device_feature.py +0 -0
  49. {python_roborock-7.2.0 → python_roborock-7.2.2}/roborock/devices/traits/b01/__init__.py +0 -0
  50. {python_roborock-7.2.0 → python_roborock-7.2.2}/roborock/devices/traits/b01/q10/__init__.py +0 -0
  51. {python_roborock-7.2.0 → python_roborock-7.2.2}/roborock/devices/traits/b01/q10/button_light.py +0 -0
  52. {python_roborock-7.2.0 → python_roborock-7.2.2}/roborock/devices/traits/b01/q10/child_lock.py +0 -0
  53. {python_roborock-7.2.0 → python_roborock-7.2.2}/roborock/devices/traits/b01/q10/clean_history.py +0 -0
  54. {python_roborock-7.2.0 → python_roborock-7.2.2}/roborock/devices/traits/b01/q10/command.py +0 -0
  55. {python_roborock-7.2.0 → python_roborock-7.2.2}/roborock/devices/traits/b01/q10/common.py +0 -0
  56. {python_roborock-7.2.0 → python_roborock-7.2.2}/roborock/devices/traits/b01/q10/consumable.py +0 -0
  57. {python_roborock-7.2.0 → python_roborock-7.2.2}/roborock/devices/traits/b01/q10/do_not_disturb.py +0 -0
  58. {python_roborock-7.2.0 → python_roborock-7.2.2}/roborock/devices/traits/b01/q10/dust_collection.py +0 -0
  59. {python_roborock-7.2.0 → python_roborock-7.2.2}/roborock/devices/traits/b01/q10/map.py +0 -0
  60. {python_roborock-7.2.0 → python_roborock-7.2.2}/roborock/devices/traits/b01/q10/maps.py +0 -0
  61. {python_roborock-7.2.0 → python_roborock-7.2.2}/roborock/devices/traits/b01/q10/network_info.py +0 -0
  62. {python_roborock-7.2.0 → python_roborock-7.2.2}/roborock/devices/traits/b01/q10/remote.py +0 -0
  63. {python_roborock-7.2.0 → python_roborock-7.2.2}/roborock/devices/traits/b01/q10/status.py +0 -0
  64. {python_roborock-7.2.0 → python_roborock-7.2.2}/roborock/devices/traits/b01/q10/vacuum.py +0 -0
  65. {python_roborock-7.2.0 → python_roborock-7.2.2}/roborock/devices/traits/b01/q10/volume.py +0 -0
  66. {python_roborock-7.2.0 → python_roborock-7.2.2}/roborock/devices/traits/b01/q7/__init__.py +0 -0
  67. {python_roborock-7.2.0 → python_roborock-7.2.2}/roborock/devices/traits/b01/q7/clean_summary.py +0 -0
  68. {python_roborock-7.2.0 → python_roborock-7.2.2}/roborock/devices/traits/b01/q7/map.py +0 -0
  69. {python_roborock-7.2.0 → python_roborock-7.2.2}/roborock/devices/traits/b01/q7/map_content.py +0 -0
  70. {python_roborock-7.2.0 → python_roborock-7.2.2}/roborock/devices/traits/common.py +0 -0
  71. {python_roborock-7.2.0 → python_roborock-7.2.2}/roborock/devices/traits/traits_mixin.py +0 -0
  72. {python_roborock-7.2.0 → python_roborock-7.2.2}/roborock/devices/traits/v1/__init__.py +0 -0
  73. {python_roborock-7.2.0 → python_roborock-7.2.2}/roborock/devices/traits/v1/child_lock.py +0 -0
  74. {python_roborock-7.2.0 → python_roborock-7.2.2}/roborock/devices/traits/v1/clean_summary.py +0 -0
  75. {python_roborock-7.2.0 → python_roborock-7.2.2}/roborock/devices/traits/v1/command.py +0 -0
  76. {python_roborock-7.2.0 → python_roborock-7.2.2}/roborock/devices/traits/v1/common.py +0 -0
  77. {python_roborock-7.2.0 → python_roborock-7.2.2}/roborock/devices/traits/v1/consumeable.py +0 -0
  78. {python_roborock-7.2.0 → python_roborock-7.2.2}/roborock/devices/traits/v1/device_features.py +0 -0
  79. {python_roborock-7.2.0 → python_roborock-7.2.2}/roborock/devices/traits/v1/do_not_disturb.py +0 -0
  80. {python_roborock-7.2.0 → python_roborock-7.2.2}/roborock/devices/traits/v1/dust_collection_mode.py +0 -0
  81. {python_roborock-7.2.0 → python_roborock-7.2.2}/roborock/devices/traits/v1/flow_led_status.py +0 -0
  82. {python_roborock-7.2.0 → python_roborock-7.2.2}/roborock/devices/traits/v1/home.py +0 -0
  83. {python_roborock-7.2.0 → python_roborock-7.2.2}/roborock/devices/traits/v1/led_status.py +0 -0
  84. {python_roborock-7.2.0 → python_roborock-7.2.2}/roborock/devices/traits/v1/map_content.py +0 -0
  85. {python_roborock-7.2.0 → python_roborock-7.2.2}/roborock/devices/traits/v1/maps.py +0 -0
  86. {python_roborock-7.2.0 → python_roborock-7.2.2}/roborock/devices/traits/v1/network_info.py +0 -0
  87. {python_roborock-7.2.0 → python_roborock-7.2.2}/roborock/devices/traits/v1/obstacle_photos.py +0 -0
  88. {python_roborock-7.2.0 → python_roborock-7.2.2}/roborock/devices/traits/v1/rooms.py +0 -0
  89. {python_roborock-7.2.0 → python_roborock-7.2.2}/roborock/devices/traits/v1/routines.py +0 -0
  90. {python_roborock-7.2.0 → python_roborock-7.2.2}/roborock/devices/traits/v1/smart_wash_params.py +0 -0
  91. {python_roborock-7.2.0 → python_roborock-7.2.2}/roborock/devices/traits/v1/status.py +0 -0
  92. {python_roborock-7.2.0 → python_roborock-7.2.2}/roborock/devices/traits/v1/valley_electricity_timer.py +0 -0
  93. {python_roborock-7.2.0 → python_roborock-7.2.2}/roborock/devices/traits/v1/volume.py +0 -0
  94. {python_roborock-7.2.0 → python_roborock-7.2.2}/roborock/devices/traits/v1/wash_towel_mode.py +0 -0
  95. {python_roborock-7.2.0 → python_roborock-7.2.2}/roborock/devices/transport/__init__.py +0 -0
  96. {python_roborock-7.2.0 → python_roborock-7.2.2}/roborock/devices/transport/channel.py +0 -0
  97. {python_roborock-7.2.0 → python_roborock-7.2.2}/roborock/devices/transport/local_channel.py +0 -0
  98. {python_roborock-7.2.0 → python_roborock-7.2.2}/roborock/devices/transport/mqtt_channel.py +0 -0
  99. {python_roborock-7.2.0 → python_roborock-7.2.2}/roborock/diagnostics.py +0 -0
  100. {python_roborock-7.2.0 → python_roborock-7.2.2}/roborock/exceptions.py +0 -0
  101. {python_roborock-7.2.0 → python_roborock-7.2.2}/roborock/map/__init__.py +0 -0
  102. {python_roborock-7.2.0 → python_roborock-7.2.2}/roborock/map/b01_grid_layers.py +0 -0
  103. {python_roborock-7.2.0 → python_roborock-7.2.2}/roborock/map/b01_map_parser.py +0 -0
  104. {python_roborock-7.2.0 → python_roborock-7.2.2}/roborock/map/b01_q10_map_parser.py +0 -0
  105. {python_roborock-7.2.0 → python_roborock-7.2.2}/roborock/map/b01_q10_overlays.py +0 -0
  106. {python_roborock-7.2.0 → python_roborock-7.2.2}/roborock/map/map_parser.py +0 -0
  107. {python_roborock-7.2.0 → python_roborock-7.2.2}/roborock/map/proto/__init__.py +0 -0
  108. {python_roborock-7.2.0 → python_roborock-7.2.2}/roborock/map/proto/b01_scmap.proto +0 -0
  109. {python_roborock-7.2.0 → python_roborock-7.2.2}/roborock/map/proto/b01_scmap_pb2.py +0 -0
  110. {python_roborock-7.2.0 → python_roborock-7.2.2}/roborock/map/room_colors.py +0 -0
  111. {python_roborock-7.2.0 → python_roborock-7.2.2}/roborock/mqtt/__init__.py +0 -0
  112. {python_roborock-7.2.0 → python_roborock-7.2.2}/roborock/mqtt/health_manager.py +0 -0
  113. {python_roborock-7.2.0 → python_roborock-7.2.2}/roborock/mqtt/roborock_session.py +0 -0
  114. {python_roborock-7.2.0 → python_roborock-7.2.2}/roborock/mqtt/session.py +0 -0
  115. {python_roborock-7.2.0 → python_roborock-7.2.2}/roborock/protocol.py +0 -0
  116. {python_roborock-7.2.0 → python_roborock-7.2.2}/roborock/protocols/__init__.py +0 -0
  117. {python_roborock-7.2.0 → python_roborock-7.2.2}/roborock/protocols/a01_protocol.py +0 -0
  118. {python_roborock-7.2.0 → python_roborock-7.2.2}/roborock/protocols/b01_q10_protocol.py +0 -0
  119. {python_roborock-7.2.0 → python_roborock-7.2.2}/roborock/protocols/b01_q7_protocol.py +0 -0
  120. {python_roborock-7.2.0 → python_roborock-7.2.2}/roborock/protocols/v1_protocol.py +0 -0
  121. {python_roborock-7.2.0 → python_roborock-7.2.2}/roborock/py.typed +0 -0
  122. {python_roborock-7.2.0 → python_roborock-7.2.2}/roborock/roborock_message.py +0 -0
  123. {python_roborock-7.2.0 → python_roborock-7.2.2}/roborock/roborock_typing.py +0 -0
  124. {python_roborock-7.2.0 → python_roborock-7.2.2}/roborock/testing/__init__.py +0 -0
  125. {python_roborock-7.2.0 → python_roborock-7.2.2}/roborock/testing/a01_simulator.py +0 -0
  126. {python_roborock-7.2.0 → python_roborock-7.2.2}/roborock/testing/b01_q10_simulator.py +0 -0
  127. {python_roborock-7.2.0 → python_roborock-7.2.2}/roborock/testing/channel.py +0 -0
  128. {python_roborock-7.2.0 → python_roborock-7.2.2}/roborock/testing/cloud.py +0 -0
  129. {python_roborock-7.2.0 → python_roborock-7.2.2}/roborock/testing/simulator.py +0 -0
  130. {python_roborock-7.2.0 → python_roborock-7.2.2}/roborock/testing/v1_simulator.py +0 -0
  131. {python_roborock-7.2.0 → python_roborock-7.2.2}/roborock/util.py +0 -0
  132. {python_roborock-7.2.0 → python_roborock-7.2.2}/roborock/web_api.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.5
2
2
  Name: python-roborock
3
- Version: 7.2.0
3
+ Version: 7.2.2
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.2.0"
3
+ version = "7.2.2"
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"
@@ -4,7 +4,7 @@ from functools import cache
4
4
  from typing import Any, Self
5
5
 
6
6
  from roborock.data.code_mappings import RoborockProductNickname
7
- from roborock.data.containers import RoborockBase
7
+ from roborock.data.containers import RoborockBase, _decamelize
8
8
  from roborock.data.v1 import RoborockDockTypeCode
9
9
 
10
10
 
@@ -654,6 +654,26 @@ class DeviceFeatures(RoborockBase):
654
654
 
655
655
  return cls(**kwargs)
656
656
 
657
+ @classmethod
658
+ def from_dict(cls, data: dict[str, Any]) -> Self | None:
659
+ """Create device features, rejecting incomplete cached capabilities.
660
+
661
+ Persisted feature data may have been written by an older version of the
662
+ library that did not yet know about every capability. Missing boolean
663
+ fields therefore mean the cached feature set is stale, not that those
664
+ capabilities are unsupported. Return ``None`` so callers rediscover the
665
+ complete feature set from the device.
666
+ """
667
+ if not isinstance(data, dict):
668
+ return None
669
+
670
+ serialized_fields = {_decamelize(key) for key in data}
671
+ required_fields = {feature.name for feature in fields(cls) if feature.type is bool}
672
+ if not required_fields.issubset(serialized_fields):
673
+ return None
674
+
675
+ return super().from_dict(data)
676
+
657
677
  def get_supported_features(self) -> list[str]:
658
678
  """Returns a list of supported features (Primarily used for logging purposes)."""
659
679
  return [k for k, v in vars(self).items() if v]
@@ -185,8 +185,10 @@ def _vector_calibration(
185
185
  trace_calibration: GridCalibration | None,
186
186
  ) -> GridCalibration | None:
187
187
  """Derive the 5 mm erase/restriction-vector transform."""
188
- y_sign = trace_calibration.y_sign if trace_calibration is not None else 1
189
- if calibration := _calibration_from_header_metadata(packet, y_sign=y_sign):
188
+ # Header vectors share the map packet's fixed top-down coordinate frame.
189
+ # A trace fit may choose either Y orientation, but that must not move saved
190
+ # erase/restriction geometry when a cleaning trace appears or disappears.
191
+ if calibration := _calibration_from_header_metadata(packet):
190
192
  return calibration
191
193
  if trace_calibration is None:
192
194
  return None
File without changes