9857cc3bda
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.
114 lines
7.9 KiB
Markdown
114 lines
7.9 KiB
Markdown
## 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.
|