[Release] Secure SSR303 (Horstmann ASR-ZW) Boiler switch/relay

Here’s a modififcation of the standard Smartthings z-wave device handler for use with the Secure SSR303 (also known as Horstmann ASR-ZW) boiler switch.

This is a dry contact relay. It’s a z-wave switch but identifies as a thermostat. I’ve modified the standard template to take issue thermostat command instead of the standard switch commands in order to turn this switch on and off. It has no other functionality.

Fingerprint also updated so that it is identified once the device handler has been installed via the IDE and you connect it to ST as a thing.

Full details can be found here:
http://www.vesternet.com/z-wave-horstmann-z-wave-controlled-boiler-receiver-hrt

Manual here: http://www.vesternet.com/downloads/dl/file/id/519/product/502/z_wave_secure_boiler_receiver_hrt_manual.pdf

Note that I think this device is available in the EU only.

/**
 *  Copyright 2015 SmartThings
 *
 *  Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except
 *  in compliance with the License. You may obtain a copy of the License at:
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 *  Unless required by applicable law or agreed to in writing, software distributed under the License is distributed
 *  on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License
 *  for the specific language governing permissions and limitations under the License.
 *
 *  Device Handler for a Secure SSR303 (aka Horstmann ASR-ZW) Boiler switch
 *
 *  Standard ST Z-Wave switch modified to turn this device on and off. This device identified as a Thermostat (as opposed to a switch).
 *
 *  http://www.vesternet.com/z-wave-horstmann-z-wave-controlled-boiler-receiver-hrt
 *
 *  Note that the Horstmann HRT4-ZW and the ASR-ZW are being sold today as a 'Secure SRT321' (Thermostat) and 'Secure SSR303' (relay switch). 
 *  This DH allows the relay switch to be controlled directly by ST. To clarify, this DH is for the ASR-ZW or the SSR303. 
 * 
 */
metadata {
	definition (name: "Horstmann HRT4-ZW", namespace: "smartthings", author: "SmartThings") {
		capability "Actuator"
		capability "Indicator"
 		capability "Switch"
		capability "Polling"
		capability "Refresh"
		capability "Sensor"

//		fingerprint mfr:"0063", prod:"4952", deviceJoinName: "Z-Wave Wall Switch"
//		fingerprint mfr:"0063", prod:"5257", deviceJoinName: "Z-Wave Wall Switch"
//		fingerprint mfr:"0063", prod:"5052", deviceJoinName: "Z-Wave Plug-In Switch"
//		fingerprint mfr:"0113", prod:"5257", deviceJoinName: "Z-Wave Wall Switch"
//      fingerprint mfr:"0113", prod:"5257", deviceJoinName: "Z-Wave Wall Switch"
      fingerprint mfr:"0059", prod:"0003", deviceJoinName: "Secure SSR303 Boiler Switch"

	}

	// simulator metadata
	simulator {
		status "on":  "command: 2003, payload: FF"
		status "off": "command: 2003, payload: 00"

		// reply messages
		reply "2001FF,delay 100,2502": "command: 2503, payload: FF"
		reply "200100,delay 100,2502": "command: 2503, payload: 00"
	}

	preferences {
		input "ledIndicator", "enum", title: "LED Indicator", description: "Turn LED indicator... ", required: false, options:["on": "When On", "off": "When Off", "never": "Never"], defaultValue: "off"
	}

	// tile definitions
	tiles(scale: 2) {
		multiAttributeTile(name:"switch", type: "lighting", width: 6, height: 4, canChangeIcon: true){
			tileAttribute ("device.switch", key: "PRIMARY_CONTROL") {
				attributeState "on", label: '${name}', action: "switch.off", icon: "st.switches.switch.on", backgroundColor: "#79b821"
				attributeState "off", label: '${name}', action: "switch.on", icon: "st.switches.switch.off", backgroundColor: "#ffffff"
			}
		}

		standardTile("indicator", "device.indicatorStatus", width: 2, height: 2, inactiveLabel: false, decoration: "flat") {
			state "when off", action:"indicator.indicatorWhenOn", icon:"st.indicators.lit-when-off"
			state "when on", action:"indicator.indicatorNever", icon:"st.indicators.lit-when-on"
			state "never", action:"indicator.indicatorWhenOff", icon:"st.indicators.never-lit"
		}
		standardTile("refresh", "device.switch", width: 2, height: 2, inactiveLabel: false, decoration: "flat") {
			state "default", label:'', action:"refresh.refresh", icon:"st.secondary.refresh"
		}

		main "switch"
		details(["switch","refresh"])
	}
}

