I’ve been using HA since the very first RPi was the go-to platform and have recently been trying ESPHome. I’m an experienced HW and SW designer and ESPHome has great potential, especially the Device builder. After a few weeks of experimenting, chasing down blind alleys and dead ends, as well as some satisfying progress a few general impressions have emerged that I haven’t seen mentioned elsewhere so I thought I’d start a discussion here. And, FWIW, in spite of the issues I’m reporting on, I have found ESPHome to be much more approachable, promising and reliable than other frameworks I’ve been trying, including Arduino, Platform.IO, Circuit Python and Micro-Python. In each case I’ve hit roadblocks with missing or defective libraries, unnecessary complexity in describing what I’m trying to do, or other issues.
At the topmost level, ESPHome seems to struggle a lot with finding a coherent nomenclature for important concepts and communicating those to its users in a way that helps them understand exactly what they are constructing and how those concepts relate and interact. I’ll list a few examples but there are so many others it would distract from my main point to list them.
- For example, what a “platform” is, and why it matters whether something is or is not a platform is not clear at all.
- I can discern a method behind the madness of “output:s” not being visible to HA, but it’s only a guess inferred from how things like switches, sensors, etc, are described.
- Keywords are reused in different contexts (e.g. “inverted:” in Pin Schemas and in “outputs:”) but their descriptions are nearly identical and what happens when they both exist can only be figured out through trial end error.
- The “Advanced parameters” for light objects are presented in the GUI without any logical ordering or grouping that would make it easier to infer behavior and how they interact.
- When things like “on_boot:” automations occur relative to initialization of e.g. ethernet or WiFi initialization is unknowable except by experimenting with almost random sets of other automations or actions, lambdas, etc.
My key input is that addressing this really need some holistic architectural attention to refactoring and harmonizing the concepts behind I/O classes, disambiguating terms and keywords for each context, and what is executed when. Additional or updated documentation and a lot of probably “little” updates in a lot of places are needed to help users get things working right the first (or second) time.. Overall, it has the feel of something with breakthrough potential but a lot of technical debt. That’s why it needs a top-down approach.
So perhaps I’m missing something here and if my impression is off base I’d be delighted to get pointed in the right direction. I haven’t been able to discover it yet however.

