Skip to content

v1.7.x regression: Dyson HP1 527M fails to connect locally because model variant letter is dropped (mapped as 527), causing timeouts #288

@iFixRobots

Description

@iFixRobots

After updating to v1.7.x of the HACS Dyson integration, my Dyson HP1 model that identifies as 527M no longer connects locally. The integration appears to treat the device as 527 without the M variant. This selects the wrong device profile and the library never receives the first MQTT payload. Result is a connection timeout. Rolling back the integration to v1.6.0 or below restores local control.

Possibly related to: #282

Impacted models
• Dyson HP1 variant 527M
• Likely other models where the product type includes a variant letter (M, E, K, etc.)

Symptoms
• Device works in MyDyson app and Google Home (cloud)
• Home Assistant with dyson_local fails to connect locally and disables the device or the automation that references it

Logs

ERROR (MainThread) [libdyson.dyson_device] Failed to receive first data from device
ERROR (MainThread) [custom_components.dyson_local.config_flow] Failed to connect to device serial=X3V-US-SGC1934A, device_type=527, host=192.168.0.249: DysonConnectTimeout ()

Note the device_type=527. The physical device reports as 527M.

Steps to reproduce
1. Update the HACS Dyson integration to v1.7.x
2. Set up a Dyson HP1 that reports product_type 527 and variant M
3. Restart Home Assistant or reload the integration
4. Observe connection attempt logs and timeout

Workarounds
• Downgrade the HACS integration to v1.6.0 (or earlier). Local control works again.
• Power cycling the fan does not fix the regression on v1.7.x.

Root cause hypothesis
During the v1.7.x refactor that changed model mapping and library usage, the code path that builds the device type stops carrying the variant letter. In practice, something like product_type="527" and variant="M" becomes device_type="527", which breaks model selection.

Proposed fix
Ensure the full type string is passed through whenever the device is constructed or mapped. Example sketch:

# Pseudocode illustrating the fix
product_type = device_info.product_type  # e.g. "527"
variant = getattr(device_info, "variant", "")  # e.g. "M"
full_type = f"{product_type}{variant}" if variant else product_type

# Pass full_type everywhere the device type is used to select the model
device = get_device(full_type)

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions