Brink Flair 325 Heat recovery unit ESPhome modbus integration (~$5)

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

11 Likes

Nice, thanks for this, will link it from my post directly!

Yep, it wasn’t available back then and I didn’t manage to get it work :slightly_smiling_face: .

bypass … I think it can be set using modbus aswell but I didn’t implement this

Yes, it can and works fine, same as other values. You can check my files.

Btw. it seems you are rediscovering some of the stuff from scratch, but I might be wrong. :+1:

Not like rediscovering…I just wanted to post some tips here for it to be in one place. And some sensors/settings (pre-heater, motor RPM, those bypass settings) I didn’t implement because I don’t need them…

Btw I made a template sensor that roughly estimates heat power loss by the HRU. It takes temperature difference between air that goes from outside and air that goes to outside (sadly the HRU does not have temperature sensor for air from house - I guess it would be better to measure difference between from/to house). Then it takes actual airflow and some constants for latent heat capacity (from what I found it is around 1000J/kg/°C) and air density (1.2kg/m^3). Division by 3600 is to convert Joules to Watts.
Feel free to correct me

This does not take into account humidity and heat trapped in the humidity - in the winter (can’t test it now :smiley: ), once the exhaust air starts to condensate inside the heat exchanger, you will see increased exhaust air temperature due to the heat released by condensation (I remember seeing this in winter). At that time you will see increase in the power loss.

Paste it anywhere in “sensor:” section

  - platform: template
    name: Rekup Power Difference
    id: cooling_power
    unit_of_measurement: W
    update_interval: 30s
    lambda: 'return ((id(rekup_from_outside_temp).state - id(rekup_to_outside_temp).state)*id(rekup_prutok_in).state*1.2*1000)/3600;'

2 Likes

Hello, thanks for this brillian solution, I was using Ebus but every while was not responsive anymore. With your code the bypass valve state is a text sensor, is there any way to convert to a binary sensor?

Hi, sure. Just quickly botched together template sensor. Maybe not the cleanest solution as it reads the text sensor and after it converts it to binary. But it seems to be working. Change the code if you want “true” if it is OPENed or CLOSEd

binary_sensor:
  - platform: template
    name: "Bypass binary sensor"
    lambda: |-
      if (id(rekup_bypass_status_text).state == "OPEN") {
        return true;
      } else {
        return false;
      }

I applied yesterday night and found this way

binary_sensor:
  - platform: modbus_controller
    modbus_controller_id: brink
    name: "VMC Valvola Bypass"
    register_type: read
    address: 4050
    lambda: |-
      uint16_t int_mode = (data[item->offset] << 8) + data[item->offset+1];
      ESP_LOGD("main","Parsed operation mode int : %d", int_mode);
      bool result;
      switch (int_mode) {
        case 0:  result = {}; break;
        case 1:  result = true; break;
        case 2:  result = false; break;
        case 3:  result = true; break;
        case 4:  result = false; break;
        default: result = {}; break;
      }
      return result;

:slight_smile:

I tried to use this nice script, but i get some error’s.

Register_type holding: [register_type] is an invalid optie for [number.modbus.controller]

And:

optimistic : TRUE: [optimistic] is an invalid optie for [number.modbus.controller]

What am i doing wrong?

Are you running current-day version of ESPhome and Home Assistant? I am sure it does not have to be the latest but shouldn’t be old either.

I’am running the latest version of HA and ESPHome.

This is the script I am trying to run:

esphome:
  name: esphome-web-01532d

esp8266:
  board: d1_mini

# Enable logging
logger:

# Enable Home Assistant API
api:

web_server:
  port: 80
  auth:
    username: xxxx
    password: xxxx

ota:

wifi:
  ssid: !secret wifi_ssid
  password: !secret wifi_password

  # Enable fallback hotspot (captive portal) in case wifi connection fails
  ap:
    ssid: "xxxxx"
    password: "xxxxx"
  
