[RELEASE] Vivint CT200 Thermostat Driver

Vivint CT200 Thermostat Driver
Hubitat driver for Vivint CT200 Z-Wave Plus Thermostat.

Features:

  • All standard thermostat functions
  • Exposes device specific functions such as:
    • Manual fan timer command
    • Temperature and humidity reporting thresholds
    • Temperature sensor calibration command (and preference)
    • Swing temperature setting (# of degrees from setpoint before HVAC turns ON)
    • Energy Saving Mode - relaxes setpoint 4 degrees (so basically an 'away' mode)
  • Supports Hubitat Google Home integration

To-Do:

  • Consider adding in the Eco Mode Mode Types
  • Consider adding power type report (C-Wire or Battery) as an attribute

Untested:

  • Did not test heat pump functionality, as I don't have that equipment.
  • Alexa integration - I don't use Alexa. :man_shrugging:

Installation:

  1. Install Driver code in Hubitat
  2. Apply to a Vivint CT200 device. Click save.
  3. Edit preferences, save preferences.
  4. Click Configure command button

Driver can be imported from:
https://raw.githubusercontent.com/Botched1/Hubitat/master/Drivers/Vivint%20CT-200/vivint_ct200.groovy

V1.0 - 07/25/2020 - Initial Version
V1.1 - 07/26/2020 - Fixed currentSensorCal not recording correctly
V1.2 - 07/27/2020 - Added Refresh after 10s when configure button is pressed, Added scheduled battery refresh every 12 hours
V1.3 - 07/27/2020 - Attempted to fix Celsius input/output issues #1
V1.4 - 07/28/2020 - Attempted to fix Celsius input/output issues #2
V1.5 - 07/28/2020 - Attempted to fix Celsius input/output issues #3
V1.5.1 - 07/28/2020 - Fix round error
V1.5.2 - 07/28/2020 - Fix scaledSensorValue error in ThermostatSetpointReport
V1.5.3 - 07/28/2020 - Fixed temperature reading rounding
V1.6 - 07/28/2020 - Added Energy Saving mode command
V1.7 - 08/01/2020 - Added support for Hail (happens when thermostat is reboot/1st powered up) and AssociationReport
V1.8 - 08/02/2020 - Added logic to refresh fan / operating states when they get out of sync or an update report was missed/didn't happen
V1.8.1 - 08/03/2020 - Switched lastSync logic to use state variables
V1.9 - 09/22/2020 Added digital/physical type to setpoint change events
V2.0 - 11/30/2020 Fixed a few zwave parsing errors

1 Like

v1.1 Posted. If you don't use currentSesnorCal, no need to update.

Version 1.1 - 07/26/2020 Fixed currentSensorCal not recording correctly

It's not. :slight_smile:

1 Like

Someone had mentioned there may be a motion sensor report for this device when it's on C-Wire. I'm not sure if that's true or not, since I don't have a C-Wire.

It doesn't look like battery percent is currently reading? I may file a PR for that later, if not :slight_smile:

1 Like

Battery updates when "refresh" is hit, but I haven't seen an unsolicited battery report being sent by the thermostat at all/ever - even for the few days I had it battery powered while writing the driver. But maybe I missed it? I'll look again... If it never sends one I'll setup a scheduled 1x/day battery refresh task in the driver.

I also have seen no indication that there are motion reports of any kind while watching 100% of the communication for the last few days.

Mine are c-wire powered, fyi.

2 Likes

Looking forward to receiving mine. This thermostat's configuration options permit finer grade control over staging than the Honeywell T6 does. The options are very similar to the ecobee - staging is controlled by the delta between the setpoint and ambient temperature. I like this - it will let me run longer in a lower stage to promote dehumidification.

The Honeywell T6 does it by restricting the number of cycles per hour and then uses some internal magic to pick the stage.

1 Like

I'm not sure how the Honeywell is, but I like that the Vivint reports temperature in 0.5 DegF increments (the GoControl only reports in 1 DegF increments). You still can only set setpoints in 1 DegF increments (as far as I can tell - I didn't look hard, but the setpoint report indicates precision=0 which is integer), but it is nice getting half degree on the reports.

