From d869e44f166a43e79cd4e1e1e81e4f47b4e2615e Mon Sep 17 00:00:00 2001 From: starkillerOG Date: Mon, 8 Jan 2018 18:01:18 +0100 Subject: [PATCH 01/11] Hyperion: Add brightness, HDMI and effect support - added brightness support to dim the hyperion light - changed the "OFF" command to set the color to [0,0,0] after clearing all priorities. This is neccesary to keep the light turned off when an HDMI grabber is used for ambilight with hyperion. - added HDMI ambilight mode recognition and control. by setting the "hdmi_priority" in your "configuration.yaml" file (defaults to 880), home assistant will now be able to recognize when the hyperion light is in HDMI ambilight mode and will change its icon to an HDMI symbol and set the status to ON. Switching the hyperion light to HDMI ambilight mode can be done through the effect option (clears all priorities such that the HDMI grabber remains). - added effect support for the default effects of hyperion, a custom list can be defined in the "configuration.yaml" file by using the "effect_list" option. --- homeassistant/components/light/hyperion.py | 122 +++++++++++++++++++-- 1 file changed, 113 insertions(+), 9 deletions(-) diff --git a/homeassistant/components/light/hyperion.py b/homeassistant/components/light/hyperion.py index 88bdc1a4c9537f..2640893478c79c 100644 --- a/homeassistant/components/light/hyperion.py +++ b/homeassistant/components/light/hyperion.py @@ -11,7 +11,7 @@ import voluptuous as vol from homeassistant.components.light import ( - ATTR_RGB_COLOR, SUPPORT_RGB_COLOR, Light, PLATFORM_SCHEMA) + ATTR_BRIGHTNESS, ATTR_RGB_COLOR, ATTR_EFFECT, SUPPORT_BRIGHTNESS, SUPPORT_RGB_COLOR, SUPPORT_EFFECT, Light, PLATFORM_SCHEMA) from homeassistant.const import (CONF_HOST, CONF_PORT, CONF_NAME) import homeassistant.helpers.config_validation as cv @@ -19,13 +19,17 @@ CONF_DEFAULT_COLOR = 'default_color' CONF_PRIORITY = 'priority' +CONF_HDMI_PRIORITY = 'hdmi_priority' +CONF_EFFECT_LIST = 'effect_list' DEFAULT_COLOR = [255, 255, 255] DEFAULT_NAME = 'Hyperion' DEFAULT_PORT = 19444 DEFAULT_PRIORITY = 128 +DEFAULT_HDMI_PRIORITY = 880 +DEFAULT_EFFECT_LIST = ['HDMI', 'Cinema brighten lights', 'Cinema dim lights', 'Knight rider', 'Blue mood blobs', 'Cold mood blobs', 'Full color mood blobs', 'Green mood blobs', 'Red mood blobs', 'Warm mood blobs', 'Police Lights Single', 'Police Lights Solid', 'Rainbow mood', 'Rainbow swirl fast', 'Rainbow swirl', 'Random', 'Running dots', 'System Shutdown', 'Snake', 'Sparks Color', 'Sparks', 'Strobe blue', 'Strobe Raspbmc', 'Strobe white', 'Color traces', 'UDP multicast listener', 'UDP listener', 'X-Mas'] -SUPPORT_HYPERION = SUPPORT_RGB_COLOR +SUPPORT_HYPERION = (SUPPORT_RGB_COLOR | SUPPORT_BRIGHTNESS | SUPPORT_EFFECT) PLATFORM_SCHEMA = PLATFORM_SCHEMA.extend({ vol.Required(CONF_HOST): cv.string, @@ -35,6 +39,8 @@ [vol.All(vol.Coerce(int), vol.Range(min=0, max=255))]), vol.Optional(CONF_NAME, default=DEFAULT_NAME): cv.string, vol.Optional(CONF_PRIORITY, default=DEFAULT_PRIORITY): cv.positive_int, + vol.Optional(CONF_HDMI_PRIORITY, default=DEFAULT_HDMI_PRIORITY): cv.positive_int, + vol.Optional(CONF_EFFECT_LIST, default=DEFAULT_EFFECT_LIST): vol.All(cv.ensure_list, [cv.string]), }) @@ -43,10 +49,12 @@ def setup_platform(hass, config, add_devices, discovery_info=None): host = config.get(CONF_HOST) port = config.get(CONF_PORT) priority = config.get(CONF_PRIORITY) + hdmi_priority = config.get(CONF_HDMI_PRIORITY) default_color = config.get(CONF_DEFAULT_COLOR) + effect_list = config.get(CONF_EFFECT_LIST) device = Hyperion(config.get(CONF_NAME), host, port, priority, - default_color) + default_color, hdmi_priority, effect_list) if device.setup(): add_devices([device]) @@ -57,20 +65,32 @@ def setup_platform(hass, config, add_devices, discovery_info=None): class Hyperion(Light): """Representation of a Hyperion remote.""" - def __init__(self, name, host, port, priority, default_color): + def __init__(self, name, host, port, priority, default_color, hdmi_priority, effect_list): """Initialize the light.""" self._host = host self._port = port self._name = name self._priority = priority + self._hdmi_priority = hdmi_priority self._default_color = default_color self._rgb_color = [0, 0, 0] + self._rgb_mem = [0, 0, 0] + self._brightness = 255 + self._icon = 'mdi:lightbulb' + self._effect_list = effect_list + self._effect = 'none' + self._skip_check = False @property def name(self): """Return the name of the light.""" return self._name + @property + def brightness(self): + """Return the brightness of this light between 0..255.""" + return self._brightness + @property def rgb_color(self): """Return last RGB color value set.""" @@ -81,6 +101,21 @@ def is_on(self): """Return true if not black.""" return self._rgb_color != [0, 0, 0] + @property + def icon(self): + """Return state specific icon.""" + return self._icon + + @property + def effect(self): + """Return the current effect.""" + return self._effect + + @property + def effect_list(self): + """Return the list of supported effects.""" + return self._effect_list + @property def supported_features(self): """Flag supported features.""" @@ -90,34 +125,103 @@ def turn_on(self, **kwargs): """Turn the lights on.""" if ATTR_RGB_COLOR in kwargs: self._rgb_color = kwargs[ATTR_RGB_COLOR] - else: + self._rgb_mem = kwargs[ATTR_RGB_COLOR] + elif self._rgb_mem == [0, 0, 0]: self._rgb_color = self._default_color + self._rgb_mem = self._default_color + else: + self._rgb_color = self._rgb_mem + if ATTR_BRIGHTNESS in kwargs: + self._brightness = kwargs[ATTR_BRIGHTNESS] + + if ATTR_EFFECT in kwargs: + self._effect = kwargs[ATTR_EFFECT] + if self._effect == 'HDMI': + self.json_request({'command': 'clearall'}) + self._icon = 'mdi:video-input-hdmi' + self._brightness = 255 + self._rgb_color = [125, 125, 125] + self._skip_check = True + else: + self.json_request({ + 'command': 'effect', + 'priority': self._priority, + 'effect': {'name': self._effect} + }) + self._icon = 'mdi:lava-lamp' + self._rgb_color = [175,0,255] + self._skip_check = True + return + + cal_color = [int(round(x*float(self._brightness)/255)) for x in self._rgb_color] self.json_request({ 'command': 'color', 'priority': self._priority, - 'color': self._rgb_color + 'color': cal_color }) def turn_off(self, **kwargs): """Disconnect all remotes.""" self.json_request({'command': 'clearall'}) + self.json_request({ + 'command': 'color', + 'priority': self._priority, + 'color': [0, 0, 0] + }) self._rgb_color = [0, 0, 0] def update(self): - """Get the remote's active color.""" + """Get the lights status.""" + # postpone the immediate state check for changes that take time + if self._skip_check == True: + self._skip_check = False + return response = self.json_request({'command': 'serverinfo'}) if response: # workaround for outdated Hyperion if 'activeLedColor' not in response['info']: self._rgb_color = self._default_color + self._rgb_mem = self._default_color + self._brightness = 255 + self._icon = 'mdi:lightbulb' + self._effect = 'none' return - + # Check if Hyperion is in ambilight mode trough an HDMI grabber + try: + if (response['info']['priorities'][0]['priority']) == self._hdmi_priority: + self._brightness = 255 + self._rgb_color = [125, 125, 125] + self._icon = 'mdi:video-input-hdmi' + self._effect = 'HDMI' + return + except: + pass + if response['info']['activeLedColor'] == []: - self._rgb_color = [0, 0, 0] + # Get the active effect + if response['info']['activeEffects'] != []: + self._rgb_color = [175,0,255] + self._icon = 'mdi:lava-lamp' + try: + effect_script = response['info']['activeEffects'][0]["script"] + effect_script = effect_script.split('/')[-1][:-3].split("-")[0] + self._effect = [x for x in self._effect_list if (effect_script.lower() in x.lower())][0] + except: + self._effect = 'none' + # Bulb off state + else: + self._rgb_color = [0, 0, 0] + self._icon = 'mdi:lightbulb' + self._effect = 'none' else: + # Get the RGB color self._rgb_color =\ response['info']['activeLedColor'][0]['RGB Value'] + self._brightness = max(self._rgb_color) + self._rgb_mem = [int(round(float(x)*255/self._brightness)) for x in self._rgb_color] + self._icon = 'mdi:lightbulb' + self._effect = 'none' def setup(self): """Get the hostname of the remote.""" From aab5b8bcee15dfb4fc5ac59b688de59eb334b78a Mon Sep 17 00:00:00 2001 From: starkillerOG Date: Tue, 9 Jan 2018 00:03:24 +0100 Subject: [PATCH 02/11] Hyperion: Add brightness, HDMI and effect support - added brightness support to dim the hyperion light - changed the "OFF" command to set the color to [0,0,0] after clearing all priorities. This is neccesary to keep the light turned off when an HDMI grabber is used for ambilight with hyperion. - added HDMI ambilight mode recognition and control. by setting the "hdmi_priority" in your "configuration.yaml" file (defaults to 880), home assistant will now be able to recognize when the hyperion light is in HDMI ambilight mode and will change its icon to an HDMI symbol and set the status to ON. Switching the hyperion light to HDMI ambilight mode can be done through the effect option (clears all priorities such that the HDMI grabber remains). - added effect support for the default effects of hyperion, a custom list can be defined in the "configuration.yaml" file by using the "effect_list" option. - fixed some style issues with too long lines --- homeassistant/components/light/hyperion.py | 45 ++++++++++++++-------- 1 file changed, 30 insertions(+), 15 deletions(-) diff --git a/homeassistant/components/light/hyperion.py b/homeassistant/components/light/hyperion.py index 2640893478c79c..47d928044064b6 100644 --- a/homeassistant/components/light/hyperion.py +++ b/homeassistant/components/light/hyperion.py @@ -11,7 +11,8 @@ import voluptuous as vol from homeassistant.components.light import ( - ATTR_BRIGHTNESS, ATTR_RGB_COLOR, ATTR_EFFECT, SUPPORT_BRIGHTNESS, SUPPORT_RGB_COLOR, SUPPORT_EFFECT, Light, PLATFORM_SCHEMA) + ATTR_BRIGHTNESS, ATTR_RGB_COLOR, ATTR_EFFECT, SUPPORT_BRIGHTNESS, + SUPPORT_RGB_COLOR, SUPPORT_EFFECT, Light, PLATFORM_SCHEMA) from homeassistant.const import (CONF_HOST, CONF_PORT, CONF_NAME) import homeassistant.helpers.config_validation as cv @@ -27,7 +28,14 @@ DEFAULT_PORT = 19444 DEFAULT_PRIORITY = 128 DEFAULT_HDMI_PRIORITY = 880 -DEFAULT_EFFECT_LIST = ['HDMI', 'Cinema brighten lights', 'Cinema dim lights', 'Knight rider', 'Blue mood blobs', 'Cold mood blobs', 'Full color mood blobs', 'Green mood blobs', 'Red mood blobs', 'Warm mood blobs', 'Police Lights Single', 'Police Lights Solid', 'Rainbow mood', 'Rainbow swirl fast', 'Rainbow swirl', 'Random', 'Running dots', 'System Shutdown', 'Snake', 'Sparks Color', 'Sparks', 'Strobe blue', 'Strobe Raspbmc', 'Strobe white', 'Color traces', 'UDP multicast listener', 'UDP listener', 'X-Mas'] +DEFAULT_EFFECT_LIST = ['HDMI', 'Cinema brighten lights', 'Cinema dim lights', + 'Knight rider', 'Blue mood blobs', 'Cold mood blobs', + 'Full color mood blobs', 'Green mood blobs', 'Red mood blobs', + 'Warm mood blobs', 'Police Lights Single', 'Police Lights Solid', + 'Rainbow mood', 'Rainbow swirl fast', 'Rainbow swirl', 'Random', + 'Running dots', 'System Shutdown', 'Snake', 'Sparks Color', 'Sparks', + 'Strobe blue', 'Strobe Raspbmc', 'Strobe white', 'Color traces', + 'UDP multicast listener', 'UDP listener', 'X-Mas'] SUPPORT_HYPERION = (SUPPORT_RGB_COLOR | SUPPORT_BRIGHTNESS | SUPPORT_EFFECT) @@ -39,8 +47,10 @@ [vol.All(vol.Coerce(int), vol.Range(min=0, max=255))]), vol.Optional(CONF_NAME, default=DEFAULT_NAME): cv.string, vol.Optional(CONF_PRIORITY, default=DEFAULT_PRIORITY): cv.positive_int, - vol.Optional(CONF_HDMI_PRIORITY, default=DEFAULT_HDMI_PRIORITY): cv.positive_int, - vol.Optional(CONF_EFFECT_LIST, default=DEFAULT_EFFECT_LIST): vol.All(cv.ensure_list, [cv.string]), + vol.Optional(CONF_HDMI_PRIORITY, + default=DEFAULT_HDMI_PRIORITY): cv.positive_int, + vol.Optional(CONF_EFFECT_LIST, + default=DEFAULT_EFFECT_LIST): vol.All(cv.ensure_list, [cv.string]), }) @@ -65,7 +75,8 @@ def setup_platform(hass, config, add_devices, discovery_info=None): class Hyperion(Light): """Representation of a Hyperion remote.""" - def __init__(self, name, host, port, priority, default_color, hdmi_priority, effect_list): + def __init__(self, name, host, port, priority, default_color, + hdmi_priority, effect_list): """Initialize the light.""" self._host = host self._port = port @@ -150,11 +161,12 @@ def turn_on(self, **kwargs): 'effect': {'name': self._effect} }) self._icon = 'mdi:lava-lamp' - self._rgb_color = [175,0,255] + self._rgb_color = [175, 0, 255] self._skip_check = True return - cal_color = [int(round(x*float(self._brightness)/255)) for x in self._rgb_color] + cal_color = [int(round(x*float(self._brightness)/255)) + for x in self._rgb_color] self.json_request({ 'command': 'color', 'priority': self._priority, @@ -174,7 +186,7 @@ def turn_off(self, **kwargs): def update(self): """Get the lights status.""" # postpone the immediate state check for changes that take time - if self._skip_check == True: + if self._skip_check: self._skip_check = False return response = self.json_request({'command': 'serverinfo'}) @@ -189,7 +201,8 @@ def update(self): return # Check if Hyperion is in ambilight mode trough an HDMI grabber try: - if (response['info']['priorities'][0]['priority']) == self._hdmi_priority: + active_priority = response['info']['priorities'][0]['priority'] + if active_priority == self._hdmi_priority: self._brightness = 255 self._rgb_color = [125, 125, 125] self._icon = 'mdi:video-input-hdmi' @@ -197,16 +210,17 @@ def update(self): return except: pass - + if response['info']['activeLedColor'] == []: # Get the active effect if response['info']['activeEffects'] != []: - self._rgb_color = [175,0,255] + self._rgb_color = [175, 0, 255] self._icon = 'mdi:lava-lamp' try: - effect_script = response['info']['activeEffects'][0]["script"] - effect_script = effect_script.split('/')[-1][:-3].split("-")[0] - self._effect = [x for x in self._effect_list if (effect_script.lower() in x.lower())][0] + A = response['info']['activeEffects'][0]["script"] + A = A.split('/')[-1][:-3].split("-")[0] + self._effect = [x for x in self._effect_list + if (effect_script.lower() in x.lower())][0] except: self._effect = 'none' # Bulb off state @@ -219,7 +233,8 @@ def update(self): self._rgb_color =\ response['info']['activeLedColor'][0]['RGB Value'] self._brightness = max(self._rgb_color) - self._rgb_mem = [int(round(float(x)*255/self._brightness)) for x in self._rgb_color] + self._rgb_mem = [int(round(float(x)*255/self._brightness)) + for x in self._rgb_color] self._icon = 'mdi:lightbulb' self._effect = 'none' From 3a975b24b5ab6c99afdf008c2b0c729498a65a01 Mon Sep 17 00:00:00 2001 From: starkillerOG Date: Tue, 9 Jan 2018 00:21:45 +0100 Subject: [PATCH 03/11] Hyperion: Add brightness, HDMI and effect support - fixed some more indentation style issues --- homeassistant/components/light/hyperion.py | 31 ++++++++++++---------- 1 file changed, 17 insertions(+), 14 deletions(-) diff --git a/homeassistant/components/light/hyperion.py b/homeassistant/components/light/hyperion.py index 47d928044064b6..efe9588491c251 100644 --- a/homeassistant/components/light/hyperion.py +++ b/homeassistant/components/light/hyperion.py @@ -29,13 +29,16 @@ DEFAULT_PRIORITY = 128 DEFAULT_HDMI_PRIORITY = 880 DEFAULT_EFFECT_LIST = ['HDMI', 'Cinema brighten lights', 'Cinema dim lights', - 'Knight rider', 'Blue mood blobs', 'Cold mood blobs', - 'Full color mood blobs', 'Green mood blobs', 'Red mood blobs', - 'Warm mood blobs', 'Police Lights Single', 'Police Lights Solid', - 'Rainbow mood', 'Rainbow swirl fast', 'Rainbow swirl', 'Random', - 'Running dots', 'System Shutdown', 'Snake', 'Sparks Color', 'Sparks', - 'Strobe blue', 'Strobe Raspbmc', 'Strobe white', 'Color traces', - 'UDP multicast listener', 'UDP listener', 'X-Mas'] + 'Knight rider', 'Blue mood blobs', 'Cold mood blobs', + 'Full color mood blobs', 'Green mood blobs', + 'Red mood blobs', 'Warm mood blobs', + 'Police Lights Single', 'Police Lights Solid', + 'Rainbow mood', 'Rainbow swirl fast', + 'Rainbow swirl', 'Random', 'Running dots', + 'System Shutdown', 'Snake', 'Sparks Color', 'Sparks', + 'Strobe blue', 'Strobe Raspbmc', 'Strobe white', + 'Color traces', 'UDP multicast listener', + 'UDP listener', 'X-Mas'] SUPPORT_HYPERION = (SUPPORT_RGB_COLOR | SUPPORT_BRIGHTNESS | SUPPORT_EFFECT) @@ -48,9 +51,9 @@ vol.Optional(CONF_NAME, default=DEFAULT_NAME): cv.string, vol.Optional(CONF_PRIORITY, default=DEFAULT_PRIORITY): cv.positive_int, vol.Optional(CONF_HDMI_PRIORITY, - default=DEFAULT_HDMI_PRIORITY): cv.positive_int, - vol.Optional(CONF_EFFECT_LIST, - default=DEFAULT_EFFECT_LIST): vol.All(cv.ensure_list, [cv.string]), + default=DEFAULT_HDMI_PRIORITY): cv.positive_int, + vol.Optional(CONF_EFFECT_LIST, default=DEFAULT_EFFECT_LIST): + vol.All(cv.ensure_list, [cv.string]), }) @@ -76,7 +79,7 @@ class Hyperion(Light): """Representation of a Hyperion remote.""" def __init__(self, name, host, port, priority, default_color, - hdmi_priority, effect_list): + hdmi_priority, effect_list): """Initialize the light.""" self._host = host self._port = port @@ -166,7 +169,7 @@ def turn_on(self, **kwargs): return cal_color = [int(round(x*float(self._brightness)/255)) - for x in self._rgb_color] + for x in self._rgb_color] self.json_request({ 'command': 'color', 'priority': self._priority, @@ -220,7 +223,7 @@ def update(self): A = response['info']['activeEffects'][0]["script"] A = A.split('/')[-1][:-3].split("-")[0] self._effect = [x for x in self._effect_list - if (effect_script.lower() in x.lower())][0] + if (A.lower() in x.lower())][0] except: self._effect = 'none' # Bulb off state @@ -234,7 +237,7 @@ def update(self): response['info']['activeLedColor'][0]['RGB Value'] self._brightness = max(self._rgb_color) self._rgb_mem = [int(round(float(x)*255/self._brightness)) - for x in self._rgb_color] + for x in self._rgb_color] self._icon = 'mdi:lightbulb' self._effect = 'none' From b9c44fd550a129c534e8de21f0d625c4572bac9e Mon Sep 17 00:00:00 2001 From: starkillerOG Date: Tue, 9 Jan 2018 00:27:38 +0100 Subject: [PATCH 04/11] Hyperion: Add brightness, HDMI and effect support - yet more fixed visuel indent issues --- homeassistant/components/light/hyperion.py | 33 +++++++++++----------- 1 file changed, 17 insertions(+), 16 deletions(-) diff --git a/homeassistant/components/light/hyperion.py b/homeassistant/components/light/hyperion.py index efe9588491c251..b2bc7271976dce 100644 --- a/homeassistant/components/light/hyperion.py +++ b/homeassistant/components/light/hyperion.py @@ -29,16 +29,16 @@ DEFAULT_PRIORITY = 128 DEFAULT_HDMI_PRIORITY = 880 DEFAULT_EFFECT_LIST = ['HDMI', 'Cinema brighten lights', 'Cinema dim lights', - 'Knight rider', 'Blue mood blobs', 'Cold mood blobs', - 'Full color mood blobs', 'Green mood blobs', - 'Red mood blobs', 'Warm mood blobs', - 'Police Lights Single', 'Police Lights Solid', - 'Rainbow mood', 'Rainbow swirl fast', - 'Rainbow swirl', 'Random', 'Running dots', - 'System Shutdown', 'Snake', 'Sparks Color', 'Sparks', - 'Strobe blue', 'Strobe Raspbmc', 'Strobe white', - 'Color traces', 'UDP multicast listener', - 'UDP listener', 'X-Mas'] + 'Knight rider', 'Blue mood blobs', 'Cold mood blobs', + 'Full color mood blobs', 'Green mood blobs', + 'Red mood blobs', 'Warm mood blobs', + 'Police Lights Single', 'Police Lights Solid', + 'Rainbow mood', 'Rainbow swirl fast', + 'Rainbow swirl', 'Random', 'Running dots', + 'System Shutdown', 'Snake', 'Sparks Color', 'Sparks', + 'Strobe blue', 'Strobe Raspbmc', 'Strobe white', + 'Color traces', 'UDP multicast listener', + 'UDP listener', 'X-Mas'] SUPPORT_HYPERION = (SUPPORT_RGB_COLOR | SUPPORT_BRIGHTNESS | SUPPORT_EFFECT) @@ -51,9 +51,10 @@ vol.Optional(CONF_NAME, default=DEFAULT_NAME): cv.string, vol.Optional(CONF_PRIORITY, default=DEFAULT_PRIORITY): cv.positive_int, vol.Optional(CONF_HDMI_PRIORITY, - default=DEFAULT_HDMI_PRIORITY): cv.positive_int, - vol.Optional(CONF_EFFECT_LIST, default=DEFAULT_EFFECT_LIST): - vol.All(cv.ensure_list, [cv.string]), + default=DEFAULT_HDMI_PRIORITY): cv.positive_int, + vol.Optional(CONF_EFFECT_LIST, + default=DEFAULT_EFFECT_LIST): vol.All(cv.ensure_list, + [cv.string]), }) @@ -79,7 +80,7 @@ class Hyperion(Light): """Representation of a Hyperion remote.""" def __init__(self, name, host, port, priority, default_color, - hdmi_priority, effect_list): + hdmi_priority, effect_list): """Initialize the light.""" self._host = host self._port = port @@ -169,7 +170,7 @@ def turn_on(self, **kwargs): return cal_color = [int(round(x*float(self._brightness)/255)) - for x in self._rgb_color] + for x in self._rgb_color] self.json_request({ 'command': 'color', 'priority': self._priority, @@ -237,7 +238,7 @@ def update(self): response['info']['activeLedColor'][0]['RGB Value'] self._brightness = max(self._rgb_color) self._rgb_mem = [int(round(float(x)*255/self._brightness)) - for x in self._rgb_color] + for x in self._rgb_color] self._icon = 'mdi:lightbulb' self._effect = 'none' From 192f6b946dcd29d09cb6e4787625adb3d67fd462 Mon Sep 17 00:00:00 2001 From: starkillerOG Date: Tue, 9 Jan 2018 00:32:31 +0100 Subject: [PATCH 05/11] Hyperion: Add brightness, HDMI and effect support - more visuel indents --- homeassistant/components/light/hyperion.py | 32 +++++++++++----------- 1 file changed, 16 insertions(+), 16 deletions(-) diff --git a/homeassistant/components/light/hyperion.py b/homeassistant/components/light/hyperion.py index b2bc7271976dce..e4268a77879825 100644 --- a/homeassistant/components/light/hyperion.py +++ b/homeassistant/components/light/hyperion.py @@ -29,16 +29,16 @@ DEFAULT_PRIORITY = 128 DEFAULT_HDMI_PRIORITY = 880 DEFAULT_EFFECT_LIST = ['HDMI', 'Cinema brighten lights', 'Cinema dim lights', - 'Knight rider', 'Blue mood blobs', 'Cold mood blobs', - 'Full color mood blobs', 'Green mood blobs', - 'Red mood blobs', 'Warm mood blobs', - 'Police Lights Single', 'Police Lights Solid', - 'Rainbow mood', 'Rainbow swirl fast', - 'Rainbow swirl', 'Random', 'Running dots', - 'System Shutdown', 'Snake', 'Sparks Color', 'Sparks', - 'Strobe blue', 'Strobe Raspbmc', 'Strobe white', - 'Color traces', 'UDP multicast listener', - 'UDP listener', 'X-Mas'] + 'Knight rider', 'Blue mood blobs', 'Cold mood blobs', + 'Full color mood blobs', 'Green mood blobs', + 'Red mood blobs', 'Warm mood blobs', + 'Police Lights Single', 'Police Lights Solid', + 'Rainbow mood', 'Rainbow swirl fast', + 'Rainbow swirl', 'Random', 'Running dots', + 'System Shutdown', 'Snake', 'Sparks Color', 'Sparks', + 'Strobe blue', 'Strobe Raspbmc', 'Strobe white', + 'Color traces', 'UDP multicast listener', + 'UDP listener', 'X-Mas'] SUPPORT_HYPERION = (SUPPORT_RGB_COLOR | SUPPORT_BRIGHTNESS | SUPPORT_EFFECT) @@ -51,10 +51,10 @@ vol.Optional(CONF_NAME, default=DEFAULT_NAME): cv.string, vol.Optional(CONF_PRIORITY, default=DEFAULT_PRIORITY): cv.positive_int, vol.Optional(CONF_HDMI_PRIORITY, - default=DEFAULT_HDMI_PRIORITY): cv.positive_int, + default=DEFAULT_HDMI_PRIORITY): cv.positive_int, vol.Optional(CONF_EFFECT_LIST, - default=DEFAULT_EFFECT_LIST): vol.All(cv.ensure_list, - [cv.string]), + default=DEFAULT_EFFECT_LIST): vol.All(cv.ensure_list, + [cv.string]), }) @@ -80,7 +80,7 @@ class Hyperion(Light): """Representation of a Hyperion remote.""" def __init__(self, name, host, port, priority, default_color, - hdmi_priority, effect_list): + hdmi_priority, effect_list): """Initialize the light.""" self._host = host self._port = port @@ -170,7 +170,7 @@ def turn_on(self, **kwargs): return cal_color = [int(round(x*float(self._brightness)/255)) - for x in self._rgb_color] + for x in self._rgb_color] self.json_request({ 'command': 'color', 'priority': self._priority, @@ -238,7 +238,7 @@ def update(self): response['info']['activeLedColor'][0]['RGB Value'] self._brightness = max(self._rgb_color) self._rgb_mem = [int(round(float(x)*255/self._brightness)) - for x in self._rgb_color] + for x in self._rgb_color] self._icon = 'mdi:lightbulb' self._effect = 'none' From b46bb390f1f1a957003625a6082e02d4ba9f5959 Mon Sep 17 00:00:00 2001 From: starkillerOG Date: Tue, 9 Jan 2018 00:54:34 +0100 Subject: [PATCH 06/11] Hyperion: Add brightness, HDMI and effect support - fixed invalid variable "A" --- homeassistant/components/light/hyperion.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/homeassistant/components/light/hyperion.py b/homeassistant/components/light/hyperion.py index e4268a77879825..8bad368e8b40c4 100644 --- a/homeassistant/components/light/hyperion.py +++ b/homeassistant/components/light/hyperion.py @@ -221,10 +221,10 @@ def update(self): self._rgb_color = [175, 0, 255] self._icon = 'mdi:lava-lamp' try: - A = response['info']['activeEffects'][0]["script"] - A = A.split('/')[-1][:-3].split("-")[0] + s_name = response['info']['activeEffects'][0]["script"] + s_name = s_name.split('/')[-1][:-3].split("-")[0] self._effect = [x for x in self._effect_list - if (A.lower() in x.lower())][0] + if (s_name.lower() in x.lower())][0] except: self._effect = 'none' # Bulb off state From 40619221e11c3eea4d79b619e8c928bd63c7d23e Mon Sep 17 00:00:00 2001 From: starkillerOG Date: Tue, 9 Jan 2018 01:21:55 +0100 Subject: [PATCH 07/11] Hyperion: Add brightness, HDMI and effect support - remove unnececary brackets - specify specific exceptions --- homeassistant/components/light/hyperion.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/homeassistant/components/light/hyperion.py b/homeassistant/components/light/hyperion.py index 8bad368e8b40c4..061b0ddcd2d55c 100644 --- a/homeassistant/components/light/hyperion.py +++ b/homeassistant/components/light/hyperion.py @@ -212,7 +212,7 @@ def update(self): self._icon = 'mdi:video-input-hdmi' self._effect = 'HDMI' return - except: + except (KeyError, IndexError): pass if response['info']['activeLedColor'] == []: @@ -224,8 +224,8 @@ def update(self): s_name = response['info']['activeEffects'][0]["script"] s_name = s_name.split('/')[-1][:-3].split("-")[0] self._effect = [x for x in self._effect_list - if (s_name.lower() in x.lower())][0] - except: + if s_name.lower() in x.lower()][0] + except (KeyError, IndexError): self._effect = 'none' # Bulb off state else: From d1e5b2a15e38b949eda0493275e205fee07302e2 Mon Sep 17 00:00:00 2001 From: starkillerOG Date: Fri, 12 Jan 2018 23:06:17 +0100 Subject: [PATCH 08/11] correct changing state holding attributes during a service method Proccesed the comments of @MartinHjelmare: https://github.com/home-assistant/home-assistant/pull/11543#pullrequestreview-88328659 --- homeassistant/components/light/hyperion.py | 20 ++++++++------------ 1 file changed, 8 insertions(+), 12 deletions(-) diff --git a/homeassistant/components/light/hyperion.py b/homeassistant/components/light/hyperion.py index 061b0ddcd2d55c..1e0ae14e17d7a9 100644 --- a/homeassistant/components/light/hyperion.py +++ b/homeassistant/components/light/hyperion.py @@ -139,25 +139,23 @@ def supported_features(self): def turn_on(self, **kwargs): """Turn the lights on.""" if ATTR_RGB_COLOR in kwargs: - self._rgb_color = kwargs[ATTR_RGB_COLOR] - self._rgb_mem = kwargs[ATTR_RGB_COLOR] + rgb_color = kwargs[ATTR_RGB_COLOR] elif self._rgb_mem == [0, 0, 0]: - self._rgb_color = self._default_color - self._rgb_mem = self._default_color + rgb_color = self._default_color else: - self._rgb_color = self._rgb_mem + rgb_color = self._rgb_mem if ATTR_BRIGHTNESS in kwargs: - self._brightness = kwargs[ATTR_BRIGHTNESS] + brightness = kwargs[ATTR_BRIGHTNESS] if ATTR_EFFECT in kwargs: - self._effect = kwargs[ATTR_EFFECT] + self._skip_check = True + self._effect = kwargs[ATTR_EFFECT] if self._effect == 'HDMI': self.json_request({'command': 'clearall'}) self._icon = 'mdi:video-input-hdmi' self._brightness = 255 self._rgb_color = [125, 125, 125] - self._skip_check = True else: self.json_request({ 'command': 'effect', @@ -166,11 +164,10 @@ def turn_on(self, **kwargs): }) self._icon = 'mdi:lava-lamp' self._rgb_color = [175, 0, 255] - self._skip_check = True return - cal_color = [int(round(x*float(self._brightness)/255)) - for x in self._rgb_color] + cal_color = [int(round(x*float(brightness)/255)) + for x in rgb_color] self.json_request({ 'command': 'color', 'priority': self._priority, @@ -185,7 +182,6 @@ def turn_off(self, **kwargs): 'priority': self._priority, 'color': [0, 0, 0] }) - self._rgb_color = [0, 0, 0] def update(self): """Get the lights status.""" From 6da5939d5ccba8bb50040b663766adec93a680d0 Mon Sep 17 00:00:00 2001 From: starkillerOG Date: Fri, 12 Jan 2018 23:09:27 +0100 Subject: [PATCH 09/11] indent correction corrected tab instead of 4 spaces --- homeassistant/components/light/hyperion.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/homeassistant/components/light/hyperion.py b/homeassistant/components/light/hyperion.py index 1e0ae14e17d7a9..99a8ff4c1fad12 100644 --- a/homeassistant/components/light/hyperion.py +++ b/homeassistant/components/light/hyperion.py @@ -150,7 +150,7 @@ def turn_on(self, **kwargs): if ATTR_EFFECT in kwargs: self._skip_check = True - self._effect = kwargs[ATTR_EFFECT] + self._effect = kwargs[ATTR_EFFECT] if self._effect == 'HDMI': self.json_request({'command': 'clearall'}) self._icon = 'mdi:video-input-hdmi' From e0e39c71e126d87b1c398669c846404b80362d44 Mon Sep 17 00:00:00 2001 From: starkillerOG Date: Sat, 13 Jan 2018 14:29:57 +0100 Subject: [PATCH 10/11] Hyperion: Add brightness, HDMI and effect support - changed 'none' to None - renamed "self._skip_check" to "self._skip_update" --- homeassistant/components/light/hyperion.py | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/homeassistant/components/light/hyperion.py b/homeassistant/components/light/hyperion.py index 99a8ff4c1fad12..a5e6cb883ea902 100644 --- a/homeassistant/components/light/hyperion.py +++ b/homeassistant/components/light/hyperion.py @@ -93,8 +93,8 @@ def __init__(self, name, host, port, priority, default_color, self._brightness = 255 self._icon = 'mdi:lightbulb' self._effect_list = effect_list - self._effect = 'none' - self._skip_check = False + self._effect = None + self._skip_update = False @property def name(self): @@ -149,7 +149,7 @@ def turn_on(self, **kwargs): brightness = kwargs[ATTR_BRIGHTNESS] if ATTR_EFFECT in kwargs: - self._skip_check = True + self._skip_update = True self._effect = kwargs[ATTR_EFFECT] if self._effect == 'HDMI': self.json_request({'command': 'clearall'}) @@ -186,8 +186,8 @@ def turn_off(self, **kwargs): def update(self): """Get the lights status.""" # postpone the immediate state check for changes that take time - if self._skip_check: - self._skip_check = False + if self._skip_update: + self._skip_update = False return response = self.json_request({'command': 'serverinfo'}) if response: @@ -197,7 +197,7 @@ def update(self): self._rgb_mem = self._default_color self._brightness = 255 self._icon = 'mdi:lightbulb' - self._effect = 'none' + self._effect = None return # Check if Hyperion is in ambilight mode trough an HDMI grabber try: @@ -222,12 +222,12 @@ def update(self): self._effect = [x for x in self._effect_list if s_name.lower() in x.lower()][0] except (KeyError, IndexError): - self._effect = 'none' + self._effect = None # Bulb off state else: self._rgb_color = [0, 0, 0] self._icon = 'mdi:lightbulb' - self._effect = 'none' + self._effect = None else: # Get the RGB color self._rgb_color =\ @@ -236,7 +236,7 @@ def update(self): self._rgb_mem = [int(round(float(x)*255/self._brightness)) for x in self._rgb_color] self._icon = 'mdi:lightbulb' - self._effect = 'none' + self._effect = None def setup(self): """Get the hostname of the remote.""" From 687fd67b08474d0b3bbeef690088004f942ecfdc Mon Sep 17 00:00:00 2001 From: starkillerOG Date: Sat, 13 Jan 2018 14:51:15 +0100 Subject: [PATCH 11/11] Add brightness, HDMI and effect support changed checking if a list is empty from "list == []" to "not list" --- homeassistant/components/light/hyperion.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/homeassistant/components/light/hyperion.py b/homeassistant/components/light/hyperion.py index a5e6cb883ea902..644c1e84ebe9a9 100644 --- a/homeassistant/components/light/hyperion.py +++ b/homeassistant/components/light/hyperion.py @@ -211,9 +211,9 @@ def update(self): except (KeyError, IndexError): pass - if response['info']['activeLedColor'] == []: + if not response['info']['activeLedColor']: # Get the active effect - if response['info']['activeEffects'] != []: + if response['info']['activeEffects']: self._rgb_color = [175, 0, 255] self._icon = 'mdi:lava-lamp' try: