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