Hi everyone,
I've been building a smart-home control panel based on the Waveshare ESP32-S3-Touch-LCD-3.49 (that long thin 172×640 portrait display), and I'm at a point where it's stable enough to share for feedback.
The piece I'm most happy with: everything is configured from the Home Assistant UI — no YAML editing, no re-flashing. You pick entities for each slot in a normal HA config flow, save, and the panel updates in real time. Add a new page in HA, swipe on the device → there it is.
What it does
Up to 50 pages × 8 slots per panel, all configured via HA UI
Drop in any light,switch,scene,script,automation,fan,cover,media_player— service dispatch is auto (toggle vs turn_on by domain)
Drop in any sensororbinary_sensorand the slot becomes a live value display with auto-formatted units (22.3°C,45%)
MDI icons chosen automatically by domain + device_class (lightbulb / switch / thermometer / humidity drop / motion / flash …)
Buttons turn yellow when entity is on; lights also show brightness % in the sub-line
Auto rotation via the onboard QMI8658 IMU — portrait shows the controller, landscape shows a big clock + outdoor/indoor temps dashboard
Tap or swipe between pages (with motion-aware click guard so swipes don't trigger buttons)
Battery operation — 18650 with hardware power latch (TCA9554 pin 6), live voltage + %, color-coded bar (green / yellow / red)
English UI, Turkish translation included, easy to add more
The integration
This is a proper HA custom integration (touch_panel_manager), not just an ESPHome YAML. It exposes:
- One
sensor.<panel>_configwith all per-slot attributes (entity, label, icon, text, type) - Two temperature proxies that mirror the configured outdoor/indoor sensors
- Eight
binary_sensor.<panel>_slot_N_statethat proxy the on/off of whatever entity is in that slot, on the current page - A
panel_action(entity_id)dispatcher service used by the panel for taps - A
set_current_page(config_entity_id, page_index)service used by the panel for navigation
ESPHome just subscribes to attributes and renders. The panel never stores config locally → editing in HA propagates in milliseconds.
Screenshots & demo
Repo has SVG mockups of both views and a short demo video showing the live UI:
Install
Full instructions in the GitHub repo. Briefly:
- Add the
custom_components/touch_panel_managerfolder to your HA config (or install via HACS custom repo) - Add a "Touch Panel Manager" device in HA, configure pages
- Flash the ESPHome YAML to the Waveshare board, point its
panel_config_entitysubstitution to your device's config sensor - HA auto-discovers the ESPHome device, you're done
Feedback I'd love
- Anyone else running this hardware — do the AXS15231 display config and the I2C bus assignments work on yours? (The display chip is a bit finicky with 172-wide; I use
full_refresh: trueto dodge the tearing) - HA integration patterns — is exposing the config as
sensor.attributesreasonable, or would you do this differently? Considered SubConfigEntry but went with menu-driven options flow for max compatibility - UI suggestions — long-press → brightness slider, status bar on portrait, and more dashboard widgets (weather/calendar) are on the roadmap. What would you add?
- Bugs and edge cases — multi-page with empty slots, page reordering, etc. There's a known minor pixel artifact at column 171 (panel width 172 isn't 8-divisible).
MIT licensed, PRs welcome. Built over a weekend of late-night ESPHome + LVGL + Python wrangling ![]()
Thanks for taking a look!