[RELEASE] Beta 1 - version of Honeywell Home Thermostats (Lyric etc...)

If you add the PresenseSensor capability on the driver you can support "present" and "not present" - that's what I do with another driver.

There is a built in hubitat geofence using the phone app - so far it works some of the time and not others (though I suspect my wife turned it off on her phone...).

Yes, I know about the PresenceSensor capability and thought about implementing using that. The only problem I have is that what is being reported by the Honeywell sensor isn't really presence in the same context that a presence sensor uses. A presence sensor is a thing, i.e. a phone app or a fob that says "I am at a certain location" or not. The Honeywell sensor is saying "someone is in the room". A subtle difference, but still a difference.

I'm thinking that it might make sense for the occupied enum to have values of "occupied" and "unoccupied" or something like that instead of true and false. That would look better in the dashboard than true and false. It's an easy change to make.

As for geofencing, there is a lot of discussion about it on the community groups in terms of reliability. I think what @zahe.pitts was getting at was another source for presence might be helpful in one of the presence integrator apps. It's probably a moot point, though, as I didn't see any of the geofencing functionality exposed in the public API, including the event model. Unless I missed it. FWIW, I use WiFi presence with my phone and it has been the most reliable of all the sources I've tried.

@WindowWasher and @taylor - it's all good. This last revision is rock solid. I run a national IT support team for a major healthcare provider, so I always look at things in a continuous improvement model state of mind. Not that it needs to be done, just an idea, plus to @WindowWasher point, it's not in the API from what I can see. I use WiFi aggregated with the HE app presence and it works fine. That said, there have been so many past issues with geofencing that having a fallback is nice so it came to mind. I appreciate the idea of "Occupied" vs True and feel that change would have value. I'll just incorporate a few virtual occupancy sensors and use a WebCore piston that I have running for some other sensors to sync them up to a pretty tile. Not worth too much of a headache unless you want to just do it for fun. I'll keep putting it through its paces, but it looks to be running perfectly still.

@zahe.pitts Thanks for the feedback and kind words. I am planning to put the "Occupied" change in sometime in the next couple of days.

Any idea if this will work with a Honeywell RTH9580WF?

@mebejedi I think you want to use the driver mentioned in this thread:
Honeywell THermostat RTH6580WF

@taylor Any chance you'd be willing and interested in pulling in Lyric leak detectors into your app? I was going to port over a ST app but yours looks a bit cleaner. You already have the hard part of the Honeywell API integration done. We'd need to modify your app to pull in the leak detector data. The sensor really only supports reporting status of leak and temp so don't think we'd need any two way functions. I can try to write a simple device handler based on the ST one:

Thanks

Happy to accept contributions - Tim contributed the remote sensor work already :).

Hi there! I have recently moved over to Hubitat & was pleased to discover this effort to natively integrate Lyric into Hubitat! Good work!

I have been trying to get this app/driver to work for my setup (i have a Lyric Round) for a couple of days now and I can't seem to get past a state similar to the ones above - I can see status from the thermostat just fine, but I can't actually change the temperature. Thus far I have just tried to play with the cooling (in sunny FL).

After some troubleshooting efforts I have managed to rule out the API (the debug messages in Hubitat state API returns "200" and when I manually try the code on Honeywell's website the thermostat gets set OK).

I finally noticed that it seems the app is just sending the current state back to the thermostat as a command. Looking through the app code, I see this is the default if no cooling setpoint has been passed to the app. This makes me think I have an issue with the device passing the desired setpoints to the app.

I am new to groovy and am trying to learn as I go here ... but as far as I can tell this seems to be the relevant line of code in the app:
def setThermosatSetPoint(com.hubitat.app.DeviceWrapper device, mode=null, autoChangeoverActive=false, emergencyHeatActive=null, heatPoint=null, coolPoint=null, retry=false)

It seems you are defining the cooling point as "null" here .... which would logically explain why its being evaluated as null below and falling back to current set point.

Question - how are the input parameters (such as cooling set point) passed from the device driver to the app?

It has been quite some time since I have coded ... apologies if this is a stupid question due to the lack of knowledge on my part ...

Any and all assistance is greatly appreciated! It would be awesome if I could control my Lyric straight from Hubitat vs going through IFTTT like i am now!

Thank you!

Hi, can you turn on debug logging in the app and driver? Try changing the cooling setpoint and then post the log here in this thread. Also, how did you install the app and drivers?

As for your question about setThermosatSetPoint() - the =null stuff is just setting those arguments as optional, with the null being the default value if the argument is not specified.

I imported both the app code and the driver code from taylor's main fork on github.

I am working through figuring out how to post logs ... the forum is complaining that i can't have links in comments when i copy/paste and that i am not allowed to attach images when i do that...

From the logs you can see the app thinks its setting Cooling to 74 (the setting before i attempted the change) and the driver states its setting it to 76 (my input).

The app call to the Honeywell API does go through and the thermostat gets set to 74 (what it already was, tested by changing the temp manually right before setting it in Hubitat, returns to 74).

I'll reply again shortly with the logs once i figure it out.

Okay, you may be running into posting limitations as a new user. I'm not sure. You could try sending them to me via a private message if you can't post them directly. It sounds like you did all the right things to install the app and driver. Please don't post images of the logs, they are very hard to read. Copy/paste should work.

New user restrictions ... that must be it ... for that matter i dont even see a button to DM you.

I guess i will just have to wait a little for those to get lifted.

Logs ... pasted as plain text with https changed to xttps so its not a "link"

dev:1472021-02-14 12:42:42.129 pm infoLyric Cooling setpoint changed to 76
app:1172021-02-14 12:42:42.126 pm debugupdateThermostats-thermostatOperatingState: idle
app:1172021-02-14 12:42:42.122 pm debugupdateThermostats-fanRunning: false
app:1172021-02-14 12:42:42.118 pm debugrefreshHelper() cloudString:fanRunning - deviceString:thermostatFanState - device:Lyric - optionalUnits:null - optionalMakeLowerMap:null -optionalMakeLowerString:null
app:1172021-02-14 12:42:42.113 pm debugupdateThermostats-mode: Auto
app:1172021-02-14 12:42:42.109 pm debugrefreshHelper() cloudString:mode - deviceString:thermostatFanMode - device:Lyric - optionalUnits:null - optionalMakeLowerMap:null -optionalMakeLowerString:null
app:1172021-02-14 12:42:42.107 pm debugupdateThermostats-allowedModes: [Auto, On, Circulate]
app:1172021-02-14 12:42:42.103 pm debugrefreshHelper() cloudString:allowedModes - deviceString:supportedThermostatFanModes - device:Lyric - optionalUnits:null - optionalMakeLowerMap:null -optionalMakeLowerString:null
app:1172021-02-14 12:42:42.100 pm debugThermostat does not support emergency heat
app:1172021-02-14 12:42:42.097 pm debugupdateThermostats-autoChangeoverActive: false
app:1172021-02-14 12:42:42.093 pm debugrefreshHelper() cloudString:autoChangeoverActive - deviceString:autoChangeoverActive - device:Lyric - optionalUnits:null - optionalMakeLowerMap:null -optionalMakeLowerString:null
app:1172021-02-14 12:42:42.090 pm debugupdateThermostats-mode: Cool
app:1172021-02-14 12:42:42.087 pm debugrefreshHelper() cloudString:mode - deviceString:thermostatMode - device:Lyric - optionalUnits:null - optionalMakeLowerMap:null -optionalMakeLowerString:null
app:1172021-02-14 12:42:42.084 pm debugupdateThermostats-coolSetpoint: 74
app:1172021-02-14 12:42:42.080 pm debugrefreshHelper() cloudString:coolSetpoint - deviceString:coolingSetpoint - device:Lyric - optionalUnits:F - optionalMakeLowerMap:null -optionalMakeLowerString:null
app:1172021-02-14 12:42:42.077 pm debugupdateThermostats-heatSetpoint: 68
app:1172021-02-14 12:42:42.074 pm debugrefreshHelper() cloudString:heatSetpoint - deviceString:heatingSetpoint - device:Lyric - optionalUnits:F - optionalMakeLowerMap:null -optionalMakeLowerString:null
app:1172021-02-14 12:42:42.071 pm debugupdateThermostats-allowedModes: [Cool, Heat, Off]
app:1172021-02-14 12:42:42.068 pm debugrefreshHelper() cloudString:allowedModes - deviceString:allowedModes - device:Lyric - optionalUnits:null - optionalMakeLowerMap:null -optionalMakeLowerString:null
app:1172021-02-14 12:42:42.064 pm debugupdateThermostats-indoorHumidity: 60
app:1172021-02-14 12:42:42.057 pm debugrefreshHelper() cloudString:indoorHumidity - deviceString:humidity - device:Lyric - optionalUnits:null - optionalMakeLowerMap:null -optionalMakeLowerString:null
app:1172021-02-14 12:42:42.055 pm debugupdateThermostats-allowedModes: [Cool, Heat, Off]
app:1172021-02-14 12:42:42.052 pm debugrefreshHelper() cloudString:allowedModes - deviceString:supportedThermostatModes - device:Lyric - optionalUnits:null - optionalMakeLowerMap:null -optionalMakeLowerString:null
app:1172021-02-14 12:42:42.048 pm debugupdateThermostats-indoorTemperature: 74
app:1172021-02-14 12:42:42.045 pm debugrefreshHelper() cloudString:indoorTemperature - deviceString:temperature - device:Lyric - optionalUnits:F - optionalMakeLowerMap:null -optionalMakeLowerString:null
app:1172021-02-14 12:42:42.042 pm debugupdateThermostats-tempUnits: F
app:1172021-02-14 12:42:42.038 pm debugreJson: {[thermostatVersion:02.02.20.00, scheduleStatus:Resume, allowedTimeIncrements:15, settings:[homeSetPoints:[homeHeatSP:70, homeCoolSP:74, units:Fahrenheit], awaySetPoints:[awayHeatSP:62, awayCoolSP:85, smartCoolSP:80, smartHeatSP:55, useAutoSmart:true, units:Fahrenheit], hardwareSettings:[brightness:6, volume:10, maxBrightness:10, maxVolume:10], fan:[allowedModes:[Auto, On, Circulate], changeableValues:[mode:Auto], fanRunning:false], temperatureMode:[feelsLike:true, air:true], specialMode:[autoChangeoverActive:false]], deviceClass:Thermostat, deviceType:Thermostat, deviceID:TCC-617911, userDefinedDeviceName:Lyric, name:Lyric, schedule:[scheduleType:Geofence], isAlive:true, isUpgrading:false, isProvisioned:false, macID:00D02D4F15F1, deviceSettings:[:], service:[mode:Up], dataSyncStatus:UnKnown, units:Fahrenheit, indoorTemperature:74, outdoorTemperature:84, allowedModes:[Cool, Heat, Off], deadband:0, hasDualSetpointStatus:false, minHeatSetpoint:40, maxHeatSetpoint:90, minCoolSetpoint:50, maxCoolSetpoint:99, changeableValues:[mode:Cool, autoChangeoverActive:false, heatSetpoint:68, coolSetpoint:74, heatCoolMode:Cool], operationStatus:[mode:EquipmentOff], smartAway:[active:false, timeOfDay:00:00:00, durationInHours:2, durationInDays:0, lastUsedFormat:DurationInHours, endsIn:2014-10-26T16:17:00-04:00], indoorHumidity:60, indoorHumidityStatus:Measured, deviceModel:Round]}
app:1172021-02-14 12:42:42.019 pm debugreCode: {200}
app:1172021-02-14 12:42:41.360 pm debugLocation Discovery-params [uri:xttps://api.honeywell.com/v2/devices/thermostats/TCC-617911?apikey=nd6mFw4Z1jvtVhvaLs3p9hNECgKAA5UW&locationId=27482, headers:[Authorization:Bearer Kc5ofkVWtDJNau99hREUvOqCJzRl], contentType:application/json]
app:1172021-02-14 12:42:41.356 pm debugAttempting to Update DeviceID: TCC-617911, With LocationID: 27482
app:1172021-02-14 12:42:41.352 pm debugrefreshThermosat()
app:1172021-02-14 12:42:41.349 pm infoSetThermostate() Mode: Cool; Heatsetpoint: 68; CoolPoint: 74 API Response: 200
app:1172021-02-14 12:42:39.956 pm debugsetThermosat-params [uri:xttps://api.honeywell.com/v2/devices/thermostats/TCC-617911?apikey=nd6mFw4Z1jvtVhvaLs3p9hNECgKAA5UW&locationId=27482, headers:[Authorization:Bearer Kc5ofkVWtDJNau99hREUvOqCJzRl, Content-Type:application/json], body:[mode:Cool, heatSetpoint:68, coolSetpoint:74, autoChangeoverActive:false]]
app:1172021-02-14 12:42:39.951 pm debugAttempting to Set DeviceID: TCC-617911, With LocationID: 27482
app:1172021-02-14 12:42:39.948 pm debugsetThermosatSetPoint()
dev:1472021-02-14 12:42:39.937 pm debugLyric setCoolingSetpoint() - autoChangeoverActive: false

Okay, good. At first glance, I don't see any errors. What isn't working? Try a simple test:

  1. change the cooling setpoint from the driver.
  2. check the thermostat and make sure that the new value is displayed.
  3. change the cooling setpoint at the thermometer
  4. Refresh the thermostat from the driver. Is the cooling setpoint right?
  1. Typed in new value (76) on the device page and hit set.
  2. Thermostat glowed blue like it got a new input but remained on previous setting (74)
  3. Manually changed temperature at thermostat from 74 to 76
  4. Clicked refresh on the device page, observed current setpoint change from 74 to 76

This is strange. I just noticed from the logs that you have Geofencing turned on. Correct? Try turning it off from the Honeywell app and try the same test again. It may be that the setpoint change is being ignored because Geofencing is on or there is a bug in the app that related to Geofencing being on. I don't have schedules enabled on my thermostats and they work fine.

Turned off geofencing, no effect.

I see in the logs in the very beginning the call going out to API has the setpoint listed as 74 even though I typed in 76 on the device page ... I think this is the disconnect

Check this - I added this feature so that in the winter those of us that have to winterize AC units can be assured they won't get activated and vice/versa in the summer.

I tend to agree. Can you post the latest log from when you changed the setpoint to 76? I want to look at the payload sent in the web service call. Look for this string "debugsetThermosat-params" which is where the payload is logged.

Something is really fishy here.