Hi, I have a Brink 325 Heat recovery unit (HRU). It has modbus connection so I wanted to integrate it into Home Assistant.
I found somebody did this but using rather complicated setup with additional rPi that communicates with the HRU
https://community.home-assistant.io/t/integrating-brink-flair-hrv-with-home-assistant/333317
I wanted to use the straightforward approach using simply ESPhome. ESPhome can communicate with modbus devices quite recently ( October 2021) so that is probably why nobody went this route so far.
Anyway here is my setup and needed hardware:
Any ESP32 board
UART to RS485 board (Aliexpress ~1USD)
Some wires
Wiring is also pretty straightforward (ESP32-RS485 board):
Connect GPIO 16 to TX on the board
Connect GPIO 17 to RX on the board
Connect 3.3V to VCC and GND to GND
HRU to RS485 board:
A+ to A
B- to B
GND to GND
Screen from HRU’s manual. The red connector
For power I used the USB connector on HRU (it is meant for firmware flashing from thumbdrive)
I won’t show any pictures of how I have this connected as it is just hanging from the unit without any box etc…I plan to either make a nice box or open the HRU and place the ESP32 + RS485 board inside to hide it entirely.
Now you just configure the unit propery to allow modbus:
Go to menu, communications, bus type and select “modbus”, change modbus address to 1 (or change the esphome code below), baud rate 19k2 and parity to NONE.
Flash following code to ESPhome ESP32 board:
esphome:
name: modbus
esp32:
board: esp32dev
framework:
type: arduino
# Enable logging
logger:
# Enable Home Assistant API
api:
ota:
wifi:
ssid: WIFINAME
password: wifipassword
#if using fixed IP uncomment and change this
# use_address: 192.168.50.160
uart:
id: mod_bus
tx_pin: 16
rx_pin: 17
baud_rate: 19200
stop_bits: 1
modbus:
id: modbus1
modbus_controller:
- id: rekup
## the Modbus device addr.
address: 0x1
modbus_id: modbus1
setup_priority: -10
text_sensor:
- platform: modbus_controller
modbus_controller_id: rekup
id: rekup_bypass_status_text
register_type: read
address: 4050
raw_encode: NONE
name: Rekup Bypass Status
lambda: |-
uint16_t int_mode = (data[item->offset] << 8) + data[item->offset+1];
ESP_LOGD("main","Parsed operation mode int : %d", int_mode);
std::string mode_str;
switch (int_mode) {
case 0: mode_str = "INITIALIZATING"; break;
case 1: mode_str = "OPEN"; break;
case 2: mode_str = "CLOSED"; break;
case 3: mode_str = "OPEN"; break;
case 4: mode_str = "CLOSED"; break;
default: mode_str = "Unknown"; break;
}
return mode_str;
sensor:
- platform: modbus_controller
modbus_controller_id: rekup
name: "Rekup To House temperature"
id: rekup_to_house_temp
register_type: read
address: 4036
unit_of_measurement: "°C"
value_type: S_WORD
accuracy_decimals: 1
filters:
- multiply: 0.1
- platform: modbus_controller
modbus_controller_id: rekup
name: "Rekup To House humidity"
id: rekup_to_house_humidity
register_type: read
address: 4037
unit_of_measurement: "%"
value_type: S_WORD
accuracy_decimals: 1
- platform: modbus_controller
modbus_controller_id: rekup
name: "Rekup To Outside Temperature"
id: rekup_to_outside_temp
register_type: read
address: 4046
unit_of_measurement: "°C"
value_type: S_WORD
accuracy_decimals: 1
filters:
- multiply: 0.1
- platform: modbus_controller
modbus_controller_id: rekup
name: "Rekup To Outside humidity"
id: rekup_to_outside_humidity
register_type: read
address: 4047
unit_of_measurement: "%"
value_type: S_WORD
accuracy_decimals: 1
- platform: modbus_controller
modbus_controller_id: rekup
name: "Rekup From Outside Temperature"
id: rekup_from_outside_temp
register_type: read
address: 4081
unit_of_measurement: "°C"
value_type: S_WORD
accuracy_decimals: 1
filters:
- multiply: 0.1
- platform: modbus_controller
modbus_controller_id: rekup
name: "Rekup Flow Actual Intake"
id: rekup_prutok_in
register_type: read
address: 4032
unit_of_measurement: "m3/h"
value_type: S_WORD
- platform: modbus_controller
modbus_controller_id: rekup
name: "Rekup Flow Actual Exhaust"
id: rekup_prutok_out
register_type: read
address: 4042
unit_of_measurement: "m3/h"
value_type: S_WORD
select:
- platform: modbus_controller
modbus_controller_id: rekup
name: "Rekup Modbus Control Mode"
address: 8000
value_type: S_WORD
optimistic : TRUE
optionsmap:
"Device LCD": 0
"Modbus Step": 1
"Modbus Flow": 2
- platform: modbus_controller
modbus_controller_id: rekup
name: "Rekup Bypass Mode"
address: 6100
value_type: S_WORD
optimistic : TRUE
optionsmap:
"Auto": 0
"Closed": 1
"Open": 2
switch:
- platform: modbus_controller
modbus_controller_id: rekup
name: "Rekup Bypass Boost switch"
register_type: holding
address: 6104
bitmask: 1
entity_category: config
icon: "mdi:toggle-switch"
number:
- platform: modbus_controller
modbus_controller_id: rekup
name: "Rekup Modbus step setting"
id: rekup_step_setting
register_type: holding
address: 8001
value_type: S_WORD
min_value: 0
max_value: 3
mode: slider
# Maximum value for Flair 325 is 325m3/h
- platform: modbus_controller
modbus_controller_id: rekup
name: "Rekup Modbus flow value"
id: rekup_prutok_nastaveni
register_type: holding
address: 8002
value_type: S_WORD
min_value: 0
max_value: 280
mode: slider
- platform: modbus_controller
modbus_controller_id: rekup
name: "Rekup Flow 1"
id: rekup_flow_1
register_type: holding
address: 6001
unit_of_measurement: "m3/h"
value_type: S_WORD
min_value: 50
max_value: 325
mode: slider
- platform: modbus_controller
modbus_controller_id: rekup
name: "Rekup Flow 2"
id: rekup_flow_2
register_type: holding
address: 6002
unit_of_measurement: "m3/h"
value_type: S_WORD
min_value: 50
max_value: 325
mode: slider
- platform: modbus_controller
modbus_controller_id: rekup
name: "Rekup Flow 3"
id: rekup_flow_3
register_type: holding
address: 6003
unit_of_measurement: "m3/h"
value_type: S_WORD
min_value: 50
max_value: 325
mode: slider
- platform: modbus_controller
modbus_controller_id: rekup
name: "Rekup Fan Imbalance Intake"
id: rekup_imbalance_intake
register_type: holding
address: 6035
unit_of_measurement: "%"
value_type: S_WORD
multiply: 10
min_value: -15
max_value: 15
mode: slider
- platform: modbus_controller
modbus_controller_id: rekup
name: "Rekup Fan Imbalance Exhaust"
id: rekup_imbalance_exhaust
register_type: holding
address: 6036
unit_of_measurement: "%"
value_type: S_WORD
multiply: 10
min_value: -15
max_value: 15
mode: slider
Add the ESPhome to Home assistant and you should see soemthing like this:
Note that I did not implement all available sensors or settings. Like fan speeds etc. But I believe anybody can easily edit the code and add additional sensors.
Modbus registers can be found in this manual for some extension card. Not all of them work for my HRU (without the card) but you can get pretty good idea
UWA2-B card manual
…And you are done basically. Now you just have to understand how it works and how to control it properly. It took me a while to understand the logic behind the functions as I would say some of the functions/setting are not logical and manual does not help you at all. Sometimes it feels like the manual is written by the cleaning lady from the Brink company that overheard developers describing the function on a coffee break.
Probably because the original manual is written in Dutch and translated to English (and other languages) by people with ZERO technical knowledge
Here are some tips and crash course for the unit:
You have flow settings 0,1,2 and 3. You set desired flow for each step. Each following step must have higher flow than previous (can’t have step 1 at 100m3/h and step 2 at 80m3/h)
Adjusting flow using modbus:
If you want to adjust flow using modbus you can either adjust flow for any step (0,1,2,3)
OR
switch the unit to “remote control mode” to select different step
OR
switch the unit to “remote control mode” to select arbitrary flow rate
When switched to remote control you can’t no longer change the flow steps using LCD screen on the unit and the modbus icon shows up on the screen
Imbalance
You can also set imbalance to the intake or exhaust fan. That means if you have target airflow set to 100m3/h you can offset either fan + or - 15%. If you set one to -15% and second one to +15% you will get roughly 30m3/h imbalance. This can be useful when you are lighting up fireplace and want to make a bit overpressure in the house to support the draft.
Sadly you can’t stop the exhaust fan entirely. That would be useful for such case.
Bypass:
Bypass leads the exhaust air directly to exhaust pipe bypassing the heat exchanger. It is useful in summer nights when you don’t want to retain heat from the leaving air and want colder outside air directly to the house.
If set to auto it measures the input temperature and exhaust (to outside) temperature (interestingly the HRU does NOT have temperature sensor from the air that is comming FROM the house to the unit) and open if necessary (you can set condition like house temperature and minimal outside temperature). I think it can be set using modbus aswell but I didn’t implement this. Can be set on the HRU LCD.
Bypass boost switch
If the bypass is active it will set fan level to configured step. You can set the step at HRU LCD
Caveat: If you are controlling the flow using modbus it will overtake your settings. So even if you set modbus flow rate to maximum and have “bypass boost setting” at level 3 (150m3/h) it will actually slow down once it opens the bypass.
Hope this helps anybody as in fact integrating this is pretty easy