From b9831dd1dfadc43b67da60ada01899b59c2db724 Mon Sep 17 00:00:00 2001 From: Sebastian Muszynski Date: Thu, 12 Oct 2017 15:32:50 +0200 Subject: [PATCH] Device support of the Xiaomi PM2.5 Air Quality Monitor introduced. Fixes #70. --- miio/__init__.py | 1 + miio/airqualitymonitor.py | 65 +++++++++++++++++++++++++++++++++++++++ 2 files changed, 66 insertions(+) create mode 100644 miio/airqualitymonitor.py diff --git a/miio/__init__.py b/miio/__init__.py index 4dc553540..1f41bdfb9 100644 --- a/miio/__init__.py +++ b/miio/__init__.py @@ -14,6 +14,7 @@ from miio.chuangmi_ir import ChuangmiIr from miio.fan import Fan from miio.wifispeaker import WifiSpeaker +from miio.airqualitymonitor import AirQualityMonitor from miio.yeelight import Yeelight from miio.device import Device, DeviceException from miio.discovery import Discovery diff --git a/miio/airqualitymonitor.py b/miio/airqualitymonitor.py new file mode 100644 index 000000000..467649591 --- /dev/null +++ b/miio/airqualitymonitor.py @@ -0,0 +1,65 @@ +import logging +from collections import defaultdict +from .device import Device + +_LOGGER = logging.getLogger(__name__) + + +class AirQualityMonitorStatus: + def __init__(self, data): + # ['power': 'on', 'aqi': 34, 'battery': 0, 'usb_state': 'on'] + self.data = data + + @property + def power(self) -> str: + return self.data["power"] + + @property + def is_on(self) -> bool: + return self.power == "on" + + @property + def usb_power(self) -> bool: + return self.data["usb_state"] == "on" + + @property + def aqi(self) -> int: + return self.data["aqi"] + + @property + def battery(self) -> int: + return self.data["battery"] + + +class AirQualityMonitor(Device): + def __init__(self, *args, **kwargs): + super().__init__(*args, **kwargs) + + def status(self): + """Return device status.""" + + properties = ['power', 'aqi', 'battery', 'usb_state'] + + values = self.send( + "get_prop", + properties + ) + + properties_count = len(properties) + values_count = len(values) + if properties_count != values_count: + _LOGGER.debug( + "Count (%s) of requested properties does not match the " + "count (%s) of received values.", + properties_count, values_count) + + return AirQualityMonitorStatus( + defaultdict(lambda: None, 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"])