Proper handling of malformed data during FRITZ!Box Tools setup#170030
Conversation
|
Hey there @AaronDavidSchneider, @chemelli74, 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
This PR improves robustness of the AVM FRITZ!Box Tools integration by handling malformed XML returned during get_device_info() at setup time, surfacing a translated, user-actionable error instead of failing setup with an unhandled parsing exception.
Changes:
- Catch
xml.etree.ElementTree.ParseErrorduring coordinator setup and raiseConfigEntryNotReadywith a translated reason key. - Add an
exceptionstranslation message (error_parse_device_info) instructing the user how to remediate the issue. - Add a regression test ensuring setup enters
SETUP_RETRYand exposes the correct translation key when a parse error occurs.
Reviewed changes
Copilot reviewed 3 out of 3 changed files in this pull request and generated no comments.
| File | Description |
|---|---|
homeassistant/components/fritz/coordinator.py |
Wraps device-info fetch in a ParseError handler and maps it to a translated ConfigEntryNotReady retry reason. |
homeassistant/components/fritz/strings.json |
Adds a new exception translation string for the parse-error setup failure. |
tests/components/fritz/test_init.py |
Adds coverage verifying setup retry + correct translation key when device-info parsing fails. |
| "message": "Failed to perform action \"{service}\". Config entry for target not found" | ||
| }, | ||
| "error_parse_device_info": { | ||
| "message": "Error parsing device info. Please check the system event log of your FRITZ!Box for malformed data and clear the event list." |
There was a problem hiding this comment.
would a user recognize malformed data?
There was a problem hiding this comment.
the malformed data would look like:
26.08.25 01:28:49 IPv6-Präfix konnte nicht bezogen werden, Fehlergrund: 0 (��m1�m��m�o�m�a���a���Y�m���l�)
but even the user wouldn't recognize it in the first place, the instruction says "...and clear the event list" which will finally resolve the issue
|
I would go as far as creating a repair issue for such scenario. |
…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 ([@​th3spis] - [#​166799]) ([wiz docs]) - Fix WiZ Light config flow timeout by properly closing UDP connections ([@​robwasripped] - [#​168456]) ([wiz docs]) - Fix IntelliFire setup recovery ([@​jeeftor] - [#​169739]) ([intellifire docs]) - Fix hassio auth IndexError on Supervisor Unix socket requests ([@​agners] - [#​169911]) ([hassio docs]) - Update gardena ble to 2.8.1 ([@​elupus] - [#​169914]) ([gardena\_bluetooth docs][gardena_bluetooth docs]) ([husqvarna\_automower\_ble docs][husqvarna_automower_ble docs]) (dependency) - Bump serialx to 1.7.1 ([@​puddly] - [#​169928]) ([serial docs]) ([acer\_projector docs][acer_projector docs]) ([usb docs]) (dependency) - Bump holidays to 0.96 ([@​gjohansson-ST] - [#​169939]) ([workday docs]) ([holiday docs]) (dependency) - Add support for options to todo triggers ([@​emontnemery] - [#​169947]) ([todo docs]) - Bump pyTibber to 0.37.5 ([@​Danielhiversen] - [#​169981]) ([tibber docs]) (dependency) - Bump python-duco-client to 0.4.0 ([@​ronaldvdmeer] - [#​169776]) ([duco docs]) (dependency) - Bump python-duco-client to 0.4.1 ([@​ronaldvdmeer] - [#​169991]) ([duco docs]) (dependency) - Proper handling of malformed data during FRITZ!Box Tools setup ([@​mib1185] - [#​170030]) ([fritz docs]) - Fix websocket certificate verification Bump axis to v70 ([@​Kane610] - [#​170038]) ([axis docs]) (dependency) - Fix `is_closed` state for DynamicGarageDoor in Overkiz ([@​iMicknl] - [#​170052]) ([overkiz docs]) - Fix tilt controls for TiltOnlyVenetianBlind in Overkiz ([@​iMicknl] - [#​170055]) ([overkiz docs]) - Fix cover controls for UpDownBioclimaticPergola in Overkiz ([@​iMicknl] - [#​170058]) ([overkiz docs]) - Bump pyOverkiz to 1.20.3 ([@​iMicknl] - [#​170060]) ([overkiz docs]) (dependency) - Bump deebot-client to 18.3.0 ([@​edenhaus] - [#​170066]) ([ecovacs docs]) (dependency) - Set `is_closed` state to `None` when a cover state returns "unknown" in Overkiz ([@​iMicknl] - [#​170081]) ([overkiz docs]) - Fix sensors getting wrong unit from MeasuredValueType attribute in Overkiz ([@​iMicknl] - [#​170088]) ([overkiz docs]) - Fix Z-Wave discovery crash with unknown node firmware version ([@​TheJulianJES] - [#​170090]) ([zwave\_js docs][zwave_js docs]) - Bump ZHA to 1.3.1 ([@​TheJulianJES] - [#​170095]) ([zha docs]) (dependency) - Bump python-bsblan to 5.2.1 ([@​liudger] - [#​170100]) ([bsblan docs]) (dependency) - Bump blebox\_uniapi to v2.5.3 ([@​bkobus-bbx] - [#​170115]) ([blebox docs]) (dependency) - Fix is\_closed state for DynamicGate covers in Overkiz ([@​iMicknl] - [#​170130]) ([overkiz docs]) - Fix tilt support for UpDownVenetianBlind (rts:VenetianBlindRTSComponent) in Overkiz ([@​iMicknl] - [#​170047]) ([overkiz docs]) [#​166799]: home-assistant/core#166799 [#​168456]: home-assistant/core#168456 [#​169484]: home-assistant/core#169484 [#​169739]: home-assistant/core#169739 [#​169776]: home-assistant/core#169776 [#​169911]: home-assistant/core#169911 [#​169914]: home-assistant/core#169914 [#​169928]: home-assistant/core#169928 [#​169939]: home-assistant/core#169939 [#​169947]: home-assistant/core#169947 [#​169981]: home-assistant/core#169981 [#​169991]: home-assistant/core#169991 [#​170030]: home-assistant/core#170030 [#​170038]: home-assistant/core#170038 [#​170047]: home-assistant/core#170047 [#​170052]: home-assistant/core#170052 [#​170055]: home-assistant/core#170055 [#​170058]: home-assistant/core#170058 [#​170060]: home-assistant/core#170060 [#​170066]: home-assistant/core#170066 [#​170081]: home-assistant/core#170081 [#​170088]: home-assistant/core#170088 [#​170090]: home-assistant/core#170090 [#​170095]: home-assistant/core#170095 [#​170100]: home-assistant/core#170100 [#​170115]: home-assistant/core#170115 [#​170130]: home-assistant/core#170130 [@​Danielhiversen]: https://github.com/Danielhiversen [@​Kane610]: https://github.com/Kane610 [@​TheJulianJES]: https://github.com/TheJulianJES [@​agners]: https://github.com/agners [@​bkobus-bbx]: https://github.com/bkobus-bbx [@​edenhaus]: https://github.com/edenhaus [@​elupus]: https://github.com/elupus [@​emontnemery]: https://github.com/emontnemery [@​frenck]: https://github.com/frenck [@​gjohansson-ST]: https://github.com/gjohansson-ST [@​iMicknl]: https://github.com/iMicknl [@​jeeftor]: https://github.com/jeeftor [@​liudger]: https://github.com/liudger [@​mib1185]: https://github.com/mib1185 [@​puddly]: https://github.com/puddly [@​robwasripped]: https://github.com/robwasripped [@​ronaldvdmeer]: https://github.com/ronaldvdmeer [@​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
Proposed change
As observed in #151241 some malformed data in the system event log of the FRITZ!Box itself can cause a parsing error, which causes the integration setup to fail. We now catch this parsing error during setup and provide the user with a proper error message. As we rely on the default retry behavior of the config entry setup, the error state will automatically be resolved after the user has delete the malformed system event logs.
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: