GoControl GC-TBZ48 Z-Wave Thermostat - Can't control setpoints?

I have a question about this new GC-TBZ48 thermostat I picked up to use with HomeAssistant. HomeAssistant/OpenZWave seem to associate with and poll data from it just fine (current temperature, heating/cooling modes, and fan state). Problem is I can’t seem to send setpoints to it. Using the panel HomeAssistant provides for it, I can adjust the setpoint to anything, get a notification that the command was sent, but nothing seems to happen. The thermostat doesn’t respond with its new setpoint.

Checking HA’s logs, I can see the command is issued to OpenZWave, but OZW_Log shows nothing on that node at the time the command was issued.

Is there something I’m missing? Do I need to poke at OpenZWave to help it add this functionality for my thermostat? For whatever it’s worth, I did pair it to a Wink hub I have here, and adjusting all modes of the thermostat (setpoints, etc) work as expected.

2 Likes

Did you figure out what was causing the issue? I’m interested in getting thermostat.

Yes I did.

The configuration profile was missing from OpenZWave. This thermostat supports multiple setpoints (heat, cool, heat away, and cool away). It looked to me that OZW was only sending it one setpoint, and the thermostat didn’t know how to interpret that data. I’ve been playing with a new config file for this thermostat and it appears to be working properly now in both OZW and Homeassistant.

Once the config file is polished up, I’ll submit my changes to the OpenZWave community for review so it can be included in future releases.

Something I found in my research into the issue is this thermostat appears to be made by a manufacturer called Linear who OEM it to other companies for sale under their own name. This thermostat branded by GoControl, Broan/NuTone, RCS Technology, and possibly many others. The model number appears to be the same (or very similar) across all vendors - either TBZ48 or NTBZ48.

1 Like

Any update on this? I have the same thermostat, and while I can set its mode to Cool or Heat fine, while I’m on Heat I can’t set the temp. I’m happy to try out your config file and see if it works.

1 Like

Watching this one, as I’m having the same issue. Able to set the cooling set point without trouble, but none of the four available temperature settings seem to affect the heat set point.

So, using my combined special abilities of random tinkering and dumb luck, I got this to work.

Step 1: In my openzwave config directory, I modified config/manufacturer_specific.xml and added a device mapping for this unit.

Under:
<Manufacturer id="014f" name="Linear">
add a line like this:
<Product type="5442" id="5431" name="TBZ48" config="linear/TBZ48.xml"/>

Step 2: Then you need to create that file. I read somewhere that this thing was identical to the remotec ZTS-110 so I just copied it’s config. The crucial bit seems to be the command class setpoint base being set to 0 rather than 1.

cp config/remotec/ZTS-110.xml config/linear/TBZ48.xml

Step 3: Remove and re-add the device using OpenZWave Control Panel and magic happens.

You now have the correct set points.

NOTE: I did not tinker with any of the configuration options, these represent the “Advanced Settings” in the user manual. Be careful setting anything in there, and confirm that the right setting has been changed if you do venture in - these settings can have serious consequences depending on your HVAC type

1 Like

This is pretty much what I did. I just finished writing it up, so I’ll paste it here for everyone’s consideration.

Disclaimer: This config may be incomplete. So far, it provides basic functionality including heat and cool setpoints, and temperature sensor status. I believe this thermostat supports more features, but should give a good baseline for now. Also, I haven’t officially had this “blessed” by the OpenZWave community, so there may be errors and other terribleness. I’m not responsible if you break your system, your furnace, air conditioner, etc. Your mileage may vary!

To get your thermostat working, you’ll need to build a device configuration file and tell OpenZWave how to read it. Let’s start with the config file.

First, you’ll need to know where your OpenZWave configuration files are. I run Home Assistant under Debian on a full PC, so I installed OpenZWave through pip. My configuration is located here:

/usr/local/lib/python3.5/dist-packages/libopenzwave-0.3.1-py3.5-linux-x86_64.egg/config

Yours may vary - especially if you’re using a pre-built package for a Raspberry Pi. If you get stuck, try looking here:

https://home-assistant.io/getting-started/z-wave/

