Premium local control for Fluval aquarium LED lights in Home Assistant.
No cloud. No vendor app dependency. Just Bluetooth, your tank, and automations that behave.
Fluval BLE turns compatible Fluval aquarium lights into first-class Home Assistant devices. Control power, colour, brightness, lighting modes, and connection health directly from your dashboard while keeping every command local over Bluetooth Low Energy.
| Feature | Description |
|---|---|
| Local-first control | Talk directly to the LED fixture over BLE; no internet, cloud account, or app login required. |
| Native light control | Use Home Assistant's standard light card for power, brightness, colour, and supported controller-native effects. Product-specific FluvalConnect data translates the colour picker to the fixture's physical channels. |
| Exact channel controls | Adjust every physical emitter with the same 0–100% channel layout and product-specific labels used by FluvalConnect. These sliders remain the authoritative control for exact spectrum tuning. |
| Native effects | Use the light card to select the weather and lighting effects supported by the detected fixture. |
| Native fixture schedules | Store Auto, Professional, and timed-effect schedules directly on supported fixtures so they continue running without Home Assistant. |
| Daylight-saving control | Supported fixtures expose their onboard daylight-saving setting as a configuration switch. |
| Mode | Select Manual, Automatic, or Professional from a dropdown. Setting a colour automatically switches the fixture to Manual mode. |
| Reachability | Shows whether the fixture was seen recently over BLE instead of treating an expected idle GATT disconnect as a failure. |
| Auto-discovery | Home Assistant detects nearby Fluval lights and prompts you to add them—no manual searching required. |
| Bluetooth routing | Works with local Bluetooth adapters and ESP32 boards running ESPHome Bluetooth Proxy. Home Assistant automatically selects the best connectable route on each connection. |
Entities are created per device around one native colour light, with exact physical-channel sliders, mode, and connection status alongside it. Everything updates from the device when it sends state, so the UI stays in sync.
The integration recognizes the light catalogue defined by the current FluvalConnect APK, including:
- Aquasky 2.0 and 3.0 (4-channel RGBW)
- Plant 3.0, Plant 4.0, Plant Nano 4.0, and Plant PRO (5 channels)
- Marine/Reef 3.0, Reef 4.0, and Reef Nano 4.0 (5 channels)
- Siena 2.0 and Roma & Shaker 2.0
- First-generation Wing Nano, Roma, Vicenza, Venezia, A-Sky Aqua, and Plant Aqua fixtures
Information advertised by the light selects its FluvalConnect model, channel layout, and available effects. An unidentified light uses a generic layout until its fixture profile can be confirmed. See the technical reference for product and protocol details.
- Home Assistant 2024.1.0 or later with a working Bluetooth stack. This can be a local adapter or an ESP32 board running ESPHome Bluetooth Proxy.
- The Fluval light must be in range and powered on so it advertises over BLE.
- Your HA host (or the machine running the Bluetooth proxy) must be able to see the light in BLE scans.
No adapter selection is required in this integration. It asks Home Assistant for the best currently connectable route, allowing HA to use or switch between a local adapter and ESPHome Bluetooth proxies as signal and availability change.
- Ensure HACS is installed.
- In HACS: Integrations → ⋮ → Custom repositories.
- Add:
https://github.com/MrMooreUK/fluvalbleType: Integration. - Search for Fluval Aquarium LED or Fluval BLE, then install.
- Restart Home Assistant.
- Download or clone this repo.
- Copy the
custom_components/fluvalblefolder into your Home Assistantcustom_componentsdirectory so you have:config/ └── custom_components/ └── fluvalble/ ├── __init__.py ├── manifest.json ├── config_flow.py ├── ... - Restart Home Assistant.
When Home Assistant detects a Fluval light advertising over BLE, it will show a notification in Settings → Devices & services prompting you to set it up. Click Configure, confirm the device name, and the integration is ready.
- Go to Settings → Devices & services → Add integration.
- Search for Fluval Aquarium LED (or Fluval BLE).
- Select your light from the dropdown. The list shows only devices that look like Fluval lights (by Bluetooth service or name), so your aquarium light is easy to find. Ensure the light is on and in range before adding.
- If your light appears: choose it and submit. The integration creates one device with a primary light entity, exact channel sliders, mode select, identify and clock-sync buttons, connection status, and diagnostic sensors.
- If it's not in the list: choose "My device isn't in the list — enter MAC address manually", then enter the MAC (e.g.
AA:BB:CC:DD:EE:FF). You can find the MAC in your phone's Bluetooth settings or the Fluval app.
- After setup, the light and supporting entities appear on the device. If you only see the integration card (for example, "Update") and no light entity, see Troubleshooting below.
No cloud account or app login is needed; the integration talks directly to the light over BLE. When the product is identified, the device page uses FluvalConnect's model name and channel layout. A manual lamp profile remains available for unidentified fixtures. The firmware version also appears in standard device information when the fixture reports it.
Redacted diagnostics can be downloaded from the integration or device page in Home Assistant. The report retains protocol, profile, connection, command, and schedule evidence while removing Bluetooth addresses, names, manufacturer and service payloads, paths, and registry identifiers. Creating the report does not disconnect, scan for, reconnect to, or send commands to the light.
Open the integration's Configure dialog to adjust its BLE connection behavior.
The Active connection window accepts 0 for a persistent connection or
30–600 seconds for an idle timeout. Persistent mode provides the lowest
command latency and reconnects immediately after an unexpected drop. A finite
window releases the Bluetooth connection when idle so the official Fluval app
or a Fluval gateway can connect. The backward-compatible default is 120
seconds. The Connection mode diagnostic reports Persistent or the exact
configured timeout, such as 30 seconds.
Signal strength and the timestamp diagnostic remain registered but are disabled in persistent mode because advertisement-derived values are not meaningful for an open GATT session. Selecting a finite timeout and reloading the integration restores those same entities, with their existing entity IDs and history. Entities disabled manually by the user remain disabled. In finite mode, the timestamp is shown as Last seen for the latest confirmed fixture activity.
The optional Restore previous mode after channels reach zero setting keeps exact channel-slider adjustments in Manual mode while any channel remains above zero. When every channel reaches zero, the fixture turns off immediately; after three seconds without another channel, power, or mode command, it returns to the Auto or Professional mode that was active before the adjustment. The setting is off by default because restoring a hardware-scheduled mode can turn the fixture back on according to its stored schedule.
Some newer fixtures, including Plant PRO and Plant 4.0, permit only one Bluetooth controller at a time. Persistent mode therefore prevents the official app or gateway from connecting while Home Assistant holds the connection, and it also continuously occupies one local-adapter or ESPHome proxy connection slot.
Optional dashboard cards are available for Auto and Professional schedule editing,
timed effects, fixture readback, and spectrum previews. See
docs/lovelace-cards.md for setup instructions,
example YAML, usage notes, and preview safety guidance.
The cards label channels for the detected product, show whether schedule data is local or confirmed by the fixture, and preview schedules without uploading unsaved editor values.
Supported fixtures can keep schedules in their own memory. The integration provides actions for Auto and Professional schedules, timed effects, manual presets, and schedule previews under Developer tools → Actions. The action UI contains the available fields, complete examples, and a Fluval light picker. Existing automations and bundled cards that identify a light by config-entry ID or Bluetooth address remain compatible.
Classic fixtures also expose their four fixture-resident manual presets as Manual preset P1 through P4 scene entities. Activating a scene recalls the exact channel values read from that slot. Saving remains an explicit action because it overwrites the selected slot in the physical fixture.
Schedule previews use data already stored by the fixture and never upload unsaved editor values. Using the normal light, Mode controls, or channel sliders stops an active preview before applying the requested change. If stopping the preview fails, the channel change is not sent and Home Assistant reports the error. The dedicated Stop preview action restores the prior fixture mode.
Supported fixtures also expose their onboard daylight-saving setting. See the technical reference for controller limits, readback behavior, and protocol details.
After setup you'll see one device with entities like:
| Entity | Display name | Purpose |
|---|---|---|
| Light | Light | Power, brightness, colour, and supported native effects. |
| Numbers | Product-specific channel names | Exact 0–100% control of each physical emitter: Red / Green / Blue / White for AquaSky, or the five APK-defined Plant or Marine channels. |
| Select | Mode | Manual / Automatic / Professional. |
| Scenes | Manual preset P1–P4 | Recalls one fixture-resident manual preset on classic controllers. |
| Button | Identify | Runs the fixture's native FluvalConnect Find command so the physical light identifies itself. |
| Binary sensor | Reachable | Fixture seen recently over BLE; raw GATT connection state remains available as an attribute. |
| Sensors | Connection mode / Signal strength / Source / Last seen | Bluetooth diagnostics. Connection mode reports Persistent or the configured timeout. Signal strength and Last seen remain registered but are disabled in persistent mode; Source shows the active route's friendly name. |
| Button | Sync Clock | Synchronizes the fixture's real-time clock with Home Assistant. |
| Switch | Daylight saving time | Onboard setting available on supported AquaSky 3.0 fixtures. |
The channel sliders are the exact fixture state and match FluvalConnect's manual controls. The standard light entity is a convenience layer: its colour picker converts RGB requests through the detected product's APK spectrum data, and its brightness control scales the current channel proportions. Moving a channel slider immediately updates the light entity's best-fit displayed colour and brightness, but that approximation is never written back to the fixture.
Entity IDs follow the pattern <platform>.fluval_<mac_without_colons>_<name>, for example light.fluval_aabbccddeeff_light. You can find the exact IDs in Settings → Devices & services → Fluval Aquarium LED → entities.
If a light, mode, daylight-saving, Identify, or Sync clock command cannot reach
the fixture, Home Assistant reports the BLE failure directly in the action UI
and automation trace rather than showing an apparent success.
Turn the tank light on at sunrise and off at sunset
- id: fluval_morning
alias: "Tank light on at sunrise"
trigger:
- platform: sun
event: sunrise
action:
- service: light.turn_on
target:
entity_id: light.fluval_aabbccddeeff_light
- id: fluval_evening
alias: "Tank light off at sunset"
trigger:
- platform: sun
event: sunset
action:
- service: light.turn_off
target:
entity_id: light.fluval_aabbccddeeff_lightSet a dim blue colour when you're away
- id: fluval_away_dim
alias: "Dim tank light when away"
trigger:
- platform: state
entity_id:
- person.you
to: "not_home"
action:
- service: light.turn_on
target:
entity_id: light.fluval_aabbccddeeff_light
data:
brightness_pct: 35
rgb_color: [0, 80, 255]Notify if the light disconnects
- id: fluval_disconnect
alias: "Tank light disconnected"
trigger:
- platform: state
entity_id: binary_sensor.fluval_aabbccddeeff_reachable
to: "off"
action:
- service: notify.mobile
data:
message: "Fluval tank light lost connection."Replace aabbccddeeff with your device's MAC (without colons), and person.you / notify.mobile with your actual entity IDs and services.
| Issue | What to try |
|---|---|
| Integration not found | Restart HA after installation. Ensure the fluvalble folder is directly under custom_components. |
| Only see "Update" / "Pre-release", no light or entities | The device wasn't in the Bluetooth cache when the integration loaded. Remove the integration (delete the config entry), ensure the light is on and in range, then add the integration again and select your light from the dropdown. Restart HA after updating the integration. |
| Cannot connect / no entities | Confirm the light is on and in BLE range. Check that HA has Bluetooth enabled and that the adapter can see other BLE devices. Verify the MAC address (no typos, correct format AA:BB:CC:DD:EE:FF). |
| My light isn't in the dropdown | Ensure the light is on and advertising. Use "My device isn't in the list" and enter the MAC manually (from phone Bluetooth settings or the Fluval app). |
| Lamp connected but doesn't respond to actions | Try the Fluval app first to confirm the light works. If the app works but HA doesn't, open an issue with your model and HA logs. |
| ESPHome proxy is online but commands are unreliable | Check Source for the adapter or proxy that owns the active connection, then check that proxy's Wi-Fi signal and scan settings. The integration asks HA for the best connectable route on reconnect; no adapter needs to be disabled manually. |
| Light entity doesn't turn the fixture on/off | Ensure the light model uses the same BLE command set. Try toggling once from the Fluval app, then again from HA. Restart HA and retry. |
| Entities show "unavailable" | The light may be out of range or off. Move the light or HA adapter closer; check Reachable, Last seen, and RSSI. An idle GATT disconnect is expected when a finite active connection window is configured. |
| Colour or mode doesn't update | Confirm that the detected model or selected lamp profile is correct, then retry in Manual mode. |
| Colour control doesn't change the light | Confirm the fixture works in the Fluval app, select Manual mode, and retry. If it still fails, download diagnostics from the Fluval integration or device page and include the report with your model when opening an issue. |
If you have a different Fluval BLE model and the light or other controls don't behave as expected, open an issue with your model name and (if possible) a note on what works in the official app.
The integration uses Home Assistant's Bluetooth support to connect through a local adapter or ESPHome Bluetooth proxy. Its controller protocols are based on FluvalConnect and community reverse-engineering work, including the Fluval Plant 3.0 BLE protocol. No data is sent to Fluval or any third party.
Detailed product, protocol, schedule, and connection behavior is documented in the technical reference. Colour conversion and its APK sources are documented separately in APK colour-control evidence.
BLE connection lifecycle:
- Home Assistant selects the best connectable local adapter or ESPHome proxy on each connection.
- Persistent mode keeps the session open; finite mode releases it after the configured idle window.
- Reachable describes recent fixture activity rather than only the current GATT connection.
- Connection mode reports whether the GATT session is persistent or the exact idle timeout.
- Signal strength and Last seen are integration-disabled in persistent mode and restored for a finite timeout; Source shows the active route's friendly name.
- Original integration structure and BLE work by @mrzottel.
- Project maintenance and Home Assistant integration development by @MrMooreUK.
- AquaSky 3 schedule-card work and ESPHome Bluetooth Proxy improvements by @atomicalsoftwares.
- APK-backed product profiles, native controls, effects, schedules, and diagnostics contributed by @Wheemer.
- Plant PRO Bluetooth protocol research and hardware validation by @cryystyy, used under the MIT License.
- Community protocol research shared in the Fluval Plant 3.0 BLE protocol discussion and by the project's contributors.
- Licensed under the Apache License 2.0. See LICENSE in this repo.
Enjoy your smarter aquarium lighting.
This README is the integration's main documentation and is kept up to date with each release in this repo.
