light/mqqt_json: allow brightness scaling (#11613)
This commit is contained in:
parent
e476b9d225
commit
2e08766cb1
2 changed files with 62 additions and 4 deletions
|
@ -17,6 +17,7 @@ from homeassistant.components.light import (
|
||||||
FLASH_LONG, FLASH_SHORT, Light, PLATFORM_SCHEMA, SUPPORT_BRIGHTNESS,
|
FLASH_LONG, FLASH_SHORT, Light, PLATFORM_SCHEMA, SUPPORT_BRIGHTNESS,
|
||||||
SUPPORT_COLOR_TEMP, SUPPORT_EFFECT, SUPPORT_FLASH, SUPPORT_RGB_COLOR,
|
SUPPORT_COLOR_TEMP, SUPPORT_EFFECT, SUPPORT_FLASH, SUPPORT_RGB_COLOR,
|
||||||
SUPPORT_TRANSITION, SUPPORT_WHITE_VALUE, SUPPORT_XY_COLOR)
|
SUPPORT_TRANSITION, SUPPORT_WHITE_VALUE, SUPPORT_XY_COLOR)
|
||||||
|
from homeassistant.components.light.mqtt import CONF_BRIGHTNESS_SCALE
|
||||||
from homeassistant.const import (
|
from homeassistant.const import (
|
||||||
CONF_BRIGHTNESS, CONF_COLOR_TEMP, CONF_EFFECT,
|
CONF_BRIGHTNESS, CONF_COLOR_TEMP, CONF_EFFECT,
|
||||||
CONF_NAME, CONF_OPTIMISTIC, CONF_RGB, CONF_WHITE_VALUE, CONF_XY)
|
CONF_NAME, CONF_OPTIMISTIC, CONF_RGB, CONF_WHITE_VALUE, CONF_XY)
|
||||||
|
@ -42,6 +43,7 @@ DEFAULT_OPTIMISTIC = False
|
||||||
DEFAULT_RGB = False
|
DEFAULT_RGB = False
|
||||||
DEFAULT_WHITE_VALUE = False
|
DEFAULT_WHITE_VALUE = False
|
||||||
DEFAULT_XY = False
|
DEFAULT_XY = False
|
||||||
|
DEFAULT_BRIGHTNESS_SCALE = 255
|
||||||
|
|
||||||
CONF_EFFECT_LIST = 'effect_list'
|
CONF_EFFECT_LIST = 'effect_list'
|
||||||
|
|
||||||
|
@ -51,6 +53,8 @@ CONF_FLASH_TIME_SHORT = 'flash_time_short'
|
||||||
# Stealing some of these from the base MQTT configs.
|
# Stealing some of these from the base MQTT configs.
|
||||||
PLATFORM_SCHEMA = PLATFORM_SCHEMA.extend({
|
PLATFORM_SCHEMA = PLATFORM_SCHEMA.extend({
|
||||||
vol.Optional(CONF_BRIGHTNESS, default=DEFAULT_BRIGHTNESS): cv.boolean,
|
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_COLOR_TEMP, default=DEFAULT_COLOR_TEMP): cv.boolean,
|
||||||
vol.Optional(CONF_EFFECT, default=DEFAULT_EFFECT): cv.boolean,
|
vol.Optional(CONF_EFFECT, default=DEFAULT_EFFECT): cv.boolean,
|
||||||
vol.Optional(CONF_EFFECT_LIST): vol.All(cv.ensure_list, [cv.string]),
|
vol.Optional(CONF_EFFECT_LIST): vol.All(cv.ensure_list, [cv.string]),
|
||||||
|
@ -102,7 +106,8 @@ def async_setup_platform(hass, config, async_add_devices, discovery_info=None):
|
||||||
},
|
},
|
||||||
config.get(CONF_AVAILABILITY_TOPIC),
|
config.get(CONF_AVAILABILITY_TOPIC),
|
||||||
config.get(CONF_PAYLOAD_AVAILABLE),
|
config.get(CONF_PAYLOAD_AVAILABLE),
|
||||||
config.get(CONF_PAYLOAD_NOT_AVAILABLE)
|
config.get(CONF_PAYLOAD_NOT_AVAILABLE),
|
||||||
|
config.get(CONF_BRIGHTNESS_SCALE)
|
||||||
)])
|
)])
|
||||||
|
|
||||||
|
|
||||||
|
@ -112,7 +117,7 @@ class MqttJson(MqttAvailability, Light):
|
||||||
def __init__(self, name, effect_list, topic, qos, retain, optimistic,
|
def __init__(self, name, effect_list, topic, qos, retain, optimistic,
|
||||||
brightness, color_temp, effect, rgb, white_value, xy,
|
brightness, color_temp, effect, rgb, white_value, xy,
|
||||||
flash_times, availability_topic, payload_available,
|
flash_times, availability_topic, payload_available,
|
||||||
payload_not_available):
|
payload_not_available, brightness_scale):
|
||||||
"""Initialize MQTT JSON light."""
|
"""Initialize MQTT JSON light."""
|
||||||
super().__init__(availability_topic, qos, payload_available,
|
super().__init__(availability_topic, qos, payload_available,
|
||||||
payload_not_available)
|
payload_not_available)
|
||||||
|
@ -154,6 +159,7 @@ class MqttJson(MqttAvailability, Light):
|
||||||
self._xy = None
|
self._xy = None
|
||||||
|
|
||||||
self._flash_times = flash_times
|
self._flash_times = flash_times
|
||||||
|
self._brightness_scale = brightness_scale
|
||||||
|
|
||||||
self._supported_features = (SUPPORT_TRANSITION | SUPPORT_FLASH)
|
self._supported_features = (SUPPORT_TRANSITION | SUPPORT_FLASH)
|
||||||
self._supported_features |= (rgb and SUPPORT_RGB_COLOR)
|
self._supported_features |= (rgb and SUPPORT_RGB_COLOR)
|
||||||
|
@ -192,7 +198,9 @@ class MqttJson(MqttAvailability, Light):
|
||||||
|
|
||||||
if self._brightness is not None:
|
if self._brightness is not None:
|
||||||
try:
|
try:
|
||||||
self._brightness = int(values['brightness'])
|
self._brightness = int(values['brightness'] /
|
||||||
|
float(self._brightness_scale) *
|
||||||
|
255)
|
||||||
except KeyError:
|
except KeyError:
|
||||||
pass
|
pass
|
||||||
except ValueError:
|
except ValueError:
|
||||||
|
@ -333,7 +341,9 @@ class MqttJson(MqttAvailability, Light):
|
||||||
message['transition'] = int(kwargs[ATTR_TRANSITION])
|
message['transition'] = int(kwargs[ATTR_TRANSITION])
|
||||||
|
|
||||||
if ATTR_BRIGHTNESS in kwargs:
|
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:
|
if self._optimistic:
|
||||||
self._brightness = kwargs[ATTR_BRIGHTNESS]
|
self._brightness = kwargs[ATTR_BRIGHTNESS]
|
||||||
|
|
|
@ -76,7 +76,18 @@ light:
|
||||||
name: mqtt_json_light_1
|
name: mqtt_json_light_1
|
||||||
state_topic: "home/rgb1"
|
state_topic: "home/rgb1"
|
||||||
command_topic: "home/rgb1/set"
|
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 json
|
||||||
import unittest
|
import unittest
|
||||||
|
|
||||||
|
@ -403,6 +414,43 @@ class TestLightMQTTJSON(unittest.TestCase):
|
||||||
self.assertEqual(10, message_json["transition"])
|
self.assertEqual(10, message_json["transition"])
|
||||||
self.assertEqual("OFF", message_json["state"])
|
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): \
|
def test_invalid_color_brightness_and_white_values(self): \
|
||||||
# pylint: disable=invalid-name
|
# pylint: disable=invalid-name
|
||||||
"""Test that invalid color/brightness/white values are ignored."""
|
"""Test that invalid color/brightness/white values are ignored."""
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue