lifx-async 4.4.0__tar.gz → 4.5.0__tar.gz

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.
Files changed (154) hide show
  1. {lifx_async-4.4.0 → lifx_async-4.5.0}/.github/workflows/ci.yml +4 -4
  2. {lifx_async-4.4.0 → lifx_async-4.5.0}/.github/workflows/docs.yml +3 -3
  3. {lifx_async-4.4.0 → lifx_async-4.5.0}/PKG-INFO +1 -1
  4. lifx_async-4.5.0/context7.json +4 -0
  5. {lifx_async-4.4.0 → lifx_async-4.5.0}/docs/changelog.md +16 -0
  6. {lifx_async-4.4.0 → lifx_async-4.5.0}/examples/12_matrix_effects.py +16 -16
  7. {lifx_async-4.4.0 → lifx_async-4.5.0}/pyproject.toml +1 -1
  8. {lifx_async-4.4.0 → lifx_async-4.5.0}/src/lifx/devices/__init__.py +2 -0
  9. lifx_async-4.5.0/src/lifx/devices/ceiling.py +784 -0
  10. {lifx_async-4.4.0 → lifx_async-4.5.0}/src/lifx/devices/matrix.py +96 -21
  11. {lifx_async-4.4.0 → lifx_async-4.5.0}/src/lifx/network/discovery.py +10 -2
  12. {lifx_async-4.4.0 → lifx_async-4.5.0}/src/lifx/products/__init__.py +8 -0
  13. lifx_async-4.5.0/src/lifx/products/quirks.py +91 -0
  14. {lifx_async-4.4.0 → lifx_async-4.5.0}/src/lifx/theme/generators.py +8 -2
  15. {lifx_async-4.4.0 → lifx_async-4.5.0}/tests/conftest.py +5 -3
  16. lifx_async-4.5.0/tests/test_devices/test_ceiling.py +905 -0
  17. {lifx_async-4.4.0 → lifx_async-4.5.0}/tests/test_devices/test_state_matrix.py +29 -0
  18. {lifx_async-4.4.0 → lifx_async-4.5.0}/tests/test_theme/test_generators.py +100 -0
  19. {lifx_async-4.4.0 → lifx_async-4.5.0}/uv.lock +178 -184
  20. {lifx_async-4.4.0 → lifx_async-4.5.0}/.claude/settings.json +0 -0
  21. {lifx_async-4.4.0 → lifx_async-4.5.0}/.github/dependabot.yml +0 -0
  22. {lifx_async-4.4.0 → lifx_async-4.5.0}/.github/labeler.yml +0 -0
  23. {lifx_async-4.4.0 → lifx_async-4.5.0}/.github/workflows/pr-automation.yml +0 -0
  24. {lifx_async-4.4.0 → lifx_async-4.5.0}/.gitignore +0 -0
  25. {lifx_async-4.4.0 → lifx_async-4.5.0}/.pre-commit-config.yaml +0 -0
  26. {lifx_async-4.4.0 → lifx_async-4.5.0}/CLAUDE.md +0 -0
  27. {lifx_async-4.4.0 → lifx_async-4.5.0}/LICENSE +0 -0
  28. {lifx_async-4.4.0 → lifx_async-4.5.0}/README.md +0 -0
  29. {lifx_async-4.4.0 → lifx_async-4.5.0}/docs/api/colors.md +0 -0
  30. {lifx_async-4.4.0 → lifx_async-4.5.0}/docs/api/devices.md +0 -0
  31. {lifx_async-4.4.0 → lifx_async-4.5.0}/docs/api/effects.md +0 -0
  32. {lifx_async-4.4.0 → lifx_async-4.5.0}/docs/api/exceptions.md +0 -0
  33. {lifx_async-4.4.0 → lifx_async-4.5.0}/docs/api/high-level.md +0 -0
  34. {lifx_async-4.4.0 → lifx_async-4.5.0}/docs/api/index.md +0 -0
  35. {lifx_async-4.4.0 → lifx_async-4.5.0}/docs/api/network.md +0 -0
  36. {lifx_async-4.4.0 → lifx_async-4.5.0}/docs/api/protocol.md +0 -0
  37. {lifx_async-4.4.0 → lifx_async-4.5.0}/docs/api/themes.md +0 -0
  38. {lifx_async-4.4.0 → lifx_async-4.5.0}/docs/architecture/effects-architecture.md +0 -0
  39. {lifx_async-4.4.0 → lifx_async-4.5.0}/docs/architecture/overview.md +0 -0
  40. {lifx_async-4.4.0 → lifx_async-4.5.0}/docs/faq.md +0 -0
  41. {lifx_async-4.4.0 → lifx_async-4.5.0}/docs/getting-started/effects.md +0 -0
  42. {lifx_async-4.4.0 → lifx_async-4.5.0}/docs/getting-started/installation.md +0 -0
  43. {lifx_async-4.4.0 → lifx_async-4.5.0}/docs/getting-started/quickstart.md +0 -0
  44. {lifx_async-4.4.0 → lifx_async-4.5.0}/docs/getting-started/themes.md +0 -0
  45. {lifx_async-4.4.0 → lifx_async-4.5.0}/docs/index.md +0 -0
  46. {lifx_async-4.4.0 → lifx_async-4.5.0}/docs/migration/effect-api-changes.md +0 -0
  47. {lifx_async-4.4.0 → lifx_async-4.5.0}/docs/stylesheets/extra.css +0 -0
  48. {lifx_async-4.4.0 → lifx_async-4.5.0}/docs/user-guide/advanced-usage.md +0 -0
  49. {lifx_async-4.4.0 → lifx_async-4.5.0}/docs/user-guide/effects-custom.md +0 -0
  50. {lifx_async-4.4.0 → lifx_async-4.5.0}/docs/user-guide/effects-troubleshooting.md +0 -0
  51. {lifx_async-4.4.0 → lifx_async-4.5.0}/docs/user-guide/protocol-deep-dive.md +0 -0
  52. {lifx_async-4.4.0 → lifx_async-4.5.0}/docs/user-guide/themes.md +0 -0
  53. {lifx_async-4.4.0 → lifx_async-4.5.0}/docs/user-guide/troubleshooting.md +0 -0
  54. {lifx_async-4.4.0 → lifx_async-4.5.0}/examples/01_simple_discovery.py +0 -0
  55. {lifx_async-4.4.0 → lifx_async-4.5.0}/examples/02_simple_control.py +0 -0
  56. {lifx_async-4.4.0 → lifx_async-4.5.0}/examples/03_waveforms.py +0 -0
  57. {lifx_async-4.4.0 → lifx_async-4.5.0}/examples/04_logging.py +0 -0
  58. {lifx_async-4.4.0 → lifx_async-4.5.0}/examples/06_pulse_effect.py +0 -0
  59. {lifx_async-4.4.0 → lifx_async-4.5.0}/examples/07_colorloop_effect.py +0 -0
  60. {lifx_async-4.4.0 → lifx_async-4.5.0}/examples/08_custom_effect.py +0 -0
  61. {lifx_async-4.4.0 → lifx_async-4.5.0}/examples/09_background_effect.py +0 -0
  62. {lifx_async-4.4.0 → lifx_async-4.5.0}/examples/10_find_specific_devices.py +0 -0
  63. {lifx_async-4.4.0 → lifx_async-4.5.0}/examples/11_matrix_basic.py +0 -0
  64. {lifx_async-4.4.0 → lifx_async-4.5.0}/examples/13_matrix_large.py +0 -0
  65. {lifx_async-4.4.0 → lifx_async-4.5.0}/mkdocs.yml +0 -0
  66. {lifx_async-4.4.0 → lifx_async-4.5.0}/renovate.json +0 -0
  67. {lifx_async-4.4.0 → lifx_async-4.5.0}/src/lifx/__init__.py +0 -0
  68. {lifx_async-4.4.0 → lifx_async-4.5.0}/src/lifx/api.py +0 -0
  69. {lifx_async-4.4.0 → lifx_async-4.5.0}/src/lifx/color.py +0 -0
  70. {lifx_async-4.4.0 → lifx_async-4.5.0}/src/lifx/const.py +0 -0
  71. {lifx_async-4.4.0 → lifx_async-4.5.0}/src/lifx/devices/base.py +0 -0
  72. {lifx_async-4.4.0 → lifx_async-4.5.0}/src/lifx/devices/hev.py +0 -0
  73. {lifx_async-4.4.0 → lifx_async-4.5.0}/src/lifx/devices/infrared.py +0 -0
  74. {lifx_async-4.4.0 → lifx_async-4.5.0}/src/lifx/devices/light.py +0 -0
  75. {lifx_async-4.4.0 → lifx_async-4.5.0}/src/lifx/devices/multizone.py +0 -0
  76. {lifx_async-4.4.0 → lifx_async-4.5.0}/src/lifx/effects/__init__.py +0 -0
  77. {lifx_async-4.4.0 → lifx_async-4.5.0}/src/lifx/effects/base.py +0 -0
  78. {lifx_async-4.4.0 → lifx_async-4.5.0}/src/lifx/effects/colorloop.py +0 -0
  79. {lifx_async-4.4.0 → lifx_async-4.5.0}/src/lifx/effects/conductor.py +0 -0
  80. {lifx_async-4.4.0 → lifx_async-4.5.0}/src/lifx/effects/const.py +0 -0
  81. {lifx_async-4.4.0 → lifx_async-4.5.0}/src/lifx/effects/models.py +0 -0
  82. {lifx_async-4.4.0 → lifx_async-4.5.0}/src/lifx/effects/pulse.py +0 -0
  83. {lifx_async-4.4.0 → lifx_async-4.5.0}/src/lifx/effects/state_manager.py +0 -0
  84. {lifx_async-4.4.0 → lifx_async-4.5.0}/src/lifx/exceptions.py +0 -0
  85. {lifx_async-4.4.0 → lifx_async-4.5.0}/src/lifx/network/__init__.py +0 -0
  86. {lifx_async-4.4.0 → lifx_async-4.5.0}/src/lifx/network/connection.py +0 -0
  87. {lifx_async-4.4.0 → lifx_async-4.5.0}/src/lifx/network/message.py +0 -0
  88. {lifx_async-4.4.0 → lifx_async-4.5.0}/src/lifx/network/transport.py +0 -0
  89. {lifx_async-4.4.0 → lifx_async-4.5.0}/src/lifx/products/generator.py +0 -0
  90. {lifx_async-4.4.0 → lifx_async-4.5.0}/src/lifx/products/registry.py +0 -0
  91. {lifx_async-4.4.0 → lifx_async-4.5.0}/src/lifx/protocol/__init__.py +0 -0
  92. {lifx_async-4.4.0 → lifx_async-4.5.0}/src/lifx/protocol/base.py +0 -0
  93. {lifx_async-4.4.0 → lifx_async-4.5.0}/src/lifx/protocol/generator.py +0 -0
  94. {lifx_async-4.4.0 → lifx_async-4.5.0}/src/lifx/protocol/header.py +0 -0
  95. {lifx_async-4.4.0 → lifx_async-4.5.0}/src/lifx/protocol/models.py +0 -0
  96. {lifx_async-4.4.0 → lifx_async-4.5.0}/src/lifx/protocol/packets.py +0 -0
  97. {lifx_async-4.4.0 → lifx_async-4.5.0}/src/lifx/protocol/protocol_types.py +0 -0
  98. {lifx_async-4.4.0 → lifx_async-4.5.0}/src/lifx/protocol/serializer.py +0 -0
  99. {lifx_async-4.4.0 → lifx_async-4.5.0}/src/lifx/py.typed +0 -0
  100. {lifx_async-4.4.0 → lifx_async-4.5.0}/src/lifx/theme/__init__.py +0 -0
  101. {lifx_async-4.4.0 → lifx_async-4.5.0}/src/lifx/theme/canvas.py +0 -0
  102. {lifx_async-4.4.0 → lifx_async-4.5.0}/src/lifx/theme/library.py +0 -0
  103. {lifx_async-4.4.0 → lifx_async-4.5.0}/src/lifx/theme/theme.py +0 -0
  104. {lifx_async-4.4.0 → lifx_async-4.5.0}/tests/__init__.py +0 -0
  105. {lifx_async-4.4.0 → lifx_async-4.5.0}/tests/test_api/__init__.py +0 -0
  106. {lifx_async-4.4.0 → lifx_async-4.5.0}/tests/test_api/test_api_apply_theme.py +0 -0
  107. {lifx_async-4.4.0 → lifx_async-4.5.0}/tests/test_api/test_api_batch_errors.py +0 -0
  108. {lifx_async-4.4.0 → lifx_async-4.5.0}/tests/test_api/test_api_batch_operations.py +0 -0
  109. {lifx_async-4.4.0 → lifx_async-4.5.0}/tests/test_api/test_api_discovery.py +0 -0
  110. {lifx_async-4.4.0 → lifx_async-4.5.0}/tests/test_api/test_api_organization.py +0 -0
  111. {lifx_async-4.4.0 → lifx_async-4.5.0}/tests/test_color.py +0 -0
  112. {lifx_async-4.4.0 → lifx_async-4.5.0}/tests/test_devices/__init__.py +0 -0
  113. {lifx_async-4.4.0 → lifx_async-4.5.0}/tests/test_devices/conftest.py +0 -0
  114. {lifx_async-4.4.0 → lifx_async-4.5.0}/tests/test_devices/test_base.py +0 -0
  115. {lifx_async-4.4.0 → lifx_async-4.5.0}/tests/test_devices/test_hev.py +0 -0
  116. {lifx_async-4.4.0 → lifx_async-4.5.0}/tests/test_devices/test_infrared.py +0 -0
  117. {lifx_async-4.4.0 → lifx_async-4.5.0}/tests/test_devices/test_light.py +0 -0
  118. {lifx_async-4.4.0 → lifx_async-4.5.0}/tests/test_devices/test_mac_address.py +0 -0
  119. {lifx_async-4.4.0 → lifx_async-4.5.0}/tests/test_devices/test_matrix.py +0 -0
  120. {lifx_async-4.4.0 → lifx_async-4.5.0}/tests/test_devices/test_multizone.py +0 -0
  121. {lifx_async-4.4.0 → lifx_async-4.5.0}/tests/test_devices/test_state_hev.py +0 -0
  122. {lifx_async-4.4.0 → lifx_async-4.5.0}/tests/test_devices/test_state_infrared.py +0 -0
  123. {lifx_async-4.4.0 → lifx_async-4.5.0}/tests/test_devices/test_state_light.py +0 -0
  124. {lifx_async-4.4.0 → lifx_async-4.5.0}/tests/test_devices/test_state_management.py +0 -0
  125. {lifx_async-4.4.0 → lifx_async-4.5.0}/tests/test_devices/test_state_multizone.py +0 -0
  126. {lifx_async-4.4.0 → lifx_async-4.5.0}/tests/test_effects/__init__.py +0 -0
  127. {lifx_async-4.4.0 → lifx_async-4.5.0}/tests/test_effects/test_base.py +0 -0
  128. {lifx_async-4.4.0 → lifx_async-4.5.0}/tests/test_effects/test_capability_filtering.py +0 -0
  129. {lifx_async-4.4.0 → lifx_async-4.5.0}/tests/test_effects/test_colorloop.py +0 -0
  130. {lifx_async-4.4.0 → lifx_async-4.5.0}/tests/test_effects/test_integration.py +0 -0
  131. {lifx_async-4.4.0 → lifx_async-4.5.0}/tests/test_effects/test_models.py +0 -0
  132. {lifx_async-4.4.0 → lifx_async-4.5.0}/tests/test_effects/test_pulse.py +0 -0
  133. {lifx_async-4.4.0 → lifx_async-4.5.0}/tests/test_effects/test_state_manager.py +0 -0
  134. {lifx_async-4.4.0 → lifx_async-4.5.0}/tests/test_network/__init__.py +0 -0
  135. {lifx_async-4.4.0 → lifx_async-4.5.0}/tests/test_network/test_concurrent_requests.py +0 -0
  136. {lifx_async-4.4.0 → lifx_async-4.5.0}/tests/test_network/test_connection.py +0 -0
  137. {lifx_async-4.4.0 → lifx_async-4.5.0}/tests/test_network/test_discovery_devices.py +0 -0
  138. {lifx_async-4.4.0 → lifx_async-4.5.0}/tests/test_network/test_discovery_errors.py +0 -0
  139. {lifx_async-4.4.0 → lifx_async-4.5.0}/tests/test_network/test_message.py +0 -0
  140. {lifx_async-4.4.0 → lifx_async-4.5.0}/tests/test_network/test_message_advanced.py +0 -0
  141. {lifx_async-4.4.0 → lifx_async-4.5.0}/tests/test_network/test_transport.py +0 -0
  142. {lifx_async-4.4.0 → lifx_async-4.5.0}/tests/test_products/test_product_generator.py +0 -0
  143. {lifx_async-4.4.0 → lifx_async-4.5.0}/tests/test_products/test_registry.py +0 -0
  144. {lifx_async-4.4.0 → lifx_async-4.5.0}/tests/test_protocol/test_generated.py +0 -0
  145. {lifx_async-4.4.0 → lifx_async-4.5.0}/tests/test_protocol/test_header.py +0 -0
  146. {lifx_async-4.4.0 → lifx_async-4.5.0}/tests/test_protocol/test_protocol_generator.py +0 -0
  147. {lifx_async-4.4.0 → lifx_async-4.5.0}/tests/test_protocol/test_serializer.py +0 -0
  148. {lifx_async-4.4.0 → lifx_async-4.5.0}/tests/test_theme/__init__.py +0 -0
  149. {lifx_async-4.4.0 → lifx_async-4.5.0}/tests/test_theme/conftest.py +0 -0
  150. {lifx_async-4.4.0 → lifx_async-4.5.0}/tests/test_theme/test_apply_theme.py +0 -0
  151. {lifx_async-4.4.0 → lifx_async-4.5.0}/tests/test_theme/test_canvas.py +0 -0
  152. {lifx_async-4.4.0 → lifx_async-4.5.0}/tests/test_theme/test_library.py +0 -0
  153. {lifx_async-4.4.0 → lifx_async-4.5.0}/tests/test_theme/test_theme.py +0 -0
  154. {lifx_async-4.4.0 → lifx_async-4.5.0}/tests/test_utils.py +0 -0
@@ -32,7 +32,7 @@ jobs:
32
32
  name: Code Quality
33
33
  runs-on: ubuntu-latest
34
34
  steps:
35
- - uses: actions/checkout@1af3b93b6815bc44a9784bd300feb67ff0d1eeb3 # v6
35
+ - uses: actions/checkout@8e8c483db84b4bee98b60c0593521ed34d9990e8 # v6
36
36
 
37
37
  - name: Set up Python
38
38
  uses: actions/setup-python@83679a892e2d95755f2dac6acb0bfd1e9ac5d548 # v6
@@ -74,7 +74,7 @@ jobs:
74
74
  os: [ubuntu-latest, macos-latest, windows-latest]
75
75
  python-version: ['3.11', '3.12', '3.13', '3.14']
76
76
  steps:
77
- - uses: actions/checkout@1af3b93b6815bc44a9784bd300feb67ff0d1eeb3 # v6
77
+ - uses: actions/checkout@8e8c483db84b4bee98b60c0593521ed34d9990e8 # v6
78
78
 
79
79
  - name: Set up Python ${{ matrix.python-version }}
80
80
  uses: actions/setup-python@83679a892e2d95755f2dac6acb0bfd1e9ac5d548 # v6
@@ -126,7 +126,7 @@ jobs:
126
126
  if: github.event_name == 'push' && github.ref_name == 'main'
