lifx-async 4.7.3__py3-none-any.whl → 4.7.4__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
lifx/devices/ceiling.py CHANGED
@@ -201,9 +201,15 @@ class CeilingLight(MatrixLight):
201
201
  """
202
202
  matrix_state = await super()._initialize_state()
203
203
 
204
- # Get ceiling component colors
205
- uplight_color = await self.get_uplight_color()
206
- downlight_colors = await self.get_downlight_colors()
204
+ # Extract ceiling component colors from already-fetched tile_colors
205
+ # (parent _initialize_state already called get_all_tile_colors)
206
+ tile_colors = matrix_state.tile_colors
207
+ uplight_color = tile_colors[self.uplight_zone]
208
+ downlight_colors = list(tile_colors[self.downlight_zones])
209
+
210
+ # Cache for is_on properties
211
+ self._last_uplight_color = uplight_color
212
+ self._last_downlight_colors = downlight_colors
207
213
 
208
214
  # Create ceiling state from matrix state
209
215
  ceiling_state = CeilingLightState.from_matrix_state(
@@ -231,9 +237,15 @@ class CeilingLight(MatrixLight):
231
237
  """
232
238
  await super().refresh_state()
233
239
 
234
- # Get ceiling component colors
235
- uplight_color = await self.get_uplight_color()
236
- downlight_colors = await self.get_downlight_colors()
240
+ # Extract ceiling component colors from already-fetched tile_colors
241
+ # (parent refresh_state already called get_all_tile_colors)
242
+ tile_colors = self._state.tile_colors
243
+ uplight_color = tile_colors[self.uplight_zone]
244
+ downlight_colors = list(tile_colors[self.downlight_zones])
245
+
246
+ # Cache for is_on properties
247
+ self._last_uplight_color = uplight_color
248
+ self._last_downlight_colors = downlight_colors
237
249
 
238
250
  # Update ceiling-specific state fields
239
251
  state = cast(CeilingLightState, self._state)
@@ -522,6 +534,10 @@ class CeilingLight(MatrixLight):
522
534
  ) -> None:
523
535
  """Turn uplight component on.
524
536
 
537
+ If the entire light is off, this will set the color instantly and then
538
+ turn on the light with the specified duration, so the light fades to
539
+ the target color instead of flashing to its previous state.
540
+
525
541
  Args:
526
542
  color: Optional HSBK color. If provided:
527
543
  - Uses this color immediately
@@ -533,14 +549,61 @@ class CeilingLight(MatrixLight):
533
549
  ValueError: If color.brightness == 0
534
550
  LifxTimeoutError: Device did not respond
535
551
  """
536
- if color is not None:
537
- if color.brightness == 0:
538
- raise ValueError("Cannot turn on uplight with brightness=0")
539
- await self.set_uplight_color(color, duration)
552
+ # Validate provided color early
553
+ if color is not None and color.brightness == 0:
554
+ raise ValueError("Cannot turn on uplight with brightness=0")
555
+
556
+ # Check if light is off first to determine which path to take
557
+ if await self.get_power() == 0:
558
+ # Light is off - single fetch for both determining color and modification
559
+ all_colors = await self.get_all_tile_colors()
560
+ tile_colors = all_colors[0]
561
+
562
+ # Determine target color (pass pre-fetched colors to avoid extra fetch)
563
+ if color is not None:
564
+ target_color = color
565
+ else:
566
+ target_color = await self._determine_uplight_brightness(tile_colors)
567
+
568
+ # Store current downlight colors BEFORE zeroing them out
569
+ # This allows turn_downlight_on() to restore them later
570
+ downlight_colors = tile_colors[self.downlight_zones]
571
+ self._stored_downlight_state = list(downlight_colors)
572
+
573
+ # Set uplight zone to target color
574
+ tile_colors[self.uplight_zone] = target_color
575
+
576
+ # Zero out downlight zones so they stay off when power turns on
577
+ for i in range(*self.downlight_zones.indices(len(tile_colors))):
578
+ tile_colors[i] = HSBK(
579
+ hue=tile_colors[i].hue,
580
+ saturation=tile_colors[i].saturation,
581
+ brightness=0.0,
582
+ kelvin=tile_colors[i].kelvin,
583
+ )
584
+
585
+ # Set all colors instantly (duration=0) while light is off
586
+ await self.set_matrix_colors(0, tile_colors, duration=0)
587
+
588
+ # Update stored state for uplight
589
+ self._stored_uplight_state = target_color
590
+ self._last_uplight_color = target_color
591
+
592
+ # Turn on with the requested duration - light fades on to target color
593
+ await super().set_power(True, duration)
594
+
595
+ # Persist AFTER device operations complete
596
+ if self._state_file:
597
+ self._save_state_to_file()
540
598
  else:
