Added
Colour temperature is read from the lamp. It was the last attribute that only
ever reflected the last command — on/off and brightness have been read since
0.2/0.3 — so a temperature changed from the vendor app or a wall remote never
reached Home Assistant.
A lamp still ramping reports where it is and where it is going, and the answer
is where it is going. That resolution already existed for every set, and the
getters inherit it rather than deciding again.
The lamp is asked for the Kelvin range it actually tracks. The exposed range
was a pair of constants, 2700–6500, chosen as a safe default. That put a lamp's
real extremes out of reach — and it did something quieter as well: the inversion
workaround mirrors around the exposed range, so on a lamp whose real limits are
narrower, every request near the warm end was mirrored past what the lamp accepts
and clamped there.
The validation lamp for this release is exactly that case. It reports 2700–5000
K, so under 0.5.1 every request below 4200 K produced the same colour: the whole
warm half of the slider was one flat plateau. Testing the extremes could never
reveal it, because the extremes happen to map correctly either way.
The range is now read once — it is a property of the device, not a state — and
both the slider and the mirror follow it. A lamp that really is 2700–6500 puts
exactly the same bytes on the wire as before; a test asserts that rather than
leaving it to chance. A lamp that reports no valid range keeps the default.
Diagnostics reports the range each CTL node claims, as probe.nodes[].ctl_range,
null when the node gave none.
Changed
A read temperature is un-mirrored before display. A marked lamp reports the
value it was sent, so showing it raw would have put a wrong number in front of
exactly the users the per-lamp inversion option exists for.
Upgrade note
If a lamp reports a narrower range than 2700–6500, its slider maximum drops
accordingly. A scene or automation asking for a value beyond it is clamped by
Home Assistant — the rendered colour is unchanged, since the lamp was already
clamping it further along, but the stored value no longer matches what is asked.
Hardware-validated on a Häfele Connect Mesh lamp through an ESPHome Bluetooth
proxy: three test points visibly distinct where two used to be identical, and a
reload with the entity cache destroyed reads the temperature back from the lamp.