Skip to content

Fix Z-Wave discovery crash with unknown node firmware version#170090

Merged
MartinHjelmare merged 2 commits into
home-assistant:devfrom
TheJulianJES:tjj/fix-zwave-js-firmware-version-none
May 8, 2026
Merged

Fix Z-Wave discovery crash with unknown node firmware version#170090
MartinHjelmare merged 2 commits into
home-assistant:devfrom
TheJulianJES:tjj/fix-zwave-js-firmware-version-none

Conversation

@TheJulianJES
Copy link
Copy Markdown
Member

@TheJulianJES TheJulianJES commented May 8, 2026

Proposed change

This fixes an issue (#169932) where the Z-Wave JS integration does not start if a "Fibaro FGMS001" motion sensor is part of the network but has no known firmware version. The issue is partly caused by this recent PR:

This PR fixes the issue by skipping the version comparison if the device's firmware version is not known.
A regression test is also added.

Explanation / AI summary

When a node has not reported its firmware version yet, value.node.firmware_version is None. Comparing AwesomeVersion(None) (an unknown-strategy version) to a schema's min_ver/max_ver raises AwesomeVersionCompareException, which aborts setup of the whole zwave_js entry.

This was not noticed until #169276 added the first schema using FirmwareVersionRange(max="2.8") for the Fibaro FGMS001 motion sensor. Users with FGMS001 sensors where the firmware version is unknown (for whatever reason) hit the crash on every setup after upgrading to 2026.5.0.

To fix this, we now skip schemas with a firmware_version_range when the node's firmware version is not known. If a device is re-interviewed, discovery will run again, and the entity for that schema may be discovered.

(cc @AlCalzone)

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

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:

When a node has not reported its firmware version yet,
`value.node.firmware_version` is `None`. Comparing
`AwesomeVersion(None)` (an unknown-strategy version) to a schema's
`min_ver`/`max_ver` raises `AwesomeVersionCompareException`, which
aborts setup of the whole `zwave_js` entry.

This was latent until home-assistant#169276 added the first schema using
`FirmwareVersionRange(max="2.8")` for the Fibaro FGMS001 motion
sensor; users with FGMS001 sensors that had not been re-interviewed
hit the crash on every setup after upgrading to 2026.5.0.

Skip schemas with a `firmware_version_range` when the node's firmware
version is not known; discovery re-runs after a re-interview.
Covers the FGMS001 case where the node has not reported a firmware
version yet: setup must complete and the firmware-range-gated motion
sensor schema must be skipped (instead of crashing with
AwesomeVersionCompareException).
@TheJulianJES TheJulianJES added this to the 2026.5.1 milestone May 8, 2026
Copilot AI review requested due to automatic review settings May 8, 2026 08:11
@home-assistant home-assistant Bot added bugfix cla-signed has-tests integration: zwave_js small-pr PRs with less than 30 lines. Top 100 Integration is ranked within the top 100 by usage Top 200 Integration is ranked within the top 200 by usage by-code-owner Quality Scale: No score labels May 8, 2026
@home-assistant
Copy link
Copy Markdown
Contributor

home-assistant Bot commented May 8, 2026

Hey there @home-assistant/z-wave, mind taking a look at this pull request as it has been labeled with an integration (zwave_js) you are listed as a code owner for? Thanks!

Code owner commands

Code owners of zwave_js 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 zwave_js 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 pull request fixes a Z-Wave JS discovery crash during config entry setup when a node’s firmware version is unknown (None) and a discovery schema specifies a firmware_version_range.

Changes:

  • Skip schemas with firmware_version_range when value.node.firmware_version is None to avoid AwesomeVersionCompareException during discovery.
  • Add a regression test ensuring setup completes with a Fibaro FGMS001 node that has no reported firmware version.
  • Add a test fixture variant of the FGMS001 node state without firmwareVersion.

Reviewed changes

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

File Description
homeassistant/components/zwave_js/discovery.py Avoids comparing firmware ranges against unknown/None node firmware during discovery.
tests/components/zwave_js/conftest.py Adds a fixture that removes firmwareVersion from the FGMS001 v2.8 node state.
tests/components/zwave_js/test_discovery.py Adds a regression test that asserts the config entry remains loaded when FGMS001 firmware is unknown.

Copy link
Copy Markdown
Member

@MartinHjelmare MartinHjelmare left a comment

Choose a reason for hiding this comment

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

Thanks!

@TheJulianJES TheJulianJES marked this pull request as ready for review May 8, 2026 08:17
@TheJulianJES TheJulianJES requested a review from a team as a code owner May 8, 2026 08:17
@MartinHjelmare
Copy link
Copy Markdown
Member

MartinHjelmare commented May 8, 2026

The codecov coverage diff looks weird. I don't trust it. Let's merge.

@MartinHjelmare MartinHjelmare merged commit 526ddc4 into home-assistant:dev May 8, 2026
36 of 37 checks passed
@TheJulianJES
Copy link
Copy Markdown
Member Author

TheJulianJES commented May 8, 2026

I just looked at it briefly and that continue was already uncovered by tests before. There seem to be no tests for min/max firmware discovery where the schema is skipped (and the firmware version known). We should probably add them in a future PR, but it was only marked here because the indentation changed (from one big if block to two nested ones).

@AlCalzone
Copy link
Copy Markdown
Contributor

Thanks!

@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 by-code-owner cherry-picked cla-signed has-tests integration: zwave_js Quality Scale: No score small-pr PRs with less than 30 lines. Top 100 Integration is ranked within the top 100 by usage Top 200 Integration is ranked within the top 200 by usage

Projects

None yet

Development

Successfully merging this pull request may close these issues.

AwesomeVersionCompareException in Z-Wave after 2026.5.0

5 participants