Add support for Opple light
diff --git a/.coveragerc b/.coveragerc
index 2345cc13df21..1efa5eb68fa4 100644
--- a/.coveragerc
+++ b/.coveragerc
@@ -506,6 +506,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 000000000000..66850d04406b
--- /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 f9296ae28cdc..ecffb47fa73f 100644
--- a/requirements_all.txt
+++ b/requirements_all.txt
@@ -1005,6 +1005,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
 

## Description:


**Pull request in [home-assistant.io](https://github.com/home-assistant/home-assistant.io) with documentation (if applicable):** home-assistant/home-assistant.io#6328

## Example entry for `configuration.yaml` (if applicable):
```yaml
light:
  - platform: opple
    name: LIGHT_NAME
    host: IP_ADDRESS
```

## Checklist:
  - [x] The code change is tested and works locally.
  - [x] Local tests pass with `tox`. **Your PR cannot be merged unless tests pass**

If user exposed functionality or configuration variables are added/changed:
  - [x] Documentation added/updated in [home-assistant.io](https://github.com/home-assistant/home-assistant.io)

If the code communicates with devices, web services, or third-party tools:
  - [x] New dependencies have been added to the `REQUIREMENTS` variable ([example][ex-requir]).
  - [x] New dependencies are only imported inside functions that use them ([example][ex-import]).
  - [x] New or updated dependencies have been added to `requirements_all.txt` by running `script/gen_requirements_all.py`.
  - [x] New files were added to `.coveragerc`.


[ex-requir]: https://github.com/home-assistant/home-assistant/blob/dev/homeassistant/components/keyboard.py#L14
[ex-import]: https://github.com/home-assistant/home-assistant/blob/dev/homeassistant/components/keyboard.py#L54
