[light] Replace initial_state storage with flash-resident callback (#15133)

This commit is contained in:
J. Nick Koston
2026-03-24 14:03:18 -10:00
committed by GitHub
parent 752fe30332
commit 9fb5b6aa15
5 changed files with 97 additions and 9 deletions

View File

@@ -0,0 +1,39 @@
esphome:
name: light-initial-state-test
host:
api: # Port will be automatically injected
logger:
level: DEBUG
output:
- platform: template
id: test_red
type: float
write_action:
- lambda: ""
- platform: template
id: test_green
type: float
write_action:
- lambda: ""
- platform: template
id: test_blue
type: float
write_action:
- lambda: ""
light:
- platform: rgb
name: "Test Light"
id: test_light
red: test_red
green: test_green
blue: test_blue
restore_mode: ALWAYS_OFF
initial_state:
color_mode: RGB
state: true
brightness: 0.75
red: 1.0
green: 0.5
blue: 0.0

View File

@@ -0,0 +1,38 @@
"""Integration test for light initial_state configuration.
Tests that the initial_state values are correctly applied at boot when
no saved preferences exist. The initial_state callback populates defaults
that the restore logic uses as a fallback.
"""
import pytest
from .state_utils import InitialStateHelper, require_entity
from .types import APIClientConnectedFactory, RunCompiledFunction
@pytest.mark.asyncio
async def test_light_initial_state(
yaml_config: str,
run_compiled: RunCompiledFunction,
api_client_connected: APIClientConnectedFactory,
) -> None:
"""Test that initial_state values are applied at boot."""
async with run_compiled(yaml_config), api_client_connected() as client:
entities, _ = await client.list_entities_services()
light = require_entity(entities, "test_light")
helper = InitialStateHelper(entities)
client.subscribe_states(helper.on_state_wrapper(lambda s: None))
await helper.wait_for_initial_states()
state = helper.initial_states[light.key]
# restore_mode: ALWAYS_OFF overrides state to false
assert state.state is False
# But the color values from initial_state should be applied
assert state.brightness == pytest.approx(0.75, abs=0.05)
assert state.red == pytest.approx(1.0, abs=0.01)
assert state.green == pytest.approx(0.5, abs=0.01)
assert state.blue == pytest.approx(0.0, abs=0.01)