home-assistant-best-practices

Best practices for Home Assistant automations, helpers, scripts, device controls, and Lovelace dashboard configuration. TRIGGER THIS SKILL WHEN: - Creating or editing HA automations, scripts, or scenes - Choosing between template sensors and built-in helpers - Writing or restructuring triggers, conditions, or automation modes - Setting up Zigbee button/remote automations (ZHA or Zigbee2MQTT) - Renaming entities or migrating device_id references to entity_id - Configuring Lovelace dashboard cards and selecting the right sensor or helper to feed them SYMPTOMS THAT TRIGGER THIS SKILL: - Agent uses Jinja2 templates where native conditions, triggers, or helpers exist - Agent uses device_id instead of entity_id in triggers/actions - Agent modifies entity IDs or config objects without checking all consumers - Agent chooses wrong automation mode (e.g., single for motion lights) - Agent hard-codes min/max values or picks a raw sensor when a derived helper is more appropriate for a dashboard card

Safety Notice

This listing is imported from skills.sh public index metadata. Review upstream SKILL.md and repository scripts before running.

Copy this and send it to your AI assistant to learn

Install skill "home-assistant-best-practices" with this command: npx skills add homeassistant-ai/skills/homeassistant-ai-skills-home-assistant-best-practices

Home Assistant Best Practices

Core principle: Use native Home Assistant constructs wherever possible. Templates bypass validation, fail silently at runtime, and make debugging opaque.

Decision Workflow

Follow this sequence when creating any automation:

0. Gate: modifying existing config?

If your change affects entity IDs or cross-component references — renaming entities, replacing template sensors with helpers, converting device triggers, or restructuring automations — read references/safe-refactoring.md first. That reference covers impact analysis, device-sibling discovery, and post-change verification. Complete its workflow before proceeding.

Steps 1-5 below apply to new config or pattern evaluation.

1. Check for native condition/trigger

Before writing any template, check references/automation-patterns.md for native alternatives.

Common substitutions:

  • {{ states('x') | float > 25 }}numeric_state condition with above: 25
  • {{ is_state('x', 'on') and is_state('y', 'on') }}condition: and with state conditions
  • {{ now().hour >= 9 }}condition: time with after: "09:00:00"
  • wait_template: "{{ is_state(...) }}"wait_for_trigger with state trigger (caveat: different behavior when state is already true — see references/safe-refactoring.md#trigger-restructuring)

2. Check for built-in helper or Template Helper

Before creating a template sensor, check references/helper-selection.md.

Common substitutions:

  • Sum/average multiple sensors → min_max integration
  • Binary any-on/all-on logic → group helper
  • Rate of change → derivative integration
  • Cross threshold detection → threshold integration
  • Consumption tracking → utility_meter helper

If no built-in helper fits, use a Template Helper — not YAML. Create it via the HA config flow (MCP tool or API) or via the UI: Settings → Devices & Services → Helpers → Create Helper → Template. Only write template: YAML if explicitly requested or if neither path is available.

3. Select correct automation mode

Default single mode is often wrong. See references/automation-patterns.md#automation-modes.

ScenarioMode
Motion light with timeoutrestart
Sequential processing (door locks)queued
Independent per-entity actionsparallel
One-shot notificationssingle

4. Use entity_id over device_id

device_id breaks when devices are re-added. See references/device-control.md.

Exception: Zigbee2MQTT autodiscovered device triggers are acceptable.

5. For Zigbee buttons/remotes

  • ZHA: Use event trigger with device_ieee (persistent)
  • Z2M: Use device trigger (autodiscovered) or mqtt trigger

See references/device-control.md#zigbee-buttonremote-patterns.


Critical Anti-Patterns

Anti-patternUse insteadWhyReference
condition: template with float > 25condition: numeric_stateValidated at load, not runtimereferences/automation-patterns.md#native-conditions
wait_template: "{{ is_state(...) }}"wait_for_trigger with state triggerEvent-driven, not polling; waits for change (see references/safe-refactoring.md#trigger-restructuring for semantic differences)references/automation-patterns.md#wait-actions
device_id in triggersentity_id (or device_ieee for ZHA)device_id breaks on re-addreferences/device-control.md#entity-id-vs-device-id
mode: single for motion lightsmode: restartRe-triggers must reset the timerreferences/automation-patterns.md#automation-modes
Template sensor for sum/meanmin_max helperDeclarative, handles unavailable statesreferences/helper-selection.md#numeric-aggregation
Template binary sensor with thresholdthreshold helperBuilt-in hysteresis supportreferences/helper-selection.md#threshold
Renaming entity IDs without impact analysisFollow references/safe-refactoring.md workflowRenames break dashboards, scripts, and scenes silentlyreferences/safe-refactoring.md#entity-renames
template: sensor/binary sensor in YAMLTemplate Helper (UI or config flow API)Requires file edit and config reload; harder to managereferences/template-guidelines.md

Reference Files

Read these when you need detailed information:

FileWhen to readKey sections
references/safe-refactoring.mdRenaming entities, replacing helpers, restructuring automations, or any modification to existing config#universal-workflow, #entity-renames, #helper-replacements, #trigger-restructuring
references/automation-patterns.mdWriting triggers, conditions, waits, or choosing automation modes#native-conditions, #trigger-types, #wait-actions, #automation-modes, #ifthen-vs-choose, #trigger-ids
references/helper-selection.mdDeciding whether to use a built-in helper vs template sensor#numeric-aggregation, #rate-and-change, #time-based-tracking, #counting-and-timing, #scheduling, #entity-grouping, #decision-matrix
references/template-guidelines.mdConfirming templates ARE appropriate for a use case#when-templates-are-appropriate, #when-to-avoid-templates, #template-sensor-best-practices, #common-patterns, #error-handling
references/device-control.mdWriting service calls, Zigbee button automations, or using target:#entity-id-vs-device-id, #service-calls-best-practices, #zigbee-buttonremote-patterns, #domain-specific-patterns
references/examples.yamlNeed compound examples combining multiple best practices

Source Transparency

This detail page is rendered from real SKILL.md content. Trust labels are metadata-based hints, not a safety guarantee.

Related Skills

Related by shared tags or category signals.

Coding

frontend-design

Create distinctive, production-grade frontend interfaces with high design quality. Use this skill when the user asks to build web components, pages, artifacts, posters, or applications (examples include websites, landing pages, dashboards, React components, HTML/CSS layouts, or when styling/beautifying any web UI). Generates creative, polished code and UI design that avoids generic AI aesthetics.

Repository SourceNeeds Review
161.1K94.2Kanthropics
Coding

remotion-best-practices

Use this skills whenever you are dealing with Remotion code to obtain the domain-specific knowledge.

Repository SourceNeeds Review
148.4K2.1Kremotion-dev
Coding

azure-deploy

AUTHORITATIVE GUIDANCE — MANDATORY COMPLIANCE

Repository SourceNeeds Review
136.1K155microsoft
Coding

azure-storage

Azure Storage Services

Repository SourceNeeds Review
136.1K155microsoft