# espcontrol: a dedicated Home Assistant panel on cheap hardware

> EspControl turns a supported ESP32 touchscreen into a wall panel for Home Assistant, installed from a browser with no YAML and no ESPHome build, configured afterwards from a web page the panel itself hosts. The interesting details are the long list of card types, the five supported panels, and a licence that permits noncommercial use only.

**jtenniswood/espcontrol** — Esphome based smart home control panel

- Repository: https://github.com/jtenniswood/espcontrol
- Website: https://jtenniswood.github.io/espcontrol/
- Stars: 1,116 · Forks: 176
- Language: C++
- License: NOASSERTION
- Published: 2026-10-19 · Updated: 2026-10-19 · Language: en
- Canonical page: https://hysenlabs.com/projects/jtenniswood-espcontrol

## A panel that does not need YAML or a build

EspControl is described as an ESPHome based smart home control panel, and the pitch is in one line: turn an affordable touchscreen into a simple smart home control panel.

The value proposition is that it puts the Home Assistant controls you use every day onto a dedicated screen. Lights by the door, heating in the hallway, garage controls in the utility room, room temperatures on a desk, or a tidy bedside panel for scenes and alarms.

The mechanism that makes it approachable is stated directly. You do not need to write code, edit YAML, or build your own ESPHome setup. You install the firmware from a web browser, connect the screen to WiFi, add it to Home Assistant, and then choose what appears on the display from the screen's built-in setup page.

So the audience is a home owner with Home Assistant already running who wants a physical interface without becoming the person who maintains the firmware configuration. That is a much bigger group than the people who write ESPHome YAML, and it is the group the web installer and the browser based configuration are aimed at.

Two properties of the design are worth noting before the details. The panel talks to Home Assistant on your own network, and it is not a cloud dashboard, so the controls keep working when the internet does not. And the layout can be changed later from a phone, a tablet or a computer browser, which means the screen is a display that is configured remotely rather than a device you have to carry a ladder to.

## The six steps from a boxed panel to a working control

The how it works section is a numbered list, and the order matters because each step depends on the previous one.

1. Buy a supported ESP32 touchscreen. 2. Install EspControl from your browser using the web installer. 3. Connect the screen to WiFi using the setup screen it creates. 4. Add it to Home Assistant when Home Assistant discovers it. 5. Allow Home Assistant actions so the panel is permitted to control your devices. 6. Open the panel's web page and choose the buttons, sensors, pages, active colour, and display settings you want.

Two of those steps carry more weight than they look. Step three is where the panel creates its own setup screen, which is what makes the browser install possible: a device with no configuration has to present something to be configured with, and the panel hosts that. Step five is the permission model, and the wording is worth reading carefully. The panel is permitted to control your devices because Home Assistant is allowed to perform those actions, so the authorisation is granted in Home Assistant rather than in the panel, and a panel that has not been granted that permission will show controls it cannot act on.

The hardware you need is listed separately, and it is short. A supported ESP32 touchscreen, a USB-C data cable for the first install, a computer running Chrome or Edge for flashing the firmware, Home Assistant running on your home network, and 2.4 GHz WiFi for the panel.

The documentation and install guide live at jtenniswood.github.io/espcontrol, with a dedicated install page linked from the README.

## The card type list is the real specification

The list of dedicated card types is long, and it is the best description of what the panel can actually do.

Switch, Lights, Action, Local Action, Option Select, Webhook, Trigger, Sensor, Local Sensor, Doors and Windows, Presence, Slider, Fans, Vacuum, Lawn Mower, Cover, Garage Door, Lock, Alarm, Date and Time, World Clock, Weather, Camera, Media, Climate, Internal Switches, Screen Lock, and Subpage.

Read carefully, that list splits into three groups. There are the actuator cards, the ones that send a command, from Switch and Lights through to Lock, Alarm and Garage Door. There are the readout cards, Sensor, Local Sensor, Weather, Date and Time, World Clock, Camera and Media, which show a value. And there is a third group that is specific to this project rather than to Home Assistant: Local Action, Local Sensor, Internal Switches and Screen Lock are panel-side things, and the mention of built-in relays on supported panels in the what you can control list says the panel can also act on its own hardware.

