Skip to content

Repository files navigation

GitHub Release License hacs pre-commit Black

🌀 Duux Local - Home Assistant Integration

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.

Supported devices

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)

Help expand support

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.

Installation via HACS

This integration is not (yet) available in the official HACS default repository list. However, you can easily add it as a custom repository:

Open your Home Assistant instance and open a repository inside the Home Assistant Community Store.

  1. Open HACS in your Home Assistant interface
  2. Click the three dots (⋮) in the top-right corner and select "Custom repositories"
  3. Paste the following URL: https://github.com/LouisR-git/duux-fan-local
  4. Select "Integration" as the category
  5. Click Add, then search for Duux Fan Local in HACS and install it
  6. Restart Home Assistant to finalize the setup

The integration will now appear like any standard Home Assistant integration.

Initial setup

  1. Follow the instructions below to install the required prerequisites:

    • DNS redirection (reroute Duux API calls to your local Broker)
    • MQTT Broker (Mosquitto, EMQX, ...)
  2. In Home Assistant, go to Settings > Devices & Services > Add Integration and search for Duux Fan Local.

  3. Provide your MQTT broker credentials (or leave blank for anonymous) and adjust the MQTT Host and Port if necessary.

  4. Select your device model from the list.

  5. Give your device a friendly name.

  6. Enter the MAC address of your Duux device.

    💡 You can find it in your router’s connected devices list.

  7. Click Submit and enjoy local control of your device!

Screenshots

config_flow controls fan sensors

Prerequisites

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.nl on port 443 (can be customized during integration setup)
  • Basic Linux CLI knowledge

Local DNS spoofing

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

Example: AdGuard DNS rewrite

Go to AdGuard → Settings → DNS Rewrites

Example: Ubiquiti Unifi Gateway

Go to Console → Settings → Policy Engine → DNS → Create a new Host (A) entry

Reboot the device after DNS changes

Unplug → remove the battery (if applicable) → wait ~1 second → reinsert → power on.

Setting up a local MQTT broker

Option A - EMQX (TLS + Authentication) - Recommended

  • Goal: A robust local setup with TLS encryption and username/password authentication.
  • 📖 See the EMQX installation guide

Option B - Mosquitto (Anonymous TLS)

  • Goal: The quickest option for labs or testing environments.
  • ⚠️ Security: Not secure (anonymous access).
  • 📖 See the Mosquitto installation guide

Supported Features/Models

Whisper Flex

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

Whisper Flex 2

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

Whisper Flex Ultimate

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

Duux Bright 2

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³

Known Issues

  • 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.

Details

The devices use MQTT topics to report their state and receive commands.

Default MQTT Broker Endpoint

mqtts://collector3.cloudgarden.nl:443

Device publishes to:

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.

Device subscribes to:

Topic Example Payload
sensor/{device_id}/command tune set speed 10
sensor/{device_id}/config (Unused)
sensor/{device_id}/fw (Unused)

Result

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.

Credits

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! 🛠️


About

Home Assistant Integration for Duux products with local handling

Topics

Resources

Stars

22 stars

Watchers

0 watching

Forks

Releases

Contributors

Languages