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() +