def updated(){
  switch (ledIndicator) {
        case "on":
            indicatorWhenOn()
            break
        case "off":
            indicatorWhenOff()
            break
        case "never":
            indicatorNever()
            break
        default:
            indicatorWhenOn()
            break
    }
}

def parse(String description) {
	def result = null
	def cmd = zwave.parse(description, [0x20: 1, 0x70: 1])
	if (cmd) {
		result = createEvent(zwaveEvent(cmd))
	}
	if (result?.name == 'hail' && hubFirmwareLessThan("000.011.00602")) {
		result = [result, response(zwave.basicV1.basicGet())]
		log.debug "Was hailed: requesting state update"
	} else {
		log.debug "Parse returned ${result?.descriptionText}"
	}
	return result
}

def zwaveEvent(physicalgraph.zwave.commands.basicv1.BasicReport cmd) {
	[name: "switch", value: cmd.value ? "on" : "off", type: "physical"]
}

def zwaveEvent(physicalgraph.zwave.commands.basicv1.BasicSet cmd) {
	[name: "switch", value: cmd.value ? "on" : "off", type: "physical"]
}

def zwaveEvent(physicalgraph.zwave.commands.switchbinaryv1.SwitchBinaryReport cmd) {
	[name: "switch", value: cmd.value ? "on" : "off", type: "digital"]
}

def zwaveEvent(physicalgraph.zwave.commands.configurationv1.ConfigurationReport cmd) {
	def value = "when off"
	if (cmd.configurationValue[0] == 1) {value = "when on"}
	if (cmd.configurationValue[0] == 2) {value = "never"}
	[name: "indicatorStatus", value: value, display: false]
}

def zwaveEvent(physicalgraph.zwave.commands.hailv1.Hail cmd) {
	[name: "hail", value: "hail", descriptionText: "Switch button was pressed", displayed: false]
}

def zwaveEvent(physicalgraph.zwave.commands.manufacturerspecificv2.ManufacturerSpecificReport cmd) {
	log.debug "manufacturerId:   ${cmd.manufacturerId}"
	log.debug "manufacturerName: ${cmd.manufacturerName}"
	log.debug "productId:        ${cmd.productId}"
	log.debug "productTypeId:    ${cmd.productTypeId}"
	def msr = String.format("%04X-%04X-%04X", cmd.manufacturerId, cmd.productTypeId, cmd.productId)
	updateDataValue("MSR", msr)
	updateDataValue("manufacturer", cmd.manufacturerName)
	createEvent([descriptionText: "$device.displayName MSR: $msr", isStateChange: false])
}


def zwaveEvent(physicalgraph.zwave.Command cmd) {
	// Handles all Z-Wave commands we aren't interested in
	[:]
}

def on() {
	delayBetween([
		zwave.thermostatModeV2.thermostatModeSet(mode: 1).format(),
		zwave.thermostatModeV2.thermostatModeGet().format()
	], standardDelay)
}


/*

def off() {
	delayBetween([
		zwave.thermostatModeV2.thermostatModeSet(mode: 0).format(),
		zwave.thermostatModeV2.thermostatModeGet().format()
	], standardDelay)
    
    
    
    
def heat() {
	delayBetween([
		zwave.thermostatModeV2.thermostatModeSet(mode: 1).format(),
		zwave.thermostatModeV2.thermostatModeGet().format()
	], standardDelay)


old code:
		zwave.basicV1.basicSet(value: 0xFF).format(),
		zwave.switchBinaryV1.switchBinaryGet().format()
	])
    
*/


def off() {
	delayBetween([
		zwave.thermostatModeV2.thermostatModeSet(mode: 0).format(),
		zwave.thermostatModeV2.thermostatModeGet().format()
	], standardDelay)
}