Having humidity reported isn't something I use in any automation, but hey... Free data.

I didn't spend much time on the multistage options (I only have 1 stage units), but there are definitely settings on degrees for stage fallback.

1 Like

The Honeywell can supposedly be configured to report increments of 0.5F.

:+1:

I had never heard of these thermostats before, really nice looking. Tempted to get one now...

1 Like

this looks amazing i am going to install the driver tonight I am using Celsius and will let you know if there is an issue! thank you very much!

Mark

1 Like

I will say that the preference dropdowns are all in Degree F.... They will still work (as internally the dropdown options write integers like 1, 2, 3, etc) but the dropdown label will be wrong.

I'll have to research a little how other thermostat drivers handle this...

Until then, assume that any of the "degrees" options are half that when using C.

V1.2 - 07/27/2020 - Added Refresh after 10s when configure button is pressed, Added scheduled battery refresh every 12 hours

I have installed the driver and set up the settings, everything works good but it seems to reporting the temperatures in Fahrenheit even when it is set to Celsius, my thermostat heat set point is set to 18C but is reporting it set to 64.5 (which converts to 18.05 C) and 32 in google home (that is the maximum of the scale in Celsius) it is reporting the temperature as 80.5 and the thermostat is showing 27 (80.5F converts to 26.9C). when trying to set the heat set point in Celsius it will not accept any number below 35 that would be the 1.5c minimum in the thermostat.

I am sorry if this is confusing and way to much information, basically i am just trying to say that it is all in Fahrenheit for setting and reading.

1 Like

Argh. OK. Seems I may need to do an F to C conversion somewhere... Oops.

I think I know where/how, but to be sure , f you get time please turn on debug logging, change a setpoint, and send me the log entries.

Thanks!

here is what i got from bottom up as i am sure you know lol.

dev:6122020-07-27 06:58:27.123 pm debugIn parse, map is null

dev:6122020-07-27 06:58:27.120 pm debugParameter: 15 value is: 0

dev:6122020-07-27 06:58:27.117 pm debug---CONFIGURATION REPORT V1--- Thermostat sent parameterNumber:15, size:1, value:0

dev:6122020-07-27 06:58:27.113 pm debugParsing 'zw device: 38, command: 7006, payload: 0F 01 00 , isMulticast: false'

dev:6122020-07-27 06:58:27.108 pm debugParse...START

dev:6122020-07-27 06:58:24.875 pm debugIn parse, map is null

dev:6122020-07-27 06:58:24.873 pm debugParameter: 15 value is: 0

dev:6122020-07-27 06:58:24.870 pm debug---CONFIGURATION REPORT V1--- Thermostat sent parameterNumber:15, size:1, value:0

dev:6122020-07-27 06:58:24.867 pm debugParsing 'zw device: 38, command: 7006, payload: 0F 01 00 , isMulticast: false'

dev:6122020-07-27 06:58:24.865 pm debugParse...START

dev:6122020-07-27 06:58:24.710 pm debugIn parse, map is [value:44, unit:%, name:humidity]

dev:6122020-07-27 06:58:24.708 pm debugSensorMultilevelReport...END

dev:6122020-07-27 06:58:24.705 pm debugIn SensorMultilevelReport map is [value:44, unit:%, name:humidity]

dev:6122020-07-27 06:58:24.703 pm debugcmd.sensorType: 5

dev:6122020-07-27 06:58:24.700 pm debugcmd: SensorMultilevelReport(precision:0, scale:0, sensorType:5, sensorValue:[44], size:1, scaledSensorValue:44)

dev:6122020-07-27 06:58:24.698 pm debugSensorMultilevelReport V1...START

dev:6122020-07-27 06:58:24.694 pm debugParsing 'zw device: 38, command: 3105, payload: 05 01 2C , isMulticast: false'

dev:6122020-07-27 06:58:24.690 pm debugParse...START

dev:6122020-07-27 06:58:22.793 pm debugIn parse, map is null

