Controlling Whole House Fans

I am pretty new to Veralite and Home Automation, and would like to ask for your recommendation on how to accomplish something.

I have a combination of central heating and single gas furnace. Each of these systems has their own (non Z-wave) programmable thermostats.

My house has no Air Conditioning, but it does have three (3) fans that force air from the rooms into the atic space; known as whole house fans. Currently, each of these fans has a wall “timer” that is used to turn the fans on. I would like to retain the existing wall timers, and automate the turning on of these fans. If the temperature in the house is above 75 degrees, then I would like to turn on the fans via Z-wave and Veralite.

I am assuming that a solution would look like what I have below, but I am looking for suggestions…

[ol][li]Replace my existing thermostats with Z-wave thermostats[/li]
[li]Add Z-wave appliance control modules in the circuit after the existing wall timers[/li]
[li]When the room temperature reading on the Z-wave thermostats exceeds 75 degrees, activate the Z-wave applicance switches[/li][/ol]

Will most any Z-wave thermostat provide me with the “actual” temperature in Veralite so that I can test on it?

Any thoughts or suggestions would be appreciated.

I think you will want the Z-Wave Fan Control to be in parallel with the existing timer switches (Something like the Aeon Smart energy switch). That way you can turn on
the fans if you are not around to manually hit the timer switches.
You could replace the Wall Timers with Wall Z-Wave Switches and let the PLEG Plugin control the off timer settings for the fans, yet providing local/instant fan on/off control.

You can use some battery powered multi-sensors … which include Z-Wave temp sensors to use temperature in your PLEG control logic.
But if you want to use Z-Wave thermostats for automation of heat system … them you can still use them to control the fan automation with PLEG.

My Trane 400 tstat, and I assume most other zwave ones as well, have the variable CurrentTemperature available which shows the current temperature. Based on how your whole house fans are wired? If they are on plain 110v and you have line, load, neutral and ground available, you could replace each timer with a zwave switch and control that one. Using Vera as the timer for these switches.

Thank you for the response.

I hadn’t really thought about using just a simple Z-wave wall switch. In addition to turning the fans on manually, I am thinking I could have two triggers. 1) if the Temperature is above 80 then turn the fans on. 2) if the temperature is below 80 then turn the fans off after 30 minutes.

[quote=“RichardTSchaefer, post:2, topic:181710”]I think you will want the Z-Wave Fan Control to be in parallel with the existing timer switches (Something like the Aeon Smart energy switch). That way you can turn on
the fans if you are not around to manually hit the timer switches.
You could replace the Wall Timers with Wall Z-Wave Switches and let the PLEG Plugin control the off timer settings for the fans, yet providing local/instant fan on/off control.

You can use some battery powered multi-sensors … which include Z-Wave temp sensors to use temperature in your PLEG control logic.
But if you want to use Z-Wave thermostats for automation of heat system … them you can still use them to control the fan automation with PLEG.[/quote]

I would probably add some logic in there too to check to make sure windows are opened. No sense having the fan turn on if there is nothing for it to pull in.

Not sure if they have a ZWAVE damper (or just use a standard one with a MIMOLite or something), but you could use that to allow intake air somehow perhaps. Similar to a fresh air intake into the return air for a furnace. But with a Damper.

Not sure how large you’d need. These are typically 8" or 10" and work off of DC voltage (I think). You can get them as normally open or closed. Then when voltage is applied, it reverses.

Just an idea…perhaps not even required as you might pull enough air through the existing fresh air/combustion air ducts…

I have a whole house fan where I switched the timer for a GE wall switch. I also have 2 z wave thermostats, the weather underground app, a virtual switch, and a timer app. I use these to control my whole house fan based off of a combination of a virtual switch and the current heat index (both inside and outside). I run this code in a scene that runs every 5 minutes to check. It also emails me when the fan starts based off temp. Here’s my work in progress code (it does use a few startup functions which I’ll post shortly):

–Trigger for whole house fan
local sEmailSubject = “Whole House Fan Turned On”
local sEmailBody = “”
local upstairsThermostatID = 31
local downstairsThermostatID = 30
local outsideThermostatID = 11
local outsideHumidityID = 14
local outsideHighID = 13
local vsHFatTempID = 35
local wholeHouseFanID = 8
local timmerID = 5

local wholeHouseFanStatus = luup.variable_get(“urn:upnp-org:serviceId:SwitchPower1”, “Status”, wholeHouseFanID)
local upstairsTemp = luup.variable_get(“urn:upnp-org:serviceId:TemperatureSensor1”, “CurrentTemperature”, upstairsThermostatID)
local upstairsHumidity = luup.variable_get(“urn:honeywell-com:serviceId:ThermostatData1”, “IndoorHumidity”, upstairsThermostatID)
local downstairsTemp = luup.variable_get(“urn:upnp-org:serviceId:TemperatureSensor1”, “CurrentTemperature”, downstairsThermostatID)
local downstairsHumidity = luup.variable_get(“urn:honeywell-com:serviceId:ThermostatData1”, “IndoorHumidity”, downstairsThermostatID)
local upstairsModeStatus = luup.variable_get(“urn:upnp-org:serviceId:HVAC_UserOperatingMode1”, “ModeStatus”, upstairsThermostatID)
local downstairsModeStatus = luup.variable_get(“urn:upnp-org:serviceId:HVAC_UserOperatingMode1”, “ModeStatus”, downstairsThermostatID)
local outsideTemp = luup.variable_get(“urn:upnp-org:serviceId:TemperatureSensor1”, “CurrentTemperature”, outsideThermostatID)
local outsideHumidity = luup.variable_get(“urn:micasaverde-com:serviceId:HumiditySensor1”, “CurrentLevel”, outsideHumidityID)
local outsideHigh = luup.variable_get(“urn:upnp-org:serviceId:TemperatureSensor1”, “CurrentTemperature”, outsideHighID)
local virtualSwitchHFatTemp = luup.variable_get(“urn:upnp-org:serviceId:SwitchPower1”, “Status”, vsHFatTempID)

–luup.log(“Testing”)
–luup.log("Upstairs thermostat is “…tostring(upstairsModeStatus)…” and downstairs thermostat is "…tostring(downstairsModeStatus))
–luup.log("Upstairs is “…tostring(upstairsTemp)…” degrees with “…tostring(upstairsHumidity)…” humidity with a heat index of "…tostring(getHeatIndex(upstairsTemp, upstairsHumidity)))
–luup.log("Outside is “…tostring(outsideTemp)…” degrees with “…tostring(outsideHumidity)…” humidity with the heat index at “…tostring(getHeatIndex(outsideTemp, outsideHumidity))…” and a high of "…tostring(outsideHigh))
–luup.log("Delay for temp start switch status is "…tostring(virtualSwitchHFatTemp))

sEmailBody = sEmailBody…"Upstairs thermostat is “…tostring(upstairsModeStatus)…” and downstairs thermostat is “…tostring(downstairsModeStatus)
sEmailBody = sEmailBody…”\nUpstairs is “…tostring(upstairsTemp)…” degrees with “…tostring(upstairsHumidity)…” humidity with a heat index of “…tostring(getHeatIndex(upstairsTemp, upstairsHumidity))
sEmailBody = sEmailBody…”\nDownstairs is “…tostring(downstairsTemp)…” degrees with “…tostring(downstairsHumidity)…” humidity with a heat index of “…tostring(getHeatIndex(downstairsTemp, downstairsHumidity))
sEmailBody = sEmailBody…”\nOutside is “…tostring(outsideTemp)…” degrees with “…tostring(outsideHumidity)…” humidity with the heat index at “…tostring(getHeatIndex(outsideTemp, outsideHumidity))…” and a high of "…tostring(outsideHigh)

