I’ve been using this motorized inline HVAC damper for “zone” control in my spare bedroom for over a year now, and have cited it several times as an example so I thought I might share the full implementation in case it inspires anyone.
Concept
The room is fed by a single HVAC duct which now has the damper installed inline. When the damper is closed, the room is cut off from the central air. When the damper is open, the room is heated/cooled along with the rest of the house. Sensors in the room measure temperature and humidity (and whether the door and window are open/closed), so other logic (eg HA automations, not covered here) determines the desired damper status. Note this damper does not have fine-grained percent control — it is either completely open or completely closed in this implementation.
Hardware
The motorized damper I’ve implemented, shown below, was under $60 USD in 2023. (while these are also available on AliExpress, they can also be found on Wal-Mart and Amazon which have a better return policy). It comes in various duct diameters, but the key features of this model are
- 24Vdc power (AC mains might work for you, too, depends on what relay you choose)
- 14Nm torque motor (not the 1Nm version!)
- Wires for open power, close power, open sensor, and close sensor.
Note: I also purchased, and returned, a model from Amazon that had a much weaker (1 or 2 Nm, iirc) motor which was grossly insufficient to even overcome the friction of the silicon gasket resulting in the motor clicking back and forth and not moving anywhere. Those motors have more rounded casings and only three-wire input (which are not even real). Avoid.
My motor is controlled by a Z-Wave relay module, Zooz ZEN17 — chosen because it has dual isolated dry contact inputs and dual relay outputs, and because it can run on 24Vdc power. The wiring diagram would look something like this:
So when R1 is closed, the motor’s “open” line gets 24v and starts opening. When R2 is closed, the motor’s “close” line gets 24v and starts closing. When the damper is completely closed, S1 reads closed and S2 reads open. When the damper is completely open, S1 reads open and S2 reads closed. While the damper is moving, one of the relays will be closed and S1 and S2 match.
Configuration
ZEN17 allows you to set the following important parameters:
- Parameter 2: S1 Terminal input type: Door Sensor (open/close)
- Parameter 3: S2 Terminal input type: Door Sensor (open/close)
- Parameter 6: Auto Turn-off R1: 8 seconds (time it takes motor to finish opening)
- Parameter 8: Auto Turn-off R2: 8 seconds (time it takes motor to finish closing)
- Parameter 10: Control R1 with S1: False
- Parameter 11: Control R2 with S2: False
- Parameter 20: S2 Invert: True (so sensors match when stationary instead of when moving)
- Parameter 24: DC Motor Mode: True (so both relays can’t engage at same time)
This allows the ZEN17 to appear in Home Assistant with two relays and two binary sensors.
Finally, in order to turn these switches and sensors into a damper (cover) entity, you need to define a template in YAML which uses all of the entities above, plus the node_status sensor for availability:
cover:
- platform: template
sparebed_damper:
device_class: damper
friendly_name: "Spare Bedroom Damper"
value_template: >-
{% set is_opened = is_state('binary_sensor.zwave_damper_relay_window_door_is_open_2', 'on') %}
{% set is_closed = is_state('binary_sensor.zwave_damper_relay_window_door_is_open', 'off') %}
{% if (is_opened and not is_closed) %} open
{% elif (is_closed and not is_opened) %} closed
{% elif (not is_opened and not is_closed and is_state('switch.zwave_damper_relay','on')) %} closing
{% elif (not is_opened and not is_closed and is_state('switch.zwave_damper_relay_2','on')) %} opening
{% else %} none
{% endif %}
availability_template: "{{ states('sensor.zwave_damper_relay_node_status') == 'alive' }}"
open_cover:
- service: switch.turn_on
target:
entity_id: switch.zwave_damper_relay_2
close_cover:
- service: switch.turn_on
target:
entity_id: switch.zwave_damper_relay
stop_cover:
service: switch.turn_off
target:
entity_id:
- switch.zwave_damper_relay
- switch.zwave_damper_relay_2
icon_template: >-
{% if states('cover.sparebed_damper') == 'closed' %}
mdi:hvac-off
{% else %}
mdi:hvac
{% endif %}