diff --git a/homeassistant/util/percentage.py b/homeassistant/util/percentage.py index c257ca2268c..ec05a2dc2ec 100644 --- a/homeassistant/util/percentage.py +++ b/homeassistant/util/percentage.py @@ -66,7 +66,8 @@ def ranged_value_to_percentage( (1,255), 127: 50 (1,255), 10: 4 """ - return int((value * 100) // states_in_range(low_high_range)) + offset = low_high_range[0] - 1 + return int(((value - offset) * 100) // states_in_range(low_high_range)) def percentage_to_ranged_value( @@ -83,7 +84,8 @@ def percentage_to_ranged_value( (1,255), 50: 127.5 (1,255), 4: 10.2 """ - return states_in_range(low_high_range) * percentage / 100 + offset = low_high_range[0] - 1 + return states_in_range(low_high_range) * percentage / 100 + offset def states_in_range(low_high_range: tuple[float, float]) -> float: diff --git a/tests/util/test_percentage.py b/tests/util/test_percentage.py index 31420d3c076..37e4c6d9615 100644 --- a/tests/util/test_percentage.py +++ b/tests/util/test_percentage.py @@ -147,3 +147,34 @@ async def test_percentage_to_ranged_value_small(): assert math.ceil(percentage_to_ranged_value(range, 66)) == 4 assert math.ceil(percentage_to_ranged_value(range, 83)) == 5 assert math.ceil(percentage_to_ranged_value(range, 100)) == 6 + + +async def test_ranged_value_to_percentage_starting_at_one(): + """Test a range that starts with 1.""" + range = (1, 4) + + assert ranged_value_to_percentage(range, 1) == 25 + assert ranged_value_to_percentage(range, 2) == 50 + assert ranged_value_to_percentage(range, 3) == 75 + assert ranged_value_to_percentage(range, 4) == 100 + + +async def test_ranged_value_to_percentage_starting_high(): + """Test a range that does not start with 1.""" + range = (101, 255) + + assert ranged_value_to_percentage(range, 101) == 0 + assert ranged_value_to_percentage(range, 139) == 25 + assert ranged_value_to_percentage(range, 178) == 50 + assert ranged_value_to_percentage(range, 217) == 75 + assert ranged_value_to_percentage(range, 255) == 100 + + +async def test_ranged_value_to_percentage_starting_zero(): + """Test a range that starts with 0.""" + range = (0, 3) + + assert ranged_value_to_percentage(range, 0) == 25 + assert ranged_value_to_percentage(range, 1) == 50 + assert ranged_value_to_percentage(range, 2) == 75 + assert ranged_value_to_percentage(range, 3) == 100