Adds one `number.adaptive_lighting_intensity_<name>` entity per
configuration, alongside the Sleep Mode / Adapt Brightness / Adapt Color
switches on the same device. It is a 0-100% slider that interpolates the
adaptive result towards the switch's floor:
output = floor_value + (adaptive_value - floor_value) * intensity / 100
100 short-circuits and returns the adaptive value untouched, so it is the
default and existing configurations behave exactly as before. 0 returns
the floor. In between the light stays fully adaptive -- the sun still
moves it at every setting, so it is a scaled curve rather than a frozen
level, which is what distinguishes this from simply scaling the
brightness band.
The floor is set by a new per-switch `intensity_floor` option: the
switch's sleep settings (`sleep_brightness`/`sleep_color_temp`) by
default, or its `min_brightness`/`min_color_temp`.
`transition_until_sleep` forces the sleep floor whatever `intensity_floor`
says. With that option on, the adaptive color temperature after sunset
descends below `min_color_temp` towards `sleep_color_temp`, so a
`min_color_temp` floor would sit above the adaptive value and turning the
dial down would make the light cooler.
Documented in the README's features and a new Intensity section, and on
the docs site as advanced/intensity.md.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
3.9 KiB
| icon |
|---|
| lucide/sliders-horizontal |
Intensity
Intensity scales how far the adaptive settings travel from their floor, without leaving adaptive mode. It is the option to reach for when you want a dimmer room that still tracks the sun — a "mood" level, rather than a fixed brightness.
The Dial
Each Adaptive Lighting configuration creates a number entity:
number.adaptive_lighting_<name>_intensity
Set it like any other number:
service: number.set_value
target:
entity_id: number.adaptive_lighting_living_room_intensity
data:
value: 60
The value is a percentage, and it interpolates:
output = floor_value + (adaptive_value - floor_value) × intensity / 100
| Intensity | Result |
|---|---|
100 (default) |
The adaptive values, unchanged. The dial costs nothing until you move it. |
0 |
The floor. |
| in between | A scaled adaptive curve — the sun still moves the lights at every setting. |
The key property is that the lights stay adaptive at every value. Intensity does not freeze a light at a level; it moves the whole curve closer to the floor and keeps following the sun from there. Both brightness and color are scaled together.
Changing the dial re-adapts the lights immediately rather than waiting for the next interval, and the value survives a restart.
Choosing the Floor
The floor is set per configuration with intensity_floor:
intensity_floor |
0% gives | Use it when |
|---|---|---|
sleep (default) |
sleep_brightness / sleep_color_temp |
You want the dial to reach as low as the configuration goes. 0% then matches sleep mode. |
minimum |
min_brightness / min_color_temp |
You want the dial to stay inside the range the adaptive curve already uses. |
minimum never takes a light below what Adaptive Lighting would have done at its darkest anyway. The trade is that it does less and less as the evening goes on, and color stops moving after sunset — the adaptive color temperature is already min_color_temp there, so the floor and the value being interpolated from are the same number.
sleep keeps the dial useful at every hour, because the sleep settings sit below the adaptive curve at all times.
transition_until_sleep Overrides the Floor
With transition_until_sleep enabled, the adaptive color temperature after sunset descends below min_color_temp towards sleep_color_temp. A min_color_temp floor would then sit above the adaptive value, and turning the dial down would make the light cooler — the opposite of what a dimmer should do.
For that reason the sleep floor is forced whenever transition_until_sleep is on, whatever intensity_floor says. The switch's intensity_floor attribute reports the floor actually in use, so you can see when this applies:
{{ state_attr('switch.adaptive_lighting_living_room', 'intensity_floor') }}
Interaction With Sleep Mode
Sleep mode ignores the dial entirely. Its output already is the sleep value, so scaling towards the floor would be a no-op with the default floor and misleading with the other. Sleep mode behaves identically whatever the intensity is set to.
Attributes
The main switch exposes both values:
| Attribute | Meaning |
|---|---|
intensity |
The current dial value, 0-100. |
intensity_floor |
The floor in use, sleep or minimum, after the transition_until_sleep override. |
Why Not Just Scale min_brightness and max_brightness?
Rescaling the brightness band from an automation works, but it hardcodes each configuration's band in the automation. Retuning a light in Adaptive Lighting then silently puts the two out of step, and the automation has to be updated in parallel forever. It also leaves color untouched unless you cap max_color_temp separately.
The dial reads the configuration's own numbers, so there is nothing to keep in sync, and it moves color along with brightness.