541
- # Determine color using priority logic
542
- determined_color = await self._determine_uplight_brightness()
543
- await self.set_uplight_color(determined_color, duration)
599
+ # Light is already on - determine target color first, then set
600
+ if color is not None:
601
+ target_color = color
602
+ else:
603
+ target_color = await self._determine_uplight_brightness()
604
+
605
+ # set_uplight_color will fetch and modify (single fetch in that method)
606
+ await self.set_uplight_color(target_color, duration)
544
607
 
545
608
  async def turn_uplight_off(
546
609
  self, color: HSBK | None = None, duration: float = 0.0
@@ -560,30 +623,35 @@ class CeilingLight(MatrixLight):
560
623
  Note:
561
624
  Sets uplight zone brightness to 0 on device while preserving H, S, K.
562
625
  """
626
+ if color is not None and color.brightness == 0:
627
+ raise ValueError(
628
+ "Provided color cannot have brightness=0. "
629
+ "Omit the parameter to use current color."
630
+ )
631
+
632
+ # Fetch current state once and reuse to calculate brightness
633
+ all_colors = await self.get_all_tile_colors()
634
+ tile_colors = all_colors[0]
635
+
636
+ # Determine which color to store
563
637
  if color is not None:
564
- if color.brightness == 0:
565
- raise ValueError(
566
- "Provided color cannot have brightness=0. "
567
- "Omit the parameter to use current color."
568
- )
569
- # Store the provided color
570
- self._stored_uplight_state = color
638
+ stored_color = color
571
639
  else:
572
- # Get and store current color
573
- current_color = await self.get_uplight_color()
574
- self._stored_uplight_state = current_color
640
+ stored_color = tile_colors[self.uplight_zone]
641
+ self._last_uplight_color = stored_color
642
+
643
+ # Store for future restoration
644
+ self._stored_uplight_state = stored_color
575
645
 
576
646
  # Create color with brightness=0 for device
577
647
  off_color = HSBK(
578
- hue=self._stored_uplight_state.hue,
579
- saturation=self._stored_uplight_state.saturation,
648
+ hue=stored_color.hue,
649
+ saturation=stored_color.saturation,
580
650
  brightness=0.0,
581
- kelvin=self._stored_uplight_state.kelvin,
651
+ kelvin=stored_color.kelvin,
582
652
  )
583
653
 
584
- # Get all colors and update uplight zone
585
- all_colors = await self.get_all_tile_colors()
586
- tile_colors = all_colors[0]
654
+ # Update uplight zone and send immediately
587
655
  tile_colors[self.uplight_zone] = off_color
588
656
  await self.set_matrix_colors(0, tile_colors, duration=int(duration * 1000))
589
657
 
@@ -599,6 +667,10 @@ class CeilingLight(MatrixLight):
599
667
  ) -> None:
600
668
  """Turn downlight component on.
601
669
 
670
+ If the entire light is off, this will set the colors instantly and then
671
+ turn on the light with the specified duration, so the light fades to
672
+ the target colors instead of flashing to its previous state.
673
+
602
674
  Args:
603
675
  colors: Optional colors. Can be:
604
676
  - None: uses brightness determination logic
@@ -612,12 +684,80 @@ class CeilingLight(MatrixLight):
612
684
  ValueError: If list length doesn't match downlight zone count
613
685
  LifxTimeoutError: Device did not respond
614
686
  """
687
+ # Number of downlight zones equals the uplight zone index
688
+ # (downlight is zones 0 to uplight_zone-1)
689
+ downlight_zone_count = self.uplight_zone
690
+
691
+ # Validate provided colors early
615
692
  if colors is not None:
616
- await self.set_downlight_colors(colors, duration)
693
+ if isinstance(colors, HSBK):
694
+ if colors.brightness == 0:
695
+ raise ValueError("Cannot turn on downlight with brightness=0")
696
+ else:
697
+ if all(c.brightness == 0 for c in colors):
698
+ raise ValueError("Cannot turn on downlight with brightness=0")
699
+ if len(colors) != downlight_zone_count:
700
+ raise ValueError(
701
+ f"Expected {downlight_zone_count} colors for downlight, "
702
+ f"got {len(colors)}"
703
+ )
704
+
705
+ # Check if light is off first to determine which path to take
706
+ if await self.get_power() == 0:
707
+ # Light is off - single fetch for both determining colors and modification
708
+ all_colors = await self.get_all_tile_colors()
709
+ tile_colors = all_colors[0]
710
+
711
+ # Determine target colors (pass pre-fetched colors to avoid extra fetch)
712
+ if colors is not None:
713
+ if isinstance(colors, HSBK):
714
+ target_colors = [colors] * downlight_zone_count
715
+ else:
716
+ target_colors = list(colors)
717
+ else:
718
+ target_colors = await self._determine_downlight_brightness(tile_colors)
719
+
720
+ # Store current uplight color BEFORE zeroing it out
721
+ # This allows turn_uplight_on() to restore it later
722
+ self._stored_uplight_state = tile_colors[self.uplight_zone]
723
+
724
+ # Set downlight zones to target colors
725
+ tile_colors[self.downlight_zones] = target_colors
726
+
727
+ # Zero out uplight zone so it stays off when power turns on
728
+ uplight_color = tile_colors[self.uplight_zone]
729
+ tile_colors[self.uplight_zone] = HSBK(
730
+ hue=uplight_color.hue,
731
+ saturation=uplight_color.saturation,
732
+ brightness=0.0,
733
+ kelvin=uplight_color.kelvin,
734
+ )
735
+
736
+ # Set all colors instantly (duration=0) while light is off
737
+ await self.set_matrix_colors(0, tile_colors, duration=0)
738
+
739
+ # Update stored state for downlight
740
+ self._stored_downlight_state = target_colors
741
+ self._last_downlight_colors = target_colors
742
+
743
+ # Turn on with the requested duration - light fades on to target colors
744
+ await super().set_power(True, duration)
745
+
746
+ # Persist AFTER device operations complete
747
+ if self._state_file:
748
+ self._save_state_to_file()
617
749
  else:
618
- # Determine colors using priority logic
619
- determined_colors = await self._determine_downlight_brightness()
620
- await self.set_downlight_colors(determined_colors, duration)
750
+ # Light is already on - determine target colors first, then set
751
+ if colors is not None:
752
+ if isinstance(colors, HSBK):
753
+ target_colors = [colors] * downlight_zone_count
754
+ else:
755
+ target_colors = list(colors)
756
+ else:
757
+ target_colors = await self._determine_downlight_brightness()
758
+
759
+ # set_downlight_colors will fetch and modify (single fetch in that method)
760
+ await self.set_downlight_colors(target_colors, duration)
621
761
 
622
762
  async def set_power(self, level: bool | int, duration: float = 0.0) -> None:
623
763
  """Set light power state, capturing component colors before turning off.
@@ -663,21 +803,27 @@ class CeilingLight(MatrixLight):
663
803
  else:
664
804
  raise TypeError(f"Expected bool or int, got {type(level).__name__}")
665
805
 
666
- # If turning off, capture current colors for both components
806
+ # If turning off, capture current colors for both components with single fetch
667
807
  if turning_off:
668
- # Always capture colors - even if brightness is 0, the hue/sat/kelvin
669
- # are still useful for turn_on. Brightness will be determined at
670
- # turn-on time using the standard inference logic.
671
- self._stored_uplight_state = await self.get_uplight_color()
672
- self._stored_downlight_state = await self.get_downlight_colors()
808
+ # Single fetch to capture both uplight and downlight colors
809
+ all_colors = await self.get_all_tile_colors()
810
+ tile_colors = all_colors[0]
673
811
 
674
- # Persist if enabled
675
- if self._state_file:
676
- self._save_state_to_file()
812
+ # Extract and store both component colors
813
+ self._stored_uplight_state = tile_colors[self.uplight_zone]
814
+ self._stored_downlight_state = list(tile_colors[self.downlight_zones])
815
+
816
+ # Also update cache for is_on properties
817
+ self._last_uplight_color = self._stored_uplight_state
818
+ self._last_downlight_colors = self._stored_downlight_state
677
819
 
678
820
  # Call parent to perform actual power change
679
821
  await super().set_power(level, duration)
680
822
 
823
+ # Persist AFTER device operation completes
824
+ if turning_off and self._state_file:
825
+ self._save_state_to_file()
826
+
681
827
  async def turn_downlight_off(
682
828
  self, colors: HSBK | list[HSBK] | None = None, duration: float = 0.0
683
829
  ) -> None:
@@ -701,15 +847,16 @@ class CeilingLight(MatrixLight):
701
847
  """
702
848
  expected_count = len(range(*self.downlight_zones.indices(256)))
703
849
 
850
+ # Validate provided colors early (before fetching)
851
+ stored_colors: list[HSBK] | None = None
704
852
  if colors is not None:
705
- # Validate and normalize provided colors
706
853
  if isinstance(colors, HSBK):
707
854
  if colors.brightness == 0:
708
855
  raise ValueError(
709
856
  "Provided color cannot have brightness=0. "
710
857
  "Omit the parameter to use current colors."
711
858
  )
712
- colors_to_store = [colors] * expected_count
859
+ stored_colors = [colors] * expected_count
713
860
  else:
714
861
  if all(c.brightness == 0 for c in colors):
715
862
  raise ValueError(
@@ -721,13 +868,19 @@ class CeilingLight(MatrixLight):
721
868
  f"Expected {expected_count} colors for downlight, "
722
869
  f"got {len(colors)}"
723
870
  )
724
- colors_to_store = colors
871
+ stored_colors = list(colors)
725
872
 
726
- self._stored_downlight_state = colors_to_store
727
- else:
728
- # Get and store current colors
729
- current_colors = await self.get_downlight_colors()
730
- self._stored_downlight_state = current_colors
873
+ # Fetch current state once and reuse to calculate brightness
874
+ all_colors = await self.get_all_tile_colors()
875
+ tile_colors = all_colors[0]
876
+
877
+ # If colors not provided, extract from fetched data
878
+ if stored_colors is None:
879
+ stored_colors = list(tile_colors[self.downlight_zones])
880
+ self._last_downlight_colors = stored_colors
881
+
882
+ # Store for future restoration
883
+ self._stored_downlight_state = stored_colors
731
884
 
732
885
  # Create colors with brightness=0 for device
733
886
  off_colors = [
@@ -737,12 +890,10 @@ class CeilingLight(MatrixLight):
737
890
  brightness=0.0,
738
891
  kelvin=c.kelvin,
739
892
  )
740
- for c in self._stored_downlight_state
893
+ for c in stored_colors
741
894
  ]
742
895
 
743
- # Get all colors and update downlight zones
744
- all_colors = await self.get_all_tile_colors()
745
- tile_colors = all_colors[0]
896
+ # Update downlight zones and send immediately
746
897
  tile_colors[self.downlight_zones] = off_colors
747
898
  await self.set_matrix_colors(0, tile_colors, duration=int(duration * 1000))
748
899
 
@@ -753,89 +904,122 @@ class CeilingLight(MatrixLight):
753
904
  if self._state_file:
754
905
  self._save_state_to_file()
755
906
 
756
- async def _determine_uplight_brightness(self) -> HSBK:
907
+ async def _determine_uplight_brightness(
908
+ self, tile_colors: list[HSBK] | None = None
909
+ ) -> HSBK:
757
910
  """Determine uplight brightness using priority logic.
758
911
 
759
912
  Priority order:
760
- 1. Stored state (if available)
761
- 2. Infer from downlight average brightness
913
+ 1. Stored state (if available AND brightness > 0)
914
+ 2. Infer from downlight average brightness (using stored H, S, K if available)
762
915
  3. Hardcoded default (0.8)
763
916
 
917
+ Args:
918
+ tile_colors: Optional pre-fetched tile colors to avoid redundant fetch.
919
+ If None, will fetch from device.
920
+
764
921
  Returns:
765
922
  HSBK color for uplight
766
923
  """
767
- # 1. Stored state
768
- if self._stored_uplight_state is not None:
924
+ # 1. Stored state (only if brightness > 0)
925
+ if (
926
+ self._stored_uplight_state is not None
927
+ and self._stored_uplight_state.brightness > 0
928
+ ):
769
929
  return self._stored_uplight_state
770
930
 
771
- # Get current uplight color for H, S, K
772
- current_uplight = await self.get_uplight_color()
931
+ # Get current colors (use pre-fetched if available)
932
+ if tile_colors is None:
933
+ all_colors = await self.get_all_tile_colors()
934
+ tile_colors = all_colors[0]
935
+
936
+ current_uplight = tile_colors[self.uplight_zone]
937
+ downlight_colors = tile_colors[self.downlight_zones]
938
+
939
+ # Cache for is_on properties
940
+ self._last_uplight_color = current_uplight
941
+ self._last_downlight_colors = list(downlight_colors)
942
+
943
+ # Determine which color source to use for H, S, K
944
+ source_color = self._stored_uplight_state or current_uplight
773
945
 
774
946
  # 2. Infer from downlight average brightness
775
- try:
776
- downlight_colors = await self.get_downlight_colors()
777
- avg_brightness = sum(c.brightness for c in downlight_colors) / len(
778
- downlight_colors
779
- )
947
+ avg_brightness = sum(c.brightness for c in downlight_colors) / len(
948
+ downlight_colors
949
+ )
780
950
 
781
- # Only use inferred brightness if it's > 0
782
- # If all downlights are off (brightness=0), skip to default
783
- if avg_brightness > 0:
784
- return HSBK(
785
- hue=current_uplight.hue,
786
- saturation=current_uplight.saturation,
787
- brightness=avg_brightness,
788
- kelvin=current_uplight.kelvin,
789
- )
790
- except Exception: # nosec B110
791
- # If inference fails, fall through to default
792
- pass
951
+ # Only use inferred brightness if it's > 0
952
+ # If all downlights are off (brightness=0), skip to default
953
+ if avg_brightness > 0:
954
+ return HSBK(
955
+ hue=source_color.hue,
956
+ saturation=source_color.saturation,
957
+ brightness=avg_brightness,
958
+ kelvin=source_color.kelvin,
959
+ )
793
960
 
794
961
  # 3. Hardcoded default (0.8)
795
962
  return HSBK(
796
- hue=current_uplight.hue,
797
- saturation=current_uplight.saturation,
963
+ hue=source_color.hue,
964
+ saturation=source_color.saturation,
798
965
  brightness=0.8,
799
- kelvin=current_uplight.kelvin,
966
+ kelvin=source_color.kelvin,
800
967
  )
801
968
 
802
- async def _determine_downlight_brightness(self) -> list[HSBK]:
969
+ async def _determine_downlight_brightness(
970
+ self, tile_colors: list[HSBK] | None = None
971
+ ) -> list[HSBK]:
803
972
  """Determine downlight brightness using priority logic.
804
973
 
805
974
  Priority order:
806
- 1. Stored state (if available)
975
+ 1. Stored state (if available AND any brightness > 0)
807
976
  2. Infer from uplight brightness
808
977
  3. Hardcoded default (0.8)
809
978
 
979
+ Args:
980
+ tile_colors: Optional pre-fetched tile colors to avoid redundant fetch.
981
+ If None, will fetch from device.
982
+
810
983
  Returns:
811
984
  List of HSBK colors for downlight zones
812
985
  """
813
- # 1. Stored state
986
+ # 1. Stored state (only if any color has brightness > 0)
814
987
  if self._stored_downlight_state is not None:
815
- return self._stored_downlight_state
988
+ if any(c.brightness > 0 for c in self._stored_downlight_state):
989
+ return self._stored_downlight_state
816
990
 
817
- # Get current downlight colors for H, S, K
818
- current_downlight = await self.get_downlight_colors()
991
+ # Get current colors (use pre-fetched if available)
992
+ if tile_colors is None:
993
+ all_colors = await self.get_all_tile_colors()
994
+ tile_colors = all_colors[0]
819
995
 
820
- # 2. Infer from uplight brightness
821
- try:
822
- uplight_color = await self.get_uplight_color()
996
+ current_downlight = list(tile_colors[self.downlight_zones])
997
+ uplight_color = tile_colors[self.uplight_zone]
823
998
 
824
- # Only use inferred brightness if it's > 0
825
- # If uplight is off (brightness=0), skip to default
826
- if uplight_color.brightness > 0:
827
- return [
828
- HSBK(
829
- hue=c.hue,
830
- saturation=c.saturation,
831
- brightness=uplight_color.brightness,
832
- kelvin=c.kelvin,
833
- )
834
- for c in current_downlight
835
- ]
836
- except Exception: # nosec B110
837
- # If inference fails, fall through to default
838
- pass
999
+ # Cache for is_on properties
1000
+ self._last_downlight_colors = current_downlight
1001
+ self._last_uplight_color = uplight_color
1002
+
1003
+ # Prefer stored H, S, K if available, otherwise use current
1004
+ source_colors: list[HSBK] = (
1005
+ self._stored_downlight_state
1006
+ if self._stored_downlight_state is not None
1007
+ else current_downlight
1008
+ )
1009
+
1010
+ # 2. Infer from uplight brightness
1011
+ # Only use inferred brightness if it's > 0
1012
+ # If uplight is off (brightness=0), skip to default
1013
+ if uplight_color.brightness > 0:
1014
+ return [
1015
+ HSBK(
1016
+ hue=c.hue,
1017
+ saturation=c.saturation,
1018
+ brightness=uplight_color.brightness,
1019
+ kelvin=c.kelvin,
1020
+ )
1021
+ for c in source_colors
1022
+ ]
839
1023
 
840
1024
  # 3. Hardcoded default (0.8)
841
1025
  return [
@@ -845,7 +1029,7 @@ class CeilingLight(MatrixLight):
845
1029
  brightness=0.8,
846
1030
  kelvin=c.kelvin,
847
1031
  )
848
- for c in current_downlight
1032
+ for c in source_colors
849
1033
  ]
850
1034
 
851
1035
  def _is_stored_state_valid(
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: lifx-async
3
- Version: 4.7.3
3
+ Version: 4.7.4
4
4
  Summary: A modern, type-safe, async Python library for controlling LIFX lights
5
5
  Author-email: Avi Miller <me@dje.li>
6
6
  Maintainer-email: Avi Miller <me@dje.li>
@@ -6,7 +6,7 @@ lifx/exceptions.py,sha256=pikAMppLn7gXyjiQVWM_tSvXKNh-g366nG_UWyqpHhc,815
6
6
  lifx/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
7
7
  lifx/devices/__init__.py,sha256=4b5QtO0EFWxIqN2lUYgM8uLjWyHI5hUcReiF9QCjCGw,1061
8
8
  lifx/devices/base.py,sha256=0G2PCJRNeIPkMCIw68x0ijn6gUIwh2jFlex8SN4Hs1Y,63530
9
- lifx/devices/ceiling.py,sha256=q1aVqnYA0C32-c2J6GaYriaqgam9pKkSvV8IVVsIOf0,35661
9
+ lifx/devices/ceiling.py,sha256=vZSa8lGnfMx0jydQ5NzScpHOa36qfDLcFCuDdluSzoI,43561
10
10
  lifx/devices/hev.py,sha256=T5hvt2q_vdgPBvThx_-M7n5pZu9pL0y9Fs3Zz_KL0NM,15588
11
11
  lifx/devices/infrared.py,sha256=ePk9qxX_s-hv5gQMvio1Vv8FYiCd68HF0ySbWgSrvuU,8130
12
12
  lifx/devices/light.py,sha256=gk92lhViUWINGaxDWbs4qn8Stnn2fGCfRkC5Kk0Q-hI,34087
@@ -42,7 +42,7 @@ lifx/theme/canvas.py,sha256=4h7lgN8iu_OdchObGDgbxTqQLCb-FRKC-M-YCWef_i4,8048
42
42
  lifx/theme/generators.py,sha256=nq3Yvntq_h-eFHbmmow3LcAdA_hEbRRaP5mv9Bydrjk,6435
43
43
  lifx/theme/library.py,sha256=tKlKZNqJp8lRGDnilWyDm_Qr1vCRGGwuvWVS82anNpQ,21326
44
44
  lifx/theme/theme.py,sha256=qMEx_8E41C0Cc6f083XHiAXEglTv4YlXW0UFsG1rQKg,5521
45
- lifx_async-4.7.3.dist-info/METADATA,sha256=SruPlVJQdCTtWKsJHzQDYpgJooaDxgfP2KiVF1XyPZY,2609
46
- lifx_async-4.7.3.dist-info/WHEEL,sha256=WLgqFyCfm_KASv4WHyYy0P3pM_m7J5L9k2skdKLirC8,87
47
- lifx_async-4.7.3.dist-info/licenses/LICENSE,sha256=eBz48GRA3gSiWn3rYZAz2Ewp35snnhV9cSqkVBq7g3k,1832
48
- lifx_async-4.7.3.dist-info/RECORD,,
45
+ lifx_async-4.7.4.dist-info/METADATA,sha256=_6x0DE2d2jxv73tU9U0UtYnwmNIsTr1tuqxMg9pHzJc,2609
46
+ lifx_async-4.7.4.dist-info/WHEEL,sha256=WLgqFyCfm_KASv4WHyYy0P3pM_m7J5L9k2skdKLirC8,87
47
+ lifx_async-4.7.4.dist-info/licenses/LICENSE,sha256=eBz48GRA3gSiWn3rYZAz2Ewp35snnhV9cSqkVBq7g3k,1832
48
+ lifx_async-4.7.4.dist-info/RECORD,,