fade_volume: alias: Fade the volume of a media player mode: restart fields: target_player: name: Target media player description: Target media player of volume fade. required: true example: media_player.lounge_sonos selector: entity: domain: media_player target_volume: name: Target volume description: Volume the media play will be at the end of the fade duration. required: true default: 0.5 example: '0.5' selector: number: max: 1 min: 0 step: 0.01 mode: slider duration: name: Fade duration description: Length of time in seconds the fade should take. required: true default: 5 example: '5' selector: number: mode: box min: 0 max: 100000 unit_of_measurement: s curve: name: Fade curve algorithm description: Shape of the fade curve to apply. required: true default: logarithmic example: logarithmic selector: select: options: - logarithmic - bezier - linear variables: steps_per_second: 10 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) }}' sequence: - repeat: while: - condition: template value_template: '{{ repeat.index < total_steps }}' - condition: template value_template: '{{ ((state_attr(target_player, "volume_level") - 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'\ \ %}\n {{ (start_volume + (t / (1 + (1 - t))) * start_diff) | float(0)\ \ }}\n{% elif curve == 'bezier' %}\n {{ (start_volume + (t * t * (3 -\ \ 2 * t)) * start_diff) | float(0) }}\n{% else %}\n {{ (start_volume\ \ + t * start_diff) | float(0) }}\n{% endif %}\n" - delay: '00:00:00.1' - service: media_player.volume_set data_template: entity_id: '{{ target_player }}' volume_level: '{{ target_volume }}' icon: mdi:tune-vertical