dev:6122020-07-27 06:58:22.790 pm debugParameter: 15 value is: 0

dev:6122020-07-27 06:58:22.787 pm debug---CONFIGURATION REPORT V1--- Thermostat sent parameterNumber:15, size:1, value:0

dev:6122020-07-27 06:58:22.785 pm debugParsing 'zw device: 38, command: 7006, payload: 0F 01 00 , isMulticast: false'

dev:6122020-07-27 06:58:22.782 pm debugParse...START

dev:6122020-07-27 06:58:22.724 pm debugIn parse, map is [value:35, unit:C, displayed:true, name:heatingSetpoint]

dev:6122020-07-27 06:58:22.721 pm debugThermostatSetPointReport...END

dev:6122020-07-27 06:58:22.718 pm debugthermostatSetpoint is 35

dev:6122020-07-27 06:58:22.716 pm debugIn ThermostatSetpointReport map is [value:35, unit:C, displayed:true, name:heatingSetpoint]

dev:6122020-07-27 06:58:22.712 pm debugSetpoint Precision is 0

dev:6122020-07-27 06:58:22.710 pm debugSetpoint Scale is 1

dev:6122020-07-27 06:58:22.705 pm debugSetpoint Size is 1

dev:6122020-07-27 06:58:22.698 pm debugvalue is 35 and unit is C

dev:6122020-07-27 06:58:22.696 pm debugsetpoint requested is 35 and unit is F

dev:6122020-07-27 06:58:22.693 pm debugcmdScale is 1 before (this is the state variable), and F after

dev:6122020-07-27 06:58:22.690 pm debugThermostatSetpointReport...START

dev:6122020-07-27 06:58:22.686 pm debugParsing 'zw device: 38, command: 4303, payload: 01 09 23 , isMulticast: false'

dev:6122020-07-27 06:58:22.683 pm debugParse...START

dev:6122020-07-27 06:58:22.481 pm debugIn parse, map is [value:35, unit:C, displayed:true, name:heatingSetpoint]

dev:6122020-07-27 06:58:22.476 pm debugThermostatSetPointReport...END

dev:6122020-07-27 06:58:22.470 pm debugthermostatSetpoint is 35

dev:6122020-07-27 06:58:22.467 pm debugIn ThermostatSetpointReport map is [value:35, unit:C, displayed:true, name:heatingSetpoint]

dev:6122020-07-27 06:58:22.463 pm debugSetpoint Precision is 0

dev:6122020-07-27 06:58:22.451 pm debugSetpoint Scale is 1

dev:6122020-07-27 06:58:22.447 pm debugSetpoint Size is 1

dev:6122020-07-27 06:58:22.444 pm debugvalue is 35 and unit is C

dev:6122020-07-27 06:58:22.441 pm debugsetpoint requested is 35 and unit is F

dev:6122020-07-27 06:58:22.437 pm debugcmdScale is 1 before (this is the state variable), and F after

dev:6122020-07-27 06:58:22.433 pm debugThermostatSetpointReport...START

dev:6122020-07-27 06:58:22.429 pm debugParsing 'zw device: 38, command: 4303, payload: 01 09 23 , isMulticast: false'

dev:6122020-07-27 06:58:22.425 pm debugParse...START

dev:6122020-07-27 06:58:19.555 pm debugsetHeatingSetpoint...END

dev:6122020-07-27 06:58:19.550 pm debugsetpoint written is 18.0

dev:6122020-07-27 06:58:19.543 pm debugsetpoint requested is 18.0

dev:6122020-07-27 06:58:19.540 pm debugprecision is 0

dev:6122020-07-27 06:58:19.536 pm debuglocationScale is C

dev:6122020-07-27 06:58:19.533 pm debugstateScale is 1

dev:6122020-07-27 06:58:19.527 pm debugsetHeatingSetpoint...START

dev:6122020-07-27 06:58:13.218 pm debugdebug logging is enabled.

--- Live Log Started, waiting for events ---

Thanks!

And I assume your units on the thermostat itself are set to C, right (probably a stupid question).

This might take me a day or two to sort out, but I'll get it. Might want to use the generic driver until then, though.

