Skip to main content

Homey ESPHomeDriver

PyPI version PyPI downloads Python CI License: MIT Ruff Status Homey

This module can be used to make the development of ESPHome apps for Homey easier.

It is essentially a map-tool from Homey-capabilities to ESPHome entities.

This module requires Homey Apps SDK v3.

Related Modules

Installation

$ pip install homey-esphomedriver

Homey apps declare it next to aioesphomeapi in app.json / .homeycompose/app.json:

"pythonPackages": ["aioesphomeapi", "homey-esphomedriver"]

Also checkout [aioesphomeapi](https://github.com/esphome/aioesphomeapi) if you want to talk to the ESPHome Native API directly, without homey-esphomedriver.

$ pip install aioesphomeapi

Changelog

See CHANGELOG.md.

Requirements

This module requires Homey Apps SDK v3 (Python 3.14 runtime).

Usage

Your device should extend EspHomeDevice. This is the class you most likely want to extend from. Your driver should extend EspHomeDriver.

Product identity lives on the Homey driver like Zigbee productId: an esphome object in driver.compose.json. EspHomeDriver reads it from self.manifest. driver.py and device.py can re-export the stock classes when you do not need extra logic.

Driver compose

{
  "name": { "en": "AQ-1" },
  "class": "sensor",
  "$extends": ["esphome-defaults"],
  "esphome": {
    "clientInfo": "Homey EverythingSmart",
    "projects": ["EverythingSmart.AQ-1"],
    "hiddenEntities": ["status_led"],
    "deviceEntities": { "voc": "measure_tvoc" },
    "deviceClassOverrides": { "aq_1": "sensor" }
  }
}
Compose key Python BrandProfile field Purpose
projects projects Exact ESPHome project.name this driver accepts
projectPrefix project_prefix Prefix match such as Brand.
clientInfo client_info Name shown on the node for this Homey client
hiddenEntities hidden_entities Hide extra entities (status LED, OTA helpers)
deviceEntities device_entities Remap an entity to a Homey capability
deviceClassOverrides device_class_overrides Force Homey class from an entity id

Omit projects / projectPrefix to accept every project (io.esphome). If both are set, either match is enough.

A class-level brand_profile = BrandProfile(...) on the driver still overrides compose. Use that for after_map.

Driver

# drivers/aq-1/driver.py
from homey_esphomedriver import EspHomeDriver

homey_export = EspHomeDriver

Device

# drivers/aq-1/device.py
from homey_esphomedriver import EspHomeDevice

homey_export = EspHomeDevice

Lifecycle hooks

Core owns on_init and on_uninit on EspHomeDriver and EspHomeDevice. Subclass the hooks below instead — same pattern as homey-oauth2app's onOAuth2Init. Brand app.py exports Homey's App.

Class Override When
EspHomeDriver on_esphome_init / on_esphome_uninit After Flow listeners / before teardown
EspHomeDevice on_esphome_init(client) / on_esphome_uninit After capability wiring; client is None when host is unknown

On a paired device, use self.client for the live EspHomeClient (may exist before the API handshake). Capability commands still require a connected session via _require_client() / available.

Debug logging uses env.json DEBUG; there is no separate class flag.

# drivers/aq-1/device.py
from homey_esphomedriver import EspHomeClient, EspHomeDevice as BaseDevice


class EspHomeDevice(BaseDevice):
    async def on_esphome_init(self, client: EspHomeClient | None) -> None:
        await super().on_esphome_init(client)
        if client is not None:
            self.log(f"API session started for {client.host}")


homey_export = EspHomeDevice

Homey Compose files

Homey Compose runs before Python, so $extends / $template only see files already in the app. When homey-esphomedriver is listed in pythonPackages, Homey CLI copies this package's templates into .homeycompose/ during preprocess (homey app run, build, validate), before compose. That is what makes "$extends": ["esphome-defaults"] and pair "$template": "enter_key" resolve.

Until that CLI is released, or when the package is unpublished, run the same copy by hand:

$ esphome-homey sync

-p / --path selects an app directory other than the current one. sync leaves app.json, app.py, driver.compose.json, and existing driver code alone unless --force.

A brand app is a normal Homey Python app:

$ homey app create
$ homey app dependencies add aioesphomeapi homey-esphomedriver
$ homey app driver create

Then set $extends and the esphome block on each driver's driver.compose.json, add store images, and publish with Homey CLI.

Documentation

See ARCHITECTURE.md for what devices get from Homey and how a brand listing is an esphome compose block on top of this core.

  • [esphome-homey](https://github.com/Doekse/esphome-homey) — generic Homey app (io.esphome; any ESPHome node)

License

MIT. See LICENSE.

Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

homey_esphomedriver-0.2.0.tar.gz (148.9 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

homey_esphomedriver-0.2.0-py3-none-any.whl (206.8 kB view details)

Uploaded Python 3

File details

Details for the file homey_esphomedriver-0.2.0.tar.gz.

File metadata

  • Download URL: homey_esphomedriver-0.2.0.tar.gz
  • Upload date:
  • Size: 148.9 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/7.0.0 CPython/3.13.14

File hashes

Hashes for homey_esphomedriver-0.2.0.tar.gz
Algorithm Hash digest
SHA256 1c8b1aea86f8b2a8bf477358ed0dcf5d636a0206b19ab343434aad136658902a
MD5 f3e4f1e69d09971c69f4841ac5b9dfb7
BLAKE2b-256 e226e044ae14c76074084a2e2b861796c52782aca88736713fc351cfd38bcac8

See more details on using hashes here.

Provenance

The following attestation bundles were made for homey_esphomedriver-0.2.0.tar.gz:

Publisher: publish-pypi.yml on Doekse/homey-esphomedriver

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file homey_esphomedriver-0.2.0-py3-none-any.whl.

File metadata

File hashes

Hashes for homey_esphomedriver-0.2.0-py3-none-any.whl
Algorithm Hash digest
SHA256 e1e8f51253abe9770b106c133ac1a5e1aabf15da4acf4f91e04d606241e2ed50
MD5 240c151e142411ba5d7b13a4bba1f7b6
BLAKE2b-256 4e37c0a93b5dc2372a22dd1fffba3036370bf4d2c6baa77d45895aa623db699f

See more details on using hashes here.

Provenance

The following attestation bundles were made for homey_esphomedriver-0.2.0-py3-none-any.whl:

Publisher: publish-pypi.yml on Doekse/homey-esphomedriver

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

Release history Release notifications | RSS feed

0.4.1

2 files

0.4.0

2 files

0.3.0

2 files

This release

0.2.0 This release

2 files

0.1.0

2 files

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page