Smart-ifying Aprilaire Whole House Humidifier

Hey guys, I am looking to bounce this idea off of you.

I got a new furnace this year and added a whole house humidifier as I live in the upper Midwest and it can get super dry in the winter. The Aprilaire has been doing it’s job so far and I am happy with it. However, I am not happy with the controls.

There is a box that sits on the cold air return by the furnace with a sensor monitoring the incoming air for humidity. It has a dial where I manually set the desired humidity. The thing is, you need to lower the humidity in the house based on outside air temperature. Otherwise you get condensation and stuff you don’t want.

I did some looking and I could replace the analog box with a ‘digitial’ one from Aprilaire for $100+. I would need to add an exterior temp sensor and wire it in. A bunch of extra work and wiring.

I have a Z-Wave thermostat and a bunch of Z-Wave temp/humidity sensors around the house. I can grab outside temp from any weather service or even add an exterior Z-wave sensor. I should be able to put something together in HA that tracks inside humidity and outside air temp and using a Z-Wave relay, turn the humidifier on or off (when the furnace is running) automatically.

This sounds like a great blueprint as well. Am I off base here? Alas, I don’t know how to make this work.

It might work if you have a separate power cord / outlet for the humidifier.

Just unplug and plug the humidifier to see if that turns it off and back on.

Also try to ask the manufacturer and/or use a review page to ask if that is OK to do so with this unit - it has to handle loosing power, but you’ll probably be doing so many times a day.

I’m thinking of doing the same thing, but have not yet bought a humidifier, and it would be a non-whole house one.

I have Sonoff SNZB-02 sensors, they’re humidity measurements seem to be +/- 10% (based on placing two side by side), I hope they’re good enough to control one of these.

I am looking to do the same thing. I have a bunch of DHT22’s connected to NodeMCU8266 (ESP32) boards with ESPHome firmware that all show up on my dashboard. Further, I have used the temp inputs to control my thermostat. There is a weather widget that came default on lovelace, so that could be the outside air temp input. I think it is just a matter of writing some code with a table of the outside air temp to inside humidity setting and using a relay on a NodeMCU8266 dev board

Similarly, I wanted to use this setup to control dampers and a whole house fan to reduce air conditioning use in summer. Using an algorithm that uses a combination of temp and humidity to control when outside air is drawn in and when internal recirc air and AC is used. If I find time at Christmas I will give both of these related ideas a go.

If anyone has tried this, please advise.

I have an Aprilaire whole house humidifier also. Total interested in a better intergration into HA.
I am currently using an OmniproII to control it and have the OMPro II configured with HA.
Going to try the Generic hygrostat integration next.

I also have an Aprilaire humidifier that I want to integrate into HA. Mine is a digital controller with the optional hookup for an outdoor temperature sensor (which I don’t have), so my ideas below may not apply to the analog humidistat. (Model is an older version of this: Amazon.com)

Bypassing the unit with a relay is an option as @thezfunk mentioned, but I would prefer not to do that as there are several more considerations that need to be made when controlling the solenoid directly:

  • the blower should be running
  • how long to activate solenoid to saturate water panel with the appropriate amount of moisture?
  • how often to cycle solenoid to keep water panel saturated while fan is running?

I think that automating the input to the humidifier will be a more robust solution, however, power cycling the humidifier (and probably keeping it at the max humidity target) as @patmans mentioned should also work. I am essentially doing this with a portable humidifier for specific rooms in my house currently.
In my case for the Aprilaire though, I want to use the built-in humidity sensor on the air coming through the return, so power cycling the unit will not work for this. It is necessary to control the target of the humidistat directly.

I see two possible ways to do this, but both are essentially the same solution in the end.

First, I could spoof the value of the outdoor temperature sensor to make the humidistat target the humidity that I want. Aprilaire lists the following as the target humidity levels based on outdoor temperature and the dial setting on the unit:
image

So, if I set the dial to 5, I could send humidity commands between 20% and 45% by sending the corresponding temperatures from -10 to 40 degF (regardless of the actual outdoor temperature). I could just send the actual outdoor temperature to use the recommended humidity levels, but sending a “control temperature” instead gives the option of setting something above or below that recommended humidity, so I would prefer to have more control. I will use this table as a reference when creating my target humidity template sensor in HA, though.

I also found the following as the specs for the temperature sensor the humidistat is expecting:
image

I haven’t done something like this before, but I think the correct solution here would be to use a digital potentiometer, or a resistor ladder to control the correct resistance.

The second solution would be to bypass the dial on the humidistat and just control the humidity target directly. This may be a good option if the humidistat does not have ODT terminals to use. My unit has dial settings from 1-7 (shown in the table above), as well as 0 (off) and 8 (test/reset for water panel replacement timer), which is a simple potentiometer. This is running at 5V DC, and seems to go up to about 4.5kΩ. So again, using a digital poteniometer would be the solution here. This would require removal of the dial potentiometer, and soldering the digital replacement in, so if the same level of control can be achieved with the ODT method, it seems much easier (and also probably won’t void your warranty).

A couple things I am unsure of:
Is the precision only controlled in steps of 5%? The digital nature of the display on the unit (showing 1-7 from the dial) would indicate such, but the fact that both the dial and temperature sensor are analog would make me think it is not.
The true limits of my unit are 10%-45%, but the table above does not show any single dial setting which could use this full range. This may be because the table is only for reference. I am wondering though, if I set the dial at 4, and the temperature increases above 40degF, or below -10degF, will the humidistat actually command 45% or 10%, as those values are not listed on the row for a dial setting of 4?

Additional thoughts:
The type of digital potentiometer would be different depending on whether the ODT sensor is being spoofed or the dial is being bypassed. First, the resistance ranges are completely different. Additionally, the behavior is different: the dial is a linear type pot, whereas the temperature sensor would probably be better replaced with a logarithmic pot.

Once the right component is found, this seems like a good job for ESPHome.

Am I overcomplicating this?

Seems like the best/safest/most reliable bet, given that things going wrong have potential to damage your home would be to just get a thermostat that integrates with Home Assistant and can control a whole-house humidifier.

The venstar T7900 can control a whole house humidifier, and that’s fully local: Venstar - Home Assistant
Looks like some of their other models can, too, but you can check them out yourself.

Various ecobee models can control a humidifier:
https://support.ecobee.com/s/articles/How-do-I-add-accessories-to-my-ecobee-thermostat
Though those don’t have full functionality over homekit, meaning you’d probably need to use that PLUS the cloud integration.

I would agree that bypassing the humidistat could lead to undesirable results if not implemented in a robust way.
But the worst thing that can happen with the solution I detailed above (using the outdoor temperature sensor signal to control humidistat) is that the humidifier runs at its maximum setpoint of 45%. This solution does not bypass the humidistat. This is no worse than it being manually set to that point and forgotten about on a cold winter day (potential for condensation in the house).

The products you linked to seem like they would also work well. Unfortunately, I cannot see justifying the cost to replace my already smart z wave thermostat with ones of those.

I’m looking at getting the AprilAire E080 Pro and controlling it with HA. Came across this post in the process. Looking at the owners manual for the E080, it appears that it accepts an external control by just wiring in a relay switch. (Though there is a 3 minute delay when starting via an external switch.)

Figure I’ll connect a smart relay, from Shelly most likely, and use that to control the dehumidifier, using the several humidity sensors I already have around the house as the trigger. I don’t know that the AprilAire humidifiers have the same external control functionality, but figured I’d share just in case they do. Better late than never, right?

Well, incidentally, my humidistat just died, about a year after my other post here. Needing a solution, and being lucky that the solenoid still works, I decided to just bypass it with a relay. This ended up being very simple.

Here is the original wiring that went to the control board:
image
H are just the two wires for the solenoid.

I found this Zigbee relay that allowed me to power it directly from the 24VAC of the HVAC control wires, no USB power required. This, combined with a Generic Hygrostat helper, and a humidity sensor is basically all you need.

Here is how I wired it up:
image
Using W to power the solenoid ensures that it won’t run unless there is a call for heat. This also acts as a small safeguard in case my control logic is faulty or the relay fails on, the worst that can happen is the solenoid runs every time there is heat vs running 24/7 (including during seasons where heat is not used). You could also use G instead of W, but evaporation off the pad is less efficient without the hot air, leading to more wasted water (and a less stringent safeguard).

One small change I needed to make to get this working with the hygrostat integration: for some reason the zigbee configuration of this device reports the relay as a light, instead of a switch. You need a switch entity to use it in a controller.

Below is a guide I wrote for handling this, as I had not seen this done before:

A final optional step would be to use an outdoor temperature sensor, or a weather service to set the target humidity. For me, this was the original reason why I wanted to do this. But after the humidistat went out, I finally had to get it done.

1 Like

I’ve been looking into the “optimal” target humidity a bit more, and thought I would share what I found, in case others might find it useful.

Generally, the “ideal” range of relative humidity indoors is listed as 30-50%, although I have also seen 40-60%, among other variations. The EPA specifically says that RH should stay below 60% to inhibit mold growth. Energy Star states that in cold climates, RH should be kept between 30-40% to avoid condensation on windows.

Several posts above, there is a chart I found from my Aprilaire installation guide which details RH targets for a given outdoor temperature, and then different dial settings to adjust that range higher or lower.

Aprilaire also details the various risk levels associated with different humidity levels (outside of condensation):


Credit: Aprilaire

Additionally, they provide a straightforward recommendation of humidity levels at given outdoor temperatures:
image
This directly correlates with dial setting 5 in the table I posted previously.

While this table of recommendations above is great as a baseline, to make this more adaptable, I want to allow for variations based on different people’s comfort levels and needs based on the various risks plotted in the graphic above, as well as the needs of different homes (a home with better insulated windows and walls may be able to tolerate higher humidity levels without risking condensation, whereas a home with single pane aluminum frame windows may need to target lower humidity to prevent ice from forming on their windows). Therefore, the relative humidity guide from Aprilaire with 7 dial settings seems ideal.

With all this in mind, let’s do some actual automating!

Taking the numbers from Aprilaire’s guide, the following transfer function can be derived:

RHT = (0.5 * ODT) + (5 * DS)

Where:

RHT = Relative Humidity Target (%)
ODT = Outdoor Temperature (°F)
DS = Dial Setting (Comfort Level from 1-7, with 5 being the baseline)

From here, clips should be applied, I am choosing 10% as a minimum, and 50% as a maximum.

First, I made an input number helper for the comfort level:

image

Next, I created a template sensor for the RH target:

{{ max(10, min(50, (0.5 * float(states.sensor.odt.state)) + (5 * int(states.input_number.aprilaire_humidifier_comfort_level.state)))) | round }}

image

Then, all that’s left is to wire this up to set the target.

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

I know this is somewhat basic, but I hope it was helpful to someone!

1 Like

Amazing thread! Fairly new at HA and this was very easy to follow along. I only wish i would’ve seen this before I bought a 600 with the humidistat.

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

I realize this post is old and resurrecting it a bit for a little help.

I loved this idea so much I had to do it and get rid of that old humidistat hanging on my wall. So far, I have the relay wired up and have it working but I am having difficulties getting this to automatically work.

I have created my sensor template to pull an average humidity reading from several different sensors across the house: sensor.humidity_sensor_average

I have the comfort level setting (1-7) created: input_number.humidifier_comfort_level

I have the target humidity sensor calculated based upon comfort level setting and outdoor temperature: sensor.aprilaire_target_relative_humidity

Humidifier relay used in above posts (installed as a switch, not a light so they must have fixed something) entity_id: 1d7962e43807f383f2e8a382c3c8d3d5

Where I have issues is trying to get this to automate. I created a generic hygrostat (UI) and can get the current humidity from any sensor but not my ‘average sensor helper’. it doesn’t show up as an option

I can not get the set level to what the output of the target sensor should be. It’s all just a manual setting.

And for automating it - I’m lost as to what to do. Will the hygrostat helper take care of it at that point or do I need to do automations or something?

Thanks for helping a newb and getting that ugly thing off my wall. Since I’m a newbie, my picture upload is limited. I also looked for the yaml code for the hygrostat but can’t find it. its not in my configuration.yaml file.

Sounds like you’re close. A couple things I had to do for my setup;

If you create the Hygrostat via the UI versus in the configuration file, you will not see the yaml in your configuration file. At first, I also created my Hygrostat in the UI, but ultimately deleted it and created it solely in the configuration file so that I could manually set a few parameters not available in the UI (at this point, I don’t remember which ones…I think it might have been so I could set a default target humidity and set the unique id).

The Hygrostat will only take a device class of “humidity” as an “Humidity sensor” (or target_sensor). After you create your average sensor helper (sensor.humidity_sensor_average), you need to change its device class. (see example in my previous post above or below)

homeassistant:
  customize:
    sensor.humidity_sensor_average:
      device_class: humidity

For automation, the Hygrostat will turn your humidifier on and off until it reaches your desired target humidity. What the Hygrostat won’t do, is update the “target_humidity” based on your comfort level and outside temperature (sensor.aprilaire_target_relative_humidity). For that, you’ll need an automation to set hygrostat.target_humidity = sensor.aprilaire_target_relative_humidity.
(see example in my post above or below)

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

Thanks bippin. I also found out that the UI didn’t do what I needed and built the hygrostat in configuration.yaml.

As for automating it, I did a little different and set it up to update the target humidity in they hygrostat every 5 minutes. Probably overkill but I’m happy and its working. Plus that ugly thing is off my wall now! :slight_smile:

Now I gotta wait till this winter to see how well it does. Before automating it, it would kick on when it detected the fan running. I followed the advice here to do it when it only calls for heat. If it don’t throw enough humidity in the house, well I can easily fix that to run when fan is on instead of call for heat.

Anyhow, thanks for the response. Really appreciated!