Skip to content
Back to skills

Ha Automation

ASecurity

Create and debug Home Assistant automations, scripts, blueprints, and Jinja2 templates. Use when working with triggers, conditions, actions, automation YAML, scripts, blueprints, or template expressions. Activates on keywords: automation, trigger, condition, action, blueprint, script, template, jinja2.

  • 666 stars
  • 0 votes
  • 0 copies
  • 3 views
  • Added February 8, 2026
developmentexpressdebugginggitapidocumentation

Works with

  • api

Security analysis

A100/100

Scanned February 12, 2026

npx -y skills add majiayu000/claude-skill-registry --skill ha-automation --agent claude-code

Installs into .claude/skills of the current project.

Are you the author of Ha Automation?

Add the live security badge to your README. It updates with every re-scan.

Security grade badge for Ha Automation
[![Security: A — Skills Directory](https://www.skillsdirectory.com/api/skills/majiayu000-ha-automation/badge)](https://www.skillsdirectory.com/skills/majiayu000-ha-automation)

More formats (shields.io, HTML) on the badges page. Keep it an A: scan every change in CI with Pro.

Download with Pro
SKILL.md
---
name: ha-automation
description: "Create and debug Home Assistant automations, scripts, blueprints, and Jinja2 templates. Use when working with triggers, conditions, actions, automation YAML, scripts, blueprints, or template expressions. Activates on keywords: automation, trigger, condition, action, blueprint, script, template, jinja2."
---

# Home Assistant Automation Expert

> Master Home Assistant automations, scripts, blueprints, and Jinja2 templating with confidence.

## Before You Start

This skill prevents common automation mistakes including:
1. **Incorrect trigger syntax** - Using deprecated formats or invalid entity IDs
2. **Missing condition operators** - Forgetting `and`/`or`/`not` conjunctions
3. **Jinja2 template errors** - Undefined variables or incorrect filter usage
4. **Blueprint parameterization issues** - Missing `!input` substitutions or misaligned selectors

## Quick Reference: Automation Structure

### Basic Automation Format

```yaml
automation: !include automations.yaml
```

### Single Automation File

```yaml
- alias: "My Automation"
  description: "What this automation does"
  trigger: ...
  condition: ...
  action: ...
  mode: single
```

## Triggers Quick Reference

### State Trigger
```yaml
trigger:
  platform: state
  entity_id: light.bedroom
  from: "off"
  to: "on"
  for:
    minutes: 5
```

### Numeric State Trigger
```yaml
trigger:
  platform: numeric_state
  entity_id: sensor.temperature
  above: 25
  below: 30
```

### Time Trigger
```yaml
trigger:
  platform: time
  at: "10:30:00"
```

### Time Pattern Trigger
```yaml
trigger:
  platform: time_pattern
  hours: "*/2"  # Every 2 hours
  minutes: 0
```

### Device Trigger
```yaml
trigger:
  platform: device
  device_id: abc123...
  domain: light
  type: turned_on
```

### Event Trigger
```yaml
trigger:
  platform: event
  event_type: call_service
  event_data:
    domain: light
```

### MQTT Trigger
```yaml
trigger:
  platform: mqtt
  topic: home/front_door/status
  payload: "opened"
```

### Webhook Trigger
```yaml
trigger:
  platform: webhook
  webhook_id: my_webhook_id
```

### Sun Trigger
```yaml
trigger:
  platform: sun
  event: sunrise
  offset: "-00:30:00"  # 30 min before sunrise
```

### Zone Trigger
```yaml
trigger:
  platform: zone
  entity_id: device_tracker.john
  zone: zone.home
  event: enter
```

### Template Trigger
```yaml
trigger:
  platform: template
  value_template: "{{ state_attr('light.bedroom', 'brightness') > 200 }}"
```

## Conditions Quick Reference

### State Condition
```yaml
condition:
  - condition: state
    entity_id: light.bedroom
    state: "on"
```

### Numeric State Condition
```yaml
condition:
  - condition: numeric_state
    entity_id: sensor.temperature
    above: 20
    below: 25
```

### Time Condition
```yaml
condition:
  - condition: time
    after: "08:00:00"
    before: "20:00:00"
    weekday:
      - mon
      - tue
      - wed
```

### Sun Condition
```yaml
condition:
  - condition: sun
    after: sunrise
    before: sunset
```

### Template Condition
```yaml
condition:
  - condition: template
    value_template: "{{ states('light.bedroom') == 'on' }}"
```

### Combining Conditions
```yaml
condition:
  - condition: and
    conditions:
      - condition: state
        entity_id: light.bedroom
        state: "on"
      - condition: numeric_state
        entity_id: sensor.temperature
        above: 20
```

```yaml
condition:
  - condition: or
    conditions:
      - condition: state
        entity_id: binary_sensor.motion
        state: "on"
      - condition: state
        entity_id: light.bedroom
        state: "on"
```

## Actions Quick Reference

### Call Service Action
```yaml
action:
  - service: light.turn_on
    target:
      entity_id: light.bedroom
    data:
      brightness: 255
      color_temp: 366
```

### Call Service (Multiple Targets)
```yaml
action:
  - service: light.turn_on
    target:
      entity_id:
        - light.bedroom
        - light.living_room
      area_id: downstairs
```

### Choose (If/Then/Else)
```yaml
action:
  - choose:
      - conditions:
          - condition: state
            entity_id: light.bedroom
            state: "on"
        sequence:
          - service: light.turn_off
            target:
              entity_id: light.bedroom
      - conditions:
          - condition: state
            entity_id: light.bedroom
            state: "off"
        sequence:
          - service: light.turn_on
            target:
              entity_id: light.bedroom
    default:
      - service: notification.send
        data:
          message: "Unable to determine light state"
```

### Repeat (Loop)
```yaml
action:
  - repeat:
      count: 3
      sequence:
        - service: light.toggle
          target:
            entity_id: light.bedroom
        - delay:
            seconds: 1
```

### Delay
```yaml
action:
  - delay:
      minutes: 5
```

### Wait for Trigger
```yaml
action:
  - wait_for_trigger:
      platform: state
      entity_id: binary_sensor.motion
      to: "off"
    timeout:
      minutes: 30
  - service: light.turn_off
    target:
      entity_id: light.bedroom
```

### Parallel Actions
```yaml
action:
  - parallel:
      - service: light.turn_off
        target:
          entity_id: light.bedroom
      - service: switch.turn_off
        target:
          entity_id: switch.fan
```

## Automation Modes

```yaml
mode: single  # Default - cancel previous run
mode: restart  # Restart on retrigger
mode: queued  # Queue up to 10 retriggered runs
mode: parallel  # Allow multiple simultaneous runs
mode: queued  # with max: 10  # Limit queued runs
```

## Jinja2 Template Cheatsheet

### Common Variables
- `states('entity.id')` - Get entity state
- `state_attr('entity.id', 'attribute')` - Get entity attribute
- `now()` - Current datetime
- `as_timestamp('2024-01-01')` - Convert to timestamp
- `trigger` - Trigger object (if in trigger template)

### Filters
```jinja2
{{ value | float(0) }}  # Convert to float with default
{{ value | int(0) }}  # Convert to int with default
{{ value | round(2) }}  # Round to 2 decimal places
{{ value | timestamp_custom("%Y-%m-%d") }}  # Format timestamp
{{ value | replace("old", "new") }}  # Replace string
{{ value | lower }}  # Lowercase
{{ value | upper }}  # Uppercase
{{ value | length }}  # Get length
{{ list | list }}  # Convert to list
```

### Conditionals
```jinja2
{% if states('light.bedroom') == 'on' %}
  Light is on
{% elif states('light.bedroom') == 'off' %}
  Light is off
{% else %}
  Unknown
{% endif %}
```

### Loops
```jinja2
{% for entity in states.light %}
  {{ entity.name }}: {{ entity.state }}
{% endfor %}
```

### Math Operations
```jinja2
{{ 5 + 3 }}  # Addition
{{ 10 - 4 }}  # Subtraction
{{ 3 * 4 }}  # Multiplication
{{ 20 / 4 }}  # Division
{{ 17 % 5 }}  # Modulo (remainder)
```

### String Operations
```jinja2
{{ "hello " + "world" }}  # Concatenation
{{ value is string }}  # Type checking
{{ value is number }}
{{ value is defined }}  # Check if variable exists
{{ value | default("fallback") }}  # Provide default
```

### Debugging Templates
Use Developer Tools > Template in Home Assistant UI to test templates in real-time.

## Blueprint Creation Basics

### Blueprint Structure
```yaml
blueprint:
  name: "Friendly Name"
  description: "What this blueprint does"
  domain: automation
  source_url: "https://github.com/user/repo/path/to/blueprint.yaml"

  input:
    my_light:
      name: "Light to control"
      description: "The light entity to control"
      selector:
        entity:
          domain: light

    brightness_level:
      name: "Brightness"
      description: "Brightness percentage (0-100)"
      selector:
        number:
          min: 0
          max: 100
          unit_of_measurement: "%"

    duration:
      name: "Duration"
      description: "How long to stay on"
      selector:
        number:
          min: 1
          max: 60
          unit_of_measurement: "minutes"

    my_bool:
      name: "Enable feature"
      selector:
        boolean:

trigger: ...
condition: ...
action:
  - service: light.turn_on
    target:
      entity_id: !input my_light
    data:
      brightness: !input brightness_level
```

### Blueprint Selectors
```yaml
# Entity selector
selector:
  entity:
    domain: light

# Device selector
selector:
  device:
    integration: zwave
    manufacturer: Philips

# Area selector
selector:
  area:

# Number selector
selector:
  number:
    min: 0
    max: 100
    step: 5
    unit_of_measurement: "%"

# Text selector
selector:
  text:
    multiline: true

# Boolean selector
selector:
  boolean:

# Select (dropdown)
selector:
  select:
    options:
      - label: "Option 1"
        value: "value1"
      - label: "Option 2"
        value: "value2"
```

## Common Mistakes to Avoid

### ❌ Don't: Use old trigger format
```yaml
trigger:
  - platform: state
    entity_id: light.bedroom
```

### ✅ Do: Use nested structure
```yaml
trigger:
  - platform: state
    entity_id: light.bedroom
    to: "on"
```

### ❌ Don't: Mix trigger and condition logic
```yaml
trigger:
  - platform: state
    entity_id: light.bedroom
    to: "on"
condition:
  - condition: state
    entity_id: light.bedroom
    to: "on"  # Redundant!
```

### ✅ Do: Use trigger for change detection, condition for state verification
```yaml
trigger:
  - platform: state
    entity_id: light.bedroom
condition:
  - condition: numeric_state
    entity_id: sensor.temperature
    above: 20  # Additional check
```

### ❌ Don't: Forget entity_id in service calls
```yaml
action:
  - service: light.turn_on
    data:
      brightness: 255
```

### ✅ Do: Specify target entity
```yaml
action:
  - service: light.turn_on
    target:
      entity_id: light.bedroom
    data:
      brightness: 255
```

## Best Practices

1. **Use descriptive alias names** - Make automation purposes clear
2. **Add descriptions** - Explain why the automation exists
3. **Test with Developer Tools** - Verify templates before deployment
4. **Use choose for complex logic** - More readable than multiple automations
5. **Organize by room or function** - Use `!include` to split large files
6. **Set appropriate mode** - Choose single/restart/queued based on use case
7. **Add for: condition** - Prevent false triggers from brief state changes
8. **Use templates for flexibility** - Enable parameter passing in blueprints

## Troubleshooting

### Template Shows "Error"
- Check template in Developer Tools > Template
- Verify entity IDs exist: `homeassistant.entity_ids`
- Use `| default("value")` filter for optional attributes

### Automation Doesn't Trigger
- Verify entity IDs and state values (case-sensitive)
- Check trigger.yaml syntax with YAML validator
- Review automation logs in Settings > Developer Tools > Logs

### Blueprint Input Not Working
- Verify `!input variable_name` syntax (YAML 1.2 tag)
- Check selector type matches input type
- Ensure blueprint is in correct folder: `config/blueprints/automation/`

### Jinja2 Syntax Error
- Check for undefined variables - use `| default()`
- Verify filter syntax: `value | filter_name(arg)`
- Don't use quotes inside quotes without escaping

## Official Resources

- [Home Assistant Automation Docs](https://www.home-assistant.io/docs/automation/)
- [Home Assistant Scripts](https://www.home-assistant.io/docs/scripts/)
- [Jinja2 Templating Guide](https://www.home-assistant.io/docs/automation/templating/)
- [Blueprint Documentation](https://www.home-assistant.io/docs/blueprint/)
- [Condition Types](https://www.home-assistant.io/docs/automation/condition/)
- [Trigger Types](https://www.home-assistant.io/docs/automation/trigger/)
- [Template Integration](https://www.home-assistant.io/integrations/template/)

Attribution

Is this your skill, or is something wrong with this listing? Request removal or report an issue. Author removals are honored within 72 hours.

Comments

Loading comments…

Newsletter

Get the weekly list of safe new skills, and the ones we pulled.