Back to skills
extension
Category: AI Agent CapabilitiesNo API key required

ha-configuration

Home Assistant YAML configuration management. Use when editing configuration.yaml, setting up integrations, configuring secrets, managing packages, or troubleshooting Home Assistant configuration issues. Covers core configuration patterns and best practices.

personAuthor: jakexiaohubgithub

Home Assistant Configuration

When to Use This Skill

| Use this skill when... | Use ha-automations instead when... | |------------------------|-----------------------------------| | Editing configuration.yaml | Creating automation rules | | Setting up integrations | Writing automation triggers/actions | | Managing secrets.yaml | Debugging automation logic | | Organizing with packages | Working with automation blueprints | | Troubleshooting config errors | Setting up device triggers |

Core Configuration Files

| File | Purpose | |------|---------| | configuration.yaml | Main configuration entry point | | secrets.yaml | Sensitive values (passwords, API keys, tokens) | | automations.yaml | Automation rules (usually UI-managed) | | scripts.yaml | Reusable script sequences | | scenes.yaml | Scene definitions | | customize.yaml | Entity customizations | | packages/*.yaml | Modular configuration packages |

Configuration Structure

Basic configuration.yaml

homeassistant:
  name: Home
  unit_system: metric
  time_zone: Europe/Helsinki
  currency: EUR
  country: FI

  # External files
  customize: !include customize.yaml
  packages: !include_dir_named packages/

# Core integrations
default_config:

# Text-to-speech
tts:
  - platform: google_translate

automation: !include automations.yaml
script: !include scripts.yaml
scene: !include scenes.yaml

Secrets Management

secrets.yaml:

# API keys
openweathermap_api_key: "abc123def456"
spotify_client_id: "your_client_id"
spotify_client_secret: "your_client_secret"

# Database
recorder_db_url: "postgresql://user:pass@localhost/hass"

# MQTT
mqtt_username: "homeassistant"
mqtt_password: "secure_password"

# Network
latitude: 60.1699
longitude: 24.9384

Reference in configuration.yaml:

weather:
  - platform: openweathermap
    api_key: !secret openweathermap_api_key

recorder:
  db_url: !secret recorder_db_url

Include Directives

| Directive | Description | Example | |-----------|-------------|---------| | !include | Include single file | !include automations.yaml | | !include_dir_list | Include files as list items | !include_dir_list sensors/ | | !include_dir_named | Include files as named mappings | !include_dir_named packages/ | | !include_dir_merge_list | Merge files into single list | !include_dir_merge_list automations/ | | !include_dir_merge_named | Merge files into single mapping | !include_dir_merge_named integrations/ | | !secret | Reference from secrets.yaml | !secret api_key | | !env_var | Environment variable | !env_var DB_PASSWORD |

Package Organization

Packages allow modular configuration by domain:

packages/climate.yaml:

climate_package:
  sensor:
    - platform: template
      sensors:
        average_indoor_temp:
          friendly_name: "Average Indoor Temperature"
          unit_of_measurement: "°C"
          value_template: >-
            {{ (states('sensor.living_room_temp') | float +
                states('sensor.bedroom_temp') | float) / 2 | round(1) }}

  automation:
    - alias: "Climate - AC Auto Off"
      trigger:
        - platform: numeric_state
          entity_id: sensor.average_indoor_temp
          below: 22
      action:
        - service: climate.turn_off
          target:
            entity_id: climate.living_room_ac

  script:
    climate_cool_down:
      alias: "Cool Down House"
      sequence:
        - service: climate.set_temperature
          target:
            entity_id: climate.living_room_ac
          data:
            temperature: 20
            hvac_mode: cool

packages/presence.yaml:

presence_package:
  input_boolean:
    guest_mode:
      name: "Guest Mode"
      icon: mdi:account-multiple

  binary_sensor:
    - platform: template
      sensors:
        anyone_home:
          friendly_name: "Anyone Home"
          device_class: presence
          value_template: >-
            {{ is_state('person.user1', 'home') or
               is_state('person.user2', 'home') or
               is_state('input_boolean.guest_mode', 'on') }}

Common Integration Patterns

MQTT Configuration

mqtt:
  broker: !secret mqtt_broker
  port: 1883
  username: !secret mqtt_username
  password: !secret mqtt_password
  discovery: true
  discovery_prefix: homeassistant

  sensor:
    - name: "Outdoor Temperature"
      state_topic: "sensors/outdoor/temperature"
      unit_of_measurement: "°C"
      device_class: temperature
      value_template: "{{ value_json.temperature }}"

REST Sensors

sensor:
  - platform: rest
    name: "GitHub Stars"
    resource: https://api.github.com/repos/home-assistant/core
    value_template: "{{ value_json.stargazers_count }}"
    scan_interval: 3600
    headers:
      Authorization: !secret github_token

Template Sensors

template:
  - sensor:
      - name: "Sun Elevation"
        unit_of_measurement: "°"
        state: "{{ state_attr('sun.sun', 'elevation') | round(1) }}"

      - name: "Daylight Hours"
        unit_of_measurement: "hours"
        state: >-
          {% set sunrise = as_timestamp(state_attr('sun.sun', 'next_rising')) %}
          {% set sunset = as_timestamp(state_attr('sun.sun', 'next_setting')) %}
          {{ ((sunset - sunrise) / 3600) | round(1) }}

  - binary_sensor:
      - name: "Workday"
        state: "{{ now().weekday() < 5 }}"

Input Helpers

input_boolean:
  vacation_mode:
    name: "Vacation Mode"
    icon: mdi:airplane

input_number:
  target_temperature:
    name: "Target Temperature"
    min: 16
    max: 28
    step: 0.5
    unit_of_measurement: "°C"
    icon: mdi:thermometer

input_select:
  house_mode:
    name: "House Mode"
    options:
      - Home
      - Away
      - Sleep
      - Guest
    icon: mdi:home

input_text:
  notification_message:
    name: "Custom Notification"
    max: 255

input_datetime:
  alarm_time:
    name: "Alarm Time"
    has_date: false
    has_time: true

Configuration Validation

Check Configuration

# Docker/Container
docker exec homeassistant hass --script check_config

# Home Assistant OS
ha core check

# Supervised
hassio homeassistant check

# Python venv
hass --script check_config -c /path/to/config

Common Validation Errors

| Error | Cause | Fix | |-------|-------|-----| | found undefined alias | Missing !secret value | Add to secrets.yaml | | could not determine a constructor | Invalid YAML syntax | Check indentation | | duplicate key | Same key defined twice | Remove duplicate | | Platform not found | Missing integration | Install via UI/HACS |

Recorder Configuration

recorder:
  db_url: !secret recorder_db_url
  purge_keep_days: 10
  commit_interval: 1

  exclude:
    domains:
      - automation
      - updater
    entity_globs:
      - sensor.weather_*
    entities:
      - sun.sun
      - sensor.date

  include:
    domains:
      - sensor
      - binary_sensor
      - switch

Logger Configuration

logger:
  default: warning
  logs:
    homeassistant.core: info
    homeassistant.components.mqtt: debug
    custom_components.my_integration: debug
    # Reduce noise
    homeassistant.components.websocket_api: error

Lovelace Dashboard (YAML Mode)

# configuration.yaml
lovelace:
  mode: yaml
  resources:
    - url: /hacsfiles/button-card/button-card.js
      type: module
  dashboards:
    lovelace-home:
      mode: yaml
      filename: dashboards/home.yaml
      title: Home
      icon: mdi:home
      show_in_sidebar: true

Quick Reference

YAML Tips

| Pattern | Example | |---------|---------| | Multi-line string | value: >- or value: \|- | | List item | - item | | Inline list | [item1, item2] | | Comment | # comment | | Anchor | &anchor_name | | Reference | *anchor_name | | Merge | <<: *anchor_name |

Template Syntax

| Function | Example | |----------|---------| | State value | states('sensor.temp') | | State attribute | state_attr('sun.sun', 'elevation') | | Convert to float | states('sensor.temp') \| float | | Round | value \| round(1) | | Default value | states('sensor.x') \| default('unknown') | | Timestamp | as_timestamp(now()) | | Time delta | now() - timedelta(hours=1) |

Agentic Optimizations

| Context | Command | |---------|---------| | Validate config | docker exec homeassistant hass --script check_config 2>&1 \| head -50 | | Find entity usage | grep -r "entity_id:" config/ --include="*.yaml" | | Find secret refs | grep -r "!secret" config/ --include="*.yaml" | | List packages | ls -la config/packages/ | | Check YAML syntax | python3 -c "import yaml; yaml.safe_load(open('file.yaml'))" |