[DEPRECATED] Universal Ecobee Suite, version 1.7.**

When Thermal Comfort makes setpoint changes, are they made as a Hold or is it actually changing the setpoints within the given Comfort Settings itself?

Thermal Comfort changes the actual setpointsā€¦

This generally corrects itself after a few minutesā€¦if not, try removing the sensor from the ES list of devices, and then add it backā€¦

What is the proper way for me to use WebCoRE to turn on the HVAC fan for 10 minutes? It seems everything I try ends up resetting the ā€˜minimum fan runtimeā€™ feature to 0 minutes.

@flyize Iā€™m doing something similar, just with a virtual switch instead of a time limit.

If I was going to do this with a ā€œturn off after Xmā€ Iā€™d do:

That doesnā€™t work. As soon as you set the fan to On, it sets the minimum fan runtime to 0 mintes.

Thanks for clarifying. Just so i understand and to confirm this is set up correctly to change fan runtime differently based on if the thermostat (set in auto) is cooling or heating:

  • in the Fan Circulation app i have cooling fan on time = 30, heating fan on time = 0 and change fan on time only when location mode = Home, Night
  • in the mode program helpers (one for away, home, sleep) i have the fan min min per hour field empty
    If i understand correctly, the fan runtimes will only change to 0 or 30 min for home and night modes with this configured this way. Please confirm. Thanks again for both apps, the suite manager is a fantastic app.

Just set the fanMinOnTime back to the desired value after you turn the fan back to Auto mode (fanMinOnTime only works when the fan is in Auto/Circulate mode).

1 Like

You are correct, except that there is a bug in the code I provided. Please replace with this version:

/**
 * fanMinOnTime by Thermostat Operating State
 *	Copyright 2019 Barry A. Burke
 *
 *
 *  Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except
 *  in compliance with the License. You may obtain a copy of the License at:
 *
 *      http://www.apache.org/licenses/LICENSE-2.0  
 *
 *  Unless required by applicable law or agreed to in writing, software distributed under the License is distributed
 *  on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License
 *  for the specific language governing permissions and limitations under the License.
 *
 */
String getVersionNum() { return "1.0.0" }
String getVersionLabel() { return "Ecobee Fan Circulation, version ${getVersionNum()}" }
import groovy.json.*

definition(
	name: 			"Ecobee Fan Circulation",
	namespace: 		"sandood",
	author: 		"Barry A. Burke (storageanarchy at gmail dot com)",
	description: 	"Change Ecobee fanMinOnTime based on Thermostat Operating State changes",
	category: 		"Convenience",
	iconUrl: 		"https://s3.amazonaws.com/smartapp-icons/Partner/ecobee.png",
	iconX2Url: 		"https://s3.amazonaws.com/smartapp-icons/Partner/ecobee@2x.png",
	singleInstance:	false,
    pausable: 		true
)

preferences {
	page(name: "mainPage")
}

// Preferences Pages
def mainPage() {
	dynamicPage(name: "mainPage", title: "${getVersionLabel()}", uninstall: true, install: true) {
		section(title: '') {
			String defaultLabel = app.name
        	label(title: "Name for this ${defaultLabel} instance", required: true, defaultValue: defaultLabel)
        	
            input(name: "thermostats", type: "device.ecobeeSuiteThermostat", title: "Ecobee Thermostat(s)", required: true, multiple: true, submitOnChange: true)
			input(name: "coolFanOnTime", type: "number", title: "Cooling Fan On Time (0-55 minutes)", required: false, submitOnChange: true, range: "0..55")
            input(name: "heatFanOnTime", type: "number", title: "Heating Fan On Time (0-55 minutes)", required: false, submitOnChange: true, range: "0..55")
            input(name: "fanOnlyOnTime", type: "number", title: "Fan Only Fan On Time (0-55 minutes)", required: false, submitOnChange: true, range: "0..55")
            input(name: "theModes", type: "mode", title: "Change Fan On Time only when the Location Mode is", multiple: true, required: false)
        }
    }
}

def installed() {
	initialize()
}

def updated() {
	unsubscribe()
    initialize()
}

def initialize() {
	subscribe(thermostats, 'thermostatOperatingState', operatingStateHandler)
}

