Home Assistant answered every command in 342-599 ms on a real installation, yet a tile was busy for at least a second and up to six without a confirming state. Now nothing is drawn for the first 400 ms, a tap that switches shows the new stand at once as Home Assistant's own switch does, and the sheet appears only for a slow command. Home Assistant's "it worked" answer ends the wait 800 ms later, which covers a stop on a cover that already stands still, and a wait without any answer ends after three seconds instead of six. The cards' keys, sliders, chips and the -/+ edit now ask for an answer too, so a refusal shows wherever a finger presses. Firmware 0.2.59. A 200 ms LVGL timer runs only while a command is under way. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
4.0 KiB
Test results app 0.2.70 / firmware 0.2.59 (2026-09-17)
Max, after the 0.2.67 update round on his own screens: "ik vind sws alle busy heel lang duren" - every busy state feels
longer than it needs to be. This release makes a tap look instant and keeps the spinner for commands that really take a
while. See CHANGELOG 0.2.70 and the compatibility note in docs/RELEASING.md. Built on 0.2.69 (45fcbdd).
What the old rule did, measured
Tile::loading()held a tile busy for at least 1000 ms (150 ms for a switch) and then, without a confirming state, up to 6000 ms. The 1000 ms came from the first runtime tiles; nothing measured it.- The bench screens' own logs during the 0.2.67 hardware round, against Max's Home Assistant: a tap was answered with a new state in 342, 399, 404, 417, 434, 467, 550 and 599 ms. Eight of eight under 600 ms, so the sheet always outlived the command.
cover.stop_coveron a cover that already stands still brings no new state at all: Max pressed the middle key in the cover card and the sheet stayed the full six seconds. The log shows the command going out at 21:43:31 with no state after it.- Home Assistant itself shows no spinner:
ha-control-switch._toggle()flips the switch before the command goes out (180 ms CSS transition) and the state that follows confirms it.
Automated
- Python (
.venv-portal): 386 tests OK, the same set as 0.2.69 (this release is firmware only; the app just raisesFIRMWARE_VERSION). - C++ (
clang++ -std=c++17 -Wall -Wextra -Werror -I.): 17/17 PASS.tests/test_action_feedback.cppnow holds the new rules: nothing drawn in the first 400 ms while a second finger is still ignored, the sheet from 400 ms, the cap at 3000 ms, an "it worked" answer ending the wait 800 ms later, a tap that opens a card drawing no sheet at all, the clock wrapping around, a switch confirming at 250 ms without ever drawing a sheet, and the optimistic stand with its undo and a state message overruling it. generate_packages.py --checkandgenerate_icons.py --checkgreen.
Firmware on the Mac (host builds, driven over the ESPHome API)
tap_host.py, now with the busy sheet in its probe (busy=) and the probed slot in every line, so the host's
one-to-two-second log lag cannot be read as another card's answer. Guition 34/34, CYD 34/34. The eight new checks:
| Check | Guition | CYD |
|---|---|---|
| A tap on a lamp shows the new stand at once | pass | pass |
| and draws no sheet yet | pass | pass |
| The sheet comes when Home Assistant takes longer | pass | pass |
| An answer that brings no new state lets go in a moment | pass | pass |
| and the tile shows Home Assistant's own stand again | pass | pass |
| A command without an answer keeps the sheet | pass | pass |
| and lets go after three seconds | pass | pass |
| A refused switch says Refused, then the old stand is back | pass | pass |
The 26 checks of 0.2.67 (On / off, Perform action with its data, a refusal, holding, an unanswered call, Home Assistant's words) pass unchanged.
Max's own screen
The Guition at his desk got firmware 0.2.59 over the air from this tree (esphome upload, own name, keys and Wi-Fi;
Home Assistant kept the device and the app reported Synced again within half a minute). His verdict after tapping:
"wauw dit is perfect, werkt veel fijner."
Builds (ESPHome 2026.6.2)
Check profiles with the generated packages and local components; no errors or compiler warnings.
| Profile | RAM | Flash | vs 0.2.69 |
|---|---|---|---|
| CYD | 23.9% (78,396 B) | 79.2% (1,453,351 B) | +112 B RAM, +1,060 B flash |
| Guition | 25.6% (83,972 B) | 21.0% (1,708,627 B) | +112 B RAM, +1,024 B flash |
The RAM is the answer timestamp and the two optimistic flags per tile, plus one LVGL timer while a command is under way.
Not tested
- The CYD on real hardware: it kept firmware 0.2.58 until the release, so its Update round follows the push.
- A refusal on Max's own screen: it needs a tile whose action Home Assistant rejects, which the 0.2.67 round already showed there ("value must be at most 100 at 'brightness_pct'").