ESPro
ESPro turns physical ESPHome devices into swappable infrastructure beneath stable logical identities.
The Problem
ESPHome ties device identity to physical hardware. When a broken device gets replaced:
- All Home Assistant entity IDs change
- Dashboards break
- Automations need manual updates
- 30+ minutes of recovery work per device
This tool aims to simplify device comissioning and management for professional installers and power users who want to treat home infrastructure as code.
The Solution
Hardware abstraction layer for ESPHome.
Home Assistant connects to stable logical devices (outdoor_light_1), not physical hardware. When a device breaks, update a config file and restart—entity IDs stay stable, automations keep working.
# config/devices.yaml
logical_devices:
outdoor_light_1:
physical: esp-sonoff-1.local
chicken_scale:
physical: esp32-coop.local
Device dies? Change the IP, reload ESPro mappings. Done.
Architecture
Home Assistant (stable entity IDs)
↓
ESPro (device registry + proxy)
↓
Physical ESPHome Devices (swappable)
Three layers with clear responsibilities:
- ESPHome - Firmware and I/O
- ESPro - Hardware abstraction and lifecycle management
- Home Assistant - Automations and UI
Philosophy
Boring technology: Docker, YAML, Git, REST—nothing exotic.
Plain text wins: Configuration in Git-tracked YAML. No database, ever. Audit trail via git log, rollback via git revert, backup via git push.
Infrastructure as code: Reproducible deployments. Version-controlled configuration. Offline-capable.
Unix philosophy: Do one thing well—provide hardware abstraction. Don't replace ESPHome or Home Assistant.
Status
Early development. Validating technical feasibility and gathering community feedback.
Target audience: Professional installers managing 10-1000+ devices across single or multiple sites who need reproducible deployments and version stability.
Questions?
This is a proof-of-concept. Feedback is welcome.
Development
Quick start:
- Install uv
- Install dependencies:
uv sync - Run CLI:
uv run espro --help - Run tests:
uv run pytest
Available invoke tasks (optional, install with uv tool install invoke):
invoke lint- Run ruff and mypyinvoke test- Run tests with coverageinvoke clean- Remove untracked files (interactive)
License
MIT License - see LICENSE file for details.
Metadata
Release files for espro 0.1.0
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | |
|---|---|---|---|
| espro-0.1.0.tar.gz | 4.7 kB | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| espro-0.1.0-py3-none-any.whl | Python 3 | none | any | Details |
Total release size: 10.8 kB
Release files / espro-0.1.0.tar.gz
| Download URL | espro-0.1.0.tar.gz |
|---|---|
| Size | 4.7 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
64bd8f81d63102200858a3c26a68f08ed12542889940ce1836a6eadf676a5533
|
|
BLAKE2b-256 checksum How to use checksums |
a9d969e21348eae302a3456f83baf8d6f506d743edc319a7715b8da49f504e6f
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
uv/0.8.8
|
Release files / espro-0.1.0-py3-none-any.whl
| Download URL | espro-0.1.0-py3-none-any.whl |
|---|---|
| Size | 6.1 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
cb6af16fd5448d9ab62e04b3f55b67b269dce9a18ed02acb505df1eacd7536d1
|
|
BLAKE2b-256 checksum How to use checksums |
7d21648dc512d0249a7492a4791e61875b92f8732b6cb3f430a021e71152ee8d
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
uv/0.8.8
|