Let Wake only light the screen, and open ESP Screens without a chosen screen (0.2.65)

Wake from Home Assistant counted as a tap: it reset last_touch_ms, the one
clock that standby and Back to page 1 both read. An automation pressing Wake
on every motion therefore held an open card or page 2 up for as long as
someone moved in the room. Back to page 1 now has its own clock, last_use_ms,
written only by the boot, the touchscreen triggers, open_settings from Home
Assistant and the UI self test. Wake, an alert ending and Auto standby on
still restart the standby time, and Wake still brings back the brightness and
the second hand.

The rule moved from the interval into the script back_to_page_1_when_due.
Wake runs it right after waking a dimmed screen, so a page whose time ran out
during standby lights up on page 1 instead of jumping there a second later.

ESP Screens no longer opens the first screen by itself. Until one is picked
the page says "Choose a screen", and with no screens it still offers the
install; both cards start hidden so neither flashes while the page loads.

Checked with 48 host API checks per board, both ESP32 builds, 314 Python and
16 C++ tests, and the editor on the demo home. Firmware 0.2.56.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
Max Gramser
2026-09-17 12:41:19 +02:00
parent e68162bd86
commit dfd1a26d69
17 changed files with 400 additions and 110 deletions
+2 -2
View File
@@ -257,7 +257,7 @@ Every screen has these entities in Home Assistant, on its ESPHome device. `<scre
| Entity | What it does |
|---|---|
| `button.<screen>_wake` | Wakes the screen the way a tap does and counts the standby time from that moment; a screen that is already on only restarts that count. Firmware {WAKE_SLEEP_MIN_FIRMWARE} or newer. |
| `button.<screen>_wake` | Lights the screen up to its normal brightness and counts the standby time from that moment; a screen that is already on only restarts that count. Firmware {WAKE_SLEEP_MIN_FIRMWARE} or newer. Wake is not a touch: from firmware 0.2.56 an open card or a later page still goes back to page 1 on its own time, and a screen whose time ran out during standby wakes on page 1. |
| `button.<screen>_sleep` | Puts the screen in standby right away, also with Auto standby off, and closes an alert that is showing. It stays in standby until someone taps it, Wake is pressed or an alert arrives. Firmware {WAKE_SLEEP_MIN_FIRMWARE} or newer. |
| `switch.<screen>_auto_standby` | On: the screen dims after the standby time without a touch. Off: the screen wakes up and stays on, except after Sleep, which holds until Wake, a tap or an alert. Firmware {AUTO_STANDBY_MIN_FIRMWARE} or newer. |
| `number.<screen>_standby_after` | Seconds without a touch before standby, 60 to 86400. |
@@ -268,7 +268,7 @@ Every screen has these entities in Home Assistant, on its ESPHome device. `<scre
| `switch.<screen>_night_mode` | Night mode: the night brightness between the two times below. Firmware {SETTING_ENTITIES_MIN_FIRMWARE} or newer, like every row below it. |
| `time.<screen>_night_starts`, `time.<screen>_night_ends` | The night hours; set them with `time.set_value`. |
| `switch.<screen>_24_hour_clock` | On: 24-hour clock. Off: 12-hour clock. |
| `switch.<screen>_back_to_page_1` | On: after `number.<screen>_back_to_page_1_after` seconds without a touch (30 to 3600) the screen closes a card and goes back to page 1. |
| `switch.<screen>_back_to_page_1` | On: after `number.<screen>_back_to_page_1_after` seconds without a touch (30 to 3600) the screen closes a card and goes back to page 1. Pressing Wake, an alert or Auto standby don't count as a touch. |
| `switch.<screen>_back_to_page_1_on_standby` | On: going into standby also goes back to page 1. |
| `switch.<screen>_swipe_between_pages` | On: swipe between pages. |
| `select.<screen>_rotation` | Guition only: `0°`, `90°`, `180°` or `270°`. |
+1 -1
View File
@@ -17,7 +17,7 @@ WEEKDAYS = ['Mo', 'Tu', 'We', 'Th', 'Fr', 'Sa', 'Su']
REPO = 'https://github.com/MaxGramser/homeassistant_espscreen'
REFS = {'cyd': 'main', 'guition': 'main'}
# Firmware shipped with this app release; screens below it get an update offer.
FIRMWARE_VERSION = '0.2.55'
FIRMWARE_VERSION = '0.2.56'
# The Auto standby switch a screen offers Home Assistant automations.
AUTO_STANDBY_MIN_FIRMWARE = '0.2.41'
# The settings page the screen opens itself, and the screen.settings tile that opens it.
+7 -2
View File
@@ -76,6 +76,7 @@ function select(id) {
$("#open-override").disabled = !screen.update?.profile;
$("#editor").hidden = false;
$("#empty").hidden = true;
$("#choose").hidden = true;
$("#dirty").textContent = "All saved";
$("#save-detail").textContent = "Changes apply without reflashing.";
renderScreens();
@@ -494,6 +495,12 @@ function renderPending() {
}
function renderScreens() {
renderPending();
// ESP Screens opens without a chosen screen (app 0.2.65+): the owner picks one. Until then the right side asks
// for that, or offers the install while there are no screens yet.
if (!selected) {
$("#choose").hidden = !inventory.screens.length;
$("#empty").hidden = !!inventory.screens.length;
}
// Keep an open address form alive across the periodic refresh.
if ($("#screens .screen-host")) {
renderUpdates();
@@ -2059,7 +2066,6 @@ async function refresh(full = true) {
if (full) renderClaude();
if (selected) { settleSettings(); renderSettings(); }
if (firstCatalogue && selected && layout && !drag.active && !chipDrag.active) { renderTopbar(); renderTiles(); renderResults(); }
if (!selected && inventory.screens.length) select(inventory.screens[0].id);
if ($("#alerts-dialog").open) renderAlertScreens();
} catch {
$("#connection").textContent =
@@ -2391,7 +2397,6 @@ function applyLive(data) {
$("#connection").classList.toggle("online", inventory.connected);
renderScreens();
if (selected) { settleSettings(); renderSettings(); }
if (!selected && inventory.screens.length) select(inventory.screens[0].id);
}
function listen() {
if (stream || typeof EventSource === "undefined") return;
+7 -1
View File
@@ -42,7 +42,13 @@
<div id="pending"></div>
<button class="quiet" id="refresh">↻ Refresh</button>
</aside>
<section id="empty" class="empty">
<!-- Hidden until the first inventory, so neither card flashes while the page loads. -->
<section id="choose" class="empty" hidden>
<span class="empty-icon">▦</span>
<h2>Choose a screen</h2>
<p>Pick one of your screens to change its tiles, top bar and settings.</p>
</section>
<section id="empty" class="empty" hidden>
<span class="empty-icon">▦</span>
<h2>Start with a screen</h2>
<p>
+8
View File
@@ -735,6 +735,14 @@ dialog label {
#editor {
padding: 18px;
}
/* The screens sit right above it on a phone: a short prompt, not a tall empty card. */
#choose {
min-height: 0;
padding: 18px;
}
#choose .empty-icon {
display: none;
}
.savebar {
align-items: stretch;
flex-direction: column;