I can not get any media player to land on a volume level of 0.29
, it persistantly rounds down to 0.28
.
I discovered this when I created a script to fade the volume to target volume over x
amount of seconds in a repeat:
loop and tested fading up from below 0.28
to anything above than 0.29
, the traces timeline would stick at trying to set it to 0.29
. So I created an event:
action to catch the data in case my logic was off and “listened” for it in dev tools, this is when I discovered it was in an endless loop trying to set the volume to 0.29
.
Poor dev tools got l l a a g g g g y y A F.
Next step was to try and set the volume via dev tools > actions, that failed and rounded to 0.28
. Then I powered on all available media_player
entities, 3 native Music Assistant (1 Airplay and 2 Chromecast) and 2 native Google Cast, queued them up in dev tools > actions, and hit submit… not one of them landed on 0.29
.
Like W.T.F? In dev tools > states Music Assistant entities showed volume_level: 0.28
and Google Cast entities showed volume_level: 0.28999999165534973
(which I thought odd considering that I’m filtering with |round(2)
.
Anyone else have this? Anyone have any insight? Help appreciated, thanks.
Dev tools > actions yaml:
action: media_player.volume_set
target:
entity_id:
- media_player.livingroom_stereo
- media_player.wiim_with_chromecast
- media_player.nest_mini
- media_player.living_room_speaker
- media_player.livingroom_sound
data:
volume_level: "{{ (0.29)|round(2) }}"
Script issue was discovered in:
script:
fade_volume:
alias: "Fade Volume"
description: "Fade Volume Over Time -
Required:
`player: media_player.id`
Optional:
`duration: seconds` (default: 10)
`target_volume: 0 - 1` (default: 0)"
sequence:
- if: "{{ player is not defined }}"
then:
stop: "The action `script.fade_volume` requires `player: media_player.id` to be passed to it within the `data:` object"
- variables:
# Define optional input values
target_volume: "{{ target_volume|float if target_volume is defined else 0 }}"
duration: "{{ duration|int if duration is defined else 10 }}"
# Define dynamic values
start_volume: "{{ state_attr(player, 'volume_level') }}"
range: "{{ (start_volume - target_volume if start_volume is greaterthan target_volume else target_volume - start_volume)|round(2) }}"
delay: "{{ ((duration * 1000) / ((range * 100) if range is lessthan 0.51 else (range * 50)))|round }}"
step: "{{ 0.01 if range is lessthan 0.51 else 0.02 }}"
direction: "{{ 'up' if target_volume is greaterthan start_volume else 'down' }}"
- if: "{{ direction is equalto 'down' }}"
then:
- repeat:
until: "{{ state_attr(player, 'volume_level') <= target_volume }}"
sequence:
- event: TEST_VARIABLES
event_data:
volume: "{{ state_attr(player, 'volume_level') }}"
target_volume: "{{ target_volume }}"
current_volume_set: "{{ state_attr(player, 'volume_level') - step }}"
step: "{{ step }}"
- action: media_player.volume_set
target:
entity_id: "{{ player }}"
data:
volume_level: "{{ (state_attr(player, 'volume_level') - step)|round(2) }}"
- delay:
milliseconds: "{{ delay }}"
else:
- repeat:
until: "{{ state_attr(player, 'volume_level') >= target_volume }}"
sequence:
- event: TEST_VARIABLES
event_data:
volume: "{{ state_attr(player, 'volume_level') }}"
target_volume: "{{ target_volume }}"
current_volume_set: "{{ (state_attr(player, 'volume_level') + step)|round(2) }}"
step: "{{ step }}"
- action: media_player.volume_set
target:
entity_id: "{{ player }}"
data:
volume_level: "{{ (state_attr(player, 'volume_level') + step)|round(2) }}"
- delay:
milliseconds: "{{ delay }}"
- if: "{{ state_attr(player, 'volume_level') is not equalto target_volume }}"
then:
- action: media_player.volume_set
target:
entity_id: "{{ player }}"
data:
volume_level: "{{ target_volume }}"