Read min and max mireds from ZHA lights (#33983)

* implement min and max mireds

* remove unnecessary else

* additional light test

* add test to appease the codecov god

* change defaults
This commit is contained in:
David F. Mulcahey 2020-04-10 23:19:17 -04:00 committed by GitHub
parent 44f8dab0b0
commit c1962a4895
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
4 changed files with 54 additions and 5 deletions

View file

@ -41,6 +41,18 @@ class ColorChannel(ZigbeeChannel):
"""Initialize ColorChannel.""" """Initialize ColorChannel."""
super().__init__(cluster, ch_pool) super().__init__(cluster, ch_pool)
self._color_capabilities = None self._color_capabilities = None
self._min_mireds = 153
self._max_mireds = 500
@property
def min_mireds(self):
"""Return the coldest color_temp that this channel supports."""
return self._min_mireds
@property
def max_mireds(self):
"""Return the warmest color_temp that this channel supports."""
return self._max_mireds
def get_color_capabilities(self): def get_color_capabilities(self):
"""Return the color capabilities.""" """Return the color capabilities."""
@ -59,9 +71,15 @@ class ColorChannel(ZigbeeChannel):
async def fetch_color_capabilities(self, from_cache): async def fetch_color_capabilities(self, from_cache):
"""Get the color configuration.""" """Get the color configuration."""
capabilities = await self.get_attribute_value( attributes = [
"color_capabilities", from_cache=from_cache "color_temp_physical_min",
) "color_temp_physical_max",
"color_capabilities",
]
results = await self.get_attributes(attributes, from_cache=from_cache)
capabilities = results.get("color_capabilities")
self._min_mireds = results.get("color_temp_physical_min", 153)
self._max_mireds = results.get("color_temp_physical_max", 500)
if capabilities is None: if capabilities is None:
# ZCL Version 4 devices don't support the color_capabilities # ZCL Version 4 devices don't support the color_capabilities

View file

@ -108,7 +108,7 @@ class BaseLight(LogMixin, light.Light):
self._off_brightness: Optional[int] = None self._off_brightness: Optional[int] = None
self._hs_color: Optional[Tuple[float, float]] = None self._hs_color: Optional[Tuple[float, float]] = None
self._color_temp: Optional[int] = None self._color_temp: Optional[int] = None
self._min_mireds: Optional[int] = 154 self._min_mireds: Optional[int] = 153
self._max_mireds: Optional[int] = 500 self._max_mireds: Optional[int] = 500
self._white_value: Optional[int] = None self._white_value: Optional[int] = None
self._effect_list: Optional[List[str]] = None self._effect_list: Optional[List[str]] = None
@ -138,6 +138,16 @@ class BaseLight(LogMixin, light.Light):
"""Return the brightness of this light.""" """Return the brightness of this light."""
return self._brightness return self._brightness
@property
def min_mireds(self):
"""Return the coldest color_temp that this light supports."""
return self._min_mireds
@property
def max_mireds(self):
"""Return the warmest color_temp that this light supports."""
return self._max_mireds
def set_level(self, value): def set_level(self, value):
"""Set the brightness of this light between 0..254. """Set the brightness of this light between 0..254.
@ -316,6 +326,9 @@ class Light(BaseLight, ZhaEntity):
self._level_channel = self.cluster_channels.get(CHANNEL_LEVEL) self._level_channel = self.cluster_channels.get(CHANNEL_LEVEL)
self._color_channel = self.cluster_channels.get(CHANNEL_COLOR) self._color_channel = self.cluster_channels.get(CHANNEL_COLOR)
self._identify_channel = self.zha_device.channels.identify_ch self._identify_channel = self.zha_device.channels.identify_ch
if self._color_channel:
self._min_mireds: Optional[int] = self._color_channel.min_mireds
self._max_mireds: Optional[int] = self._color_channel.max_mireds
self._cancel_refresh_handle = None self._cancel_refresh_handle = None
effect_list = [] effect_list = []
@ -501,7 +514,7 @@ class LightGroup(BaseLight, ZhaGroupEntity):
self._color_temp = helpers.reduce_attribute(on_states, ATTR_COLOR_TEMP) self._color_temp = helpers.reduce_attribute(on_states, ATTR_COLOR_TEMP)
self._min_mireds = helpers.reduce_attribute( self._min_mireds = helpers.reduce_attribute(
states, ATTR_MIN_MIREDS, default=154, reduce=min states, ATTR_MIN_MIREDS, default=153, reduce=min
) )
self._max_mireds = helpers.reduce_attribute( self._max_mireds = helpers.reduce_attribute(
states, ATTR_MAX_MIREDS, default=500, reduce=max states, ATTR_MAX_MIREDS, default=500, reduce=max

View file

@ -392,3 +392,12 @@ async def test_device_override(hass, zigpy_device_mock, setup_zha, override, ent
await zha_gateway.async_device_initialized(zigpy_device) await zha_gateway.async_device_initialized(zigpy_device)
await hass.async_block_till_done() await hass.async_block_till_done()
assert hass.states.get(entity_id) is not None assert hass.states.get(entity_id) is not None
async def test_group_probe_cleanup_called(hass, setup_zha, config_entry):
"""Test cleanup happens when zha is unloaded."""
await setup_zha()
disc.GROUP_PROBE.cleanup = mock.Mock(wraps=disc.GROUP_PROBE.cleanup)
await config_entry.async_unload(hass)
await hass.async_block_till_done()
disc.GROUP_PROBE.cleanup.assert_called()

View file

@ -552,6 +552,15 @@ async def async_test_zha_group_light_entity(
await dev3_cluster_on_off.on() await dev3_cluster_on_off.on()
assert hass.states.get(entity_id).state == STATE_ON assert hass.states.get(entity_id).state == STATE_ON
# add a 3rd member and ensure we still have an entity and we track the new one
await dev1_cluster_on_off.off()
await dev3_cluster_on_off.off()
assert hass.states.get(entity_id).state == STATE_OFF
# this will test that _reprobe_group is used correctly
await zha_group.async_add_members([device_light_2.ieee])
await dev2_cluster_on_off.on()
assert hass.states.get(entity_id).state == STATE_ON
# remove the group and ensure that there is no entity and that the entity registry is cleaned up # remove the group and ensure that there is no entity and that the entity registry is cleaned up
assert zha_gateway.ha_entity_registry.async_get(entity_id) is not None assert zha_gateway.ha_entity_registry.async_get(entity_id) is not None
await zha_gateway.async_remove_zigpy_group(zha_group.group_id) await zha_gateway.async_remove_zigpy_group(zha_group.group_id)