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.
- {lifx_async-4.4.0 → lifx_async-4.5.0}/.github/workflows/ci.yml +4 -4
- {lifx_async-4.4.0 → lifx_async-4.5.0}/.github/workflows/docs.yml +3 -3
- {lifx_async-4.4.0 → lifx_async-4.5.0}/PKG-INFO +1 -1
- lifx_async-4.5.0/context7.json +4 -0
- {lifx_async-4.4.0 → lifx_async-4.5.0}/docs/changelog.md +16 -0
- {lifx_async-4.4.0 → lifx_async-4.5.0}/examples/12_matrix_effects.py +16 -16
- {lifx_async-4.4.0 → lifx_async-4.5.0}/pyproject.toml +1 -1
- {lifx_async-4.4.0 → lifx_async-4.5.0}/src/lifx/devices/__init__.py +2 -0
- lifx_async-4.5.0/src/lifx/devices/ceiling.py +784 -0
- {lifx_async-4.4.0 → lifx_async-4.5.0}/src/lifx/devices/matrix.py +96 -21
- {lifx_async-4.4.0 → lifx_async-4.5.0}/src/lifx/network/discovery.py +10 -2
- {lifx_async-4.4.0 → lifx_async-4.5.0}/src/lifx/products/__init__.py +8 -0
- lifx_async-4.5.0/src/lifx/products/quirks.py +91 -0
- {lifx_async-4.4.0 → lifx_async-4.5.0}/src/lifx/theme/generators.py +8 -2
- {lifx_async-4.4.0 → lifx_async-4.5.0}/tests/conftest.py +5 -3
- lifx_async-4.5.0/tests/test_devices/test_ceiling.py +905 -0
- {lifx_async-4.4.0 → lifx_async-4.5.0}/tests/test_devices/test_state_matrix.py +29 -0
- {lifx_async-4.4.0 → lifx_async-4.5.0}/tests/test_theme/test_generators.py +100 -0
- {lifx_async-4.4.0 → lifx_async-4.5.0}/uv.lock +178 -184
- {lifx_async-4.4.0 → lifx_async-4.5.0}/.claude/settings.json +0 -0
- {lifx_async-4.4.0 → lifx_async-4.5.0}/.github/dependabot.yml +0 -0
- {lifx_async-4.4.0 → lifx_async-4.5.0}/.github/labeler.yml +0 -0
- {lifx_async-4.4.0 → lifx_async-4.5.0}/.github/workflows/pr-automation.yml +0 -0
- {lifx_async-4.4.0 → lifx_async-4.5.0}/.gitignore +0 -0
- {lifx_async-4.4.0 → lifx_async-4.5.0}/.pre-commit-config.yaml +0 -0
- {lifx_async-4.4.0 → lifx_async-4.5.0}/CLAUDE.md +0 -0
- {lifx_async-4.4.0 → lifx_async-4.5.0}/LICENSE +0 -0
- {lifx_async-4.4.0 → lifx_async-4.5.0}/README.md +0 -0
- {lifx_async-4.4.0 → lifx_async-4.5.0}/docs/api/colors.md +0 -0
- {lifx_async-4.4.0 → lifx_async-4.5.0}/docs/api/devices.md +0 -0
- {lifx_async-4.4.0 → lifx_async-4.5.0}/docs/api/effects.md +0 -0
- {lifx_async-4.4.0 → lifx_async-4.5.0}/docs/api/exceptions.md +0 -0
- {lifx_async-4.4.0 → lifx_async-4.5.0}/docs/api/high-level.md +0 -0
- {lifx_async-4.4.0 → lifx_async-4.5.0}/docs/api/index.md +0 -0
- {lifx_async-4.4.0 → lifx_async-4.5.0}/docs/api/network.md +0 -0
- {lifx_async-4.4.0 → lifx_async-4.5.0}/docs/api/protocol.md +0 -0
- {lifx_async-4.4.0 → lifx_async-4.5.0}/docs/api/themes.md +0 -0
- {lifx_async-4.4.0 → lifx_async-4.5.0}/docs/architecture/effects-architecture.md +0 -0
- {lifx_async-4.4.0 → lifx_async-4.5.0}/docs/architecture/overview.md +0 -0
- {lifx_async-4.4.0 → lifx_async-4.5.0}/docs/faq.md +0 -0
- {lifx_async-4.4.0 → lifx_async-4.5.0}/docs/getting-started/effects.md +0 -0
- {lifx_async-4.4.0 → lifx_async-4.5.0}/docs/getting-started/installation.md +0 -0
- {lifx_async-4.4.0 → lifx_async-4.5.0}/docs/getting-started/quickstart.md +0 -0
- {lifx_async-4.4.0 → lifx_async-4.5.0}/docs/getting-started/themes.md +0 -0
- {lifx_async-4.4.0 → lifx_async-4.5.0}/docs/index.md +0 -0
- {lifx_async-4.4.0 → lifx_async-4.5.0}/docs/migration/effect-api-changes.md +0 -0
- {lifx_async-4.4.0 → lifx_async-4.5.0}/docs/stylesheets/extra.css +0 -0
- {lifx_async-4.4.0 → lifx_async-4.5.0}/docs/user-guide/advanced-usage.md +0 -0
- {lifx_async-4.4.0 → lifx_async-4.5.0}/docs/user-guide/effects-custom.md +0 -0
- {lifx_async-4.4.0 → lifx_async-4.5.0}/docs/user-guide/effects-troubleshooting.md +0 -0
- {lifx_async-4.4.0 → lifx_async-4.5.0}/docs/user-guide/protocol-deep-dive.md +0 -0
- {lifx_async-4.4.0 → lifx_async-4.5.0}/docs/user-guide/themes.md +0 -0
- {lifx_async-4.4.0 → lifx_async-4.5.0}/docs/user-guide/troubleshooting.md +0 -0
- {lifx_async-4.4.0 → lifx_async-4.5.0}/examples/01_simple_discovery.py +0 -0
- {lifx_async-4.4.0 → lifx_async-4.5.0}/examples/02_simple_control.py +0 -0
- {lifx_async-4.4.0 → lifx_async-4.5.0}/examples/03_waveforms.py +0 -0
- {lifx_async-4.4.0 → lifx_async-4.5.0}/examples/04_logging.py +0 -0
- {lifx_async-4.4.0 → lifx_async-4.5.0}/examples/06_pulse_effect.py +0 -0
- {lifx_async-4.4.0 → lifx_async-4.5.0}/examples/07_colorloop_effect.py +0 -0
- {lifx_async-4.4.0 → lifx_async-4.5.0}/examples/08_custom_effect.py +0 -0
- {lifx_async-4.4.0 → lifx_async-4.5.0}/examples/09_background_effect.py +0 -0
- {lifx_async-4.4.0 → lifx_async-4.5.0}/examples/10_find_specific_devices.py +0 -0
- {lifx_async-4.4.0 → lifx_async-4.5.0}/examples/11_matrix_basic.py +0 -0
- {lifx_async-4.4.0 → lifx_async-4.5.0}/examples/13_matrix_large.py +0 -0
- {lifx_async-4.4.0 → lifx_async-4.5.0}/mkdocs.yml +0 -0
- {lifx_async-4.4.0 → lifx_async-4.5.0}/renovate.json +0 -0
- {lifx_async-4.4.0 → lifx_async-4.5.0}/src/lifx/__init__.py +0 -0
- {lifx_async-4.4.0 → lifx_async-4.5.0}/src/lifx/api.py +0 -0
- {lifx_async-4.4.0 → lifx_async-4.5.0}/src/lifx/color.py +0 -0
- {lifx_async-4.4.0 → lifx_async-4.5.0}/src/lifx/const.py +0 -0
- {lifx_async-4.4.0 → lifx_async-4.5.0}/src/lifx/devices/base.py +0 -0
- {lifx_async-4.4.0 → lifx_async-4.5.0}/src/lifx/devices/hev.py +0 -0
- {lifx_async-4.4.0 → lifx_async-4.5.0}/src/lifx/devices/infrared.py +0 -0
- {lifx_async-4.4.0 → lifx_async-4.5.0}/src/lifx/devices/light.py +0 -0
- {lifx_async-4.4.0 → lifx_async-4.5.0}/src/lifx/devices/multizone.py +0 -0
- {lifx_async-4.4.0 → lifx_async-4.5.0}/src/lifx/effects/__init__.py +0 -0
- {lifx_async-4.4.0 → lifx_async-4.5.0}/src/lifx/effects/base.py +0 -0
- {lifx_async-4.4.0 → lifx_async-4.5.0}/src/lifx/effects/colorloop.py +0 -0
- {lifx_async-4.4.0 → lifx_async-4.5.0}/src/lifx/effects/conductor.py +0 -0
- {lifx_async-4.4.0 → lifx_async-4.5.0}/src/lifx/effects/const.py +0 -0
- {lifx_async-4.4.0 → lifx_async-4.5.0}/src/lifx/effects/models.py +0 -0
- {lifx_async-4.4.0 → lifx_async-4.5.0}/src/lifx/effects/pulse.py +0 -0
- {lifx_async-4.4.0 → lifx_async-4.5.0}/src/lifx/effects/state_manager.py +0 -0
- {lifx_async-4.4.0 → lifx_async-4.5.0}/src/lifx/exceptions.py +0 -0
- {lifx_async-4.4.0 → lifx_async-4.5.0}/src/lifx/network/__init__.py +0 -0
- {lifx_async-4.4.0 → lifx_async-4.5.0}/src/lifx/network/connection.py +0 -0
- {lifx_async-4.4.0 → lifx_async-4.5.0}/src/lifx/network/message.py +0 -0
- {lifx_async-4.4.0 → lifx_async-4.5.0}/src/lifx/network/transport.py +0 -0
- {lifx_async-4.4.0 → lifx_async-4.5.0}/src/lifx/products/generator.py +0 -0
- {lifx_async-4.4.0 → lifx_async-4.5.0}/src/lifx/products/registry.py +0 -0
- {lifx_async-4.4.0 → lifx_async-4.5.0}/src/lifx/protocol/__init__.py +0 -0
- {lifx_async-4.4.0 → lifx_async-4.5.0}/src/lifx/protocol/base.py +0 -0
- {lifx_async-4.4.0 → lifx_async-4.5.0}/src/lifx/protocol/generator.py +0 -0
- {lifx_async-4.4.0 → lifx_async-4.5.0}/src/lifx/protocol/header.py +0 -0
- {lifx_async-4.4.0 → lifx_async-4.5.0}/src/lifx/protocol/models.py +0 -0
- {lifx_async-4.4.0 → lifx_async-4.5.0}/src/lifx/protocol/packets.py +0 -0
- {lifx_async-4.4.0 → lifx_async-4.5.0}/src/lifx/protocol/protocol_types.py +0 -0
- {lifx_async-4.4.0 → lifx_async-4.5.0}/src/lifx/protocol/serializer.py +0 -0
- {lifx_async-4.4.0 → lifx_async-4.5.0}/src/lifx/py.typed +0 -0
- {lifx_async-4.4.0 → lifx_async-4.5.0}/src/lifx/theme/__init__.py +0 -0
- {lifx_async-4.4.0 → lifx_async-4.5.0}/src/lifx/theme/canvas.py +0 -0
- {lifx_async-4.4.0 → lifx_async-4.5.0}/src/lifx/theme/library.py +0 -0
- {lifx_async-4.4.0 → lifx_async-4.5.0}/src/lifx/theme/theme.py +0 -0
- {lifx_async-4.4.0 → lifx_async-4.5.0}/tests/__init__.py +0 -0
- {lifx_async-4.4.0 → lifx_async-4.5.0}/tests/test_api/__init__.py +0 -0
- {lifx_async-4.4.0 → lifx_async-4.5.0}/tests/test_api/test_api_apply_theme.py +0 -0
- {lifx_async-4.4.0 → lifx_async-4.5.0}/tests/test_api/test_api_batch_errors.py +0 -0
- {lifx_async-4.4.0 → lifx_async-4.5.0}/tests/test_api/test_api_batch_operations.py +0 -0
- {lifx_async-4.4.0 → lifx_async-4.5.0}/tests/test_api/test_api_discovery.py +0 -0
- {lifx_async-4.4.0 → lifx_async-4.5.0}/tests/test_api/test_api_organization.py +0 -0
- {lifx_async-4.4.0 → lifx_async-4.5.0}/tests/test_color.py +0 -0
- {lifx_async-4.4.0 → lifx_async-4.5.0}/tests/test_devices/__init__.py +0 -0
- {lifx_async-4.4.0 → lifx_async-4.5.0}/tests/test_devices/conftest.py +0 -0
- {lifx_async-4.4.0 → lifx_async-4.5.0}/tests/test_devices/test_base.py +0 -0
- {lifx_async-4.4.0 → lifx_async-4.5.0}/tests/test_devices/test_hev.py +0 -0
- {lifx_async-4.4.0 → lifx_async-4.5.0}/tests/test_devices/test_infrared.py +0 -0
- {lifx_async-4.4.0 → lifx_async-4.5.0}/tests/test_devices/test_light.py +0 -0
- {lifx_async-4.4.0 → lifx_async-4.5.0}/tests/test_devices/test_mac_address.py +0 -0
- {lifx_async-4.4.0 → lifx_async-4.5.0}/tests/test_devices/test_matrix.py +0 -0
- {lifx_async-4.4.0 → lifx_async-4.5.0}/tests/test_devices/test_multizone.py +0 -0
- {lifx_async-4.4.0 → lifx_async-4.5.0}/tests/test_devices/test_state_hev.py +0 -0
- {lifx_async-4.4.0 → lifx_async-4.5.0}/tests/test_devices/test_state_infrared.py +0 -0
- {lifx_async-4.4.0 → lifx_async-4.5.0}/tests/test_devices/test_state_light.py +0 -0
- {lifx_async-4.4.0 → lifx_async-4.5.0}/tests/test_devices/test_state_management.py +0 -0
- {lifx_async-4.4.0 → lifx_async-4.5.0}/tests/test_devices/test_state_multizone.py +0 -0
- {lifx_async-4.4.0 → lifx_async-4.5.0}/tests/test_effects/__init__.py +0 -0
- {lifx_async-4.4.0 → lifx_async-4.5.0}/tests/test_effects/test_base.py +0 -0
- {lifx_async-4.4.0 → lifx_async-4.5.0}/tests/test_effects/test_capability_filtering.py +0 -0
- {lifx_async-4.4.0 → lifx_async-4.5.0}/tests/test_effects/test_colorloop.py +0 -0
- {lifx_async-4.4.0 → lifx_async-4.5.0}/tests/test_effects/test_integration.py +0 -0
- {lifx_async-4.4.0 → lifx_async-4.5.0}/tests/test_effects/test_models.py +0 -0
- {lifx_async-4.4.0 → lifx_async-4.5.0}/tests/test_effects/test_pulse.py +0 -0
- {lifx_async-4.4.0 → lifx_async-4.5.0}/tests/test_effects/test_state_manager.py +0 -0
- {lifx_async-4.4.0 → lifx_async-4.5.0}/tests/test_network/__init__.py +0 -0
- {lifx_async-4.4.0 → lifx_async-4.5.0}/tests/test_network/test_concurrent_requests.py +0 -0
- {lifx_async-4.4.0 → lifx_async-4.5.0}/tests/test_network/test_connection.py +0 -0
- {lifx_async-4.4.0 → lifx_async-4.5.0}/tests/test_network/test_discovery_devices.py +0 -0
- {lifx_async-4.4.0 → lifx_async-4.5.0}/tests/test_network/test_discovery_errors.py +0 -0
- {lifx_async-4.4.0 → lifx_async-4.5.0}/tests/test_network/test_message.py +0 -0
- {lifx_async-4.4.0 → lifx_async-4.5.0}/tests/test_network/test_message_advanced.py +0 -0
- {lifx_async-4.4.0 → lifx_async-4.5.0}/tests/test_network/test_transport.py +0 -0
- {lifx_async-4.4.0 → lifx_async-4.5.0}/tests/test_products/test_product_generator.py +0 -0
- {lifx_async-4.4.0 → lifx_async-4.5.0}/tests/test_products/test_registry.py +0 -0
- {lifx_async-4.4.0 → lifx_async-4.5.0}/tests/test_protocol/test_generated.py +0 -0
- {lifx_async-4.4.0 → lifx_async-4.5.0}/tests/test_protocol/test_header.py +0 -0
- {lifx_async-4.4.0 → lifx_async-4.5.0}/tests/test_protocol/test_protocol_generator.py +0 -0
- {lifx_async-4.4.0 → lifx_async-4.5.0}/tests/test_protocol/test_serializer.py +0 -0
- {lifx_async-4.4.0 → lifx_async-4.5.0}/tests/test_theme/__init__.py +0 -0
- {lifx_async-4.4.0 → lifx_async-4.5.0}/tests/test_theme/conftest.py +0 -0
- {lifx_async-4.4.0 → lifx_async-4.5.0}/tests/test_theme/test_apply_theme.py +0 -0
- {lifx_async-4.4.0 → lifx_async-4.5.0}/tests/test_theme/test_canvas.py +0 -0
- {lifx_async-4.4.0 → lifx_async-4.5.0}/tests/test_theme/test_library.py +0 -0
- {lifx_async-4.4.0 → lifx_async-4.5.0}/tests/test_theme/test_theme.py +0 -0
- {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@
|
|
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@
|
|
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@
|
|
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@
|
|
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@
|
|
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@
|
|
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@
|
|
92
|
+
- uses: actions/checkout@8e8c483db84b4bee98b60c0593521ed34d9990e8 # v6
|
|
93
93
|
|
|
94
94
|
- name: Set up Python
|
|
95
95
|
uses: actions/setup-python@83679a892e2d95755f2dac6acb0bfd1e9ac5d548 # v6
|
|
@@ -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
|
|
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.
|
|
29
|
+
current_effect = await matrix.get_effect()
|
|
30
30
|
print(f"Current effect: {current_effect.effect_type}")
|
|
31
|
-
if current_effect.effect_type !=
|
|
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.
|
|
42
|
-
effect_type=
|
|
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.
|
|
53
|
-
effect_type=
|
|
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.
|
|
64
|
-
effect_type=
|
|
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.
|
|
75
|
-
effect_type=
|
|
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
|
|
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.
|
|
93
|
-
effect_type=
|
|
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.
|
|
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.
|
|
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:
|
|
@@ -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",
|