A custom Home Assistant integration to control an Aromadd U5 Pro essential-oil diffuser over Bluetooth Low Energy (BLE).
It exposes the diffuser's power and fan as switch entities.
Note
The BLE protocol was reverse-engineered from a real U5 Pro HCI snoop log, so
on/off works out of the box — no extra configuration needed. Each command is
confirmed by the device's own state-report notification rather than just assumed.
See CAPTURE_GUIDE.md if you want to capture additional
commands (mist level, LED, timers) the same way.
- Confirmed control of the Aromadd U5 Pro over BLE:
- Power switch (main on/off)
- Fan switch (on/off)
- Automatic Bluetooth discovery (the device shows up in Settings → Devices & Services)
- Connects, sends the command, reads back the device's state report, then disconnects so the Aromadd phone app can still reconnect
Commands are framed as:
A5 AA AC | XOR(payload) | <payload> | C5 CC CA
- Written to the GATT characteristic at value handle
0x0012 - The device reports state via notifications on value handle
0x0017
| Control | Action | Payload | Full frame | State report |
|---|---|---|---|---|
| Power | ON | 57 08 01 |
a5aaac5e570801c5ccca |
53 08 01 |
| Power | OFF | 57 08 00 |
a5aaac5f570800c5ccca |
53 08 00 |
| Fan | ON | 57 03 10 |
a5aaac44570310c5ccca |
53 03 10 |
| Fan | OFF | 57 03 00 |
a5aaac54570300c5ccca |
53 03 00 |
The diffuser echoes a state report (53 …) for each command, which the integration
uses to confirm the real state rather than assuming it.
- Home Assistant 2024.8.0 or newer
- A Bluetooth adapter recognised by Home Assistant (built-in, USB dongle, or an ESPHome Bluetooth Proxy in range of the diffuser)
- The diffuser powered on and not currently connected in the Aromadd phone app (it allows only one BLE connection at a time)
- In HACS, open the three-dot menu → Custom repositories.
- Add
https://github.com/ajachierno/Aromaddas an Integration. - Search for Aromadd Diffuser in HACS and install it.
- Restart Home Assistant.
- Copy the
custom_components/aromaddfolder into your Home Assistantconfig/custom_components/directory. - Restart Home Assistant.
- The diffuser is usually auto-discovered — look for an "Aromadd Diffuser" discovery card in Settings → Devices & Services and click Configure.
- If it isn't discovered automatically, click + Add Integration, search for Aromadd Diffuser, and pick your device from the list of nearby Bluetooth devices (close the Aromadd phone app first so the device is connectable).
That's it — a switch entity appears that turns your diffuser on and off.
custom_components/aromadd/
├── __init__.py # setup / teardown, keeps the BLE device fresh
├── aromadd_device.py # BLE connect → write → confirm → disconnect logic
├── config_flow.py # discovery + manual device picker
├── const.py # domain + the decoded BLE protocol constants
├── manifest.json # integration metadata + Bluetooth matchers
├── switch.py # the on/off switch entity
├── strings.json
└── translations/en.json
- Power + fan on/off for now. Mist/fan-speed levels and the LED use the same
framing and can be added once their payloads are captured (see
CAPTURE_GUIDE.md). - Scheduling: rather than programming the diffuser's on-board timer, schedule the
switchentities with Home Assistant automations — it's more flexible and is the standard Home Assistant approach. (The device's own schedule frame, opcode0x5716, is understood but not yet exposed; seeCAPTURE_GUIDE.md.) - State is confirmed at the moment a command is sent. Changes made with the physical button or the phone app while HA isn't connected are not pushed back to HA.
- BLE range applies. Use a Bluetooth proxy if the diffuser is far from your HA host.
- Handles (
0x0012/0x0017) are taken from the U5 Pro. If a future firmware moves them, updateWRITE_HANDLE/NOTIFY_HANDLEinconst.py.
Unofficial community integration, not affiliated with or endorsed by Aromadd. Use at your own risk. Licensed under the MIT License.
Did you find this helpful? Consider supporting additional development: