A custom Home Assistant integration for OOLY Wi‑Fi LED controllers. It communicates with each controller directly over its local HTTP/JSON API; no cloud service or authentication is involved. The controllers are ESP‑based and expose five PWM channels (R, G, B, cold white, warm white).
- Local control over HTTP (
iot_class: local_polling); no cloud dependency. - UI configuration (config flow) with mDNS/zeroconf discovery; multiple controllers are supported.
- Per‑device controller type — tunable white, colour, or colour + white — selected at setup and changeable later via the reconfigure flow.
- Light control: power, brightness, RGB colour, colour temperature, and transitions.
- Optimistic state with periodic background polling for external changes and availability.
- Automatic retry of transient device responses (
503 BUSY, post‑boot403 BOOT_NOT_CONFIRMED). - Stable device identity by MAC address.
The controller type reflects intended use rather than wiring: a five‑channel controller may be operated as tunable white only.
| Type | Colour mode | Controls |
|---|---|---|
| Tunable white (CCT) | color_temp |
Brightness, colour temperature |
| Colour (RGB) | rgb |
Brightness, colour |
| Colour + white (RGB + CCT) | rgb + color_temp |
Brightness; colour or colour temperature |
For the RGB + CCT type the two domains are interlocked: setting a colour clears the white channels, and selecting a colour temperature clears the colour channels, so the active colour mode is always unambiguous. The type can be changed under Settings → Devices & Services → (device) → ⋮ → Reconfigure.
- Home Assistant 2024.8 or newer.
- An OOLY controller reachable on the local network (HTTP API on port 80).
- A static or DHCP‑reserved address for the controller is recommended.
- In HACS, open Integrations → ⋮ → Custom repositories.
- Add the repository URL with category Integration, then install it.
- Restart Home Assistant.
- Copy the
custom_components/oolydirectory into the Home Assistant configuration directory, resulting in<config>/custom_components/ooly/. - Restart Home Assistant.
- Open Settings → Devices & Services → Add Integration and select OOLY.
- Enter the controller's IP address or hostname.
- Select the controller type (CT / RGB / RGB + CCT).
Discovered controllers also appear under Settings → Devices & Services → Discovered.
Each controller is represented by a single light entity. For the RGB + CCT type it
provides both a colour control and a colour‑temperature control; for the CT and RGB types
it provides the corresponding control only.
- State. Commands are applied optimistically for immediate feedback. The controller is polled in the background (10 seconds by default, configurable via the reconfigure flow) to reflect external changes and offline state.
- Colour temperature. Sent to the controller as
cct_k. The supported range is read from the device (cct_ww_kelvin..cct_wc_kelvin); the constants inconst.pyare a fallback. - Resilience. Transient
503 BUSYand post‑boot403 BOOT_NOT_CONFIRMEDresponses are retried automatically, honouringRetry-After.
- Address changes. A reserved address avoids this. Otherwise the stored address is updated on the next discovery, or the controller can be re‑added — it is matched by MAC, so no duplicate is created.
- Discovery. Controllers are discovered by their dedicated
_ooly._tcpmDNS service, independent of the device name, so renaming a controller does not affect it. If a controller is not discovered (for example, mDNS is blocked across subnets/VLANs), add it manually by IP. - Incorrect control shown. Set the correct controller type via the reconfigure flow.
scripts/deploy.sh synchronises custom_components/ooly/ to a Home Assistant instance
over SSH and restarts it:
OOLY_HA_HOST=root@192.168.0.10 ./scripts/deploy.shIt requires the Advanced SSH & Web Terminal add‑on (for rsync and the ha CLI) and SSH
key authentication; see ./scripts/deploy.sh --help for options.
Linting and tests run in CI (ruff, hassfest, HACS validation, pytest) and locally:
python -m venv .venv && . .venv/bin/activate
pip install -r requirements_test.txt
pytest
ruff check .Released under the MIT License.