From 469d0619ba0bc777f7ace316aa7a7d1f3bfb9aa5 Mon Sep 17 00:00:00 2001 From: root Date: Sun, 25 Oct 2015 21:48:01 +0100 Subject: [PATCH 01/15] mqtt light component --- homeassistant/components/light/mqtt.py | 152 +++++++++++++++++++++++++ 1 file changed, 152 insertions(+) create mode 100644 homeassistant/components/light/mqtt.py diff --git a/homeassistant/components/light/mqtt.py b/homeassistant/components/light/mqtt.py new file mode 100644 index 00000000000..2fc9fef7d50 --- /dev/null +++ b/homeassistant/components/light/mqtt.py @@ -0,0 +1,152 @@ +""" +homeassistant.components.light.mqtt +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +Allows to configure a MQTT light. +""" +import logging +import homeassistant.components.mqtt as mqtt +from homeassistant.components.light import (Light, ATTR_BRIGHTNESS, ATTR_RGB_COLOR, ATTR_XY_COLOR) + +import random + +_LOGGER = logging.getLogger(__name__) + +DEFAULT_NAME = "MQTT Light" +DEFAULT_QOS = 0 +DEFAULT_PAYLOAD_ON = "on" +DEFAULT_PAYLOAD_OFF = "off" +DEFAULT_RGB = [ 255, 255, 255 ] +DEFAULT_RGB_PATTERN = "%d,%d,%d" +DEFAULT_BRIGHTNESS = 120 + +DEFAULT_STATE_TOPIC = "homeassistant/light/state" +DEFAULT_COMMAND_TOPIC = "homeassistant/light/switch" + +DEFAULT_STATE_BRIGHTNESS = "homeassistant/light/brightness/state" +DEFAULT_COMMAND_BRIGHTNESS = "homeassistant/light/brightness/set" + +DEFAULT_STATE_RGB = "homeassistant/light/rgb/state" +DEFAULT_COMMAND_RGB = "homeassistant/light/rgb/set" + +DEPENDENCIES = ['mqtt'] + +# pylint: disable=unused-argument +def setup_platform(hass, config, add_devices_callback, discovery_info=None): + """ Add MQTT Light. """ + + if config.get('command_topic') is None: + _LOGGER.error("Missing required variable: command_topic") + return False + + add_devices_callback([MqttLight( + hass, + config.get('name', DEFAULT_NAME), + config.get('state_topic', DEFAULT_STATE_TOPIC), + config.get('command_topic', DEFAULT_COMMAND_TOPIC), + config.get('brightness_state_topic', DEFAULT_STATE_BRIGHTNESS), + config.get('brightness_command_topic', DEFAULT_COMMAND_BRIGHTNESS), + config.get('rgb_state_topic', DEFAULT_STATE_RGB), + config.get('rgb_command_topic', DEFAULT_COMMAND_RGB), + config.get('rgb', DEFAULT_RGB ), + config.get('qos', DEFAULT_QOS), + config.get('payload_on', DEFAULT_PAYLOAD_ON), + config.get('payload_off', DEFAULT_PAYLOAD_OFF), + config.get('brightness', DEFAULT_BRIGHTNESS))]) + +class MqttLight(Light): + """ Provides a demo switch. """ + def __init__(self, hass, name, state_topic, command_topic, brightness_state_topic, brightness_command_topic, rgb_state_topic, rgb_command_topic, rgb, qos, payload_on, payload_off, brightness): + self._name = name + self._hass = hass + self._state = False + self._command_topic = command_topic + self._state_topic = state_topic + self._brightness_state_topic = brightness_state_topic + self._brightness_command_topic = brightness_command_topic + self._rgb_state_topic = rgb_state_topic + self._rgb_command_topic = rgb_command_topic + self._qos = qos + self._payload_on = payload_on + self._payload_off = payload_off + self._rgb = rgb + self._brightness = brightness + self._xy = [[ 0.5, 0.5 ]] + + def message_received(topic, payload, qos): + """ A new MQTT message has been received. """ + if payload == self._payload_on: + self._state = True + self.update_ha_state() + elif payload == self._payload_off: + self._state = False + self.update_ha_state() + + def brightness_received(topic, payload, qos): + """ A new MQTT message has been received. """ + self._brightness = int(payload) + self.update_ha_state() + + def rgb_received(topic, payload, qos): + """ A new MQTT message has been received. """ + rgb = payload.split( "," ) + self._rgb = list(map(int, rgb)) + self.update_ha_state() + + # subscribe the state_topic + mqtt.subscribe(self._hass, self._state_topic, message_received, self._qos) + mqtt.subscribe(self._hass, self._brightness_state_topic, brightness_received, self._qos) + mqtt.subscribe(self._hass, self._rgb_state_topic, rgb_received, self._qos) + + @property + def should_poll(self): + """ No polling needed for a demo light. """ + return False + + @property + def name(self): + """ Returns the name of the device if any. """ + return self._name + + @property + def brightness(self): + """ Brightness of this light between 0..255. """ + return self._brightness + + @property + def rgb_color(self): + """ RGB color value. """ + return self._rgb + + @property + def color_xy(self): + """ RGB color value. """ + return self._xy + + @property + def is_on(self): + """ True if device is on. """ + return self._state + + def turn_on(self, **kwargs): + + if ATTR_RGB_COLOR in kwargs: + self._rgb = kwargs[ATTR_RGB_COLOR] + rgb = DEFAULT_RGB_PATTERN % tuple(self._rgb) + mqtt.publish(self._hass, self._rgb_command_topic, rgb, self._qos) + + if ATTR_BRIGHTNESS in kwargs: + self._brightness = kwargs[ATTR_BRIGHTNESS] + mqtt.publish(self._hass, self._brightness_command_topic, self._brightness, self._qos) + + if not self._state: + """ Turn the device on. """ + self._state = True + mqtt.publish(self._hass, self._command_topic, self._payload_on, self._qos) + self.update_ha_state() + + def turn_off(self, **kwargs): + """ Turn the device off. """ + self._state = False + mqtt.publish(self._hass, self._command_topic, self._payload_off,self._qos) + self.update_ha_state() + From 7cfce94dfbf095f4123e7f85cd119c3ebbe221b3 Mon Sep 17 00:00:00 2001 From: root Date: Sun, 25 Oct 2015 22:58:07 +0100 Subject: [PATCH 02/15] pylint rework for light/mqtt --- homeassistant/components/light/mqtt.py | 75 +++++++++++++++----------- 1 file changed, 45 insertions(+), 30 deletions(-) diff --git a/homeassistant/components/light/mqtt.py b/homeassistant/components/light/mqtt.py index 2fc9fef7d50..4df0347d506 100644 --- a/homeassistant/components/light/mqtt.py +++ b/homeassistant/components/light/mqtt.py @@ -5,9 +5,8 @@ Allows to configure a MQTT light. """ import logging import homeassistant.components.mqtt as mqtt -from homeassistant.components.light import (Light, ATTR_BRIGHTNESS, ATTR_RGB_COLOR, ATTR_XY_COLOR) - -import random +from homeassistant.components.light import (Light, + ATTR_BRIGHTNESS, ATTR_RGB_COLOR) _LOGGER = logging.getLogger(__name__) @@ -15,7 +14,7 @@ DEFAULT_NAME = "MQTT Light" DEFAULT_QOS = 0 DEFAULT_PAYLOAD_ON = "on" DEFAULT_PAYLOAD_OFF = "off" -DEFAULT_RGB = [ 255, 255, 255 ] +DEFAULT_RGB = [255, 255, 255] DEFAULT_RGB_PATTERN = "%d,%d,%d" DEFAULT_BRIGHTNESS = 120 @@ -47,7 +46,7 @@ def setup_platform(hass, config, add_devices_callback, discovery_info=None): config.get('brightness_command_topic', DEFAULT_COMMAND_BRIGHTNESS), config.get('rgb_state_topic', DEFAULT_STATE_RGB), config.get('rgb_command_topic', DEFAULT_COMMAND_RGB), - config.get('rgb', DEFAULT_RGB ), + config.get('rgb', DEFAULT_RGB), config.get('qos', DEFAULT_QOS), config.get('payload_on', DEFAULT_PAYLOAD_ON), config.get('payload_off', DEFAULT_PAYLOAD_OFF), @@ -55,47 +54,61 @@ def setup_platform(hass, config, add_devices_callback, discovery_info=None): class MqttLight(Light): """ Provides a demo switch. """ - def __init__(self, hass, name, state_topic, command_topic, brightness_state_topic, brightness_command_topic, rgb_state_topic, rgb_command_topic, rgb, qos, payload_on, payload_off, brightness): - self._name = name + + # pylint: disable=too-many-instance-attributes,too-many-arguments,too-many-locals,bad-builtin + # Eight is reasonable in this case. + + def __init__(self, hass, name, + state_topic, command_topic, + brightness_state_topic, brightness_command_topic, + rgb_state_topic, rgb_command_topic, + rgb, qos, + payload_on, payload_off, + brightness): + self._hass = hass - self._state = False - self._command_topic = command_topic + self._name = name self._state_topic = state_topic + self._command_topic = command_topic self._brightness_state_topic = brightness_state_topic self._brightness_command_topic = brightness_command_topic self._rgb_state_topic = rgb_state_topic self._rgb_command_topic = rgb_command_topic + self._rgb = rgb self._qos = qos self._payload_on = payload_on self._payload_off = payload_off - self._rgb = rgb self._brightness = brightness - self._xy = [[ 0.5, 0.5 ]] - + self._xy = [[0.5, 0.5]] + self._state = False + def message_received(topic, payload, qos): """ A new MQTT message has been received. """ if payload == self._payload_on: self._state = True - self.update_ha_state() + self._hass.update_ha_state() elif payload == self._payload_off: self._state = False - self.update_ha_state() - + self._hass.update_ha_state() + def brightness_received(topic, payload, qos): """ A new MQTT message has been received. """ self._brightness = int(payload) - self.update_ha_state() - + self._hass.update_ha_state() + def rgb_received(topic, payload, qos): """ A new MQTT message has been received. """ - rgb = payload.split( "," ) + rgb = payload.split(",") self._rgb = list(map(int, rgb)) - self.update_ha_state() + self._hass.update_ha_state() # subscribe the state_topic - mqtt.subscribe(self._hass, self._state_topic, message_received, self._qos) - mqtt.subscribe(self._hass, self._brightness_state_topic, brightness_received, self._qos) - mqtt.subscribe(self._hass, self._rgb_state_topic, rgb_received, self._qos) + mqtt.subscribe(self._hass, self._state_topic, + message_received, self._qos) + mqtt.subscribe(self._hass, self._brightness_state_topic, + brightness_received, self._qos) + mqtt.subscribe(self._hass, self._rgb_state_topic, + rgb_received, self._qos) @property def should_poll(self): @@ -116,7 +129,7 @@ class MqttLight(Light): def rgb_color(self): """ RGB color value. """ return self._rgb - + @property def color_xy(self): """ RGB color value. """ @@ -128,6 +141,7 @@ class MqttLight(Light): return self._state def turn_on(self, **kwargs): + """ Turn the device on. """ if ATTR_RGB_COLOR in kwargs: self._rgb = kwargs[ATTR_RGB_COLOR] @@ -136,17 +150,18 @@ class MqttLight(Light): if ATTR_BRIGHTNESS in kwargs: self._brightness = kwargs[ATTR_BRIGHTNESS] - mqtt.publish(self._hass, self._brightness_command_topic, self._brightness, self._qos) + mqtt.publish(self._hass, self._brightness_command_topic, + self._brightness, self._qos) if not self._state: - """ Turn the device on. """ self._state = True - mqtt.publish(self._hass, self._command_topic, self._payload_on, self._qos) - self.update_ha_state() + mqtt.publish(self._hass, self._command_topic, + self._payload_on, self._qos) + self._hass.update_ha_state() def turn_off(self, **kwargs): """ Turn the device off. """ self._state = False - mqtt.publish(self._hass, self._command_topic, self._payload_off,self._qos) - self.update_ha_state() - + mqtt.publish(self._hass, self._command_topic, + self._payload_off, self._qos) + self._hass.update_ha_state() From 538f8545f7954be296e001f9698312b809861342 Mon Sep 17 00:00:00 2001 From: root Date: Sun, 25 Oct 2015 23:04:43 +0100 Subject: [PATCH 03/15] fix a bug after the pylint rework --- homeassistant/components/light/mqtt.py | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/homeassistant/components/light/mqtt.py b/homeassistant/components/light/mqtt.py index 4df0347d506..290ea6813ee 100644 --- a/homeassistant/components/light/mqtt.py +++ b/homeassistant/components/light/mqtt.py @@ -86,21 +86,21 @@ class MqttLight(Light): """ A new MQTT message has been received. """ if payload == self._payload_on: self._state = True - self._hass.update_ha_state() + self.update_ha_state() elif payload == self._payload_off: self._state = False - self._hass.update_ha_state() + self.update_ha_state() def brightness_received(topic, payload, qos): """ A new MQTT message has been received. """ self._brightness = int(payload) - self._hass.update_ha_state() + self.update_ha_state() def rgb_received(topic, payload, qos): """ A new MQTT message has been received. """ rgb = payload.split(",") self._rgb = list(map(int, rgb)) - self._hass.update_ha_state() + self.update_ha_state() # subscribe the state_topic mqtt.subscribe(self._hass, self._state_topic, @@ -157,11 +157,11 @@ class MqttLight(Light): self._state = True mqtt.publish(self._hass, self._command_topic, self._payload_on, self._qos) - self._hass.update_ha_state() + self.update_ha_state() def turn_off(self, **kwargs): """ Turn the device off. """ self._state = False mqtt.publish(self._hass, self._command_topic, self._payload_off, self._qos) - self._hass.update_ha_state() + self.update_ha_state() From a8c2cc4c33094daa3062bf28ce431c090d9a3440 Mon Sep 17 00:00:00 2001 From: root Date: Sun, 25 Oct 2015 23:38:24 +0100 Subject: [PATCH 04/15] rework for flake8 errors done --- homeassistant/components/light/mqtt.py | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/homeassistant/components/light/mqtt.py b/homeassistant/components/light/mqtt.py index 290ea6813ee..078a9a4075f 100644 --- a/homeassistant/components/light/mqtt.py +++ b/homeassistant/components/light/mqtt.py @@ -30,6 +30,8 @@ DEFAULT_COMMAND_RGB = "homeassistant/light/rgb/set" DEPENDENCIES = ['mqtt'] # pylint: disable=unused-argument + + def setup_platform(hass, config, add_devices_callback, discovery_info=None): """ Add MQTT Light. """ @@ -52,10 +54,12 @@ def setup_platform(hass, config, add_devices_callback, discovery_info=None): config.get('payload_off', DEFAULT_PAYLOAD_OFF), config.get('brightness', DEFAULT_BRIGHTNESS))]) + class MqttLight(Light): """ Provides a demo switch. """ - # pylint: disable=too-many-instance-attributes,too-many-arguments,too-many-locals,bad-builtin + # pylint: disable=too-many-instance-attributes + # pylint: disable=too-many-arguments,too-many-locals,bad-builtin # Eight is reasonable in this case. def __init__(self, hass, name, From b66e4f1e155801bb4d3b93b1eed2723c4fdaf7e2 Mon Sep 17 00:00:00 2001 From: root Date: Mon, 26 Oct 2015 15:05:01 +0100 Subject: [PATCH 05/15] two different demo lights on without RGB and one with RGB support. and code cleanup more pylint aligned --- homeassistant/components/light/mqtt.py | 236 ++++++++++++++++--------- 1 file changed, 151 insertions(+), 85 deletions(-) diff --git a/homeassistant/components/light/mqtt.py b/homeassistant/components/light/mqtt.py index 078a9a4075f..ff78ecb3ca8 100644 --- a/homeassistant/components/light/mqtt.py +++ b/homeassistant/components/light/mqtt.py @@ -2,6 +2,33 @@ homeassistant.components.light.mqtt ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Allows to configure a MQTT light. + +config for RGB Version with brightness: + +light: + platform: mqtt + name: "Office Light RGB" + state_topic: "office/rgb1/light/status" + command_topic: "office/rgb1/light/switch" + brightness_state_topic: "office/rgb1/brightness/status" + brightness_command_topic: "office/rgb1/brightness/set" + rgb_state_topic: "office/rgb1/rgb/status" + rgb_command_topic: "office/rgb1/rgb/set" + qos: 0 + payload_on: "on" + payload_off: "off" + +config without RGB: + +light: + platform: mqtt + name: "Office Light" + state_topic: "office/rgb1/light/status" + command_topic: "office/rgb1/light/switch" + qos: 0 + payload_on: "on" + payload_off: "off" + """ import logging import homeassistant.components.mqtt as mqtt @@ -17,15 +44,7 @@ DEFAULT_PAYLOAD_OFF = "off" DEFAULT_RGB = [255, 255, 255] DEFAULT_RGB_PATTERN = "%d,%d,%d" DEFAULT_BRIGHTNESS = 120 - -DEFAULT_STATE_TOPIC = "homeassistant/light/state" -DEFAULT_COMMAND_TOPIC = "homeassistant/light/switch" - -DEFAULT_STATE_BRIGHTNESS = "homeassistant/light/brightness/state" -DEFAULT_COMMAND_BRIGHTNESS = "homeassistant/light/brightness/set" - -DEFAULT_STATE_RGB = "homeassistant/light/rgb/state" -DEFAULT_COMMAND_RGB = "homeassistant/light/rgb/set" +DEFAULT_OPTIMISTIC = False DEPENDENCIES = ['mqtt'] @@ -39,80 +58,70 @@ def setup_platform(hass, config, add_devices_callback, discovery_info=None): _LOGGER.error("Missing required variable: command_topic") return False - add_devices_callback([MqttLight( - hass, - config.get('name', DEFAULT_NAME), - config.get('state_topic', DEFAULT_STATE_TOPIC), - config.get('command_topic', DEFAULT_COMMAND_TOPIC), - config.get('brightness_state_topic', DEFAULT_STATE_BRIGHTNESS), - config.get('brightness_command_topic', DEFAULT_COMMAND_BRIGHTNESS), - config.get('rgb_state_topic', DEFAULT_STATE_RGB), - config.get('rgb_command_topic', DEFAULT_COMMAND_RGB), - config.get('rgb', DEFAULT_RGB), - config.get('qos', DEFAULT_QOS), - config.get('payload_on', DEFAULT_PAYLOAD_ON), - config.get('payload_off', DEFAULT_PAYLOAD_OFF), - config.get('brightness', DEFAULT_BRIGHTNESS))]) + if config.get('rgb_command_topic') is not None: + add_devices_callback([MqttLightRGB( + hass, + config.get('name', DEFAULT_NAME), + {"state_topic": config.get('state_topic'), + "command_topic": config.get('command_topic'), + "brightness_state_topic": config.get('brightness_state_topic'), + "brightness_command_topic": + config.get('brightness_command_topic'), + "rgb_state_topic": config.get('rgb_state_topic'), + "rgb_command_topic": config.get('rgb_command_topic')}, + config.get('rgb', DEFAULT_RGB), + config.get('qos', DEFAULT_QOS), + {"on": config.get('payload_on', DEFAULT_PAYLOAD_ON), + "off": config.get('payload_off', DEFAULT_PAYLOAD_OFF)}, + config.get('brightness', DEFAULT_BRIGHTNESS), + config.get('optimistic', DEFAULT_OPTIMISTIC))]) + + else: + add_devices_callback([MqttLight( + hass, + config.get('name', DEFAULT_NAME), + {"state_topic": config.get('state_topic'), + "command_topic": config.get('command_topic')}, + config.get('qos', DEFAULT_QOS), + {"on": config.get('payload_on', DEFAULT_PAYLOAD_ON), + "off": config.get('payload_off', DEFAULT_PAYLOAD_OFF)}, + config.get('optimistic', DEFAULT_OPTIMISTIC))]) class MqttLight(Light): - """ Provides a demo switch. """ - - # pylint: disable=too-many-instance-attributes - # pylint: disable=too-many-arguments,too-many-locals,bad-builtin - # Eight is reasonable in this case. + """ Provides a demo light. """ + # pylint: disable=too-many-arguments def __init__(self, hass, name, - state_topic, command_topic, - brightness_state_topic, brightness_command_topic, - rgb_state_topic, rgb_command_topic, - rgb, qos, - payload_on, payload_off, - brightness): + topic, + qos, + payload, + optimistic): self._hass = hass self._name = name - self._state_topic = state_topic - self._command_topic = command_topic - self._brightness_state_topic = brightness_state_topic - self._brightness_command_topic = brightness_command_topic - self._rgb_state_topic = rgb_state_topic - self._rgb_command_topic = rgb_command_topic - self._rgb = rgb + self._topic = topic self._qos = qos - self._payload_on = payload_on - self._payload_off = payload_off - self._brightness = brightness - self._xy = [[0.5, 0.5]] + self._payload = payload + self._optimistic = optimistic self._state = False def message_received(topic, payload, qos): """ A new MQTT message has been received. """ - if payload == self._payload_on: + if payload == self._payload["on"]: self._state = True - self.update_ha_state() - elif payload == self._payload_off: + elif payload == self._payload["off"]: self._state = False - self.update_ha_state() - def brightness_received(topic, payload, qos): - """ A new MQTT message has been received. """ - self._brightness = int(payload) self.update_ha_state() - def rgb_received(topic, payload, qos): - """ A new MQTT message has been received. """ - rgb = payload.split(",") - self._rgb = list(map(int, rgb)) - self.update_ha_state() - - # subscribe the state_topic - mqtt.subscribe(self._hass, self._state_topic, - message_received, self._qos) - mqtt.subscribe(self._hass, self._brightness_state_topic, - brightness_received, self._qos) - mqtt.subscribe(self._hass, self._rgb_state_topic, - rgb_received, self._qos) + if self._topic["state_topic"] is None: + # force optimistic mode + self._optimistic = True + else: + # subscribe the state_topic + mqtt.subscribe(self._hass, self._topic["state_topic"], + message_received, self._qos) @property def should_poll(self): @@ -124,6 +133,68 @@ class MqttLight(Light): """ Returns the name of the device if any. """ return self._name + @property + def is_on(self): + """ True if device is on. """ + return self._state + + def turn_on(self, **kwargs): + """ Turn the device on. """ + + mqtt.publish(self._hass, self._topic["command_topic"], + self._payload["on"], self._qos) + + if self._optimistic: + # optimistically assume that switch has changed state + self._state = True + self.update_ha_state() + + def turn_off(self, **kwargs): + """ Turn the device off. """ + mqtt.publish(self._hass, self._topic["command_topic"], + self._payload["off"], self._qos) + + if self._optimistic: + # optimistically assume that switch has changed state + self._state = False + self.update_ha_state() + + +class MqttLightRGB(MqttLight): + """ Provides a demo RGB light. """ + + # pylint: disable=too-many-arguments + def __init__(self, hass, name, + topic, + rgb, qos, + payload, + brightness, optimistic): + + super().__init__(hass, name, topic, qos, + payload, optimistic) + + self._rgb = rgb + self._brightness = brightness + self._xy = [[0.5, 0.5]] + + def brightness_received(topic, payload, qos): + """ A new MQTT message has been received. """ + self._brightness = int(payload) + self.update_ha_state() + + def rgb_received(topic, payload, qos): + """ A new MQTT message has been received. """ + self._rgb = [int(val) for val in payload.split(',')] + self.update_ha_state() + + if self._topic["brightness_state_topic"] is not None: + mqtt.subscribe(self._hass, self._topic["brightness_state_topic"], + brightness_received, self._qos) + + if self._topic["rgb_state_topic"] is not None: + mqtt.subscribe(self._hass, self._topic["rgb_state_topic"], + rgb_received, self._qos) + @property def brightness(self): """ Brightness of this light between 0..255. """ @@ -139,33 +210,28 @@ class MqttLight(Light): """ RGB color value. """ return self._xy - @property - def is_on(self): - """ True if device is on. """ - return self._state - def turn_on(self, **kwargs): """ Turn the device on. """ - if ATTR_RGB_COLOR in kwargs: + if ATTR_RGB_COLOR in kwargs and \ + self._topic["rgb_command_topic"] is not None: + self._rgb = kwargs[ATTR_RGB_COLOR] rgb = DEFAULT_RGB_PATTERN % tuple(self._rgb) - mqtt.publish(self._hass, self._rgb_command_topic, rgb, self._qos) + mqtt.publish(self._hass, self._topic["rgb_command_topic"], + rgb, self._qos) + + if ATTR_BRIGHTNESS in kwargs and \ + self._topic["brightness_command_topic"] is not None: - if ATTR_BRIGHTNESS in kwargs: self._brightness = kwargs[ATTR_BRIGHTNESS] - mqtt.publish(self._hass, self._brightness_command_topic, + mqtt.publish(self._hass, self._topic["brightness_command_topic"], self._brightness, self._qos) - if not self._state: - self._state = True - mqtt.publish(self._hass, self._command_topic, - self._payload_on, self._qos) - self.update_ha_state() + mqtt.publish(self._hass, self._topic["command_topic"], + self._payload["on"], self._qos) - def turn_off(self, **kwargs): - """ Turn the device off. """ - self._state = False - mqtt.publish(self._hass, self._command_topic, - self._payload_off, self._qos) - self.update_ha_state() + if self._optimistic: + # optimistically assume that switch has changed state + self._state = True + self.update_ha_state() From 4fcd27e9050051371c9efa7f7850dbd486267c99 Mon Sep 17 00:00:00 2001 From: root Date: Tue, 27 Oct 2015 16:52:43 +0100 Subject: [PATCH 06/15] light/mqtt to .coveragerc --- .coveragerc | 1 + 1 file changed, 1 insertion(+) diff --git a/.coveragerc b/.coveragerc index 28b4b926eab..bef52d57248 100644 --- a/.coveragerc +++ b/.coveragerc @@ -48,6 +48,7 @@ omit = homeassistant/components/downloader.py homeassistant/components/keyboard.py homeassistant/components/light/hue.py + homeassistant/components/light/mqtt.py homeassistant/components/light/limitlessled.py homeassistant/components/light/blinksticklight.py homeassistant/components/light/hyperion.py From 31826ab263212fa6821b933899dad9c9f96aba44 Mon Sep 17 00:00:00 2001 From: hexxter Date: Sat, 31 Oct 2015 19:26:03 +0100 Subject: [PATCH 07/15] redesigned mqtt light an first steps with the unittest system --- homeassistant/components/light/mqtt.py | 187 +++++++++++-------------- tests/components/light/test_mqtt.py | 130 +++++++++++++++++ 2 files changed, 209 insertions(+), 108 deletions(-) create mode 100644 tests/components/light/test_mqtt.py diff --git a/homeassistant/components/light/mqtt.py b/homeassistant/components/light/mqtt.py index ff78ecb3ca8..4e9b58e272e 100644 --- a/homeassistant/components/light/mqtt.py +++ b/homeassistant/components/light/mqtt.py @@ -31,6 +31,8 @@ light: """ import logging + +import homeassistant.util.color as color_util import homeassistant.components.mqtt as mqtt from homeassistant.components.light import (Light, ATTR_BRIGHTNESS, ATTR_RGB_COLOR) @@ -41,9 +43,7 @@ DEFAULT_NAME = "MQTT Light" DEFAULT_QOS = 0 DEFAULT_PAYLOAD_ON = "on" DEFAULT_PAYLOAD_OFF = "off" -DEFAULT_RGB = [255, 255, 255] DEFAULT_RGB_PATTERN = "%d,%d,%d" -DEFAULT_BRIGHTNESS = 120 DEFAULT_OPTIMISTIC = False DEPENDENCIES = ['mqtt'] @@ -58,53 +58,46 @@ def setup_platform(hass, config, add_devices_callback, discovery_info=None): _LOGGER.error("Missing required variable: command_topic") return False - if config.get('rgb_command_topic') is not None: - add_devices_callback([MqttLightRGB( - hass, - config.get('name', DEFAULT_NAME), - {"state_topic": config.get('state_topic'), - "command_topic": config.get('command_topic'), - "brightness_state_topic": config.get('brightness_state_topic'), - "brightness_command_topic": + add_devices_callback([MqttLight( + hass, + config.get('name', DEFAULT_NAME), + {"state_topic": config.get('state_topic'), + "command_topic": config.get('command_topic'), + "brightness_state_topic": config.get('brightness_state_topic'), + "brightness_command_topic": config.get('brightness_command_topic'), - "rgb_state_topic": config.get('rgb_state_topic'), - "rgb_command_topic": config.get('rgb_command_topic')}, - config.get('rgb', DEFAULT_RGB), - config.get('qos', DEFAULT_QOS), - {"on": config.get('payload_on', DEFAULT_PAYLOAD_ON), - "off": config.get('payload_off', DEFAULT_PAYLOAD_OFF)}, - config.get('brightness', DEFAULT_BRIGHTNESS), - config.get('optimistic', DEFAULT_OPTIMISTIC))]) + "rgb_state_topic": config.get('rgb_state_topic'), + "rgb_command_topic": config.get('rgb_command_topic')}, + config.get('rgb', [255, 255, 255]), + config.get('qos', DEFAULT_QOS), + {"on": config.get('payload_on', DEFAULT_PAYLOAD_ON), + "off": config.get('payload_off', DEFAULT_PAYLOAD_OFF)}, + config.get('brightness'), + config.get('optimistic', DEFAULT_OPTIMISTIC))]) - else: - add_devices_callback([MqttLight( - hass, - config.get('name', DEFAULT_NAME), - {"state_topic": config.get('state_topic'), - "command_topic": config.get('command_topic')}, - config.get('qos', DEFAULT_QOS), - {"on": config.get('payload_on', DEFAULT_PAYLOAD_ON), - "off": config.get('payload_off', DEFAULT_PAYLOAD_OFF)}, - config.get('optimistic', DEFAULT_OPTIMISTIC))]) +# pylint: disable=too-many-instance-attributes class MqttLight(Light): - """ Provides a demo light. """ + """ Provides a demo Mqtt light. """ # pylint: disable=too-many-arguments def __init__(self, hass, name, topic, - qos, + rgb, qos, payload, - optimistic): + brightness, optimistic): self._hass = hass self._name = name self._topic = topic + self._rgb = rgb self._qos = qos self._payload = payload + self._brightness = brightness self._optimistic = optimistic self._state = False + self._xy = None def message_received(topic, payload, qos): """ A new MQTT message has been received. """ @@ -123,6 +116,48 @@ class MqttLight(Light): mqtt.subscribe(self._hass, self._topic["state_topic"], message_received, self._qos) + def brightness_received(topic, payload, qos): + """ A new MQTT message has been received. """ + self._brightness = int(payload) + self.update_ha_state() + + def rgb_received(topic, payload, qos): + """ A new MQTT message has been received. """ + self._rgb = [int(val) for val in payload.split(',')] + self._xy = color_util.color_RGB_to_xy(int(self._rgb[0]), + int(self._rgb[1]), + int(self._rgb[2])) + self.update_ha_state() + + if self._topic["brightness_state_topic"] is not None: + mqtt.subscribe(self._hass, self._topic["brightness_state_topic"], + brightness_received, self._qos) + self._brightness = 255 + else: + self._brightness = None + + if self._topic["rgb_state_topic"] is not None: + mqtt.subscribe(self._hass, self._topic["rgb_state_topic"], + rgb_received, self._qos) + self._xy = [0, 0] + else: + self._xy = None + + @property + def brightness(self): + """ Brightness of this light between 0..255. """ + return self._brightness + + @property + def rgb_color(self): + """ RGB color value. """ + return self._rgb + + @property + def color_xy(self): + """ RGB color value. """ + return self._xy + @property def should_poll(self): """ No polling needed for a demo light. """ @@ -141,6 +176,19 @@ class MqttLight(Light): def turn_on(self, **kwargs): """ Turn the device on. """ + if ATTR_RGB_COLOR in kwargs and \ + self._topic["rgb_command_topic"] is not None: + self._rgb = kwargs[ATTR_RGB_COLOR] + rgb = DEFAULT_RGB_PATTERN % tuple(self._rgb) + mqtt.publish(self._hass, self._topic["rgb_command_topic"], + rgb, self._qos) + + if ATTR_BRIGHTNESS in kwargs and \ + self._topic["brightness_command_topic"] is not None: + self._brightness = kwargs[ATTR_BRIGHTNESS] + mqtt.publish(self._hass, self._topic["brightness_command_topic"], + self._brightness, self._qos) + mqtt.publish(self._hass, self._topic["command_topic"], self._payload["on"], self._qos) @@ -158,80 +206,3 @@ class MqttLight(Light): # optimistically assume that switch has changed state self._state = False self.update_ha_state() - - -class MqttLightRGB(MqttLight): - """ Provides a demo RGB light. """ - - # pylint: disable=too-many-arguments - def __init__(self, hass, name, - topic, - rgb, qos, - payload, - brightness, optimistic): - - super().__init__(hass, name, topic, qos, - payload, optimistic) - - self._rgb = rgb - self._brightness = brightness - self._xy = [[0.5, 0.5]] - - def brightness_received(topic, payload, qos): - """ A new MQTT message has been received. """ - self._brightness = int(payload) - self.update_ha_state() - - def rgb_received(topic, payload, qos): - """ A new MQTT message has been received. """ - self._rgb = [int(val) for val in payload.split(',')] - self.update_ha_state() - - if self._topic["brightness_state_topic"] is not None: - mqtt.subscribe(self._hass, self._topic["brightness_state_topic"], - brightness_received, self._qos) - - if self._topic["rgb_state_topic"] is not None: - mqtt.subscribe(self._hass, self._topic["rgb_state_topic"], - rgb_received, self._qos) - - @property - def brightness(self): - """ Brightness of this light between 0..255. """ - return self._brightness - - @property - def rgb_color(self): - """ RGB color value. """ - return self._rgb - - @property - def color_xy(self): - """ RGB color value. """ - return self._xy - - def turn_on(self, **kwargs): - """ Turn the device on. """ - - if ATTR_RGB_COLOR in kwargs and \ - self._topic["rgb_command_topic"] is not None: - - self._rgb = kwargs[ATTR_RGB_COLOR] - rgb = DEFAULT_RGB_PATTERN % tuple(self._rgb) - mqtt.publish(self._hass, self._topic["rgb_command_topic"], - rgb, self._qos) - - if ATTR_BRIGHTNESS in kwargs and \ - self._topic["brightness_command_topic"] is not None: - - self._brightness = kwargs[ATTR_BRIGHTNESS] - mqtt.publish(self._hass, self._topic["brightness_command_topic"], - self._brightness, self._qos) - - mqtt.publish(self._hass, self._topic["command_topic"], - self._payload["on"], self._qos) - - if self._optimistic: - # optimistically assume that switch has changed state - self._state = True - self.update_ha_state() diff --git a/tests/components/light/test_mqtt.py b/tests/components/light/test_mqtt.py new file mode 100644 index 00000000000..28c0e75e256 --- /dev/null +++ b/tests/components/light/test_mqtt.py @@ -0,0 +1,130 @@ +""" +tests.components.light.test_mqtt +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +Tests mqtt light. + +config for RGB Version with brightness: + +light: + platform: mqtt + name: "Office Light RGB" + state_topic: "office/rgb1/light/status" + command_topic: "office/rgb1/light/switch" + brightness_state_topic: "office/rgb1/brightness/status" + brightness_command_topic: "office/rgb1/brightness/set" + rgb_state_topic: "office/rgb1/rgb/status" + rgb_command_topic: "office/rgb1/rgb/set" + qos: 0 + payload_on: "on" + payload_off: "off" + +config without RGB: + +light: + platform: mqtt + name: "Office Light" + state_topic: "office/rgb1/light/status" + command_topic: "office/rgb1/light/switch" + brightness_state_topic: "office/rgb1/brightness/status" + brightness_command_topic: "office/rgb1/brightness/set" + qos: 0 + payload_on: "on" + payload_off: "off" + +config without RGB and brightness: + +light: + platform: mqtt + name: "Office Light" + state_topic: "office/rgb1/light/status" + command_topic: "office/rgb1/light/switch" + qos: 0 + payload_on: "on" + payload_off: "off" +""" +import unittest + +from homeassistant.const import STATE_ON, STATE_OFF +import homeassistant.core as ha +import homeassistant.components.light as light +from tests.common import mock_mqtt_component, fire_mqtt_message + + +class TestLightMQTT(unittest.TestCase): + """ Test the MQTT light. """ + + def setUp(self): # pylint: disable=invalid-name + self.hass = ha.HomeAssistant() + self.mock_publish = mock_mqtt_component(self.hass) + + def tearDown(self): # pylint: disable=invalid-name + """ Stop down stuff we started. """ + self.hass.stop() + + def test_controlling_state_via_topic(self): + self.assertTrue(light.setup(self.hass, { + 'switch': { + 'platform': 'mqtt', + 'name': 'test', + 'state_topic': 'test_light_rgb/status', + 'command_topic': 'test_light_rgb/set', + 'brightness_state_topic': 'test_light_rgb/brightness/status', + 'brightness_command_topic': 'test_light_rgb/brightness/set', + 'rgb_state_topic': 'test_light_rgb/rgb/status', + 'rgb_command_topic': 'test_light_rgb/rgb/set', + 'qos': 0, + 'payload_on': 'on', + 'payload_off': 'off' + } + })) + + state = self.hass.states.get('light.test') + self.assertEqual(STATE_OFF, state.state) + + fire_mqtt_message(self.hass, 'test', 'on') + self.hass.pool.block_till_done() + + state = self.hass.states.get('light.test') + self.assertEqual(STATE_ON, state.state) + + fire_mqtt_message(self.hass, 'test', 'off') + self.hass.pool.block_till_done() + + state = self.hass.states.get('light.test') + self.assertEqual(STATE_OFF, state.state) + + def test_sending_mqtt_commands_and_optimistic(self): + self.assertTrue(light.setup(self.hass, { + 'switch': { + 'platform': 'mqtt', + 'name': 'test', + 'command_topic': 'test_light_rgb/set', + 'brightness_state_topic': 'test_light_rgb/brightness/status', + 'brightness_command_topic': 'test_light_rgb/brightness/set', + 'rgb_state_topic': 'test_light_rgb/rgb/status', + 'rgb_command_topic': 'test_light_rgb/rgb/set', + 'qos': 2, + 'payload_on': 'on', + 'payload_off': 'off' + } + })) + + state = self.hass.states.get('light.test') + self.assertEqual(STATE_OFF, state.state) + + switch.turn_on(self.hass, 'light.test') + self.hass.pool.block_till_done() + + self.assertEqual(('test_light_rgb/set', 'on', 2), + self.mock_publish.mock_calls[-1][1]) + state = self.hass.states.get('light.test') + self.assertEqual(STATE_ON, state.state) + + switch.turn_off(self.hass, 'light.test') + self.hass.pool.block_till_done() + + self.assertEqual(('test_light_rgb/set', 'off', 2), + self.mock_publish.mock_calls[-1][1]) + state = self.hass.states.get('light.test') + self.assertEqual(STATE_OFF, state.state) From 168eb8e5a2b3ae12dc90774374684684463ac951 Mon Sep 17 00:00:00 2001 From: hexxter Date: Mon, 2 Nov 2015 17:02:34 +0100 Subject: [PATCH 08/15] mqtt light test is working more test should be written --- tests/components/light/__init__.py | 0 tests/components/light/test_mqtt.py | 14 +++++++------- 2 files changed, 7 insertions(+), 7 deletions(-) create mode 100644 tests/components/light/__init__.py diff --git a/tests/components/light/__init__.py b/tests/components/light/__init__.py new file mode 100644 index 00000000000..e69de29bb2d diff --git a/tests/components/light/test_mqtt.py b/tests/components/light/test_mqtt.py index 28c0e75e256..98c3615aeba 100644 --- a/tests/components/light/test_mqtt.py +++ b/tests/components/light/test_mqtt.py @@ -64,7 +64,7 @@ class TestLightMQTT(unittest.TestCase): def test_controlling_state_via_topic(self): self.assertTrue(light.setup(self.hass, { - 'switch': { + 'light': { 'platform': 'mqtt', 'name': 'test', 'state_topic': 'test_light_rgb/status', @@ -82,21 +82,21 @@ class TestLightMQTT(unittest.TestCase): state = self.hass.states.get('light.test') self.assertEqual(STATE_OFF, state.state) - fire_mqtt_message(self.hass, 'test', 'on') + fire_mqtt_message(self.hass, 'test_light_rgb/status', 'on') self.hass.pool.block_till_done() state = self.hass.states.get('light.test') self.assertEqual(STATE_ON, state.state) - fire_mqtt_message(self.hass, 'test', 'off') + fire_mqtt_message(self.hass, 'test_light_rgb/status', 'off') self.hass.pool.block_till_done() state = self.hass.states.get('light.test') self.assertEqual(STATE_OFF, state.state) - + def test_sending_mqtt_commands_and_optimistic(self): self.assertTrue(light.setup(self.hass, { - 'switch': { + 'light': { 'platform': 'mqtt', 'name': 'test', 'command_topic': 'test_light_rgb/set', @@ -113,7 +113,7 @@ class TestLightMQTT(unittest.TestCase): state = self.hass.states.get('light.test') self.assertEqual(STATE_OFF, state.state) - switch.turn_on(self.hass, 'light.test') + light.turn_on(self.hass, 'light.test') self.hass.pool.block_till_done() self.assertEqual(('test_light_rgb/set', 'on', 2), @@ -121,7 +121,7 @@ class TestLightMQTT(unittest.TestCase): state = self.hass.states.get('light.test') self.assertEqual(STATE_ON, state.state) - switch.turn_off(self.hass, 'light.test') + light.turn_off(self.hass, 'light.test') self.hass.pool.block_till_done() self.assertEqual(('test_light_rgb/set', 'off', 2), From 186f68cce30a1f0200b632aa21ee2d75269ad7a1 Mon Sep 17 00:00:00 2001 From: hexxter Date: Mon, 2 Nov 2015 20:16:36 +0100 Subject: [PATCH 09/15] not working mqtt light unittest --- tests/components/light/test_mqtt.py | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/tests/components/light/test_mqtt.py b/tests/components/light/test_mqtt.py index 98c3615aeba..0d97b61441c 100644 --- a/tests/components/light/test_mqtt.py +++ b/tests/components/light/test_mqtt.py @@ -93,6 +93,13 @@ class TestLightMQTT(unittest.TestCase): state = self.hass.states.get('light.test') self.assertEqual(STATE_OFF, state.state) + + fire_mqtt_message(self.hass, 'test_light_rgb/brightness/status', '100') + self.hass.pool.block_till_done() + + light_state = self.hass.states.get('light.test') + self.assertEqual(100, + light_state.attributes) def test_sending_mqtt_commands_and_optimistic(self): self.assertTrue(light.setup(self.hass, { From 8f12b997f8c61ab21fb1536c3668c8ed40b4e73e Mon Sep 17 00:00:00 2001 From: hexxter Date: Wed, 11 Nov 2015 12:32:24 +0100 Subject: [PATCH 10/15] more unittests --- tests/components/light/test_mqtt.py | 15 ++++++++++++++- 1 file changed, 14 insertions(+), 1 deletion(-) diff --git a/tests/components/light/test_mqtt.py b/tests/components/light/test_mqtt.py index 0d97b61441c..d1678f8cee1 100644 --- a/tests/components/light/test_mqtt.py +++ b/tests/components/light/test_mqtt.py @@ -44,6 +44,7 @@ light: payload_off: "off" """ import unittest +import homeassistant.util.color as color_util from homeassistant.const import STATE_ON, STATE_OFF import homeassistant.core as ha @@ -93,13 +94,25 @@ class TestLightMQTT(unittest.TestCase): state = self.hass.states.get('light.test') self.assertEqual(STATE_OFF, state.state) + + fire_mqtt_message(self.hass, 'test_light_rgb/status', 'on') + self.hass.pool.block_till_done() fire_mqtt_message(self.hass, 'test_light_rgb/brightness/status', '100') self.hass.pool.block_till_done() light_state = self.hass.states.get('light.test') self.assertEqual(100, - light_state.attributes) + light_state.attributes['brightness']) + self.assertEqual([0, 0], + light_state.attributes['xy_color']) + xy = color_util.color_RGB_to_xy(125,125,125) + fire_mqtt_message(self.hass, 'test_light_rgb/rgb/status', '125,125,125') + self.hass.pool.block_till_done() + + light_state = self.hass.states.get('light.test') + self.assertEqual(xy, + light_state.attributes['xy_color']) def test_sending_mqtt_commands_and_optimistic(self): self.assertTrue(light.setup(self.hass, { From 0c52b143ae22f79e57f1c3a6b98d1276b7ba401a Mon Sep 17 00:00:00 2001 From: hexxter Date: Wed, 11 Nov 2015 12:38:10 +0100 Subject: [PATCH 11/15] now saved --- tests/components/light/test_mqtt.py | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/tests/components/light/test_mqtt.py b/tests/components/light/test_mqtt.py index d1678f8cee1..cb7b0a97f8e 100644 --- a/tests/components/light/test_mqtt.py +++ b/tests/components/light/test_mqtt.py @@ -106,7 +106,9 @@ class TestLightMQTT(unittest.TestCase): light_state.attributes['brightness']) self.assertEqual([0, 0], light_state.attributes['xy_color']) - xy = color_util.color_RGB_to_xy(125,125,125) + + xy = color_util.color_RGB_to_xy(125,125,125) + fire_mqtt_message(self.hass, 'test_light_rgb/rgb/status', '125,125,125') self.hass.pool.block_till_done() From 90063ea7f887fff9a3cd5d63c16346d1e17cb001 Mon Sep 17 00:00:00 2001 From: hexxter Date: Wed, 11 Nov 2015 12:44:59 +0100 Subject: [PATCH 12/15] check the default value only checkable local. I removed it. --- tests/components/light/test_mqtt.py | 2 -- 1 file changed, 2 deletions(-) diff --git a/tests/components/light/test_mqtt.py b/tests/components/light/test_mqtt.py index cb7b0a97f8e..f67d1cb15a0 100644 --- a/tests/components/light/test_mqtt.py +++ b/tests/components/light/test_mqtt.py @@ -104,8 +104,6 @@ class TestLightMQTT(unittest.TestCase): light_state = self.hass.states.get('light.test') self.assertEqual(100, light_state.attributes['brightness']) - self.assertEqual([0, 0], - light_state.attributes['xy_color']) xy = color_util.color_RGB_to_xy(125,125,125) From 698e30bd2b167f72de24b439b518e8dc05108ec9 Mon Sep 17 00:00:00 2001 From: hexxter Date: Wed, 11 Nov 2015 20:40:21 +0100 Subject: [PATCH 13/15] more self.hass.pool.block_till_done() --- tests/components/light/test_mqtt.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/tests/components/light/test_mqtt.py b/tests/components/light/test_mqtt.py index f67d1cb15a0..3570889c94b 100644 --- a/tests/components/light/test_mqtt.py +++ b/tests/components/light/test_mqtt.py @@ -102,6 +102,7 @@ class TestLightMQTT(unittest.TestCase): self.hass.pool.block_till_done() light_state = self.hass.states.get('light.test') + self.hass.pool.block_till_done() self.assertEqual(100, light_state.attributes['brightness']) @@ -111,6 +112,7 @@ class TestLightMQTT(unittest.TestCase): self.hass.pool.block_till_done() light_state = self.hass.states.get('light.test') + self.hass.pool.block_till_done() self.assertEqual(xy, light_state.attributes['xy_color']) From 329d63ac118f4f4975df1a8048161da73180784c Mon Sep 17 00:00:00 2001 From: hexxter Date: Wed, 11 Nov 2015 20:52:41 +0100 Subject: [PATCH 14/15] next online unittest test ;) --- tests/components/light/test_mqtt.py | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/tests/components/light/test_mqtt.py b/tests/components/light/test_mqtt.py index 3570889c94b..dc87c90e896 100644 --- a/tests/components/light/test_mqtt.py +++ b/tests/components/light/test_mqtt.py @@ -108,11 +108,13 @@ class TestLightMQTT(unittest.TestCase): xy = color_util.color_RGB_to_xy(125,125,125) + fire_mqtt_message(self.hass, 'test_light_rgb/status', 'on') + self.hass.pool.block_till_done() + fire_mqtt_message(self.hass, 'test_light_rgb/rgb/status', '125,125,125') self.hass.pool.block_till_done() light_state = self.hass.states.get('light.test') - self.hass.pool.block_till_done() self.assertEqual(xy, light_state.attributes['xy_color']) From 41d0f95d9ad459aff30c8bc8040434579dfa22e8 Mon Sep 17 00:00:00 2001 From: Paulus Schoutsen Date: Thu, 12 Nov 2015 23:03:56 -0800 Subject: [PATCH 15/15] Move core light test to correct dir --- tests/components/{test_light.py => light/test_init.py} | 0 tests/components/light/test_mqtt.py | 9 +++++---- 2 files changed, 5 insertions(+), 4 deletions(-) rename tests/components/{test_light.py => light/test_init.py} (100%) diff --git a/tests/components/test_light.py b/tests/components/light/test_init.py similarity index 100% rename from tests/components/test_light.py rename to tests/components/light/test_init.py diff --git a/tests/components/light/test_mqtt.py b/tests/components/light/test_mqtt.py index dc87c90e896..f4f64c68acc 100644 --- a/tests/components/light/test_mqtt.py +++ b/tests/components/light/test_mqtt.py @@ -94,7 +94,7 @@ class TestLightMQTT(unittest.TestCase): state = self.hass.states.get('light.test') self.assertEqual(STATE_OFF, state.state) - + fire_mqtt_message(self.hass, 'test_light_rgb/status', 'on') self.hass.pool.block_till_done() @@ -106,18 +106,19 @@ class TestLightMQTT(unittest.TestCase): self.assertEqual(100, light_state.attributes['brightness']) - xy = color_util.color_RGB_to_xy(125,125,125) + xy = color_util.color_RGB_to_xy(125, 125, 125) fire_mqtt_message(self.hass, 'test_light_rgb/status', 'on') self.hass.pool.block_till_done() - fire_mqtt_message(self.hass, 'test_light_rgb/rgb/status', '125,125,125') + fire_mqtt_message(self.hass, 'test_light_rgb/rgb/status', + '125,125,125') self.hass.pool.block_till_done() light_state = self.hass.states.get('light.test') self.assertEqual(xy, light_state.attributes['xy_color']) - + def test_sending_mqtt_commands_and_optimistic(self): self.assertTrue(light.setup(self.hass, { 'light': {