LIFX: improve performance of setting multi-zone lights to a single color (#9526)

With this optimization we can send a single UDP packet to the light rather
than one packet per zone (up to 80 packets for LIFX Z). This removes a
potential multi-second latency on the frontend color picker.
This commit is contained in:
Anders Melchiorsen 2017-09-21 23:32:31 +02:00 committed by GitHub
parent 5fd9220812
commit d978d58436

View File

@ -642,6 +642,18 @@ class LIFXStrip(LIFXColor):
bulb = self.device
num_zones = len(bulb.color_zones)
zones = kwargs.get(ATTR_ZONES)
if zones is None:
# Fast track: setting all zones to the same brightness and color
# can be treated as a single-zone bulb.
if hsbk[2] is not None and hsbk[3] is not None:
yield from super().set_color(ack, hsbk, kwargs, duration)
return
zones = list(range(0, num_zones))
else:
zones = list(filter(lambda x: x < num_zones, set(zones)))
# Zone brightness is not reported when powered off
if not self.is_on and hsbk[2] is None:
yield from self.set_power(ack, True)
@ -650,12 +662,6 @@ class LIFXStrip(LIFXColor):
yield from self.set_power(ack, False)
yield from asyncio.sleep(0.3)
zones = kwargs.get(ATTR_ZONES, None)
if zones is None:
zones = list(range(0, num_zones))
else:
zones = list(filter(lambda x: x < num_zones, set(zones)))
# Send new color to each zone
for index, zone in enumerate(zones):
zone_hsbk = merge_hsbk(bulb.color_zones[zone], hsbk)