Let the on/off switch on a wide tile switch, instead of sending the opposite of what it shows (0.2.86)

A tap on the On/off switch of a wide or full-page tile moved the knob to on
and back, and the light stayed off. Since firmware 0.2.59 control_event drew
the new position first (Tile::optimistic writes it into state) and then asked
key_action for the action, which read that new position: an off light got
light.turn_off, an on light light.turn_on. A tap on the tile itself was never
affected.

tile_controls::press_key chooses the action first and then shows the new
position; control_event uses it. Unit tests cover a light, a fan, a sensor
and a cover key.

Checked with tools/check.sh (471 Python tests, 19/19 C++) and compiled for
both boards: CYD 1,677,504 B (91.4 %, +16 B), Guition 2,054,640 B (25.3 %).
On Max's Guition Wallbox (OTA from this branch) every tap on the switch sent
the right action and Home Assistant's logbook followed.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
Max Gramser
2026-09-19 08:15:50 +02:00
parent 311fa2a7fd
commit 2d343a450f
8 changed files with 103 additions and 5 deletions
+1 -2
View File
@@ -2872,8 +2872,7 @@ inline void control_event(lv_event_t *e) {
return;
}
if(t.waiting(now))return;
if(command==tile_controls::TOGGLE)t.optimistic(t.state!="on");
auto a=tile_controls::key_action(t,command,w.key_args[n]);
auto a=tile_controls::press_key(t,command,w.key_args[n]);
if(a.valid())action(a.service,t.entity,a.key,a.value);
}
// A busy card is covered by a translucent white sheet with a small spinner until