Skip to content

Instantly share code, notes, and snippets.

@giantorth
Last active December 22, 2023 16:08
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save giantorth/77224f7273d074b7e12f198932c439be to your computer and use it in GitHub Desktop.
Save giantorth/77224f7273d074b7e12f198932c439be to your computer and use it in GitHub Desktop.
Fade Home Assistant media player entity with the lights
blueprint:
name: Fade Media Player Volume Based on Light
description: Adjusts the volume of a media player based on the state of a light.
domain: automation
input:
light_entity:
name: Light Entity
description: The light entity to monitor.
selector:
entity:
domain: light
media_player_entity:
name: Media Player Entity
description: The media player to control.
selector:
entity:
domain: media_player
volume_save_helper:
name: Volume Save Helper
description: Input Number helper for saving volume state (0.01 step size.)
selector:
entity:
domain: input_number
fade_duration:
name: Fade Duration
description: Duration of the volume fade in seconds.
default: 2
selector:
number:
min: 1
max: 60
unit_of_measurement: seconds
fade_curve:
name: Fade Curve
description: The type of curve for the volume fade.
default: bezier
selector:
select:
options:
- linear
- bezier
- logarithmic
alias: Fade Media Player Volume Based on Light
description: ""
trigger:
- platform: state
entity_id: !input light_entity
from: null
to: "on"
id: light_on
- platform: state
entity_id: !input light_entity
from: null
to: "off"
id: light_off
for:
hours: 0
minutes: 0
seconds: 5
condition: []
variables:
steps_per_second: 10
target_player: !input media_player_entity
save_helper: !input volume_save_helper
duration: !input fade_duration
curve: !input fade_curve
target_volume: >-
{% if( trigger.id == "light_off" ) %}
0
{% elif( trigger.id == "light_on" and ( ( state_attr( target_player,
'volume_level')|float(0)) < 0.01 )) %}
{{ states( save_helper ) }}
{% else %}
{{ state_attr( target_player, 'volume_level')|float(0) }}
{% endif %}
total_steps: "{{ (steps_per_second * duration) | int(0) }}"
start_volume: "{{ state_attr(target_player, 'volume_level') | float(0) }}"
start_diff: "{{ (target_volume - start_volume) | float(0) }}"
action:
- choose:
- conditions:
- condition: template
value_template: "{{ state_attr( target_player, 'volume_level')|float(0) > 0 }}"
- condition: template
value_template: "{{ trigger.id == 'light_off' }}"
sequence:
- service: input_number.set_value
data:
value: "{{ state_attr( target_player, 'volume_level')|float(0)}}"
target:
entity_id: "{{ save_helper }}"
- repeat:
while:
- condition: template
value_template: "{{ repeat.index < total_steps }}"
- condition: template
value_template: >-
{{ (((state_attr(target_player, "volume_level") |float(0)) -
target_volume) | abs) > 0.001 }}
sequence:
- service: media_player.volume_set
data_template:
entity_id: "{{ target_player }}"
volume_level: >
{% set t = repeat.index / total_steps %} {% if curve ==
'logarithmic' %}
{{ (start_volume + (t / (1 + (1 - t))) * start_diff) | float(0) }}
{% elif curve == 'bezier' %}
{{ (start_volume + (t * t * (3 - 2 * t)) * start_diff) | float(0) }}
{% else %}
{{ (start_volume + t * start_diff) | float(0) }}
{% endif %}
- delay: "00:00:00.1"
- service: media_player.volume_set
data_template:
entity_id: "{{ target_player }}"
volume_level: "{{ target_volume }}"
enabled: true
mode: restart
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment