python-roborock 2.6.0__tar.gz → 2.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 (28) hide show
  1. {python_roborock-2.6.0 → python_roborock-2.7.0}/PKG-INFO +2 -1
  2. {python_roborock-2.6.0 → python_roborock-2.7.0}/pyproject.toml +1 -1
  3. {python_roborock-2.6.0 → python_roborock-2.7.0}/roborock/code_mappings.py +1 -0
  4. {python_roborock-2.6.0 → python_roborock-2.7.0}/roborock/containers.py +67 -9
  5. {python_roborock-2.6.0 → python_roborock-2.7.0}/roborock/version_1_apis/roborock_client_v1.py +1 -0
  6. {python_roborock-2.6.0 → python_roborock-2.7.0}/LICENSE +0 -0
  7. {python_roborock-2.6.0 → python_roborock-2.7.0}/README.md +0 -0
  8. {python_roborock-2.6.0 → python_roborock-2.7.0}/roborock/__init__.py +0 -0
  9. {python_roborock-2.6.0 → python_roborock-2.7.0}/roborock/api.py +0 -0
  10. {python_roborock-2.6.0 → python_roborock-2.7.0}/roborock/cli.py +0 -0
  11. {python_roborock-2.6.0 → python_roborock-2.7.0}/roborock/cloud_api.py +0 -0
  12. {python_roborock-2.6.0 → python_roborock-2.7.0}/roborock/command_cache.py +0 -0
  13. {python_roborock-2.6.0 → python_roborock-2.7.0}/roborock/const.py +0 -0
  14. {python_roborock-2.6.0 → python_roborock-2.7.0}/roborock/exceptions.py +0 -0
  15. {python_roborock-2.6.0 → python_roborock-2.7.0}/roborock/local_api.py +0 -0
  16. {python_roborock-2.6.0 → python_roborock-2.7.0}/roborock/protocol.py +0 -0
  17. {python_roborock-2.6.0 → python_roborock-2.7.0}/roborock/py.typed +0 -0
  18. {python_roborock-2.6.0 → python_roborock-2.7.0}/roborock/roborock_future.py +0 -0
  19. {python_roborock-2.6.0 → python_roborock-2.7.0}/roborock/roborock_message.py +0 -0
  20. {python_roborock-2.6.0 → python_roborock-2.7.0}/roborock/roborock_typing.py +0 -0
  21. {python_roborock-2.6.0 → python_roborock-2.7.0}/roborock/util.py +0 -0
  22. {python_roborock-2.6.0 → python_roborock-2.7.0}/roborock/version_1_apis/__init__.py +0 -0
  23. {python_roborock-2.6.0 → python_roborock-2.7.0}/roborock/version_1_apis/roborock_local_client_v1.py +0 -0
  24. {python_roborock-2.6.0 → python_roborock-2.7.0}/roborock/version_1_apis/roborock_mqtt_client_v1.py +0 -0
  25. {python_roborock-2.6.0 → python_roborock-2.7.0}/roborock/version_a01_apis/__init__.py +0 -0
  26. {python_roborock-2.6.0 → python_roborock-2.7.0}/roborock/version_a01_apis/roborock_client_a01.py +0 -0
  27. {python_roborock-2.6.0 → python_roborock-2.7.0}/roborock/version_a01_apis/roborock_mqtt_client_a01.py +0 -0
  28. {python_roborock-2.6.0 → python_roborock-2.7.0}/roborock/web_api.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: python-roborock
3
- Version: 2.6.0
3
+ Version: 2.7.0
4
4
  Summary: A package to control Roborock vacuums.
5
5
  Home-page: https://github.com/humbertogontijo/python-roborock
6
6
  License: GPL-3.0-only
@@ -17,6 +17,7 @@ Classifier: Programming Language :: Python :: 3
17
17
  Classifier: Programming Language :: Python :: 3.10
18
18
  Classifier: Programming Language :: Python :: 3.11
19
19
  Classifier: Programming Language :: Python :: 3.12
20
+ Classifier: Programming Language :: Python :: 3.13
20
21
  Classifier: Topic :: Software Development :: Libraries
21
22
  Requires-Dist: aiohttp (>=3.8.2,<4.0.0)
22
23
  Requires-Dist: async-timeout
@@ -1,6 +1,6 @@
1
1
  [tool.poetry]
2
2
  name = "python-roborock"
3
- version = "2.6.0"
3
+ version = "2.7.0"
4
4
  description = "A package to control Roborock vacuums."
5
5
  authors = ["humbertogontijo <humbertogontijo@users.noreply.github.com>"]
6
6
  license = "GPL-3.0-only"
@@ -386,6 +386,7 @@ class RoborockDockTypeCode(RoborockEnum):
386
386
  p10_dock = 8
387
387
  p10_pro_dock = 9
388
388
  s8_maxv_ultra_dock = 10
389
+ qrevo_s_dock = 15
389
390
 
390
391
 
391
392
  class RoborockDockDustCollectionModeCode(RoborockEnum):
@@ -7,9 +7,7 @@ import re
7
7
  from dataclasses import asdict, dataclass, field
