python-roborock 4.24.0__tar.gz → 4.26.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 (98) hide show
  1. {python_roborock-4.24.0 → python_roborock-4.26.0}/PKG-INFO +1 -1
  2. {python_roborock-4.24.0 → python_roborock-4.26.0}/pyproject.toml +1 -1
  3. {python_roborock-4.24.0 → python_roborock-4.26.0}/roborock/cli.py +2 -16
  4. {python_roborock-4.24.0 → python_roborock-4.26.0}/roborock/data/b01_q7/b01_q7_containers.py +8 -1
  5. {python_roborock-4.24.0 → python_roborock-4.26.0}/roborock/data/code_mappings.py +24 -0
  6. {python_roborock-4.24.0 → python_roborock-4.26.0}/.gitignore +0 -0
  7. {python_roborock-4.24.0 → python_roborock-4.26.0}/LICENSE +0 -0
  8. {python_roborock-4.24.0 → python_roborock-4.26.0}/README.md +0 -0
  9. {python_roborock-4.24.0 → python_roborock-4.26.0}/roborock/__init__.py +0 -0
  10. {python_roborock-4.24.0 → python_roborock-4.26.0}/roborock/broadcast_protocol.py +0 -0
  11. {python_roborock-4.24.0 → python_roborock-4.26.0}/roborock/callbacks.py +0 -0
  12. {python_roborock-4.24.0 → python_roborock-4.26.0}/roborock/const.py +0 -0
  13. {python_roborock-4.24.0 → python_roborock-4.26.0}/roborock/data/__init__.py +0 -0
  14. {python_roborock-4.24.0 → python_roborock-4.26.0}/roborock/data/b01_q10/__init__.py +0 -0
  15. {python_roborock-4.24.0 → python_roborock-4.26.0}/roborock/data/b01_q10/b01_q10_code_mappings.py +0 -0
  16. {python_roborock-4.24.0 → python_roborock-4.26.0}/roborock/data/b01_q10/b01_q10_containers.py +0 -0
  17. {python_roborock-4.24.0 → python_roborock-4.26.0}/roborock/data/b01_q7/__init__.py +0 -0
  18. {python_roborock-4.24.0 → python_roborock-4.26.0}/roborock/data/b01_q7/b01_q7_code_mappings.py +0 -0
  19. {python_roborock-4.24.0 → python_roborock-4.26.0}/roborock/data/containers.py +0 -0
  20. {python_roborock-4.24.0 → python_roborock-4.26.0}/roborock/data/dyad/__init__.py +0 -0
  21. {python_roborock-4.24.0 → python_roborock-4.26.0}/roborock/data/dyad/dyad_code_mappings.py +0 -0
  22. {python_roborock-4.24.0 → python_roborock-4.26.0}/roborock/data/dyad/dyad_containers.py +0 -0
  23. {python_roborock-4.24.0 → python_roborock-4.26.0}/roborock/data/v1/__init__.py +0 -0
  24. {python_roborock-4.24.0 → python_roborock-4.26.0}/roborock/data/v1/v1_clean_modes.py +0 -0
  25. {python_roborock-4.24.0 → python_roborock-4.26.0}/roborock/data/v1/v1_code_mappings.py +0 -0
  26. {python_roborock-4.24.0 → python_roborock-4.26.0}/roborock/data/v1/v1_containers.py +0 -0
  27. {python_roborock-4.24.0 → python_roborock-4.26.0}/roborock/data/zeo/__init__.py +0 -0
  28. {python_roborock-4.24.0 → python_roborock-4.26.0}/roborock/data/zeo/zeo_code_mappings.py +0 -0
  29. {python_roborock-4.24.0 → python_roborock-4.26.0}/roborock/data/zeo/zeo_containers.py +0 -0
  30. {python_roborock-4.24.0 → python_roborock-4.26.0}/roborock/device_features.py +0 -0
  31. {python_roborock-4.24.0 → python_roborock-4.26.0}/roborock/devices/README.md +0 -0
  32. {python_roborock-4.24.0 → python_roborock-4.26.0}/roborock/devices/__init__.py +0 -0
  33. {python_roborock-4.24.0 → python_roborock-4.26.0}/roborock/devices/cache.py +0 -0
  34. {python_roborock-4.24.0 → python_roborock-4.26.0}/roborock/devices/device.py +0 -0
  35. {python_roborock-4.24.0 → python_roborock-4.26.0}/roborock/devices/device_manager.py +0 -0
  36. {python_roborock-4.24.0 → python_roborock-4.26.0}/roborock/devices/file_cache.py +0 -0
  37. {python_roborock-4.24.0 → python_roborock-4.26.0}/roborock/devices/rpc/__init__.py +0 -0
  38. {python_roborock-4.24.0 → python_roborock-4.26.0}/roborock/devices/rpc/a01_channel.py +0 -0
  39. {python_roborock-4.24.0 → python_roborock-4.26.0}/roborock/devices/rpc/b01_q10_channel.py +0 -0
  40. {python_roborock-4.24.0 → python_roborock-4.26.0}/roborock/devices/rpc/b01_q7_channel.py +0 -0
  41. {python_roborock-4.24.0 → python_roborock-4.26.0}/roborock/devices/rpc/v1_channel.py +0 -0
  42. {python_roborock-4.24.0 → python_roborock-4.26.0}/roborock/devices/traits/__init__.py +0 -0
  43. {python_roborock-4.24.0 → python_roborock-4.26.0}/roborock/devices/traits/a01/__init__.py +0 -0
  44. {python_roborock-4.24.0 → python_roborock-4.26.0}/roborock/devices/traits/b01/__init__.py +0 -0
  45. {python_roborock-4.24.0 → python_roborock-4.26.0}/roborock/devices/traits/b01/q10/__init__.py +0 -0
  46. {python_roborock-4.24.0 → python_roborock-4.26.0}/roborock/devices/traits/b01/q10/command.py +0 -0
  47. {python_roborock-4.24.0 → python_roborock-4.26.0}/roborock/devices/traits/b01/q10/common.py +0 -0
  48. {python_roborock-4.24.0 → python_roborock-4.26.0}/roborock/devices/traits/b01/q10/status.py +0 -0
  49. {python_roborock-4.24.0 → python_roborock-4.26.0}/roborock/devices/traits/b01/q10/vacuum.py +0 -0
  50. {python_roborock-4.24.0 → python_roborock-4.26.0}/roborock/devices/traits/b01/q7/__init__.py +0 -0
  51. {python_roborock-4.24.0 → python_roborock-4.26.0}/roborock/devices/traits/b01/q7/clean_summary.py +0 -0
  52. {python_roborock-4.24.0 → python_roborock-4.26.0}/roborock/devices/traits/b01/q7/map.py +0 -0
  53. {python_roborock-4.24.0 → python_roborock-4.26.0}/roborock/devices/traits/traits_mixin.py +0 -0
  54. {python_roborock-4.24.0 → python_roborock-4.26.0}/roborock/devices/traits/v1/__init__.py +0 -0
  55. {python_roborock-4.24.0 → python_roborock-4.26.0}/roborock/devices/traits/v1/child_lock.py +0 -0
  56. {python_roborock-4.24.0 → python_roborock-4.26.0}/roborock/devices/traits/v1/clean_summary.py +0 -0
  57. {python_roborock-4.24.0 → python_roborock-4.26.0}/roborock/devices/traits/v1/command.py +0 -0
  58. {python_roborock-4.24.0 → python_roborock-4.26.0}/roborock/devices/traits/v1/common.py +0 -0
  59. {python_roborock-4.24.0 → python_roborock-4.26.0}/roborock/devices/traits/v1/consumeable.py +0 -0
  60. {python_roborock-4.24.0 → python_roborock-4.26.0}/roborock/devices/traits/v1/device_features.py +0 -0
  61. {python_roborock-4.24.0 → python_roborock-4.26.0}/roborock/devices/traits/v1/do_not_disturb.py +0 -0
  62. {python_roborock-4.24.0 → python_roborock-4.26.0}/roborock/devices/traits/v1/dust_collection_mode.py +0 -0
  63. {python_roborock-4.24.0 → python_roborock-4.26.0}/roborock/devices/traits/v1/flow_led_status.py +0 -0
  64. {python_roborock-4.24.0 → python_roborock-4.26.0}/roborock/devices/traits/v1/home.py +0 -0
  65. {python_roborock-4.24.0 → python_roborock-4.26.0}/roborock/devices/traits/v1/led_status.py +0 -0
  66. {python_roborock-4.24.0 → python_roborock-4.26.0}/roborock/devices/traits/v1/map_content.py +0 -0
  67. {python_roborock-4.24.0 → python_roborock-4.26.0}/roborock/devices/traits/v1/maps.py +0 -0
  68. {python_roborock-4.24.0 → python_roborock-4.26.0}/roborock/devices/traits/v1/network_info.py +0 -0
  69. {python_roborock-4.24.0 → python_roborock-4.26.0}/roborock/devices/traits/v1/rooms.py +0 -0
  70. {python_roborock-4.24.0 → python_roborock-4.26.0}/roborock/devices/traits/v1/routines.py +0 -0
  71. {python_roborock-4.24.0 → python_roborock-4.26.0}/roborock/devices/traits/v1/smart_wash_params.py +0 -0
  72. {python_roborock-4.24.0 → python_roborock-4.26.0}/roborock/devices/traits/v1/status.py +0 -0
  73. {python_roborock-4.24.0 → python_roborock-4.26.0}/roborock/devices/traits/v1/valley_electricity_timer.py +0 -0
  74. {python_roborock-4.24.0 → python_roborock-4.26.0}/roborock/devices/traits/v1/volume.py +0 -0
  75. {python_roborock-4.24.0 → python_roborock-4.26.0}/roborock/devices/traits/v1/wash_towel_mode.py +0 -0
  76. {python_roborock-4.24.0 → python_roborock-4.26.0}/roborock/devices/transport/__init__.py +0 -0
  77. {python_roborock-4.24.0 → python_roborock-4.26.0}/roborock/devices/transport/channel.py +0 -0
  78. {python_roborock-4.24.0 → python_roborock-4.26.0}/roborock/devices/transport/local_channel.py +0 -0
  79. {python_roborock-4.24.0 → python_roborock-4.26.0}/roborock/devices/transport/mqtt_channel.py +0 -0
  80. {python_roborock-4.24.0 → python_roborock-4.26.0}/roborock/diagnostics.py +0 -0
  81. {python_roborock-4.24.0 → python_roborock-4.26.0}/roborock/exceptions.py +0 -0
  82. {python_roborock-4.24.0 → python_roborock-4.26.0}/roborock/map/__init__.py +0 -0
  83. {python_roborock-4.24.0 → python_roborock-4.26.0}/roborock/map/map_parser.py +0 -0
  84. {python_roborock-4.24.0 → python_roborock-4.26.0}/roborock/mqtt/__init__.py +0 -0
  85. {python_roborock-4.24.0 → python_roborock-4.26.0}/roborock/mqtt/health_manager.py +0 -0
  86. {python_roborock-4.24.0 → python_roborock-4.26.0}/roborock/mqtt/roborock_session.py +0 -0
  87. {python_roborock-4.24.0 → python_roborock-4.26.0}/roborock/mqtt/session.py +0 -0
  88. {python_roborock-4.24.0 → python_roborock-4.26.0}/roborock/protocol.py +0 -0
  89. {python_roborock-4.24.0 → python_roborock-4.26.0}/roborock/protocols/__init__.py +0 -0
  90. {python_roborock-4.24.0 → python_roborock-4.26.0}/roborock/protocols/a01_protocol.py +0 -0
  91. {python_roborock-4.24.0 → python_roborock-4.26.0}/roborock/protocols/b01_q10_protocol.py +0 -0
  92. {python_roborock-4.24.0 → python_roborock-4.26.0}/roborock/protocols/b01_q7_protocol.py +0 -0
  93. {python_roborock-4.24.0 → python_roborock-4.26.0}/roborock/protocols/v1_protocol.py +0 -0
  94. {python_roborock-4.24.0 → python_roborock-4.26.0}/roborock/py.typed +0 -0
  95. {python_roborock-4.24.0 → python_roborock-4.26.0}/roborock/roborock_message.py +0 -0
  96. {python_roborock-4.24.0 → python_roborock-4.26.0}/roborock/roborock_typing.py +0 -0
  97. {python_roborock-4.24.0 → python_roborock-4.26.0}/roborock/util.py +0 -0
  98. {python_roborock-4.24.0 → python_roborock-4.26.0}/roborock/web_api.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: python-roborock