def poll() {
	delayBetween([
		zwave.switchBinaryV1.switchBinaryGet().format(),
		zwave.manufacturerSpecificV1.manufacturerSpecificGet().format()
	])
}

def refresh() {
	delayBetween([
		zwave.switchBinaryV1.switchBinaryGet().format(),
		zwave.manufacturerSpecificV1.manufacturerSpecificGet().format()
	])
}

void indicatorWhenOn() {
	sendEvent(name: "indicatorStatus", value: "when on", display: false)
	sendHubCommand(new physicalgraph.device.HubAction(zwave.configurationV1.configurationSet(configurationValue: [1], parameterNumber: 3, size: 1).format()))
}

void indicatorWhenOff() {
	sendEvent(name: "indicatorStatus", value: "when off", display: false)
	sendHubCommand(new physicalgraph.device.HubAction(zwave.configurationV1.configurationSet(configurationValue: [0], parameterNumber: 3, size: 1).format()))
}

void indicatorNever() {
	sendEvent(name: "indicatorStatus", value: "never", display: false)
	sendHubCommand(new physicalgraph.device.HubAction(zwave.configurationV1.configurationSet(configurationValue: [2], parameterNumber: 3, size: 1).format()))
}

def invertSwitch(invert=true) {
	if (invert) {
		zwave.configurationV1.configurationSet(configurationValue: [1], parameterNumber: 4, size: 1).format()
	}
	else {
		zwave.configurationV1.configurationSet(configurationValue: [0], parameterNumber: 4, size: 1).format()
	}
}
3 Likes

You sir are a life saver! I’ve moved away from a Vera Plus environment to SmartThings and this had me on the lines. You’ve not only saved me a load of time but im one step closer to a full migration :grinning:

1 Like

Glad to help. Good bit of kit these things.

Out of interest, are you using them with a room stat?

I’m not no, I ‘Had’ Vera and PLEG grabbing all 8 temperature readings around the house, averaging them and then just using it as a on/off switch if it was > or < 22. Now in the SmartThings world I’ve just quickly got it to use the LivingRoom temperature sensor (Fibaro Multi) during the day mode and then the master bedroom during night to keep it at 22 degrees C, then away mode I let it drop to 18. Crude but working for now, and I was back to manual until your code hooked me up, so thanks again!

Not my code, just the default ST code ‘tweaked’. Reminds me I need to get my hands on another for the immersion :slight_smile:

I’ve got a couple of the STR321 thermostats which allow local control of the ASR-ZW. They work pretty well and mean the family can change the temp if needed (some will say that’s not a good thing).

Have a look at the link below if interested. All thanks to someone else writing some code:

I’ve made an observation with this after I eventually got around to configuring it to control a water recirculation pump. It turns out that if the actuator hasn’t seen the thermostat for 60 minutes then it enters a failsafe mode and turns off.

In my case I have the actuator in use as a z-wave relay without the thermostat to control the recirculation pump based on some simple CoRE logic. I therefore change the logic to turn the actuator on every 15 mins during the schedule to remove the failsafe issue.

Long time z-wave user, new Smartthings user; thanks for posting this!

Any idea how to put this switch into pairing mode to pair with smartthings? It’s still connected to my vera-lite atm and is the last item I have to move over!

Here you go:

Disconnecting from a network
To disconnect from a Z-wave network, follow the steps,below, also known as ‘exclusion’ in, Z-wave, terminology

  • Putthe3rdpartycontrollerintoexclusionmode.
  • PressandholdthenetworkbuttonontheSSR303.
  • The SSR303 has been excluded from the network
    when the Network LED starts flashing.

NOTE: If the Network LED does not flash the exclude process has been unsuccessful.

Thanks! I didn’t realise I needed to trigger the exclusion from the Vera / controller itself (I had tried holding the network button already)

I’m pretty sure I’ve done it without the controller myself. Try holding it down for a good amount of time.

Will do, thank you Sir!

1 Like

Update: I had to exclude it from the Vera Lite first, and then it worked. Thanks a million for the help!

