Skip to content

Commit

Permalink
Some improvements of the air purifier support (#40)
Browse files Browse the repository at this point in the history
* Output of the AirPurifierStatus updated.
Buzzer fixed.

* Missing power on/off added.

* Properties removed which aren't provided/exposed at current firmware.
  • Loading branch information
syssi authored and rytilahti committed Aug 27, 2017
1 parent 27b0004 commit 672628a
Showing 1 changed file with 45 additions and 44 deletions.
89 changes: 45 additions & 44 deletions mirobo/airpurifier.py
Original file line number Diff line number Diff line change
Expand Up @@ -25,8 +25,7 @@ def status(self):
# A few more properties:
properties = ['power', 'aqi', 'humidity', 'temp_dec',
'mode', 'led', 'led_b', 'buzzer', 'child_lock',
'limit_hum', 'trans_level', 'bright',
'favorite_level', 'filter1_life', 'act_det',
'bright', 'favorite_level', 'filter1_life',
'f1_hour_used', 'use_time', 'motor1_speed']

values = self.send(
Expand All @@ -35,6 +34,14 @@ def status(self):
)
return AirPurifierStatus(dict(zip(properties, values)))

def on(self):
"""Power on."""
return self.send("set_power", ["on"])

def off(self):
"""Power off."""
return self.send("set_power", ["off"])

def set_mode(self, mode: OperationMode):
"""Set mode."""

Expand Down Expand Up @@ -62,29 +69,38 @@ def set_led(self, led: bool):
return self.send("set_led", ['off'])

def set_buzzer(self, buzzer: bool):
"""Set buzzer."""
"""Set buzzer on/off."""
if buzzer:
return self.send("set_mode", ["on"])
return self.send("set_buzzer", ["on"])
else:
return self.send("set_mode", ["off"])

def set_humidity_limit(self, limit: int):
"""Set humidity limit."""

# 40, 50, 60, 70 or 80
return self.send("set_limit_hum", [limit])
return self.send("set_buzzer", ["off"])


class AirPurifierStatus:
"""Container for status reports from the air purifier."""
def __init__(self, data: Dict[str, Any]) -> None:
# Response of a Air Purifier Pro:
# ['power': 'off', 'aqi': 41, 'humidity': 62, 'temp_dec': 293,
# 'mode': 'auto', 'led': 'on', 'led_b': null, 'buzzer': null,
# 'child_lock': 'off', 'limit_hum': null, 'trans_level': null,
# 'bright': 71, 'favorite_level': 17, 'filter1_life': 77,
# 'act_det': null, 'f1_hour_used': 771, 'use_time': 2776200,
# 'motor1_speed': 0]
"""
Response of a Air Purifier Pro:
['power': 'off', 'aqi': 41, 'humidity': 62, 'temp_dec': 293,
'mode': 'auto', 'led': 'on', 'led_b': null, 'buzzer': null,
'child_lock': 'off', 'limit_hum': null, 'trans_level': null,
'bright': 71, 'favorite_level': 17, 'filter1_life': 77,
'act_det': null, 'f1_hour_used': 771, 'use_time': 2776200,
'motor1_speed': 0]
Response of a Air Purifier 2:
['power': 'off', 'aqi': 141, 'humidity': 64, 'temp_dec': 236,
'mode': 'auto', 'led': 'on', 'led_b': 1, 'buzzer': 'on',
'child_lock': 'off', 'limit_hum': null, 'trans_level': null,
'bright': null, 'favorite_level': 10, 'filter1_life': 80,
'act_det': null, 'f1_hour_used': 680 ]
use_time and motor1_speed is missing because a request is limitted
to 16 properties.
"""

self.data = data

@property
Expand All @@ -105,7 +121,8 @@ def humidity(self) -> int:

@property
def temperature(self) -> float:
return self.data["temp_dec"] / 10.0
if self.data["temp_dec"] is not None:
return self.data["temp_dec"] / 10.0

@property
def mode(self) -> OperationMode:
Expand All @@ -128,31 +145,19 @@ def buzzer(self) -> bool:
def child_lock(self) -> bool:
return self.data["child_lock"] == "on"

@property
def humidity_limit(self) -> int:
return self.data["limit_hum"]

@property
def trans_level(self) -> str:
return self.data["trans_level"]

@property
def bright(self) -> int:
return self.data["bright"]

@property
def favorite_level(self) -> int:
# Favorite level used when the mode is `favorite`. Between 0 and 16.
# Favorite level used when the mode is `favorite`.
return self.data["favorite_level"]

@property
def filter_life_remaining(self) -> int:
return self.data["filter1_life"]

@property
def act_det(self) -> bool:
return self.data["act_det"] == "on"

@property
def filter_hours_used(self) -> int:
return self.data["f1_hour_used"]
Expand All @@ -166,18 +171,14 @@ def motor_speed(self) -> int:
return self.data["motor1_speed"]

def __str__(self) -> str:
s = "<AirPurifierStatus power=%s, aqi=%s temperature=%s%%, " \
"humidity=%s%% mode=%s%%, led=%s%%, " \
"led_brightness=%s%% buzzer=%s%%, " \
"child_lock=%s%%, humidity_limit=%s%%, trans_level=%s%%, " \
"bright=%s%%, favorite_level=%s%%, filter_life_remaining=%s%%, " \
"act_det=%s%%, filter_hours_used=%s%%, use_time=%s%%, " \
"motor_speed=%s%%>" % \
(self.power, self.aqi, self.temperature,
self.humidity, self.mode, self.led,
self.led_brightness, self.buzzer,
self.child_lock, self.humidity_limit, self.trans_level,
s = "<AirPurifierStatus power=%s, aqi=%s temperature=%s, " \
"humidity=%s%%, mode=%s, led=%s, led_brightness=%s, buzzer=%s, " \
"child_lock=%s, bright=%s, favorite_level=%s, " \
"filter_life_remaining=%s, filter_hours_used=%s, " \
"use_time=%s, motor_speed=%s>" % \
(self.power, self.aqi, self.temperature, self.humidity, self.mode,
self.led, self.led_brightness, self.buzzer, self.child_lock,
self.bright, self.favorite_level, self.filter_life_remaining,
self.act_det, self.filter_hours_used, self.use_time,
self.filter_hours_used, self.use_time,
self.motor_speed)
return s

0 comments on commit 672628a

Please sign in to comment.