One thing that was confusing to me from the start was the seemingly overlapping functionality in __init__.py
and config_flow.py
, but I think I figured it out: async_step_*()
in config_flow.py
is for when a component is first set up, whereas async_setup_entry()
in __init__.py
is for when a config entry for the component has already previously been set up, and so an object can be instantiated for that entry.
As for “my API”, my impression (from both core and non-core integrations) is that if I had a published Python package for the device, I’d just import it (like, for instance, RuuviTag integration imports ruuvitag-ble), but if/as I don’t, I should create the API in a subdirectory of my integration and import it using dot notation.
Hence, naming the files inside the API directory is more a question of general Python convention, rather than something HA has opinions about.
Anyway, while I understand all the complications I keep stumbling over make HA component development scalable, it also makes my tiny button project way more complicated than it should be. There appears to be no way to build a minuscule MVP with just a few lines of code, to be then extended with all the bells and whistles that would make it look and play nice.
Instead it seems easier to just hack some existing code to work with my device (which I’ve already done, semi-successfully). But that means then having to clean up tons of someone else’s code, or, what’s more likely, just leave it all as an ugly hack, never to be published anywhere.