Skip to content

Commit

Permalink
Add support for Opple light (#16765)
Browse files Browse the repository at this point in the history
* Add support for Opple light

* Update docstring

* review fix

* review fix

* review fix
  • Loading branch information
jedmeng authored and balloob committed Sep 25, 2018
1 parent 5a22e7d commit 8e31168
Show file tree
Hide file tree
Showing 3 changed files with 151 additions and 0 deletions.
1 change: 1 addition & 0 deletions .coveragerc
Expand Up @@ -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
Expand Down
147 changes: 147 additions & 0 deletions 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)
3 changes: 3 additions & 0 deletions requirements_all.txt
Expand Up @@ -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

Expand Down

0 comments on commit 8e31168

Please sign in to comment.