Set Temp Based on Another Thermostat?


(bob) #1

I would like to have my upstairs thermostat always be 1 degree higher than the downstairs one. I would like it to automatically track the downstairs one so that if I lower the temp to 75, the upstairs will get set to 76.

Where/How would I go about writing this? In Vera I used PLEG to do some if/then/else type logic for controlling things but I haven’t seen anything like that yet.

Any help would be appreciated.

(Duane) #2

Take the code from this post, change the code to set the temp on the thermostat instead of setting the fan to ‘on’. Should get you going

(bob) #3

When I set the temp on thermostat1, I get my event happening 4 times for some reason. Any Ideas?

`// Automatically generated. Make future change here.

name: “Bobs Thermostat Syncer”,
namespace: “smartthings”,
author: “Tim Slagle Modified by: Duane Helmuth/Bob Snyder”,
description: “Adjust a thermostat based on the setting of another thermostat”,
category: “Green Living”,
iconUrl: “”,
iconX2Url: “

input “thermostat1”, “capability.thermostat”, title: “Which Master Thermostat?”, multi: false, required: true
input “thermostat2”, “capability.thermostat”, title: “Which Slave Thermostat?”, multi: false, required: true
input “tempDiff”, “number”, title: “Temperature Difference Between Master and Slave?”, required: true, defaultValue: 2
input “sendPushMessage”, “bool”, title: “Send a push notification?”, required: false, defaultValue: true
input “sendSMS”, “phone”, title: “Send as SMS?”, required: false, defaultValue: false


def installed(){
log.debug "Installed called with ${settings}"

def updated(){
log.debug "Updated called with ${settings}"

def init(){
//nIn(60, “temperatureHandler”)
subscribe(thermostat1, “thermostatSetpoint”, temperatureHandler)

def temperatureHandler(evt) {

log.debug “Temperature Handler Begin”
//get the latest temp readings and compare
def MThermostatTemp = thermostat1.latestValue(“thermostatSetpoint”)
def SThermostatTemp = thermostat2.latestValue(“thermostatSetpoint”)
def difference = (SThermostatTemp - MThermostatTemp)

log.debug "Thermostat(M): ${MThermostatTemp}"
log.debug "Thermostat(S): ${SThermostatTemp}"
log.debug "Temp Diff: ${tempDiff}"
log.debug “Current Temp Difference: ${difference}”

if( difference != tempDiff ){
def NewTemp = (MThermostatTemp + tempDiff)
def msg = "${thermostat2} sync’ed with ${thermostat1} with of offset of ${tempDiff} degrees. Now at ${NewTemp}."
log.debug msg

private sendMessage(msg){
if (sendPushMessage == true) {
if (sendSMS != null) {
sendSms(sendSMS, msg)


(bob) #4

Well I uninstalled it and reinstalled it and that seems to have corrected that problem. It was like it was running 4 times or something.

Now to get it to actually set the temp. The log shows it being set to 75 for example, but the thermostat is not changing.

Seems like I need my new temp to be in the format of 75.0 instead of just 75.

(bob) #5

Looks like I have it working now. The slave thermostat had a paramter to keep the cooling and heating temps a few degrees apart. When I set them both to the same value, the first one set was reset to a different temp.

Here’s the code if anyone wants it. Thanks for the help!

(Alan) #6

Thank you for this code…it is working great when using my Main floor thermostat as the primary. However, I would like it to work in reverse as well- if the upstairs thermostat is adjusted, I want the main floor to be automatically set to 2 degrees cooler.

I have played with the code a bit, however I can’t find a way to capture which thermostat is initiating the action. So basically what I want to do is
If main thermostat = temperature change then set upstairs thermostat = main thermostat temp + 2
If upstairs thermostat =temperature change then set main thermostat = upstairs thermostat temp - 2

Is there a way to do this?

(bob) #7

I guess you could but how would you know which one was altered manually. If the upstairs is 70 and the downstairs is 75, do I set the downstairs to 68 or the upstairs to 77?