def operatingStateHandler(evt) {
	log.info "${evt.device.displayName} Operating State changed to ${evt.value}"
    
    if (!settings.theModes || settings.theModes.contains(location.mode)) {
    // We're in the right mode
    	if (evt.value.contains('cool')) {
        	if (settings.coolFanOnTime) {
            	thermostats.each {
                	if (it.currentValue('fanMinOnTime') != settings.coolFanOnTime) {
                    	it.setFanMinOnTime(settings.coolFanOnTime.toInteger())
                		log.info "Setting ${it.displayName}'s fanMinOnTime to ${settings.coolFanOnTime}"
                    }
                }
            }
        }
        else if (evt.value.contains('heat')) {
        	if (settings.heatFanOnTime) {
            	thermostats.each {
                	if (it.currentValue('fanMinOnTime') != settings.heatFanOnTime) {
                    	it.setFanMinOnTime(settings.heatFanOnTime.toInteger())
                		log.info "Setting ${it.displayName}'s fanMinOnTime to ${settings.heatFanOnTime}"
                    }
                }
            }
        }
        else if (evt.value == 'fan only') {
        	if (settings.fanOnlyOnTime) {
            	thermostats.each {
                	if (it.currentValue('fanMinOnTime') != settings.fanOnlyOnTime) {
                    	it.setFanMinOnTime(settings.fanOnlyOnTime.toInteger())
                		log.info "Setting ${it.displayName}'s fanMinOnTime to ${settings.fanOnlyOnTime}"
                    }
                }
            }
        }
    }
}

Is there a way to turn on the fan without having to hard code the minimum fan time in the piston?

Sure is - just use thermostat.currentValue("fanMinOnTime") in your piston to get the value before you turn the fan on, then use `setFanMinOnTime(ā€œminutesā€) to set it afterwards.

Orā€¦you can try this TEST VERSION of ES Thermostat. It should maintain the current fanMinOnTime as follows:

  • setFanMode(ā€œonā€), fanOn()
    • fanMinOnTime is set to current value at time of call
  • setFanMode(ā€œoffā€), fanOff()
    • 'fanMinOnTime` is set to 0 (this is the only way to totally disable the fan)
  • setFanMode(ā€œautoā€), fanAuto()
    • fanMinOnTime is set to 0 (see also ā€œcirculateā€)
  • setFanMode(ā€œcirculateā€), fanCirculate()
    • fanMinOnTime set to current value, unless current value is (null) or 0 - then fanMinOnTime is set to 20 (default setting)

NOTE: This means that if you use fanOn(), you MUST use fanCirculate() when you want to end the ā€œonā€ period and return back to thermostat-controlled circulation. If you call fanOff() or fanAuto(), the `fanMinOnTime will be set to 0, and automated circulation will ceaseā€¦

You can get this TEST VERSION here: https://raw.githubusercontent.com/SANdood/Ecobee-Suite/master/devicetypes/sandood/ecobee-suite-thermostat.src/ecobee-suite-thermostat.groovy

Let me know if it works for youā€¦

1 Like

edit: So this is the piston I tested. The fan turned on, but stayed ā€˜fan on and holdingā€™. It didnā€™t seem that the resumeProgram() worked. Am I doing something wrong?

Is this with the test version of ES Thermosts that I provided?

Either way, try ā€œset fan to circulateā€ instead of ā€œresumeProgramā€.

I did not try the test version. I prefer to wait until its pushed over to your github master, mostly because Iā€™m lazy and will never know about updates if I just C&P code. However, if youā€™d like for me to test it, Iā€™d be more than happy to do so.

That said, I removed the resumeProgram and used ā€˜set fan to circā€™. That did not seem to help, the program stayed as ā€˜fan on and holdingā€™.

Please try the test version. If it works, Iā€™ll push it over to master; if not, you can simply restore from the master.

Also relevant - what is your Ecobee cycle time? If itā€™s 2 minutes or more, then your test will likely always fail because thereā€™s too much time between cyclesā€¦

That did not appear to work. When I set it back to circulate, the tstat showed the mode as ā€˜fan auto and holdingā€™.

Iā€™m not sure what you mean by cycle time. For testing purposes, I have the fan set to turn on, wait 2 minutes, then set to circulate. And the minFanTime is set to 10 minutes.

ā€œCycle timeā€ for Ecobee Suite Manager - how frequently it communicates with the Ecobee servers. This is set in Ecobee Suite Manager preferences. For your use case, I recommend setting it to 1 minute.

Then re-run your testsā€¦

Also - please check the ES Thermostat device in the SmartThings Classic UI - it should reflect the changed fanMinOnTime in the 3rd box from the left just above the Fan iconsā€¦ ā€œCirculate N min/hrā€. Watch to see if the number changes, and if the fan mode changes (left-most Fan icon).

If you donā€™t see changes, your test is trying to change things too quickly for the changes to be reflected to the Ecobee servers and backā€¦

I set the cycle time to 1 minute. Then changed the piston to turn the fan on, wait 10 minutes, then set it to circulate.

The result was that it stayed in the ā€˜fan auto and holdingā€™ mode.

Weirdā€¦

Could you please run the test with Live Logging enabled, and look for any errors in ES Manager and/or ES Thermostat?

Thanksā€¦