Honeywell Smart Wi-Fi Thermostat Compatibility

New to smartthings - anyone know of a way to add a Honeywell thermostat rth8580wf1007 to smartthings? The stat is less then a year old I would hate to get rid of it solely to have in in the smartthings dashboard.

That’s the wifi version right? If so then it’s not currently compatible.

I had to replace one of my Nest thermostat, for some reason had issues with it. Now looking to this Honeywell Smart Wi-Fi Thermostat, only down side is that it does connect to smartthings. Has anyone been able to connect?

@urman, currently, does that mean there’s a possibility of being compatible in the future?

@nomisr ya I don’t see why not. It’s just a matter of developing it in.

it would be awesome if someone with the knowledge on how to achieve this could figure this out! I personally think it’s a superior thermostat to the Nest

Finally purchased this today. My Nest upstairs had a bunch of issues. This thermostat is working very nicely. Only issue is now I have a nest downstairs and this new Honeywell upstairs. The nest is connected to ST and I would really love to have the Honeywell work in ST. Any news or updates on intergration?

I just ordered RTH9580WF1005 (http://www.amazon.com/Honeywell-RET97A5E1001-U-Wi-Fi-Thermostat/dp/B00FLZEQH2), looking for any information on compatibility with ST.

I had originally purchased a Nest, but its temperature sensor was just way off (8-10 degrees higher).

I have put together a working setup for my honeywell Wi-Fi Thermostat here: https://github.com/dattas/smartthings_radio_thermostat It doesn’t do discovery (yet?) and you have to convert the IP into hex, but it seems to work fine for me for the basic functions! Maybe linking it to the cloud service would be the next step, but seeing the instant change as it is setup here has been great.

1 Like

@dattas dattas

I’m getting an error at line 92, did you created under smartapp or devices?

This is a device so it belongs under devices, This is not a smartapp.

I am halfway to writing one that connects to the cloud service. I have it getting the data and setting the device properties just do not have any control built in… That should come soon as I get time.

Any update on the codes? :smile:

any progress on that version of this that connects to the cloud service? sounds awesome!

I have finished it, albeit with my information hard coded. I can switch that out tonight. When it works, it works great. I am having issues with it refreshing lately… I am going to look into that tonight as well. I think it may think it’s logged in when it’s not… Need to make it log in every time. It does work well in the simulator so I suspect that is the issue.

2 Likes

great! can’t wait to see it.

thanks!

@ethomasii I am eagerly waiting for this too. Many thanks.

just curious will your version have advantages over the one @dattas created? Say for the Honeywell WiFi 9000 series thermostat? also, can you give us the code you have so far?

edit: nevermind i see the advantage…the one @dattas created doesn’t work for my model it seems

Just wanted to see if you had a chance to finish up. Really looking forward to using it!

2 Likes

Hey guys… i just wrapped it up… its been working good… had a few issues, but seems to be good now. I have not posted it to github yet, so here it is so you can get to testing. It isnt great code, but works as far as I know… one day I will get around to cleaning it up.

/**
  • Total Comfort API
  • Copyright 2014 Eric Thomas
  • 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.

*/
preferences {
input(“username”, “text”, title: “Username”, description: “Your Total Comfort User Name”)
input(“password”, “password”, title: “Password”, description: “Your Total Comfort password”)
input(“honeywelldevice”, “text”, title: “Device ID”, description: “Your Device ID”)

}
metadata {
definition (name: “Total Comfort API”, namespace: “Total Comfort API”, author: “Eric Thomas”) {
capability "Polling"
capability "Thermostat"
capability "Refresh"
capability "Temperature Measurement"
capability “Sensor”
}

simulator {
	// TODO: define status and reply messages here
}

tiles {
valueTile(“temperature”, “device.temperature”, width: 2, height: 2, canChangeIcon: true) {
state(“temperature”, label: ‘${currentValue}°’, unit:“F”, backgroundColors: [
[value: 31, color: “#153591”],
[value: 44, color: “#1e9cbb”],
[value: 59, color: “#90d2a7”],
[value: 74, color: “#44b621”],
[value: 84, color: “#f1d801”],
[value: 95, color: “#d04e00”],
[value: 96, color: “#bc2323”]
]
)
}
standardTile(“thermostatMode”, “device.thermostatMode”, inactiveLabel: false, decoration: “flat”) {
state “heat”, label:’${name}’, action:“thermostat.off”, icon: “st.Weather.weather14”, backgroundColor: ‘#E14902
state “off”, label:’${name}’, action:“thermostat.cool”, icon: "st.Outdoor.outdoor19"
state “cool”, label:’${name}’, action:“thermostat.heat”, icon: “st.Weather.weather7”, backgroundColor: ‘#003CEC
}
standardTile(“thermostatFanMode”, “device.thermostatFanMode”, inactiveLabel: false, decoration: “flat”) {
state “auto”, label:’${name}’, action:“thermostat.fanOn”, icon: “st.Appliances.appliances11"
state “on”, label:’${name}’, action:“thermostat.fanCirculate”, icon: “st.Appliances.appliances11"
state “circulate”, label:’${name}’, action:“thermostat.fanAuto”, icon: “st.Appliances.appliances11”
}
controlTile(“coolSliderControl”, “device.coolingSetpoint”, “slider”, height: 3, width: 1, inactiveLabel: false) {
state “setCoolingSetpoint”, label:‘Set temperarure to’, action:“thermostat.setCoolingSetpoint”,
backgroundColors:[
[value: 31, color: “#153591”],
[value: 44, color: “#1e9cbb”],
[value: 59, color: “#90d2a7”],
[value: 74, color: “#44b621”],
[value: 84, color: “#f1d801”],
[value: 95, color: “#d04e00”],
[value: 96, color: “#bc2323”]
]
}
valueTile(“coolingSetpoint”, “device.coolingSetpoint”, inactiveLabel: false, decoration: “flat”) {
state “default”, label:’${currentValue}°’, unit:“F”, backgroundColor:”#ffffff”, icon:“st.appliances.appliances8”
}
valueTile(“humidity”, “device.humidity”, inactiveLabel: false, decoration: “flat”) {
state “default”, label:’${currentValue}%’, unit:“Humidity”
}
standardTile(“refresh”, “device.thermostatMode”, inactiveLabel: false, decoration: “flat”) {
state “default”, action:“polling.poll”, icon:“st.secondary.refresh”
}
main "temperature"
details([“temperature”, “thermostatMode”, “thermostatFanMode”, “coolSliderControl”, “coolingSetpoint”, “humidity”, “refresh”])
}
}

// parse events into attributes
def parse(String description) {

}

// handle commands
def setHeatingSetpoint(temp) {
setTargetTemp(temp)
}

def setCoolingSetpoint(temp) {
setTargetTemp(temp)
}

def setTargetTemp(temp) {
data.SystemSwitch = 'null’
data.HeatSetpoint = temp
data.CoolSetpoint = temp
data.HeatNextPeriod = 'null’
data.CoolNextPeriod = 'null’
data.StatusHeat='1’
data.StatusCool='1’
data.FanMode = 'null’
setStatus()
}

def off() {
setThermostatMode(2)
}

def heat() {
setThermostatMode(1)
}

def emergencyHeat() {

}

def cool() {
setThermostatMode(3)
}

def setThermostatMode(mode) {
data.SystemSwitch = mode
data.HeatSetpoint = 'null’
data.CoolSetpoint = 'null’
data.HeatNextPeriod = 'null’
data.CoolNextPeriod = 'null’
data.StatusHeat=1
data.StatusCool=1
data.FanMode = ‘null’

setStatus()

	def switchPos

    if(mode==1)
    	switchPos = 'heat'
    if(mode==2)
    	switchPos = 'off'
    if(mode==3)
    	switchPos = 'cool'

    sendEvent(name: 'thermostatMode', value: switchPos)

}

def fanOn() {
setThermostatFanMode(1)
}

def fanAuto() {
setThermostatFanMode(0)
}

def fanCirculate() {
setThermostatFanMode(2)
}

def setThermostatFanMode(mode) {

data.SystemSwitch = 'null' 
data.HeatSetpoint = 'null'
data.CoolSetpoint = 'null'
data.HeatNextPeriod = 'null'
data.CoolNextPeriod = 'null'
data.StatusHeat='null'
data.StatusCool='null'
data.FanMode = mode

setStatus()

def fanMode

if(mode==0)
 	fanMode = 'auto'
if(mode==2)
	fanMode = 'circulate'
if(mode==1)
	fanMode = 'on'

sendEvent(name: 'thermostatFanMode', value: fanMode)    

}

def poll() {
refresh()
}

def setStatus() {
login()
log.debug "Executing ‘setStatus’"
def today= new Date()
log.debug “https://rs.alarmnet.com/TotalConnectComfort/Device/SubmitControlScreenChanges

def params = [
    uri: "https://rs.alarmnet.com/TotalConnectComfort/Device/SubmitControlScreenChanges",
    headers: [
          'Accept': 'application/json, text/javascript, */*; q=0.01',
          'DNT': '1',
		  'Accept-Encoding': 'gzip,deflate,sdch',
          'Cache-Control': 'max-age=0',
          'Accept-Language': 'en-US,en,q=0.8',
          'Connection': 'keep-alive',
          'Host': 'rs.alarmnet.com',
          'Referer': "https://rs.alarmnet.com/TotalConnectComfort/Device/Control/${settings.honeywelldevice}",
          'X-Requested-With': 'XMLHttpRequest',
          'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/28.0.1500.95 Safari/537.36',
          'Cookie': data.cookiess        ],
    body: [ DeviceID: "${settings.honeywelldevice}", SystemSwitch : data.SystemSwitch ,HeatSetpoint : data.HeatSetpoint, CoolSetpoint: data.CoolSetpoint, HeatNextPeriod: data.HeatNextPeriod,CoolNextPeriod:data.CoolNextPeriod,StatusHeat:data.StatusHeat,StatusCool:data.StatusCool,FanMode:data.FanMode]

]

httpPost(params) { response ->
    log.debug "Request was successful, $response.status"

}

}

def getStatus() {
log.debug "Executing ‘getStatus’"
def today= new Date()
log.debug “https://rs.alarmnet.com/TotalConnectComfort/Device/CheckDataSession/${settings.honeywelldevice}?_=$today.time

def params = [
    uri: "https://rs.alarmnet.com/TotalConnectComfort/Device/CheckDataSession/${settings.honeywelldevice}",
    headers: [
          'Accept': '*/*',
          'DNT': '1',
          'Accept-Encoding': 'plain',
          'Cache-Control': 'max-age=0',
          'Accept-Language': 'en-US,en,q=0.8',
          'Connection': 'keep-alive',
          'Host': 'rs.alarmnet.com',
          'Referer': 'https://rs.alarmnet.com/TotalConnectComfort/',
          'X-Requested-With': 'XMLHttpRequest',
          'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/28.0.1500.95 Safari/537.36',
          'Cookie': data.cookiess        ],
]

httpGet(params) { response ->
    log.debug "Request was successful, $response.status"

    
	def curTemp = response.data.latestData.uiData.DispTemperature
    def fanMode = response.data.latestData.fanData.fanMode
    def switchPos = response.data.latestData.uiData.SystemSwitchPosition
    def coolSetPoint = response.data.latestData.uiData.CoolSetpoint
    def heatSetPoint = response.data.latestData.uiData.HeatSetpoint
    def outHumidity = response.data.latestData.weather.Humidity
    
    log.debug curTemp
    log.debug fanMode
    log.debug switchPos
    log.debug outHumidity
	//fan mode 0=auto, 2=circ, 1=on
    
    if(fanMode==0)
    	fanMode = 'auto'
    if(fanMode==2)
    	fanMode = 'circulate'
    if(fanMode==1)
    	fanMode = 'on'

    if(switchPos==1)
    	switchPos = 'heat'
    if(switchPos==2)
    	switchPos = 'off'
    if(switchPos==3)
    	switchPos = 'cool'


    sendEvent(name: 'thermostatFanMode', value: fanMode)
    sendEvent(name: 'thermostatMode', value: switchPos)
    sendEvent(name: 'coolingSetpoint', value: coolSetPoint as Integer)
    sendEvent(name: 'heatingSetpoint', value: heatSetPoint as Integer)
    sendEvent(name: 'temperature', value: curTemp as Integer, state: switchPos)
    sendEvent(name: 'humidity', value: outHumidity as Integer)


}

}

def api(method, args = [], success = {}) {

}

// Need to be logged in before this is called. So don’t call this. Call api.
def doRequest(uri, args, type, success) {

}

def refresh() {
log.debug "Executing ‘refresh’"
login()
getStatus()
}

def login() {
log.debug “Executing ‘login’”

def params = [
    uri: 'https://rs.alarmnet.com/TotalConnectComfort/',
    headers: [
        'Content-Type': 'application/x-www-form-urlencoded',
        'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8',
        'Accept-Encoding': 'sdch',
        'Host': 'rs.alarmnet.com',
        'DNT': '1',
        'Origin': 'https://rs.alarmnet.com/TotalComfort/',
        'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/28.0.1500.95 Safari/537.36'
    ],
    body: [timeOffset: '240', UserName: "${settings.username}", Password: "${settings.password}", RememberMe: 'false']
]

data.cookiess = ''

httpPost(params) { response ->
    log.debug "Request was successful, $response.status"
    log.debug response.headers
	response.getHeaders('Set-Cookie').each {
    	String cookie = it.value.split(';')[0]
        log.debug "Adding cookie to collection: $cookie"
        data.cookiess = data.cookiess + cookie + ';'
    }
    //log.debug "cookies: $data.cookies"

}

}

def isLoggedIn() {
if(!data.auth) {
log.debug "No data.auth"
return false
}

def now = new Date().getTime();
return data.auth.expires_in > now

}

4 Likes