Live finding (mock fleet, 2026-06-10): the Fan mock uses FanModeSequence=OffLowMedHigh (no On/Auto) — common on real hardware. FanControlHandler maps TurnOn → write FanMode=4 (On), which such fans reject (constraint error). Also: the write failure produced no Indigo-visible error (writes may need the same failure surfacing as commands).
Proposed: TurnOn → write PercentSetting=100 (or restore last non-zero PercentSetting), falling back to FanMode=High(3) — valid in every FanModeSequence; TurnOff stays FanMode=0. And surface write_attribute error responses on the device like command failures.
Live finding (mock fleet, 2026-06-10): the Fan mock uses FanModeSequence=OffLowMedHigh (no On/Auto) — common on real hardware. FanControlHandler maps TurnOn → write FanMode=4 (On), which such fans reject (constraint error). Also: the write failure produced no Indigo-visible error (writes may need the same failure surfacing as commands).
Proposed: TurnOn → write PercentSetting=100 (or restore last non-zero PercentSetting), falling back to FanMode=High(3) — valid in every FanModeSequence; TurnOff stays FanMode=0. And surface write_attribute error responses on the device like command failures.