OpenHAB Zone Control HVAC

Hello,
I am new to the community and I was hoping you could lend me some of your expertise.
I would like to utilise my RPi running OpenHAB to read multiple temperature sensors and then activate the appropriate heating or cooling based on the average temperature from all sensors or based on a single sensor. The RPi would be connected to the HVAC using relays. I would also like to control automated dampers based on temperature readings using OpenHAB. Is this something well suited for OpenHAB or perhaps this would be easier to achieve using a different platform. I am open to suggestions.

Thanks!

My house has 21 zones and I use openHAB to control all the dampers, and CT100 Z-Wave stats.

Hello,
That sounds excellent. Would you care to elaborate a little on your setup? More specifically I am interested in how you control the dampers as well which Z-Wave controller you use and how you interface it with your OpenHAB server.
Thank you kindly.

I’m also interested.

Sure, I use dampers from RetroZone connected to PoScope PoKeys57e modules that are connected to PoExtBusRe relay boards. For stats I use 2gig ct100 and Aeotec ZW090 Z Stick.

I have one PoKeys57e for each floor (+ a few others in the house) they not only drive the dampers, but also provide 55 I/O pins that I use mostly for contact sensors. openHAB talks to them over the modbus binding.

3 Likes

Hi Nathan,
Would you be willing to share your control code? I’m planning on doing pretty much exactly the same thing and would like to avoid re-inventing the wheel if possible.

Please see my post in this thread for what I’m trying to achieve: HVAC Framework - Thermostat Preview

I’ve been googling for days and haven’t found any open source code covering zone control, which is surprising as I thought there’d be many more people doing this.
Thanks!

I am not a programmer, so I am embarrassed to share it since I know it could be simplified. Each thermostat temp, heat setpoint, cool setpoint, and mode state are part of a group for each floor named Foo, Bar, and Baz. The group from each floor allows me to reconfigure my dampers any time there is a temp change in a room, mode of the thermostat changes, or someone changes the heat or cool setpoints.

hvac.rules:

rule "Basement Dampers"
when
  Item Foo changed  
