mirror of
https://github.com/no2chem/wideq.git
synced 2025-05-21 09:30:13 -07:00
Adds a dryer device.
This commit is contained in:
parent
1e8e51c334
commit
890ca7b055
14
wideq/ac.py
14
wideq/ac.py
@ -2,7 +2,7 @@
|
|||||||
"""
|
"""
|
||||||
import enum
|
import enum
|
||||||
|
|
||||||
from .client import Device, Monitor
|
from .client import Device
|
||||||
|
|
||||||
|
|
||||||
class ACMode(enum.Enum):
|
class ACMode(enum.Enum):
|
||||||
@ -173,18 +173,6 @@ class ACDevice(Device):
|
|||||||
value = self._get_control('SpkVolume')
|
value = self._get_control('SpkVolume')
|
||||||
return int(value)
|
return int(value)
|
||||||
|
|
||||||
def monitor_start(self):
|
|
||||||
"""Start monitoring the device's status."""
|
|
||||||
|
|
||||||
mon = Monitor(self.client.session, self.device.id)
|
|
||||||
mon.start()
|
|
||||||
self.mon = mon
|
|
||||||
|
|
||||||
def monitor_stop(self):
|
|
||||||
"""Stop monitoring the device's status."""
|
|
||||||
|
|
||||||
self.mon.stop()
|
|
||||||
|
|
||||||
def poll(self):
|
def poll(self):
|
||||||
"""Poll the device's current state.
|
"""Poll the device's current state.
|
||||||
|
|
||||||
|
@ -391,15 +391,12 @@ class Device(object):
|
|||||||
"""Create a wrapper for a `DeviceInfo` object associated with a
|
"""Create a wrapper for a `DeviceInfo` object associated with a
|
||||||
`Client`.
|
`Client`.
|
||||||
"""
|
"""
|
||||||
|
|
||||||
self.client = client
|
self.client = client
|
||||||
self.device = device
|
self.device = device
|
||||||
self.model = client.model_info(device)
|
self.model = client.model_info(device)
|
||||||
|
|
||||||
def _set_control(self, key, value):
|
def _set_control(self, key, value):
|
||||||
"""Set a device's control for `key` to `value`.
|
"""Set a device's control for `key` to `value`."""
|
||||||
"""
|
|
||||||
|
|
||||||
self.client.session.set_device_controls(
|
self.client.session.set_device_controls(
|
||||||
self.device.id,
|
self.device.id,
|
||||||
{key: value},
|
{key: value},
|
||||||
@ -410,7 +407,6 @@ class Device(object):
|
|||||||
|
|
||||||
The response is parsed as base64-encoded JSON.
|
The response is parsed as base64-encoded JSON.
|
||||||
"""
|
"""
|
||||||
|
|
||||||
data = self.client.session.get_device_config(
|
data = self.client.session.get_device_config(
|
||||||
self.device.id,
|
self.device.id,
|
||||||
key,
|
key,
|
||||||
@ -418,9 +414,7 @@ class Device(object):
|
|||||||
return json.loads(base64.b64decode(data).decode('utf8'))
|
return json.loads(base64.b64decode(data).decode('utf8'))
|
||||||
|
|
||||||
def _get_control(self, key):
|
def _get_control(self, key):
|
||||||
"""Look up a device's control value.
|
"""Look up a device's control value."""
|
||||||
"""
|
|
||||||
|
|
||||||
data = self.client.session.get_device_config(
|
data = self.client.session.get_device_config(
|
||||||
self.device.id,
|
self.device.id,
|
||||||
key,
|
key,
|
||||||
@ -430,3 +424,13 @@ class Device(object):
|
|||||||
# The response comes in a funky key/value format: "(key:value)".
|
# The response comes in a funky key/value format: "(key:value)".
|
||||||
_, value = data[1:-1].split(':')
|
_, value = data[1:-1].split(':')
|
||||||
return value
|
return value
|
||||||
|
|
||||||
|
def monitor_start(self):
|
||||||
|
"""Start monitoring the device's status."""
|
||||||
|
mon = Monitor(self.client.session, self.device.id)
|
||||||
|
mon.start()
|
||||||
|
self.mon = mon
|
||||||
|
|
||||||
|
def monitor_stop(self):
|
||||||
|
"""Stop monitoring the device's status."""
|
||||||
|
self.mon.stop()
|
||||||
|
145
wideq/dryer.py
Normal file
145
wideq/dryer.py
Normal file
@ -0,0 +1,145 @@
|
|||||||
|
import enum
|
||||||
|
|
||||||
|
from .client import Device
|
||||||
|
|
||||||
|
|
||||||
|
class DryerState(enum.Enum):
|
||||||
|
"""The state of the dryer device."""
|
||||||
|
|
||||||
|
OFF = "@WM_STATE_POWER_OFF_W"
|
||||||
|
INITIAL = "@WM_STATE_INITIAL_W"
|
||||||
|
RUNNING = "@WM_STATE_RUNNING_W"
|
||||||
|
DRYING = "@WM_STATE_DRYING_W"
|
||||||
|
PAUSE = "@WM_STATE_PAUSE_W"
|
||||||
|
END = "@WM_STATE_END_W"
|
||||||
|
ERROR = "@WM_STATE_ERROR_W"
|
||||||
|
COOLING = "@WM_STATE_COOLING_W"
|
||||||
|
SMART_DIAGNOSIS = "@WM_STATE_SMART_DIAGNOSIS_W"
|
||||||
|
WRINKLE_CARE = "@WM_STATE_WRINKLECARE_W"
|
||||||
|
|
||||||
|
|
||||||
|
class DryLevel(enum.Enum):
|
||||||
|
"""Represents the dry level setting of the dryer."""
|
||||||
|
|
||||||
|
IRON = "@WM_DRY27_DRY_LEVEL_IRON_W"
|
||||||
|
CUPBOARD = "@WM_DRY27_DRY_LEVEL_CUPBOARD_W"
|
||||||
|
EXTRA = "@WM_DRY27_DRY_LEVEL_EXTRA_W"
|
||||||
|
OFF = "-"
|
||||||
|
DAMP = "@WM_DRY27_DRY_LEVEL_DAMP_W"
|
||||||
|
LESS = "@WM_DRY27_DRY_LEVEL_LESS_W"
|
||||||
|
NORMAL = "@WM_DRY27_DRY_LEVEL_NORMAL_W"
|
||||||
|
MORE = "@WM_DRY27_DRY_LEVEL_MORE_W"
|
||||||
|
VERY = "@WM_DRY27_DRY_LEVEL_VERY_W"
|
||||||
|
|
||||||
|
|
||||||
|
class DryerError(enum.Enum):
|
||||||
|
"""A dryer error."""
|
||||||
|
|
||||||
|
ERROR_DOOR = "@WM_US_DRYER_ERROR_DE_W"
|
||||||
|
ERROR_DRAINMOTOR = "@WM_US_DRYER_ERROR_OE_W"
|
||||||
|
ERROR_LE1 = "@WM_US_DRYER_ERROR_LE1_W"
|
||||||
|
ERROR_TE1 = "@WM_US_DRYER_ERROR_TE1_W"
|
||||||
|
ERROR_TE2 = "@WM_US_DRYER_ERROR_TE2_W"
|
||||||
|
ERROR_TE5 = "@WM_US_DRYER_ERROR_TE5_W"
|
||||||
|
ERROR_TE6 = "@WM_US_DRYER_ERROR_TE6_W"
|
||||||
|
ERROR_PS = "@WM_US_DRYER_ERROR_PS_W"
|
||||||
|
ERROR_NP = "@WM_US_DRYER_ERROR_NP_GAS_W"
|
||||||
|
ERROR_F1 = "@WM_US_DRYER_ERROR_F1_W"
|
||||||
|
ERROR_LE2 = "@WM_US_DRYER_ERROR_LE2_W"
|
||||||
|
ERROR_AE = "@WM_US_DRYER_ERROR_AE_W"
|
||||||
|
ERROR_dE4 = "@WM_WW_FL_ERROR_DE4_W"
|
||||||
|
ERROR_NOFILTER = "@WM_US_DRYER_ERROR_NOFILTER_W"
|
||||||
|
ERROR_EMPTYWATER = "@WM_US_DRYER_ERROR_EMPTYWATER_W"
|
||||||
|
ERROR_CE1 = "@WM_US_DRYER_ERROR_CE1_W"
|
||||||
|
|
||||||
|
|
||||||
|
class DryerDevice(Device):
|
||||||
|
"""A higher-level interface for a dryer."""
|
||||||
|
|
||||||
|
def poll(self) -> Optional['DryerDevice']:
|
||||||
|
"""Poll the device's current state.
|
||||||
|
|
||||||
|
Monitoring must be started first with `monitor_start`.
|
||||||
|
|
||||||
|
:returns: Either a `DruerStatus` instance or `None` if the status is not
|
||||||
|
yet available.
|
||||||
|
"""
|
||||||
|
# Abort if monitoring has not started yet.
|
||||||
|
if not hasattr(self, 'mon'):
|
||||||
|
return None
|
||||||
|
|
||||||
|
res = self.mon.poll_json()
|
||||||
|
if res:
|
||||||
|
return DryerStatus(self, res)
|
||||||
|
else:
|
||||||
|
return None
|
||||||
|
|
||||||
|
|
||||||
|
class DryerStatus(object):
|
||||||
|
"""Higher-level information about a dryer's current status.
|
||||||
|
|
||||||
|
:param dryer: The DryerDevice instance.
|
||||||
|
:param data: JSON data from the API.
|
||||||
|
"""
|
||||||
|
|
||||||
|
def __init__(self, dryer: DryerDevice, data: dict):
|
||||||
|
self.dryer = dryer
|
||||||
|
self.data = data
|
||||||
|
|
||||||
|
@property
|
||||||
|
def state(self):
|
||||||
|
"""Get the state of the dryer."""
|
||||||
|
attr = 'State'
|
||||||
|
return DryerState(self.dryer.model.enum_name(attr, self.data[attr]))
|
||||||
|
|
||||||
|
@property
|
||||||
|
def pre_state(self):
|
||||||
|
"""Get the previous? state of the dryer.
|
||||||
|
|
||||||
|
|
||||||
|
@TODO: Run some tests to determine what this value means. Is it the
|
||||||
|
previous state? If not, what would a pre-state mean?
|
||||||
|
"""
|
||||||
|
attr = 'PreState'
|
||||||
|
return DryerState(self.dryer.model.enum_name(attr, self.data[attr]))
|
||||||
|
|
||||||
|
@property
|
||||||
|
def dry_level(self):
|
||||||
|
"""Get the dry level."""
|
||||||
|
attr = 'DryLevel'
|
||||||
|
return DryLevel(self.dryer.model.enum_name(attr, self.data[attr]))
|
||||||
|
|
||||||
|
@property
|
||||||
|
def is_on(self) -> bool:
|
||||||
|
"""Check if the dryer is on or not."""
|
||||||
|
return self.state != DryerState.OFF
|
||||||
|
|
||||||
|
@property
|
||||||
|
def remain_time_hours(self):
|
||||||
|
"""Get the remaining number of hours."""
|
||||||
|
return self.data['Remain_Time_H']
|
||||||
|
|
||||||
|
@property
|
||||||
|
def remain_time_minutes(self):
|
||||||
|
"""Get the remaining number of minutes."""
|
||||||
|
return self.data['Remain_Time_M']
|
||||||
|
|
||||||
|
@property
|
||||||
|
def initial_time_hours(self):
|
||||||
|
"""Get the initial number of hours."""
|
||||||
|
return self.data['Initial_Time_H']
|
||||||
|
|
||||||
|
@property
|
||||||
|
def initial_time_minutes(self):
|
||||||
|
"""Get the initial number of minutes."""
|
||||||
|
return self.data['Initial_Time_M']
|
||||||
|
|
||||||
|
@property
|
||||||
|
def course(self):
|
||||||
|
"""Get the current course."""
|
||||||
|
raise NotImplementedError
|
||||||
|
|
||||||
|
@property
|
||||||
|
def smart_course(self):
|
||||||
|
"""Get the current smart course."""
|
||||||
|
raise NotImplementedError
|
Loading…
x
Reference in New Issue
Block a user