Files
Xandrossian 9857cc3bda
CI / checks (push) Successful in 12m50s
CI / firmware (add-on) (push) Successful in 18m19s
CI / firmware (min_version) (push) Successful in 17m55s
Add the Elecrow CrowPanel 7.0" as a third board, and take the packages and the add-on from Gitea (0.2.93)
A board file for the Elecrow CrowPanel 7.0" (DIS08070H, ESP32-S3-WROOM-1-N4R8): 800x480 through mipi_rgb, GT911 on the
ESP32-S3's USB pins (elecrow_usb_phy.h frees them, behind a flag only this board sets), the Guition's vertical sizes
across a wider page, no rotation. Its 4 MB of flash take the CYD's budget: a partition table of the component's
(smart_display: partitions: 4mb_wide_slots, 1,984 KB slots), the icon fonts at 2 bits a pixel and the TLS client only
bring the firmware to 1,865,440 bytes, 91.8 % of a slot, with camera images kept. docs/ELECROW.md has the numbers and
the trade.

The add-on reads a large board's name from the type sensor's value, the editor offers the board under New screen and
draws the wide preview, tools/check.sh builds it with the budget, render_topbar and capture_ui take the panel's size.
Firmware 0.2.79; the CYD image is unchanged (1,633,760 bytes).

This fork builds from gittea.trippedonmy.name/Xandrossian/homeassistant_espscreen: the packages, the fonts, the
component and the add-on repository point there instead of GitHub.
2026-09-20 23:18:01 -07:00

