Agent Skills
› home-assistant/core
› ha-integration-knowledge
ha-integration-knowledge
GitHub提供 Home Assistant 集成开发、测试与代码审查的完整指南,涵盖文件结构、通用规范及实体平台细节,确保集成质量。
触发场景
开发或审查 Home Assistant 集成代码
查询 HA 集成开发最佳实践
安装
npx skills add home-assistant/core --skill ha-integration-knowledge -g -y
SKILL.md
Frontmatter
{
"name": "ha-integration-knowledge",
"description": "Everything you need to know to build, test and review Home Assistant Integrations. If you're looking at an integration, you must use this as your primary reference."
}
File Locations
- Integration code:
./homeassistant/components/<integration_domain>/ - Integration tests:
./tests/components/<integration_domain>/
General guidelines
- When looking for examples, prefer integrations with the platinum or gold quality scale level first.
- Polling intervals are NOT user-configurable. Never add scan_interval, update_interval, or polling frequency options to config flows or config entries.
- Do NOT allow users to set config entry names in config flows. Names are automatically generated or can be customized later in UI. Exception: helper integrations may allow custom names.
- For entity actions and entity services, avoid requesting redundant defensive checks for fields already enforced by Home Assistant validation schemas and entity filters; only request extra guards when values bypass validation or are transformed unsafely.
- When validation guarantees a key is present, prefer direct dictionary indexing (
data["key"]) over.get("key")so invalid assumptions fail fast. - Integrations should be thin wrappers. Protocol parsing, device state machines, or other domain logic belong in a separate PyPI library, not in the integration itself. If unsure, ask before inlining.
- Integrations should not implement fixes or workarounds for limitations in libraries. Instead, the library should be updated to fix the issue.
- Do not add entities for data that Home Assistant intentionally only exposes through an action, for example weather forecasts (
weather.get_forecasts). - In config flows, map known failures to the matching standard error (for example
invalid_auth,cannot_connect) without logging them. If unexpected exceptions are caught, log them with_LOGGER.exception()and map them tounknown. Do not mix translated and untranslated text in an error shown to the user. - Bump dependencies in a standalone PR that contains only the compatibility adjustments the bump requires. Features that need the new version go in a follow-up PR.
The following platforms have extra guidelines:
- Device tracker:
platform-device-tracker.mdfor replacing legacy device trackers - Diagnostics:
platform-diagnostics.mdfor diagnostic data collection - Repairs:
platform-repairs.mdfor user-actionable repair issues
Entity platforms
- Ensure
async_added_to_hass()andasync_will_remove_from_hass()have symmetrical behavior. For example, if a subscription is created inasync_added_to_hass(), it should be unsubscribed inasync_will_remove_from_hass(). Also, if something is torn down inasync_will_remove_from_hass(), it should be set up inasync_added_to_hass(). - Use
_attr_*attributes instead of properties for values that never change. Define them as class attributes only when the value is shared by all instances. - When overriding
available, combine it with the parent's value (return super().available and ...). - Entity base class (e.g.
SensorEntity,TrackerEntity) provide a stable API for child classes to inherit from. Do not suggest redeclaring or duplicating attributes, properties, or methods the base class already provides, and do not add guards against the parent's behavior changing — rely on the base class instead.
Actions
- Action names and action fields are defined in
<Prefix>Serviceand<Prefix>ServiceArgumentStrEnums, using the integration's usual class prefix (for exampleTadoService,AITaskServiceArgument). Integrations define them inservices.py, or inconst.pywhen other modules need them; entity platforms define them inconst.pyand export them. - The members cover the registered actions and their fields as listed in
services.yaml. Do not add members for actions that are not registered, such as staleservices.yamlentries or description templates for legacy per-platform actions. - Use the members for action registration, schema keys and
call.datalookups instead of raw strings or other string constants (whatever their prefix, for exampleSERVICE_*,ATTR_*orCONF_*). Shared selector fields such asconfig_entry_id,device_idandentity_idkeep using thehomeassistant.constconstants. - Only request these enums, as a blocking change, when a PR adds an integration's first actions (a new
services.yaml). Do not flag or suggest them for an integration that already has actions.
Integration Quality Scale
- When validating the quality scale rules, check them at https://contributors.home-assistant.io/core/quality-scale/rules/
- When implementing or reviewing an integration, always consider the quality scale rules, since they promote best practices.
Template scale file: ./script/scaffold/templates/integration/integration/quality_scale.yaml
How Rules Apply
- Check
manifest.json: Look for"quality_scale"key to determine integration level - Bronze Rules: Always required for any integration with quality scale
- Higher Tier Rules: Only apply if integration targets that tier or higher
- Rule Status: Check
quality_scale.yamlin integration folder for:done: Rule implementedexempt: Rule doesn't apply (with reason in comment)todo: Rule needs implementation
Testing Requirements
- Tests should avoid interacting or mocking internal integration details. For more info, see https://contributors.home-assistant.io/core/development/tests/#test-through-home-assistant
- Define shared mocks as fixtures in
conftest.pyso every platform test can reuse them, including amock_config_entry. Give it aunique_idwhen the integration's config entries have one. - Load substantial or reused mock API data from JSON fixture files with
load_json_object_fixtureorload_json_array_fixturefrompytest_homeassistant.common(or theirasync_variants) instead of building it inline withjson.dumps(). - Do not manually assert values that a snapshot test already covers.
- When a
Platformmember or anATTR_*constant exists for a value, use it instead of a string literal. - Patch objects where they are used, not where they are defined.
- To give one test different mock data, parametrize the fixture that provides it with
pytest.mark.parametrizeinstead of patching again inside the test. Useindirect=Truewhen the fixture reads the value fromrequest.param.
版本历史
-
779c7a7
当前 2026-11-03 04:20
新增 legacy device tracker 迁移指南,补充 action enum 指导,修复行尾符并整合 PR 评审反馈。
-
8760410
2026-10-19 11:22
更新链接至新的贡献者网站 (#186884)
- 702a9cb 2026-07-25 09:22


