Blauberg recuperator S14 Controller

Hello, I did not find existing DIY solution to control my air recuperator unit (KOMFORT ERV EC DB 350), so I made it.

I created a library for ESPHome to replace original S14 (I incorrectly named it as S22 before, but according to my recuperator description it has to be S14) controller and to be able to control recuperator via home assistant.

Feel free to use

4 Likes

Hi! Nice job!
Will it work with S25 controller?

image

I have Blauberg KOMFORT ROTO EC DE 250 L S25 model. That is also different - I have roto type (rotary heat exchange) recuperator.

Hello. Your controller looks way smarter than mine. There are a lot of info given by recuperator to controler in your case. So I believe it has different protocol

Hello, I am struggling a little bit with your implementation. Can you please add more specific instruction how to integrate you script. Keep in mind I have never add any device inside ESPHome and also if I try to add your yaml directly to configuration.yaml of HA I am getting a lot of warnings.

It would be also great if you can describe in more detail how to use configuration parameters. However, thank you for your effort and contribution to the community.

Hi.

First of all, it turned out that this is S14 controller, not S22 as it was named before (see discussion S22 or S14? · Benas09/Blauberg_S14 · Discussion #1 · GitHub), so please check if yours is the same.

You have to build and upload code and yaml (using ESPHome framework - https://esphome.io/) to D1 Mini board and not to Home Assistant directly. As I understand, you are not familiar with ESPHome yet?

And one more thing - this will replace original controller. They both can not be plugged in at the same time - you disconnect original controller and connect D1 Mini board.

Thanks! Can You share what logic/thermostat or automation You use for it? I’m thinking how to switch bypass by outside temperature and control fan speed by co2/humidity, turn off when windows are open…

This is one of automations I use. When you open one of the windows and keep it open more than 10 seconds, it turns off recuperator until you close all windows

alias: Rekuperatorius langai
description: ""
trigger:
  - platform: state
    entity_id:
      - binary_sensor.ofiso_langas
      - binary_sensor.miegamojo_langas
      - binary_sensor.vaiku_langas
      - binary_sensor.tualeto_2_langas
      - binary_sensor.iejimo_langas
      - binary_sensor.virtuves_langas
    to: "on"
    for:
      hours: 0
      minutes: 0
      seconds: 10
action:
  - data:
      scene_id: recuperator_langai_revert
      snapshot_entities:
        - >-
          switch.blauberg_s14_speed_0, switch.blauberg_s14_speed_1,
          switch.blauberg_s14_speed_2, switch.blauberg_s14_speed_3
    action: scene.create
  - data: {}
    target:
      entity_id: switch.blauberg_s22_speed_0
    action: switch.turn_on
  - wait_template: >-
      {{ states('binary_sensor.ofiso_langas') == 'off' and
      states('binary_sensor.miegamojo_langas') == 'off' and 
      states('binary_sensor.vaiku_langas') == 'off' and 
      states('binary_sensor.tualeto_2_langas') == 'off' and 
      states('binary_sensor.iejimo_langas') == 'off' and 
      states('binary_sensor.virtuves_langas') == 'off' }}
    continue_on_timeout: true
  - data: {}
    target:
      entity_id: scene.recuperator_langai_revert
    action: scene.turn_on
mode: single
max_exceeded: silent

1 Like

This one sets speed to max when humidity increases to some level and resets to previous state when humidity is decreased. But it takes time (about half hour or more) at least in my home.

alias: Rekuperatoriaus boost
description: ""
trigger:
  - platform: template
    value_template: >-
      {{ states('sensor.aqara_tualetas1_humidity') > '55' or
      states('sensor.aqara_tualetas2_humidity') > '55' }}
    for:
      hours: 0
      minutes: 0
      seconds: 10
condition: []
action:
  - data:
      scene_id: recuperator_revert
      snapshot_entities:
        - >-
          switch.blauberg_s14_speed_0, switch.blauberg_s14_speed_1,
          switch.blauberg_s14_speed_2, switch.blauberg_s14_speed_3
    action: scene.create
  - data: {}
    target:
      entity_id: switch.blauberg_s22_speed_3
    action: switch.turn_on
  - wait_template: >-
      {{ states('sensor.aqara_tualetas1_humidity') < '55' and
      states('sensor.aqara_tualetas2_humidity') < '55' }}
    continue_on_timeout: true
  - data: {}
    target:
      entity_id: scene.recuperator_revert
    action: scene.turn_on
mode: single
max_exceeded: silent
1 Like

Thanks again! Another question… :slight_smile: Should it turn off automatically or i have done something wrong?

For me it turn offs automaticaly time by time. And the reason is that ESPHome automatically restarts (maybe wifi issues or some other reason, I dont know). And in the code I set default fan speed to off.

I did not fixed this yet, but I have automation to set last state when you select speed and reset it after ESPHome reboots:

alias: BlaubergS14 Reset state
description: ""
trigger:
  - platform: state
    entity_id:
      - sensor.blauberg_s14_speed
condition:
  - condition: template
    value_template: "{{ trigger.to_state.state != 'unavailable' }}"
action:
  - delay:
      hours: 0
      minutes: 0
      seconds: 2
      milliseconds: 0
  - if:
      - condition: template
        value_template: "{{ trigger.from_state.state == 'unavailable' }}"
    then:
      - delay:
          hours: 0
          minutes: 0
          seconds: 3
          milliseconds: 0
      - metadata: {}
        target:
          entity_id: scene.blauberg_s14_last_state
        action: scene.turn_on
    else:
      - choose:
          - conditions:
              - condition: template
                value_template: "{{ trigger.to_state.state == '0' }}"
            sequence:
              - metadata: {}
                data:
                  scene_id: blauberg_s14_last_state
                  snapshot_entities:
                    - switch.blauberg_s14_speed_0
                    - switch.blauberg_s14_damper
                action: scene.create
          - conditions:
              - condition: template
                value_template: "{{ trigger.to_state.state == '1' }}"
            sequence:
              - metadata: {}
                data:
                  scene_id: blauberg_s14_last_state
                  snapshot_entities:
                    - switch.blauberg_s14_speed_1
                    - switch.blauberg_s14_damper
                action: scene.create
          - conditions:
              - condition: template
                value_template: "{{ trigger.to_state.state == '2' }}"
            sequence:
              - metadata: {}
                data:
                  scene_id: blauberg_s14_last_state
                  snapshot_entities:
                    - switch.blauberg_s14_speed_2
                    - switch.blauberg_s14_damper
                action: scene.create
          - conditions:
              - condition: template
                value_template: "{{ trigger.to_state.state == '3' }}"
            sequence:
              - metadata: {}
                data:
                  scene_id: blauberg_s14_last_state
                  snapshot_entities:
                    - switch.blauberg_s14_speed_3
                    - switch.blauberg_s14_damper
                action: scene.create
mode: single