then
  // Heat Basement
  if (Basement_Tstat_HeatSetPoint.state > Basement_Tstat_Temperature.state) {
    if (Basement_Tstat_Temperature.state > Basement_HVAC_Supply.state) {
      sendCommand(Basement_Damper, ON)
    } else {
      sendCommand(Basement_Damper, OFF)
    }
  // Cool Basement
  } else if (Basement_Tstat_CoolSetPoint.state < Basement_Tstat_Temperature.state) {
    if (Basement_Tstat_Temperature.state < Basement_HVAC_Supply.state) {
      sendCommand(Basement_Damper, ON)
    } else {
      sendCommand(Basement_Damper, OFF)
    }
  } else {
    sendCommand(Basement_Damper, ON)
  }

  // Heat Office
  if (Office_Tstat_HeatSetPoint.state > Office_Tstat_Temperature.state) {
    if (Office_Tstat_Temperature.state > Basement_HVAC_Supply.state) {
      sendCommand(Office_Damper, ON)
    } else {
      sendCommand(Office_Damper, OFF)
    }
  // Cool Office
  } else if (Office_Tstat_CoolSetPoint.state < Office_Tstat_Temperature.state) {
    if (Office_Tstat_Temperature.state < Basement_HVAC_Supply.state) {
      sendCommand(Office_Damper, ON)
    } else {
      sendCommand(Office_Damper, OFF)
    }
  } else {
    sendCommand(Office_Damper, ON)
  }

  // Heat Shop
  if (Shop_Tstat_HeatSetPoint.state > Shop_Tstat_Temperature.state) {
    if (Shop_Tstat_Temperature.state > Basement_HVAC_Supply.state) {
      sendCommand(Shop_Damper, ON)
    } else {
      sendCommand(Shop_Damper, OFF)
    }
  // Cool Shop
  } else if (Shop_Tstat_CoolSetPoint.state < Shop_Tstat_Temperature.state) {
    if (Shop_Tstat_Temperature.state < Basement_HVAC_Supply.state) {
      sendCommand(Shop_Damper, ON)
    } else {
      sendCommand(Shop_Damper, OFF)
    }
  } else {
    sendCommand(Shop_Damper, ON)
  }

  // Heat Electric_Room
  if (Electric_Room_Tstat_HeatSetPoint.state > Electric_Room_Tstat_Temperature.state) {
    if (Electric_Room_Tstat_Temperature.state > Basement_HVAC_Supply.state) {
      sendCommand(Electric_Room_Damper, ON)
    } else {
      sendCommand(Electric_Room_Damper, OFF)
    }
  // Cool Electric_Room
  } else if (Electric_Room_Tstat_CoolSetPoint.state < Electric_Room_Tstat_Temperature.state) {
    if (Electric_Room_Tstat_Temperature.state < Basement_HVAC_Supply.state) {
      sendCommand(Electric_Room_Damper, ON)
    } else {
      sendCommand(Electric_Room_Damper, OFF)
    }
  } else {
    sendCommand(Electric_Room_Damper, ON)
  }
 
  // Heat Water_Room
  if (Water_Room_Tstat_HeatSetPoint.state > Water_Room_Tstat_Temperature.state) {
    if (Water_Room_Tstat_Temperature.state > Basement_HVAC_Supply.state) {
      sendCommand(Water_Room_Damper, ON)
    } else {
      sendCommand(Water_Room_Damper, OFF)
    }
  // Cool Water_Room
  } else if (Water_Room_Tstat_CoolSetPoint.state < Water_Room_Tstat_Temperature.state) {
    if (Water_Room_Tstat_Temperature.state < Basement_HVAC_Supply.state) {
    } else {
      sendCommand(Water_Room_Damper, OFF)
    }
  } else {
    sendCommand(Water_Room_Damper, ON)
  }

  // Heat Basement_Storage
  if (Basement_Storage_Tstat_HeatSetPoint.state > Basement_Storage_Tstat_Temperature.state) {
    if (Basement_Storage_Tstat_Temperature.state > Basement_HVAC_Supply.state) {
      sendCommand(Basement_Storage_Damper, ON)
    } else {
      sendCommand(Basement_Storage_Damper, OFF)
    }
  // Cool Basement_Storage
  } else if (Basement_Storage_Tstat_CoolSetPoint.state < Basement_Storage_Tstat_Temperature.state) {
    if (Basement_Storage_Tstat_Temperature.state < Basement_HVAC_Supply.state) {
      sendCommand(Basement_Storage_Damper, ON)
    } else {
      sendCommand(Basement_Storage_Damper, OFF)
    }
  } else {
    sendCommand(Basement_Storage_Damper, OFF)
  } 
end


rule "First FLoor Dampers"
when
  Item Bar changed
