This custom component integrates Aroma-Link WiFi diffusers with Home Assistant.
Note: The integration appears in Home Assistant as
Aromalink Integrationwith the domainaromalink_ha_integration.
2.0 upgrade note: Version
2.0.0rebrands the integration domain fromaromalink_integration_v1toaromalink_ha_integration. Existing config entries fromaroma_link_integration,dalyem_aroma_link,ha_aromalink, andaromalink_integration_v1are not migrated automatically.
- Control diffuser power state
- Set diffuser work and pause durations
- Save diffuser schedules
- Run a diffuser immediately
- Auto-discover all devices on your Aroma-Link account
- Configure the polling interval from Home Assistant
- Update the repository in HACS or replace the manual install folder with
custom_components/aromalink_ha_integration. - Restart Home Assistant.
- Add the integration named
Aromalink Integration. - Re-enter your Aroma-Link credentials and reapply any options such as the polling interval.
- Update automations or scripts that call
aromalink_integration_v1.*services to usearomalink_ha_integration.*. - Remove the old integration entry after the new one is working.
If HACS still points at the old folder path, remove and re-add the custom repository so it refreshes the package metadata.
- Ensure HACS is installed in Home Assistant.
- Open HACS.
- Click the three-dot menu in the top right.
- Click Custom repositories.
- Paste
https://github.com/dalyem/ha_aromalink. - Select Integration and add it.
- Open the repository entry and click Download.
- Restart Home Assistant.
- Copy the
aromalink_ha_integrationdirectory to<config>/custom_components/. - Restart Home Assistant.
Example:
cp -r custom_components/aromalink_ha_integration <home_assistant_config>/custom_components/- In Home Assistant, go to Settings -> Devices and Services.
- Click Add Integration.
- Search for
Aromalink Integration. - Enter your Aroma-Link username and password.
- Home Assistant will discover all supported devices on the account.
- Polling interval default:
60seconds - Polling interval minimum:
10seconds - Polling interval maximum:
300seconds - Polling interval step:
10seconds - Where to change it: Open the integration and edit the
Polling Intervalcontrol - Work duration minimum:
5seconds - Work duration maximum:
900seconds - Work duration step:
1second - Pause duration minimum:
5seconds - Pause duration maximum:
900seconds - Pause duration step:
5seconds
Set the diffuser scheduler.
Parameters:
work_duration: Required work duration in seconds.pause_duration: Optional pause duration in seconds.week_days: Optional list of weekdays.enabled: Optional, defaulttrue. Setfalseto save durations while turning scheduled operation off (also handy for clearing a stuck schedule).device_id: Required when multiple devices exist.
Run the diffuser immediately. The schedule slot used for the run is disabled again when the run finishes, so the device does not keep cycling on its own afterwards.
Parameters:
work_duration: Optional work duration in seconds.pause_duration: Optional pause duration in seconds.device_id: Required when multiple devices exist.
The integration creates:
- Power switch — Controls oil pumping. Requires valid work/pause durations (> 0) to activate.
- Fan switch — Controls the exhaust fan independently of oil pumping. Use to accelerate scent distribution without running the diffuser.
- Button entities for run/save actions. Run Once arms the schedule only for the duration of the run and disarms it afterwards; Save Settings persists the work/pause durations without enabling scheduled operation.
- Number entities for work duration, pause duration, and polling interval
- Sensor entities for runtime and device statistics:
- Work Status, Work Remaining Time, Pause Remaining Time — live cycle state.
- Total Run Time (hours) — the API's
runCount, which accumulates seconds of work time. - Total Diffusion Time (hours) — estimated as pump activations × current work duration.
- On Count / Pump Count — the raw API counters (long-term statistics enabled). The device pushes these upstream on its own schedule, so they typically update about once a day.
- The integration uses the Aroma-Link web and mobile endpoints.
- The package polls cloud state every 60 seconds by default.
- Authentication is maintained with both web-session and app-token flows.
- Verify your Aroma-Link credentials if setup fails.
- Confirm the diffuser is online in the Aroma-Link app.
- If HACS reports
No content to download, verify thatcustom_components/aromalink_ha_integration/manifest.jsonexists on the default branch, then remove and re-add the custom repository if needed. - If you are upgrading from an older domain, install the new integration first and remove the old one after confirming the new entities.
To inspect the Aroma-Link endpoints locally:
- Create a
.env.aromalinkfile in the repository root. - Add
AROMALINK_USERNAMEandAROMALINK_PASSWORD. - Optionally add
AROMALINK_USER_IDandAROMALINK_DEVICE_ID. - Run:
python3 scripts/aromalink_probe.pyUseful options:
python3 scripts/aromalink_probe.py --switch onpython3 scripts/aromalink_probe.py --switch offpython3 scripts/aromalink_probe.py --set-schedulerpython3 scripts/aromalink_probe.py --device-id 408555 --user-id 181605python3 scripts/aromalink_probe.py --skip-web
2.1.0: Added a configurable SSL-bypass option and a separate exhaust-fan switch, stopped momentary runs and settings saves from leaving the 24/7 schedule enabled, shielded switch commands from stale cloud polls, restored the On Count / Pump Count sensors with long-term statistics, added the reverse-engineered API reference (docs/API.md), and adopted the MIT license2.0.0: Rebranded to thearomalink_ha_integrationdomain andAromalink Integrationname, added migration guidance, and removed secret-adjacent debug logging1.5.8: Changed the default work/pause values to10 / 901.5.7: Added a user-configurable polling interval option and improved runtime consistency1.5.6: Switched runtime fallback to the working web device-list endpoints and added the local probe script1.5.1: Added broader app response parsing1.5.0: Renamed the fork to thearomalink_integration_v1domain and package folder1.4.0: Renamed the fork to theha_aromalinkdomain and display name1.3.0: Renamed the fork to theha_aroma_linkdomain1.2.0: Renamed the fork to its own Home Assistant domain1.1.0: Updated to support HACS integration1.0.0: Initial release with automatic device discovery
- A valid Aroma-Link account
- At least one registered diffuser
- Home Assistant 2023.6.0 or newer
- An active internet connection
This project is licensed under the MIT License. The software is provided as-is, without warranty of any kind.