if (virtualSwitchHFatTemp == “1”) then
–Calculate the average heat index between floors
local avgHeatIndex = (getHeatIndex(upstairsTemp, upstairsHumidity) + getHeatIndex(downstairsTemp, downstairsHumidity))/2
if ((getHeatIndex(outsideTemp, outsideHumidity)< (avgHeatIndex ))) then
local timmerSetTime = “0”

      luup.log("Starting Fan")
      --Start fan switch
      luup.call_action("urn:upnp-org:serviceId:SwitchPower1", "SetTarget", {newTargetValue = "1"}, wholeHouseFanID)
      --Turn off virtual switch
      luup.call_action("urn:upnp-org:serviceId:SwitchPower1", "SetTarget", {newTargetValue = "0"}, vsHFatTempID)
      --Set Timer     
      if tonumber(outsideHigh) >= 90 then
          timmerSetTime = "28800"  --8 hour timer
      elseif ((tonumber(outsideHigh) >= 85) and (tonumber(outsideHigh) < 90)) then
          timmerSetTime = "21600"  --6 hour timer
      else 
          timmerSetTime = "14400"  --4 hour timer
      end
      luup.call_action("urn:futzle-com:serviceId:CountdownTimer1", "SetTimerDuration", {newDuration= timmerSetTime}, timmerID)

      --Start Timer
      luup.call_action("urn:futzle-com:serviceId:CountdownTimer1", "StartTimer", {}, timmerID)
      sEmailBody = sEmailBody.."\nTimer set for "..timmerSetTime
      fSendMail("House Fan Status", ownerEmailAddress, sEmailSubject, sEmailBody)

 else
      luup.log("Too warm for fan or virtual switch is off")
 end

end

–House fan safety temp shutoff
if (tonumber(wholeHouseFanStatus) == 1) then
sEmailSubject = “House Fan Shut Down”
if ((tostring(upstairsModeStatus) == “CoolOn” or tostring(downstairsModeStatus) == “CoolOn”) and (getHeatIndex(outsideTemp, outsideHumidity)>= getHeatIndex(upstairsTemp, upstairsHumidity))) then
luup.log(“Shutting off the house fan, it’s too hot outside”)
luup.call_action(“urn:upnp-org:serviceId:SwitchPower1”, “SetTarget”, {newTargetValue = “0”}, wholeHouseFanID)
sEmailBody = “Too hot outside!\n\n”…sEmailBody
fSendMail(“House Fan Status”, ownerEmailAddress, sEmailSubject, sEmailBody)
elseif ((tostring(upstairsModeStatus) == “HeatOn” or tostring(downstairsModeStatus) == “HeatOn”) and (getHeatIndex(outsideTemp, outsideHumidity)<= getHeatIndex(upstairsTemp, upstairsHumidity))) then
luup.log(“Shutting off the house fan, it’s too cold”)
luup.call_action(“urn:upnp-org:serviceId:SwitchPower1”, “SetTarget”, {newTargetValue = “0”}, wholeHouseFanID)
sEmailBody = “Too cold outside!\n\n”…sEmailBody
fSendMail(“House Fan Status”, ownerEmailAddress, sEmailSubject, sEmailBody)
else
luup.log(“The house fan is on for a reason”)
end
end

Here’s the startup code. You do need to create a global variable with an email address. I used wikipedia to get the formula for heat index. The email function uses the “eMail Notification” app.

function getHeatIndex(tTemp, hHumidity)
–Calculates Heat Index based off the wikipedia formula for ranges from 70 to 115 degrees
local HeatIndex = .363445176 + (.988622465 * tTemp) + (4.777114035 * hHumidity) + (-0.114037667 * tTemp * hHumidity)
HeatIndex = HeatIndex + (-0.000850208 * (tTemp * tTemp)) + (-0.020716198 * (hHumidity * hHumidity))
HeatIndex = HeatIndex + (0.000687678 * (tTemp * tTemp) * hHumidity) --c7
HeatIndex = HeatIndex + (0.000274954 * tTemp * (hHumidity * hHumidity)) --c8
HeatIndex = HeatIndex + (0 * (tTemp * tTemp) * (hHumidity * hHumidity)) --c9
–luup.log("For temperature “…tostring(tTemp)…” with humidity at “…tostring(hHumidity)…” the heat index is calculated at "…tostring(HeatIndex))
return HeatIndex
end

function fSendMail(sName, sEmailAddress, sSubject, sBody)
–Sends email and appends the date and time on the end
local returnCode = 0
local emailClientID = 56
–luup.log(os.date(“%c”))
sBody = sBody…“\n\nSent at “…os.date(”%X on %x”)
luup.call_action(“urn:upnp-org:serviceId:SmtpNotification1”, “SendEmail”, { Recipient_Name=sName, Recipient_eMail=sEmailAddress, Subject= sSubject, Message=sBody }, emailClientID)
luup.call_action(“urn:upnp-org:serviceId:SmtpNotification1”, “ResetCount”,{}, emailClientID)
returnCode = 1

 return returnCode

end