8 Zone HVAC Controller for Home Assistant

Choose the correct controller revision

This overview covers the earlier controller range. For calibrated partial damper opening, current diagnostics and UART expansion, see the current eight-zone V3 product page. V3 features require V3 hardware and are not a firmware-only upgrade for V2.

Board revision note: This older article and YAML example are for the original/V1 8-zone controller. If you have the newer V2 board, use the separate V2 setup guide instead because the GPIO pinout is different: ESPHome 8-Zone HVAC Controller V2 Setup Guide.

I was looking for a solution that replaces a standard zone controller. It takes 24v ac and then sends it out to one of 4 zones to tell them either to open or close.

Sometimes at night I want to disable or enable a zone, so I came up with this:

The components I used:

  • 3d printed chassis
  • 5v 8 way relay board
  • An esp32 running esphome
  • An ac to dc converter.

This means that you can add this device to home assistant and end up with something like this:

If you would like any info on this project. Let me know! Or if you would like to purchase a pre made one, please head over to the store.

[Edit] after some interest from the home assistant facebook group https://www.facebook.com/groups/2091834914421201 here is the yaml config for esphome:

esphome:
  name: "esphome-web-436e71"
  friendly_name: zone control
  # Ensure all switches turn on by default on boot
  on_boot:
    priority: 100 # Highest priority, ensures all switches turn on without delay.
    then:
      - switch.turn_on: switch1
      - switch.turn_on: switch2
      - switch.turn_on: switch3
      - switch.turn_on: switch4
      - switch.turn_on: switch5
      - switch.turn_on: switch6
      - switch.turn_on: switch7
      - switch.turn_on: switch8

esp32:
  board: esp32dev
  framework:
    type: arduino

# Enable logging
logger:

# Enable Home Assistant API
api:
  encryption:
    key: "matsgMVvo4ElSqlclQCaLxlKAL1VrRpBOf4LDF+T/cE="

ota:
  platform: esphome
wifi:
  ssid: !secret wifi_ssid
  password: !secret wifi_password

  # Enable fallback hotspot (captive portal) in case wifi connection fails
  ap:
    ssid: "Esphome-Web-9995A0"
    password: "rtyWK8HejFHm"

captive_portal:

switch:
  - platform: gpio
    name: "Switch 1"
    pin: GPIO27
    id: switch1
    inverted: False

  - platform: gpio
    name: "Switch 2"
    pin: GPIO32
    id: switch2
    inverted: true

  - platform: gpio
    name: "Switch 3"
    pin: GPIO25
    id: switch3
    inverted: True

  - platform: gpio
    name: "Switch 4"
    pin: GPIO33
    id: switch4
    inverted: False

  - platform: gpio
    name: "Switch 5"
    pin: GPIO26
    id: switch5
    inverted: True

  - platform: gpio
    name: "Switch 6"
    pin: GPIO19
    id: switch6
    inverted: true

  - platform: gpio
    name: "Switch 7"
    pin: GPIO18
    id: switch7
    inverted: true

  - platform: gpio
    name: "Switch 8"
    pin: GPIO17
    id: switch8
    inverted: true

sensor:
  - platform: internal_temperature
    name: "Internal Temperature"

  - platform: wifi_signal
    name: ${friendly_name} wifi signal
    update_interval: 600s

  # human readable uptime sensor output to the text sensor above
  - platform: uptime
    name: ${friendly_name} Uptime in Days
    id: uptime_sensor_days
    update_interval: 60s
    on_raw_value:
      then:
        - text_sensor.template.publish:
            id: uptime_human
            state: !lambda |-
              int seconds = round(id(uptime_sensor_days).raw_state);
              int days = seconds / (24 * 3600);
              seconds = seconds % (24 * 3600);
              int hours = seconds / 3600;
              seconds = seconds % 3600;
              int minutes = seconds /  60;
              seconds = seconds % 60;
              return (
                (days ? String(days) + "d " : "") +
                (hours ? String(hours) + "h " : "") +
                (minutes ? String(minutes) + "m " : "") +
                (String(seconds) + "s")
              ).c_str();

time:
  - platform: homeassistant
    id: homeassistant_time

# Text sensors with general information.
text_sensor:
  # Expose ESPHome version as sensor.
  - platform: version
    name: $friendly_name Version
  # Expose WiFi information as sensors.
  - platform: wifi_info
    ip_address:
      name: $friendly_name IP
    bssid:
      name: $friendly_name BSSID

  # human readable update text sensor from sensor:uptime
  - platform: template
    name: Uptime Human Readable
    id: uptime_human
    icon: mdi:clock-start

Leave a Reply

Your email address will not be published. Required fields are marked *