In this directory, you’ll see a bunch of folders with device manufacturers. This thermostat is made by Linear, so I created a new file in the linear/ folder called tbz48.xml. This is what mine looks like:

/usr/local/lib/python3.5/dist-packages/libopenzwave-0.3.1-py3.5-linux-x86_64.egg/config/linear/tbz48.xml

<Product xmlns='http://code.google.com/p/open-zwave/'>

        <!-- COMMAND_CLASS_ASSOCIATION.  This class is in the list reported by the thermostat, but it does not respond to requests -->
        <CommandClass id="133" name="COMMAND_CLASS_ASSOCIATION" version="1" request_flags="4" create_vars="true">
                <Instance index="1" />
                <Associations num_groups="1">
                  <Group index="1" max_associations="5" label="Group 1" >
                    <Node id="1" />
                  </Group>
                </Associations>
        </CommandClass>

        <!-- The thermostat does not properly report its operating modes -->
        <CommandClass id="64" name="COMMAND_CLASS_THERMOSTAT_MODE" version="1" request_flags="4" create_vars="true">
                <Value type="list" genre="user" instance="1" index="0" label="Mode" units="" read_only="false" write_only="false" min="0" max="0" value="0">
                  <Item label="Off" value="0" />
                  <Item label="Heat" value="1" />
                  <Item label="Cool" value="2" />
                  <Item label="Auto" value="3" />
                  <Item label="Aux Heat" value="4" />
                </Value>
                <SupportedModes>
                  <Mode index="0" label="Off" />
                  <Mode index="1" label="Heat" />
                  <Mode index="2" label="Cool" />
                  <Mode index="3" label="Auto" />
                  <Mode index="4" label="Aux Heat" />
                </SupportedModes>
        </CommandClass>

        <CommandClass id="67" name="COMMAND_CLASS_THERMOSTAT_SETPOINT" version="1" request_flags="4" create_vars="true" base="0">
                <Instance index="1" />
                  <Value type="decimal" genre="user" instance="1" index="1" label="Heating 1" read_only="false" write_only="false" />
                  <Value type="decimal" genre="user" instance="1" index="2" label="Cooling 1" read_only="false" write_only="false" />
        </CommandClass>

</Product>

Save that file and set permissions to 744 using chmod 744 tbz48.xml. This will allow all users on your system to read this file. If you run Home Assistant as a user other than root (which you should be doing anyway!), this will allow this configuration to be read.

Next, you’ll need to modify the manufacturer_specific.xml file. This allows OpenZWave to assign a friendly device name to your thermostat. Because this thermostat isn’t defined in this file, you’ll notice it will be called “Linear Unknown type=5442, id=5431”. We can update this file to change that to something more useful, as well as point it to our new config file.

Open your /usr/local/lib/python3.5/dist-packages/libopenzwave-0.3.1-py3.5-linux-x86_64.egg/config/manufacturer_specific.xml file. Search for the following line:

<Manufacturer id="014f" name="Linear">

Under there, I added a new line:

<Product type="5442" id="5431" name="TBZ48 Thermostat" config="linear/tbz48.xml"/>

This tells OpenZWave what a Linear Type=5442, ID=5431 is, and where to find the config file you just created.

Go ahead and save that file and restart Home Assistant. If all goes well, you should now see two Linear TBZ48 Thermostats in Home Assistant - one called Heating 1, the other called Cooling 1. These are the Heat and Cool setpoints on the thermostat respectively. Each can be modified as you want and will change from one to another when you change the mode from Heat to Cool. Theoretically, setting the mode to Auto should tell the thermostat to switch automatically, but I haven’t tested this yet.

If this didn’t work and you still see “Linear Unknown type=5442, id=5431” devices, then you may need to trash your current Z-Wave config in your Home Assistant config directory. OpenZWave will cache your devices automatically, so it may not update your thermostat with the values we configured. This file will be called something like “zwcfg-0xxxxxxx.xml”. I renamed mine to something else in case I needed to revert back to it. Next time Home Assistant restarts OpenZWave, it will re-poll all the devices on your ZWave network and update their configurations as necessary.

Once this gets submitted to OpenZWave, hopefully future releases should have this config added, so modifying config files won’t be necessary. This should get you going for now though.

Hope it helps!

Excellent! I think your config is the one people should use, as it exposes them to less risk from the extra config options. I will try and test the configuration settings copied over from the ZTS-110 config file this weekend and report back if they are actually setting the “Advanced Settings” menu described in the GoControl user manual.

I was fiddling around and came to the same setup, and it seems to be working for me as well - was able to control the setpoint. I did remove the Aux Heat mode (cause I’m not going to use it) but other than that its pretty much identical. I’ll let you know if mine continues to work fine

I have three of these (one GC-TBZ48, two Lowes/Iris branded GC-TBZ48L which appear to be identical), and I’m having trouble with the devices that are set on “Auto” rather than either “Off”, “Cool”, or “Heat.” The setpoints don’t seem to be pulling correctly in this mode, but I don’t yet know enough about OZW/OZWCP/HA to make heads or tails of it.

I’ve applied the configuration supplied by @Hambo, and I think I did everything right since it’s showing up almost correctly (and the “Off”-mode thermostat looks perfect). Here are some relevant excerpts from the OZW log; note that the thermostats are nodes 12, 17, and 18, with node 18 being the one in Off mode.

2016-11-16 15:25:59.985 Info, Value size is invalid. Only 1, 2 & 4 supported for node 12, class 0x40, instance 1, index 0
2016-11-16 15:25:59.985 Info, Value size is invalid. Only 1, 2 & 4 supported for node 17, class 0x40, instance 1, index 0
2016-11-16 15:25:59.986 Info, Value size is invalid. Only 1, 2 & 4 supported for node 18, class 0x40, instance 1, index 0
...
2016-11-16 15:25:59.997 Info, Notification: Value Added Home 0xf18a7329 Node 12 Genre user Class SENSOR MULTILEVEL Instance 1 Index 1 Type decimal
2016-11-16 15:25:59.997 Detail, Node012, Notification: ValueAdded
2016-11-16 15:25:59.997 Info, Notification: Value Added Home 0xf18a7329 Node 12 Genre user Class THERMOSTAT MODE Instance 1 Index 0 Type list
2016-11-16 15:25:59.997 Detail, Node012, Notification: ValueAdded
2016-11-16 15:25:59.997 Info, Notification: Value Added Home 0xf18a7329 Node 12 Genre user Class THERMOSTAT OPERATING STATE Instance 1 Index 0 Type string
2016-11-16 15:25:59.997 Detail, Node012, Notification: ValueAdded
2016-11-16 15:25:59.997 Info, Notification: Value Added Home 0xf18a7329 Node 12 Genre user Class THERMOSTAT SETPOINT Instance 1 Index 1 Type decimal
2016-11-16 15:25:59.997 Detail, Node012, Notification: ValueAdded
2016-11-16 15:25:59.997 Info, Notification: Value Added Home 0xf18a7329 Node 12 Genre user Class THERMOSTAT SETPOINT Instance 1 Index 2 Type decimal
2016-11-16 15:25:59.997 Detail, Node012, Notification: ValueAdded
2016-11-16 15:25:59.997 Info, Notification: Value Added Home 0xf18a7329 Node 12 Genre user Class THERMOSTAT FAN MODE Instance 1 Index 0 Type list
2016-11-16 15:25:59.997 Detail, Node012, Notification: ValueAdded
2016-11-16 15:25:59.997 Info, Notification: Value Added Home 0xf18a7329 Node 12 Genre user Class THERMOSTAT FAN STATE Instance 1 Index 0 Type string
2016-11-16 15:25:59.997 Detail, Node012, Notification: ValueAdded
...
[REPEATED FOR NODES 17 AND 18]
...
2016-11-16 15:26:24.108 Detail, Node012, Query Stage Complete (Neighbors)
2016-11-16 15:26:24.108 Detail, Node012, AdvanceQueries queryPending=0 queryRetries=0 queryStage=Session live=1
2016-11-16 15:26:24.108 Detail, Node012, QueryStage_Session
2016-11-16 15:26:24.108 Detail, Node012, Queuing (Query) ThermostatSetpointCmd_Get (Node=12): 0x01, 0x0a, 0x00, 0x13, 0x0c, 0x03, 0x43, 0x02, 0x01, 0x25, 0x27, 0xab
2016-11-16 15:26:24.108 Detail, Node012, Queuing (Query) ThermostatSetpointCmd_Get (Node=12): 0x01, 0x0a, 0x00, 0x13, 0x0c, 0x03, 0x43, 0x02, 0x02, 0x25, 0x28, 0xa7
2016-11-16 15:26:24.108 Detail, Node012, Queuing (Query) PowerlevelCmd_Get (Node=12): 0x01, 0x09, 0x00, 0x13, 0x0c, 0x02, 0x73, 0x02, 0x25, 0x29, 0x96
2016-11-16 15:26:24.108 Detail, Node012, Queuing (Query) Query Stage Complete (Session)
2016-11-16 15:26:24.108 Detail, Node017, Query Stage Complete (Neighbors)
2016-11-16 15:26:24.108 Detail, Node017, AdvanceQueries queryPending=0 queryRetries=0 queryStage=Session live=1
2016-11-16 15:26:24.108 Detail, Node017, QueryStage_Session
2016-11-16 15:26:24.108 Detail, Node017, Queuing (Query) ThermostatSetpointCmd_Get (Node=17): 0x01, 0x0a, 0x00, 0x13, 0x11, 0x03, 0x43, 0x02, 0x01, 0x25, 0x2a, 0xbb
2016-11-16 15:26:24.108 Detail, Node017, Queuing (Query) ThermostatSetpointCmd_Get (Node=17): 0x01, 0x0a, 0x00, 0x13, 0x11, 0x03, 0x43, 0x02, 0x02, 0x25, 0x2b, 0xb9
2016-11-16 15:26:24.108 Detail, Node017, Queuing (Query) PowerlevelCmd_Get (Node=17): 0x01, 0x09, 0x00, 0x13, 0x11, 0x02, 0x73, 0x02, 0x25, 0x2c, 0x8e
2016-11-16 15:26:24.108 Detail, Node017, Queuing (Query) Query Stage Complete (Session)
2016-11-16 15:26:24.108 Detail, Node018, Query Stage Complete (Neighbors)
2016-11-16 15:26:24.108 Detail, Node018, AdvanceQueries queryPending=0 queryRetries=0 queryStage=Session live=1
2016-11-16 15:26:24.108 Detail, Node018, QueryStage_Session
2016-11-16 15:26:24.108 Detail, Node018, Queuing (Query) ThermostatSetpointCmd_Get (Node=18): 0x01, 0x0a, 0x00, 0x13, 0x12, 0x03, 0x43, 0x02, 0x01, 0x25, 0x2d, 0xbf
2016-11-16 15:26:24.108 Detail, Node018, Queuing (Query) ThermostatSetpointCmd_Get (Node=18): 0x01, 0x0a, 0x00, 0x13, 0x12, 0x03, 0x43, 0x02, 0x02, 0x25, 0x2e, 0xbf
2016-11-16 15:26:24.108 Detail, Node018, Queuing (Query) PowerlevelCmd_Get (Node=18): 0x01, 0x09, 0x00, 0x13, 0x12, 0x02, 0x73, 0x02, 0x25, 0x2f, 0x8e
2016-11-16 15:26:24.108 Detail, Node018, Queuing (Query) Query Stage Complete (Session)
...
node = 12 id = 0 value = 79 precision = 0
node = 12 id = 3 value = 72 precision = 0
node = 12 id = 4 value = 80 precision = 0
node = 17 id = 0 value = 74 precision = 0
node = 17 id = 3 value = 73 precision = 0
node = 17 id = 4 value = 78 precision = 0
node = 18 id = 0 value = 68 precision = 0
node = 18 id = 3 value = 72 precision = 0
node = 18 id = 4 value = 80 precision = 0

I’m most curious about the lines at the very end, which indicate the info is right there but for some reason unavailable to HA. The ID values 0/3/4 are in each case the current temp, heat setpoint, and cool setpoint. However, in the HA “States” page, while I do get the expected climate.NAME_heating_1_NODEID_1 and climate.NAME_cooling_1_NODEID_2 entities, and the state value for each “Off/Cool/Heat/Auto” is correct for all of them, the temperature attribute shows up as null for the thermostats in “Auto” mode.

Perhaps relatedly, even the “Off”-mode temperature setpoint shows only the “Cool” value (80 in my case) for both heating and cooling entities. Is there something obvious that I’m missing, or something I can try in order to correctly read and map the values?

I just updated to v0.33.4 this morning, and both setpoints for all three thermostats seem to be working. I’m not sure if it was a bug that they fixed (probably) or some side-effect of something else (not likely), but all is good now!

Hey everyone. Just installed my tbz48. Paired it in ozwcp, HA is seeing it with out any config. HA is showing it as “off” and no current temp. Whats your HA config like? Is that my issue?

Thanks everyone for your help! I tried this last night and it worked perfectly. The only issue I had was I copied the file and the owner was set to root instead of “homeassistant”. I’m using the AIO pi installer. So chown homeassistant:homeassistant TBZ48.xml did the trick. Thanks again!

For anyone else using this thermostat I did figure out some automation code for it today and it’s working great. I’m new to this so I kept it very simple;

  - alias: "Set Wakeup Temp weekdays"
trigger:
  - platform: time
    after: '06:00:00'
condition:
  - condition: time
    weekday:
      - mon
      - tue
      - wed
      - thu
      - fri
action:
  - service: climate.set_temperature
    entity_id: climate.linear_tbz48_heating_1_2_1
    data:
      temperature: 70

Thanks.

Hi everyone, I am curious to all you TBZ48 owners, if you’ve had any issues with HA or the thermostat not reporting operating state.

Basically, even when my system is on, the operating state and fan state show as idle.

I’m running on battery power, and it seems setting any polling interval is useless.

I have been fighting trying to get the attributes of this thermostat to update. I finally seemed to find something that worked. The refresh_entity got me the operation state. I do however have the C wire hooked up. Here is my automation config

  • alias: Refresh Thermostate
    hide_entity: true
    initial_state: ‘on’
    trigger:
    • platform: time
      seconds: ‘/30’
      action:
    • service: zwave.refresh_entity
      data:
      entity_id: climate.linear_tbz48_thermostat_heating_1_3_1
2 Likes

I ended up doing something similar as well. Still seems weird to me that the Thermostat doesn’t push running status like it does everything else.

How do you get your zwcfg-0xxxxxxx.xml to update?

I am trying to follow the procedure to get my TBZ48 thermostat configured correctly. I’ve got everything right up until: [quote=“Hambo, post:7, topic:5404”]
If this didn’t work and you still see “Linear Unknown type=5442, id=5431” devices, then you may need to trash your current Z-Wave config in your Home Assistant config directory. OpenZWave will cache your devices automatically, so it may not update your thermostat with the values we configured. This file will be called something like “zwcfg-0xxxxxxx.xml”. I renamed mine to something else in case I needed to revert back to it. Next time Home Assistant restarts OpenZWave, it will re-poll all the devices on your ZWave network and update their configurations as necessary.
[/quote]

My old zwcfg*.xml keeps coming back no matter what I do; rename it, delete it, leave it overnight, turn off HASS and rename/delete then restart HASS, HASS off rename/delete then restart the system, remove/re-add the device to the zwave network from the HASS zwave domain… any combination of the above.

Something I have not done is remove/re-add the device without going through HASS, but I don’t know how to do so.

It never pulls a new zwcfg*.xml, in fact it keeps recreating the same one as the original! I keep seeing Linear Unknown type=5442, id=5431 on my dashboard and can’t control my heat.

I have no other zwave devices atm and my config regarding zwave are the bare bones to be functional:

zwave:
  usbpath: /dev/tty_whatever_USB_zwave_stick

climate:
  platform: zwave

If it matters, I’m on a Debian Jessie server with HASS and OpenZwave installed in a python-virtualenv. So my HASS configs are in /home/homeassistant/.homeassistant/ and openzwave configs in /srv/homeassistant/. My zwave usb is one of the officially recommended.

I had the same issue before but it was because I didn’t save the configuration after making changes in openzwave-panel.

I threw in the towel with zwave thermostats. I ended up getting a honeywell wifi thermostat. It was just too complicated to program this so it was family friendly.