Last active
December 22, 2023 16:08
-
-
Save giantorth/77224f7273d074b7e12f198932c439be to your computer and use it in GitHub Desktop.
Fade Home Assistant media player entity with the lights
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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