ha-automation
Automation YAML patterns, triggers, conditions, actions, and best practices for Home Assistant.
What this skill does
# 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
```yaml
# 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
```yaml
trigger:
- platform: state
entity_id: binary_sensor.door
from: "off"
to: "on"
for:
seconds: 30
attribute: any # Optional: trigger on attribute change
```
### Time Trigger
```yaml
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
```yaml
trigger:
- platform: time_pattern
hours: "/2" # Every 2 hours
minutes: "30"
- platform: time_pattern
minutes: "/5" # Every 5 minutes
```
### Sun Trigger
```yaml
trigger:
- platform: sun
event: sunset
offset: "-01:00:00" # 1 hour before sunset
```
### Numeric State
```yaml
trigger:
- platform: numeric_state
entity_id: sensor.temperature
above: 75
below: 85
for:
minutes: 5
```
### Template Trigger
```yaml
trigger:
- platform: template
value_template: >
{{ states('sensor.power') | float > 1000 and
is_state('input_boolean.high_power_alert', 'on') }}
for:
minutes: 5
```
### Event Trigger
```yaml
trigger:
- platform: event
event_type: mobile_app_notification_action
event_data:
action: "TURN_OFF_LIGHTS"
```
### Device Trigger
```yaml
trigger:
- platform: device
type: turned_on
device_id: abc123def456
entity_id: switch.smart_plug
domain: switch
```
### Webhook Trigger
```yaml
trigger:
- platform: webhook
webhook_id: my_custom_webhook
allowed_methods:
- POST
local_only: true
```
### MQTT Trigger
```yaml
trigger:
- platform: mqtt
topic: "home/doorbell/status"
payload: "pressed"
```
## Condition Types
### State Condition
```yaml
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
```yaml
condition:
- condition: numeric_state
entity_id: sensor.battery
above: 20
```
### Time Condition
```yaml
condition:
- condition: time
after: "22:00:00"
before: "06:00:00"
weekday:
- mon
- tue
- wed
- thu
- fri
```
### Sun Condition
```yaml
condition:
- condition: sun
after: sunset
before: sunrise
after_offset: "-00:30:00"
```
### Zone Condition
```yaml
condition:
- condition: zone
entity_id: device_tracker.phone
zone: zone.home
```
### Template Condition
```yaml
condition:
- condition: template
value_template: >
{{ now().month in [6, 7, 8] }} # Summer months
```
### Logical Operators
```yaml
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
```yaml
action:
- service: light.turn_on
target:
entity_id: light.kitchen
data:
brightness_pct: 100
transition: 2
```
### Dynamic Targets
```yaml
action:
- service: light.turn_on
target:
entity_id: >
{{ expand('group.all_lights')
| selectattr('state', 'eq', 'on')
| map(attribute='entity_id')
| list }}
```
### Delay & Wait
```yaml
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)
```yaml
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
```yaml
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
```yaml
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
```yaml
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
```yaml
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
```yaml
# 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 neRelated in General
modeling-omnistudio-epc-catalog
IncludedSalesforce Industries CME EPC product-modeling skill for Product2-based catalog creation. Use when creating EPC products, configuring product attributes, building offer bundles with Product Child Items, or reviewing EPC DataPack JSON metadata for product catalog changes. TRIGGER when: user creates or updates Product2 EPC records, AttributeAssignment payloads, AttributeMetadata/AttributeDefaultValues, Offer bundles, or ProductChildItem relationships. DO NOT TRIGGER when: designing OmniScripts/FlexCards/Integration Procedures (use building-omnistudio-omniscript, building-omnistudio-flexcard, or building-omnistudio-integration-procedure), implementing Apex business logic (use generating-apex), or troubleshooting deployment pipelines (use deploying-metadata).
relationship-science-coach
IncludedUse this skill for direct, practical adult relationship coaching: couples conflict, repair, trust, marriage, dating, flirting, attachment patterns, emotional connection, sex, desire differences, eroticism, kink negotiation, affection, love languages, breakups, and long-term passion. Draw on Gottman, EFT and Hold Me Tight, attachment science, modern sex research, Perel, Nagoski, Kerner, Schnarch, Love and Stosny, and flexible love-language tools. Be concrete and low-hedge. Redirect only for imminent danger, abuse, coercive control, minors, non-consent, self-harm, stalking, or medical/legal/psychiatric decisions.
building-sf-integrations
IncludedSalesforce integration architecture and runtime plumbing with 120-point scoring. Use this skill to set up Named Credentials, External Credentials, External Services, REST/SOAP callout patterns, Platform Events, and Change Data Capture. TRIGGER when: user sets up Named Credentials, External Services, REST/SOAP callouts, Platform Events, CDC, or touches .namedCredential-meta.xml files. DO NOT TRIGGER when: Connected App/OAuth config (use configuring-connected-apps), Apex-only logic (use generating-apex), or data import/export (use handling-sf-data).
venue-templates
IncludedAccess comprehensive LaTeX templates, formatting requirements, and submission guidelines for major scientific publication venues (Nature, Science, PLOS, IEEE, ACM), academic conferences (NeurIPS, ICML, CVPR, CHI), research posters, and grant proposals (NSF, NIH, DOE, DARPA). This skill should be used when preparing manuscripts for journal submission, conference papers, research posters, or grant proposals and need venue-specific formatting requirements and templates.
let-fate-decide
IncludedDraws the 12 Houses of the Zodiac Tarot spread to inject entropy into planning when prompts are vague, ambiguous, or casually delegated. Interprets the spread to guide next steps. Use when the user says 'let fate decide', 'YOLO', 'whatever', 'idk', or other nonchalant phrases, makes Yu-Gi-Oh references, or when you are about to arbitrarily pick between multiple reasonable approaches. Prefer over ask-questions-if-underspecified when the user's tone is casual or playful rather than precision-seeking.
net-ops
IncludedCross-platform network troubleshooting (Windows, macOS, Linux) via local or remote shell. Use for: DNS broken, can't resolve hostnames, nslookup/dig works but apps fail, NRPT, WFP, scutil, /etc/resolver, systemd-resolved, /etc/resolv.conf, NetworkManager, VPN DNS leak residue (ProtonVPN/Mullvad/WireGuard/AnyConnect), AV/firewall blocking DNS or DoH, Tailscale DNS interaction, intermittent connectivity, remote diagnostics over SSH.