No problem. Happy to help! Note the comment about the failsafe above if not using with a stat!

Yeah I used it with a Vera Lite for years and it was the same with that.

One thing I noticed today - if you physically hit the on switch, the status is not reflected in Smartthings. Even more dangerous is when you physically hit it, there is no fail safe.

So you could end up manually switching the heating on, leaving the house, and when you look at ST, it appears as off.

@brumster,

A little help if you would please.

I am migrating from Vera to Samsung Smartthings and most devices are working but I’m struggling with my HRT4-ZW thermostat and ASR-ZW switch.

I have installed your device handler and can now switch the ASR on and off in the Classic app, which is really good news. but in the new app i get the message “Can’t Connect to Device. Check Device and try again”.

I have installed the device Handler for the HRT Thermostat from @meavydev and that partly works.

The first thing is the Thermostat work nicely with the Classic ST app but again with the new app I get the message “Can’t Connect to Device. Check Device and try again”. I’m sure that I have seen it working once in the new app but now I get this message every time.

The second issue is, in the old app when I turn the thermostat up in the old app to call for heat the ASR doesn’t switch. In fact at the moment even turning the dial on the HRT doesnt switch the ASR. I am fairly sure that with Vera I had to “Associate” the HRT with the ASR. In the classic app I can see “Associated z-wave switch network ID” but I’m not sure how I find the ID of the switch if that is what the problem is.

Any ideas?

I’ve been using this for a while and it was broken by the recent hub firmware update. The tech guys (specifically jody) managed to get this working again.

Here’s the original code:

/**
 *  Copyright 2015 SmartThings
 *
 *  Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except
 *  in compliance with the License. You may obtain a copy of the License at:
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 *  Unless required by applicable law or agreed to in writing, software distributed under the License is distributed
 *  on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License
 *  for the specific language governing permissions and limitations under the License.
 *
 *  Device Handler for a Secure SSR303 (aka Horstmann ASR-ZW) Boiler switch
 *
 *  Standard ST Z-Wave switch modified to turn this device on and off. This device identified as a Thermostat (as opposed to a switch).
 *
 *  http://www.vesternet.com/z-wave-horstmann-z-wave-controlled-boiler-receiver-hrt
 *
 *  Note that the Horstmann HRT4-ZW and the ASR-ZW are being sold today as a 'Secure SRT321' (Thermostat) and 'Secure SSR303' (relay switch). 
 *  This DH allows the relay switch to be controlled directly by ST. To clarify, this DH is for the ASR-ZW or the SSR303. 
 * 
 */
metadata {
	definition (name: "Horstmann HRT4-ZW", namespace: "smartthings", author: "SmartThings") {
		capability "Actuator"
		capability "Indicator"
 		capability "Switch"
		capability "Polling"
		capability "Refresh"
		capability "Sensor"

//		fingerprint mfr:"0063", prod:"4952", deviceJoinName: "Z-Wave Wall Switch"
//		fingerprint mfr:"0063", prod:"5257", deviceJoinName: "Z-Wave Wall Switch"
//		fingerprint mfr:"0063", prod:"5052", deviceJoinName: "Z-Wave Plug-In Switch"
//		fingerprint mfr:"0113", prod:"5257", deviceJoinName: "Z-Wave Wall Switch"
//      fingerprint mfr:"0113", prod:"5257", deviceJoinName: "Z-Wave Wall Switch"
      fingerprint mfr:"0059", prod:"0003", deviceJoinName: "Secure SSR303 Boiler Switch"

	}

	// simulator metadata
	simulator {
		status "on":  "command: 2003, payload: FF"
		status "off": "command: 2003, payload: 00"

		// reply messages
		reply "2001FF,delay 100,2502": "command: 2503, payload: FF"
		reply "200100,delay 100,2502": "command: 2503, payload: 00"
	}

	preferences {
		input "ledIndicator", "enum", title: "LED Indicator", description: "Turn LED indicator... ", required: false, options:["on": "When On", "off": "When Off", "never": "Never"], defaultValue: "off"
	}

	// tile definitions
	tiles(scale: 2) {
		multiAttributeTile(name:"switch", type: "lighting", width: 6, height: 4, canChangeIcon: true){
			tileAttribute ("device.switch", key: "PRIMARY_CONTROL") {
				attributeState "on", label: '${name}', action: "switch.off", icon: "st.switches.switch.on", backgroundColor: "#79b821"
				attributeState "off", label: '${name}', action: "switch.on", icon: "st.switches.switch.off", backgroundColor: "#ffffff"
			}
		}

		standardTile("indicator", "device.indicatorStatus", width: 2, height: 2, inactiveLabel: false, decoration: "flat") {
			state "when off", action:"indicator.indicatorWhenOn", icon:"st.indicators.lit-when-off"
			state "when on", action:"indicator.indicatorNever", icon:"st.indicators.lit-when-on"
			state "never", action:"indicator.indicatorWhenOff", icon:"st.indicators.never-lit"
		}
		standardTile("refresh", "device.switch", width: 2, height: 2, inactiveLabel: false, decoration: "flat") {
			state "default", label:'', action:"refresh.refresh", icon:"st.secondary.refresh"
		}

		main "switch"
		details(["switch","refresh"])
	}
}

