mirror of
https://github.com/home-assistant/core.git
synced 2025-04-27 10:47:51 +00:00
Fix lifx light strips when color zones are not initially populated (#92487)
fixes #92456
This commit is contained in:
parent
8a9b9c35e0
commit
9b74cb9507
@ -205,13 +205,20 @@ class LIFXUpdateCoordinator(DataUpdateCoordinator[None]):
|
|||||||
methods, DEFAULT_ATTEMPTS, OVERALL_TIMEOUT
|
methods, DEFAULT_ATTEMPTS, OVERALL_TIMEOUT
|
||||||
)
|
)
|
||||||
|
|
||||||
|
def get_number_of_zones(self) -> int:
|
||||||
|
"""Return the number of zones.
|
||||||
|
|
||||||
|
If the number of zones is not yet populated, return 0
|
||||||
|
"""
|
||||||
|
return len(self.device.color_zones) if self.device.color_zones else 0
|
||||||
|
|
||||||
@callback
|
@callback
|
||||||
def _async_build_color_zones_update_requests(self) -> list[Callable]:
|
def _async_build_color_zones_update_requests(self) -> list[Callable]:
|
||||||
"""Build a color zones update request."""
|
"""Build a color zones update request."""
|
||||||
device = self.device
|
device = self.device
|
||||||
return [
|
return [
|
||||||
partial(device.get_color_zones, start_index=zone)
|
partial(device.get_color_zones, start_index=zone)
|
||||||
for zone in range(0, len(device.color_zones), 8)
|
for zone in range(0, self.get_number_of_zones(), 8)
|
||||||
]
|
]
|
||||||
|
|
||||||
async def _async_update_data(self) -> None:
|
async def _async_update_data(self) -> None:
|
||||||
@ -224,7 +231,7 @@ class LIFXUpdateCoordinator(DataUpdateCoordinator[None]):
|
|||||||
):
|
):
|
||||||
await self._async_populate_device_info()
|
await self._async_populate_device_info()
|
||||||
|
|
||||||
num_zones = len(device.color_zones) if device.color_zones is not None else 0
|
num_zones = self.get_number_of_zones()
|
||||||
features = lifx_features(self.device)
|
features = lifx_features(self.device)
|
||||||
is_extended_multizone = features["extended_multizone"]
|
is_extended_multizone = features["extended_multizone"]
|
||||||
is_legacy_multizone = not is_extended_multizone and features["multizone"]
|
is_legacy_multizone = not is_extended_multizone and features["multizone"]
|
||||||
@ -256,7 +263,7 @@ class LIFXUpdateCoordinator(DataUpdateCoordinator[None]):
|
|||||||
|
|
||||||
if is_extended_multizone or is_legacy_multizone:
|
if is_extended_multizone or is_legacy_multizone:
|
||||||
self.active_effect = FirmwareEffect[self.device.effect.get("effect", "OFF")]
|
self.active_effect = FirmwareEffect[self.device.effect.get("effect", "OFF")]
|
||||||
if is_legacy_multizone and num_zones != len(device.color_zones):
|
if is_legacy_multizone and num_zones != self.get_number_of_zones():
|
||||||
# The number of zones has changed so we need
|
# The number of zones has changed so we need
|
||||||
# to update the zones again. This happens rarely.
|
# to update the zones again. This happens rarely.
|
||||||
await self.async_get_color_zones()
|
await self.async_get_color_zones()
|
||||||
|
@ -391,7 +391,7 @@ class LIFXMultiZone(LIFXColor):
|
|||||||
"""Send a color change to the bulb."""
|
"""Send a color change to the bulb."""
|
||||||
bulb = self.bulb
|
bulb = self.bulb
|
||||||
color_zones = bulb.color_zones
|
color_zones = bulb.color_zones
|
||||||
num_zones = len(color_zones)
|
num_zones = self.coordinator.get_number_of_zones()
|
||||||
|
|
||||||
# Zone brightness is not reported when powered off
|
# Zone brightness is not reported when powered off
|
||||||
if not self.is_on and hsbk[HSBK_BRIGHTNESS] is None:
|
if not self.is_on and hsbk[HSBK_BRIGHTNESS] is None:
|
||||||
|
@ -36,6 +36,7 @@ from homeassistant.components.light import (
|
|||||||
ATTR_TRANSITION,
|
ATTR_TRANSITION,
|
||||||
ATTR_XY_COLOR,
|
ATTR_XY_COLOR,
|
||||||
DOMAIN as LIGHT_DOMAIN,
|
DOMAIN as LIGHT_DOMAIN,
|
||||||
|
SERVICE_TURN_ON,
|
||||||
ColorMode,
|
ColorMode,
|
||||||
)
|
)
|
||||||
from homeassistant.const import (
|
from homeassistant.const import (
|
||||||
@ -1741,3 +1742,46 @@ async def test_set_hev_cycle_state_fails_for_color_bulb(hass: HomeAssistant) ->
|
|||||||
{ATTR_ENTITY_ID: entity_id, ATTR_POWER: True},
|
{ATTR_ENTITY_ID: entity_id, ATTR_POWER: True},
|
||||||
blocking=True,
|
blocking=True,
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
||||||
|
async def test_light_strip_zones_not_populated_yet(hass: HomeAssistant) -> None:
|
||||||
|
"""Test a light strip were zones are not populated initially."""
|
||||||
|
already_migrated_config_entry = MockConfigEntry(
|
||||||
|
domain=DOMAIN, data={CONF_HOST: "127.0.0.1"}, unique_id=SERIAL
|
||||||
|
)
|
||||||
|
already_migrated_config_entry.add_to_hass(hass)
|
||||||
|
bulb = _mocked_light_strip()
|
||||||
|
bulb.power_level = 65535
|
||||||
|
bulb.color_zones = None
|
||||||
|
bulb.color = [65535, 65535, 65535, 65535]
|
||||||
|
with _patch_discovery(device=bulb), _patch_config_flow_try_connect(
|
||||||
|
device=bulb
|
||||||
|
), _patch_device(device=bulb):
|
||||||
|
await async_setup_component(hass, lifx.DOMAIN, {lifx.DOMAIN: {}})
|
||||||
|
await hass.async_block_till_done()
|
||||||
|
|
||||||
|
entity_id = "light.my_bulb"
|
||||||
|
|
||||||
|
state = hass.states.get(entity_id)
|
||||||
|
assert state.state == "on"
|
||||||
|
attributes = state.attributes
|
||||||
|
assert attributes[ATTR_BRIGHTNESS] == 255
|
||||||
|
assert attributes[ATTR_COLOR_MODE] == ColorMode.HS
|
||||||
|
assert attributes[ATTR_SUPPORTED_COLOR_MODES] == [
|
||||||
|
ColorMode.COLOR_TEMP,
|
||||||
|
ColorMode.HS,
|
||||||
|
]
|
||||||
|
assert attributes[ATTR_HS_COLOR] == (360.0, 100.0)
|
||||||
|
assert attributes[ATTR_RGB_COLOR] == (255, 0, 0)
|
||||||
|
assert attributes[ATTR_XY_COLOR] == (0.701, 0.299)
|
||||||
|
|
||||||
|
await hass.services.async_call(
|
||||||
|
LIGHT_DOMAIN, SERVICE_TURN_ON, {ATTR_ENTITY_ID: entity_id}, blocking=True
|
||||||
|
)
|
||||||
|
assert bulb.set_power.calls[0][0][0] is True
|
||||||
|
bulb.set_power.reset_mock()
|
||||||
|
|
||||||
|
async_fire_time_changed(hass, dt_util.utcnow() + timedelta(seconds=30))
|
||||||
|
await hass.async_block_till_done()
|
||||||
|
state = hass.states.get(entity_id)
|
||||||
|
assert state.state == STATE_ON
|
||||||
|
Loading…
x
Reference in New Issue
Block a user