Files
Max Gramser fcdea12c44 Keep every screen's Wi-Fi awake from the shared core, so Home Assistant's messages no longer wait for the router's next beacon (0.2.88)
packages/core.yaml sets wifi: power_save_mode: none. ESPHome merges it
under the screen's own wifi: block, which keeps the network, the password
and the hotspot, and the screen's own YAML still wins on the mode. The
YAML ESP Screens writes has had the line since app 0.2.24; screens with
an older or hand-written YAML ran ESPHome's ESP32 default light, and
their messages from Home Assistant waited 76-117 ms on the bench.

esphome config on the bench screens' Device Builder YAMLs: NONE for both
without a line of their own, LIGHT when the YAML says light. The bench
Guition, flashed from its Device Builder YAML: ping 15 ms average instead
of 117 ms. tools/check.sh: 474 Python tests (a new one keeps the core's
wifi: block to this one key), 19/19 C++, editor; firmware unchanged in
size (CYD 1,678,816 B, 91.5 %; Guition 2,055,280 B), since the checkout
profiles already had the line.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-19 09:06:53 +02:00

3.2 KiB
Raw Permalink Blame History

Test results app 0.2.88 / firmware 0.2.74 (2026-09-19)

The camera measurements of 0.2.87 showed the bench screens' Wi-Fi dozing: their Device Builder YAMLs date from before app 0.2.24 and have no power_save_mode, so they ran ESPHome's default for the ESP32, light (WIFI_PS_MIN_MODEM: the radio sleeps between the router's beacons, and what Home Assistant sends waits at the router until the next one). After the pros and cons Max chose: "zet hem maar op none, voor iedereen vanaf nu voor altijd", with overriding still possible.

What changed

packages/core.yaml has a wifi: block with one key, power_save_mode: none. ESPHome merges it under the screen's own wifi: (the network, the password, the fallback hotspot stay there), and the screen's own YAML wins on any key it sets (merge_config in esphome/config_helpers.py: the main config over every package, a later package over an earlier one). The YAML ESP Screens writes has had the same line since app 0.2.24 and keeps it. The app's Override YAML still refuses a wifi: section (Firmware.PROTECTED_OVERRIDE_KEYS), so the way to another mode is the screen's own YAML in the ESPHome Device Builder.

Checked

esphome config (ESPHome 2026.6.2) on copies of the bench screens' Device Builder YAMLs with the packages of this branch:

YAML power_save_mode after the merge
Guition Wallbox, as the Device Builder has it (no line) NONE
the same with power_save_mode: light under wifi: LIGHT
CYD, as the Device Builder has it (no line) NONE

The Guition's build from its Device Builder YAML generates set_power_save_mode(wifi::WIFI_POWER_SAVE_NONE).

Measured on the bench Guition

Flashed over the air from its Device Builder YAML (no power_save_mode line) with this branch:

fw 0.2.73, light fw 0.2.74, none from the package
Ping from the Mac (30 × 0.2 s) 103-191 ms, 117 ms average 5-89 ms, 15 ms average
Camera, cold open 4.55 s 4.37 s
Camera, warm open 2.06 s 2.08 s
Loop over 50 ms during an open 5 of 12 opens (58-107 ms) 1 of 5 opens (101 ms)

With the 0.2.87 measurements of a power-save-off build (none in six opens), a loop waited over 50 ms in one of eleven opens with the Wi-Fi awake. The camera times hardly change: the camera's own snapshot and the download dominate them. The power the radio now spends listening was not measured; by Espressif's datasheets the receiver draws about 90-100 mA while it listens, a few tenths of a watt on a mains-powered screen.

Automated

  • tools/check.sh: Python 474 tests OK (new: test_easy_package "the Wi-Fi never dozes but stays the owner's": the core's wifi: block holds only that key, no other package has one, the app's YAML still writes it), C++ 19/19, packages, icons, editor tests, types, build and bundle PASS.
  • tools/check.sh --firmware --baseline 1678816: CYD 1,678,816 B = 91.5 % (+0 B: the checkout profiles already set power_save_mode: none), Guition 2,055,280 B = 25.3 %.

Not tested

  • The CYD on its panel: config check only. It gets the setting with its next Update.
  • Studio 1: its YAML is in the studio's Home Assistant; it gets the setting with its next Update unless its own YAML sets another mode.