The remaining features build on that. Subpages give you folder-like pages for rooms or groups of controls, and different card sizes let you make important controls larger. Drag-and-drop layout moves controls around without editing files, and the panel supports a Home Assistant action surface of scenes, scripts, automations, buttons, webhooks and helper changes. Display scheduling uses idle timers, night schedules, brightness controls and optional presence sensors so the screen behaves in a real room rather than glowing all night, and there is a screensaver and brightness control on top of that.

There is also a backup and restore feature, so you can save your layout and copy it to another panel, and automatic updates that keep the firmware current after the first install. Language support is there, with translation files available for contributors.

## Five panels, from a 16 pound screen to a 10 inch one

The supported screens table is unusually concrete, and it is the table to check before buying anything.

Five models are listed. The 10.1 inch JC8012P4A1 is 1280x800 landscape with 20 card slots, on an ESP32-P4, at about 40 pounds. The 7 inch JC1060P470 is 1024x600 landscape with 15 card slots, also on an ESP32-P4, at about 40 pounds. The 4.3 inch JC4880P443 is 480x800 portrait with 6 card slots, on an ESP32-P4, at about 24 pounds. The 4 inch ESP32-P4 86 Panel is 720x720 square with 9 card slots, on an ESP32-P4, at about 45 pounds. The 4 inch 4848S040 is 480x480 square with 9 card slots, on an ESP32-S3, at about 16 pounds.

The slot count is the interesting column. It is the number of cards the screen can hold at its default size, so it tells you how much a given panel can hold before you start designing around smaller cards.

Only two processors appear, the ESP32-P4 for four of the five panels and the ESP32-S3 for the cheapest one, which is a useful thing to know if you are mixing models across rooms and want to know whether the same behaviour is available on all of them.

The 3D mount row links to MakerWorld models for stands and cases for each panel, so the physical side of the project, the desk stand and the desk mount for the 7 inch model, the stand for the 10.1 inch one, the stand for the 4.3 inch one, the waveshare desk stand for the 86 panel and the case stand for the 4848S040, is handled by the community rather than the project.

## The Python check tasks are the project's real specification

The package.json is not a JavaScript manifest in the usual sense. The package is marked private, the licence field says PolyForm-Noncommercial-1.0.0, and every script is a Python invocation.

The scripts call a single driver, python3 scripts/check_tasks.py, with a run or run-task verb and a task name. The task names describe what the project checks: backup-contract, card-contract-outputs, card-runtime-coverage, config, cover-art-contract, device-matrix, device-profiles, device-api, preview-features, firmware-card-runtime, firmware-display-tokens, firmware-ha-bindings, firmware-parser, firmware-modals, firmware-modal-layouts, and the ci aggregate. There is a check:all that runs everything, a check:fast for the quick subset, and a check:parallel that runs the fast set with --jobs 4.

The names are the interesting part, because they read as a list of contracts. A backup contract means the backup and restore feature has a defined shape that is checked. Card contract outputs and card runtime coverage mean the card types listed in the README are verified against both the contract and the runtime. A device matrix and device profiles mean the supported screens table is not prose but data that is checked. Firmware checks cover the parser, the Home Assistant bindings, the display tokens and the modals, and a cover art contract covers the artwork.

There is a prepare:ci script, python3 scripts/prepare_ci.py, which suggests the checks need a prepared environment before they run.

The repository layout matches this structure, with src/, components/, common/, devices/, product/, builds/, compatibility/, scripts/, tests/ and docs/ at the top level, plus AGENTS.md, DEVELOPERS.md, a .agents/ directory, renovate.json for dependency updates and a tsconfig.json. The developers document and the agents directory suggest the project is worked on with a significant amount of process around it.

## The licence permits noncommercial use only

The licence is the one item in this repository that needs a decision rather than a note.

The package metadata declares PolyForm-Noncommercial-1.0.0, and the repository carries both a LICENSE file and a NOTICE file. The licence field in the repository's own metadata records it as a custom licence that GitHub cannot classify, which is what happens when a licence is a non standard instrument rather than one of the OSI identifiers, and PolyForm is a family of source available licences with a noncommercial variant.

The practical reading is narrow and clear. Use it for a home installation, where nobody is being paid for the deployment, and it is fine. Use it in a product that a business sells, or in a paid installation, and the terms are not the permissive ones most people assume when they see a published open source project. The NOTICE file is there to record attribution, and the LICENSE file is the document to read before you build anything commercial on it.

