{"record":{"id":"848717ca0e919299","repo":"home-assistant/core","slug":"invalid-credentials-ex","errorCode":null,"errorMessage":"Invalid credentials: {ex}","messagePattern":"Invalid credentials: (.+?)","errorType":"exception","errorClass":"ConfigEntryAuthFailed","httpStatus":null,"severity":"error","filePath":"homeassistant/components/abode/__init__.py","lineNumber":98,"sourceCode":"    password = entry.data[CONF_PASSWORD]\n    polling = entry.data[CONF_POLLING]\n\n    # Configure abode library to use config directory for storing data\n    jaraco.abode.config.paths.override(user_data=Path(hass.config.path(\"Abode\")))\n\n    # For previous config entries where unique_id is None\n    if entry.unique_id is None:\n        hass.config_entries.async_update_entry(\n            entry, unique_id=entry.data[CONF_USERNAME]\n        )\n\n    try:\n        abode = await hass.async_add_executor_job(\n            Abode, username, password, True, True, True\n        )\n\n    except AbodeAuthenticationException as ex:\n        raise ConfigEntryAuthFailed(f\"Invalid credentials: {ex}\") from ex\n\n    except (AbodeException, ConnectTimeout, HTTPError) as ex:\n        raise ConfigEntryNotReady(f\"Unable to connect to Abode: {ex}\") from ex\n\n    entry.runtime_data = AbodeSystem(abode, polling)\n\n    await hass.config_entries.async_forward_entry_setups(entry, PLATFORMS)\n\n    await setup_hass_events(hass, entry)\n    await hass.async_add_executor_job(setup_abode_events, hass, entry)\n\n    return True\n\n\ndef _shutdown_client(abode: Abode) -> None:\n    \"\"\"Shutdown client.\"\"\"\n    abode.events.stop()\n    abode.logout()","sourceCodeStart":80,"sourceCodeEnd":116,"githubUrl":"https://github.com/home-assistant/core/blob/58a3fdb3ea0538617f0a07efcfba6294de64fd59/homeassistant/components/abode/__init__.py#L80-L116","documentation":"Wrapped as ConfigEntryAuthFailed when the Abode library raises AbodeAuthenticationException during setup (the Abode(...) constructor run in an executor). It tells Home Assistant the stored credentials are rejected and starts the re-auth flow instead of retrying setup.","triggerScenarios":"async_setup_entry constructs Abode(username, password, ...) and Abode's login fails with AbodeAuthenticationException — bad password, revoked session, or MFA-required state.","commonSituations":"Password changed on the Abode account after the config entry was created; account locked; the stored username (used as unique_id) belongs to a deleted account.","solutions":["Open the integration entry and complete the reconfigure/re-auth flow with current credentials","Verify the Abode username/password by logging in to the Abode web app","If the account uses MFA, satisfy it in the Abode app first, then re-authenticate the integration"],"exampleFix":null,"handlingStrategy":"try-catch","validationCode":null,"typeGuard":null,"tryCatchPattern":"from homeassistant.exceptions import ConfigEntryAuthFailed\nfrom jaraco.abode.exceptions import AbodeAuthenticationException\n\ntry:\n    abode = await hass.async_add_executor_job(Abode, user, pw, True, True, True)\nexcept AbodeAuthenticationException as ex:\n    raise ConfigEntryAuthFailed(f\"Invalid credentials: {ex}\") from ex","preventionTips":["Implement async_reconfigure/reauth so users can fix credentials without deleting the entry","Only map genuine credential failures to ConfigEntryAuthFailed","Chain the original exception for diagnostics"],"tags":["config-entry","auth","abode","integration-setup"],"backgroundTag":null,"analyzedSha":"58a3fdb3ea0538617f0a07efcfba6294de64fd59","analyzedAt":"2026-08-14T20:54:38.818Z","schemaVersion":2},"datasetVersion":"2026-08-15T22:17:37.221Z"}