Mine are doing the same thing… No response at all. The my comfort app is working fine… So I’m guessing that they are kicking us out again.
What I find is that if you push too many commands at once it will kick you out for a certain period of time. This becomes a big issue when you try to raise/lower the temperature because currently it looks at each time you press the up/down button as a separate command.
don’t think that is it… because my upstairs therm a vision pro is working fine… no error… on same account. different id.
I’m futzing with the code because at times mine is in auto and switchpos returns 5 not 4.
also the operationg mode seems to be unreliable because it always is returning one when the system is even off at times.
Hmmmmmmm… I’ll look at mine too
also interestingly enough I have been playing with control of the humidifier which I have hook up to this thermatstat it is not working…
I wrote some code to test that url for humidifier status which I found poking through the source of the Honeywell web pages… ie
(even though the normal getstatus is failing
def getHumidifierStatus() {
log.debug "Executing ‘getHumidifierStatus’"
def today= new Date()
/* added by lgk 9/2015
var ReloadHumData = function (force) {
if (force || !settings.HumChanged()) {
$.ajax({
url: humUrl,
type: ‘POST’,
cache: false,
dataType: “json”,
success: function(data) {
//save data about humidity (saves us calling device with thermostat data)
var indoorHumidity = settings.Hum().IndoorHumidity();
var indoorHumidityAvailable = settings.Hum().IndoorHumidityAvailable();
settings.Hum(new HumModel(data));
settings.HumChanged(false);
$("#HumSlider").slider("value", settings.Hum().Setpoint());
settings.Hum().IndoorHumidity(indoorHumidity);
settings.Hum().IndoorHumidityAvailable(indoorHumidityAvailable);
},
});
}
if (!force) {
window.clearTimeout(reloadHumTimeout);
reloadHumTimeout = window.setTimeout("ReloadHumData();", 10000);
}
};
function HumModel(humData) {
this.Mode = ko.observable(humData.Mode);
this.LowerLimit = ko.observable(humData.LowerLimit);
this.UpperLimit = ko.observable(humData.UpperLimit);
this.Setpoint = ko.observable(humData.Setpoint);
this.DeadBand = ko.observable(humData.Deadband);
this.DeviceId = ko.observable(humData.DeviceId);
this.IndoorHumidity = ko.observable(humData.IndoorHumidity);
this.IndoorHumidityAvailable = ko.observable(humData.IndoorHumidityAvailable);
this.IndoorHumidityValue = ko.computed(function () {
return FormatHumidityValue(this.IndoorHumidity(), this.IndoorHumidityAvailable()) + “%”;
}, this);
this.SetpointValue = ko.computed(function () {
return FormatHumidityValue(this.Setpoint(), true) + “%”;
}, this);
}
/portal/Device/Menu/GetHumData/454832’
*/
log.debug “https://mytotalconnectcomfort.com/portal/Device/Menu/GetHumData/${settings.honeywelldevice}?_=$today.time”
def params = [
uri: "https://mytotalconnectcomfort.com/portal/Device/Menu/GetHumData/${settings.honeywelldevice}",
headers: [
'Accept': '*/*',
'DNT': '1',
'dataType': 'json',
'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://mytotalconnectcomfort.com/portal',
'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 "GetHumidity Request was successful, $response.status"
log.trace("lowerLimit: ${response.data.humData.lowerLimit}")
log.trace("upperLimit: ${response.data.humData.upperLimit}")
log.trace("SetPoint: ${response.data.humData.Setpoint}")
log.trace("DeviceId: ${response.data.humData.DeviceId}")
log.trace("IndoorHumidity: ${response.data.humData.IndoorHumidity}")
}
}
the logs return this and this fx call is not failing with server error… ie
9fe52bc7-011a-4a18-8c64-02ef6af24491 3:55:59 PM: error groovyx.net.http.HttpResponseException: Internal Server Error @ line 391
9fe52bc7-011a-4a18-8c64-02ef6af24491 3:55:58 PM: debug https://mytotalconnectcomfort.com/portal/Device/CheckDataSession/453832?_=1443124558884
9fe52bc7-011a-4a18-8c64-02ef6af24491 3:55:58 PM: debug Executing ‘getStatus’
9fe52bc7-011a-4a18-8c64-02ef6af24491 3:55:58 PM: trace IndoorHumidity:
9fe52bc7-011a-4a18-8c64-02ef6af24491 3:55:58 PM: trace DeviceId:
9fe52bc7-011a-4a18-8c64-02ef6af24491 3:55:58 PM: trace SetPoint:
9fe52bc7-011a-4a18-8c64-02ef6af24491 3:55:58 PM: trace upperLimit:
9fe52bc7-011a-4a18-8c64-02ef6af24491 3:55:58 PM: debug GetHumidity Request was successful, 200
9fe52bc7-011a-4a18-8c64-02ef6af24491 3:55:58 PM: debug https://mytotalconnectcomfort.com/portal/Device/Menu/GetHumData/453832?_=1443124558434
9fe52bc7-011a-4a18-8c64-02ef6af24491 3:55:58 PM: debug Executing ‘getHumidifierStatus’
Where is the latest version of jody’s full program located?
I would like to give it a try.
I’ve added this and it seems to poll information initially. It has the correct heat and cool temps and current temps, but then it doesn’t seem to update after that. Is there something i’m missing? Running on Android Lollipop 5.0. Thanks
Replying to my own thread, it appears by installing the smartapp “Pollster” has resolved my issue. Hopfully it continues to work!
I have tried adding this code to create a new smart app but i keep getting an error.
No signature of method: script14435410427962007397543.metadata() is applicable for argument types: (script14435410427962007397543$_run_closure2) values: [script14435410427962007397543$_run_closure2@33b2a8b7] Possible solutions: getMetadata(), getState(), setState(java.lang.Object), metaClass(groovy.lang.Closure)
This code is for a new device type, not a smartapp.
thank you so much this is my first day with that and it is a little overwhelming .
You welcome Marco_Garcia. It stomped me at first then read the whole thread carefully. For those who have the model RTH9580WF1005GG, I can’t get the fan to take the Follow Schedule mode. I added Circulate mode to the code, but completely stomped on how to get Follow Schedule fan mode, plus a way to cancel any holds–reset back to follow schedule.
/**
- Total Comfort API
- Based on Code by 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”
capability “Relative Humidity Measurement”
command “heatLevelUp”
command “heatLevelDown”
command “coolLevelUp”
command “coolLevelDown”
}
simulator {
// TODO: define status and reply messages here
}
tiles {
valueTile(“temperature”, “device.temperature”, width: 2, height: 2, canChangeIcon: true) {
state(“temperature”, label: ‘${currentValue}°F’, 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, canChangeIcon: true) {
state “off”, label:‘${name}’, action:“thermostat.cool”, icon: “st.Outdoor.outdoor19”
state “cool”, label:‘${name}’, action:“thermostat.heat”, icon: “st.Weather.weather7”, backgroundColor: ‘#003CEC’
state “heat”, label:‘${name}’, action:“thermostat.auto”, icon: “st.Weather.weather14”, backgroundColor: ‘#E14902’
state “auto”, label:‘${name}’, action:“thermostat.off”, icon: “st.Weather.weather3”, backgroundColor: ‘#44b621’
}
standardTile(“thermostatFanMode”, “device.thermostatFanMode”, inactiveLabel: false, canChangeIcon: true) {
state “auto”, label:‘${name}’, action:“thermostat.fanOn”, icon: “st.Appliances.appliances11”, backgroundColor: ‘#003CEC’
state “on”, label:‘${name}’, action:“thermostat.fanCirculate”, icon: “st.Appliances.appliances11”, backgroundColor: ‘#44b621’
state “circulate”, label:‘${name}’, action:“thermostat.fanAuto”, icon: “st.Appliances.appliances11”, backgroundColor: ‘#003CEC’
state “schedule”, 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) { state "default", label:'Cool @${currentValue}°F', 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"] ] } valueTile("heatingSetpoint", "device.heatingSetpoint", inactiveLabel: false) { state "default", label:'Heat @${currentValue}°F', 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"] ] }
//tile added for operating state - Create the tiles for each possible state, look at other examples if you wish to change the icons here.
standardTile("thermostatOperatingState", "device.thermostatOperatingState", inactiveLabel: false) { state "heating", label:'${name}' state "cooling", label:'${name}' state "idle", label:'${name}' }
standardTile("refresh", "device.thermostatMode", inactiveLabel: false, decoration: "flat") { state "default", action:"polling.poll", icon:"st.secondary.refresh" }
standardTile("heatLevelUp", "device.heatingSetpoint", canChangeIcon: false, inactiveLabel: false) { state "heatLevelUp", label:' ', action:"heatLevelUp", icon:"st.thermostat.thermostat-up" } standardTile("heatLevelDown", "device.heatingSetpoint", canChangeIcon: false, inactiveLabel: false) { state "heatLevelDown", label:' ', action:"heatLevelDown", icon:"st.thermostat.thermostat-down" } standardTile("coolLevelUp", "device.heatingSetpoint", canChangeIcon: false, inactiveLabel: false) { state "coolLevelUp", label:' ', action:"coolLevelUp", icon:"st.thermostat.thermostat-up" } standardTile("coolLevelDown", "device.heatingSetpoint", canChangeIcon: false, inactiveLabel: false) { state "coolLevelDown", label:' ', action:"coolLevelDown", icon:"st.thermostat.thermostat-down" }
valueTile("relativeHumidity", "device.relativeHumidity", inactiveLabel: false){ state "default", label:'${currentValue}', unit:"%"
} main "temperature" details(["temperature", "thermostatMode", "thermostatFanMode", "heatLevelUp", "heatingSetpoint" , "heatLevelDown", "coolLevelUp","coolingSetpoint", "coolLevelDown" ,"thermostatOperatingState", "refresh","relativeHumidity"]) }
}
def coolLevelUp(){
int nextLevel = device.currentValue(“coolingSetpoint”) + 1
if( nextLevel > 99){ nextLevel = 99 } log.debug "Setting cool set point up to: ${nextLevel}" setCoolingSetpoint(nextLevel)
}
def coolLevelDown(){
int nextLevel = device.currentValue(“coolingSetpoint”) - 1
if( nextLevel < 50){ nextLevel = 50 } log.debug "Setting cool set point down to: ${nextLevel}" setCoolingSetpoint(nextLevel)
}
def heatLevelUp(){
int nextLevel = device.currentValue(“heatingSetpoint”) + 1
if( nextLevel > 90){ nextLevel = 90 } log.debug "Setting heat set point up to: ${nextLevel}" setHeatingSetpoint(nextLevel)
}
def heatLevelDown(){
int nextLevel = device.currentValue(“heatingSetpoint”) - 1
if( nextLevel < 40){ nextLevel = 40 } log.debug "Setting heat set point down to: ${nextLevel}" setHeatingSetpoint(nextLevel)
}
// parse events into attributes
def parse(String description) {
}
// handle commands
def setHeatingSetpoint(temp) {
data.SystemSwitch = ‘null’
data.HeatSetpoint = temp
data.CoolSetpoint = ‘null’
data.HeatNextPeriod = ‘null’
data.CoolNextPeriod = ‘null’
data.StatusHeat=‘1’
data.StatusCool=‘1’
data.FanMode = ‘null’
setStatus()
if(data.SetStatus==1)
{
sendEvent(name: ‘heatingSetpoint’, value: temp as Integer)
}
}
def setCoolingSetpoint(temp) {
data.SystemSwitch = ‘null’
data.HeatSetpoint = ‘null’
data.CoolSetpoint = temp
data.HeatNextPeriod = ‘null’
data.CoolNextPeriod = ‘null’
data.StatusHeat=‘1’
data.StatusCool=‘1’
data.FanMode = ‘null’
setStatus()
if(data.SetStatus==1)
{
sendEvent(name: ‘coolingSetpoint’, value: temp as Integer)
}
}
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 auto() {
setThermostatMode(4)
}
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' if(mode==4) switchPos = 'auto'
if(data.SetStatus==1)
{
sendEvent(name: ‘thermostatMode’, value: switchPos)
}
}
def fanOn() {
setThermostatFanMode(1)
}
def fanAuto() {
setThermostatFanMode(0)
}
def fanCirculate() {
setThermostatFanMode(2)
}
def fanSchedule() {
setThermostatFanMode(3)
}
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==1) fanMode = 'on' if(mode==2) fanMode = 'circulate' if(mode==3) fanMode = 'schedule'
if(data.SetStatus==1)
{
sendEvent(name: ‘thermostatFanMode’, value: fanMode)
}
}
def poll() {
refresh()
}
def setStatus() {
data.SetStatus = 0
login()
log.debug “Executing ‘setStatus’”
def today= new Date()
log.debug “Invalid Action Error”
def params = [ uri: "https://mytotalconnectcomfort.com/portal/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://mytotalconnectcomfort.com/portal/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"
}
log.debug "SetStatus is 1 now" data.SetStatus = 1
}
def getStatus() {
log.debug “Executing ‘getStatus’”
def today= new Date()
log.debug “Honeywell Home - My Total Connect Comfort”
def params = [ uri: "https://mytotalconnectcomfort.com/portal/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://mytotalconnectcomfort.com/portal', '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 statusCool = response.data.latestData.uiData.StatusCool def statusHeat = response.data.latestData.uiData.StatusHeat def curHumidity = response.data.latestData.uiData.IndoorHumidity
log.trace("IndoorHumidity: ${response.data.latestData.uiData.IndoorHumidity}") log.trace("IndoorHumiditySensorAvailable: ${response.data.latestData.uiData.IndoorHumiditySensorAvailable}") log.trace("IndoorHumiditySensorNotFault: ${response.data.latestData.uiData.IndoorHumiditySensorNotFault}") log.trace("IndoorHumidStatus: ${response.data.latestData.uiData.IndoorHumidStatus}")
//Operating State Section //Set the operating state to off
def operatingState = "off"
//Check the status of heat and cool if(statusCool == 1 && switchPos == 3) { operatingState = "cooling" } else if (statusHeat == 1 && switchPos == 1) { operatingState = "heating"
} else { operatingState = "unknown" }
//End Operating State
log.debug curTemp log.debug fanMode log.debug switchPos
//fan mode 0=auto, 2=circ, 1=on
if(fanMode==0) fanMode = 'auto' if(fanMode==1) fanMode = 'on' if(fanMode==2) fanMode = 'circulate' if(fanMode==3) fanMode = 'schedule'
if(switchPos==1) switchPos = 'heat' if(switchPos==2) switchPos = 'off' if(switchPos==3) switchPos = 'cool' if(switchPos==4) switchPos = 'auto'
//Send events
sendEvent(name: ‘thermostatOperatingState’, value: operatingState)
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: ‘relativeHumidity’, value: curHumidity 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://mytotalconnectcomfort.com/portal', 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': 'mytotalconnectcomfort.com', 'DNT': '1', 'Origin': 'mytotalconnectcomfort.com/portal/', '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" if(cookie != ".ASPXAUTH_TH_A=") { data.cookiess = data.cookiess+cookie+';' } } log.debug "cookies: $data.cookiess"
}
}
def isLoggedIn() {
if(!data.auth) {
log.debug “No data.auth”
return false
}
def now = new Date().getTime(); return data.auth.expires_in > now
}
Thanks for all the help. I was successfully able to create the new device type and a new device using Total Comfort API with my login for Honeywell and the Device ID, however I just get “–” for temperature and it doesn’t seem to be receiving anything from the thermostat. I think this is why though:
my device ID is 7 digits, not 6. Actually, both of my thermostats have 7 digit Device IDs when I look at the end of the URL in my MyTotalComfort account online.
Does anyone else have 7 digits? Any ideas why mine won’t work?
1 fine is 7. Did you add username and pwd in options under device. Just Id is nit enough.
here is a new version of my modified code that correctly shows outside humidity and temp … (I have the external sensor on my system and it uses that data…)
I am still trying to get the controls working for my humidifier control page… will keep you informed if I get that working…
Looks nice @Lgkahn! I’m a new SmartThings owner, in fact still waiting for my hub to ship, but have been catching up in the forums of all the fun tasks I have to do getting things integrated. I have a Prestige IAQ as well, fully loaded with outdoor sensor, four indoor sensors, Delta-T sensors in the return and main duct, along with humidification and UV. If you or anyone else need any help testing things out I’ll be glad to do so once I’m up and running.
I’m considering the Ecobee because of the API problems with Honeywell, but it’s tough to match the completeness of our current tstat setup. Might have to wait until something breaks before I’m allowed to replace it.
I have the delta t also and multiple indoir temp, or but the web does not report on these other than alerts …so no way to integrate these
For the coders out there, I just updated my devicetype with this code which I think is the closest we can all get to knowing the running state of the stat due to HW not reporting the current state.
//BG 10/7 added checks for fanOn and temps for operational status
if((curTemp >= coolSetPoint) && (fanMode == 1) && (switchPos == 3 || switchPos == 5)) {
operatingState = "cooling"
} else if ((curTemp <= heatSetPoint) && (fanMode == 1) && (switchPos == 1 || switchPos == 4)) {
operatingState = "heating"
} else {
operatingState = "idle"
}
my changes seem to be similar but a little different to get operating state
// lgk operating state not working here… shows both on ie 1 when heat doesnt go on to 67 and heat till 76 and current is 73
//Check the status of heat and cool
if(statusCool == 1 && (switchPos == 3 || switchPos == 5 || swithPos == 4)) {
operatingState = “cooling”
} else if (statusHeat == 1 && (switchPos == 1 || switchPos == 5 || switchPos == 4)) {
operatingState = “heating”
} else if (statusCool == 0 && statusHeat == 0) {
operatingState = “idle”
} else {
operatingState = "unknown"
}