def updated(){
  switch (ledIndicator) {
        case "on":
            indicatorWhenOn()
            break
        case "off":
            indicatorWhenOff()
            break
        case "never":
            indicatorNever()
            break
        default:
            indicatorWhenOn()
            break
    }
}

def parse(String description) {
	def result = null
	def cmd = zwave.parse(description, [0x20: 1, 0x70: 1])
	if (cmd) {
		result = createEvent(zwaveEvent(cmd))
	}
	if (result?.name == 'hail' && hubFirmwareLessThan("000.011.00602")) {
		result = [result, response(zwave.basicV1.basicGet())]
		log.debug "Was hailed: requesting state update"
	} else {
		log.debug "Parse returned ${result?.descriptionText}"
	}
	return result
}

def zwaveEvent(physicalgraph.zwave.commands.basicv1.BasicReport cmd) {
	[name: "switch", value: cmd.value ? "on" : "off", type: "physical"]
}

def zwaveEvent(physicalgraph.zwave.commands.basicv1.BasicSet cmd) {
	[name: "switch", value: cmd.value ? "on" : "off", type: "physical"]
}

def zwaveEvent(physicalgraph.zwave.commands.switchbinaryv1.SwitchBinaryReport cmd) {
	[name: "switch", value: cmd.value ? "on" : "off", type: "digital"]
}

def zwaveEvent(physicalgraph.zwave.commands.configurationv1.ConfigurationReport cmd) {
	def value = "when off"
	if (cmd.configurationValue[0] == 1) {value = "when on"}
	if (cmd.configurationValue[0] == 2) {value = "never"}
	[name: "indicatorStatus", value: value, display: false]
}

def zwaveEvent(physicalgraph.zwave.commands.hailv1.Hail cmd) {
	[name: "hail", value: "hail", descriptionText: "Switch button was pressed", displayed: false]
}

def zwaveEvent(physicalgraph.zwave.commands.manufacturerspecificv2.ManufacturerSpecificReport cmd) {
	log.debug "manufacturerId:   ${cmd.manufacturerId}"
	log.debug "manufacturerName: ${cmd.manufacturerName}"
	log.debug "productId:        ${cmd.productId}"
	log.debug "productTypeId:    ${cmd.productTypeId}"
	def msr = String.format("%04X-%04X-%04X", cmd.manufacturerId, cmd.productTypeId, cmd.productId)
	updateDataValue("MSR", msr)
	updateDataValue("manufacturer", cmd.manufacturerName)
	createEvent([descriptionText: "$device.displayName MSR: $msr", isStateChange: false])
}


def zwaveEvent(physicalgraph.zwave.Command cmd) {
	// Handles all Z-Wave commands we aren't interested in
	[:]
}

def on() {
	delayBetween([
		zwave.thermostatModeV2.thermostatModeSet(mode: 1).format(),
		zwave.thermostatModeV2.thermostatModeGet().format()
	], standardDelay)
}


/*

def off() {
	delayBetween([
		zwave.thermostatModeV2.thermostatModeSet(mode: 0).format(),
		zwave.thermostatModeV2.thermostatModeGet().format()
	], standardDelay)
    
    
    
    
def heat() {
	delayBetween([
		zwave.thermostatModeV2.thermostatModeSet(mode: 1).format(),
		zwave.thermostatModeV2.thermostatModeGet().format()
	], standardDelay)


old code:
		zwave.basicV1.basicSet(value: 0xFF).format(),
		zwave.switchBinaryV1.switchBinaryGet().format()
	])
    
*/


def off() {
	delayBetween([
		zwave.thermostatModeV2.thermostatModeSet(mode: 0).format(),
		zwave.thermostatModeV2.thermostatModeGet().format()
	], standardDelay)
}

def poll() {
	delayBetween([
		zwave.switchBinaryV1.switchBinaryGet().format(),
		zwave.manufacturerSpecificV1.manufacturerSpecificGet().format()
	])
}

def refresh() {
	delayBetween([
		zwave.switchBinaryV1.switchBinaryGet().format(),
		zwave.manufacturerSpecificV1.manufacturerSpecificGet().format()
	])
}

void indicatorWhenOn() {
	sendEvent(name: "indicatorStatus", value: "when on", display: false)
	sendHubCommand(new physicalgraph.device.HubAction(zwave.configurationV1.configurationSet(configurationValue: [1], parameterNumber: 3, size: 1).format()))
}

void indicatorWhenOff() {
	sendEvent(name: "indicatorStatus", value: "when off", display: false)
	sendHubCommand(new physicalgraph.device.HubAction(zwave.configurationV1.configurationSet(configurationValue: [0], parameterNumber: 3, size: 1).format()))
}

void indicatorNever() {
	sendEvent(name: "indicatorStatus", value: "never", display: false)
	sendHubCommand(new physicalgraph.device.HubAction(zwave.configurationV1.configurationSet(configurationValue: [2], parameterNumber: 3, size: 1).format()))
}

def invertSwitch(invert=true) {
	if (invert) {
		zwave.configurationV1.configurationSet(configurationValue: [1], parameterNumber: 4, size: 1).format()
	}
	else {
		zwave.configurationV1.configurationSet(configurationValue: [0], parameterNumber: 4, size: 1).format()
	}
}

(…to be continued…)

(…and here’s the code which is working for me now…note that there is a slight delay because apparently there’s a small issue with the code, but it takes maximum 6 seconds to reflect the status in the app, as opposed to it not working at all with the original code. It does physically turn on/off instantly, but takes a few seconds to reflect this. It’s laggy. Don’t know if anyone is able to fix this maybe? I’m no programmer. Much appreciated guys!..)

/**
 *  Copyright 2015 SmartThings
 *
 *  Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except
 *  in compliance with the License. You may obtain a copy of the License at:
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 *  Unless required by applicable law or agreed to in writing, software distributed under the License is distributed
 *  on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License
 *  for the specific language governing permissions and limitations under the License.
 *
 *  Device Handler for a Secure SSR303 (aka Horstmann ASR-ZW) Boiler switch
 *
 *  Standard ST Z-Wave switch modified to turn this device on and off. This device identified as a Thermostat (as opposed to a switch).
 *
 *  http://www.vesternet.com/z-wave-horstmann-z-wave-controlled-boiler-receiver-hrt
 *
 *  Note that the Horstmann HRT4-ZW and the ASR-ZW are being sold today as a 'Secure SRT321' (Thermostat) and 'Secure SSR303' (relay switch). 
 *  This DH allows the relay switch to be controlled directly by ST. To clarify, this DH is for the ASR-ZW or the SSR303. 
 * 
 */
metadata {
	definition (name: "Horstmann HRT4-ZW", namespace: "smartthings", author: "SmartThings") {
		capability "Actuator"
		capability "Indicator"
 		capability "Switch"
		capability "Polling"
		capability "Refresh"
		capability "Sensor"

//		fingerprint mfr:"0063", prod:"4952", deviceJoinName: "Z-Wave Wall Switch"
//		fingerprint mfr:"0063", prod:"5257", deviceJoinName: "Z-Wave Wall Switch"
//		fingerprint mfr:"0063", prod:"5052", deviceJoinName: "Z-Wave Plug-In Switch"
//		fingerprint mfr:"0113", prod:"5257", deviceJoinName: "Z-Wave Wall Switch"
//      fingerprint mfr:"0113", prod:"5257", deviceJoinName: "Z-Wave Wall Switch"
      fingerprint mfr:"0059", prod:"0003", deviceJoinName: "Secure SSR303 Boiler Switch"

	}

	// simulator metadata
	simulator {
		status "on":  "command: 2003, payload: FF"
		status "off": "command: 2003, payload: 00"

		// reply messages
		reply "2001FF,delay 100,2502": "command: 2503, payload: FF"
		reply "200100,delay 100,2502": "command: 2503, payload: 00"
	}

	preferences {
		input "ledIndicator", "enum", title: "LED Indicator", description: "Turn LED indicator... ", required: false, options:["on": "When On", "off": "When Off", "never": "Never"], defaultValue: "off"
	}

	// tile definitions
	tiles(scale: 2) {
		multiAttributeTile(name:"switch", type: "lighting", width: 6, height: 4, canChangeIcon: true){
			tileAttribute ("device.switch", key: "PRIMARY_CONTROL") {
				attributeState "on", label: '${name}', action: "switch.off", icon: "st.switches.switch.on", backgroundColor: "#79b821"
				attributeState "off", label: '${name}', action: "switch.on", icon: "st.switches.switch.off", backgroundColor: "#ffffff"
			}
		}

		standardTile("indicator", "device.indicatorStatus", width: 2, height: 2, inactiveLabel: false, decoration: "flat") {
			state "when off", action:"indicator.indicatorWhenOn", icon:"st.indicators.lit-when-off"
			state "when on", action:"indicator.indicatorNever", icon:"st.indicators.lit-when-on"
			state "never", action:"indicator.indicatorWhenOff", icon:"st.indicators.never-lit"
		}
		standardTile("refresh", "device.switch", width: 2, height: 2, inactiveLabel: false, decoration: "flat") {
			state "default", label:'', action:"refresh.refresh", icon:"st.secondary.refresh"
		}

		main "switch"
		details(["switch","refresh"])
	}
}

def updated(){
  switch (ledIndicator) {
        case "on":
            indicatorWhenOn()
            break
        case "off":
            indicatorWhenOff()
            break
        case "never":
            indicatorNever()
            break
        default:
            indicatorWhenOn()
            break
    }
}

def parse(String description) {
	log.debug("TEST")
	log.debug(description)
	def result = null
	def cmd = zwave.parse(description, [0x20: 1, 0x70: 1])
	if (cmd) {
		result = createEvent(zwaveEvent(cmd))
	}
	if (result?.name == 'hail' && hubFirmwareLessThan("000.011.00602")) {
		result = [result, response(zwave.basicV1.basicGet())]
		log.debug "Was hailed: requesting state update"
	} else {
		log.debug "Parse returned ${result?.descriptionText}"
	}
	return result
}

def zwaveEvent(physicalgraph.zwave.commands.basicv1.BasicReport cmd) {
	[name: "switch", value: cmd.value ? "on" : "off", type: "physical"]
}

def zwaveEvent(physicalgraph.zwave.commands.basicv1.BasicSet cmd) {
	[name: "switch", value: cmd.value ? "on" : "off", type: "physical"]
}

def zwaveEvent(physicalgraph.zwave.commands.switchbinaryv1.SwitchBinaryReport cmd) {
	[name: "switch", value: cmd.value ? "on" : "off", type: "digital"]
}

def zwaveEvent(physicalgraph.zwave.commands.configurationv1.ConfigurationReport cmd) {
	def value = "when off"
	if (cmd.configurationValue[0] == 1) {value = "when on"}
	if (cmd.configurationValue[0] == 2) {value = "never"}
	[name: "indicatorStatus", value: value, display: false]
}

def zwaveEvent(physicalgraph.zwave.commands.hailv1.Hail cmd) {
	[name: "hail", value: "hail", descriptionText: "Switch button was pressed", displayed: false]
}

