Take back control of your Duux smart devices - locally, privately, and cloud-free.
This project allows you to use your Duux smart devices (fans, air purifiers, heaters, humidifiers, etc.) entirely outside of Duux’s cloud ecosystem by redirecting their MQTT communication to a local broker, giving you full local control via Home Assistant.
No cloud. No account. No lag.
This integration uses a flexible Device Profile architecture designed to easily embrace the entire Duux product family.
Currently officially supported:
- Duux Whisper Flex (Fan)
- Duux Whisper Flex 2 (Fan)
- Duux Whisper Flex Ultimate (Fan)
- Duux Bright 2 (Air Purifier)
If you own any other devices that connect to the Duux Cloud (Dehumidifiers, Heaters, other Fans/Humidifiers/Purifiers, Air Conditioners), you can help add support! Simply capture your device's MQTT payloads and open an Issue or a Pull Request with your device's specifications.
This integration is not (yet) available in the official HACS default repository list. However, you can easily add it as a custom repository:
- Open HACS in your Home Assistant interface
- Click the three dots (⋮) in the top-right corner and select "Custom repositories"
- Paste the following URL:
https://github.com/LouisR-git/duux-fan-local - Select "Integration" as the category
- Click Add, then search for
Duux Fan Localin HACS and install it - Restart Home Assistant to finalize the setup
The integration will now appear like any standard Home Assistant integration.
-
Follow the instructions below to install the required prerequisites:
- ✅ DNS redirection (reroute Duux API calls to your local Broker)
- ✅ MQTT Broker (Mosquitto, EMQX, ...)
-
In Home Assistant, go to
Settings > Devices & Services > Add Integrationand search forDuux Fan Local. -
Provide your MQTT broker credentials (or leave blank for anonymous) and adjust the MQTT Host and Port if necessary.
-
Select your device model from the list.
-
Give your device a friendly name.
-
Enter the MAC address of your Duux device.
💡 You can find it in your router’s connected devices list.
-
Click Submit and enjoy local control of your device!
Duux devices communicate with the cloud using MQTT over TLS. By spoofing the cloud hostname and running your own MQTT broker, you can intercept this traffic and integrate the devices directly into Home Assistant.
You’ll need:
- Control over your local DNS resolution (AdGuard, CoreDNS, dnsmasq…)
- A self-hosted MQTT broker, default reachable as
collector3.cloudgarden.nlon port 443 (can be customized during integration setup) - Basic Linux CLI knowledge
From your local DNS server, redirect the Duux cloud MQTT hostname to your local MQTT server’s IP.
collector3.cloudgarden.nl → 192.168.x.x
Go to AdGuard → Settings → DNS Rewrites
Go to Console → Settings → Policy Engine → DNS → Create a new Host (A) entry
Unplug → remove the battery (if applicable) → wait ~1 second → reinsert → power on.
- Goal: A robust local setup with TLS encryption and username/password authentication.
- 📖 See the EMQX installation guide
- Goal: The quickest option for labs or testing environments.
⚠️ Security: Not secure (anonymous access).- 📖 See the Mosquitto installation guide
| Feature | Key | Command Payload | Value X= |
|---|---|---|---|
| Power | power |
tune set power X |
0: off, 1: on |
| Mode | mode |
tune set mode X |
0: fan mode, 1: natural wind, 2: night mode |
| Speed | speed |
tune set speed X |
1 to 26 |
| Timer | timer |
tune set timer X |
0 to 12 hours |
| Horizontal Osc. | swing |
tune set swing X |
0: off, 1: on |
| Vertical Osc. | tilt |
tune set tilt X |
0: off, 1: on |
| Feature | Key | Command Payload | Value X= |
|---|---|---|---|
| Power | power |
tune set power X |
0: off, 1: on |
| Mode | mode |
tune set mode X |
0: fan mode, 1: natural wind |
| Speed | speed |
tune set speed X |
1 to 30 |
| Timer | timer |
tune set timer X |
0 to 12 hours |
| Horizontal Osc. | horosc |
tune set horosc X |
0: off, 1: 30°, 2: 60°, 3: 90° |
| Vertical Osc. | verosc |
tune set verosc X |
0: off, 1: 45°, 2: 100° |
| Night Mode | night |
tune set night X |
0: off, 1: on |
| Child Lock | lock |
tune set lock X |
0: off, 1: on |
| Battery Level | batlvl |
N/A | 0 to 10 |
| Charging Status | batcha |
N/A | 0: not charging , 1: charging |
| Feature | Key | Command Payload | Value X= |
|---|---|---|---|
| Power | power |
tune set power X |
0: off, 1: on |
| Mode | mode |
tune set mode X |
0: regular, 1: natural, 2: night |
| Speed | speed |
tune set speed X |
1 to 30 |
| Timer | timer |
tune set timer X |
0 to 12 hours |
| Horizontal Osc. | swing |
tune set swing X |
0: off, 1: 30°, 2: 60°, 3: 90° |
| Vertical Osc. | tilt |
tune set tilt X |
0: off, 1: 90°, 2: 105° |
| Setpoint | sp |
tune set sp X |
17 to 28 °C |
| Feature | Key | Command Payload | Value X= |
|---|---|---|---|
| Power | power |
tune set power X |
0: off, 1: on |
| Night Mode | night |
tune set mode X |
0: normal, 1: night mode |
| Speed | speed |
tune set speed X |
0 to 4 (0 is auto) |
| ION Setting | ion |
tune set ion X |
0: off, 1: on |
| Filter Life | filter |
N/A | 0 to 100 (%) |
| PPM 10 | ppm |
N/A | µg/m³ |
| Air Quality | AQ |
N/A | AQI value |
| TVOC | TVOC |
N/A | µg/m³ |
- Charging Status does not update automatically when the battery is fully charged. The device only refreshes this attribute when the Power state changes. This is a firmware limitation.
The devices use MQTT topics to report their state and receive commands.
mqtts://collector3.cloudgarden.nl:443
| Topic | Example Payload |
|---|---|
sensor/{device_id}/in |
{"sub":{"Tune":[{"uid":"xyz","power":1,"mode":0,"speed":10,"timer": 0,"horosc": 0,"verosc": 0,"lock": 0,"night": 1,"batcha": 0,"batlvl": 10}]}} |
sensor/{device_id}/online |
{"online":true,"connectionType":"mqtt"} |
sensor/{device_id}/update |
{"pid":"xyz","tune":"DUUX Whisper Flex 2"} |
The device publishes data immediately when a change occurs, and otherwise every 30 seconds to keep the online status active.
| Topic | Example Payload |
|---|---|
sensor/{device_id}/command |
tune set speed 10 |
sensor/{device_id}/config |
(Unused) |
sensor/{device_id}/fw |
(Unused) |
Your Duux device is now fully cloud-free and controllable through your local network and Home Assistant. Enjoy full privacy, instant response times, and true independence from proprietary services.
Note: When connected to your local MQTT, the device will no longer be able to receive firmware updates from the manufacturer. Disable local DNS forwarding and restart your device to access the web again.
Based on reverse engineering, packet sniffing, vibe coding and a lot of fan noise.
A special thanks to the Home Assistant community for their valuable insights and contributions, especially the discussion in this topic which greatly helped this integration.
Contributions welcome! 🛠️