3
- Version: 4.24.0
3
+ Version: 4.26.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 = "4.24.0"
3
+ version = "4.26.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"
@@ -764,21 +764,6 @@ async def network_info(ctx, device_id: str):
764
764
  await _display_v1_trait(context, device_id, lambda v1: v1.network_info)
765
765
 
766
766
 
767
- def _parse_b01_q10_command(cmd: str) -> B01_Q10_DP:
768
- """Parse B01_Q10 command from either enum name or value."""
769
- try:
770
- return B01_Q10_DP(int(cmd))
771
- except ValueError:
772
- try:
773
- return B01_Q10_DP.from_name(cmd)
774
- except ValueError:
775
- try:
776
- return B01_Q10_DP.from_value(cmd)
777
- except ValueError:
778
- pass
779
- raise RoborockException(f"Invalid command {cmd} for B01_Q10 device")
780
-
781
-
782
767
  @click.command()
783
768
  @click.option("--device_id", required=True)
784
769
  @click.option("--cmd", required=True)
@@ -795,7 +780,8 @@ async def command(ctx, cmd, device_id, params):
795
780
  if result:
796
781
  click.echo(dump_json(result))
797
782
  elif device.b01_q10_properties is not None:
798
- cmd_value = _parse_b01_q10_command(cmd)
783
+ if cmd_value := B01_Q10_DP.from_any_optional(cmd) is None:
784
+ raise RoborockException(f"Invalid command {cmd} for B01_Q10 device")
799
785
  command_trait: Trait = device.b01_q10_properties.command
