Recommended (HACS): Search for Pax & Vent-Axia BLE under HACS → Integrations.
- Install HACS if needed, then open HACS → Integrations, search Pax or Vent-Axia, and download.
- Restart Home Assistant.
- Go to Settings → Devices & services → Add integration, search for Pax & Vent-Axia Bluetooth, and follow the prompts.
Manual install: copy the custom_components/pax_ble folder into your config custom_components directory, restart, then use Add integration as above.
Custom HACS repository: You do not need a custom repository unless you are tracking a fork.
This integration was originally meant to just support Pax Calima, but as other fans have been made that builds on the same concept, this integration now supports:
- Pax Calima (Nordic naming scheme)
- Pax Levante 50
- Vent-Axia Svara (Calima-compatible, no air-quality sensor, UK(+) name scheme)
- Vent-Axia Svensa (PureAir Sense model family)
If you've got other fans of the same'ish type, just give it a go and let me know how it works out :)
The supported models share the Calima driver. Automatic Bluetooth discovery is configured for PAX Calima, Pax Levante, and Vent-Axia Svara.
Many Svara units still advertise as PAX Calima, in which case discovery may work but the model may show as Calima. Either label uses the same driver - set Svara when adding manually if you prefer the name to match your hardware.
Add via Settings → Devices & services → Pax & Vent-Axia Bluetooth → Add device, or enter MAC + model manually if discovery does not appear.
If you have issues connecting, try cycling power on the device. It seems that the Bluetooth interface easily hangs if it's messed around with a bit.
A valid PIN code is required to be able to control the fan. You can add the fan without PIN, but then you'll only be able to read values.
- For Calima/Svara you enter the decimal value printed on the fan motor (remove from base)
- For Svensa, the PIN is not written on the device, but should be requested from it. See instructions for Svensa.
- For Levante 50, enter pairing mode by powercycling the fan using the switch on the side just before adding the device. The PIN should be discovered automatically. If this fails, see instructions for Svensa.
The sensors for temp/humidity/light seem to be a bit inaccurate, or I'm not converting them correctly, so don't expect them to be as accurate as from other dedicated sensors.
On Calima, Svara, and Levante the humidity characteristic is often 0 at normal indoor RH, below the conversion range, so the entity state is unknown. That is expected from the fan. A connected humidity sensor in Home Assistant is a number or unknown; the integration cannot store a label such as Humidity Low. The example Lovelace card labels that state as Humidity Low.
Airflow is just a conversion of the fan speed based on a linear correlation between those two. This is a bit inaccurate at best, as the true flow will vary greatly depending on how your fan is mounted.
Speed and duration for boostmode are local variables in home assistant, and as such will not influence boostmode from the app. These variables will also be reset to default if you re-add a device.
Configuration parameters are read only on Home Assistant startup, and subsequently once every day, to get any changes made from elsewhere.
Fast scan interval refers to the interval after a write has been made. This allows for quick feedback when the fan is controlled and does not disconnect between reads. This fast interval will remain for 10 reads.
Setting speed to less than 800 RPM might stall the fan, depending on the specific application. I don't know if stalling like this could damage the fan/motor, so do this with care.
If your home assistant instance does not have Bluetooth, you can use a standalone ESP32 with ESPHome. Use the following ESPHome config to set up the bluetooth proxy:
esp32:
board: esp32dev
bluetooth_proxy:
active: true
esp32_ble_tracker:When config is applied, go ahead and add the Pax device using HA web GUI.
Example Home Assistant entities card for a Vent-Axia Svara fan, showing the sensors and controls exposed by this integration:
A compact, tablet-friendly Lovelace card: fan state and a timed Boost toggle on the left, narrow value bars with the reading kept inside each bar on the right. Bars for humidity / air quality / light hide themselves when the matching sensitivity is Off, humidity below the convertible range shows as "Humidity Low" rather than a misleading number, and an unavailable fan goes red.
Written for the Svensa family (including PureAir Sense) - it references two entities other models do not expose (sensor.<fan>_air_quality and select.<fan>_sensitivity_presence). Calima / Svara owners need three small substitutions, documented in the file header.
The decluttering template lives in docs/lovelace-fan-card.yaml - install notes, required HACS frontend modules (decluttering-card, card-mod, mushroom, template-entity-row) and the full variable list are in the file header.
Unavailable is deliberately loud - a dead fan renders red with no bar fills, and the last-poll clock freezes at the failure time (left: a fan cut off at the mains; right: the same fan minutes after power returned):
- @PatrickE94 for the Calima driver
- @MarkoMarjamaa for a good starting point for the HA-implementation



