From 8e311686d0cfeafa04345eeaa670f442ce43d2d1 Mon Sep 17 00:00:00 2001 From: Jedmeng Date: Wed, 26 Sep 2018 02:49:37 +0800 Subject: [PATCH] Add support for Opple light (#16765) * Add support for Opple light * Update docstring * review fix * review fix * review fix --- .coveragerc | 1 + homeassistant/components/light/opple.py | 147 ++++++++++++++++++++++++ requirements_all.txt | 3 + 3 files changed, 151 insertions(+) create mode 100644 homeassistant/components/light/opple.py diff --git a/.coveragerc b/.coveragerc index defbc0022bd..a935564791a 100644 --- a/.coveragerc +++ b/.coveragerc @@ -510,6 +510,7 @@ omit = homeassistant/components/light/lw12wifi.py homeassistant/components/light/mystrom.py homeassistant/components/light/nanoleaf_aurora.py + homeassistant/components/light/opple.py homeassistant/components/light/osramlightify.py homeassistant/components/light/piglow.py homeassistant/components/light/rpi_gpio_pwm.py diff --git a/homeassistant/components/light/opple.py b/homeassistant/components/light/opple.py new file mode 100644 index 00000000000..66850d04406 --- /dev/null +++ b/homeassistant/components/light/opple.py @@ -0,0 +1,147 @@ +""" +Support for the Opple light. + +For more details about this platform, please refer to the documentation at +https://home-assistant.io/components/light.opple/ +""" + +import logging + +import voluptuous as vol + +from homeassistant.components.light import ( + ATTR_BRIGHTNESS, ATTR_COLOR_TEMP, PLATFORM_SCHEMA, SUPPORT_BRIGHTNESS, + SUPPORT_COLOR_TEMP, Light) +from homeassistant.const import CONF_HOST, CONF_NAME +import homeassistant.helpers.config_validation as cv +from homeassistant.util.color import \ + color_temperature_kelvin_to_mired as kelvin_to_mired +from homeassistant.util.color import \ + color_temperature_mired_to_kelvin as mired_to_kelvin + +REQUIREMENTS = ['pyoppleio==1.0.5'] + +_LOGGER = logging.getLogger(__name__) + +DEFAULT_NAME = "opple light" + +PLATFORM_SCHEMA = PLATFORM_SCHEMA.extend({ + vol.Required(CONF_HOST): cv.string, + vol.Optional(CONF_NAME, default=DEFAULT_NAME): cv.string +}) + + +def setup_platform(hass, config, add_entities, discovery_info=None): + """Set up Opple light platform.""" + name = config[CONF_NAME] + host = config[CONF_HOST] + entity = OppleLight(name, host) + add_entities([entity]) + + _LOGGER.debug("Init light %s %s", host, entity.unique_id) + + +class OppleLight(Light): + """Opple light device.""" + + def __init__(self, name, host): + """Initialize an Opple light.""" + from pyoppleio.OppleLightDevice import OppleLightDevice + self._device = OppleLightDevice(host) + + self._name = name + self._is_on = None + self._brightness = None + self._color_temp = None + + @property + def available(self): + """Return True if light is available.""" + return self._device.is_online + + @property + def unique_id(self): + """Return unique ID for light.""" + return self._device.mac + + @property + def name(self): + """Return the display name of this light.""" + return self._name + + @property + def is_on(self): + """Return true if light is on.""" + return self._is_on + + @property + def brightness(self): + """Return the brightness of the light.""" + return self._brightness + + @property + def color_temp(self): + """Return the color temperature of this light.""" + return kelvin_to_mired(self._color_temp) + + @property + def min_mireds(self): + """Return minimum supported color temperature.""" + return 175 + + @property + def max_mireds(self): + """Return maximum supported color temperature.""" + return 333 + + @property + def supported_features(self): + """Flag supported features.""" + return SUPPORT_BRIGHTNESS | SUPPORT_COLOR_TEMP + + def turn_on(self, **kwargs): + """Instruct the light to turn on.""" + _LOGGER.debug("Turn on light %s %s", self._device.ip, kwargs) + if not self.is_on: + self._device.power_on = True + + if ATTR_BRIGHTNESS in kwargs and \ + self.brightness != kwargs[ATTR_BRIGHTNESS]: + self._device.brightness = kwargs[ATTR_BRIGHTNESS] + + if ATTR_COLOR_TEMP in kwargs and \ + self.brightness != kwargs[ATTR_COLOR_TEMP]: + color_temp = mired_to_kelvin(kwargs[ATTR_COLOR_TEMP]) + self._device.color_temperature = color_temp + + def turn_off(self, **kwargs): + """Instruct the light to turn off.""" + self._device.power_on = False + _LOGGER.debug("Turn off light %s", self._device.ip) + + def update(self): + """Synchronize state with light.""" + prev_available = self.available + self._device.update() + + if prev_available == self.available and \ + self._is_on == self._device.power_on and \ + self._brightness == self._device.brightness and \ + self._color_temp == self._device.color_temperature: + return + + if not self.available: + _LOGGER.debug("Light %s is offline", self._device.ip) + return + + self._is_on = self._device.power_on + self._brightness = self._device.brightness + self._color_temp = self._device.color_temperature + + if not self.is_on: + _LOGGER.debug("Update light %s success: power off", + self._device.ip) + else: + _LOGGER.debug("Update light %s success: power on brightness %s " + "color temperature %s", + self._device.ip, self._brightness, self._color_temp) diff --git a/requirements_all.txt b/requirements_all.txt index 40d4442dee2..b6f9dd4875e 100644 --- a/requirements_all.txt +++ b/requirements_all.txt @@ -1014,6 +1014,9 @@ pynx584==0.4 # homeassistant.components.openuv pyopenuv==1.0.4 +# homeassistant.components.light.opple +pyoppleio==1.0.5 + # homeassistant.components.iota pyota==2.0.5