yes it is set to C.

thank you very much!

Take all the time you want i appreciate having a driver that will allow me to set all of the settings and have a fan timer too!

@mference
I just uploaded v1.3 that may fix this - I definitely found an issue when writing the setpoints. I think the reports already worked.

Give it a try and let me know!

If that works, then I'll go back and start thinking about how to improve the dropdown boxes for celsius users.

it is now letting me set the thermostat in C but it is still reporting everything in F.

here is the debug if you want it.
dev:6122020-07-27 07:34:24.913 pm debugIn parse, map is null

dev:6122020-07-27 07:34:24.911 pm debugParameter: 15 value is: 0

dev:6122020-07-27 07:34:24.909 pm debug---CONFIGURATION REPORT V1--- Thermostat sent parameterNumber:15, size:1, value:0

dev:6122020-07-27 07:34:24.907 pm debugParsing 'zw device: 38, command: 7006, payload: 0F 01 00 , isMulticast: false'

dev:6122020-07-27 07:34:24.904 pm debugParse...START

dev:6122020-07-27 07:34:24.767 pm debugIn parse, map is [value:81.5, unit:C, name:temperature]

dev:6122020-07-27 07:34:24.764 pm debugSensorMultilevelReport...END

dev:6122020-07-27 07:34:24.762 pm debugIn SensorMultilevelReport map is [value:81.5, unit:C, name:temperature]

dev:6122020-07-27 07:34:24.760 pm debugcmd.sensorType: 1

dev:6122020-07-27 07:34:24.758 pm debugcmd: SensorMultilevelReport(precision:1, scale:1, sensorType:1, sensorValue:[3, 47], size:2, scaledSensorValue:81.5)

dev:6122020-07-27 07:34:24.756 pm debugSensorMultilevelReport V1...START

dev:6122020-07-27 07:34:24.754 pm debugParsing 'zw device: 38, command: 3105, payload: 01 2A 03 2F , isMulticast: false'

dev:6122020-07-27 07:34:24.751 pm debugParse...START

dev:6122020-07-27 07:34:22.595 pm debugIn parse, map is [value:64, unit:C, displayed:true, name:heatingSetpoint]

dev:6122020-07-27 07:34:22.592 pm debugThermostatSetPointReport...END

dev:6122020-07-27 07:34:22.590 pm debugthermostatSetpoint is 35

dev:6122020-07-27 07:34:22.583 pm debugIn ThermostatSetpointReport map is [value:64, unit:C, displayed:true, name:heatingSetpoint]

dev:6122020-07-27 07:34:22.581 pm debugSetpoint Precision is 0

dev:6122020-07-27 07:34:22.579 pm debugSetpoint Scale is 1

dev:6122020-07-27 07:34:22.576 pm debugSetpoint Size is 1

dev:6122020-07-27 07:34:22.574 pm debugvalue is 64 and unit is C

dev:6122020-07-27 07:34:22.572 pm debugsetpoint requested is 64 and unit is F

dev:6122020-07-27 07:34:22.570 pm debugcmdScale is 1 before (this is the state variable), and F after

dev:6122020-07-27 07:34:22.567 pm debugThermostatSetpointReport...START

dev:6122020-07-27 07:34:22.565 pm debugParsing 'zw device: 38, command: 4303, payload: 01 09 40 , isMulticast: false'

dev:6122020-07-27 07:34:22.563 pm debugParse...START

dev:6122020-07-27 07:34:21.361 pm debugsetHeatingSetpoint...END

dev:6122020-07-27 07:34:21.358 pm debugsetpoint written is 18.0

dev:6122020-07-27 07:34:21.355 pm debugsetpoint requested is 18.0

dev:6122020-07-27 07:34:21.352 pm debugprecision is 0

dev:6122020-07-27 07:34:21.349 pm debuglocationScale is C

dev:6122020-07-27 07:34:21.346 pm debugstateScale is 1

dev:6122020-07-27 07:34:21.342 pm debugsetHeatingSetpoint...START

--- Live Log Started, waiting for events ---