From a2fa2b7858e2bf03fe6b047e8a8a077d47ac618f Mon Sep 17 00:00:00 2001 From: David Knowles Date: Thu, 6 Aug 2026 01:54:28 -0400 Subject: [PATCH] Add quality_scale.yaml for Schlage (#178300) Co-authored-by: Claude Opus 5 --- .../components/schlage/quality_scale.yaml | 104 ++++++++++++++++++ homeassistant/components/schlage/strings.json | 11 ++ script/hassfest/quality_scale.py | 1 - 3 files changed, 115 insertions(+), 1 deletion(-) create mode 100644 homeassistant/components/schlage/quality_scale.yaml diff --git a/homeassistant/components/schlage/quality_scale.yaml b/homeassistant/components/schlage/quality_scale.yaml new file mode 100644 index 000000000000..9e3f36483137 --- /dev/null +++ b/homeassistant/components/schlage/quality_scale.yaml @@ -0,0 +1,104 @@ +rules: + # Bronze + action-setup: done + appropriate-polling: done + brands: done + common-modules: done + config-flow-test-coverage: + status: todo + comment: | + The error paths do not recover to a created config entry, and the unique + ID is not asserted in the user flow test. + config-flow: done + dependency-transparency: done + docs-actions: done + docs-conditions: + status: exempt + comment: This integration does not have any conditions. + docs-high-level-description: + status: todo + comment: | + The description does not explain what Schlage is or link to the + manufacturer. + docs-installation-instructions: done + docs-removal-instructions: done + docs-triggers: + status: exempt + comment: This integration does not have any triggers. + entity-event-setup: + status: exempt + comment: | + The Schlage cloud API is polled; entities do not subscribe to events. + entity-unique-id: done + has-entity-name: done + runtime-data: done + test-before-configure: done + test-before-setup: done + unique-config-entry: done + + # Silver + action-exceptions: + status: todo + comment: | + The lock, switch, and select platform actions do not translate pyschlage + failures into HomeAssistantError. + config-entry-unloading: done + docs-configuration-parameters: + status: exempt + comment: This integration does not have an options flow. + docs-installation-parameters: todo + entity-unavailable: done + integration-owner: done + log-when-unavailable: done + parallel-updates: todo + reauthentication-flow: done + test-coverage: done + + # Gold + devices: done + diagnostics: done + discovery-update-info: + status: exempt + comment: | + Locks are reached exclusively through the Schlage cloud API and have no + discoverable presence on the local network. + discovery: + status: exempt + comment: | + Locks are enumerated from the user's Schlage cloud account. They do not + announce themselves over mDNS or SSDP and expose no local network + service to match against. + docs-data-update: done + docs-examples: todo + docs-known-limitations: todo + docs-supported-devices: todo + docs-supported-functions: todo + docs-troubleshooting: todo + docs-use-cases: todo + dynamic-devices: done + entity-category: done + entity-device-class: done + entity-disabled-by-default: + status: exempt + comment: | + Every entity maps to a lock feature a user is expected to want. + entity-translations: + status: todo + comment: Switch names are not sentence cased. + exception-translations: done + icon-translations: done + reconfiguration-flow: todo + repair-issues: + status: exempt + comment: | + Authentication failures are handled by the reauthentication flow; there + are no other user-actionable conditions to repair. + stale-devices: done + # Platinum + async-dependency: + status: todo + comment: pyschlage is a synchronous library built on requests. + inject-websession: + status: todo + comment: pyschlage is a synchronous library built on requests. + strict-typing: done diff --git a/homeassistant/components/schlage/strings.json b/homeassistant/components/schlage/strings.json index 9cadcc0b7bee..f803a4fa5c9a 100644 --- a/homeassistant/components/schlage/strings.json +++ b/homeassistant/components/schlage/strings.json @@ -1,4 +1,8 @@ { + "common": { + "data_description_password": "The password of your Schlage account.", + "data_description_username": "The email address of your Schlage account." + }, "config": { "abort": { "already_configured": "[%key:common::config_flow::abort::already_configured_device%]", @@ -14,6 +18,9 @@ "data": { "password": "[%key:common::config_flow::data::password%]" }, + "data_description": { + "password": "[%key:component::schlage::common::data_description_password%]" + }, "description": "The Schlage integration needs to re-authenticate your account", "title": "[%key:common::config_flow::title::reauth%]" }, @@ -21,6 +28,10 @@ "data": { "password": "[%key:common::config_flow::data::password%]", "username": "[%key:common::config_flow::data::username%]" + }, + "data_description": { + "password": "[%key:component::schlage::common::data_description_password%]", + "username": "[%key:component::schlage::common::data_description_username%]" } } } diff --git a/script/hassfest/quality_scale.py b/script/hassfest/quality_scale.py index 82a3f3ac4da0..613b802ccc8b 100644 --- a/script/hassfest/quality_scale.py +++ b/script/hassfest/quality_scale.py @@ -786,7 +786,6 @@ INTEGRATIONS_WITHOUT_QUALITY_SCALE_FILE = [ "rympro", "saj", "sanix", - "schlage", "schluter", "scrape", "screenlogic",