8
8
  from datetime import timezone
9
9
  from enum import Enum
10
- from typing import Any, NamedTuple
11
-
12
- from dacite import Config, from_dict
10
+ from typing import Any, NamedTuple, get_args, get_origin
13
11
 
14
12
  from .code_mappings import (
15
13
  RoborockCategory,
@@ -102,14 +100,70 @@ class RoborockBase:
102
100
  _ignore_keys = [] # type: ignore
103
101
  is_cached = False
104
102
 
103
+ @staticmethod
104
+ def convert_to_class_obj(type, value):
105
+ try:
106
+ class_type = eval(type)
107
+ if get_origin(class_type) is list:
108
+ return_list = []
109
+ cls_type = get_args(class_type)[0]
110
+ for obj in value:
111
+ if issubclass(cls_type, RoborockBase):
112
+ return_list.append(cls_type.from_dict(obj))
113
+ elif cls_type in {str, int, float}:
114
+ return_list.append(cls_type(obj))
115
+ else:
116
+ return_list.append(cls_type(**obj))
117
+ return return_list
118
+ if issubclass(class_type, RoborockBase):
119
+ converted_value = class_type.from_dict(value)
120
+ else:
121
+ converted_value = class_type(value)
122
+ return converted_value
123
+ except NameError as err:
124
+ _LOGGER.exception(err)
125
+ except ValueError as err:
126
+ _LOGGER.exception(err)
127
+ except Exception as err:
128
+ _LOGGER.exception(err)
129
+ raise Exception("Fail")
130
+
105
131
  @classmethod
106
132
  def from_dict(cls, data: dict[str, Any]):
107
133
  if isinstance(data, dict):
108
134
  ignore_keys = cls._ignore_keys
109
- try:
110
- return from_dict(cls, decamelize_obj(data, ignore_keys), config=Config(cast=[Enum]))
111
- except AttributeError as err:
112
- raise RoborockException("It seems like you have an outdated version of dacite.") from err
135
+ data = decamelize_obj(data, ignore_keys)
136
+ cls_annotations: dict[str, str] = {}
137
+ for base in reversed(cls.__mro__):
138
+ cls_annotations.update(getattr(base, "__annotations__", {}))
139
+ remove_keys = []
140
+ for key, value in data.items():
141
+ if value == "None" or value is None:
142
+ data[key] = None
143
+ continue
144
+ if key not in cls_annotations:
145
+ remove_keys.append(key)
146
+ continue
147
+ field_type: str = cls_annotations[key]
148
+ if "|" in field_type:
149
+ # It's a union
150
+ types = field_type.split("|")
151
+ for type in types:
152
+ if "None" in type or "Any" in type:
153
+ continue
154
+ try:
155
+ data[key] = RoborockBase.convert_to_class_obj(type, value)
156
+ break
157
+ except Exception:
158
+ ...
159
+ else:
160
+ try:
161
+ data[key] = RoborockBase.convert_to_class_obj(field_type, value)
162
+ except Exception:
163
+ ...
164
+ for key in remove_keys:
165
+ del data[key]
166
+ return cls(**data)
113
167
 
114
168
  def as_dict(self) -> dict:
115
169
  return asdict(
@@ -185,6 +239,7 @@ class HomeDataProductSchema(RoborockBase):
185
239
  mode: Any | None = None
186
240
  type: Any | None = None
187
241
  product_property: Any | None = None
242
+ property: Any | None = None
188
243
  desc: Any | None = None
189
244
 
190
245
 
@@ -195,7 +250,7 @@ class HomeDataProduct(RoborockBase):
195
250
  model: str
196
251
  category: RoborockCategory
197
252
  code: str | None = None
198
- iconurl: str | None = None
253
+ icon_url: str | None = None
199
254
  attribute: Any | None = None
200
255
  capability: int | None = None
201
256
  schema: list[HomeDataProductSchema] | None = None
@@ -612,7 +667,10 @@ class CleanSummary(RoborockBase):
612
667
  last_clean_t: int | None = None
613
668
 
614
669
  def __post_init__(self) -> None:
615
- self.square_meter_clean_area = round(self.clean_area / 1000000, 1) if self.clean_area is not None else None
670
+ if isinstance(self.clean_area, list):
671
+ _LOGGER.warning(f"Clean area is a unexpected type! Please give the following in a issue: {self.clean_area}")
672
+ else:
673
+ self.square_meter_clean_area = round(self.clean_area / 1000000, 1) if self.clean_area is not None else None
616
674
 
617
675
 
618
676
  @dataclass
@@ -67,6 +67,7 @@ WASH_N_FILL_DOCK = [
67
67
  RoborockDockTypeCode.p10_dock,
68
68
  RoborockDockTypeCode.p10_pro_dock,
69
69
  RoborockDockTypeCode.s8_maxv_ultra_dock,
70
+ RoborockDockTypeCode.qrevo_s_dock,
70
71
  ]
71
72
  RT = TypeVar("RT", bound=RoborockBase)
72
73
  EVICT_TIME = 60
File without changes