2
2
3
3
from __future__ import annotations
4
4
5
+ from typing import Annotated
6
+
7
+ from ...exceptions import KasaException
5
8
from ...feature import Feature
9
+ from ...module import FeatureAttribute
6
10
from ..smartmodule import SmartModule
7
11
8
12
@@ -14,18 +18,22 @@ class BatterySensor(SmartModule):
14
18
15
19
def _initialize_features (self ) -> None :
16
20
"""Initialize features."""
17
- self ._add_feature (
18
- Feature (
19
- self ._device ,
20
- "battery_low" ,
21
- "Battery low" ,
22
- container = self ,
23
- attribute_getter = "battery_low" ,
24
- icon = "mdi:alert" ,
25
- type = Feature .Type .BinarySensor ,
26
- category = Feature .Category .Debug ,
21
+ if (
22
+ "at_low_battery" in self ._device .sys_info
23
+ or "is_low" in self ._device .sys_info
24
+ ):
25
+ self ._add_feature (
26
+ Feature (
27
+ self ._device ,
28
+ "battery_low" ,
29
+ "Battery low" ,
30
+ container = self ,
31
+ attribute_getter = "battery_low" ,
32
+ icon = "mdi:alert" ,
33
+ type = Feature .Type .BinarySensor ,
34
+ category = Feature .Category .Debug ,
35
+ )
27
36
)
28
- )
29
37
30
38
# Some devices, like T110 contact sensor do not report the battery percentage
31
39
if "battery_percentage" in self ._device .sys_info :
@@ -48,11 +56,17 @@ def query(self) -> dict:
48
56
return {}
49
57
50
58
@property
51
- def battery (self ) -> int :
59
+ def battery (self ) -> Annotated [ int , FeatureAttribute ()] :
52
60
"""Return battery level."""
53
61
return self ._device .sys_info ["battery_percentage" ]
54
62
55
63
@property
56
- def battery_low (self ) -> bool :
64
+ def battery_low (self ) -> Annotated [ bool , FeatureAttribute ()] :
57
65
"""Return True if battery is low."""
58
- return self ._device .sys_info ["at_low_battery" ]
66
+ is_low = self ._device .sys_info .get (
67
+ "at_low_battery" , self ._device .sys_info .get ("is_low" )
68
+ )
69
+ if is_low is None :
70
+ raise KasaException ("Device does not report battery low status" )
71
+
72
+ return is_low
0 commit comments