markus41

Home Assistant Automation Skill

7. **Test with trace** - Review automation traces

markus41 12 1 Updated 5mo ago
GitHub

Install

npx skillscat add markus41/claude/plugins-home-assistant-architect-skills-ha-automation

Install via the SkillsCat registry.

SKILL.md

Home Assistant Automation Skill

Automation YAML patterns, triggers, conditions, actions, and best practices for Home Assistant.

Activation Triggers

Activate this skill when:

  • Creating or modifying automations
  • Working with automation YAML
  • Designing trigger logic
  • Building condition chains
  • Creating action sequences

Automation Structure

# Complete automation template
alias: "Descriptive Name"
id: unique_automation_id  # Optional but recommended
description: "What this automation does and why"
mode: single  # single, restart, queued, parallel

# Variables available throughout
variables:
  room: "living_room"
  default_brightness: 80

trigger:
  - platform: state
    entity_id: binary_sensor.motion
    to: "on"
    id: motion_detected  # For use in choose

condition:
  - condition: sun
    after: sunset

action:
  - service: light.turn_on
    target:
      entity_id: "light.{{ room }}"
    data:
      brightness_pct: "{{ default_brightness }}"

Trigger Types

State Trigger

trigger:
  - platform: state
    entity_id: binary_sensor.door
    from: "off"
    to: "on"
    for:
      seconds: 30
    attribute: any  # Optional: trigger on attribute change

Time Trigger

trigger:
  - platform: time
    at: "06:30:00"

  # Multiple times
  - platform: time
    at:
      - "07:00:00"
      - "12:00:00"
      - "18:00:00"

  # Input datetime
  - platform: time
    at: input_datetime.wake_up_time

Time Pattern

trigger:
  - platform: time_pattern
    hours: "/2"  # Every 2 hours
    minutes: "30"

  - platform: time_pattern
    minutes: "/5"  # Every 5 minutes

Sun Trigger

trigger:
  - platform: sun
    event: sunset
    offset: "-01:00:00"  # 1 hour before sunset

Numeric State

trigger:
  - platform: numeric_state
    entity_id: sensor.temperature
    above: 75
    below: 85
    for:
      minutes: 5

Template Trigger

trigger:
  - platform: template
    value_template: >
      {{ states('sensor.power') | float > 1000 and
         is_state('input_boolean.high_power_alert', 'on') }}
    for:
      minutes: 5

Event Trigger

trigger:
  - platform: event
    event_type: mobile_app_notification_action
    event_data:
      action: "TURN_OFF_LIGHTS"

Device Trigger

trigger:
  - platform: device
    type: turned_on
    device_id: abc123def456
    entity_id: switch.smart_plug
    domain: switch

Webhook Trigger

trigger:
  - platform: webhook
    webhook_id: my_custom_webhook
    allowed_methods:
      - POST
    local_only: true

MQTT Trigger

trigger:
  - platform: mqtt
    topic: "home/doorbell/status"
    payload: "pressed"

Condition Types

State Condition

condition:
  - condition: state
    entity_id: input_boolean.guest_mode
    state: "off"

  # Multiple states (OR)
  - condition: state
    entity_id: alarm_control_panel.home
    state:
      - "armed_home"
      - "armed_away"

Numeric State

condition:
  - condition: numeric_state
    entity_id: sensor.battery
    above: 20

Time Condition

condition:
  - condition: time
    after: "22:00:00"
    before: "06:00:00"
    weekday:
      - mon
      - tue
      - wed
      - thu
      - fri

Sun Condition

condition:
  - condition: sun
    after: sunset
    before: sunrise
    after_offset: "-00:30:00"

Zone Condition

condition:
  - condition: zone
    entity_id: device_tracker.phone
    zone: zone.home

Template Condition

condition:
  - condition: template
    value_template: >
      {{ now().month in [6, 7, 8] }}  # Summer months

Logical Operators

condition:
  - condition: and
    conditions:
      - condition: state
        entity_id: input_boolean.vacation
        state: "off"
      - condition: or
        conditions:
          - condition: state
            entity_id: person.john
            state: "home"
          - condition: state
            entity_id: person.jane
            state: "home"

Action Patterns

Service Call

action:
  - service: light.turn_on
    target:
      entity_id: light.kitchen
    data:
      brightness_pct: 100
      transition: 2

Dynamic Targets

action:
  - service: light.turn_on
    target:
      entity_id: >
        {{ expand('group.all_lights')
           | selectattr('state', 'eq', 'on')
           | map(attribute='entity_id')
           | list }}

Delay & Wait

action:
  - delay:
      seconds: 30

  - wait_for_trigger:
      - platform: state
        entity_id: binary_sensor.door
        to: "off"
    timeout:
      minutes: 5
    continue_on_timeout: true

  - wait_template: "{{ is_state('lock.front', 'locked') }}"
    timeout: "00:01:00"

Choose (If/Else)

action:
  - choose:
      - conditions:
          - condition: state
            entity_id: sun.sun
            state: "below_horizon"
        sequence:
          - service: light.turn_on
            target:
              entity_id: light.porch
            data:
              brightness_pct: 100
      - conditions:
          - condition: numeric_state
            entity_id: sensor.illuminance
            below: 100
        sequence:
          - service: light.turn_on
            target:
              entity_id: light.porch
            data:
              brightness_pct: 50
    default:
      - service: light.turn_off
        target:
          entity_id: light.porch

If/Then/Else

action:
  - if:
      - condition: state
        entity_id: input_boolean.notify
        state: "on"
    then:
      - service: notify.mobile_app
        data:
          message: "Alert!"
    else:
      - service: persistent_notification.create
        data:
          message: "Alert logged"

Repeat

action:
  # Repeat count
  - repeat:
      count: 3
      sequence:
        - service: light.toggle
          target:
            entity_id: light.alert
        - delay:
            milliseconds: 500

  # While loop
  - repeat:
      while:
        - condition: state
          entity_id: binary_sensor.motion
          state: "on"
      sequence:
        - delay:
            seconds: 10

  # For each
  - repeat:
      for_each:
        - light.bedroom
        - light.office
        - light.kitchen
      sequence:
        - service: light.turn_off
          target:
            entity_id: "{{ repeat.item }}"
        - delay:
            seconds: 1

Parallel

action:
  - parallel:
      - service: light.turn_on
        target:
          entity_id: light.living_room
      - service: media_player.play_media
        target:
          entity_id: media_player.speaker
        data:
          media_content_id: "welcome_home.mp3"
          media_content_type: "music"

Response Variables

action:
  - service: weather.get_forecasts
    target:
      entity_id: weather.home
    data:
      type: daily
    response_variable: forecast

  - service: notify.mobile_app
    data:
      message: >
        Tomorrow's forecast: {{ forecast['weather.home'].forecast[0].condition }}

Templates

Common Templates

# Current time
"{{ now().strftime('%H:%M') }}"

# Entity state
"{{ states('sensor.temperature') }}"

# State with default
"{{ states('sensor.battery') | float(100) }}"

# Attribute
"{{ state_attr('climate.thermostat', 'current_temperature') }}"

# Time since last change
"{{ (now() - states.sensor.motion.last_changed).seconds }}"

# Entity count
"{{ states.light | selectattr('state', 'eq', 'on') | list | count }}"

# Area entities
"{{ area_entities('Living Room') }}"

# Device entities
"{{ device_entities('device_id') }}"

Best Practices

  1. Use descriptive aliases - Clear names help debugging
  2. Add descriptions - Explain the automation purpose
  3. Use automation modes appropriately:
    • single: Default, ignores new triggers while running
    • restart: Stops current run, starts new
    • queued: Queues new triggers
    • parallel: Runs multiple instances
  4. Use trigger IDs - For complex choose logic
  5. Add logging for debugging:
    action:
      - service: system_log.write
        data:
          message: "Automation triggered: {{ trigger.entity_id }}"
          level: info
  6. Validate before saving - Use Developer Tools
  7. Test with trace - Review automation traces