That is an observation about where the terms are, not a reading of them, and the difference matters here because the rest of the project looks like ordinary open source. It is MIT shaped in the sense that the code is readable, buildable and forkable, but the licence is the part that decides whether you may ship it.

For a home user, the practical consequences are minimal. For anybody thinking of a business deployment, this is the first thing to check, and it is cheaper to check now than to unpick it later.

## Where a dedicated panel is the wrong answer

The limits are mostly about what a wall panel cannot be, and about the hardware it commits you to.

The first is that a panel only shows what Home Assistant can see. The README is careful here, saying EspControl works with devices and helpers that are already in Home Assistant, and ending with the line that if Home Assistant can see it, EspControl is designed to make it easier to put that control or information on a touchscreen. Anything Home Assistant cannot already see, the panel cannot show.

The second is that a fixed panel is a fixed surface. A tablet on a wall, running the Home Assistant dashboard, gives you every entity and a browser, at the cost of a larger device, a power supply and a browser to maintain. The panel gives you a purpose-built interface with card types, subpages and scheduling, at the cost of only supporting what the panel supports and only being as good as the screen you chose.

The third is the hardware commitment. You are buying a specific panel, and the supported screens table has five rows, two processors and two images that are still marked as pending. If your panel is not in the table, the project cannot help you, and the 4 inch 4848S040 on the older ESP32-S3 is the one model whose processor differs from the rest.

The fourth is operational. A panel on a wall is not something you can reach when it stops working, which is why the automatic updates, the backup and restore feature and the layout editing from a phone browser matter more here than they would in a browser tab.

## Conclusion

Adopt EspControl if you want a wall mounted control panel that runs on its own, that keeps working when the internet does not, and that costs a fraction of a tablet, especially if you are comfortable with the five supported panel models and with Home Assistant on your own network. Do not adopt it if you need the panel for anything commercial, since the licence is PolyForm Noncommercial, and do not adopt it if your controls need something Home Assistant cannot already see. Verify first which panel model you own against the supported screens table, that the panel's firmware and your Home Assistant instance are on versions this release supports, and that the licence terms in the LICENSE and NOTICE files match what you intend to do with it.

## FAQ

### How do I install EspControl on an ESP32 touchscreen?

You install the firmware from a browser using the web installer, connect the screen to WiFi with the setup screen it creates, add the panel to Home Assistant when it is discovered, allow Home Assistant actions so the panel may control your devices, and then open the panel's web page to choose the buttons, sensors, pages, active colour and display settings. You need a USB-C data cable, a computer running Chrome or Edge, and 2.4 GHz WiFi.

### Which ESP32 screens does EspControl support?

Five models are listed: the 10.1 inch JC8012P4A1 with 20 card slots, the 7 inch JC1060P470 with 15, the 4.3 inch JC4880P443 with 6, the 4 inch ESP32-P4 86 Panel with 9, and the 4 inch 4848S040 with 9 on the older ESP32-S3. The full details are in the supported screens table in the README.

### What can the EspControl panel control?

Anything already in Home Assistant, including lights, switches, fans, plugs, scenes, scripts, buttons, automations, blinds, covers, garage doors, media players, climate devices, sensors, weather, clocks and dates, plus built-in relays on supported panels. The panel exposes that through a long list of card types.

### Can I use EspControl commercially?

The package metadata declares the licence as PolyForm-Noncommercial-1.0.0, and the repository carries a LICENSE file and a NOTICE file. The terms of those files are the ones to check before any commercial use, since a noncommercial licence restricts deployment for profit.

## Sources

- [Issues](https://github.com/jtenniswood/espcontrol/issues)
- [jtenniswood/espcontrol on GitHub](https://github.com/jtenniswood/espcontrol)
- [Project website](https://jtenniswood.github.io/espcontrol/)
- [README](https://github.com/jtenniswood/espcontrol/blob/main/README.md)
- [Releases](https://github.com/jtenniswood/espcontrol/releases)

---

Hysen Labs editorial analysis, written from the project's own repository and release notes. Cite the canonical page: https://hysenlabs.com/projects/jtenniswood-espcontrol
