[RELEASE] Enhanced Z-Wave Plus Thermostat Device Handler - Honeywell, GoControl, CT, Linear, Trane, MCO, Remotec

I use the CT100, which doesn’t have circulate out of the box. This is why people have written apps for it.

So there’s no way to write a function in the device type for it to turn the fan on and off based on a timer like an app?

So what’s the goal to continually turn it on / off every x / y minutes? Or just a one time, each time you hit a button it starts for x and then stops?

Continually. The on/off tile would be for when we don’t want it to circulate.

Then I’m curious why not just use the smart app which continually keeps turning it on and off?

Our old thermostat had a switch that she could turn the circulate on and off. The ct100 doesn’t. So if there’s an on/off tile that would act like a switch for the circulate function.

In addition to the sliders and the up/down arrows, I wish there was an option to just type in the setpoint temperatures.

I do not wish to hijack the thread nor do I know if you want to type in the temperature due to how slow it is to change the temp with the arrows. But if speed is the issue, then the Autovoice/Tasker/Sharptools method sets the temp very quickly. Were you ever able to resolve your autovoice issues?

1 Like

What’s wrong with using sliders and button. One degree change use button. More use slider

Just installed the CT-100 thermostat with @RBoy’s device type from his web site (thank you)! Everything is working great except humidity – I assume this is the reason:

6:28:36 AM: warn Unexpected zwave command MultiInstanceCmdEncap(command: 5, commandClass: 49, instance: 2, parameter: [5, 1, 58])

I may be reading the code completely wrong, but RBoy’s code appears to look for humidity via sensormultilevelv3, not MultiInstanceCmdEncap:

def zwaveEvent(physicalgraph.zwave.commands.sensormultilevelv3.SensorMultilevelReport cmd)
{
        def map = [:]
        if (cmd.sensorType == 1) {
                map.value = convertTemperatureIfNeeded(cmd.scaledSensorValue, cmd.scale == 1 ? "F" : "C", cmd.precision)
                map.unit = getTemperatureScale()
                map.name = "temperature"
        } else if (cmd.sensorType == 5) {
                map.value = cmd.scaledSensorValue
                map.unit = "%"
                map.name = "humidity"
        }
        map
}

Are there multiple versions of this thermostat out there?

I’m getting humidity from mine. Modified version of ST “Z-Wave Thermostat With Battery”

Device type has an additional zwave method:

// CUSTOMIZATIONS
def zwaveEvent(physicalgraph.zwave.commands.sensormultilevelv2.SensorMultilevelReport cmd) {
    log.debug "SensorMultilevelReportV2 $cmd"

    def map = [:]
    if (cmd.sensorType == 1) {
        map.value = convertTemperatureIfNeeded(cmd.scaledSensorValue, cmd.scale == 1 ? "F" : "C", cmd.precision)
        map.unit = getTemperatureScale()
        map.name = "temperature"
    } else if (cmd.sensorType == 5) {
        map.value = cmd.scaledSensorValue
        map.unit = "%"
        map.name = "humidity"
            sendEvent(name: "HumidityLevel", value: "humidity is ${map.value}%")
    }
    map
}

Also, under poll() do you have this line?

zwave.multiInstanceV1.multiInstanceCmdEncap(instance: 2).encapsulate(zwave.sensorMultilevelV3.sensorMultilevelGet()).format() // CT-100/101 Customization for Humidity

Yes, I have both of those code snippets. Also confirmed that the unrecognized zwave command is in fact the humidity information being returned - the third value in the parameter triplet is the humidity level.

Did you add:

capability “Relative Humidity Measurement”

I did - or rather, it was already present in the code that I downloaded from your web site - I’m using that code unmodified.

Try this, delete the device type and start over from scratch. Sounds crazy but it has worked sometimes.
BTW where did you buy the device from?

I created a new device type with a second copy of your code copied from web site, appended a “2” to its name definition, and edited the thermostat device entry and changed its device type to the “2” device, killed the app, cleared its cache, relaunched app, clicked refresh on thermostat. No difference:

1:37:36 PM: warn Unexpected zwave command MultiInstanceCmdEncap(command: 5, commandClass: 49, instance: 2, parameter: [5, 1, 58])

I bought the thermostat from Amazon: http://amzn.com/B008CQ4V3Q . I have a second one on the way, well see if it misbehaves the same way.

