Smart-ifying Aprilaire Whole House Humidifier

I wish I would have come across this thread a couple weeks ago! I’ve been doing almost the same project for the last 6 weeks. Oddly enough, we came to about the same conclusions. The one part I was struggling to figure out, was the target humidity automation. Your solution worked perfectly. I’ll put some of my other implementation details below incase it is helpful for others.

I got the AprilAire 600M. (M = manual humidistat because I thought I was going to connect it to my Nest Thermostat). I also bought a AprilAire 50 Low Voltage Current Sensing Relay and a 90-290Q Relay (ended up not needing either). At my last house, I had to run 7-wire thermostat wire to allow the Nest to control my humidifier. I thought I was going to have to do the same for this installation, but I realized the Nest basically just provides 24V to the humidifier when the built in hygrometer is below the target humidity and the furnace is running (call for heat). I figured I could do the same with my existing hygrometers around the home and some Home Assistant automations.

My furnace has a built in HUM (or humidifier) connection on the control board.

This output is automatically turned on only during a call for heat. If you don’t have something like this, the AprilAire 50 Low Voltage Current Sensing Relay can be used to determine when the blower is running, or possibly the heat too. I didn’t look into it much more after discovering the HUM output.

I was going to use the Nest humidifier output to activate a 90-290Q relay, but then I realized that I would rather use the sensors around my home (i.e. the bedrooms) then the one built into my Nest. I looked for a 24V Home Assistant-friendly relay and also chose the MHCOZY linked above. However, I chose to wire my solenoid to the Normally Closed pole so that the humidifier would default to on (my house is pretty dry and even after constant running it only gets to about 50%). Since I am using the HUM as the common, it will still only run during a call for heat. Like @mwaterbu pointed out, the relay shows up as a light. You can also change it to a switch in your configuration file with the following:

default_config:
zha:
  device_config:
    # Humidifier Relay
    a4:c1:38:44:3f:cb:b7:cf-1: # format: {ieee}-{endpoint_id}
      # Replace Humidifier "Light" with "Switch"
      type: "switch"

Since I used the NC, I had to flip my switch such that OFF is ON and ON is OFF. This can be done with templates:

switch:
  - platform: template
    switches:
      home_humidifier_switch:
        unique_id: home_humidifier_switch 
        value_template: "{{ is_state('switch.tuya_humidifier_relay', 'off') }}"
        turn_on:
          action: switch.turn_off
          target:
            entity_id: switch.tuya_humidifier_relay
        turn_off:
          action: switch.turn_on
          target:
            entity_id: switch.tuya_humidifier_relay

I created a helper sensor that did the average of all upstairs hygrometers.

I had to set the device class to humidity in order for the HygroStat to use it. This can be done in the configuration file:

homeassistant:
  customize:
    sensor.upstairs_humidity:
      device_class: humidity

I implemented the HygroStat in my configuration file (vs UI) as below:

# Humidity Helper Hygrostat
generic_hygrostat: 
  - name: Regulate Humidity
    unique_id: regulate_humidity
    humidifier: switch.home_humidifier_switch
    target_sensor: sensor.upstairs_humidity
    target_humidity: 30
    dry_tolerance: 2
    wet_tolerance: 2
    min_humidity: 28
    max_humidity: 60
    device_class: "humidifier"
    min_cycle_duration:
      seconds: 30

For the target humidity, I created another sensor that had values similar to those provided by AprilAire. Credit here: Help with template sensor to dynamically change whole home humidifier to target - #2 by seasideCT

sensor:
  - platform: template
    sensors:
      humidity_target:
        unique_id: humidity_target
        friendly_name: Humidity Target
        unit_of_measurement: "%"
        device_class: humidity
        value_template: >
          {% set out_temp = states('sensor.openweathermap_temperature') | float(0) %} {# grab temperature #}
          {% set rh_target = ((out_temp / 2) + 25) | round|int %} {# use formula to find optimal indoor humidity #}
          {% set rh_round = (((rh_target/2) |int)) *2  %} {# round to the closest '2' integer for ecobee #}
          {{ ([20, rh_round, 44] | sort)[1] }} {# set a min of 20%, max of 44% #}

I wanted to use Optimal Humidity, but I couldn’t get it to work correctly so maybe I’ll look at it another time.

The last step, was to use the target humidity sensor I had created as the target humidity of the HygroStat helper. That’s where @mwaterbu automation worked perfectly:

  - alias: Automatic Humidity Target
    id: automatic_humidity_target
    triggers:
      - trigger: state
        entity_id:
          - sensor.humidity_target
        from: null
        to: null
    conditions: []
    actions:
      - action: humidifier.set_humidity
        metadata: {}
        data:
          humidity: |
            {{ states.sensor.humidity_target.state }}
        target:
          entity_id: humidifier.regulate_humidity
    mode: single

I now have a Hygrostat helper (Regulate Humidity) that uses a table lookup for setting the target humidity (Humidity Target), a relay for control (Home Humidifier), and an average of sensors for the hygrometer (Upstairs Humidity).

1 Like