Activity-based AV control for Home Assistant — an open-source alternative to Logitech Harmony and Roomie Remote.
AV Scenes lets you control groups of devices (AV receivers, projectors, TVs, lights, outlets, covers) through named activities. Each activity executes a sequence of steps in order, with optional delays between them. When switching activities, devices that are no longer needed are turned off automatically; devices shared between activities stay on and are simply reconfigured.
Everything is configured through the Home Assistant UI — no YAML required.
| Feature | Description |
|---|---|
| Multi-room | Independent activity management per room |
| 11 step types | Power on/off, source, volume, sound mode, brightness, color temp, position, tilt, delay, any HA action |
| Smart activity switching | Devices no longer needed in the new activity are turned off automatically |
| Ordered shutdown | When an activity stops, devices are powered off in reverse start order, respecting the original delay_after values |
| Flexible delays | Configurable wait time (0–60 s) after each step |
| Race condition protection | Concurrent calls for the same room are serialized |
| 4 entity platforms | Scene, Switch, Sensor, Select — one virtual HA device per room |
| Areas integration | Each virtual device links automatically to the matching HA Area |
| UI configuration | Full setup via the config flow and options flow |
| Persistence | Configuration survives HA restarts |
| Type | Domain | Controllable parameters |
|---|---|---|
| AV Receiver, Projector, TV, Media Player | media_player.* |
On/off, input source, volume, sound mode |
| Lights | light.* |
On/off, brightness, color temperature, transition |
| Outlets / Switches | switch.* |
On/off |
| Covers (blinds, shutters) | cover.* |
Open/close, position, tilt |
| Any HA entity | — | Via call_action step |
- Open HACS in Home Assistant
- Integrations → three dots top right → Custom repositories
- Add repository:
- Repository:
https://github.com/mkshb/ha_av_scenes - Category: Integration
- Repository:
- Find "AV Scenes" in the list and click Download
- Restart Home Assistant
- Download the latest release from Releases
- Copy the
custom_components/av_scenesfolder into yourconfig/custom_components/directory - Restart Home Assistant
- Settings → Devices & Services → + Add Integration
- Search for AV Scenes and select it
- Click Configure to open the options flow
- Choose an existing Home Assistant Area or enter a custom room name
- Confirm — the room appears in the list immediately and a virtual device is created in the matching Area
- Select a room → Manage activities → Add new activity
- Enter a name (e.g., "Watch Movie")
- Add steps one by one — the wizard guides you through each step type
| Step type | Applicable device | Configurable parameters |
|---|---|---|
| Turn on device | Any | — |
| Turn off device | Any | — |
| Set input source | media_player |
Source from the device's source list |
| Set volume | media_player |
Volume 0–100 % |
| Set sound mode | media_player |
Sound mode from the device's mode list |
| Set brightness / color | light |
Brightness 0–100 %, color temperature (Mired), transition time |
| Set color temperature | light |
Color temperature 153–500 Mired |
| Set position | cover |
Position 0–100 % |
| Set tilt | cover |
Tilt 0–100 % |
| Call action | Any | HA action (domain.action), optional JSON service data |
| Wait / Delay | — | Fixed delay 1–60 seconds |
Every step except Wait / Delay accepts an optional delay_after (0–60 s) that is waited after the step executes.
After creating an activity you can edit, delete, reorder, copy, or rename both steps and activities at any time.
For each configured room, AV Scenes creates one virtual HA device (linked to the matching Area) with four entities:
The primary control entity, visible in the HA Area dashboard under Other.
| Displayed option | Meaning |
|---|---|
| Activity name (e.g., "Watch Movie") | That activity is active — select a different one to switch |
— |
Idle — no activity running; selecting this stops the current activity |
⏳ Startet … |
Activity is starting (read-only, cannot be selected) |
⏹ Stoppt … |
Activity is stopping (read-only, cannot be selected) |
Selecting an activity name starts it. Selecting — stops the current activity.
Reports the current activity lifecycle state with step-level progress.
State values: idle · starting · active · stopping
Attributes:
| Attribute | Type | Description |
|---|---|---|
activity_name |
str | null |
Name of the active activity, or null when idle |
available_activities |
list[str] |
All configured activity names for this room |
current_step |
int |
Index of the step currently executing (0 when idle) |
total_steps |
int |
Total number of steps in the active activity |
step_progress_pct |
int |
Execution progress 0–100 % |
steps |
list |
Step summary (nr, type, entity, delay_after) — only present while an activity is active |
Binary on/off showing whether an activity is running.
on→ an activity is active or transitioningoff→ idleturn_off→ stops the current activity
Attributes: current_activity, available_activities
One HA scene entity per configured activity. Activating a scene starts the corresponding activity.
action: scene.turn_on
target:
entity_id: scene.living_room_watch_movie# Start an activity
action: av_scenes.start_activity
data:
room: living_room # internal room ID
activity: watch_movie
# Stop the current activity (turns off all devices in reverse order)
action: av_scenes.stop_activity
data:
room: living_room
# Reload configuration without restarting HA
action: av_scenes.reloadRoom ID: lowercase version of the room name, spaces replaced with
_. The exact ID is shown in the room list in the options flow.
When an activity stops (either manually or because a new activity is starting), devices are powered off in the reverse of the start order. The delay_after value of each device's last step is respected, so dependent devices (e.g., an outlet that powers a TV) are turned off in the correct order with the correct timing.
Example — start order and delays:
| # | Device | delay_after |
|---|---|---|
| 1 | Outlet | 5 s |
| 2 | TV | 3 s |
| 3 | Apple TV | 0 s |
Shutdown order:
- Turn off Apple TV → wait 0 s
- Turn off TV → wait 3 s
- Turn off Outlet → wait 0 s
- Turn on receiver (
delay_after: 3 s) - Turn on projector (
delay_after: 10 s) - Turn on Blu-ray player (
delay_after: 2 s) - Set receiver input to BD/DVD (
delay_after: 1 s) - Set receiver volume to 65 %
- Set cover to 0 % (closed)
- Dim light to 5 % brightness
Running activity "Apple TV" uses: Projector, Receiver, Apple TV New activity "Sonos" uses: Receiver, Sonos
What AV Scenes does automatically:
- Projector is turned off (not needed in Sonos)
- Apple TV is turned off (not needed in Sonos)
- Receiver stays on — input and volume are updated in place
- Sonos is turned on
Result: switch completes in 2–3 seconds instead of 20–30 seconds.
- Turn on outlet (
delay_after: 5 s) — TV now has power - Set cover to 60 % (
delay_after: 1 s) - Dim light to 8 % (
delay_after: 1 s) - Turn on TV (
delay_after: 3 s) — boots correctly - Set TV input to HDMI 1 (
delay_after: 1 s) - Turn on Apple TV
Because all entities belong to a virtual device with suggested_area set to the room name, they appear automatically in the HA Area dashboard. The Select entity shows up under Other and can be used to start, switch, and stop activities directly from the area card.
type: entities
title: Living Room
entities:
- entity: select.living_room_szene
name: Activity
- entity: switch.living_room_activity
name: Status
- entity: sensor.living_room_aktivitat
name: Statetype: markdown
content: |
## Living Room
**State:** {{ states('sensor.living_room_aktivitat') }}
{% set act = state_attr('sensor.living_room_aktivitat', 'activity_name') %}
{% if act %}
**Activity:** {{ act }}
**Progress:** {{ state_attr('sensor.living_room_aktivitat', 'step_progress_pct') }} %
(step {{ state_attr('sensor.living_room_aktivitat', 'current_step') }}
of {{ state_attr('sensor.living_room_aktivitat', 'total_steps') }})
{% endif %}automation:
- alias: "Movie night at 8 PM"
trigger:
- platform: time
at: "20:00:00"
condition:
- condition: state
entity_id: binary_sensor.someone_home
state: "on"
action:
- action: av_scenes.start_activity
data:
room: living_room
activity: watch_movie- Input source selection requires the
source_listattribute on themedia_playerentity - Sound mode selection requires the
sound_mode_listattribute on themedia_playerentity - Cover tilt control requires the
cover.set_cover_tilt_positionservice to be available
- Fork the repository
- Create a feature branch:
git checkout -b feature/my-feature - Commit your changes:
git commit -m 'Add my feature' - Push the branch:
git push origin feature/my-feature - Open a Pull Request
- License: MIT
- Bugs & feature requests: GitHub Issues
- Changelog: CHANGELOG.md