Skip to content
Merged
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
18 changes: 14 additions & 4 deletions homeassistant/components/light/mqtt_json.py
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,7 @@
FLASH_LONG, FLASH_SHORT, Light, PLATFORM_SCHEMA, SUPPORT_BRIGHTNESS,
SUPPORT_COLOR_TEMP, SUPPORT_EFFECT, SUPPORT_FLASH, SUPPORT_RGB_COLOR,
SUPPORT_TRANSITION, SUPPORT_WHITE_VALUE, SUPPORT_XY_COLOR)
from homeassistant.components.light.mqtt import CONF_BRIGHTNESS_SCALE
from homeassistant.const import (
CONF_BRIGHTNESS, CONF_COLOR_TEMP, CONF_EFFECT,
CONF_NAME, CONF_OPTIMISTIC, CONF_RGB, CONF_WHITE_VALUE, CONF_XY)
Expand All @@ -42,6 +43,7 @@
DEFAULT_RGB = False
DEFAULT_WHITE_VALUE = False
DEFAULT_XY = False
DEFAULT_BRIGHTNESS_SCALE = 255

CONF_EFFECT_LIST = 'effect_list'

Expand All @@ -51,6 +53,8 @@
# Stealing some of these from the base MQTT configs.
PLATFORM_SCHEMA = PLATFORM_SCHEMA.extend({
vol.Optional(CONF_BRIGHTNESS, default=DEFAULT_BRIGHTNESS): cv.boolean,
vol.Optional(CONF_BRIGHTNESS_SCALE, default=DEFAULT_BRIGHTNESS_SCALE):
vol.All(vol.Coerce(int), vol.Range(min=1)),
vol.Optional(CONF_COLOR_TEMP, default=DEFAULT_COLOR_TEMP): cv.boolean,
vol.Optional(CONF_EFFECT, default=DEFAULT_EFFECT): cv.boolean,
vol.Optional(CONF_EFFECT_LIST): vol.All(cv.ensure_list, [cv.string]),
Expand Down Expand Up @@ -102,7 +106,8 @@ def async_setup_platform(hass, config, async_add_devices, discovery_info=None):
},
config.get(CONF_AVAILABILITY_TOPIC),
config.get(CONF_PAYLOAD_AVAILABLE),
config.get(CONF_PAYLOAD_NOT_AVAILABLE)
config.get(CONF_PAYLOAD_NOT_AVAILABLE),
config.get(CONF_BRIGHTNESS_SCALE)
)])


Expand All @@ -112,7 +117,7 @@ class MqttJson(MqttAvailability, Light):
def __init__(self, name, effect_list, topic, qos, retain, optimistic,
brightness, color_temp, effect, rgb, white_value, xy,
flash_times, availability_topic, payload_available,
payload_not_available):
payload_not_available, brightness_scale):
"""Initialize MQTT JSON light."""
super().__init__(availability_topic, qos, payload_available,
payload_not_available)
Expand Down Expand Up @@ -154,6 +159,7 @@ def __init__(self, name, effect_list, topic, qos, retain, optimistic,
self._xy = None

self._flash_times = flash_times
self._brightness_scale = brightness_scale

self._supported_features = (SUPPORT_TRANSITION | SUPPORT_FLASH)
self._supported_features |= (rgb and SUPPORT_RGB_COLOR)
Expand Down Expand Up @@ -192,7 +198,9 @@ def state_received(topic, payload, qos):

if self._brightness is not None:
try:
self._brightness = int(values['brightness'])
self._brightness = int(values['brightness'] /
float(self._brightness_scale) *
255)
except KeyError:
pass
except ValueError:
Expand Down Expand Up @@ -333,7 +341,9 @@ def async_turn_on(self, **kwargs):
message['transition'] = int(kwargs[ATTR_TRANSITION])

if ATTR_BRIGHTNESS in kwargs:
message['brightness'] = int(kwargs[ATTR_BRIGHTNESS])
message['brightness'] = int(kwargs[ATTR_BRIGHTNESS] /
float(DEFAULT_BRIGHTNESS_SCALE) *
self._brightness_scale)

if self._optimistic:
self._brightness = kwargs[ATTR_BRIGHTNESS]
Expand Down
48 changes: 48 additions & 0 deletions tests/components/light/test_mqtt_json.py
Original file line number Diff line number Diff line change
Expand Up @@ -76,7 +76,18 @@
name: mqtt_json_light_1
state_topic: "home/rgb1"
command_topic: "home/rgb1/set"

Config with brightness and scale:

light:
platform: mqtt_json
name: test
state_topic: "mqtt_json_light_1"
command_topic: "mqtt_json_light_1/set"
brightness: true
brightness_scale: 99
"""

import json
import unittest

Expand Down Expand Up @@ -403,6 +414,43 @@ def test_transition(self):
self.assertEqual(10, message_json["transition"])
self.assertEqual("OFF", message_json["state"])

def test_brightness_scale(self):
"""Test for brightness scaling."""
assert setup_component(self.hass, light.DOMAIN, {
light.DOMAIN: {
'platform': 'mqtt_json',
'name': 'test',
'state_topic': 'test_light_bright_scale',
'command_topic': 'test_light_bright_scale/set',
'brightness': True,
'brightness_scale': 99
}
})

state = self.hass.states.get('light.test')
self.assertEqual(STATE_OFF, state.state)
self.assertIsNone(state.attributes.get('brightness'))
self.assertFalse(state.attributes.get(ATTR_ASSUMED_STATE))

# Turn on the light
fire_mqtt_message(self.hass, 'test_light_bright_scale',
'{"state":"ON"}')
self.hass.block_till_done()

state = self.hass.states.get('light.test')
self.assertEqual(STATE_ON, state.state)
self.assertEqual(255, state.attributes.get('brightness'))

# Turn on the light with brightness
fire_mqtt_message(self.hass, 'test_light_bright_scale',
'{"state":"ON",'
'"brightness": 99}')
self.hass.block_till_done()

state = self.hass.states.get('light.test')
self.assertEqual(STATE_ON, state.state)
self.assertEqual(255, state.attributes.get('brightness'))

def test_invalid_color_brightness_and_white_values(self): \
# pylint: disable=invalid-name
"""Test that invalid color/brightness/white values are ignored."""
Expand Down