HVAC Duct Butterfly Valve Controller?

Has anyone tried to install a 24v HVAC duct butterfly valve?

Just curious what you used to control it and how. Raspberry Pi?

No idea if there’s anything off-the-shelf that could do this, but it also wouldn’t be a particularly complex ESPHome project. Might be more effort than you’re wanting to expend for this particular situation, but definitely worth the effort to learn for future projects.

I’ll look into ESPhome on a Raspberry Pi, I’ll set one up and test with the valve uninstalled should it not function properly and i can still return in.

My goal is to have 1 or 2 ducts in the home open/close depending on the temp sensor in the room.

If I want to expand I will have to install a bypass so I don’t put too much strain on my blower.

I use this motorized damper, controlled by a Zooz ZEN17 24v dual relay (though I suspect their dc motor controller would also work). One relay opens the damper and the other closes it; both are set to auto-off after the correct number of seconds. I also wired the dry contacts to the open/close sense wires to be sure it’s open/closed. Together they comprise a template cover that serves as a damper entity (yaml config below). It supports full open, close, and stop, but I don’t try to open a percentage.

The linked motor is spec’d 14Nm torque; there is a cheaper version with a smaller motor that I also tried and it was insufficient to overcome the friction of the rubber gasket on the baffle so it was returned.

cover:
  - platform: template
    covers:
       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_2','on')) %} closing
             {% elif (not is_opened and not is_closed and is_state('switch.zwave_damper_relay_2_2','on')) %} opening
             {% else %} undefined
             {% 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_2
          close_cover:
             - service: switch.turn_on
               target:
                 entity_id: switch.zwave_damper_relay_2
          stop_cover:
             service: switch.turn_off
             target:
                entity_id: 
                  - switch.zwave_damper_relay_2
                  - switch.zwave_damper_relay_2_2
          icon_template: >-
             {% if states('cover.sparebed_damper') == 'closed' %}
                mdi:hvac-off
             {% else %}
                mdi:hvac
             {% endif %}