114 lines
7.9 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
## Easy Setup and releases
The preferred route for new users is docs/EASY_SETUP.md: ESP Screen Manager
plus remote ESPHome packages. No token or blueprint needed. Tiles live in the
persistent add-on data; Wi-Fi/API/OTA stay in the device's own ESPHome YAML. Read
docs/RELEASING.md before publishing updates. Main distributes every board.
Every push to GitHub is a release: always also bump the add-on version in
screen_manager/config.yaml (with a CHANGELOG line), otherwise HA won't see an update.
A screen's YAML is packages/core.yaml (shared by every board) plus one file under packages/boards/;
packages/<board>.yaml and the profiles in the root only include them. Read docs/PROFILES.md before
touching them: a board-dependent number is a `${NAME}` in the board file, board-only code inside a shared
lambda is a hook substitution there, and `tools/check_packages.py` (run by tools/check.sh) keeps the boards
complete.
A screen gets its tiles from the add-on while it runs: every card works in all
48 positions (eight pages of six, firmware 0.2.62+), and no Home Assistant entity
belongs in a board profile.
Preserve the data schema, protocol compatibility, unique keys, and CYD preferences.
Test updates against existing data. Don't publish an unknown storage version without
a migration. Production Ingress needs no long-lived token or public port.
## Guition board
The Guition 4848S040 has its own board file `packages/boards/guition-4848s040.yaml` with
480×480, ST7701S RGB, and GT911 (`guition-4848s040.yaml` in the root only includes it). Read
docs/GUITION.md. Don't carry over the CYD layout or the XPT2046 calibration.
Verify touch with tools/verify_gt911.py and keep the CYD regressions green.
Don't configure wallbox relays as part of display support.
## Elecrow board
The Elecrow CrowPanel 7.0" (DIS08070H, ESP32-S3-WROOM-1-N4R8) has `packages/boards/elecrow-crowpanel7.yaml`:
800×480 through `mipi_rgb`, GT911 on the ESP32-S3's USB pins (`elecrow_usb_phy.h` frees them; no interrupt pin, no
PCA9557 writes, `scan: false`), the Guition's vertical sizes across a wider page, no rotation. It has 4 MB of flash: the
CYD's budget applies (`tools/check.sh --firmware`), and the board file's partition table, icon fonts at 2 bits a pixel
and the notes in docs/ELECROW.md are what keep it inside. Read docs/ELECROW.md before touching it.
# Working instructions for LLMs and developers
This project drives three boards: the CYD ESP32-2432S028 with ILI9341 + XPT2046 (320×240,
LVGL 90°), the Guition above and the Elecrow above. Read README.md, README_EXTENDED.md and docs/ before installing. The owner can
physically tap; an agent cannot replace that with software coordinates.
## Installing a new screen
1. Install it from ESP Screens (docs/EASY_SETUP.md): the add-on writes the screen's
own ESPHome YAML with its name, Wi-Fi reference and unique keys, and flashes it
over USB. Identify the USB port and board variant first, and check whether a
profile for this screen already exists; never overwrite a working one.
The add-on builds with ESPHome 2026.9.0 (`screen_manager/Dockerfile`, Python 3.12-3.14); the packages also build with
their `min_version` (2026.6.2). Don't show keys in logs or chat.
2. CYD: the screen shows its calibration on first boot; the owner taps the
crosshairs. `tools/calibrate.py` with docs/CALIBRATING.md is the USB route for a
panel that needs measuring; ask for physical taps per target, and wait for
confirmation that the measurement screen is visible. A successful build is not a flash.
Guition and Elecrow: GT911 reports pixels; verify with tools/verify_gt911.py, no ADC calibration.
3. Pair with the owner's own Home Assistant through the ESPHome integration.
Read real entity IDs and supported attributes; don't make up entities.
4. Choose the tiles in ESP Screens. Don't test real device actions without the
owner's permission, and report which checks were actually carried out,
the limitations, and how long the screen stayed up.
## Owner's machine
On the owner's machine, git-ignored `.esphome/owner-access.md` says how to reach his Home Assistant
and screens for lookups and tests. If that file is missing you are not on his machine: ask, don't guess.
## Code and regressions
- Keep the shared UI in `packages/core.yaml` and a board's hardware and sizes in its file under
`packages/boards/`; personal data belongs in the gitignored local profiles.
- The editor is `web/` (Vue 3 + Vite, TypeScript; app 0.2.73+). `screen_manager/app/static` is its build
output: change `web/src`, run `cd web && npm test && npm run build`, and commit both. Keep every URL the page asks for
relative (`api/...`), so it works behind Home Assistant's ingress path. Tests read the source through
`tests/editor_sources.py`; docs/RELEASING.md "Local development" has the dev-server recipe.
- Colours live in one table: `components/smart_display/theme.h` (firmware 0.2.54+). Every role has a
light and a dark value, board profiles name paints (`styles: paint_card`) instead of writing a colour,
and firmware code asks for a role (`theme::color(theme::INK)`). Never write a hex colour in a profile or
another header; docs/THEME.md is the recipe, tests/test_theme.py and tests/test_theme.cpp guard it.
- Screen settings live in one table: `components/smart_display/settings_screen.h` draws the
page on the screen, `SETTING_RULES` in the add-on validates the same keys. Firmware 0.2.49+
owns them: every writer (the page, the entities in `packages/core.yaml`) goes through
`settings_screen::set()`, and the add-on changes them through the entities in
`SETTING_ENTITIES`, never through the layout message. docs/SETTINGS.md is the end-to-end
recipe for adding one; never widen the eleven-key `settings` block older firmware insists on.
- Preserve fixed pages, hidden navigation at six tiles or fewer, and a
minimum default standby of 600 seconds. Don't reintroduce free scrolling
without physically testing for touch/navigation regressions.
- Preserve the touch filter and event guard before actions; calibration processes
filtered physical ADC values. Don't apply the affine correction twice, in both the driver and the UI.
- The calibration wizard assumes swap_xy=false, mirror_x=true, mirror_y=false,
and LVGL 90°. A changed orientation also requires a new projection/tests.
- Run `tools/check.sh` on code changes (the Python tests, every C++ test, the package check, the icon
generator's check, the editor's tests, types and build); on a firmware change also `tools/check.sh --firmware`, which
compiles every board and applies the flash budget to the 4 MB boards, the CYD and the Elecrow (docs/RELEASING.md step 2). CI runs the
same script. Firmware tests and hardware acceptance are different checks.
- `diagnostics/run_ui_test.py` renders without HA actions; don't touch the screen
during that test. Use `--name` for the expected device identity.
`diagnostics/send_layout.py` pushes a demo layout with every card type to a
screen via the API inbox (no HA actions); the manager restores the real
layout within ~25 s. Guition and Elecrow: `capture_ui.py` saves the LVGL render as a PNG.
Without a screen: `tools/render_topbar.py` renders the real top-bar code for every
board via the ESPHome host + SDL2 to `.esphome/render-topbar/out/sheet.png`.
- Share through Git. Don't stage secrets, measurements, binaries, logs, build
caches, or local device profiles.
- No automatic firmware upload to an arbitrary connected port.
With multiple boards, first determine the intended port.
- Profiles with the same `DEVICE_NAME` share `.esphome/build/<name>`.
Never compile or upload them concurrently; check
the `firmware.bin` path in the upload log, and then the compile time via
`device_info`. A wrong profile knocks the screen out of ESP Screen Manager.
Historical diagnostics are background context, not proof that a new panel
works correctly. During onboarding, don't make claims about physical tests that weren't actually performed.