Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
131 changes: 107 additions & 24 deletions DoHome_HassAssistant_Component/custom_components/dohome/light.py
Original file line number Diff line number Diff line change
Expand Up @@ -11,17 +11,45 @@
import homeassistant.util.color as color_util
from homeassistant.components.light import (
ATTR_BRIGHTNESS,
ATTR_COLOR_TEMP,
ATTR_EFFECT,
ATTR_HS_COLOR,
PLATFORM_SCHEMA,
SUPPORT_BRIGHTNESS,
SUPPORT_COLOR,
ATTR_RGBWW_COLOR,
LightEntity,
LightEntityFeature,
ColorMode
)

from . import (DOHOME_GATEWAY, DoHomeDevice)

EFFECTS_DICT = {
"Colorful gradient": 1,
"red gradient": 2,
"Green gradient": 3,
"blue gradient": 4,
"yellow gradient": 5,
"Cyan gradient": 6,
"Purple gradient": 7,
"White gradient": 8,
"Red strobe": 9,
"Green strobe": 10,
"Blue strobe": 11,
"yellow strobe": 12,
"Red-green gradient": 13,
"red and blue gradient": 14,
"Green-blue gradient": 15,
"Red-green jump": 16,
"Red and blue jump": 17,
"Green-blue transition": 18,
"Red and green strobe": 19,
"red and blue strobe": 20,
"Green and blue strobe": 21,
"Colorful jump": 22,
"Colorful strobe": 23,
"White strobe": 24,
"Three-color gradient": 25,
"Three color jump": 26,
"Three-color strobe": 27
}

_LOGGER = logging.getLogger(__name__)

def setup_platform(hass, config, add_devices, discovery_info=None):
Expand All @@ -43,8 +71,8 @@ def __init__(self, hass, device):

self._device = device
self._state = False
self._rgb = (255, 255, 255)
self._brightness = 100
self._rgb = (0, 0, 0, 0, 0)
self._brightness = 255
self._socket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)

DoHomeDevice.__init__(self, device['name'], device)
Expand All @@ -55,38 +83,93 @@ def brightness(self):
return self._brightness

@property
def hs_color(self):
def rgbww_color(self):
"""Return the color property."""
return color_util.color_RGB_to_hs(*self._rgb)
return self._rgb

@property
def is_on(self):
"""Return true if light is on."""
return self._state

def update(self):
"""Return true if light is on."""
data = { "cmd":25 }
op = json.dumps(data)

try:
resp = self._send_cmd(self._device,'cmd=ctrl&devices={[' + self._device["sid"] + ']}&op=' + op + '}', 25)
self._rgb = (int(resp["r"]/self.brightness),
int(resp["g"]/self.brightness),
int(resp["b"]/self.brightness),
int(resp["w"]*255/5000),
int(resp["m"]*255/5000))
self._state = (sum(self._rgb) > 0)

except:
_LOGGER.debug("Error when reading device state: %s", resp)

_LOGGER.debug("Color values: %s", str(self._rgb))
_LOGGER.debug("update: %s", str(self._state))

@property
def supported_features(self):
"""Return the supported features."""
return SUPPORT_BRIGHTNESS | SUPPORT_COLOR
return LightEntityFeature.EFFECT | LightEntityFeature.FLASH

@property
def effect_list(self):
"""Return the supported effects."""
return list(EFFECTS_DICT.keys())

@property
def supported_color_modes(self):
"""Return the supported color modes."""
return [ColorMode.RGBWW]

@property
def color_mode(self):
"""Return the supported color modes."""
return ColorMode.RGBWW

@property
def unique_id(self):
return self._device["name"]

def turn_on(self, **kwargs):
"""Turn the light on."""
if ATTR_HS_COLOR in kwargs:
self._rgb = color_util.color_hs_to_RGB(*kwargs[ATTR_HS_COLOR])
_LOGGER.debug("Turn on params: %s", kwargs)

if ATTR_RGBWW_COLOR in kwargs:
self._rgb = kwargs[ATTR_RGBWW_COLOR]

if ATTR_BRIGHTNESS in kwargs:
self._brightness = int(100 * kwargs[ATTR_BRIGHTNESS] / 255)
self._brightness = kwargs[ATTR_BRIGHTNESS]

self._state = True
data = {
"cmd":6,
"r":int(50 * self._rgb[0] / 255)*self._brightness,
"g":int(50 * self._rgb[1] / 255)*self._brightness,
"b":int(50 * self._rgb[2] / 255)*self._brightness,
"w":0,
"m":0}
op = json.dumps(data)
self._send_cmd(self._device,'cmd=ctrl&devices={[' + self._device["sid"] + ']}&op=' + op + '}', 6)

if ATTR_EFFECT in kwargs:
data = {
"cmd":7,
"index":EFFECTS_DICT[kwargs[ATTR_EFFECT]],
}
op = json.dumps(data)
self._send_cmd(self._device,'cmd=ctrl&devices={[' + self._device["sid"] + ']}&op=' + op + '}', 7)

else:
#empty kwargs means that turn on button has pressed without any color specification
if len(kwargs) == 0:
self._rgb = (0, 0, 0, 255, 0)

data = {
"cmd":6,
"r":int(self._rgb[0] * self._brightness * 5000 / 65025),
"g":int(self._rgb[1] * self._brightness * 5000 / 65025),
"b":int(self._rgb[2] * self._brightness * 5000 / 65025),
"w":int(self._rgb[3] * 5000 / 255),
"m":int(self._rgb[4] * 5000 / 255)
}
op = json.dumps(data)
self._send_cmd(self._device,'cmd=ctrl&devices={[' + self._device["sid"] + ']}&op=' + op + '}', 6)

def turn_off(self, **kwargs):
"""Turn the light off."""
Expand Down Expand Up @@ -123,4 +206,4 @@ def _send_cmd(self, device, cmd, rtn_cmd):
return resp
else:
_LOGGER.debug("Non matching response. device %s, but got %s", device["sid"], dic["dev"][8:12])
return None
return None
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@
from datetime import timedelta
from homeassistant.helpers.event import track_time_interval

from homeassistant.const import TEMP_CELSIUS
from homeassistant.const import ATTR_UNIT_OF_MEASUREMENT, UnitOfTemperature

from . import (DOHOME_GATEWAY, DoHomeDevice)

Expand Down Expand Up @@ -84,7 +84,7 @@ def state(self):
def unit_of_measurement(self):
"""Return the unit of measurement of this entity, if any."""
if self._is_temperature and self.current_value != 100:
return TEMP_CELSIUS
return UnitOfTemperature.CELSIUS
elif self._is_humidity and self.current_value != 0:
return '%'
elif self._is_illumination and self.current_value != -1:
Expand Down