800
786
  await command_trait.send(cmd_value, json.loads(params) if params is not None else None)
801
787
  click.echo("Command sent successfully; Enable debug logging (-d) to see responses.")
@@ -114,7 +114,7 @@ class B01Props(RoborockBase):
114
114
  wind: SCWindMapping | None = None
115
115
  water: WaterLevelMapping | None = None
116
116
  mode: CleanTypeMapping | None = None
117
- quantity: int | None = None
117
+ quantity: int | None = None # The Q7 L5 reports its battery level as 'quantity'
118
118
  alarm: int | None = None
119
119
  volume: int | None = None
120
120
  hypa: int | None = None
@@ -169,6 +169,13 @@ class B01Props(RoborockBase):
169
169
  recommend: Recommend | None = None
170
170
  add_sweep_status: int | None = None
171
171
 
172
+ @property
173
+ def battery(self) -> int | None:
174
+ """
175
+ Returns device battery level as a percentage.
176
+ """
177
+ return self.quantity
178
+
172
179
  @property
173
180
  def main_brush_time_left(self) -> int | None:
174
181
  """
@@ -100,6 +100,30 @@ class RoborockModeEnum(StrEnum):
100
100
  return member
101
101
  raise ValueError(f"{name} is not a valid name for {cls.__name__}")
102
102
 
103
+ @classmethod
104
+ def from_any_optional(cls, value: str | int) -> Self | None:
105
+ """Resolve a string or int to an enum member.
106
+
107
+ Tries to look up by enum name, string value, or integer code
108
+ and returns None if no match is found.
109
+ """
110
+ # Try enum name lookup (e.g. "SEEK")
111
+ try:
112
+ return cls.from_name(str(value))
113
+ except ValueError:
114
+ pass
115
+ # Try DP string value lookup (e.g. "dpSeek")
116
+ try:
117
+ return cls.from_value(str(value))
118
+ except ValueError:
119
+ pass
120
+ # Try integer code lookup (e.g. "11")
121
+ try:
122
+ return cls.from_code(int(value))
123
+ except (ValueError, TypeError):
124
+ pass
125
+ return None
126
+
103
127
  @classmethod
104
128
  def keys(cls) -> list[str]:
105
129
  """Returns a list of all member values."""