Skip to content

Commit 8b6496c

Browse files
committed
Findings of the Xiaomi Plug device support ported to the Xiaomi Power Strip.
1 parent e8ed75a commit 8b6496c

1 file changed

Lines changed: 56 additions & 34 deletions

File tree

mirobo/strip.py

Lines changed: 56 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -1,44 +1,23 @@
1-
from .device import Device
2-
from typing import Any, Dict
1+
import logging
32
import enum
3+
from typing import Dict, Any, Optional
4+
from collections import defaultdict
5+
from .device import Device
6+
7+
_LOGGER = logging.getLogger(__name__)
48

59

610
class PowerMode(enum.Enum):
711
Eco = 'green'
812
Normal = 'normal'
913

1014

11-
class Strip(Device):
12-
"""Main class representing the smart strip."""
13-
14-
def on(self):
15-
"""Power on."""
16-
return self.send("set_power", ["on"])
17-
18-
def off(self):
19-
"""Power off."""
20-
return self.send("set_power", ["off"])
21-
22-
def status(self):
23-
"""Retrieve properties."""
24-
properties = ['power', 'temperature', 'current', 'mode']
25-
values = self.send(
26-
"get_prop",
27-
properties
28-
)
29-
return StripStatus(dict(zip(properties, values)))
30-
31-
def set_power_mode(self, mode: PowerMode):
32-
"""Set mode."""
33-
34-
# green, normal
35-
return self.send("set_power_mode", [mode.value])
36-
37-
3815
class StripStatus:
3916
"""Container for status reports from the strip."""
4017

4118
def __init__(self, data: Dict[str, Any]) -> None:
19+
# Device model: qmi.powerstrip.v1, zimi.powerstrip.v2
20+
#
4221
# {'power': 'on', 'temperature': 48.11,
4322
# 'current': 0.06, 'mode': 'green'}
4423
self.data = data
@@ -56,16 +35,59 @@ def temperature(self) -> float:
5635
return self.data["temperature"]
5736

5837
@property
59-
def current(self) -> float:
60-
return self.data["current"]
38+
def load_power(self) -> Optional[float]:
39+
if self.data["current"] is not None:
40+
# The constant of 110V is used intentionally. The current was
41+
# calculated with a wrong reference voltage already.
42+
return self.data["current"] * 110
43+
return None
6144

6245
@property
6346
def mode(self) -> PowerMode:
6447
return PowerMode(self.data["mode"])
6548

6649
def __str__(self) -> str:
6750
s = "<StripStatus power=%s, temperature=%s, " \
68-
"current=%s mode=%s>" % \
69-
(self.power, self.temperature,
70-
self.current, self.mode)
51+
"load_power=%s mode=%s>" % \
52+
(self.power,
53+
self.temperature,
54+
self.load_power,
55+
self.mode)
7156
return s
57+
58+
59+
class Strip(Device):
60+
"""Main class representing the smart strip."""
61+
62+
def on(self):
63+
"""Power on."""
64+
return self.send("set_power", ["on"])
65+
66+
def off(self):
67+
"""Power off."""
68+
return self.send("set_power", ["off"])
69+
70+
def status(self):
71+
"""Retrieve properties."""
72+
properties = ['power', 'temperature', 'current', 'mode']
73+
values = self.send(
74+
"get_prop",
75+
properties
76+
)
77+
78+
properties_count = len(properties)
79+
values_count = len(values)
80+
if properties_count != values_count:
81+
_LOGGER.debug(
82+
"Count (%s) of requested properties does not match the "
83+
"count (%s) of received values.",
84+
properties_count, values_count)
85+
86+
return StripStatus(
87+
defaultdict(lambda: None, zip(properties, values)))
88+
89+
def set_power_mode(self, mode: PowerMode):
90+
"""Set mode."""
91+
92+
# green, normal
93+
return self.send("set_power_mode", [mode.value])

0 commit comments

Comments
 (0)