Fix ValueError when turning on blebox light with brightness set to 0#170769
Conversation
|
Hey there @bbx-a, @swistakm, mind taking a look at this pull request as it has been labeled with an integration ( Code owner commandsCode owners of
|
There was a problem hiding this comment.
Pull request overview
Note
Copilot was unable to run its full agentic suite in this review.
This PR adjusts the BleBox light turn-on behavior to treat “brightness = 0” as a request to turn the device off (instead of raising a ValueError), and adds a regression test for the wLightBox.
Changes:
- Add an early-return path in
async_turn_onthat turns the device off when the computed channel values are all zero. - Add a unit test ensuring
SERVICE_TURN_ONwithATTR_BRIGHTNESS: 0results in an off state (and usesasync_off, notasync_on).
Reviewed changes
Copilot reviewed 2 out of 2 changed files in this pull request and generated 3 comments.
| File | Description |
|---|---|
| tests/components/blebox/test_light.py | Adds regression test for “turn_on brightness=0 should turn off” behavior. |
| homeassistant/components/blebox/light.py | Implements early-off behavior when the computed output values are all zeros. |
| if isinstance(value, list) and not any(value): | ||
| await self._feature.async_off() | ||
| return |
There was a problem hiding this comment.
The root cause is that sensible_on_value can already return all-zero channel values, and in that case async_on([0, 0, 0, 0]) always raises a ValueError regardless of what the user requested. So checking the computed value is the right place to catch this.
| if isinstance(value, list) and not any(value): | ||
| await self._feature.async_off() | ||
| return |
There was a problem hiding this comment.
I'll fix it and add checking against a tuple.
| else: | ||
| value = feature.apply_brightness(value, brightness) | ||
|
|
||
| if isinstance(value, list) and not any(value): |
There was a problem hiding this comment.
If apply_brightness ever returns all zeros for a non-zero brightness, that's a bug in the library that should be caught and fixed there. Adding a test that mocks that behavior would only be testing the mock, not protecting against a real regression.
|
Fixed the PR title and description to clarify that the issue is not limited to brightness values. The problem occurs when all channel values are set to 0 (for example, when a light is on and the user manually sets all RGBW/RGBCCT channels to 0), which effectively means the light should be turned off. In this case, async_on could raise a ValueError, so an early check was added to call async_off instead. |
|
Please address or comment on the copilot comments. |
Done, replied and fixed one issue |
| if isinstance(value, (list, tuple)) and not any(value): | ||
| await self._feature.async_off() | ||
| return |
There was a problem hiding this comment.
The guard is intentionally on the post-processed value. Apply_brightness with brightness=0 always produces all-zero list/tuple for every color mode we handle, and no code path here produces a scalar. Checking brightness == 0 early would also miss cases where brightness comes implicitly from rgb/rgbww.
| value = feature.apply_brightness(value, brightness) | ||
|
|
||
| if isinstance(value, (list, tuple)) and not any(value): | ||
| await self._feature.async_off() |
There was a problem hiding this comment.
async_turn_off calls async_off() without any try/except either, so the error handling is already consistent. Neither path wraps it.
…ome-assistant#170769) Co-authored-by: Joost Lekkerkerker <joostlek@outlook.com>
…170769) Co-authored-by: Joost Lekkerkerker <joostlek@outlook.com>
…2026.5.2 ➔ 2026.5.3) (#568) This PR contains the following updates: | Package | Update | Change | |---|---|---| | [ghcr.io/home-operations/home-assistant](https://ghcr.io/home-operations/home-assistant) ([source](https://github.com/home-assistant/core)) | patch | `2026.5.2` → `2026.5.3` | --- ### Release Notes <details> <summary>home-assistant/core (ghcr.io/home-operations/home-assistant)</summary> ### [`v2026.5.3`](https://github.com/home-assistant/core/releases/tag/2026.5.3) [Compare Source](home-assistant/core@2026.5.2...2026.5.3) - Bump qbittorrent-api to 2026.5.1 ([@​lumatijev] - [#​170181]) ([qbittorrent docs]) (dependency) - Improve iaqualink 429 handling ([@​flz] - [#​170231]) ([iaqualink docs]) - Fix Apple TV keyboard focus binary\_sensor missing on cold start ([@​kroehre] - [#​170360]) ([apple\_tv docs][apple_tv docs]) - Add tilt controls for UpDownSheerScreen in Overkiz ([@​dankarization] - [#​170563]) ([overkiz docs]) - Fix ValueError when turning on blebox light with brightness set to 0 ([@​bkobus-bbx] - [#​170769]) ([blebox docs]) - Bump aiodns to 4.0.3 ([@​bdraco] - [#​170865]) ([dnsip docs]) (dependency) - Populate uid and recurrence\_id in CalDAV calendar events ([@​frenck] - [#​170910]) ([caldav docs]) - Fix is\_closed state for SlidingDiscreteGateWithPedestrianPosition covers in Overkiz ([@​iMicknl] - [#​170913]) ([overkiz docs]) - Disable USB discovery for teleinfo ([@​puddly] - [#​170933]) ([teleinfo docs]) - Fix utility meter next\_reset shifting forward on entity rename ([@​frenck] - [#​170957]) ([utility\_meter docs][utility_meter docs]) - Use correct state\_class for utility meters with device classes that don't support total\_increasing ([@​frenck] - [#​170962]) ([utility\_meter docs][utility_meter docs]) - Reduce GoodWe connect retries to avoid blocking startup ([@​frenck] - [#​170964]) ([goodwe docs]) - Fix is\_closed state for DiscretePositionableGarageDoor in Overkiz ([@​iMicknl] - [#​170981]) ([overkiz docs]) - Fix controls for OpenCloseGate4T (rts:GateOpenerRTS4TComponent) in Overkiz ([@​iMicknl] - [#​170987]) ([overkiz docs]) - Prevent Google Assistant entity sync from blocking startup ([@​frenck] - [#​170991]) ([google\_assistant docs][google_assistant docs]) - Load template extensions by class to prevent import deadlock ([@​frenck] - [#​170995]) - Use asyncio.get\_running\_loop() in emulated\_hue UPnP responder ([@​frenck] - [#​171000]) ([emulated\_hue docs][emulated_hue docs]) - Fix Netatmo valve KeyError when hvac\_action state is unavailable in Overkiz ([@​frenck] - [#​171004]) ([overkiz docs]) - Fix time trigger crash when using entity\_id dict format without offset ([@​frenck] - [#​171006]) ([homeassistant docs]) - Fix threshold preview crash when hysteresis is not provided ([@​frenck] - [#​171009]) ([threshold docs]) - Fix Growatt mix device IndexError when chart data is empty ([@​frenck] - [#​171012]) ([growatt\_server docs][growatt_server docs]) - Fix SleepIQ timer units: seconds should be minutes for core climate and foot warmer ([@​frenck] - [#​171013]) ([sleepiq docs]) - Fix Control4 climate crash when humidity is 'Undefined' ([@​frenck] - [#​171015]) ([control4 docs]) - Fix manual alarm panel crash on restore with invalid state ([@​frenck] - [#​171016]) ([manual docs]) - Handle Daikin connection errors gracefully in coordinator ([@​frenck] - [#​171017]) ([daikin docs]) - Fix shorthand template conditions in choose blocks crashing all automations ([@​frenck] - [#​171018]) - Add additional overrides to cover entity in Overkiz ([@​iMicknl] - [#​171019]) ([overkiz docs]) - Fix Verisure alarm crash when cloud rejects arm/disarm command ([@​frenck] - [#​171024]) ([verisure docs]) - Add stop command to Overkiz pergola horizontal awning covers ([@​frenck] - [#​171034]) ([overkiz docs]) - Fix WeatherFlow websocket crash when data payload is None ([@​frenck] - [#​171037]) ([weatherflow\_cloud docs][weatherflow_cloud docs]) - Bump pyIntesishome to 1.8.8 ([@​jnimmo] - [#​171041]) ([intesishome docs]) (dependency) - Return media\_content\_id as string in forked\_daapd ([@​frenck] - [#​171059]) ([forked\_daapd docs][forked_daapd docs]) - Bump aioimmich to 0.14.1 ([@​mib1185] - [#​171138]) ([immich docs]) (dependency) - Fix controls for UpDownGarageDoor4T and additional 4T covers in Overkiz ([@​iMicknl] - [#​171144]) ([overkiz docs]) - Fix ZHA config entries using a URI without a port ([@​puddly] - [#​171164]) ([zha docs]) - Fix is\_closed state and position for DynamicPergola covers in Overkiz ([@​iMicknl] - [#​170983]) ([overkiz docs]) - Fix tilt and position support for VenetianBlind covers in Overkiz ([@​iMicknl] - [#​170974]) ([overkiz docs]) - Fix blebox light temperature scaling ([@​bkobus-bbx] - [#​170573]) ([blebox docs]) [#​169484]: home-assistant/core#169484 [#​170146]: home-assistant/core#170146 [#​170181]: home-assistant/core#170181 [#​170231]: home-assistant/core#170231 [#​170360]: home-assistant/core#170360 [#​170563]: home-assistant/core#170563 [#​170573]: home-assistant/core#170573 [#​170769]: home-assistant/core#170769 [#​170840]: home-assistant/core#170840 [#​170865]: home-assistant/core#170865 [#​170910]: home-assistant/core#170910 [#​170913]: home-assistant/core#170913 [#​170933]: home-assistant/core#170933 [#​170957]: home-assistant/core#170957 [#​170962]: home-assistant/core#170962 [#​170964]: home-assistant/core#170964 [#​170974]: home-assistant/core#170974 [#​170981]: home-assistant/core#170981 [#​170983]: home-assistant/core#170983 [#​170987]: home-assistant/core#170987 [#​170991]: home-assistant/core#170991 [#​170995]: home-assistant/core#170995 [#​171000]: home-assistant/core#171000 [#​171004]: home-assistant/core#171004 [#​171006]: home-assistant/core#171006 [#​171009]: home-assistant/core#171009 [#​171012]: home-assistant/core#171012 [#​171013]: home-assistant/core#171013 [#​171015]: home-assistant/core#171015 [#​171016]: home-assistant/core#171016 [#​171017]: home-assistant/core#171017 [#​171018]: home-assistant/core#171018 [#​171019]: home-assistant/core#171019 [#​171024]: home-assistant/core#171024 [#​171034]: home-assistant/core#171034 [#​171037]: home-assistant/core#171037 [#​171041]: home-assistant/core#171041 [#​171059]: home-assistant/core#171059 [#​171138]: home-assistant/core#171138 [#​171144]: home-assistant/core#171144 [#​171164]: home-assistant/core#171164 [@​bdraco]: https://github.com/bdraco [@​bkobus-bbx]: https://github.com/bkobus-bbx [@​dankarization]: https://github.com/dankarization [@​flz]: https://github.com/flz [@​frenck]: https://github.com/frenck [@​iMicknl]: https://github.com/iMicknl [@​jnimmo]: https://github.com/jnimmo [@​kroehre]: https://github.com/kroehre [@​lumatijev]: https://github.com/lumatijev [@​mib1185]: https://github.com/mib1185 [@​puddly]: https://github.com/puddly [apple_tv docs]: https://www.home-assistant.io/integrations/apple_tv/ [blebox docs]: https://www.home-assistant.io/integrations/blebox/ [caldav docs]: https://www.home-assistant.io/integrations/caldav/ [control4 docs]: https://www.home-assistant.io/integrations/control4/ [daikin docs]: https://www.home-assistant.io/integrations/daikin/ [dnsip docs]: https://www.home-assistant.io/integrations/dnsip/ [emulated_hue docs]: https://www.home-assistant.io/integrations/emulated_hue/ [forked_daapd docs]: https://www.home-assistant.io/integrations/forked_daapd/ [goodwe docs]: https://www.home-assistant.io/integrations/goodwe/ [google_assistant docs]: https://www.home-assistant.io/integrations/google_assistant/ [growatt_server docs]: https://www.home-assistant.io/integrations/growatt_server/ [homeassistant docs]: https://www.home-assistant.io/integrations/homeassistant/ [iaqualink docs]: https://www.home-assistant.io/integrations/iaqualink/ [immich docs]: https://www.home-assistant.io/integrations/immich/ [intesishome docs]: https://www.home-assistant.io/integrations/intesishome/ [manual docs]: https://www.home-assistant.io/integrations/manual/ [overkiz docs]: https://www.home-assistant.io/integrations/overkiz/ [qbittorrent docs]: https://www.home-assistant.io/integrations/qbittorrent/ [sleepiq docs]: https://www.home-assistant.io/integrations/sleepiq/ [teleinfo docs]: https://www.home-assistant.io/integrations/teleinfo/ [threshold docs]: https://www.home-assistant.io/integrations/threshold/ [utility_meter docs]: https://www.home-assistant.io/integrations/utility_meter/ [verisure docs]: https://www.home-assistant.io/integrations/verisure/ [weatherflow_cloud docs]: https://www.home-assistant.io/integrations/weatherflow_cloud/ [zha docs]: https://www.home-assistant.io/integrations/zha/ </details> --- ### Configuration 📅 **Schedule**: Branch creation - At any time (no schedule defined), Automerge - At any time (no schedule defined). 🚦 **Automerge**: Disabled by config. Please merge this manually once you are satisfied. ♻ **Rebasing**: Whenever PR becomes conflicted, or you tick the rebase/retry checkbox. 🔕 **Ignore**: Close this PR and you won't be reminded about these updates again. --- - [ ] <!-- rebase-check -->If you want to rebase/retry this PR, check this box --- This PR has been generated by [Renovate Bot](https://github.com/renovatebot/renovate). <!--renovate-debug:eyJjcmVhdGVkSW5WZXIiOiI0My4xMDEuMSIsInVwZGF0ZWRJblZlciI6IjQzLjEwMS4xIiwidGFyZ2V0QnJhbmNoIjoibWFpbiIsImxhYmVscyI6WyJyZW5vdmF0ZS9jb250YWluZXIiLCJ0eXBlL3BhdGNoIl19--> Reviewed-on: https://git.erwanleboucher.dev/eleboucher/homelab/pulls/568
Breaking change
Proposed change
Fixed a ValueError raised when calling async_on with a list of all-zero channel values. This can happen when the device's last known state (sensible_on_value) has all channels set to zero. Added an early check so that when the resolved value is a list of all zeros, async_off is called instead.
Type of change
Additional information
Checklist
ruff format homeassistant tests)If user exposed functionality or configuration variables are added/changed:
If the code communicates with devices, web services, or third-party tools:
Updated and included derived files by running:
python3 -m script.hassfest.requirements_all.txt.Updated by running
python3 -m script.gen_requirements_all.To help with the load of incoming pull requests: