Skip to content

Fix WiZ Light config flow timeout by properly closing UDP connections#168456

Merged
joostlek merged 3 commits into
home-assistant:devfrom
robwasripped:fix-wiz-connection
May 8, 2026
Merged

Fix WiZ Light config flow timeout by properly closing UDP connections#168456
joostlek merged 3 commits into
home-assistant:devfrom
robwasripped:fix-wiz-connection

Conversation

@robwasripped
Copy link
Copy Markdown
Contributor

The WiZ config flow was creating wizlight instances without properly closing them, leaving dangling UDP datagram endpoints in Home Assistant's event loop. This caused subsequent connection attempts to fail with a timeout after exactly 13 seconds (pywizlight's retry limit).

The issue manifested as intermittent failures when manually adding WiZ bulbs through the UI, even though the bulbs responded immediately to direct UDP requests.

Add await bulb.async_close() in finally blocks to ensure UDP connections are cleaned up in three config flow methods:

  • _async_connect_discovered_or_abort() - for discovery flows
  • async_step_pick_device() - for device picking
  • async_step_user() - for manual IP entry

Fixes timeout errors and prevents UDP endpoint accumulation.

Tested with WiZ Tunable White (ESP20_SHTWC_01) FW 1.37.0.

I believe this fixes the issues spoken about in these locations:

Breaking change

Proposed change

Type of change

  • Dependency upgrade
  • Bugfix (non-breaking change which fixes an issue)
  • New integration (thank you!)
  • New feature (which adds functionality to an existing integration)
  • Deprecation (breaking change to happen in the future)
  • Breaking change (fix/feature causing existing functionality to break)
  • Code quality improvements to existing code or addition of tests

Additional information

  • This PR fixes or closes issue: fixes #
  • This PR is related to issue:
  • Link to documentation pull request:
  • Link to developer documentation pull request:
  • Link to frontend pull request:

Checklist

  • I understand the code I am submitting and can explain how it works.
  • The code change is tested and works locally.
  • Local tests pass. Your PR cannot be merged unless tests pass
  • There is no commented out code in this PR.
  • I have followed the development checklist
  • I have followed the perfect PR recommendations
  • The code has been formatted using Ruff (ruff format homeassistant tests)
  • Tests have been added to verify that the new code works.
  • Any generated code has been carefully reviewed for correctness and compliance with project standards.

If user exposed functionality or configuration variables are added/changed:

If the code communicates with devices, web services, or third-party tools:

  • The manifest file has all fields filled out correctly.
    Updated and included derived files by running: python3 -m script.hassfest.
  • New or updated dependencies have been added to requirements_all.txt.
    Updated by running python3 -m script.gen_requirements_all.
  • For the updated dependencies a diff between library versions and ideally a link to the changelog/release notes is added to the PR description.

To help with the load of incoming pull requests:

The WiZ config flow was creating wizlight instances without properly
closing them, leaving dangling UDP datagram endpoints in Home Assistant's
event loop. This caused subsequent connection attempts to fail with a
timeout after exactly 13 seconds (pywizlight's retry limit).

The issue manifested as intermittent failures when manually adding WiZ
bulbs through the UI, even though the bulbs responded immediately to
direct UDP requests.

Add await bulb.async_close() in finally blocks to ensure UDP connections
are cleaned up in three config flow methods:
- _async_connect_discovered_or_abort() - for discovery flows
- async_step_pick_device() - for device picking
- async_step_user() - for manual IP entry

Fixes timeout errors and prevents UDP endpoint accumulation.

Tested with WiZ Tunable White (ESP20_SHTWC_01) FW 1.37.0.
Copilot AI review requested due to automatic review settings April 17, 2026 20:22
@home-assistant home-assistant Bot added bugfix cla-needed has-tests integration: wiz small-pr PRs with less than 30 lines. Top 200 Integration is ranked within the top 200 by usage labels Apr 17, 2026
Copy link
Copy Markdown
Contributor

@home-assistant home-assistant Bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Hi @robwasripped

It seems you haven't yet signed a CLA. Please do so here.

Once you do that we will be able to review and accept this pull request.

Thanks!

@home-assistant
Copy link
Copy Markdown
Contributor

Please take a look at the requested changes, and use the Ready for review button when you are done, thanks 👍

Learn more about our pull request process.

@home-assistant
Copy link
Copy Markdown
Contributor

Hey there @sbidy, @arturpragacz, mind taking a look at this pull request as it has been labeled with an integration (wiz) you are listed as a code owner for? Thanks!

Code owner commands

Code owners of wiz can trigger bot actions by commenting:

  • @home-assistant close Closes the pull request.
  • @home-assistant mark-draft Mark the pull request as draft.
  • @home-assistant ready-for-review Remove the draft status from the pull request.
  • @home-assistant rename Awesome new title Renames the pull request.
  • @home-assistant reopen Reopen the pull request.
  • @home-assistant unassign wiz Removes the current integration label and assignees on the pull request, add the integration domain after the command.
  • @home-assistant update-branch Update the pull request branch with the base branch.
  • @home-assistant add-label needs-more-information Add a label (needs-more-information, problem in dependency, problem in custom component, problem in config, problem in device, feature-request) to the pull request.
  • @home-assistant remove-label needs-more-information Remove a label (needs-more-information, problem in dependency, problem in custom component, problem in config, problem in device, feature-request) on the pull request.

Copy link
Copy Markdown
Contributor

Copilot AI left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

This PR fixes intermittent WiZ config flow connection timeouts by ensuring pywizlight UDP transports are always cleaned up after probe calls during config entry creation.

Changes:

  • Close wizlight UDP connections via await bulb.async_close() in finally blocks for discovery, device-pick, and manual-user steps.
  • Add config flow tests asserting the bulb connection is closed on both success and failure paths for user and discovery flows.

Reviewed changes

Copilot reviewed 2 out of 2 changed files in this pull request and generated no comments.

File Description
homeassistant/components/wiz/config_flow.py Ensures wizlight instances are always closed after connection/bulb-type checks in config flow steps.
tests/components/wiz/test_config_flow.py Adds/updates tests to verify async_close() is awaited in relevant config flow paths.

@robwasripped robwasripped marked this pull request as ready for review April 18, 2026 08:33
Comment on lines +81 to +104
async def test_user_form_closes_connection(hass: HomeAssistant) -> None:
"""Test the user flow closes the bulb connection after setup."""
bulb = _mocked_wizlight(None, None, FAKE_DIMMABLE_BULB)

result = await hass.config_entries.flow.async_init(
DOMAIN, context={"source": config_entries.SOURCE_USER}
)

with (
_patch_wizlight(device=bulb),
patch(
"homeassistant.components.wiz.async_setup_entry",
return_value=True,
),
patch("homeassistant.components.wiz.async_setup", return_value=True),
):
result2 = await hass.config_entries.flow.async_configure(
result["flow_id"],
TEST_CONNECTION,
)
await hass.async_block_till_done()

assert result2["type"] is FlowResultType.CREATE_ENTRY
bulb.async_close.assert_awaited_once()
Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I would assume we already have both happy and not-happy flows out there that we can add this one line to to check if async_close has been called

Copy link
Copy Markdown
Contributor Author

@robwasripped robwasripped May 1, 2026

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

That makes sense actually. I've taken these new tests out and put the assertions into the existing.

EDIT: Thanks for reviewing this, I really need this fix adding in for my lights 😅

Instead of creating a new set of tests to just test the connection
close on wiz bulbs, add the assertion to the existing
happy / non-happy path tests.
Copilot AI review requested due to automatic review settings May 1, 2026 07:58
@robwasripped robwasripped requested a review from joostlek May 1, 2026 08:02
Copy link
Copy Markdown
Contributor

Copilot AI left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

Copilot reviewed 2 out of 2 changed files in this pull request and generated no new comments.

@joostlek joostlek merged commit 70e18fc into home-assistant:dev May 8, 2026
33 checks passed
@joostlek joostlek added this to the 2026.5.1 milestone May 8, 2026
@frenck frenck mentioned this pull request May 8, 2026
eleboucher pushed a commit to eleboucher/homelab that referenced this pull request May 9, 2026
…2026.5.0 → 2026.5.1) (#411)

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.0` → `2026.5.1` |

---

### Release Notes

<details>
<summary>home-assistant/core (ghcr.io/home-operations/home-assistant)</summary>

### [`v2026.5.1`](https://github.com/home-assistant/core/releases/tag/2026.5.1)

[Compare Source](home-assistant/core@2026.5.0...2026.5.1)

- Added wfsens as a occupancy source in wiz ([@&#8203;th3spis] - [#&#8203;166799]) ([wiz docs])
- Fix WiZ Light config flow timeout by properly closing UDP connections ([@&#8203;robwasripped] - [#&#8203;168456]) ([wiz docs])
- Fix IntelliFire setup recovery ([@&#8203;jeeftor] - [#&#8203;169739]) ([intellifire docs])
- Fix hassio auth IndexError on Supervisor Unix socket requests ([@&#8203;agners] - [#&#8203;169911]) ([hassio docs])
- Update gardena ble to 2.8.1 ([@&#8203;elupus] - [#&#8203;169914]) ([gardena\_bluetooth docs][gardena_bluetooth docs]) ([husqvarna\_automower\_ble docs][husqvarna_automower_ble docs]) (dependency)
- Bump serialx to 1.7.1 ([@&#8203;puddly] - [#&#8203;169928]) ([serial docs]) ([acer\_projector docs][acer_projector docs]) ([usb docs]) (dependency)
- Bump holidays to 0.96 ([@&#8203;gjohansson-ST] - [#&#8203;169939]) ([workday docs]) ([holiday docs]) (dependency)
- Add support for options to todo triggers ([@&#8203;emontnemery] - [#&#8203;169947]) ([todo docs])
- Bump pyTibber to 0.37.5 ([@&#8203;Danielhiversen] - [#&#8203;169981]) ([tibber docs]) (dependency)
- Bump python-duco-client to 0.4.0 ([@&#8203;ronaldvdmeer] - [#&#8203;169776]) ([duco docs]) (dependency)
- Bump python-duco-client to 0.4.1 ([@&#8203;ronaldvdmeer] - [#&#8203;169991]) ([duco docs]) (dependency)
- Proper handling of malformed data during FRITZ!Box Tools setup ([@&#8203;mib1185] - [#&#8203;170030]) ([fritz docs])
- Fix websocket certificate verification Bump axis to v70 ([@&#8203;Kane610] - [#&#8203;170038]) ([axis docs]) (dependency)
- Fix `is_closed` state for DynamicGarageDoor in Overkiz ([@&#8203;iMicknl] - [#&#8203;170052]) ([overkiz docs])
- Fix tilt controls for TiltOnlyVenetianBlind in Overkiz ([@&#8203;iMicknl] - [#&#8203;170055]) ([overkiz docs])
- Fix cover controls for UpDownBioclimaticPergola in Overkiz ([@&#8203;iMicknl] - [#&#8203;170058]) ([overkiz docs])
- Bump pyOverkiz to 1.20.3 ([@&#8203;iMicknl] - [#&#8203;170060]) ([overkiz docs]) (dependency)
- Bump deebot-client to 18.3.0 ([@&#8203;edenhaus] - [#&#8203;170066]) ([ecovacs docs]) (dependency)
- Set `is_closed` state to `None` when a cover state returns "unknown" in Overkiz ([@&#8203;iMicknl] - [#&#8203;170081]) ([overkiz docs])
- Fix sensors getting wrong unit from MeasuredValueType attribute in Overkiz ([@&#8203;iMicknl] - [#&#8203;170088]) ([overkiz docs])
- Fix Z-Wave discovery crash with unknown node firmware version ([@&#8203;TheJulianJES] - [#&#8203;170090]) ([zwave\_js docs][zwave_js docs])
- Bump ZHA to 1.3.1 ([@&#8203;TheJulianJES] - [#&#8203;170095]) ([zha docs]) (dependency)
- Bump python-bsblan to 5.2.1 ([@&#8203;liudger] - [#&#8203;170100]) ([bsblan docs]) (dependency)
- Bump blebox\_uniapi to v2.5.3 ([@&#8203;bkobus-bbx] - [#&#8203;170115]) ([blebox docs]) (dependency)
- Fix is\_closed state for DynamicGate covers in Overkiz ([@&#8203;iMicknl] - [#&#8203;170130]) ([overkiz docs])
- Fix tilt support for UpDownVenetianBlind (rts:VenetianBlindRTSComponent) in Overkiz ([@&#8203;iMicknl] - [#&#8203;170047]) ([overkiz docs])

[#&#8203;166799]: home-assistant/core#166799

[#&#8203;168456]: home-assistant/core#168456

[#&#8203;169484]: home-assistant/core#169484

[#&#8203;169739]: home-assistant/core#169739

[#&#8203;169776]: home-assistant/core#169776

[#&#8203;169911]: home-assistant/core#169911

[#&#8203;169914]: home-assistant/core#169914

[#&#8203;169928]: home-assistant/core#169928

[#&#8203;169939]: home-assistant/core#169939

[#&#8203;169947]: home-assistant/core#169947

[#&#8203;169981]: home-assistant/core#169981

[#&#8203;169991]: home-assistant/core#169991

[#&#8203;170030]: home-assistant/core#170030

[#&#8203;170038]: home-assistant/core#170038

[#&#8203;170047]: home-assistant/core#170047

[#&#8203;170052]: home-assistant/core#170052

[#&#8203;170055]: home-assistant/core#170055

[#&#8203;170058]: home-assistant/core#170058

[#&#8203;170060]: home-assistant/core#170060

[#&#8203;170066]: home-assistant/core#170066

[#&#8203;170081]: home-assistant/core#170081

[#&#8203;170088]: home-assistant/core#170088

[#&#8203;170090]: home-assistant/core#170090

[#&#8203;170095]: home-assistant/core#170095

[#&#8203;170100]: home-assistant/core#170100

[#&#8203;170115]: home-assistant/core#170115

[#&#8203;170130]: home-assistant/core#170130

[@&#8203;Danielhiversen]: https://github.com/Danielhiversen

[@&#8203;Kane610]: https://github.com/Kane610

[@&#8203;TheJulianJES]: https://github.com/TheJulianJES

[@&#8203;agners]: https://github.com/agners

[@&#8203;bkobus-bbx]: https://github.com/bkobus-bbx

[@&#8203;edenhaus]: https://github.com/edenhaus

[@&#8203;elupus]: https://github.com/elupus

[@&#8203;emontnemery]: https://github.com/emontnemery

[@&#8203;frenck]: https://github.com/frenck

[@&#8203;gjohansson-ST]: https://github.com/gjohansson-ST

[@&#8203;iMicknl]: https://github.com/iMicknl

[@&#8203;jeeftor]: https://github.com/jeeftor

[@&#8203;liudger]: https://github.com/liudger

[@&#8203;mib1185]: https://github.com/mib1185

[@&#8203;puddly]: https://github.com/puddly

[@&#8203;robwasripped]: https://github.com/robwasripped

[@&#8203;ronaldvdmeer]: https://github.com/ronaldvdmeer

[@&#8203;th3spis]: https://github.com/th3spis

[acer_projector docs]: https://www.home-assistant.io/integrations/acer_projector/

[axis docs]: https://www.home-assistant.io/integrations/axis/

[blebox docs]: https://www.home-assistant.io/integrations/blebox/

[bsblan docs]: https://www.home-assistant.io/integrations/bsblan/

[duco docs]: https://www.home-assistant.io/integrations/duco/

[ecovacs docs]: https://www.home-assistant.io/integrations/ecovacs/

[fritz docs]: https://www.home-assistant.io/integrations/fritz/

[gardena_bluetooth docs]: https://www.home-assistant.io/integrations/gardena_bluetooth/

[hassio docs]: https://www.home-assistant.io/integrations/hassio/

[holiday docs]: https://www.home-assistant.io/integrations/holiday/

[husqvarna_automower_ble docs]: https://www.home-assistant.io/integrations/husqvarna_automower_ble/

[intellifire docs]: https://www.home-assistant.io/integrations/intellifire/

[overkiz docs]: https://www.home-assistant.io/integrations/overkiz/

[serial docs]: https://www.home-assistant.io/integrations/serial/

[tibber docs]: https://www.home-assistant.io/integrations/tibber/

[todo docs]: https://www.home-assistant.io/integrations/todo/

[usb docs]: https://www.home-assistant.io/integrations/usb/

[wiz docs]: https://www.home-assistant.io/integrations/wiz/

[workday docs]: https://www.home-assistant.io/integrations/workday/

[zha docs]: https://www.home-assistant.io/integrations/zha/

[zwave_js docs]: https://www.home-assistant.io/integrations/zwave_js/

</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/411
@github-actions github-actions Bot locked and limited conversation to collaborators May 9, 2026
Sign up for free to subscribe to this conversation on GitHub. Already have an account? Sign in.

Labels

bugfix cherry-picked cla-signed has-tests integration: wiz Quality Scale: No score small-pr PRs with less than 30 lines. Top 200 Integration is ranked within the top 200 by usage

Projects

None yet

Development

Successfully merging this pull request may close these issues.

5 participants