Tim Hodges
Published © GPL3+

Boiler flow temperature controller

Converts a standard regular condensing gas boiler operating inefficiently at a high flow temperature into a more efficient one.

AdvancedFull instructions provided20 hours50
Boiler flow temperature controller

Things used in this project

Hardware components

Buck Converter Step Down DC-DC Adjustable Power Supply Voltage Regulator LM2596
Adjust to the voltage required by the ESP8266
×1
9V 1A Switching Wall Power Supply
9V 1A Switching Wall Power Supply
×1
MG996R MG995 Torque Gear Servo Motor
Make sure it covers the turning angle required for your dial. I needed 180 degrees of rotattion.
×1
Wemos D1 Mini ESP8266 Development Board
×1
Strong Flat Rare Earth Magnets Square Neodymium Magnets With Screw Holes
×1

Software apps and online services

Home Assistant
Home Assistant

Story

Read more

Code

setBoiler script in Home Assistant

YAML
alias: setBoiler
sequence:
  - if:
      - condition: template
        value_template: "{{hw_config}}"
    then:
      - choose:
          - conditions:
              - condition: template
                value_template: "{{duration==0}}"
            sequence:
              - action: input_boolean.turn_off
                metadata: {}
                data: {}
                target:
                  entity_id: input_boolean.hw
              - action: timer.finish
                metadata: {}
                data: {}
                target:
                  entity_id: timer.hot_water
              - action: number.set_value
                metadata: {}
                data:
                  value: "-90"
                target:
                  entity_id: number.knob_turner_knobturnerservocontrol
                enabled: true
          - conditions:
              - condition: template
                value_template: "{{duration > 0}}"
            sequence:
              - action: input_boolean.turn_on
                metadata: {}
                data: {}
                target:
                  entity_id: input_boolean.hw
              - action: number.set_value
                metadata: {}
                data:
                  value: "90"
                target:
                  entity_id: number.knob_turner_knobturnerservocontrol
                enabled: true
              - choose:
                  - conditions:
                      - condition: template
                        value_template: "{{duration==30}}"
                    sequence:
                      - action: timer.start
                        metadata: {}
                        data:
                          duration: "00:30:00"
                        target:
                          entity_id: timer.hot_water
                  - conditions:
                      - condition: template
                        value_template: "{{duration==60}}"
                    sequence:
                      - action: timer.start
                        metadata: {}
                        data:
                          duration: "01:00:00"
                        target:
                          entity_id: timer.hot_water
                  - conditions:
                      - condition: template
                        value_template: "{{duration==90}}"
                    sequence:
                      - action: timer.start
                        metadata: {}
                        data:
                          duration: "01:30:00"
                        target:
                          entity_id: timer.hot_water
    else:
      - condition: state
        entity_id: input_boolean.hw
        state: "off"
      - variables:
          target: "{{ state_attr('climate.hallway', 'temperature') | float(0) }}"
          current: >-
            {{ state_attr('climate.hallway', 'current_temperature') | float(0)
            }}
          delta: "{{ target - current }}"
      - choose:
          - conditions:
              - condition: template
                value_template: |
                  {{  (delta >= 1.5) }}  
            sequence:
              - action: number.set_value
                metadata: {}
                data:
                  value: "0"
                target:
                  entity_id: number.knob_turner_knobturnerservocontrol
                enabled: true
          - conditions:
              - condition: template
                value_template: |
                  {{  (delta > 0.0) and (delta < 1.5) }}  
            sequence:
              - action: number.set_value
                metadata: {}
                data:
                  value: "-35"
                target:
                  entity_id: number.knob_turner_knobturnerservocontrol
                enabled: true
          - conditions:
              - condition: template
                value_template: |
                  {{  (delta <= 0.0) }}
            sequence:
              - action: number.set_value
                metadata: {}
                data:
                  value: "-65"
                target:
                  entity_id: number.knob_turner_knobturnerservocontrol
                enabled: true
fields:
  duration:
    selector:
      number:
        min: 0
        max: 90
        step: 30
    name: duration
    required: true
  hw_config:
    selector:
      boolean: null
    name: hw_config
    required: true
    description: Pass as true when configuring hw override (even when turning off hw)
description: |2
    Switches boiler between HW and non HW (i.e.CH)  mode. In HW mode it turns knob to +90 rotational degrees for passed duration. In CH mode sets knob angle based on delta b/w current and target temp.
  -35 rot = flow temp 56c
mode: queued
max: 10

ESP32 Yaml

YAML
esphome:
  name: knob-turner
  friendly_name: knob-turner
  on_boot:
    priority: -100
    then:
      - lambda: !lambda |-
          id(servoSlider1).make_call().set_value(0).perform();

esp8266:
  board: esp01_1m

# Enable logging
logger:

# Enable Home Assistant API
api:
  encryption:
    key: "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"

ota:
  - platform: esphome
    password: "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"

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

  # Enable fallback hotspot (captive portal) in case wifi connection fails
  ap:
    ssid: "Knob-Turner Fallback Hotspot"
    password: "xxxxxxxxxxxxxxxx"

captive_portal:

number:
  - platform: template
    id: servoSlider1
    name: KnobTurnerServoControl
    min_value: -90
    initial_value: 0
    max_value: 90
    step: 1
    optimistic: true
    set_action:
      then:
        - servo.write:
            id: knob_turner
            level: !lambda 'return x / 90.0;'    

servo:
  - id: knob_turner
    output: pwm_output
    auto_detach_time: 5s
    transition_length: 5s
    min_level: 2.8%
    idle_level: 7.5%
    max_level: 12.6%
      
      

# Example output platform
# On ESP32, use ledc output
output:
  - platform: esp8266_pwm
    id: pwm_output
    pin: GPIO15
    frequency: 50 Hz

Automation in Home Assistant

YAML
This automation works with the setBoiler script
alias: HW / CH Thermostat control
description: Controls the servo to turn the temp up for HW on boiler
triggers:
  - at: "08:30:00"
    id: MORN-ON
    trigger: time
  - at: "16:00:00"
    id: EVE-ON
    trigger: time
  - trigger: event
    event_type: timer.finished
    event_data:
      entity_id: timer.hot_water
    id: HWOFF
  - trigger: time_pattern
    id: TIMER
    minutes: /10
conditions: []
actions:
  - choose:
      - conditions:
          - condition: trigger
            id:
              - EVE-ON
        sequence:
          - action: script.hw_heating
            data:
              duration: 60
              hw_config: true
      - conditions:
          - condition: trigger
            id:
              - MORN-ON
        sequence:
          - action: script.hw_heating
            data:
              duration: 30
              hw_config: true
      - conditions:
          - condition: trigger
            id:
              - HWOFF
        sequence:
          - action: script.hw_heating
            data:
              duration: 0
              hw_config: true
      - conditions:
          - condition: trigger
            id:
              - TIMER
        sequence:
          - action: script.hw_heating
            data:
              duration: 0
              hw_config: false
    default:
      - action: input_boolean.turn_off
        metadata: {}
        data: {}
        target:
          entity_id: input_boolean.hw
      - action: script.hw_heating
        data:
          duration: 0
          hw_mode: false
mode: single

Credits

Tim Hodges
2 projects • 3 followers

Comments