From ce535fbf885a7adb214d8d9c54b32c0b62c88cf8 Mon Sep 17 00:00:00 2001 From: Sebastian Muszynski Date: Sat, 21 Oct 2017 11:47:00 +0200 Subject: [PATCH 1/4] Device support of the Xioami Philips Smart LED Ball Lamp. --- miio/__init__.py | 1 + miio/discovery.py | 2 +- miio/philips_bulb.py | 91 ++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 93 insertions(+), 1 deletion(-) create mode 100644 miio/philips_bulb.py diff --git a/miio/__init__.py b/miio/__init__.py index 0fc881331..8afae63f2 100644 --- a/miio/__init__.py +++ b/miio/__init__.py @@ -10,6 +10,7 @@ from miio.waterpurifier import WaterPurifier from miio.strip import Strip from miio.ceil import Ceil +from miio.philips_bulb import PhilipsBulb from miio.philips_eyecare import PhilipsEyecare from miio.chuangmi_ir import ChuangmiIr from miio.fan import Fan diff --git a/miio/discovery.py b/miio/discovery.py index 59d0e2ac5..f689bbcee 100644 --- a/miio/discovery.py +++ b/miio/discovery.py @@ -29,7 +29,7 @@ "zhimi-humidifier-v1": AirHumidifier, "yunmi-waterpuri-v2": WaterPurifier, # It looks like philips devices cannot be discovered via mdns - "philips-light-bulb": Ceil, + "philips-light-bulb": PhilipsBulb, "philips-light-ceil": Ceil, "philips-light-sread1": PhilipsEyecare, "xiaomi-wifispeaker-v1": WifiSpeaker, # name needs to be checked diff --git a/miio/philips_bulb.py b/miio/philips_bulb.py new file mode 100644 index 000000000..d308c46a9 --- /dev/null +++ b/miio/philips_bulb.py @@ -0,0 +1,91 @@ +import logging +from .device import Device +from typing import Any, Dict +from collections import defaultdict + +_LOGGER = logging.getLogger(__name__) + + +class PhilipsBulbStatus: + """Container for status reports from Xiaomi Philips LED Ceiling Lamp""" + + def __init__(self, data: Dict[str, Any]) -> None: + # ['power': 'on', 'bright': 85, 'cct': 9, 'snm': 0, 'dv': 0] + self.data = data + + @property + def power(self) -> str: + return self.data["power"] + + @property + def is_on(self) -> bool: + return self.power == "on" + + @property + def brightness(self) -> int: + return self.data["bright"] + + @property + def color_temperature(self) -> int: + return self.data["cct"] + + @property + def scene(self) -> int: + return self.data["snm"] + + @property + def delay_off_countdown(self) -> int: + return self.data["dv"] + + def __str__(self) -> str: + s = "" % \ + (self.power, self.brightness, + self.color_temperature, self.scene, self.delay_off_countdown) + return s + + +class Bulb(Device): + """Main class representing Xiaomi Philips LED Ball Lamp.""" + + def on(self): + """Power on.""" + return self.send("set_power", ["on"]) + + def off(self): + """Power off.""" + return self.send("set_power", ["off"]) + + def set_brightness(self, level: int): + """Set brightness level.""" + return self.send("set_bright", [level]) + + def set_color_temperature(self, level: int): + """Set Correlated Color Temperature.""" + return self.send("set_cct", [level]) + + def delay_off(self, seconds: int): + """Set delay off seconds.""" + return self.send("delay_off", [seconds]) + + def set_scene(self, num: int): + """Set scene number.""" + return self.send("apply_fixed_scene", [num]) + + def status(self) -> PhilipsBulbStatus: + """Retrieve properties.""" + properties = ['power', 'bright', 'cct', 'snm', 'dv', ] + 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 CeilStatus(defaultdict(lambda: None, zip(properties, values))) From 8e63574d500d4ae995a3bce1cda728b574c89079 Mon Sep 17 00:00:00 2001 From: Sebastian Muszynski Date: Sat, 21 Oct 2017 11:50:55 +0200 Subject: [PATCH 2/4] Some glitches fixed. --- miio/philips_bulb.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/miio/philips_bulb.py b/miio/philips_bulb.py index d308c46a9..d4f3944e8 100644 --- a/miio/philips_bulb.py +++ b/miio/philips_bulb.py @@ -45,7 +45,7 @@ def __str__(self) -> str: return s -class Bulb(Device): +class PhilipsBulb(Device): """Main class representing Xiaomi Philips LED Ball Lamp.""" def on(self): @@ -88,4 +88,4 @@ def status(self) -> PhilipsBulbStatus: "count (%s) of received values.", properties_count, values_count) - return CeilStatus(defaultdict(lambda: None, zip(properties, values))) + return PhilipsBulbStatus(defaultdict(lambda: None, zip(properties, values))) From 803b95b62995ea1e559e32606b372a304aeae292 Mon Sep 17 00:00:00 2001 From: Sebastian Muszynski Date: Sat, 21 Oct 2017 11:55:14 +0200 Subject: [PATCH 3/4] Missing import added. --- miio/discovery.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/miio/discovery.py b/miio/discovery.py index f689bbcee..0f7c1b548 100644 --- a/miio/discovery.py +++ b/miio/discovery.py @@ -4,8 +4,8 @@ import inspect import codecs from . import (Device, Vacuum, Plug, PlugV1, Strip, AirPurifier, Ceil, - PhilipsEyecare, ChuangmiIr, AirHumidifier, WaterPurifier, - WifiSpeaker, Yeelight) + PhilipsBulb, PhilipsEyecare, ChuangmiIr, AirHumidifier, + WaterPurifier, WifiSpeaker, Yeelight) from typing import Union, Callable, Dict, Optional # noqa: F401 From 1af39e52299e38a3ce316942bbde3d84d11a7042 Mon Sep 17 00:00:00 2001 From: Sebastian Muszynski Date: Sat, 21 Oct 2017 11:55:36 +0200 Subject: [PATCH 4/4] Line too long fixed. --- miio/philips_bulb.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/miio/philips_bulb.py b/miio/philips_bulb.py index d4f3944e8..1ddc5f39e 100644 --- a/miio/philips_bulb.py +++ b/miio/philips_bulb.py @@ -88,4 +88,5 @@ def status(self) -> PhilipsBulbStatus: "count (%s) of received values.", properties_count, values_count) - return PhilipsBulbStatus(defaultdict(lambda: None, zip(properties, values))) + return PhilipsBulbStatus( + defaultdict(lambda: None, zip(properties, values)))