That’s the one I got from Amazon, it’s reporting fine without that error. Weird error.

LOL I just hit refresh on mine and see:

a579883b-302d-48de-908c-4d46fda95e31 2:26:20 PM: warn Unexpected zwave command MultiInstanceCmdEncap(command: 5, commandClass: 49, instance: 2, parameter: [5, 1, 65])
a579883b-302d-48de-908c-4d46fda95e31 2:26:13 PM: debug Parse returned [[value:idle, name:thermostatOperatingState, isStateChange:false, displayed:false, linkText:Downstairs Thermostat, descriptionText:Downstairs Thermostat thermostat operating state is idle]]
a579883b-302d-48de-908c-4d46fda95e31 2:26:10 PM: debug Parse returned [[value:fanAuto, name:thermostatFanMode, displayed:false, isStateChange:false, linkText:Downstairs Thermostat, descriptionText:Downstairs Thermostat thermostat fan mode is fanAuto]]
a579883b-302d-48de-908c-4d46fda95e31 2:26:08 PM: debug Parse returned [[value:off, name:thermostatMode, isStateChange:false, displayed:false, linkText:Downstairs Thermostat, descriptionText:Downstairs Thermostat thermostat mode is off]]
a579883b-302d-48de-908c-4d46fda95e31 2:26:06 PM: debug Parse returned [[value:78, unit:F, displayed:false, name:coolingSetpoint, isStateChange:false, linkText:Downstairs Thermostat, descriptionText:Downstairs Thermostat cooling setpoint is 78°F]]
a579883b-302d-48de-908c-4d46fda95e31 2:26:04 PM: debug Parse returned [[value:68, unit:F, displayed:false, name:heatingSetpoint, isStateChange:false, linkText:Downstairs Thermostat, descriptionText:Downstairs Thermostat heating setpoint is 68°F]]
a579883b-302d-48de-908c-4d46fda95e31 2:26:01 PM: debug Parse returned [[value:70.5, unit:F, name:temperature, isStateChange:false, displayed:false, linkText:Downstairs Thermostat, descriptionText:Downstairs Thermostat temperature is 70.5°F]]
a579883b-302d-48de-908c-4d46fda95e31 2:25:59 PM: debug Clock set age: 1161.8144666667 minutes
a579883b-302d-48de-908c-4d46fda95e31 2:25:59 PM: debug Battery report age: 1161.5227166667 minutes

Fixed it!

Change this:

def zwaveEvent(physicalgraph.zwave.commands.multiinstancev1.MultiInstanceCmdEncap cmd) {

to this:

def zwaveEvent(physicalgraph.zwave.commands.multichannelv3.MultiInstanceCmdEncap cmd ) {

Now see this in logs:

a579883b-302d-48de-908c-4d46fda95e31 3:00:29 PM: debug Parse returned [[value:67, unit:%, name:humidity, isStateChange:true, displayed:true, linkText:Downstairs Thermostat, descriptionText:Downstairs Thermostat humidity is 67%]]
a579883b-302d-48de-908c-4d46fda95e31 3:00:29 PM: debug multiinstancev1.MultiInstanceCmdEncap: command from instance 2: SensorMultilevelReport(precision: 0, scale: 0, scaledSensorValue: 67, sensorType: 5, sensorValue: [67], size: 1) 

Yay!

(to debug this, I commented out the catchall handler for events, and then looked at the error thrown:)

a579883b-302d-48de-908c-4d46fda95e31 2:58:23 PM: error groovy.lang.MissingMethodException: No signature of method: script1436219884665772312982.zwaveEvent() is applicable for argument types: (physicalgraph.zwave.commands.multichannelv3.MultiInstanceCmdEncap) values: [MultiInstanceCmdEncap(command: 5, commandClass: 49, instance: 2, parameter: [5, 1, 66])]
1 Like

You’re right, I got the same error when I see it on mine also (from Amazon as well).

@duncan - looping you in, any idea why the platform suddenly stopped working with multiinstancev1.MultiInstanceCmdEncap for humidity and works with multichannelv3.MultiInstanceCmdEncap as found by @schettj

Should probably also change the poll function to

zwave.multiChannelV3.multiInstanceCmdEncap(instance: 2).encapsulate(zwave.sensorMultilevelV3.sensorMultilevelGet()).format()

I really didn’t know why it seemed to report it differently - seems like they mapped the v1 encap to v3 (maybe?)