A comprehensive Home Assistant integration for BRINK Heat Recovery Ventilation units via Modbus RTU communication.
Supported Models:
- BRINK FLAIR 325
- BRINK FLAIR 325 Plus
- BRINK FLAIR 350
- BRINK FLAIR 400
- Temperature Sensors: Supply air, exhaust air, outside temperature
- Pressure Sensors: Supply and exhaust pressure monitoring
- Flow Monitoring: Real-time air volume measurements and fan RPM
- Air Quality: CO2 sensors (if equipped)
- System Status: Bypass state, filter condition, preheater status
- Heat Recovery Efficiency: Calculated in real-time
- Bypass Control: Automatic, open, or closed modes
- Flow Control: Precise air volume setpoints (50-325 m³/h)
- Power Modes: Absence, low, normal, high
- Advanced Settings: Imbalance correction, geo heat exchanger
- Flow Levels: Configure speed for each power mode
- Select Entities: Easy dropdown controls for modes
- Number Entities: Slider/input controls for flow rates
- Binary Sensors: Clear status indicators
- Switches: Toggle advanced features
- Template Sensors: Text descriptions for all states
- Device Reset: Remote restart capability
- Diagnostics: Complete register readout
- Services: Advanced automation support
- Error Handling: Robust Modbus communication
- Device Discovery: Automatic model detection
- Multi-language Support: English, Slovak, Czech, Polish translations
- Open HACS in Home Assistant
- Go to "Integrations"
- Click the three dots in the top right corner
- Select "Custom repositories"
- Add this repository URL
- Select "Integration" as category
- Click "Add"
- Find "BRINK Heat Recovery Unit" and install
- Download the
brink_modbusfolder from the latest release - Copy to your
custom_componentsdirectory - Restart Home Assistant
- BRINK HRU unit (FLAIR series)
- USB to RS485 converter
- Modbus RTU cable connection to BRINK unit
- Baudrate: 19200 bps
- Data bits: 8
- Parity: Even
- Stop bits: 1
- Slave ID: 20 (default)
- Disconnect the 4-position wall controller before activating Modbus control
- Both cannot operate simultaneously
- Boost functionality remains available
- Go to Settings → Devices & Services
- Click "Add Integration"
- Search for "BRINK Heat Recovery Unit"
- Configure your connection:
- Port:
/dev/ttyUSB0or/dev/serial/by-id/...(stable device path recommended) - Slave ID:
20(default, valid range: 1-247) - Baudrate:
19200(default) - Model: Select your BRINK model
- Port:
💡 Tip: Use /dev/serial/by-id/ paths for stable device identification across reboots instead of /dev/ttyUSB0 which may change.
The integration provides full translations for:
- 🇺🇸 English (en)
- 🇸🇰 Slovak (sk)
- 🇨🇿 Czech (cs)
- 🇵🇱 Polish (pl)
All entity names, service descriptions, and configuration dialogs are localized.
| Entity Type | Entity ID | Description | Unit | Values |
|---|---|---|---|---|
| Temperature Sensors | ||||
| Sensor | sensor.brink_supply_air_temperature |
Supply air temperature | °C | Temperature reading |
| Sensor | sensor.brink_exhaust_air_temperature |
Exhaust air temperature | °C | Temperature reading |
| Sensor | sensor.brink_outside_temperature |
Outside temperature | °C | Temperature reading |
| Pressure Sensors | ||||
| Sensor | sensor.brink_supply_pressure |
Supply air pressure | Pa | Pressure reading |
| Sensor | sensor.brink_exhaust_pressure |
Exhaust air pressure | Pa | Pressure reading |
| Flow Sensors | ||||
| Sensor | sensor.brink_supply_volume_actual |
Actual supply volume | m³/h | 0-325 |
| Sensor | sensor.brink_exhaust_volume_actual |
Actual exhaust volume | m³/h | 0-325 |
| Sensor | sensor.brink_supply_fan_rpm |
Supply fan RPM | RPM | 0-3000 |
| Sensor | sensor.brink_exhaust_fan_rpm |
Exhaust fan RPM | RPM | 0-3000 |
| System Sensors | ||||
| Sensor | sensor.brink_heat_recovery_efficiency |
Heat recovery efficiency | % | 0-100 |
| Sensor | sensor.brink_filter_usage_hours |
Filter usage hours | h | Hours count |
| Sensor | sensor.brink_device_type |
Device type identifier | - | Device code |
| Sensor | sensor.brink_software_version |
Software version | - | Version number |
| CO2 Sensors | ||||
| Sensor | sensor.brink_co2_sensor_1 |
CO2 sensor 1 | ppm | 0-5000 |
| Sensor | sensor.brink_co2_sensor_2 |
CO2 sensor 2 | ppm | 0-5000 |
| Sensor | sensor.brink_co2_sensor_3 |
CO2 sensor 3 | ppm | 0-5000 |
| Sensor | sensor.brink_co2_sensor_4 |
CO2 sensor 4 | ppm | 0-5000 |
| Status Text Sensors | ||||
| Sensor | sensor.brink_bypass_state |
Bypass state text | - | Open/Closed/Error |
| Sensor | sensor.brink_filter_state |
Filter state text | - | Clean/Dirty |
| Sensor | sensor.brink_preheater_state |
Preheater state text | - | Off/Starting/Active |
| Sensor | sensor.brink_bypass_mode |
Bypass mode text | - | Automatic/Closed/Open |
| Sensor | sensor.brink_power_switch_position |
Power switch text | - | Absence/Low/Normal/High |
| Binary Sensors | ||||
| Binary Sensor | binary_sensor.brink_filter_dirty |
Filter dirty indicator | - | on/off |
| Binary Sensor | binary_sensor.brink_preheater_active |
Preheater active | - | on/off |
| Binary Sensor | binary_sensor.brink_modbus_control_active |
Modbus control active | - | on/off |
| Binary Sensor | binary_sensor.brink_imbalance_allowed |
Imbalance allowed | - | on/off |
| Binary Sensor | binary_sensor.brink_geo_heat_exchanger |
Geo heat exchanger | - | on/off |
| Binary Sensor | binary_sensor.brink_co2_sensor_active |
CO2 sensor mode | - | on/off |
| Select Controls | ||||
| Select | select.brink_flair_325_plus_bypass_mode |
Bypass mode control | - | Automatic/Closed/Open |
| Select | select.brink_flair_325_plus_power_switch_position |
Power switch control | - | Absence/Low/Normal/High |
| Select | select.brink_flair_325_plus_modbus_control_mode |
Modbus control mode | - | Disabled/Switch/Flow |
| Number Controls | ||||
| Number | number.brink_flow_setpoint |
Target flow speed | m³/h | 50-325 |
| Number | number.brink_flow_level_0_absence |
Flow level 0 (absence) | m³/h | 0-325 |
| Number | number.brink_flow_level_1_low |
Flow level 1 (low) | m³/h | 0-325 |
| Number | number.brink_flow_level_2_normal |
Flow level 2 (normal) | m³/h | 0-325 |
| Number | number.brink_flow_level_3_high |
Flow level 3 (high) | m³/h | 0-325 |
| Number | number.brink_supply_imbalance_offset |
Supply imbalance offset | % | -15 to +15 |
| Number | number.brink_exhaust_imbalance_offset |
Exhaust imbalance offset | % | -15 to +15 |
| Number | number.brink_geo_min_temperature |
Geo min temperature | °C | 0-100 |
| Number | number.brink_geo_max_temperature |
Geo max temperature | °C | 150-400 |
| Switch Controls | ||||
| Switch | switch.brink_imbalance_allowed |
Allow imbalance | - | on/off |
| Switch | switch.brink_co2_sensor_mode |
CO2 sensor mode | - | on/off |
| Switch | switch.brink_geo_heat_exchanger |
Geo heat exchanger | - | on/off |
| Switch | switch.brink_device_reset |
Device reset trigger | - | Momentary action |
Set the bypass mode for optimal temperature control.
service: brink_modbus.set_bypass_mode
target:
device_id: <device_id>
data:
mode: "automatic" # automatic, closed, openSet precise flow speed for ventilation control.
service: brink_modbus.set_flow_speed
target:
device_id: <device_id>
data:
speed: 120 # 50-325 m³/hSet the power mode for different occupancy scenarios.
service: brink_modbus.set_power_mode
target:
device_id: <device_id>
data:
mode: "normal" # absence, low, normal, highautomation:
- alias: "Summer Night Cooling"
trigger:
- platform: numeric_state
entity_id: sensor.brink_outside_temperature
below: 22
condition:
- condition: time
after: "20:00"
before: "08:00"
action:
- service: brink_modbus.set_bypass_mode
data:
mode: "open"
- service: brink_modbus.set_flow_speed
data:
speed: 150automation:
- alias: "BRINK Filter Maintenance"
trigger:
- platform: state
entity_id: binary_sensor.brink_filter_dirty
to: "on"
action:
- service: notify.mobile_app
data:
title: "🔧 BRINK Maintenance Required"
message: "Filter needs replacement after {{ states('sensor.brink_filter_usage_hours') }} hours"automation:
- alias: "Heat Recovery Efficiency Monitor"
trigger:
- platform: numeric_state
entity_id: sensor.brink_heat_recovery_efficiency
below: 80
action:
- service: brink_modbus.set_bypass_mode
data:
mode: "automatic"
- service: notify.homeassistant
data:
message: "Heat recovery efficiency low: {{ states('sensor.brink_heat_recovery_efficiency') }}%"type: entity
entity: sensor.brink_heat_recovery_efficiency
name: "Heat Recovery Efficiency"
icon: mdi:heat-pumptype: entities
title: "BRINK HRU Controls"
entities:
- select.brink_flair_325_plus_bypass_mode
- select.brink_flair_325_plus_power_switch_position
- number.brink_flair_325_plus_flow_setpoint
- binary_sensor.brink_flair_325_plus_filter_dirtytype: gauge
entity: number.brink_flow_setpoint
name: "Flow Speed"
min: 50
max: 325
severity:
green: 50
yellow: 200
red: 280- Check USB to RS485 converter connection
- Verify serial port path exists:
ls -l /dev/serial/by-id/ # or ls -l /dev/ttyUSB*
- Check Home Assistant logs for detailed error messages
- Ensure wall controller is disconnected
- Verify Modbus settings match BRINK configuration (slave ID, baudrate)
If you see [Errno 11] Could not exclusively lock port errors:
- The integration now properly releases the serial port on reload
- Restart Home Assistant if changing port configuration
- Ensure no other process is using the serial port
- Check logs for Modbus errors
- Verify slave ID matches BRINK setting
- Restart integration if needed
Some holding registers may be read-only depending on BRINK firmware version.
Complete register documentation available in MODBUS_BRINK.md
- Fast sensors (temperatures, flows): 10 seconds
- Slow sensors (settings, diagnostics): 60 seconds
- Automatic reconnection on communication errors
- Graceful degradation when registers are unavailable
- Comprehensive logging for diagnostics
Contributions are welcome! Please read our Contributing Guidelines for details.
This project is licensed under the MIT License - see the LICENSE file for details.
- Create an issue for bug reports
- Join the Home Assistant Community for discussions
- Check the documentation for detailed guides
- BRINK for excellent ventilation hardware
- Home Assistant community for integration framework
- pymodbus library for reliable Modbus communication
Made with ❤️ for the Home Assistant community