Mastering Home Assistant Scripting for Complex Automation Sequences
- #automation
- #tutorial

Mastering Home Assistant Scripting for Complex Automation Sequences
Home Assistant's automation capabilities are incredibly powerful, allowing you to trigger actions based on events in your smart home. While basic automations are perfect for simple tasks like turning on a light when motion is detected, what happens when you need to perform a complex series of steps? This is where Home Assistant Scripts come into play.
What are Home Assistant Scripts?
Think of a script as a sequence of actions that you can call upon demand. Unlike automations, which are triggered by events (like motion, time, or state changes), scripts are called explicitly. They don't have built-in triggers or conditions for starting the script (though you can use conditions and waits within a script). This makes them ideal for:
- Performing a fixed sequence of actions (e.g., a "Good Morning" routine).
- Creating reusable sequences that can be called by multiple automations or other scripts.
- Building complex sequences involving delays, waiting for specific states, repeating actions, or conditional logic within the sequence.
Creating Scripts in Home Assistant
You can create and manage scripts through the Home Assistant UI or directly in your configuration files using YAML.
Using the UI:
Navigate to Settings -> Automations & Scenes -> Scripts. Click "Add Script". The UI editor provides a user-friendly way to define the sequence of actions. You can add various action types, including calling services, delays, waiting for conditions, choosing between different paths, and more.
Using YAML:
For more complex scripts or if you prefer working with code, you can define scripts in your scripts.yaml
file (or within configuration.yaml
under the script:
key). Each script is defined with an ID (the script entity ID), an alias (the friendly name), and a sequence of actions.
my_complex_script:
alias: 'Perform Complex Evening Routine'
sequence:
- service: light.turn_off
target:
entity_id: light.living_room_lights
- delay: '00:00:05' # Wait 5 seconds
- service: lock.lock
target:
entity_id: lock.front_door
- condition: state
entity_id: binary_sensor.motion_hallway
state: 'off'
- service: media_player.turn_off
target:
entity_id: media_player.tv_in_bedroom
Common Script Actions
Scripts are built using a sequence of actions. Some of the most common and useful actions include:
service: domain.service_name
: Call any service available in Home Assistant (e.g.,light.turn_on
,switch.turn_off
,media_player.play_media
).delay: hh:mm:ss
ordelay: seconds
: Pause the script execution for a specified duration.wait_for_trigger:
: Pause the script until a specific event or state change occurs.condition:
: Evaluate a condition. If the condition is not met, the rest of the script sequence is skipped.repeat:
: Repeat a sequence of actions a specified number of times, while a condition is true, or until a condition is true.choose:
: Perform a different sequence of actions based on conditions (like an if/else if/else structure).device_id:
: Perform an action directly on a device, often simpler than calling a service if you know the device ID.
Advanced Scripting Concepts
- Variables: Pass data into your script or define temporary values within the script using variables. This allows for more dynamic scripts.
- Templates: Use Jinja2 templates within service calls or conditions to dynamically determine values based on states, attributes, or variables.
- Parallel Actions: While standard scripts execute sequentially, you can achieve parallel actions by calling multiple scripts or automations, or by using features like the
choose
action to execute different branches.
Integrating Devices with Scripts
Integrating devices is straightforward as scripts primarily work by calling services or device actions. Any device that exposes services in Home Assistant can be controlled via scripts. Simply identify the service you need (e.g., light.turn_on
) and the target entity (e.g., entity_id: light.kitchen
).
sequence:
- service: cover.open_cover
target:
device_id: a1b2c3d4e5f67890abcdeffedcba9876 # Example Device ID
- service: vacuum.start
target:
entity_id: vacuum.roborock
- delay:
minutes: 30
- service: script.turn_on # Calling another script
target:
entity_id: script.notify_cleaning_done
Best Practices for Managing Scripts
- Modularity: Break down complex routines into smaller, reusable scripts.
- Naming and Description: Use clear, descriptive names and add descriptions explaining what each script does.
- Comments: Add comments (
# Your comment here
in YAML) to explain complex logic within your sequences. - Testing: Use the "Execute" button in the UI or the service call
script.turn_on
in Developer Tools -> Services to test your scripts thoroughly before relying on them in automations. - UI vs. YAML: Start with the UI for simple scripts. As they grow in complexity or if you need advanced features like templates or variables extensively, consider moving to YAML for better readability and control.
- Version Control: If managing your configuration in YAML, consider using Git to track changes to your script files.
Conclusion
Home Assistant scripting is a fundamental tool for building a sophisticated smart home. By mastering the ability to create and manage sequences of actions, you can orchestrate complex routines that react intelligently to your life and environment, moving beyond simple one-to-one automations to truly integrated and automated experiences.

NGC 224
Author bio: