Hey everyone!
I wanted to share a custom integration I’ve been building over the past few weeks for Vaillant aroTHERM plus and Saunier Duval GeniaAir air-to-water heat pumps:
GitHub Repository: https://github.com/R91g/arotherm-genia-ebusd
(Installable directly through HACS as a custom repository).
Why another eBUS integration?
I have a Saunier Duval GeniaAir Max (which shares the exact same BASS3 controller and eBUS architecture as the Vaillant aroTHERM plus with sensoCOMFORT / MiPro Sense).
While there are great projects around (like ebusd-vaillant-component or cloud-based myVAILLANT), I kept hitting a few frustrating walls on local eBUS:
- Cooling was broken or missing: Vaillant/Saunier use a tricky “double-lock” system (a calendar date window in
CoolingStartDate/CoolingEndDateplus the operating modeZ1OpModeCooling). If the calendar lock isn’t opened properly, the heat pump simply refuses to cool. - DHW Boost hysteresis: The controller enforces a strict 5 K charging hysteresis. If your tank setpoint is 50 °C and the water is at 47 °C, triggering a normal boost does nothing because the delta isn’t reached.
- eBUS collisions & polling spam: The physical eBUS only runs at 2400 baud (~240 bytes/s). Pushing too many commands or aggressive polling quickly leads to bus collision storms with the wall controller.
- Missing upstream CSV registers: Many registers for BASS3 and HMUX0 in
ebusd-configurationare incomplete or return wrong types.
So I decided to sit down with a packet analyzer, reverse-engineer the missing telegrams, and build a dedicated integration focused specifically on these heat pumps.
What’s included (v1.1.0):
- 100% Local & Fast: Communicates directly via MQTT JSON with
ebusd(local_push). Zero cloud dependence. - Cooling Double-Lock Handled Automatically:
- Automatic mode: Just switch your thermostat to
Cooland it opens the calendar lock indefinitely (2026to2099). - Timed mode: Using HA’s new
datetimeplatform, you can pick specific start/end dates from the dashboard for a scheduled cooling season.
- Automatic mode: Just switch your thermostat to
- Smart Forced DHW Boost: When you hit Boost on a lukewarm tank, it dynamically bumps the target setpoint temporarily (T_tank + 5 K + 1.5 °C) to force the compressor to start immediately, and restores your original setpoint once finished.
- Away / Holiday Mode: Full calendar scheduling (
datetime), setback temperature control, and countdown sensors. - Thermodynamics & Live COP: Calculates primary ΔT, real thermal power (W), and live COP/EER + historical daily/monthly SCOP based on actual flow rate and temperatures (with automatic zero-clamping during defrost and standby).
- Collision-Safe eBUS Engine: 5.0 s retained MQTT message absorption on HA startup, staged hydration queue (0.8 s pacing), and 0.4 s write delays to keep the bus arbitration clean.
- Organized into 4 Devices: Outdoor Unit (
08.hmux0), Climate Controller (15.bass3), Hydraulic Station (76.vwzio), and Wireless Thermostat (04.netx3). Total of 144 clean native entities.
Bundled CSVs & Upcoming Upstream PR
The repository includes the modified CSV files in ebusd-configuration/ with working definitions for cooling dates, holiday mode, and IEEE 754 float counters.
I’m currently preparing a pull request to contribute these fixes directly upstream to john30/ebusd-configuration so that the wider eBUS community can benefit, regardless of which integration they use.
How to test it
You just need an eBUS adapter (like the eBUS Adapter Shield v5 / C6) running ebusd with --mqttjson.
In Home Assistant:
- Open HACS → Custom repositories.
- Add
https://github.com/R91g/arotherm-genia-ebusdwith category Integration. - Install, restart HA, and add aroTHERM & GeniaAir (eBUS) from the Integrations page.
If you have an aroTHERM plus or GeniaAir system, I’d love to hear your feedback, bug reports, or feature suggestions!
Cheers!