8000 Expose current cleaning information (#1453) · python-kasa/python-kasa@1355e85 · GitHub 8000
[go: up one dir, main page]

Skip to content

Commit 1355e85

Browse files
authored
Expose current cleaning information (#1453)
Add new sensors to show the current cleaning state: ``` Cleaning area (clean_area): 0 0 Cleaning time (clean_time): 0:00:00 Cleaning progress (clean_progress): 100 % ```
1 parent 4e7e18c commit 1355e85

File tree

3 files changed

+81
-3
lines changed

3 files changed

+81
-3
lines changed

devtools/helpers/smartrequests.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -439,6 +439,8 @@ def get_component_requests(component_id, ver_code):
439439
"clean": [
440440
SmartRequest.get_raw_request("getCleanRecords"),
441441
SmartRequest.get_raw_request("getVacStatus"),
442+
SmartRequest.get_raw_request("getAreaUnit"),
443+
SmartRequest.get_raw_request("getCleanInfo"),
442444
SmartRequest.get_raw_request("getCleanStatus"),
443445
SmartRequest("getCleanAttr", SmartRequest.GetCleanAttrParams()),
444446
],

kasa/smart/modules/clean.py

Lines changed: 77 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
from __future__ import annotations
44

55
import logging
6+
from datetime import timedelta
67
from enum import IntEnum
78
from typing import Annotated
89

@@ -54,6 +55,17 @@ class FanSpeed(IntEnum):
5455
Max = 4
5556

5657

58+
class AreaUnit(IntEnum):
59+
"""Area unit."""
60+
61+
#: Square meter
62+
Sqm = 0
63+
#: Square feet
64+
Sqft = 1
65+
#: Taiwanese unit: https://en.wikipedia.org/wiki/Taiwanese_units_of_measurement#Area
66+
Ping = 2
67+
68+
5769
class Clean(SmartModule):
5870
"""Implementation of vacuum clean module."""
5971

@@ -145,6 +157,41 @@ def _initialize_features(self) -> None:
145157
type=Feature.Type.Choice,
146158
)
147159
)
160+
self._add_feature(
161+
Feature(
162+
self._device,
163+
id="clean_area",
164+
name="Cleaning area",
165+
container=self,
166+
attribute_getter="clean_area",
167+
unit_getter="area_unit",
168+
category=Feature.Category.Info,
169+
type=Feature.Type.Sensor,
170+
)
171+
)
172+
self._add_feature(
173+
Feature(
174+
self._device,
175+
id="clean_time",
176+
name="Cleaning time",
177+
container=self,
178+
attribute_getter="clean_time",
179+
category=Feature.Category.Info,
180+
type=Feature.Type.Sensor,
181+
)
182+
)
183+
self._add_feature(
184+
Feature(
185+
self._device,
186+
id="clean_progress",
187+
name="Cleaning progress",
188+
container=self,
189+
attribute_getter="clean_progress",
190+
unit_getter=lambda: "%",
191+
category=Feature.Category.Info,
192+
type=Feature.Type.Sensor,
193+
)
194+
)
148195

149196
async def _post_update_hook(self) -> None:
150197
"""Set error code after update."""
@@ -171,9 +218,11 @@ async def _post_update_hook(self) -> None:
171218
def query(self) -> dict:
172219
"""Query to execute during the update cycle."""
173220
return {
174-
"getVacStatus": None,
175-
"getBatteryInfo": None,
176-
"getCleanStatus": None,
221+
"getVacStatus": {},
222+
"getCleanInfo": {},
223+
"getAreaUnit": {},
224+
"getBatteryInfo": {},
225+
"getCleanStatus": {},
177226
"getCleanAttr": {"type": "global"},
178227
}
179228

@@ -248,6 +297,11 @@ def _vac_status(self) -> dict:
248297
"""Return vac status container."""
249298
return self.data["getVacStatus"]
250299

300+
@property
301+
def _info(self) -> dict:
302+
"""Return current cleaning info."""
303+
return self.data["getCleanInfo"]
304+
251305
@property
252306
def _settings(self) -> dict:
253307
"""Return cleaning settings."""
@@ -265,3 +319,23 @@ def status(self) -> Status:
265319
except ValueError:
266320
_LOGGER.warning("Got unknown status code: %s (%s)", status_code, self.data)
267321
return Status.UnknownInternal
322+
323+
@property
324+
def area_unit(self) -> AreaUnit:
325+
"""Return area unit."""
326+
return AreaUnit(self.data["getAreaUnit"]["area_unit"])
327+
328+
@property
329+
def clean_area(self) -> Annotated[int, FeatureAttribute()]:
330+
"""Return currently cleaned area."""
331+
return self._info["clean_area"]
332+
333+
@property
334+
def clean_time(self) -> timedelta:
335+
"""Return current cleaning time."""
336+
return timedelta(minutes=self._info["clean_time"])
337+
338+
@property
339+
def clean_progress(self) -> int:
340+
"""Return amount of currently cleaned area."""
341+
return self._info["clean_percent"]

tests/fixtures/smart/RV20 Max Plus(EU)_1.0_1.0.7.json

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -159,7 +159,9 @@
159159
"getBatteryInfo": {
160160
"battery_percentage": 75
161161
},
162+
"getAreaUnit": {"area_unit": 0},
162163
"getCleanAttr": {"suction": 2, "cistern": 2, "clean_number": 1},
164+
"getCleanInfo": {"clean_time": 5, "clean_area": 5, "clean_percent": 1},
163165
"getCleanStatus": {"getCleanStatus": {"clean_status": 0, "is_working": false, "is_mapping": false, "is_relocating": false}},
164166
"getCleanRecords": {
165167
"lastest_day_record": [

0 commit comments

Comments
 (0)
0