A custom Home Assistant integration that controls the Inspire Siroco+ ceiling fan (and its light kit) through the Enki cloud (Leroy Merlin / Adeo). The Siroco+ can normally only be controlled from the Enki mobile app; this integration exposes it as native Home Assistant fan and light entities.
It talks exclusively to the official Enki servers
(keycloak-prod.iot.leroymerlin.fr for authentication and
enki.api.devportal.adeo.cloud for the API) using your Enki account
credentials. No third-party service is involved.
| Feature | Entity | Details |
|---|---|---|
| Fan on/off | fan |
Speed 0 = off |
| Fan speed | fan |
6 speeds mapped to the Home Assistant percentage slider |
| Breeze mode | fan |
Exposed as the breeze preset mode; picking a speed returns to manual mode |
| Rotation direction | fan |
Summer/winter (forward/reverse), when the device reports support |
| Light on/off | light |
Independent from the fan motor |
| Light brightness | light |
Home Assistant 0-255 mapped to the API 0.0-1.0 range |
| Light color temperature | light |
2748 K to 6500 K, snapped to the discrete values the device supports |
| Config flow | — | UI setup with email, password and polling interval |
| Reauthentication | — | Guided flow when your Enki password changes |
| Translations | — | English and French |
The integration is installable as a HACS custom repository:
- In Home Assistant, open HACS.
- Click the ⋮ menu (top right) → Custom repositories.
- Add this repository URL (
https://github.com/ghislainfrs/enki-siroco-ha) with type Integration. - Search for Enki Siroco+ in HACS and install it.
- Restart Home Assistant.
Updates are then offered directly through HACS.
- Download this repository (or a release archive).
- Copy the
custom_components/enki/folder into thecustom_components/folder of your Home Assistant configuration directory (e.g. via Samba or SSH:/config/custom_components/enki/). - Restart Home Assistant.
- Go to Settings → Devices & services → Add integration.
- Search for Enki.
- Enter your Enki account email and password (the same credentials as the Enki mobile app).
- Optionally adjust the polling interval (default 120 seconds, allowed range 30 to 3600 seconds).
- Submit. Your Siroco+ fan and its light kit appear as one device with a fan entity and a light entity.
You can later change the account or the polling interval through the integration's Reconfigure option, and Home Assistant will prompt you to re-enter the password (Reauthenticate) if it stops being accepted.
- The Enki cloud does not offer a public push channel, so this integration polls device states (a few lightweight requests per cycle).
- Default interval: 120 seconds. Lower values (down to 30 s) make state changes made from the Enki app show up faster, at the cost of more cloud requests; higher values (up to 3600 s) minimize traffic.
- Commands sent from Home Assistant are reflected immediately in the UI (optimistic updates), and a confirmation refresh runs a few seconds after each command — you do not have to wait for the next polling cycle.
- Double-check that no personal data is committed (see the privacy note below): no credentials, no home/device identifiers, no diagnostic dumps.
- Push and verify that the Lint and Validate GitHub Actions pass.
- Your Enki credentials are stored only in Home Assistant's local storage (the config entry), and are sent only to the official Enki servers. Tokens and passwords are never logged.
- Never share the contents of
tools/out/(diagnostic dumps): the EnkihomesAPI returns your postal address along with home and device identifiers. That folder is git-ignored on purpose — keep it that way.
- Diagnostic tool:
tools/diagnose.pyis a standalone test bench that runs outside Home Assistant. It can log in, list your devices, dump the Siroco+ state and exercise each command (speed, breeze, rotation, light) one by one. Its output goes to the git-ignoredtools/out/folder. - Unit tests: the API client is covered by tests with mocked HTTP
responses (no real account needed). Run them with
pytestfrom the repository root. - Lint:
ruff check custom_components(also enforced by CI).