uart:
  id: mod_bus
  tx_pin: D7
  rx_pin: D6
  baud_rate: 19200
  stop_bits: 1
  parity: even
  
modbus:
  id: modbus1
  
modbus_controller:
  - id: brink
    ## the Modbus device addr 20 (hex: 0x14)
    address: 0x14
    modbus_id: modbus1
    setup_priority: -10  

text_sensor:
  - platform: modbus_controller
    modbus_controller_id: brink
    id: brink_bypass_status_text
    register_type: read
    address: 4050
    raw_encode: NONE
    name: brink 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: brink
    name: "brink To House temperature"
    id: brink_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: brink
    name: "brink To House humidity"
    id: brink_to_house_humidity
    register_type: read
    address: 4037
    unit_of_measurement: "%"
    value_type: S_WORD  
    accuracy_decimals: 1
   
  - platform: modbus_controller
    modbus_controller_id: brink
    name: "brink To Outside Temperature"
    id: brink_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: brink
    name: "brink To Outside humidity"
    id: brink_to_outside_humidity
    register_type: read
    address: 4047
    unit_of_measurement: "%"
    value_type: S_WORD  
    accuracy_decimals: 1
    
  - platform: modbus_controller
    modbus_controller_id: brink
    name: "brink From Outside Temperature"
    id: brink_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: brink
    name: "brink Flow Actual Intake"
    id: brink_prutok_in
    register_type: read
    address: 4032
    unit_of_measurement: "m3/h"
    value_type: S_WORD  

  - platform: modbus_controller
    modbus_controller_id: brink
    name: "brink Flow Actual Exhaust"
    id: brink_prutok_out
    register_type: read
    address: 4042
    unit_of_measurement: "m3/h"
    value_type: S_WORD  

#select:
#  - platform: modbus_controller
#    modbus_controller_id: brink  
#    name: "brink 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: brink  
    name: "brink Bypass Mode"
    address: 6100
    value_type: S_WORD
    optimistic : TRUE
    optionsmap:
      "Auto": 0
      "Closed": 1
      "Open": 2

switch:
- platform: modbus_controller
  modbus_controller_id: brink
  name: "brink Bypass Boost switch"
  register_type: holding
  address: 6104
  bitmask: 1
  entity_category: config
  icon: "mdi:toggle-switch"
     
number:
  - platform: modbus_controller
    modbus_controller_id: brink
    name: "brink Modbus step setting"
    id: brink_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: brink
#    name: "brink Modbus flow value"
#    id: brink_prutok_nastaveni
#    register_type: holding
#    address: 8002
#    value_type: S_WORD      
#    min_value: 0
#    max_value: 300
#    mode: slider

# - platform: modbus_controller
#   modbus_controller_id: brink
#   name: "brink Flow 1"
#    id: brink_flow_1
#    register_type: holding
#    address: 6001
#    unit_of_measurement: "m3/h"
#    value_type: S_WORD      
#    min_value: 50
#    max_value: 300
#    mode: slider
    
#  - platform: modbus_controller
#    modbus_controller_id: brink
#    name: "brink Flow 2"
#    id: brink_flow_2
#    register_type: holding
#    address: 6002
#    unit_of_measurement: "m3/h"
#    value_type: S_WORD      
#    min_value: 50
#    max_value: 300
#    mode: slider
    
#  - platform: modbus_controller
#    modbus_controller_id: brink
#    name: "brink Flow 3"
#    id: brink_flow_3
#    register_type: holding
#    address: 6003
#    unit_of_measurement: "m3/h"
#    value_type: S_WORD   
#    min_value: 50
#    max_value: 300
#    mode: slider

  - platform: modbus_controller
    modbus_controller_id: brink
    name: "brink Fan Imbalance Intake"
    id: brink_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: brink
    name: "brink Fan Imbalance Exhaust"
    id: brink_imbalance_exhaust
    register_type: holding
    address: 6036
    unit_of_measurement: "%"
    value_type: S_WORD      
    multiply: 10 
    min_value: -15
    max_value: 15
    mode: slider

