From 9577b4c6c24d1d0a81c47aa502cd046de6bf3cc1 Mon Sep 17 00:00:00 2001 From: Jon Fink Date: Thu, 29 Dec 2016 12:52:07 -0500 Subject: [PATCH 1/4] Add color_temp_command_template for mqtt light component Home assistant internal unit for color temperature is Mired but some systems (e.g., SmartThings through mqtt bridge) use Kelvin. Conversion between these types can be handled with the value template concept (used previously to unpack json values). Added a "color_temp_command_template" configuration option for MQTT lights that specifies a function to be applied to the HA-internal color temperature value to get a light-compatible value. --- homeassistant/components/light/mqtt.py | 19 ++++++++++++++----- 1 file changed, 14 insertions(+), 5 deletions(-) diff --git a/homeassistant/components/light/mqtt.py b/homeassistant/components/light/mqtt.py index 54fa6b30598076..614f32d2c35531 100644 --- a/homeassistant/components/light/mqtt.py +++ b/homeassistant/components/light/mqtt.py @@ -35,6 +35,9 @@ CONF_COLOR_TEMP_STATE_TOPIC = 'color_temp_state_topic' CONF_COLOR_TEMP_COMMAND_TOPIC = 'color_temp_command_topic' CONF_COLOR_TEMP_VALUE_TEMPLATE = 'color_temp_value_template' +CONF_COLOR_TEMP_COMMAND_TEMPLATE = 'color_temp_command_template' + +CONF_COLOR_TEMP_COMMAND = 'color_temp_command' DEFAULT_NAME = 'MQTT Light' DEFAULT_PAYLOAD_ON = 'ON' @@ -51,6 +54,7 @@ vol.Optional(CONF_COLOR_TEMP_STATE_TOPIC): mqtt.valid_subscribe_topic, vol.Optional(CONF_COLOR_TEMP_COMMAND_TOPIC): mqtt.valid_publish_topic, vol.Optional(CONF_COLOR_TEMP_VALUE_TEMPLATE): cv.template, + vol.Optional(CONF_COLOR_TEMP_COMMAND_TEMPLATE): cv.template, vol.Optional(CONF_RGB_STATE_TOPIC): mqtt.valid_subscribe_topic, vol.Optional(CONF_RGB_COMMAND_TOPIC): mqtt.valid_publish_topic, vol.Optional(CONF_RGB_VALUE_TEMPLATE): cv.template, @@ -85,7 +89,8 @@ def setup_platform(hass, config, add_devices, discovery_info=None): CONF_STATE: config.get(CONF_STATE_VALUE_TEMPLATE), CONF_BRIGHTNESS: config.get(CONF_BRIGHTNESS_VALUE_TEMPLATE), CONF_RGB: config.get(CONF_RGB_VALUE_TEMPLATE), - CONF_COLOR_TEMP: config.get(CONF_COLOR_TEMP_VALUE_TEMPLATE) + CONF_COLOR_TEMP: config.get(CONF_COLOR_TEMP_VALUE_TEMPLATE), + CONF_COLOR_TEMP+"_COMMAND": config.get(CONF_COLOR_TEMP_COMMAND_TEMPLATE) }, config.get(CONF_QOS), config.get(CONF_RETAIN), @@ -136,6 +141,8 @@ def __init__(self, hass, name, topic, templates, qos, retain, payload, tpl.hass = hass templates[key] = tpl.render_with_possible_json_value + self.templates = templates + def state_received(topic, payload, qos): """A new MQTT message has been received.""" payload = templates[CONF_STATE](payload) @@ -184,7 +191,8 @@ def rgb_received(topic, payload, qos): def color_temp_received(topic, payload, qos): """A new MQTT message for color temp has been received.""" - self._color_temp = int(templates[CONF_COLOR_TEMP](payload)) + self._color_temp = int(float((templates[CONF_COLOR_TEMP](payload)))) + _LOGGER.debug("Received color temp: %f, converts to %d", float(payload), self._color_temp) self.update_ha_state() if self._topic[CONF_COLOR_TEMP_STATE_TOPIC] is not None: @@ -266,7 +274,8 @@ def turn_on(self, **kwargs): if ATTR_COLOR_TEMP in kwargs and \ self._topic[CONF_COLOR_TEMP_COMMAND_TOPIC] is not None: - color_temp = int(kwargs[ATTR_COLOR_TEMP]) + color_temp = int(float((self.templates[CONF_COLOR_TEMP+"_COMMAND"](str(kwargs[ATTR_COLOR_TEMP]))))) + _LOGGER.debug("Command temp %f mired, coverts to %d K" % (kwargs[ATTR_COLOR_TEMP], color_temp)) mqtt.publish( self._hass, self._topic[CONF_COLOR_TEMP_COMMAND_TOPIC], color_temp, self._qos, self._retain) @@ -283,7 +292,7 @@ def turn_on(self, **kwargs): should_update = True if should_update: - self.schedule_update_ha_state() + self.update_ha_state() def turn_off(self, **kwargs): """Turn the device off.""" @@ -293,4 +302,4 @@ def turn_off(self, **kwargs): if self._optimistic: # Optimistically assume that switch has changed state. self._state = False - self.schedule_update_ha_state() + self.update_ha_state() From e4ae6801493e2058e4ef362fb9e0bdba3684ce66 Mon Sep 17 00:00:00 2001 From: Jon Fink Date: Thu, 29 Dec 2016 13:23:14 -0500 Subject: [PATCH 2/4] Fix long lines in light/mqtt.py --- homeassistant/components/light/mqtt.py | 16 +++++++++++----- 1 file changed, 11 insertions(+), 5 deletions(-) diff --git a/homeassistant/components/light/mqtt.py b/homeassistant/components/light/mqtt.py index 614f32d2c35531..bc9e648de3c7b9 100644 --- a/homeassistant/components/light/mqtt.py +++ b/homeassistant/components/light/mqtt.py @@ -90,7 +90,8 @@ def setup_platform(hass, config, add_devices, discovery_info=None): CONF_BRIGHTNESS: config.get(CONF_BRIGHTNESS_VALUE_TEMPLATE), CONF_RGB: config.get(CONF_RGB_VALUE_TEMPLATE), CONF_COLOR_TEMP: config.get(CONF_COLOR_TEMP_VALUE_TEMPLATE), - CONF_COLOR_TEMP+"_COMMAND": config.get(CONF_COLOR_TEMP_COMMAND_TEMPLATE) + CONF_COLOR_TEMP+"_COMMAND": + config.get(CONF_COLOR_TEMP_COMMAND_TEMPLATE) }, config.get(CONF_QOS), config.get(CONF_RETAIN), @@ -191,8 +192,10 @@ def rgb_received(topic, payload, qos): def color_temp_received(topic, payload, qos): """A new MQTT message for color temp has been received.""" - self._color_temp = int(float((templates[CONF_COLOR_TEMP](payload)))) - _LOGGER.debug("Received color temp: %f, converts to %d", float(payload), self._color_temp) + self._color_temp = \ + int(float((templates[CONF_COLOR_TEMP](payload)))) + _LOGGER.debug("Received color temp: %f, converts to %d", + float(payload), self._color_temp) self.update_ha_state() if self._topic[CONF_COLOR_TEMP_STATE_TOPIC] is not None: @@ -274,8 +277,11 @@ def turn_on(self, **kwargs): if ATTR_COLOR_TEMP in kwargs and \ self._topic[CONF_COLOR_TEMP_COMMAND_TOPIC] is not None: - color_temp = int(float((self.templates[CONF_COLOR_TEMP+"_COMMAND"](str(kwargs[ATTR_COLOR_TEMP]))))) - _LOGGER.debug("Command temp %f mired, coverts to %d K" % (kwargs[ATTR_COLOR_TEMP], color_temp)) + color_temp = int(float(( + self.templates[CONF_COLOR_TEMP+"_COMMAND"]( + str(kwargs[ATTR_COLOR_TEMP]))))) + _LOGGER.debug("Command temp %f mired, coverts to %d K" % + (kwargs[ATTR_COLOR_TEMP], color_temp)) mqtt.publish( self._hass, self._topic[CONF_COLOR_TEMP_COMMAND_TOPIC], color_temp, self._qos, self._retain) From 6d6a2d9b0aefa164c025cef878206ea08a8883fe Mon Sep 17 00:00:00 2001 From: Jon Fink Date: Thu, 29 Dec 2016 14:06:06 -0500 Subject: [PATCH 3/4] Fix logging-not-lazy pylint error in light/mqtt.py --- homeassistant/components/light/mqtt.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/homeassistant/components/light/mqtt.py b/homeassistant/components/light/mqtt.py index bc9e648de3c7b9..08d4da898f924c 100644 --- a/homeassistant/components/light/mqtt.py +++ b/homeassistant/components/light/mqtt.py @@ -280,8 +280,8 @@ def turn_on(self, **kwargs): color_temp = int(float(( self.templates[CONF_COLOR_TEMP+"_COMMAND"]( str(kwargs[ATTR_COLOR_TEMP]))))) - _LOGGER.debug("Command temp %f mired, coverts to %d K" % - (kwargs[ATTR_COLOR_TEMP], color_temp)) + _LOGGER.debug("Command temp %f mired, coverts to %d K", + kwargs[ATTR_COLOR_TEMP], color_temp) mqtt.publish( self._hass, self._topic[CONF_COLOR_TEMP_COMMAND_TOPIC], color_temp, self._qos, self._retain) From 8b88d7750b2ca9b8ab8fce9daa3d5b7d08a02a6a Mon Sep 17 00:00:00 2001 From: Jon Fink Date: Fri, 13 Jan 2017 13:41:52 -0500 Subject: [PATCH 4/4] Revert to use scheduled ha update functions --- homeassistant/components/light/mqtt.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/homeassistant/components/light/mqtt.py b/homeassistant/components/light/mqtt.py index 08d4da898f924c..24a194f1969e71 100644 --- a/homeassistant/components/light/mqtt.py +++ b/homeassistant/components/light/mqtt.py @@ -298,7 +298,7 @@ def turn_on(self, **kwargs): should_update = True if should_update: - self.update_ha_state() + self.schedule_update_ha_state() def turn_off(self, **kwargs): """Turn the device off.""" @@ -308,4 +308,4 @@ def turn_off(self, **kwargs): if self._optimistic: # Optimistically assume that switch has changed state. self._state = False - self.update_ha_state() + self.schedule_update_ha_state()