174 lines
6.6 KiB
YAML
174 lines
6.6 KiB
YAML
# Self-assessment against Home Assistant's integration quality scale
|
|
# (https://developers.home-assistant.io/docs/core/integration-quality-scale/).
|
|
#
|
|
# As a HACS custom integration this file is informational — hassfest does not
|
|
# validate it — but the assessment is kept honest and current so the gaps are
|
|
# explicit. Checked against the 52 rules in home-assistant/core
|
|
# script/hassfest/quality_scale.py (dev, 2026-09-25). The integration is a
|
|
# local, deviceless service integration (no network I/O), so the
|
|
# connectivity-related rules are exempt.
|
|
rules:
|
|
# Bronze
|
|
action-setup:
|
|
status: done
|
|
comment: Service actions are registered in async_setup (re-run only when the last entry was removed and re-added).
|
|
appropriate-polling:
|
|
status: done
|
|
comment: >
|
|
5-minute coordinator refresh for time-based status; sensor triggers are
|
|
event-driven via state_changed listeners (no polling).
|
|
brands:
|
|
status: done
|
|
comment: Registered in home-assistant/brands (custom_integrations/maintenance_supporter) as part of the HACS default-store listing.
|
|
common-modules: done
|
|
config-flow: done
|
|
config-flow-test-coverage: done
|
|
dependency-transparency:
|
|
status: done
|
|
comment: >
|
|
One runtime requirement, pypdf (open source on GitHub, released to PyPI
|
|
by its own CI), used for the full-text index of uploaded manuals.
|
|
docs-actions:
|
|
status: done
|
|
comment: services.yaml descriptors + docs/CONFIGURATION.md and docs/EXAMPLES.md.
|
|
docs-conditions:
|
|
status: done
|
|
comment: docs/FEATURES.md "Automation triggers & conditions".
|
|
docs-high-level-description: done
|
|
docs-installation-instructions: done
|
|
docs-removal-instructions:
|
|
status: done
|
|
comment: docs/TROUBLESHOOTING.md "Uninstalling".
|
|
docs-triggers:
|
|
status: done
|
|
comment: docs/FEATURES.md "Automation triggers & conditions".
|
|
entity-event-setup: done
|
|
entity-unique-id: done
|
|
has-entity-name: done
|
|
runtime-data: done
|
|
test-before-configure:
|
|
status: exempt
|
|
comment: Purely local — there is no device or service connection to test.
|
|
test-before-setup:
|
|
status: done
|
|
comment: Storage load + first coordinator refresh fail the setup cleanly.
|
|
unique-config-entry:
|
|
status: done
|
|
comment: Stable unique_id per object entry plus a singleton global entry.
|
|
|
|
# Silver
|
|
action-exceptions:
|
|
status: done
|
|
comment: Services raise ServiceValidationError / HomeAssistantError.
|
|
config-entry-unloading: done
|
|
docs-configuration-parameters:
|
|
status: done
|
|
comment: docs/CONFIGURATION.md documents every parameter.
|
|
docs-installation-parameters: done
|
|
entity-unavailable: done
|
|
integration-owner: done
|
|
log-when-unavailable:
|
|
status: done
|
|
comment: >
|
|
Missing/unavailable trigger entities are logged with a grace period and
|
|
surfaced as repair issues.
|
|
parallel-updates:
|
|
status: done
|
|
comment: PARALLEL_UPDATES = 0 in all five platforms (sensor, binary_sensor, button, calendar, todo).
|
|
reauthentication-flow:
|
|
status: exempt
|
|
comment: No authentication of any kind.
|
|
test-coverage:
|
|
status: done
|
|
comment: CI enforces >= 98% coverage (--cov-fail-under=98) over 4,300+ backend tests, plus ~900 frontend tests.
|
|
|
|
# Gold
|
|
devices:
|
|
status: done
|
|
comment: Every maintenance object is a device grouping its task entities.
|
|
diagnostics:
|
|
status: done
|
|
comment: Config-entry diagnostics with PII redaction.
|
|
discovery:
|
|
status: exempt
|
|
comment: Objects are user-defined; there is nothing on the network to discover.
|
|
discovery-update-info:
|
|
status: exempt
|
|
comment: No discovery.
|
|
docs-data-update:
|
|
status: done
|
|
comment: docs/FEATURES.md "Data Updates".
|
|
docs-examples: done
|
|
docs-known-limitations: done
|
|
docs-supported-devices:
|
|
status: done
|
|
comment: >
|
|
Objects model arbitrary real-world equipment (94 object templates); the
|
|
devices whose sensors drive tasks automatically are listed in
|
|
docs/INTEGRATIONS.md, generated from the suggested-setups catalog
|
|
(197 integrations) so it cannot drift.
|
|
docs-supported-functions: done
|
|
docs-troubleshooting: done
|
|
docs-use-cases: done
|
|
dynamic-devices:
|
|
status: done
|
|
comment: >
|
|
Objects/tasks created at runtime (panel, WS, services, import) get their
|
|
device + entities immediately via entry setup/reload.
|
|
entity-category:
|
|
status: done
|
|
comment: >
|
|
The document-storage sensor (integration self-information) is
|
|
diagnostic. Task sensors, buttons, the per-task next-due / days-until
|
|
sensors and the summary sensors are the maintenance data itself and
|
|
stay primary on purpose — they feed dashboards, gauges and voice.
|
|
entity-device-class:
|
|
status: done
|
|
comment: ENUM task sensors, TIMESTAMP next-due, DATA_SIZE storage, problem binary sensors.
|
|
entity-disabled-by-default:
|
|
status: done
|
|
comment: The per-task next-due timestamp and days-until-due sensors are registry-disabled by default.
|
|
entity-translations:
|
|
status: done
|
|
comment: translation_key everywhere; 22 languages with enforced key, placeholder and value parity.
|
|
exception-translations:
|
|
status: done
|
|
comment: >
|
|
Every user-facing raise carries translation_domain/translation_key with
|
|
the message in strings.json and all 21 translations; the only untranslated
|
|
raises are internal codes the WebSocket layer maps to its own error codes.
|
|
Tripwired by tests/test_exception_translations.py.
|
|
icon-translations: done
|
|
reconfiguration-flow:
|
|
status: exempt
|
|
comment: >
|
|
Nothing is fixed at setup time — every setting is editable via the
|
|
options flow or the panel settings, so a dedicated reconfigure step
|
|
would duplicate them.
|
|
repair-issues:
|
|
status: done
|
|
comment: >
|
|
Missing trigger entities, orphaned operator ids, storage hygiene, and
|
|
notify-service problems all raise (partly fixable) repair issues.
|
|
stale-devices:
|
|
status: done
|
|
comment: Deleting an object removes its device; task deletion cleans its entities.
|
|
|
|
# Platinum
|
|
async-dependency:
|
|
status: exempt
|
|
comment: >
|
|
The only dependency, pypdf, is a local PDF parser — it talks to no device
|
|
or service. Its CPU-bound extraction runs in the executor, so it never
|
|
blocks the event loop.
|
|
inject-websession:
|
|
status: exempt
|
|
comment: No HTTP client is used.
|
|
strict-typing:
|
|
status: done
|
|
comment: >
|
|
mypy --strict over the whole component is a blocking CI gate — the
|
|
websocket package included (its blanket ignore_errors exemption was
|
|
removed; only homeassistant.components.websocket_api gets
|
|
implicit_reexport, because HA re-exports its decorators without __all__).
|