It failed with error:

INFO Reading configuration /config/esphome/esphome-web-01532d.yaml...
Failed config

sensor.modbus_controller: [source /config/esphome/esphome-web-01532d.yaml:158]
  platform: modbus_controller
  modbus_controller_id: brink
  name: brink Bypass Mode
  address: 6100
  value_type: S_WORD
  
  [optimistic] is an invalid option for [sensor.modbus_controller]. Please check the indentation.
  optimistic: True [source /config/esphome/esphome-web-01532d.yaml:163]
  
  [optionsmap] is an invalid option for [sensor.modbus_controller]. Please check the indentation.
  optionsmap:  [source /config/esphome/esphome-web-01532d.yaml:165]
    Auto: 0
    Closed: 1
    Open: 2
number.modbus_controller: [source /config/esphome/esphome-web-01532d.yaml:180]
  platform: modbus_controller
  modbus_controller_id: brink
  name: brink Modbus step setting
  id: brink_step_setting
  
  [register_type] is an invalid option for [number.modbus_controller]. Please check the indentation.
  register_type: holding [source /config/esphome/esphome-web-01532d.yaml:184]
  address: 8001
  value_type: S_WORD
  min_value: 0
  max_value: 3
  mode: slider
number.modbus_controller: [source /config/esphome/esphome-web-01532d.yaml:239]
  platform: modbus_controller
  modbus_controller_id: brink
  name: brink Fan Imbalance Intake
  id: brink_imbalance_intake
  
  [register_type] is an invalid option for [number.modbus_controller]. Please check the indentation.
  register_type: holding [source /config/esphome/esphome-web-01532d.yaml:243]
  address: 6035
  unit_of_measurement: %
  value_type: S_WORD
  multiply: 10
  min_value: -15
  max_value: 15
  mode: slider
number.modbus_controller: [source /config/esphome/esphome-web-01532d.yaml:252]
  platform: modbus_controller
  modbus_controller_id: brink
  name: brink Fan Imbalance Exhaust
  id: brink_imbalance_exhaust
  
  [register_type] is an invalid option for [number.modbus_controller]. Please check the indentation.
  register_type: holding [source /config/esphome/esphome-web-01532d.yaml:256]
  address: 6036
  unit_of_measurement: %
  value_type: S_WORD
  multiply: 10
  min_value: -15
  max_value: 15
  mode: slider

Yeah!!! It works!

I had to remove:
optimistic : TRUE
register_type: holding
(Don’t ask me why)

And after selecting Modbus controll mode: step, the slider step 0-3 works also.
Thanks for your nice script!

Working script (for me):

esphome:
  name: esphome-web-01532d

esp8266:
  board: d1_mini

# Enable logging
logger:

# Enable Home Assistant API
api:

web_server:
  port: 80
  auth:
    username: XXXX
    password: XXXX

ota:


wifi:
  ssid: !secret wifi_ssid
  password: !secret wifi_password

  # Enable fallback hotspot (captive portal) in case wifi connection fails
  ap:
    ssid: "XXXX"
    password: "XXXX"

captive_portal:

uart:
  id: mod_bus
  tx_pin: D7
  rx_pin: D6
  baud_rate: 19200
  stop_bits: 1
  parity: even

modbus:
  flow_control_pin: D5
  id: modbus1
  send_wait_time: 1000ms

modbus_controller:
  - id: brink
    ## the Modbus device addr 20  (hex: 0x14)
    address: 0x14
    modbus_id: modbus1
    setup_priority: -10
    #command_throttle: 250ms
    update_interval: 15s

sensor:
  - platform: modbus_controller
    modbus_controller_id: brink
    id: temp_buiten
    name: "To house temperatuur"
    address: 4036
    unit_of_measurement: "C"
    register_type: read
    value_type: S_WORD
    accuracy_decimals: 1
    filters:
      - multiply: 0.1

  - platform: modbus_controller
    modbus_controller_id: brink
    name: "To House humidity"
    id: to_house_humidity
    register_type: read
    address: 4037
    unit_of_measurement: "%"
    value_type: S_WORD  
    accuracy_decimals: 1

  - platform: modbus_controller
    modbus_controller_id: brink
    id: temperatuur_afvoer
    name: "To Outside Temperatuur"
    address: 4046
    unit_of_measurement: "C"
    register_type: read
    value_type: S_WORD
    accuracy_decimals: 1
    filters:
      - multiply: 0.1

  - platform: modbus_controller
    modbus_controller_id: brink
    name: "To outside humidity"
    id: to_outside_humidity
    register_type: read
    address: 4047
    unit_of_measurement: "%"
    value_type: S_WORD  
    accuracy_decimals: 1

  - platform: modbus_controller
    modbus_controller_id: brink
    id: inlaatluchtvolume_ingesteld
    icon: "mdi:fan"
    name: "Inlaatluchtvolume ingesteld"
    address: 4031
    unit_of_measurement: "m3"
    register_type: read
    value_type: S_WORD
    accuracy_decimals: 0
    filters:
      - multiply: 1

  - platform: modbus_controller
    modbus_controller_id: brink
    id: huidig_inlaatluchtvolume
    icon: "mdi:fan"
    name: "Huidig inlaatluchtvolume"
    address: 4032
    unit_of_measurement: "m3"
    register_type: read
    value_type: S_WORD
    accuracy_decimals: 0
    filters:
      - multiply: 1

  - platform: modbus_controller
    modbus_controller_id: brink
    id: uitlaatluchtvolume_ingesteld
    icon: "mdi:fan"
    name: "uitlaatluchtvolume ingesteld"
    address: 4032
    unit_of_measurement: "m3"
    register_type: read
    value_type: S_WORD
    accuracy_decimals: 0
    filters:
      - multiply: 1

  - platform: modbus_controller
    modbus_controller_id: brink
    id: huidig_uitlaatluchtvolume
    icon: "mdi:fan"
    name: "Huidig uitlaatluchtvolume"
    address: 4041
    unit_of_measurement: "m3"
    register_type: read
    value_type: S_WORD
    accuracy_decimals: 0
    filters:
      - multiply: 1
   
text_sensor:
  - platform: modbus_controller
    modbus_controller_id: brink
    id: bypass_status
    register_type: read
    address: 4050
    raw_encode: NONE
    name: 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;
      
  - platform: modbus_controller
    modbus_controller_id: brink
    id: filterstatus
    register_type: read
    address: 4100
    raw_encode: NONE
    name: Filter 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 = "Niet vervuild"; break;
        case 1:  mode_str = "Vervuild";
      }
      return mode_str;

select:
  - platform: modbus_controller
    modbus_controller_id: brink 
    name: "Modbus Control Mode"
    address: 8000
    value_type: S_WORD
    optionsmap:
      "Device LCD": 0
      "Modbus Step": 1
      "Modbus Flow": 2

  - platform: modbus_controller
    modbus_controller_id: brink  
    name: "Bypass Mode"
    address: 6100
    value_type: S_WORD
    optionsmap:
      "Auto": 0
      "Closed": 1
      "Open": 2
number:
  - platform: modbus_controller
    modbus_controller_id: brink
    name: "Ventilatie stand"
    id: ventilatie_stand
    address: 8001
    value_type: S_WORD      
    min_value: 0
    max_value: 3
    mode: slider
  
  - platform: modbus_controller
    modbus_controller_id: brink
    name: "Rekup Fan Imbalance Intake"
    id: rekup_imbalance_intake
    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: brink
    name: "Rekup Fan Imbalance Exhaust"
    id: rekup_imbalance_exhaust
    address: 6036
    unit_of_measurement: "%"
    value_type: S_WORD      
    multiply: 10 
    min_value: -15
    max_value: 15
    mode: slider    