then
  // Heat First_Floor
  if (First_Floor_Tstat_HeatSetPoint.state > First_Floor_Tstat_Temperature.state) {
    if (First_Floor_Tstat_Temperature.state > First_Floor_HVAC_Supply.state) {
      sendCommand(First_Floor_Damper, ON)
    } else {
      sendCommand(First_Floor_Damper, OFF)
    }
  // Cool First_Floor
  } else if (First_Floor_Tstat_CoolSetPoint.state < First_Floor_Tstat_Temperature.state) {
    if (First_Floor_Tstat_Temperature.state < First_Floor_HVAC_Supply.state) {
      sendCommand(First_Floor_Damper, ON)
    } else {
      sendCommand(First_Floor_Damper, OFF)
    }
  } else {
    sendCommand(First_Floor_Damper, ON)
  }

  // Heat Living_Room
  if (Living_Room_Tstat_HeatSetPoint.state > Living_Room_Tstat_Temperature.state) {
    if (Living_Room_Tstat_Temperature.state > First_Floor_HVAC_Supply.state) {
      sendCommand(Living_Room_Damper, ON)
    } else {
      sendCommand(Living_Room_Damper, OFF)
    }
  // Cool Living_Room
  } else if (Living_Room_Tstat_CoolSetPoint.state < Living_Room_Tstat_Temperature.state) {
    if (Living_Room_Tstat_Temperature.state < First_Floor_HVAC_Supply.state) {
      sendCommand(Living_Room_Damper, ON)
    } else {
      sendCommand(Living_Room_Damper, OFF)
    }
  } else {
    sendCommand(Living_Room_Damper, ON)
  }

  // Heat Master_Bedroom
  if (Master_Bedroom_Tstat_HeatSetPoint.state > Master_Bedroom_Tstat_Temperature.state) {
    if (Master_Bedroom_Tstat_Temperature.state > First_Floor_HVAC_Supply.state) {
      sendCommand(Master_Bedroom_Damper, ON)
    } else {
      sendCommand(Master_Bedroom_Damper, OFF)
    }
  // Cool Master_Bedroom
  } else if (Master_Bedroom_Tstat_CoolSetPoint.state < Master_Bedroom_Tstat_Temperature.state) {
    if (Master_Bedroom_Tstat_Temperature.state < First_Floor_HVAC_Supply.state) {
      sendCommand(Master_Bedroom_Damper, ON)
    } else {
      sendCommand(Master_Bedroom_Damper, OFF)
    }
  } else {
    sendCommand(Master_Bedroom_Damper, ON)
  }


  // Heat Guest_Bedroom
  if (Guest_Bedroom_Tstat_HeatSetPoint.state > Guest_Bedroom_Tstat_Temperature.state) {
    if (Guest_Bedroom_Tstat_Temperature.state > First_Floor_HVAC_Supply.state) {
      sendCommand(Guest_Bedroom_Damper, ON)
    } else {
      sendCommand(Guest_Bedroom_Damper, OFF)
    }
  // Cool Guest_Bedroom
  } else if (Guest_Bedroom_Tstat_CoolSetPoint.state < Guest_Bedroom_Tstat_Temperature.state) {
    if (Guest_Bedroom_Tstat_Temperature.state < First_Floor_HVAC_Supply.state) {
      sendCommand(Guest_Bedroom_Damper, ON)
    } else {
      sendCommand(Guest_Bedroom_Damper, OFF)
    }
  } else {
    sendCommand(Guest_Bedroom_Damper, ON)
  }

  // Heat Kitchen
  if (Kitchen_Tstat_HeatSetPoint.state > Kitchen_Tstat_Temperature.state) {
    if (Kitchen_Tstat_Temperature.state > First_Floor_HVAC_Supply.state) {
      sendCommand(Kitchen_Damper, ON)
    } else {
      sendCommand(Kitchen_Damper, OFF)
    }
  // Cool Kitchen
  } else if (Kitchen_Tstat_CoolSetPoint.state < Kitchen_Tstat_Temperature.state) {
    if (Kitchen_Tstat_Temperature.state < First_Floor_HVAC_Supply.state) {
      sendCommand(Kitchen_Damper, ON)
    } else {
      sendCommand(Kitchen_Damper, OFF)
    }
  } else {
    sendCommand(Kitchen_Damper, ON)
  }
end


rule "Second FLoor Dampers"
when
  Item Baz changed