127
127
  runs-on: ubuntu-latest
128
128
  steps:
129
- - uses: actions/checkout@1af3b93b6815bc44a9784bd300feb67ff0d1eeb3 # v6
129
+ - uses: actions/checkout@8e8c483db84b4bee98b60c0593521ed34d9990e8 # v6
130
130
 
131
131
  - name: Set up Python
132
132
  uses: actions/setup-python@83679a892e2d95755f2dac6acb0bfd1e9ac5d548 # v6
@@ -186,7 +186,7 @@ jobs:
186
186
 
187
187
  steps:
188
188
  - name: Checkout repository on release branch
189
- uses: actions/checkout@1af3b93b6815bc44a9784bd300feb67ff0d1eeb3 # v6
189
+ uses: actions/checkout@8e8c483db84b4bee98b60c0593521ed34d9990e8 # v6
190
190
  with:
191
191
  ref: ${{ github.head_ref || github.ref_name }}
192
192
  fetch-depth: 0
@@ -25,7 +25,7 @@ jobs:
25
25
  build-docs:
26
26
  runs-on: ubuntu-latest
27
27
  steps:
28
- - uses: actions/checkout@1af3b93b6815bc44a9784bd300feb67ff0d1eeb3 # v6
28
+ - uses: actions/checkout@8e8c483db84b4bee98b60c0593521ed34d9990e8 # v6
29
29
  with:
30
30
  fetch-depth: 0 # Fetch all history for git-revision-date-localized
31
31
 
@@ -59,7 +59,7 @@ jobs:
59
59
  if: github.ref == 'refs/heads/main' && github.event_name == 'push'
60
60
  needs: build-docs
61
61
  steps:
62
- - uses: actions/checkout@1af3b93b6815bc44a9784bd300feb67ff0d1eeb3 # v6
62
+ - uses: actions/checkout@8e8c483db84b4bee98b60c0593521ed34d9990e8 # v6
63
63
  with:
64
64
  fetch-depth: 0
65
65
 
@@ -89,7 +89,7 @@ jobs:
89
89
  validate-links:
90
90
  runs-on: ubuntu-latest
91
91
  steps:
92
- - uses: actions/checkout@1af3b93b6815bc44a9784bd300feb67ff0d1eeb3 # v6
92
+ - uses: actions/checkout@8e8c483db84b4bee98b60c0593521ed34d9990e8 # v6
93
93
 
94
94
  - name: Set up Python
95
95
  uses: actions/setup-python@83679a892e2d95755f2dac6acb0bfd1e9ac5d548 # v6
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: lifx-async
3
- Version: 4.4.0
3
+ Version: 4.5.0
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>
@@ -0,0 +1,4 @@
1
+ {
2
+ "url": "https://context7.com/djelibeybi/lifx-async",
3
+ "public_key": "pk_dKDzLMm361DFRMYHHIKSR"
4
+ }
@@ -2,6 +2,22 @@
2
2
 
3
3
  <!-- version list -->
4
4
 
5
+ ## v4.5.0 (2025-12-08)
6
+
7
+ ### Features
8
+
9
+ - **devices**: Add CeilingLight with independent uplight/downlight component control
10
+ ([`95fc5a6`](https://github.com/Djelibeybi/lifx-async/commit/95fc5a68c598232f5c710ad5d67f3647ba89d720))
11
+
12
+
13
+ ## v4.4.1 (2025-12-03)
14
+
15
+ ### Bug Fixes
16
+
17
+ - **theme**: Prevent color displacement in multi-tile matrix theme application
18
+ ([`ca936ec`](https://github.com/Djelibeybi/lifx-async/commit/ca936ec8df84fc42803182ae9898d243e017c5a3))
19
+
20
+
5
21
  ## v4.4.0 (2025-11-29)
6
22
 
7
23
  ### Features
@@ -7,7 +7,7 @@ import argparse
7
7
  import asyncio
8
8
 
9
9
  from lifx import HSBK, Colors, MatrixLight
10
- from lifx.protocol.protocol_types import TileEffectSkyType, TileEffectType
10
+ from lifx.protocol.protocol_types import FirmwareEffect, TileEffectSkyType
11
11
 
12
12
 
13
13
  async def main(ip: str):
@@ -26,9 +26,9 @@ async def main(ip: str):
26
26
 
27
27
  # Get current effect state
28
28
  print("Getting current effect state...")
29
- current_effect = await matrix.get_tile_effect()
29
+ current_effect = await matrix.get_effect()
30
30
  print(f"Current effect: {current_effect.effect_type}")
31
- if current_effect.effect_type != TileEffectType.OFF:
31
+ if current_effect.effect_type != FirmwareEffect.OFF:
32
32
  print(f" Speed: {current_effect.speed}")
33
33
  print(f" Duration: {current_effect.duration}s")
34
34
  if current_effect.palette:
@@ -38,8 +38,8 @@ async def main(ip: str):
38
38
  # Demonstrate MORPH effect
39
39
  print("Starting MORPH effect...")
40
40
  print(" (smooth color transitions across tiles)")
41
- await matrix.set_tile_effect(
42
- effect_type=TileEffectType.MORPH,
41
+ await matrix.set_effect(
42
+ effect_type=FirmwareEffect.MORPH,
43
43
  speed=5,
44
44
  palette=[Colors.RED, Colors.BLUE, Colors.GREEN, Colors.PURPLE],
45
45
  )
@@ -49,8 +49,8 @@ async def main(ip: str):
49
49
  # Demonstrate FLAME effect
50
50
  print("\nStarting FLAME effect...")
51
51
  print(" (flickering fire animation)")
52
- await matrix.set_tile_effect(
53
- effect_type=TileEffectType.FLAME,
52
+ await matrix.set_effect(
53
+ effect_type=FirmwareEffect.FLAME,
54
54
  speed=3,
55
55
  palette=[Colors.ORANGE, Colors.RED, Colors.YELLOW],
56
56
  )
@@ -60,8 +60,8 @@ async def main(ip: str):
60
60
  # Demonstrate SKY effect with SUNRISE
61
61
  print("\nStarting SKY effect with SUNRISE...")
62
62
  print(" (sunrise color progression)")
63
- await matrix.set_tile_effect(
64
- effect_type=TileEffectType.SKY,
63
+ await matrix.set_effect(
64
+ effect_type=FirmwareEffect.SKY,
65
65
  speed=10,
66
66
  sky_type=TileEffectSkyType.SUNRISE,
67
67
  )
@@ -71,8 +71,8 @@ async def main(ip: str):
71
71
  # Demonstrate SKY effect with CLOUDS
72
72
  print("\nStarting SKY effect with CLOUDS...")
73
73
  print(" (moving cloud patterns)")
74
- await matrix.set_tile_effect(
75
- effect_type=TileEffectType.SKY,
74
+ await matrix.set_effect(
75
+ effect_type=FirmwareEffect.SKY,
76
76
  speed=5,
77
77
  sky_type=TileEffectSkyType.CLOUDS,
78
78
  cloud_saturation_min=50,
@@ -86,11 +86,11 @@ async def main(ip: str):
86
86
  ocean_palette = [
87
87
  Colors.CYAN,
88
88
  Colors.BLUE,
89
- HSBK(hue=210.0, saturation=1.0, brightness=0.4, kelvin=3500), # deep blue
89
+ HSBK(hue=210, saturation=1.0, brightness=0.4, kelvin=3500), # deep blue
90
90
  HSBK(36408, 65535, 38550, 3500), # Ocean blue
91
91
  ]
92
- await matrix.set_tile_effect(
93
- effect_type=TileEffectType.MORPH,
92
+ await matrix.set_effect(
93
+ effect_type=FirmwareEffect.MORPH,
94
94
  speed=3,
95
95
  palette=ocean_palette,
96
96
  )
@@ -99,11 +99,11 @@ async def main(ip: str):
99
99
 
100
100
  # Stop effect and restore
101
101
  print("\nStopping effect...")
102
- await matrix.set_tile_effect(effect_type=TileEffectType.OFF)
102
+ await matrix.set_effect(effect_type=FirmwareEffect.OFF)
103
103
  await asyncio.sleep(1)
104
104
 
105
105
  # Verify effect stopped
106
- final_effect = await matrix.get_tile_effect()
106
+ final_effect = await matrix.get_effect()
107
107
  print(f"Final effect state: {final_effect.effect_type}")
108
108
 
109
109
  if power == 0:
@@ -1,6 +1,6 @@
1
1
  [project]
2
2
  name = "lifx-async"
3
- version = "4.4.0"
3
+ version = "4.5.0"
4
4
  description = "A modern, type-safe, async Python library for controlling LIFX lights"
5
5
  readme = "README.md"
6
6
  requires-python = ">=3.11"
@@ -10,6 +10,7 @@ from lifx.devices.base import (
10
10
  FirmwareInfo,
11
11
  WifiInfo,
12
12
  )
13
+ from lifx.devices.ceiling import CeilingLight
13
14
  from lifx.devices.hev import HevLight, HevLightState
14
15
  from lifx.devices.infrared import InfraredLight, InfraredLightState
15
16
  from lifx.devices.light import Light, LightState
@@ -17,6 +18,7 @@ from lifx.devices.matrix import MatrixEffect, MatrixLight, MatrixLightState, Til
17
18
  from lifx.devices.multizone import MultiZoneEffect, MultiZoneLight, MultiZoneLightState
18
19
 
19
20
  __all__ = [
21
+ "CeilingLight",
20
22
  "CollectionInfo",
21
23
  "Device",
22
24
  "DeviceInfo",