def zwaveEvent(physicalgraph.zwave.commands.manufacturerspecificv2.ManufacturerSpecificReport cmd) {
	log.debug "manufacturerId:   ${cmd.manufacturerId}"
	log.debug "manufacturerName: ${cmd.manufacturerName}"
	log.debug "productId:        ${cmd.productId}"
	log.debug "productTypeId:    ${cmd.productTypeId}"
	def msr = String.format("%04X-%04X-%04X", cmd.manufacturerId, cmd.productTypeId, cmd.productId)
	updateDataValue("MSR", msr)
	updateDataValue("manufacturer", cmd.manufacturerName)
	createEvent([descriptionText: "$device.displayName MSR: $msr", isStateChange: false])
}


def zwaveEvent(physicalgraph.zwave.Command cmd) {
	// Handles all Z-Wave commands we aren't interested in
	[:]
}

def on() {
	delayBetween([
		zwave.thermostatModeV2.thermostatModeSet(mode: 1).format(),
		zwave.thermostatModeV2.thermostatModeGet().format()
	], standardDelay)
}


/*

def off() {
	delayBetween([
		zwave.thermostatModeV2.thermostatModeSet(mode: 0).format(),
		zwave.thermostatModeV2.thermostatModeGet().format()
	], standardDelay)
    
    
    
    
def heat() {
	delayBetween([
		zwave.thermostatModeV2.thermostatModeSet(mode: 1).format(),
		zwave.thermostatModeV2.thermostatModeGet().format()
	], standardDelay)


old code:
		zwave.basicV1.basicSet(value: 0xFF).format(),
		zwave.switchBinaryV1.switchBinaryGet().format()
	])
    
*/


def off() {
	delayBetween([
		zwave.thermostatModeV2.thermostatModeSet(mode: 0).format(),
		zwave.thermostatModeV2.thermostatModeGet().format()
	], standardDelay)
}

def poll() {
	delayBetween([
		zwave.switchBinaryV1.switchBinaryGet().format(),
		zwave.manufacturerSpecificV1.manufacturerSpecificGet().format()
	])
}

def refresh() {
	delayBetween([
		zwave.switchBinaryV1.switchBinaryGet().format(),
		zwave.manufacturerSpecificV1.manufacturerSpecificGet().format()
	])
}

void indicatorWhenOn() {
	sendEvent(name: "indicatorStatus", value: "when on", display: false)
	sendHubCommand(new physicalgraph.device.HubAction(zwave.configurationV1.configurationSet(configurationValue: [1], parameterNumber: 3, size: 1).format()))
}

void indicatorWhenOff() {
	sendEvent(name: "indicatorStatus", value: "when off", display: false)
	sendHubCommand(new physicalgraph.device.HubAction(zwave.configurationV1.configurationSet(configurationValue: [0], parameterNumber: 3, size: 1).format()))
}

void indicatorNever() {
	sendEvent(name: "indicatorStatus", value: "never", display: false)
	sendHubCommand(new physicalgraph.device.HubAction(zwave.configurationV1.configurationSet(configurationValue: [2], parameterNumber: 3, size: 1).format()))
}

def invertSwitch(invert=true) {
	if (invert) {
		zwave.configurationV1.configurationSet(configurationValue: [1], parameterNumber: 4, size: 1).format()
	}
	else {
		zwave.configurationV1.configurationSet(configurationValue: [0], parameterNumber: 4, size: 1).format()
	}
}

Hi everyone… I wanted to buy the smartthings hub, to replace my Vera edge, but I wanted to make sure my thermostat will work properly. I have the SRT 321 plus the SSR 303.
Someone who has the same working?
I would appreciate it if you could confirm me!
Thanks

Hi,

I have the newer (?) model from Secure as well as the receiver. They pair OK and work OK but NOT with SmartThings. It discovers the thermostat but it is not possible to program it, and it just shows as offline in the ST app.

I bought the RBoys thermostat app/driver as well and still no luck. I tried hard for a while and then gave up.
I have not tried the fix posted by Daz in this thread.

Thanks, @Jimmmz
So I’m in doubt whether to buy the hub or not…

Anyone else who can give the status report?!