then
  // Heat Second_Floor
  if (Second_Floor_Tstat_HeatSetPoint.state > Second_Floor_Tstat_Temperature.state) {
    if (Second_Floor_Tstat_Temperature.state > Second_Floor_HVAC_Supply.state) {
      sendCommand(Second_Floor_Damper, ON)
    } else {
      sendCommand(Second_Floor_Damper, OFF)
    }
  // Cool Second_Floor
  } else if (Second_Floor_Tstat_CoolSetPoint.state < Second_Floor_Tstat_Temperature.state) {
    if (Second_Floor_Tstat_Temperature.state < Second_Floor_HVAC_Supply.state) {
      sendCommand(Second_Floor_Damper, ON)
    } else {
      sendCommand(Second_Floor_Damper, OFF)
    }
  } else {
    sendCommand(Second_Floor_Damper, OFF)
  } 


  // Heat Great_Room
  if (Great_Room_Tstat_HeatSetPoint.state > Great_Room_Tstat_Temperature.state) {
    if (Great_Room_Tstat_Temperature.state > Second_Floor_HVAC_Supply.state) {
      sendCommand(Great_Room_Damper, ON)
    } else {
      sendCommand(Great_Room_Damper, OFF)
    }
  // Cool Great_Room
  } else if (Great_Room_Tstat_CoolSetPoint.state < Great_Room_Tstat_Temperature.state) {
    if (Great_Room_Tstat_Temperature.state < Second_Floor_HVAC_Supply.state) {
      sendCommand(Great_Room_Damper, ON)
    } else {
      sendCommand(Great_Room_Damper, OFF)
    }
  } else {
    sendCommand(Great_Room_Damper, ON)
  }


  // Heat Emma_Bedroom
  if (Emma_Bedroom_Tstat_HeatSetPoint.state > Emma_Bedroom_Tstat_Temperature.state) {
    if (Emma_Bedroom_Tstat_Temperature.state > Second_Floor_HVAC_Supply.state) {
      sendCommand(Emma_Bedroom_Damper, ON)
    } else {
      sendCommand(Emma_Bedroom_Damper, OFF)
    }
  // Cool Emma_Bedroom
  } else if (Emma_Bedroom_Tstat_CoolSetPoint.state < Emma_Bedroom_Tstat_Temperature.state) {
    if (Emma_Bedroom_Tstat_Temperature.state < Second_Floor_HVAC_Supply.state) {
      sendCommand(Emma_Bedroom_Damper, ON)
    } else {
      sendCommand(Emma_Bedroom_Damper, OFF)
    }
  } else {
    sendCommand(Emma_Bedroom_Damper, ON)
  }


  // Heat Joshua_Bedroom
  if (Joshua_Bedroom_Tstat_HeatSetPoint.state > Joshua_Bedroom_Tstat_Temperature.state) {
    if (Joshua_Bedroom_Tstat_Temperature.state > Second_Floor_HVAC_Supply.state) {
      sendCommand(Joshua_Bedroom_Damper, ON)
    } else {
      sendCommand(Joshua_Bedroom_Damper, OFF)
    }
  // Cool Joshua_Bedroom
  } else if (Joshua_Bedroom_Tstat_CoolSetPoint.state < Joshua_Bedroom_Tstat_Temperature.state) {
    if (Joshua_Bedroom_Tstat_Temperature.state < Second_Floor_HVAC_Supply.state) {
      sendCommand(Joshua_Bedroom_Damper, ON)
    } else {
      sendCommand(Joshua_Bedroom_Damper, OFF)
    }
  } else {
    sendCommand(Joshua_Bedroom_Damper, ON)
  }

  // Heat Breezeway
  if (Breezeway_Tstat_HeatSetPoint.state > Breezeway_Tstat_Temperature.state) {
    if (Breezeway_Tstat_Temperature.state > Second_Floor_HVAC_Supply.state) {
      sendCommand(Breezeway_Damper, ON)
    } else {
      sendCommand(Breezeway_Damper, OFF)
    }
  // Cool Breezeway
  } else if (Breezeway_Tstat_CoolSetPoint.state < Breezeway_Tstat_Temperature.state) {
    if (Breezeway_Tstat_Temperature.state < Second_Floor_HVAC_Supply.state) {
      sendCommand(Breezeway_Damper, ON)
    } else {
      sendCommand(Breezeway_Damper, OFF)
    }
  } else {
    sendCommand(Breezeway_Damper, ON)
  }

  // Heat Apartment
  if (Apartment_Tstat_HeatSetPoint.state > Apartment_Tstat_Temperature.state) {
    if (Apartment_Tstat_Temperature.state > Second_Floor_HVAC_Supply.state) {
      sendCommand(Apartment_Damper, ON)
    } else {
      sendCommand(Apartment_Damper, OFF)
    }
  // Cool Apartment
  } else if (Apartment_Tstat_CoolSetPoint.state < Apartment_Tstat_Temperature.state) {
    if (Apartment_Tstat_Temperature.state < Second_Floor_HVAC_Supply.state) {
      sendCommand(Apartment_Damper, ON)
    } else {
      sendCommand(Apartment_Damper, OFF)
    }
  } else {
    sendCommand(Apartment_Damper, ON)
  }

  // Heat Mom_Bedroom
  if (Mom_Bedroom_Tstat_HeatSetPoint.state > Mom_Bedroom_Tstat_Temperature.state) {
    if (Mom_Bedroom_Tstat_Temperature.state > Second_Floor_HVAC_Supply.state) {
      sendCommand(Mom_Bedroom_Damper, ON)
    } else {
      sendCommand(Mom_Bedroom_Damper, OFF)
    }
  // Cool Mom_Bedroom
  } else if (Mom_Bedroom_Tstat_CoolSetPoint.state < Mom_Bedroom_Tstat_Temperature.state) {
    if (Mom_Bedroom_Tstat_Temperature.state < Second_Floor_HVAC_Supply.state) {
      sendCommand(Mom_Bedroom_Damper, ON)
    } else {
      sendCommand(Mom_Bedroom_Damper, OFF)
    }
  } else {
    sendCommand(Mom_Bedroom_Damper, ON)
  }

  // Heat Dad_Bedroom
  if (Dad_Bedroom_Tstat_HeatSetPoint.state > Dad_Bedroom_Tstat_Temperature.state) {
    if (Dad_Bedroom_Tstat_Temperature.state > Second_Floor_HVAC_Supply.state) {
      sendCommand(Dad_Bedroom_Damper, ON)
    } else {
      sendCommand(Dad_Bedroom_Damper, OFF)
    }
  // Cool Dad_Bedroom
  } else if (Dad_Bedroom_Tstat_CoolSetPoint.state < Dad_Bedroom_Tstat_Temperature.state) {
    if (Dad_Bedroom_Tstat_Temperature.state < Second_Floor_HVAC_Supply.state) {
      sendCommand(Dad_Bedroom_Damper, ON)
    } else {
      sendCommand(Dad_Bedroom_Damper, OFF)
    }
  } else {
    sendCommand(Dad_Bedroom_Damper, ON)
  }
end


rule "HVAC_Delta"
when
  Time cron "0 * * * * ?"
then  
  postUpdate(Basement_HVAC_Delta, (Basement_HVAC_Supply.state as Number) - (Basement_HVAC_Return.state as Number))
  postUpdate(First_Floor_HVAC_Delta, (First_Floor_HVAC_Supply.state as Number) - (First_Floor_HVAC_Return.state as Number))
  postUpdate(Second_Floor_HVAC_Delta, (Second_Floor_HVAC_Supply.state as Number) - (Second_Floor_HVAC_Return.state as Number))
end

zwave-thermostat.items for basement looks like this, first and second floor look the same but I left them out since the file was too large to paste.

// Basement
Group:Number:SUM Foo                                                                                                  (ALL)

// HVAC Controller Zone 1
Group     Tstat10                                                                                                     (Thermotats)
Group     Tstat10_Chart                                                                                               (Tstat10)
Number    Basement_Tstat_HeatSetPoint         "Basement Heat Setpoint [%.1f °F]"                      <temperature>   (Tstat10, Foo)                                                    {channel="zwave:rtc_ct100_00_000:controller:node19:thermostat_setpoint_heating"}
Number    Basement_Tstat_CoolSetPoint         "Basement Cool Setpoint [%.1f °F]"                      <temperature>   (Tstat10, Foo)                                                    {channel="zwave:rtc_ct100_00_000:controller:node19:thermostat_setpoint_cooling"}
Number    Basement_Tstat_Temperature          "Basement Temperature [%.1f °F]"                        <temperature>   (Tstat10_Chart, Room_Temperature, Foo)                            {channel="zwave:rtc_ct100_00_000:controller:node19:sensor_temperature"}
Number    Basement_Tstat_Humidity             "Basement Humidity [%.1f %%]"                           <humidity>      (Tstat10_Chart, Humidity)                                         {channel="zwave:rtc_ct100_00_000:controller:node19:sensor_relhumidity2"}
Number    Basement_Tstat_OpMode               "Basement Mode []"                                      <settings>      (Tstat10)                                                         {channel="zwave:rtc_ct100_00_000:controller:node19:thermostat_mode"}
Number    Basement_Tstat_ModeState            "Basement State [MAP(ct100.map):%s]"                    <settings>      (Tstat10, Foo)                                                    {channel="zwave:rtc_ct100_00_000:controller:node19:thermostat_state"}
Number    Basement_Tstat_Battery              "Basement Thermostat Battery [%d %%]"                   <battery>       (Tstat10, Battery)                                                {channel="zwave:rtc_ct100_00_000:controller:node19:battery-level"}
DateTime  Basement_Tstat_Clock                                                                                        (Tstat10, Clock)                                                  {channel="zwave:rtc_ct100_00_000:controller:node19:time_offset"}

// HVAC Controller Zone 2
Group     Tstat11                                                                                                     (Thermostats)
Group     Tstat11_Chart                                                                                               (Tstat11)
Number    Office_Tstat_HeatSetPoint           "Office Heat Setpoint [%.1f °F]"                        <temperature>   (Tstat11, Foo)                                                    {channel="zwave:rtc_ct100_00_000:controller:node16:thermostat_setpoint_heating"}
Number    Office_Tstat_CoolSetPoint           "Office Cool Setpoint [%.1f °F]"                        <temperature>   (Tstag11, Foo)                                                    {channel="zwave:rtc_ct100_00_000:controller:node16:thermostat_setpoint_cooling"}
Number    Office_Tstat_Temperature            "Office Temperature [%.1f °F]"                          <temperature>   (Tstat11_Chart, Room_Temperature, Foo)                            {channel="zwave:rtc_ct100_00_000:controller:node16:sensor_temperature"}
Number    Office_Tstat_Humidity               "Office Humidity [%.1f %%]"                             <humidity>      (Tstat11_Chart, Humidity)                                         {channel="zwave:rtc_ct100_00_000:controller:node16:sensor_relhumidity2"}
Number    Office_Tstat_OpMode                 "Office Mode []"                                        <settings>      (Tstat11)                                                         {channel="zwave:rtc_ct100_00_000:controller:node16:thermostat_mode"}
Number    Office_Tstat_ModeState              "Office State [MAP(ct100.map):%s]"                      <settings>      (Tstat11, Foo)                                                    {channel="zwave:rtc_ct100_00_000:controller:node16:thermostat_state"}
Number    Office_Tstat_Battery                "Office Thermostat Battery [%d %%]"                     <battery>       (Tstat11, Battery)                                                {channel="zwave:rtc_ct100_00_000:controller:node16:battery-level"}
DateTime  Office_Tstat_Clock                                                                                          (Tstat11, Clock)                                                  {channel="zwave:rtc_ct100_00_000:controller:node16:time_offset"}

// HVAC Controller Zone 3
Group     Tstat12                                                                                                     (Thermostats)
Group     Tstat12_Chart                                                                                               (Tstat12)
Number    Shop_Tstat_HeatSetPoint             "Shop Heat Setpoint [%.1f °F]"                          <temperature>   (Tstat12, Foo)                                                    {channel="zwave:rtc_ct100_00_000:controller:node20:thermostat_setpoint_heating"}
Number    Shop_Tstat_CoolSetPoint             "Shop Cool Setpoint [%.1f °F]"                          <temperature>   (Tstat12, Foo)                                                    {channel="zwave:rtc_ct100_00_000:controller:node20:thermostat_setpoint_cooling"}
Number    Shop_Tstat_Temperature              "Shop Temperature [%.1f °F]"                            <temperature>   (Tstat12_Chart, Room_Temperature, Foo)                            {channel="zwave:rtc_ct100_00_000:controller:node20:sensor_temperature"}
Number    Shop_Tstat_Humidity                 "Shop Humidity [%.1f %%]"                               <humidity>      (Tstat12_Chart, Humidity)                                         {channel="zwave:rtc_ct100_00_000:controller:node20:sensor_relhumidity2"}
Number    Shop_Tstat_OpMode                   "Shop Mode []"                                          <settings>      (Tstat12)                                                         {channel="zwave:rtc_ct100_00_000:controller:node20:thermostat_mode"}
Number    Shop_Tstat_ModeState                "Shop State [MAP(ct100.map):%s]"                        <settings>      (Tstat12, Foo)                                                    {channel="zwave:rtc_ct100_00_000:controller:node20:thermostat_state"}
Number    Shop_Tstat_Battery                  "Shop Thermostat Battery [%d %%]"                       <battery>       (Tstat12, Battery)                                                {channel="zwave:rtc_ct100_00_000:controller:node20:battery-level"}
DateTime  Shop_Tstat_Clock                                                                                            (Tstat12, Clock)                                                  {channel="zwave:rtc_ct100_00_000:controller:node20:time_offset"}

Group     Tstat13                                                                                                     (Thermostats)
Group     Tstat13_Chart                                                                                               (Tstat13)
Number    Electric_Room_Tstat_HeatSetPoint    "Electric Room Heat Setpoint [%.1f °F]"                 <temperature>   (Tstat13, Foo)                                                    {channel="zwave:rtc_ct100_00_000:controller:node17:thermostat_setpoint_heating"}
Number    Electric_Room_Tstat_CoolSetPoint    "Electric Room Cool Setpoint [%.1f °F]"                 <temperature>   (Tstat13, Foo)                                                    {channel="zwave:rtc_ct100_00_000:controller:node17:thermostat_setpoint_cooling"}
Number    Electric_Room_Tstat_Temperature     "Electric Room Temperature [%.1f °F]"                   <temperature>   (Tstat13_Chart, Room_Temperature, Foo)                            {channel="zwave:rtc_ct100_00_000:controller:node17:sensor_temperature"}
Number    Electric_Room_Tstat_Humidity        "Electric Room Humidity [%.1f %%]"                      <humidity>      (Tstat13_Chart, Humidity)                                         {channel="zwave:rtc_ct100_00_000:controller:node17:sensor_relhumidity2"}
Number    Electric_Room_Tstat_OpMode          "Electric Room Mode []"                                 <settings>      (Tstat13)                                                         {channel="zwave:rtc_ct100_00_000:controller:node17:thermostat_mode"}
Number    Electric_Room_Tstat_ModeState       "Electric Room State [MAP(ct100.map):%s]"               <settings>      (Tstat13, Foo)                                                    {channel="zwave:rtc_ct100_00_000:controller:node17:thermostat_state"}
Number    Electric_Room_Tstat_Battery         "Electric Room Thermostat Battery [%d %%]"              <battery>       (Tstat13, Battery)                                                {channel="zwave:rtc_ct100_00_000:controller:node17:battery-level"}
DateTime  Electric_Room_Tstat_Clock                                                                                   (Tstat13, Clock)                                                  {channel="zwave:rtc_ct100_00_000:controller:node17:time_offset"}

Group     Tstat14                                                                                                     (Thermostats)
Group     Tstat14_Chart                                                                                               (Tstat14)
Number    Water_Room_Tstat_HeatSetPoint       "Water Room Heat Setpoint [%.1f °F]"                    <temperature>   (Tstat14, Foo)                                                    {channel="zwave:rtc_ct100_00_000:controller:node21:thermostat_setpoint_heating"}
Number    Water_Room_Tstat_CoolSetPoint       "Water Room Cool Setpoint [%.1f °F]"                    <temperature>   (Tstat14, Foo)                                                    {channel="zwave:rtc_ct100_00_000:controller:node21:thermostat_setpoint_cooling"}
Number    Water_Room_Tstat_Temperature        "Water Room Temperature [%.1f °F]"                      <temperature>   (Tstat14_Chart, Room_Temperature, Foo)                            {channel="zwave:rtc_ct100_00_000:controller:node21:sensor_temperature"}
Number    Water_Room_Tstat_Humidity           "Water Room Humidity [%.1f %%]"                         <humidity>      (Tstat14_Chart, Humidity)                                         {channel="zwave:rtc_ct100_00_000:controller:node21:sensor_relhumidity2"}
Number    Water_Room_Tstat_OpMode             "Water Room Mode []"                                    <settings>      (Tstat14)                                                         {channel="zwave:rtc_ct100_00_000:controller:node21:thermostat_mode"}
Number    Water_Room_Tstat_ModeState          "Water Room State [MAP(ct100.map):%s]"                  <settings>      (Tstat14, Foo)                                                    {channel="zwave:rtc_ct100_00_000:controller:node21:thermostat_state"}
Number    Water_Room_Tstat_Battery            "Water Room Thermostat Battery [%d %%]"                 <battery>       (Tstat14, Battery)                                                {channel="zwave:rtc_ct100_00_000:controller:node21:battery-level"}
DateTime  Water_Room_Tstat_Clock                                                                                      (Tstat14, Clock)                                                  {channel="zwave:rtc_ct100_00_000:controller:node21:time_offset"}

Group     Tstat15                                                                                                     (Thermostats)
Group     Tstat15_Chart                                                                                               (Tstat15)
Number    Basement_Storage_Tstat_HeatSetPoint "Basement Storage Heat Setpoint [%.1f °F]"              <temperature>   (Tstat15, Foo)                                                    {channel="zwave:rtc_ct100_00_000:controller:node18:thermostat_setpoint_heating"}
Number    Basement_Storage_Tstat_CoolSetPoint "Basement Storage Cool Setpoint [%.1f °F]"              <temperature>   (Tstat15, Foo)                                                    {channel="zwave:rtc_ct100_00_000:controller:node18:thermostat_setpoint_cooling"}
Number    Basement_Storage_Tstat_Temperature  "Basement Storage Temperature [%.1f °F]"                <temperature>   (Tstat15_Chart, Room_Temperature, Foo)                            {channel="zwave:rtc_ct100_00_000:controller:node18:sensor_temperature"}
Number    Basement_Storage_Tstat_Humidity     "Basement Storage Humidity [%.1f %%]"                   <humidity>      (Tstat15_Chart, Humidity)                                         {channel="zwave:rtc_ct100_00_000:controller:node18:sensor_relhumidity2"}
Number    Basement_Storage_Tstat_OpMode       "Basement Storage Mode []"                              <settings>      (Tstat15)                                                         {channel="zwave:rtc_ct100_00_000:controller:node18:thermostat_mode"}
Number    Basement_Storage_Tstat_ModeState    "Basement Storage State [MAP(ct100.map):%s]"            <settings>      (Tstat15, Foo)                                                    {channel="zwave:rtc_ct100_00_000:controller:node18:thermostat_state"}
Number    Basement_Storage_Tstat_Battery      "Basement Storage Thermostat Battery [%d %%]"           <battery>       (Tstat15, Battery)                                                {channel="zwave:rtc_ct100_00_000:controller:node18:battery-level"}
DateTime  Basement_Storage_Tstat_Clock                                                                                (Tstat15, Clock)                                                  {channel="zwave:rtc_ct100_00_000:controller:node18:time_offset"}

Group     Tstat16                                                                                                     (Thermostats)
Group     Tstat16_Chart                                                                                               (Tstat16)
Number    Garage_Tstat_Temperature            "Garage Temperature [%.1f °F]"                          <temperature>   (Tstat16_Chart, Temperature)                                      {channel="zwave:rtc_ct100_00_000:controller:node7:sensor_temperature"}
Number    Garage_Tstat_Humidity               "Garage Humidity [%.1f %%]"                             <humidity>      (Tstat16_Chart, Humidity)                                         {channel="zwave:rtc_ct100_00_000:controller:node7:sensor_relhumidity2"}
Number    Garage_Tstat_Battery                "Garage Thermostat Battery [%d %%]"                     <battery>       (Tstat16, Battery)                                                {channel="zwave:rtc_ct100_00_000:controller:node7:battery-level"}
DateTime  Garage_Tstat_Clock                                                                                          (Tstat16, Clock)                                                  {channel="zwave:rtc_ct100_00_000:controller:node7:time_offset"}

Thanks very much!

Very helpful.