2 Likes

I now have a Brink Flair 325 and it is up and running as of today being able to log in from the app on my phone or from web browser. Has anybody looked at trying to communicate with it via wifi?

There seems to be a very limited set of documentation supplied with the device, or rather I got a very limited set of docs. What have others got?

I would like to monitor it from HomeAssistant but this seems quite complicated. Maybe I’m misreading the discussion and with lack of docs missing some key things.

Hi, I doubt anyone tried to communicate over wifi. Although it looks the wifi connection can work locally without cloud.

But It makes little to no sense trying some shady wifi approach with limited functionalities when we can communicate over (reasonably) documented modbus that is proven to work fine - I would say that getting this to work using esphome is pretty easy. Just get ESP32, RS485 board, solder it together and flash the ESPhome firmware and you are done.

btw if you enable webserver,

web_server:
  port: 80

you can control it even directly without home assistant using web browser and local IP of the ESP32 module

I have it running now. Work like a charm.

Now i want to do the following:

  • Create a button that wil set the Step setting to 3
  • Create a butten that wil set the Step setting to 1
  • Create an automation that wil set the Step setting to 3 when high humidity is detected by a humidity sensor i have

How do i do that? I got the working slider but how do i select a step for a button or a automation?

Hi, for the button you can define it either directly in ESPhome or in Home assistant. I prefer it to be done in ESPhome as everything else is there and it makes no sense to have separate config outside ESPhome. I quickly botched together simple button that does set the step to “3”. Just create another one that sets this back to 1.

This is done directly in ESPhome:

button:
  - platform: template
    name: TEST button 3
    id: my_button

    icon: "mdi:fan-speed-3"
    on_press:
      then:
        - number.set:
            id: rekup_step_setting
            value: 3

You can change the picture by changing icon: "mdi:fan-speed-3"

For the automation just create automation with your desired trigger and for action use this code:
(This is done in Home assistant automations.yaml)

  action:
  - service: number.set_value
    target:
      entity_id: number.rekup_modbus_step_setting
    data:
      value: 3
1 Like

Hi, how are your jumpers set inside the unit? I can’t communicate with the ventilation unit and have triple-checked the ModBus parameters


Didn’t touch them, is there any documentation on what they do?

thanks all for the info! my flair 400 works super on the modbus mod.

1 thing i can’t get working that is an extra text sensor on address: 4020

how can i do this in ESPhome

text_sensor:
  - platform: modbus_controller
    modbus_controller_id: brink
    id: status
    register_type: read
    address: 4020
    raw_encode: NONE
    name: 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 = "Standby"; break;
        case 1:  mode_str = "Bootloader"; break;        
        case 2:  mode_str = "Non Blocking Error"; break;
        case 3:  mode_str = "Blocking Error"; break;
        case 4:  mode_str = "Manual"; break;
        case 5:  mode_str = "Holiday"; break;
        case 6:  mode_str = "Night ventilation"; break;
        case 7:  mode_str = "Party"; break;
        case 8:  mode_str = "Bypass Boost"; break; 
        case 9:  mode_str = "Normal Boost"; break; 
        case 10:  mode_str = "Auto CO2"; break; 
        case 11:  mode_str = "Auto eBus"; break; 
        case 12:  mode_str = "Auto Modbus"; break; 
        case 13:  mode_str = "Auto Lan/ Wlan portal"; break; 
        case 14:  mode_str = "Auto Lan/ Wlan local"; break;                                                         
      }
      return mode_str;

thankyou! its works!

Anyone programmed modbus adress 8010 for the reset of the filter alarm?
Can’t seem to figure out how to add a simple on/off switch or button and write the command to 1…

Edit: never mind, found the problem.
Modbus control mode was not “on”, now it works.

1 Like