Fix light effect not being turned off sometimes#733
Draft
TheJulianJES wants to merge 2 commits into
Draft
Conversation
Codecov Report❌ Patch coverage is
Additional details and impacted files@@ Coverage Diff @@
## dev #733 +/- ##
==========================================
+ Coverage 97.63% 97.66% +0.03%
==========================================
Files 62 62
Lines 10814 10825 +11
==========================================
+ Hits 10558 10572 +14
+ Misses 256 253 -3 ☔ View full report in Codecov by Sentry. 🚀 New features to boost your workflow:
|
TheJulianJES
added a commit
to TheJulianJES/zha
that referenced
this pull request
Apr 1, 2026
Collaborator
zigpy-review-bot
left a comment
There was a problem hiding this comment.
Comment-only — the fix is correct and the new tests lock both paths. Noting it's DRAFT and author already flagged "should be cleaned up further"; this is mostly forward-looking observations rather than blockers.
What the fix does
- Computes
deactivate_effect_after_turn_onfrom the pre-deactivate state, then runs_async_deactivate_effect_before_turn_on(gated onself._statebeing truthy) so a stale colorloop is cleared before color-mode-changing commands. - The original elif (
self._effect == EFFECT_COLORLOOP and effect != EFFECT_COLORLOOP) becomes the post-turn-on path, now gated ondeactivate_effect_after_turn_onso it only fires when the light started off (preserves prior behavior for the colorloop-was-set-while-off case). - I ran the two new tests against
aeb75e5in a worktree and both pass; the fulltests/test_light.py(22 tests) also passes. Real mypy in the venv (76 errors) matches thedevbaseline — no regression.
Observations (none blocking on a DRAFT)
started_onisself._statesnapshotted. The early-deactivate path only mutatesself._effect, notself._state, sonot started_onandnot self._stateare equivalent here. Keeping the local is fine for intent — just noting it's not load-bearing._async_deactivate_effect_before_turn_onand_async_deactivate_effect_after_turn_onare near-identical — only the guard differs. Could collapse into a single helper that takes the guard inline, or be called unconditionally with the guard at the call site. Worth folding into the cleanup pass.self._effect = EFFECT_OFFis set unconditionally after the deactivate ZCL call, regardless ofresult[1]. Same as the pre-PR code, so not a regression — but if the deactivate fails on the wire, ZHA now reportseffect=offwhile the device may still be looping. The_check_resulthelper in #734 would let this raise and unwind. Out of scope here; flagging because it's the kind of thing the #734 cleanup is positioned to address cleanly.
Cross-PR
- #734 already folds in this PR's logic — both the early-deactivate-while-on path and the post-deactivate-from-off path are present there, and #734 adds the same two test cases as locks. If #734 is the intended landing strategy, this one can probably be closed as superseded once #734 leaves draft. If #733 lands first (smaller, more focused), #734 will need a trivial rebase.
- #767 (
Fix on/off-only lights reverting to off after rapid turn_off/turn_on, non-draft) edits the sameasync_turn_offtransition-time/flag-setting block. No textual conflict with this PR (this PR doesn't touchasync_turn_off), but worth being aware of the merge ordering.
Title
Matches repo conventions — concise, no prefix, no trailing period.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
DRAFT. Should be cleaned up further.
Proposed change
This fixes an issue where sending a light turn on command with a color temperature does not cause some lights to switch into color temperature mode if the "color loop" effect is currently active.
Previously, we only turned off the effect after sending color (temp) commands. Now, we also do it before, though only if we're certain that an effect is active, to not send unnecessary packets.
Notes
Lights continue to be one of the most complicated things to do 100% right. This is the one known issue that happens in some cases.
In general, the light class will be cleaned up soon a bit. I want to increase test coverage for all edge cases before, though.
This PR may be adjusted and merged only after that's done. We'll see.
Additional information