Radio Thermostat CT80 Z-Wave: cannot set temperature

Hello!

I’ve hooked up a Radio Thermostat CT-80 to Home Assistant via Z-Wave. It seems to generally work, but I was curious about two things:

There are 4 different entities created:
a. climate.<name>_away_heating
b. climate.<name>_cooling_1
c. climate.<name>_cooling_econ
d. climate.<name>_unused_3

All of the attributes for these entities are identical, with few differences. I’m not even sure which entity I should be interacting with.

The sensor climate.<name>_temperature does appear to reflect the current temperature.

However, I can’t set the temperature via the interface, or via the service call UI in the developer tools area. When I do attempt to call the climate/set_temperature service with the entity_id and temperature keys in the service data, this apepars in my OZWLog.txt file:

2017-11-21 05:16:40.277 Info, Node004, Value::Set - COMMAND_CLASS_THERMOSTAT_SETPOINT - Away Heating - 13 - 1 - 90
2017-11-21 05:16:40.279 Detail, Node004, Queuing (Send) ThermostatSetpointCmd_Set (Node=4): 0x01, 0x0c, 0x00, 0x13, 0x04, 0x05, 0x43, 0x01, 0x0d, 0x01, 0x5a, 0x25, 0x2c, 0xfc
2017-11-21 05:16:40.283 Detail, Node004, Queuing (Send) ThermostatSetpointCmd_Get (Node=4): 0x01, 0x0a, 0x00, 0x13, 0x04, 0x03, 0x43, 0x02, 0x0d, 0x25, 0x2d, 0xa5
2017-11-21 05:16:40.286 Detail,
2017-11-21 05:16:40.287 Info, Node004, Sending (Send) message (Callback ID=0x2c, Expected Reply=0x13) - ThermostatSetpointCmd_Set (Node=4): 0x01, 0x0c, 0x00, 0x13, 0x04, 0x05, 0x43, 0x01, 0x0d, 0x01, 0x5a, 0x25, 0x2c, 0xfc
2017-11-21 05:16:40.300 Detail, Node004,   Received: 0x01, 0x04, 0x01, 0x13, 0x01, 0xe8
2017-11-21 05:16:40.302 Detail, Node004,   ZW_SEND_DATA delivered to Z-Wave stack
2017-11-21 05:16:40.509 Detail, Node004,   Received: 0x01, 0x07, 0x00, 0x13, 0x2c, 0x00, 0x00, 0x15, 0xd2
2017-11-21 05:16:40.512 Detail, Node004,   ZW_SEND_DATA Request with callback ID 0x2c received (expected 0x2c)
2017-11-21 05:16:40.515 Info, Node004, Request RTT 224 Average Request RTT 221
2017-11-21 05:16:40.517 Detail,   Expected callbackId was received
2017-11-21 05:16:40.520 Detail,   Expected reply was received
2017-11-21 05:16:40.522 Detail,   Message transaction complete
2017-11-21 05:16:40.522 Detail,
2017-11-21 05:16:40.523 Detail, Node004, Removing current message
2017-11-21 05:16:40.523 Detail,
2017-11-21 05:16:40.527 Info, Node004, Sending (Send) message (Callback ID=0x2d, Expected Reply=0x04) - ThermostatSetpointCmd_Get (Node=4): 0x01, 0x0a, 0x00, 0x13, 0x04, 0x03, 0x43, 0x02, 0x0d, 0x25, 0x2d, 0xa5
2017-11-21 05:16:40.537 Detail, Node004,   Received: 0x01, 0x04, 0x01, 0x13, 0x01, 0xe8
2017-11-21 05:16:40.645 Detail, Node004,   ZW_SEND_DATA delivered to Z-Wave stack
2017-11-21 05:16:40.743 Detail, Node004,   Received: 0x01, 0x07, 0x00, 0x13, 0x2d, 0x00, 0x00, 0x15, 0xd3
2017-11-21 05:16:40.832 Detail, Node004,   ZW_SEND_DATA Request with callback ID 0x2d received (expected 0x2d)
2017-11-21 05:16:40.835 Info, Node004, Request RTT 307 Average Request RTT 264
2017-11-21 05:16:40.837 Detail,   Expected callbackId was received
2017-11-21 05:16:50.533 Error, Node004, ERROR: Dropping command, expected response not received after 1 attempt(s)
2017-11-21 05:16:50.535 Detail, Node004, Removing current message
2017-11-21 05:16:50.537 Detail, Node004, Notification: Notification - TimeOut

Any help debugging the issue would be appreciated! I’m not sure how to inspect what’s happening in the Z-Wave controller. I suspect this might be related to the CT80 model missing from official support in the OpenZwave project (it’s missing from https://github.com/OpenZWave/open-zwave/blob/master/config/manufacturer_specific.xml) but I could be wrong.

Tharsan

From the docs (are you using the USNAP module? Looks like CT80 does not have Z-Wave built into the thermostat itself):

Simple Mode/Normal Mode
The CT30 offers two modes of operation, Normal Mode and Simple mode.
Normal mode is intended for use as a stand alone programmable thermostat.
In Normal mode the user can program the thermostat to change temperatures at various points throughout the day. Simple mode is intended for use with a larger control system - like an alarm system or home automation system.
Simple mode is meant to run a single temperature constantly. This temperature can be set locally on the thermostat, or remotely using a Z-Wave® USNAP module.
To enter simple mode: Press and hold the PROG button for 12
seconds.
To leave simple mode, press and hold the PROG button for 12

Did you put the thermostat in “simple mode”? If not, I wouldn’t be surprised if the thermostat is ignoring the set temperature command.

The error you’re getting is only for the ThermostatSetpointCmd_Get - who knows why that would be if the thermostat is otherwise reporting temperature properly. I do think adding it to the OZW device library would help but I couldn’t find the proper specs anywhere.

Hey, thanks for the taking the time to respond.

I don’t see anything in the CT80 operating manual about Simple vs. Normal modes. See https://www.homedepot.com/catalog/pdfImages/17/17f42775-2168-4745-a74c-281bbeb528a0.pdf

I am using an RTM-1 module snapped into the back of the thermostat, for Z-Wave support.

One thing I did notice is it that the CT80 model is NOT Z-Wave certified. I can’t find it when searching the database. See here: https://products.z-wavealliance.org/Search/DoAdvancedSearch?productName=CT&productIdentifier=&productDescription=&category=10&manufacturer=-1&regionId=2&order=

I’m not sure if that means anything, though.

Something else I noticed: when you set the temperature for a climate device, HA emits a ThermostatSetpointCmd_Set followed by a ThermostatSetpointCmd_Get command. The first succeeds, but the second does not return the “expected response”.

However, both commands complete successfully when I set the temperature on 2 of the 4 climate entities created. (The temperature is not updated on the thermostat still, though)

But setting the temperature on the other 2 still fail on the ThermostatSetpointCmd_Get command.

Right, it makes sense that CT80 is not in the database, because it’s only the snap-in module that has Z-Wave support. CT80 itself doesn’t know anything about Z-Wave, and it sounds like it supports various different snap in radios, a neat idea.

The thing about simple/normal modes was in the Z-Wave module documentation here. It does have enough info for you to add it to the OZW device database, if you are so inclined. It’s kind of a pain, editing XML files, but would let you config the thermostat from HA.

Ah, OK when you put it that way, it makes sense.

I was perusing the open-zwave source tree, and noticed that all of the manufacturer-specific files for Radio Thermostat (2gig) all do the same thing:

<!-- This thermostat's setpoint descriptions are 0 based, not 1 -->
<CommandClass id="67" base="0" />

I suspect I need to add something similar for mine.

See https://github.com/OpenZWave/open-zwave/tree/master/config/2gig

I’ll try this out soon, and report back.

Tharsan

OK, I was able to fix this problem and correctly set the target temperature on the thermostat.

The change I had to make to Open Z-Wave is documented here (and will hopefully be merged into the project at some point): https://github.com/OpenZWave/open-zwave/pull/1379

Thanks for pointing me in the right direction, @netopiax!

Tharsan

1 Like

Ok, so I did the same for my CT80 that was showing up with different IDs: https://github.com/OpenZWave/open-zwave/pull/1432

I manually edited the file locally too for now.

Now I’m getting:

climate.thermostat_cooling_1
climate.thermostat_cooling_econ
climate.thermostat_heating_1
climate.thermostat_heating_econ
sensor.thermostat_temperature
sensor.thermostat_temperature_2

It seems I can only change the thermostat temperature when I call climate.set_temperature on climate.thermostat_heating_1. Doesn’t work on any of the others. At least while I’m using the heater, I haven’t tried when it’s set to cooling. Is this the expected behavior on these? I have the older radio, RTZW-01, which has barely any documentation. The new one, RTZW-02, has more documentation and a bunch of config options.

Also, it seems only one sensor reports the temperature… the other has been static.

Is this the same behavior you’ve seen?

I also have the RTZW-01. That looks pretty similar to what I get. I only get one temperature sensor. I suppose you can safely ignore one of those, if the other accurately reports the temperature.

I’m able to set the temperature (setpoint) via the Home Assistant UI. I’m not sure which entity is called when I do that, though. It works well through the UI. I’m guessing the thermostat only accepts temperature changes via one of the four climate entities, and which one might depend on the thermostat mode (e.g. heat).

Tharsan

From what I can tell with these ZWave thermostats is that if it’s on ‘Heat’ mode you use heating_1 on ‘Cool’ mode you use cooling_1.

At least that’s how my Liner (GoControl) one works.

Ok, so how do you deal with that in the UI? Do you show both thermostats and use one for setting the heat temperature and the other for setting the a/c temperature? I can handle any automation by calling the service on the appropriate entity, but having 2 thermostats/climate devices show up in the UI to control a single thermostat is unintuitive. How can you make it show only a single thermostat and have it call the correct setpoint?

Currently I display both, but I am going to use an automation where I set the HVAC mode to ‘Cool’ or ‘Heat’ then use an input_number for the target temperature, then based on the mode adjust the correct heating or cooling temperature.

That makes sense. I might do that too. I do like how the thermostat card looks. I might try keeping both thermostats just so I can have the nice cards.

I noticed I have a sensor.thermostat_relative_humidity. I only get one reading, though, when I start home assistant. I wonder if that sensor needs to be polled or if there’s some setting that needs to be configured for it to report.

Here’s the logs from the Dynamic Stage queries. I see that it sends a SensorMultilevelCmd_Get and that it’s MultiChannel Encapsulated. So there are 3 channels, two temperature sensors, and one relative humidity sensor. After this initial get only the first channel gets reported regularly. The other channels don’t. Is there some sort of configuration in the zwcfg/ozwcache file that needs to be set for this node to report all channels?

2018-01-30 18:45:52.138 Detail, Node028, Query Stage Complete (Session)
2018-01-30 18:45:52.138 Detail, Node028, AdvanceQueries queryPending=0 queryRetries=0 queryStage=Dynamic live=1
2018-01-30 18:45:52.138 Detail, Node028, QueryStage_Dynamic
2018-01-30 18:45:52.139 Detail, Node028, Queuing (Send) SensorMultilevelCmd_Get (Node=28): 0x01, 0x09, 0x00, 0x13, 0x1c, 0x02, 0x31, 0x04, 0x25, 0x70, 0x9b
2018-01-30 18:45:52.139 Detail, Node028, Queuing (Send) MultiChannel Encapsulated (instance=2): SensorMultilevelCmd_Get (Node=28): 0x01, 0x0d, 0x00, 0x13, 0x1c, 0x06, 0x60, 0x0d, 0x01, 0x01, 0x31, 0x04, 0x25, 0x71, 0xf7
2018-01-30 18:45:52.139 Detail, Node028, Queuing (Send) MultiChannel Encapsulated (instance=3): SensorMultilevelCmd_Get (Node=28): 0x01, 0x0d, 0x00, 0x13, 0x1c, 0x06, 0x60, 0x0d, 0x01, 0x02, 0x31, 0x04, 0x25, 0x72, 0xf7
2018-01-30 18:45:52.139 Detail, Node028, Queuing (Send) ThermostatModeCmd_Get (Node=28): 0x01, 0x09, 0x00, 0x13, 0x1c, 0x02, 0x40, 0x02, 0x25, 0x73, 0xef
2018-01-30 18:45:52.139 Detail, Node028, Queuing (Send) ThermostatOperatingStateCmd_Get (Node=28): 0x01, 0x09, 0x00, 0x13, 0x1c, 0x02, 0x42, 0x02, 0x25, 0x74, 0xea
2018-01-30 18:45:52.140 Detail, Node028, Queuing (Send) ThermostatFanModeCmd_Get (Node=28): 0x01, 0x09, 0x00, 0x13, 0x1c, 0x02, 0x44, 0x02, 0x25, 0x75, 0xed
2018-01-30 18:45:52.140 Detail, Node028, Queuing (Send) ThermostatFanStateCmd_Get (Node=28): 0x01, 0x09, 0x00, 0x13, 0x1c, 0x02, 0x45, 0x02, 0x25, 0x76, 0xef
2018-01-30 18:45:52.140 Detail, Node028, Queuing (Send) ClockCmd_Get (Node=28): 0x01, 0x09, 0x00, 0x13, 0x1c, 0x02, 0x81, 0x05, 0x25, 0x77, 0x2d
2018-01-30 18:45:52.140 Detail, Node028, Queuing (Send) IndicatorCmd_Get (Node=28): 0x01, 0x09, 0x00, 0x13, 0x1c, 0x02, 0x87, 0x02, 0x25, 0x78, 0x23
2018-01-30 18:45:52.140 Detail, Node028, Queuing (Query) Query Stage Complete (Dynamic)
2018-01-30 18:45:52.141 Detail,
2018-01-30 18:45:52.141 Info, Node028, Sending (Send) message (Callback ID=0x70, Expected Reply=0x04) - SensorMultilevelCmd_Get (Node=28): 0x01, 0x09, 0x00, 0x13, 0x1c, 0x02, 0x31, 0x04, 0x25, 0x70, 0x9b
2018-01-30 18:45:52.149 Detail, Node028,   Received: 0x01, 0x04, 0x01, 0x13, 0x01, 0xe8
2018-01-30 18:45:52.149 Detail, Node028,   ZW_SEND_DATA delivered to Z-Wave stack
2018-01-30 18:45:52.329 Detail, Node028,   Received: 0x01, 0x07, 0x00, 0x13, 0x70, 0x00, 0x00, 0x12, 0x89
2018-01-30 18:45:52.330 Detail, Node028,   ZW_SEND_DATA Request with callback ID 0x70 received (expected 0x70)
2018-01-30 18:45:52.330 Info, Node028, Request RTT 188 Average Request RTT 192
2018-01-30 18:45:52.330 Detail,   Expected callbackId was received
2018-01-30 18:45:52.505 Detail, Node028,   Received: 0x01, 0x0c, 0x00, 0x04, 0x00, 0x1c, 0x06, 0x31, 0x05, 0x01, 0x2a, 0x02, 0x7b, 0x8b
2018-01-30 18:45:52.506 Detail,
2018-01-30 18:45:52.506 Info, Node028, Response RTT 364 Average Response RTT 367
2018-01-30 18:45:52.506 Info, Node028, Received SensorMultiLevel report from node 28, instance 1, Temperature: value=63.5F
2018-01-30 18:45:52.506 Detail, Node028, Refreshed Value: old value=63.5, new value=63.5, type=decimal
2018-01-30 18:45:52.506 Detail, Node028, Changes to this value are not verified
2018-01-30 18:45:52.506 Detail, Node028,   Expected reply and command class was received
2018-01-30 18:45:52.507 Detail, Node028,   Message transaction complete
2018-01-30 18:45:52.507 Detail,
2018-01-30 18:45:52.507 Detail, Node028, Removing current message
2018-01-30 18:45:52.507 Detail, Node028, Notification: ValueChanged
2018-01-30 18:45:52.549 Detail,
2018-01-30 18:45:52.549 Info, Node028, Sending (Send) message (Callback ID=0x71, Expected Reply=0x04) - MultiChannel Encapsulated (instance=2): SensorMultilevelCmd_Get (Node=28): 0x01, 0x0d, 0x00, 0x13, 0x1c, 0x06, 0x60, 0x0d, 0x01, 0x01, 0x31, 0x04, 0x25, 0x71, 0xf7
2018-01-30 18:45:52.558 Detail, Node028,   Received: 0x01, 0x04, 0x01, 0x13, 0x01, 0xe8
2018-01-30 18:45:52.558 Detail, Node028,   ZW_SEND_DATA delivered to Z-Wave stack
2018-01-30 18:45:52.736 Detail, Node028,   Received: 0x01, 0x07, 0x00, 0x13, 0x71, 0x00, 0x00, 0x12, 0x88
2018-01-30 18:45:52.736 Detail, Node028,   ZW_SEND_DATA Request with callback ID 0x71 received (expected 0x71)
2018-01-30 18:45:52.736 Info, Node028, Request RTT 186 Average Request RTT 189
2018-01-30 18:45:52.737 Detail,   Expected callbackId was received
2018-01-30 18:45:52.920 Detail, Node028,   Received: 0x01, 0x10, 0x00, 0x04, 0x00, 0x1c, 0x0a, 0x60, 0x0d, 0x01, 0x01, 0x31, 0x05, 0x01, 0x2a, 0x02, 0x7b, 0xf6
2018-01-30 18:45:52.921 Detail,
2018-01-30 18:45:52.921 Info, Node028, Response RTT 371 Average Response RTT 369
2018-01-30 18:45:52.921 Info, Node028, Received a MultiChannelEncap from node 28, endpoint 1 for Command Class COMMAND_CLASS_SENSOR_MULTILEVEL
2018-01-30 18:45:52.921 Info, Node028, Received SensorMultiLevel report from node 28, instance 2, Temperature: value=63.5F
2018-01-30 18:45:52.921 Detail, Node028, Initial read of value
2018-01-30 18:45:52.921 Detail, Node028,   Expected reply and command class was received
2018-01-30 18:45:52.921 Detail, Node028,   Message transaction complete
2018-01-30 18:45:52.922 Detail,
2018-01-30 18:45:52.922 Detail, Node028, Removing current message
2018-01-30 18:45:52.922 Detail, Node028, Notification: ValueChanged
2018-01-30 18:45:52.945 Detail,
2018-01-30 18:45:52.946 Info, Node028, Sending (Send) message (Callback ID=0x72, Expected Reply=0x04) - MultiChannel Encapsulated (instance=3): SensorMultilevelCmd_Get (Node=28): 0x01, 0x0d, 0x00, 0x13, 0x1c, 0x06, 0x60, 0x0d, 0x01, 0x02, 0x31, 0x04, 0x25, 0x72, 0xf7
2018-01-30 18:45:52.955 Detail, Node028,   Received: 0x01, 0x04, 0x01, 0x13, 0x01, 0xe8
2018-01-30 18:45:52.955 Detail, Node028,   ZW_SEND_DATA delivered to Z-Wave stack
2018-01-30 18:45:53.146 Detail, Node028,   Received: 0x01, 0x07, 0x00, 0x13, 0x72, 0x00, 0x00, 0x13, 0x8a
2018-01-30 18:45:53.146 Detail, Node028,   ZW_SEND_DATA Request with callback ID 0x72 received (expected 0x72)
2018-01-30 18:45:53.147 Info, Node028, Request RTT 201 Average Request RTT 195
2018-01-30 18:45:53.147 Detail,   Expected callbackId was received
2018-01-30 18:45:53.328 Detail, Node028,   Received: 0x01, 0x0f, 0x00, 0x04, 0x00, 0x1c, 0x09, 0x60, 0x0d, 0x02, 0x01, 0x31, 0x05, 0x05, 0x01, 0x2d, 0x92
2018-01-30 18:45:53.329 Detail,
2018-01-30 18:45:53.329 Info, Node028, Response RTT 383 Average Response RTT 376
2018-01-30 18:45:53.329 Info, Node028, Received a MultiChannelEncap from node 28, endpoint 2 for Command Class COMMAND_CLASS_SENSOR_MULTILEVEL
2018-01-30 18:45:53.329 Info, Node028, Received SensorMultiLevel report from node 28, instance 3, Relative Humidity: value=45%
2018-01-30 18:45:53.329 Detail, Node028, Initial read of value
2018-01-30 18:45:53.330 Detail, Node028,   Expected reply and command class was received
2018-01-30 18:45:53.330 Detail, Node028,   Message transaction complete
2018-01-30 18:45:53.330 Detail,
2018-01-30 18:45:53.330 Detail, Node028, Removing current message
2018-01-30 18:45:53.330 Detail, Node028, Notification: ValueChanged
2018-01-30 18:45:53.353 Detail,

I think you need the dev version of python-openzwave for the multichannel support.

Yeah, I’m using the dev version. I think the config for the device needs to be updated. I’m gonna try running some tests with an updated config tonight. In the meantime I filed this github issue to see if the developers have any insight.

The fix you implemented says ‘Merged’ but I can’t set the temp on my CT80? Everything else works.

How did you modify yours or how can I look to see if mine needs changing? I’m running 0.83.3

Did you load the zwave climate component?

When I paired the thermostat I automatically got a climate component. Using the Aeotec gen5 stick.

I just manually added a zwave climate component with this: (same result)

climate:
  - platform: zwave

Did you get the climate entities in the <> dev-state menu?
Ie:

Yes, same thing only 2 for heating and 2 for cooling I believe.

Also, it only reports current temp always and not current & target temp.

Fun tip: my Tstat is also node 9 :slight_smile:

If you have the climate entries then you just need to add them to your UI, I use lovelace so mine are added like so:

#
#   Climate
#
  - icon: mdi:thermometer
    id: climate
    title: Climate
    cards:
      - id: a9c2e53e370047e5934070c61d31be65  # Automatically created id
        type: entities
        title: Downstairs HVAC
        entities:
          - climate.downstairs_thermostat_cooling_1
          - climate.downstairs_thermostat_heating_1
          - sensor.downstairs_compressor

      - id: 1ae720a3fb9a42029aad9a6f97d9b23c  # Automatically created id
        type: entities
        title: Upstairs HVAC
        entities:
          - climate.upstairs_thermostat_cooling_1
          - climate.upstairs_thermostat_heating_1
          - sensor.upstairs_compressor

      - id: 05370658da464469842ddcf9a4f03359  # Automatically created id
        type: entities
        title: HVAC Mode
        entities:
          - input_select.hvac_setting
          - input_select.hvac_fan
          - input_select.power_saving_season

Which gives me: