Z wave Binding Examples CT100 - jfederico/openhab GitHub Wiki

This page is an attempt to creating a complete working example of CT100 Thermostat support. I found the parent page only had items so was missing the needed transforms and rules. I also did not want to accidentally break formatting for other entries.

Items

items/CT100.items

Group gHVAC "Heat Pump" (All)

Number HVAC_HeatSetPoint "Heat Set [%.0f F]" <temperature> (gHVAC) {zwave="2:command=thermostat_setpoint,setpoint_type=1,setpoint_scale=1,refresh_interval=20" }
Number HVAC_CoolSetPoint "Cool Set [%.0f F]" <temperature> (gHVAC) {zwave="2:command=thermostat_setpoint,setpoint_type=2,setpoint_scale=1,refresh_interval=20" }
Number HVAC_Temperature "Temperature [%.1f F]" <temperature> (gHVAC) {zwave="2:1:command=sensor_multilevel,sensor_type=1,refresh_interval=60" }
Number HVAC_Humidity "Rel Humidity [%.1f %%]" <temperature> (gHVAC) {zwave="2:2:command=sensor_multilevel,sensor_type=5,refresh_interval=60" }
Number HVAC_Mode "Mode [MAP(thermostatMode.map):%d]" (gHVAC) {zwave="2:command=thermostat_mode,refresh_interval=60" }
Number HVAC_Fan_Mode "Fan Mode [MAP(thermostatFanMode.map):%d]" (gHVAC) {zwave="2:command=thermostat_fan_mode,refresh_interval=60" }
Number HVAC_Operating_State "Op State [MAP(thermostatOpState.map):%d]" (gHVAC) {zwave="2:command=thermostat_operating_state,refresh_interval=20" }
Number HVAC_Fan_State "Fan State [MAP(thermostatFanState.map):%d]" (gHVAC) {zwave="2:command=thermostat_fan_state,refresh_interval=20" }
Number HVAC_Battery "Battery State [%d %%]" (gHVAC) {zwave="2:command=BATTERY,refresh_interval=300"}

Note: In My system the CT100 was the first device (after the Z-Stick) so it is NODE 2, in your system you will need to update the NODE to match your configuration. (zwave="2:command...)

Transform files

You will notice that the above items reference 4 different map files. I did find 2 of them mentioned in forum posts but the others I have made up as I go...

transform/thermostatMode.map

-1=Unintialized
0=Off
1=Heat
2=Cool
3=Auto
4=Aux Heat
5=Resume
6=Fan Only
7=Furnace
8=Dry Air
9=Moist Air
10=Auto Changeover
11=Heat Eco
12=Cool Eco
13=Away

transform/thermostatOpState.map

-=Uninitialized
0=Idle
1=Heating
2=Cooling
3=Fan Only
4=Pending Heat
5=Pending Cool
6=Vent / Economizer

transform/thermostatFanMode.map

-=Uninitialized
0=Auto
1=On
2=Two
3=Three
4=Four
5=Five
6=Six

I am fairly sure only 0 and 1 are used, the extra ones are just fillers in case I am wrong. I could not find any documentation verifying this.

transform/thermostatFanState.map

-=Uninitialized
0=Off
1=On
2=Two
3=Three
4=Four
5=Five
6=Six

Again, I am fairly sure only 0 and 1 are used.

Rules

So far I only have a rule that turns on the Fan if the system has been idle for an hour. A simple effort to keep the air an even temperature/humidity in the house. Here in Florida this will typically only happen late at night.

import org.openhab.model.script.actions.Timer

val String PATTERN = "HH:mm "
var Timer timerFanIdle = null
var Timer timerFanCirculate = null
var Integer ruleRunning = 0

rule "Idle Fan"
when
    Item HVAC_Fan_State changed to 0
then
    var String ts = now.toString(PATTERN)
    if (timerFanIdle != null) {
      timerFanIdle.cancel
      timerFanIdle = null
    }
    if (timerFanCirculate != null) {
      timerFanCirculate.cancel
      timerFanCirculate = null
    }
    timerFanIdle = createTimer(now.plusMinutes(60)) [|
        ts = now.toString(PATTERN)
        ruleRunning = 1
  	    sendCommand(HVAC_Fan_Mode, 1)
        sendBroadcastNotification(ts + "Run Fan to circulate")
        timerFanCirculate = createTimer(now.plusMinutes(15)) [|
                ts = now.toString(PATTERN)
          	sendCommand(HVAC_Fan_Mode, 0)
        	ruleRunning = 0 ]
        ]
     }
end

rule "Running Fan"
when
    Item HVAC_Fan_State changed to 1
then
    var String ts = now.toString(PATTERN)
    if (ruleRunning == 0) {
      if (timerFanIdle != null) {
        timerFanIdle.cancel
        timerFanIdle = null
      }
      if (timerFanCirculate != null) {
        timerFanCirculate.cancel
        timerFanCirculate = null
      }
    }