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.
Scanned 2/12/2026
Install via CLI
openskills install majiayu000/claude-skill-registry---
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/)
No comments yet. Be the first to comment!