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

Thanks, just placed order for the devices. Looking forward.

@Fonske Thanks a lot for your work here!
I was able to integrate my Wolf CWL-2-325 in HA, which is identical to the Brink.

Next I want to expose the slider of the fan level (0, 1, 2, 3) to HomeKit, but couldn’t find any solution.

I understand that the slider is a number entity and for this reason can’t be exposed to HomeKit.

Can anyone help me with that?

Hi everyone!

I have a spare M5Stack Atom Echo (from playing around with HA voice assistant) and a Tail485. Will I be able to make this work to control my Brink Flair 400 unit or will either the Tail or the Atom Echo not work? I have some limited experience with ESPhome but I’m definitely not an expert, so I appreciate the help immensely.

I thought I’d just go ahead and try it. I used the ā€˜atom-ttl.yaml’ variant and hooked everything up to my Brink unit. Sadly, I only get modbus error and incorrect values. I changed the modbus address to 1 in both the code and the unit, but it didn’t change anything. I also tried swapping the A and B cables, but alas. Does anyone have any idea what might be the issue? I’ve attached a screenshot of the web interface. Or is this just not going to work and do I need an Atom S3?

An update. I went ahead and got an S3 Lite instead, changed the code and flashed it, still using the Tail485 as a converter.
When power via USB (so no tail attached) it works fine. I see the webUI and everything, logging works in ESPHome, it’s readable in HA with the API (no values of course, because without the tail I have no modbus connection).

However, if I power it via the 24V DC output on the Brink unit, then I can ping the ESP on it’s static IP, I can even wirelessly flash new firmware, but the logging, API and webUI are not working…
Very strange, does anyone have any idea what’s wrong?

Sorry, I cannot really help, however I could not power it using the 24V connection. USB worked fine, I did not explore further.

Hi Folks, This has been running very well for me now for several months.

To get it to work I had to remove the three wires to the Expansion Board (UWA2-E).

Recently, I’ve hit another problem with the 325, it has ā€œError 114 E1126 Exhaust Fan Anemometer Failureā€. As well as this showing on the display of the device when I look at the display in homeassistant the exhaust m3/h is 0.

Whilst the Homeassistant integration code works well, I’m getting pretty fed up with the Brink device and support. (They’ve quoted me to replace the motor and I think the PCB (UWA2-E and it is an eye-watering price - around 20% of the original install price, which included all the ducting etc!)

My main question is, has anybody found a way of getting the error codes through Modbus?

Secondary question, has anybody found a way of getting the fan rpms in homeassistant? I could be missing something if so.

Ancillary question: has anybody had the Error 114 and found a good solution that doesn’t break the bank?

Thank you, robin

For the rpm’s of the fans I have this:

  - platform: modbus_controller
    modbus_controller_id: brink
    id: RPM_supply_fan
    name: "Speed supply fan"
    register_type: read
    address: 4034
    unit_of_measurement: "RPM"
    value_type: U_WORD  
    accuracy_decimals: 0
  
  - platform: modbus_controller
    modbus_controller_id: brink
    id: RPM_exhaust_fan
    name: "Speed exhaust fan"
    register_type: read
    address: 4044
    unit_of_measurement: "RPM"
    value_type: U_WORD  
    accuracy_decimals: 0

Regarding the fan problem in the Netherlands we have this site (also in german) Brink ventilator Flair 300 532759 - HR Premium Parts You buy the fan and send them back your old fan.

Looks like 300 325 400 all use the same fan EBM papst G3G190-rp03-11

1 Like

Hi Sven, Thank you for the code and the NL contact.

I think your code assumes using the Modbus integration in Homeassistant, am I correct?

I’ve not got that installed as I am using esphome.

I think that is why I get errors when adding it to the Homeassistant. I’ll install the Modbus integration tomorrow and test. I assume it will sit nicely beside the esphome access via modbus,

Thanks again, robin

Update, I was sitting thinking, and looking at the esphome code that @Fonske has created and share. The constructs look very similar (address etc). Would it be a better place to put this code? I could copy the code to my HASS and edit it, however, that would then mean I’ve broken the way it is set up. I’m happy to try testing it if that code could be changed to include the RPMs.

robin

The rpm code I use is for esphome. I use also the print from fonske.

Hmm, my Brink yaml is very short:
packages:
remote_package:
url: GitHub - fonske/Brink-flair-modbus: Modbus RTU communication with Brink Flair to use in home assistant / esphome
ref: main
refresh: 0s
files: [ esphome/type/brink-325.yaml,
esphome/labels/.brink-labels-en.yaml,
esphome/.brink.base.yaml,
esphome/boards/board-m5stack-atoms3-lite.yaml,
esphome/sensors/sensor-brink_hum_sensor.yaml,

plus some extra comments. Have you put your RPM code elsewhere?

I have added it to the code just now

1 Like

Recompile / install and they should be added automaticly

Works great. I used this code to add it to the image on the dashboard.

  - type: state-label
    entity: sensor.brink_speed_supply_fan
    style:
      top: 50%
      left: 73%
      color: black
  - type: state-label
    entity: sensor.brink_speed_exhaust_fan
    style:
      top: 50%
      left: 27%
      color: black

@Fonske @limwakra Thank you both for you help.

2 Likes

Hello all,

I have a brink Flair 400, and I would like to integrate it into my Home assistant. I had a look to this topic, and it brings to me few stupid questions, sorry for that, I am still a beginner in Home Assitant:

  1. with ESP32S3 board, do you connect it to home assistant via wifi ? how ?
  2. there is the ESPC6 module available which is compatible with Zigbee. But the number of pins of that board are not same than ESPS3, especially the pins number 16 and 17.
    2.1. How to connect ESP32C6 board to RS45 board ?
    2.2. If it is possible, how to connect via Zigbee ?

Thank you for your answers.

1 Like

@Rustnat
Why do you need zigbee? As the ā€œready for useā€ solution is with esphome (and recognized directly by home assistant) through wifi
https://tweakers.net/aanbod/3850042/m5stack-atom-lite-met-modbus-base-brink-flair-marstek-venus-etc.html

github

I just asked if it was possible in zigbee, because I have nothing connected through wifi in my domotic, everything is in zigbee, only 4 devices in Z-wave.
I will try with wifi if it is the solution.

I also use the code of Fonske. I still cannot connect via modbus to my flair 300.
Bought a new esp32 board and 485 module and will try again next month.

This is a bit off-topic, but for all Brink Flair 325/400 owners: The bypass valve is pretty bad. The servo motor is too strong and creates too much pressure on the plastic valve when initializing (to get initial open/closed values). Sooner or later, it breaks, and you get Error 1200/Error 103 ā€œGeneral Bypass Errorā€. I tried to to glue it together (it’s not hard to get to the part, the unit can be taken apart and back actually surprisingly easily, great plus) to no avail (broke immediately again).

You can by a new part from your local Brink dealers for about 120 EUR and also ask for a new firmware which reduces the servo motor pressure, or let them come to fix it for ya, of course.

Hope it helps anyone.

3 Likes

And I briefly skimmed the thread, and I will just reiterate and report here.

I have been using this ESPHome modbus integration for about 3 years and it works absolutely flawlessly, like, without a single hiccup (which is to say something for the state of home automation, or my zigbee network… :joy: )

Below is my config with my ESP8266, that I flashed via ESPHome three years ago (and didn’t bother to update it in any way as it works just fine/enough for me):

esphome:
  name: hrv-controller
  friendly_name: Rekuperace

esp8266:
  board: nodemcuv2

ota:
  - platform: esphome

logger:
  baud_rate: 0

api:

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

  ap:
    ssid: "Esphome HRV control"
    password: "GvJ6AafkENq6"

captive_portal:

uart:
  id: mod_bus
  tx_pin: D3
  rx_pin: D2
  baud_rate: 19200
  parity: even


modbus:
  id: modbus1
  flow_control_pin: D0
  send_wait_time: 2000ms
  
modbus_controller:
  - id: ventilation
    address: 0x14
    modbus_id: modbus1
    setup_priority: -10  
    update_interval: 30s
    
text_sensor:
  - platform: modbus_controller
    modbus_controller_id: ventilation
    id: ventilation_bypass_status_text
    register_type: read
    icon: "mdi:pipe-valve"
    address: 4050
    raw_encode: NONE
    name: Ventilation Bypass Status
    lambda: |-
      uint16_t int_mode = (data[item->offset] << 8) + data[item->offset+1];
      std::string mode_str;
      switch (int_mode) {
        case 0:  mode_str = "INITIALIZING"; 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: ventilation
    id: ventilation_preheater_status
    register_type: read
    icon: "mdi:radiator"
    address: 4060
    raw_encode: NONE
    name: Ventilation Preheater Status
    lambda: |-
      uint16_t int_mode = (data[item->offset] << 8) + data[item->offset+1];
      std::string mode_str;
      switch (int_mode) {
        case 0:  mode_str = "INITIALIZING"; break;
        case 1:  mode_str = "INACTIVE"; break;
        case 2:  mode_str = "ACTIVE"; break;
        case 3:  mode_str = "TESTING"; break;
        default: mode_str = "UNKNOWN"; break;
      }
      return mode_str;

  - platform: modbus_controller
    modbus_controller_id: ventilation
    id: ventilation_filter_status
    register_type: read
    icon: "mdi:air-filter"
    address: 4100
    raw_encode: NONE
    name: Ventilation Filter Status
    lambda: |-
      uint16_t int_mode = (data[item->offset] << 8) + data[item->offset+1];
      std::string mode_str;
      switch (int_mode) {
        case 0:  mode_str = "CLEAN"; break;
        case 1:  mode_str = "DIRTY"; break;
        default: mode_str = "UNKNOWN"; break;
      }
      return mode_str;

sensor:
  - platform: modbus_controller
    modbus_controller_id: ventilation
    name: "Ventilation To House temperature"
    id: ventilation_to_house_temp
    register_type: read
    icon: "mdi:thermometer"
    address: 4036
    unit_of_measurement: "°C"
    value_type: S_WORD  
    accuracy_decimals: 1
    filters:
      - multiply: 0.1
    
  - platform: modbus_controller
    modbus_controller_id: ventilation
    name: "Ventilation To House humidity"
    id: ventilation_to_house_humidity
    icon: "mdi:water-percent"
    register_type: read
    address: 4037
    unit_of_measurement: "%"
    value_type: S_WORD  
    accuracy_decimals: 1

  - platform: modbus_controller
    modbus_controller_id: ventilation
    name: "Ventilation To Outside Temperature"
    id: ventilation_to_outside_temp
    register_type: read
    address: 4046
    unit_of_measurement: "°C"
    icon: "mdi:thermometer"
    value_type: S_WORD  
    accuracy_decimals: 1
    filters:
      - multiply: 0.1

  - platform: modbus_controller
    modbus_controller_id: ventilation
    name: "Ventilation To Outside humidity"
    id: ventilation_to_outside_humidity
    icon: "mdi:water-percent"
    register_type: read
    address: 4047
    unit_of_measurement: "%"
    value_type: S_WORD  
    accuracy_decimals: 1

  - platform: modbus_controller
    modbus_controller_id: ventilation
    name: "Ventilation From Outside Temperature"
    id: ventilation_from_outside_temp
    icon: "mdi:thermometer"
    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: ventilation
    name: "Ventilation Flow Actual Intake"
    id: ventilation_flow_in
    icon: "mdi:waves-arrow-left"
    register_type: read
    address: 4032
    unit_of_measurement: "m3/h"
    value_type: S_WORD  
    accuracy_decimals: 0

  - platform: modbus_controller
    modbus_controller_id: ventilation
    name: "Ventilation Flow Actual Exhaust"
    icon: "mdi:waves-arrow-right"
    id: ventilation_flow_out
    accuracy_decimals: 0
    register_type: read
    address: 4042
    unit_of_measurement: "m3/h"
    value_type: S_WORD  

  - platform: modbus_controller
    modbus_controller_id: ventilation
    name: "Ventilation output pressure"
    id: ventilation_output_pressure
    icon: "mdi:car-brake-low-pressure"
    register_type: read
    address: 4024
    unit_of_measurement: "Pa"
    value_type: S_WORD  

  - platform: modbus_controller
    modbus_controller_id: ventilation
    name: "Ventilation inlet pressure"
    id: ventilation_inlet_pressure
    icon: "mdi:car-brake-low-pressure"
    register_type: read
    address: 4023
    unit_of_measurement: "Pa"
    value_type: S_WORD  

  - platform: modbus_controller
    modbus_controller_id: ventilation
    name: "Ventilation preheater output"
    id: ventilation_preheater_output
    icon: "mdi:power-plug-outline"
    register_type: read
    accuracy_decimals: 1
    address: 4061
    unit_of_measurement: "W"
    value_type: S_WORD  

select:
  - platform: modbus_controller
    modbus_controller_id: ventilation  
    name: "Ventilation Modbus Control Mode"
    address: 8000
    value_type: S_WORD
    icon: "mdi:cog"
    optimistic : TRUE
    optionsmap:
      "Device LCD": 0
      "Modbus Step": 1
      "Modbus Flow": 2


  - platform: modbus_controller
    modbus_controller_id: ventilation  
    name: "Ventilation Bypass Mode"
    icon: "mdi:pipe"
    address: 6100
    value_type: S_WORD
    optimistic : TRUE
    optionsmap:
      "AUTO": 0
      "CLOSED": 1
      "OPEN": 2

switch:
- platform: modbus_controller
  modbus_controller_id: ventilation
  name: "Ventilation Bypass Boost switch"
  register_type: holding
  address: 6104
  bitmask: 1
  entity_category: config
  icon: "mdi:toggle-switch"

number:
  - platform: modbus_controller
    modbus_controller_id: ventilation
    name: "Ventilation Modbus step setting"
    id: ventilation_step_setting
    register_type: holding
    icon: "mdi:wind-power"
    address: 8001
    value_type: S_WORD      
    min_value: 0
    max_value: 3
    mode: slider

  - platform: modbus_controller
    modbus_controller_id: ventilation
    name: "Ventilation Modbus flow value"
    id: ventilation_flow_settings
    register_type: holding
    icon: "mdi:wind-power"
    address: 8002
    value_type: S_WORD      
    min_value: 0
    max_value: 400
    mode: slider

  - platform: modbus_controller
    modbus_controller_id: ventilation
    name: "Ventilation Flow 1"
    id: ventilation_flow_1
    icon: "mdi:wind-power-outline"
    register_type: holding
    address: 6001
    unit_of_measurement: "m3/h"
    value_type: S_WORD      
    min_value: 50
    max_value: 400
    mode: slider
    
    
  - platform: modbus_controller
    modbus_controller_id: ventilation
    name: "Ventilation Flow 2"
    icon: "mdi:wind-power-outline"
    id: ventilation_flow_2
    register_type: holding
    address: 6002
    unit_of_measurement: "m3/h"
    value_type: S_WORD      
    min_value: 50
    max_value: 400
    mode: slider
    
  - platform: modbus_controller
    modbus_controller_id: ventilation
    name: "Ventilation Flow 3"
    id: ventilation_flow_3
    icon: "mdi:wind-power-outline"
    register_type: holding
    address: 6003
    unit_of_measurement: "m3/h"
    value_type: S_WORD   
    min_value: 50
    max_value: 400
    mode: slider

  - platform: modbus_controller
    modbus_controller_id: ventilation
    name: "Ventilation Fan Imbalance Intake"
    id: ventilation_imbalance_intake
    register_type: holding
    address: 6035
    icon: "mdi:wind-turbine-check"
    unit_of_measurement: "%"
    value_type: S_WORD   
    multiply: 10    
    min_value: -15
    max_value: 15
    mode: slider
      
  - platform: modbus_controller
    modbus_controller_id: ventilation
    name: "Ventilation Fan Imbalance Exhaust"
    id: ventilation_imbalance_exhaust
    icon: "mdi:wind-turbine-check"
    register_type: holding
    address: 6036
    unit_of_measurement: "%"
    value_type: S_WORD      
    multiply: 10 
    min_value: -15
    max_value: 15
    mode: slider    

Few notes:

  1. I had a faulty 485 module, the cheap Chinese ones are often faulty, I don’t think you can tell without trying… I had literally 3 same modules that I bought for like 6 USD, and 1 of them worked :person_shrugging: . I also think they sometimes have switched A/B modbus, so also just try to switch it when testing… It’s unfortunately very annoying to debug.
  2. I don’t think people need a lot of skill to do it. ESPHome Device Builder can run within Home Assistant as an addon. You can buy cheap ESP32 or Nodemcu 8266, take my config, change wifi password, click on ā€œInstallā€, download the binary in a new format, then on your computer open in Chrome https://web.esphome.io/, connect, install the downloaded firmware (you can flash directly if you are connecting microcontroler to your HA instance), then connect to the HRV unit (which is not super easy for me, as it’s form behind the unit, but doable with some dexterity). The device should be recognized by ESPHome integration in Homeassistant (a separate thing than ESPHome Device Builder Addon) or you can add it manually via IP Address in ESPHome integration.
  3. You don’t need an intermediate device like RPi or anything like that
2 Likes