3.1 KiB
author | authorURL | authorImageURL | title |
---|---|---|---|
Jan Bouwhuis | https://github.com/jbouwh | https://avatars.githubusercontent.com/u/7188918?s=96&v=4 | New scaling utils and import changes |
New utils for scaling brightness
Multiple integrations have implemented there own scaling algorithm to scale brightness. New utils are introduced now to simplify the implementation of brightness scaling in homeassistant.util.color
:
def brightness_to_value(low_high_range: tuple[float, float], brightness: int) -> float:
"""Given a brightness_scale convert a brightness to a single value.
Do not include 0 if the light is off for value 0.
Given a brightness low_high_range of (1,100) this function
will return:
255: 100.0
127: ~49.8039
10: ~3.9216
"""
...
If you'd rather like to scale brightness to an integer range you can also use scale_ranged_value_to_int_range
, described here.
def value_to_brightness(low_high_range: tuple[float, float], value: float) -> int:
"""Given a brightness_scale convert a single value to a brightness.
Do not include 0 if the light is off for value 0.
Given a brightness low_high_range of (1,100) this function
will return:
100: 255
50: 127
4: 10
The value will be clamped between 1..255 to ensure valid value.
"""
...
This also ensures a valid brightness value is returned.
Background
To scale fan speed percentage we already have some utils homeassistant.utils.percentage
:
def ranged_value_to_percentage(
low_high_range: tuple[float, float], value: float
) -> int:
...
and
def percentage_to_ranged_value(
low_high_range: tuple[float, float], percentage: int
) -> float:
...
These percentage utils will now use new generic scaling utils in homeassistant.utils.scaling
:
scale_ranged_value_to_int_range
and scale_to_ranged_value
def scale_ranged_value_to_int_range(
source_low_high_range: tuple[float, float],
target_low_high_range: tuple[float, float],
value: float,
) -> int:
"""Given a range of low and high values convert a single value to another range.
Given a source low value of 1 and a high value of 255 and
a target range from 1 to 100 this function
will return:
(1,255), 255: 100
(1,255), 127: 50
(1,255), 10: 4
"""
...
and
def scale_to_ranged_value(
source_low_high_range: tuple[float, float],
target_low_high_range: tuple[float, float],
value: int,
) -> float:
"""Given a range of low and high values convert a single value to another range.
Do not include 0 in a range if 0 means off,
e.g. for brightness or fan speed.
Given a source low value of 1 and a high value of 255 and
a target range from 1 to 100 this function
will return:
(1,255), 255: 100
(1,255), 127: ~49.8039
(1,255), 10: ~3.9216
"""
...
Utils int_states_in_range
and states_in_range
are moved
These utils are now under homeassistant.util.scaling
. If these are used in your custom integration, make sure you update the import to the new module.