SmartThings Community

[RELEASE] Enerwave ZWN-RSM2 (v1 & v2) & RSM2-Plus —Smart Dual Relay Switch Module

dth_lighting
dth_inwallmicro
dth_misc
(Kpdillon) #82

@capfan @erocm1231 @desiGeek I was able to use @erocm1231’s code for ZWN-RSM2-PLUS with this modification to the code and get it to work where it is not losing connectivity anymore. Just curious @erocm1231 is there a reason you don’t include this in your device handler code on github?

capfanJan 5
Using the following code in the device handler for the Enerwave ZWN-RSM2-PLUS I was able to get instant status updates working:

def configure() {
log.debug "configure() called"
def cmds = []
cmds << zwave.configurationV2.configurationSet(parameterNumber:3, size:1, configurationValue:[1]).format()
cmds << zwave.associationV2.associationSet(groupingIdentifier:2, nodeId:[zwaveHubNodeId]).format()
cmds << zwave.associationV2.associationSet(groupingIdentifier:3, nodeId:[zwaveHubNodeId]).format()
delayBetween(cmds, 2000)
}

(Eric M) #83

It is already in my device handler (minus the configuration parameter which isn’t needed when the associations are properly set). Maybe you are looking at the wrong handler?

Also, it depends on which firmware version you have for the RSM2-Plus. 5.10 Needs those two associations set and 5.11 Needs a multichannel association for group 1 set. My handler reads which firmware version you have and makes the adjustments accordingly.

(Kpdillon) #84

Well, with your code it was working but both the RSM2 Plus’s that I bought kept disconnecting until I replaced this code in there… I don’t know if I have the ones with the newer firmware or not.

def configure() {
log.debug "configure() called"
def cmds = []
cmds << zwave.configurationV2.configurationSet(parameterNumber:3, size:1, configurationValue:[1]).format()
cmds << zwave.associationV2.associationSet(groupingIdentifier:2, nodeId:[zwaveHubNodeId]).format()
cmds << zwave.associationV2.associationSet(groupingIdentifier:3, nodeId:[zwaveHubNodeId]).format()
delayBetween(cmds, 2000)
}

(Eric M) #85

That code is in the handler for the RSM2-Plus (minus the exception I mentioned). The handler has been thouroughly tested with the firmware versions I have listed.

I think you may have been using the handler for the regular RSM2 or an older version of the handler for the RSM2-Plus.

(Kpdillon) #86

@erocm1231 - maybe I am going crazy. Is this the wrong code?

/**
*

  • Enerwave RSM2-Plus
  • github: Eric Maycock (erocm123)
  • Date: 2017-06-16
  • Copyright Eric Maycock
  • Includes all configuration parameters and ease of advanced configuration.
  • 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.
  • 2017-06-16: Added support for firmware 5.11 in this handler.
    */

metadata {
definition (name: “Enerwave RSM2-Plus”, namespace: “erocm123”, author: “Eric Maycock”) {
capability "Actuator"
capability "Sensor"
capability "Switch"
capability "Polling"
capability "Configuration"
capability "Refresh"
capability “Health Check”

  fingerprint mfr: "011A", prod: "0111", model: "0605", deviceJoinName: "Enerwave RSM2-Plus"

  fingerprint deviceId: "0x1001", inClusters:"0x5E,0x86,0x72,0x5A,0x73,0x20,0x27,0x25,0x32,0x60,0x85,0x8E,0x59,0x70", outClusters:"0x20"
  fingerprint deviceId: "0x1001", inClusters:"0x5E,0x86,0x72,0x5A,0x73,0x25,0x60,0x8E,0x85,0x59,0x27"

}

simulator {
}

preferences {
input description: “Once you change values on this page, the corner of the “configuration” icon will change orange until all configuration parameters are updated.”, title: “Settings”, displayDuringSetup: false, type: “paragraph”, element: "paragraph"
generate_preferences(configuration_model())
}

tiles{
multiAttributeTile(name:“switch”, type: “lighting”, width: 6, height: 4, canChangeIcon: true){
tileAttribute (“device.switch”, key: “PRIMARY_CONTROL”) {
attributeState “off”, label:’${name}’, action:“switch.on”, icon:“st.switches.switch.off”, backgroundColor:"#ffffff", nextState:“turningOn"
attributeState “on”, label:’${name}’, action:“switch.off”, icon:“st.switches.switch.on”, backgroundColor:”#00a0dc", nextState:“turningOff"
attributeState “turningOff”, label:’${name}’, action:“switch.on”, icon:“st.switches.switch.off”, backgroundColor:”#ffffff", nextState:“turningOn"
attributeState “turningOn”, label:’${name}’, action:“switch.off”, icon:“st.switches.switch.on”, backgroundColor:”#00a0dc", nextState:“turningOff”
}
}
standardTile(“refresh”, “device.switch”, inactiveLabel: false, decoration: “flat”, width: 2, height: 2) {
state “default”, label:"", action:“refresh.refresh”, icon:“st.secondary.refresh”
}
standardTile(“configure”, “device.needUpdate”, inactiveLabel: false, decoration: “flat”, width: 2, height: 2) {
state “NO” , label:’’, action:“configuration.configure”, icon:"st.secondary.configure"
state “YES”, label:’’, action:“configuration.configure”, icon:“https://github.com/erocm123/SmartThingsPublic/raw/master/devicetypes/erocm123/qubino-flush-1d-relay.src/configure@2x.png
}

main(["switch"])
details(["switch",
         childDeviceTiles("all"),
         "refresh","configure","reset"
        ])

}
}

def parse(String description) {
def result = []
def cmd = zwave.parse(description)
if (cmd) {
result += zwaveEvent(cmd)
logging(“Parsed ${cmd} to ${result.inspect()}”, 1)
} else {
logging(“Non-parsed event: ${description}”, 2)
}

return result

}

def zwaveEvent(physicalgraph.zwave.commands.basicv1.BasicReport cmd, ep=null)
{
logging(“BasicReport ${cmd} - ep ${ep}”, 2)
if (ep) {
def event
childDevices.each { childDevice ->
if (childDevice.deviceNetworkId == “$device.deviceNetworkId-ep$ep”) {
childDevice.sendEvent(name: “switch”, value: cmd.value ? “on” : “off”)
}
}
if (cmd.value) {
event = [createEvent([name: “switch”, value: “on”])]
} else {
def allOff = true
childDevices.each { n ->
if (n.currentState(“switch”).value != “off”) allOff = false
}
if (allOff) {
event = [createEvent([name: “switch”, value: “off”])]
} else {
event = [createEvent([name: “switch”, value: “on”])]
}
}
return event
}
}

def zwaveEvent(physicalgraph.zwave.commands.basicv1.BasicSet cmd) {
logging(“BasicSet ${cmd}”, 2)
def result = createEvent(name: “switch”, value: cmd.value ? “on” : “off”, type: “digital”)
def cmds = []
cmds << encap(zwave.switchBinaryV1.switchBinaryGet(), 1)
cmds << encap(zwave.switchBinaryV1.switchBinaryGet(), 2)
return [result, response(commands(cmds))] // returns the result of reponse()
}

def zwaveEvent(physicalgraph.zwave.commands.switchbinaryv1.SwitchBinaryReport cmd, ep=null)
{
logging(“SwitchBinaryReport ${cmd} - ep ${ep}”, 2)
if (ep) {
def event
def childDevice = childDevices.find{it.deviceNetworkId == “$device.deviceNetworkId-ep$ep”}
if (childDevice)
childDevice.sendEvent(name: “switch”, value: cmd.value ? “on” : “off”)
if (cmd.value) {
event = [createEvent([name: “switch”, value: “on”])]
} else {
def allOff = true
childDevices.each { n ->
if (n.currentState(“switch”).value != “off”) allOff = false
}
if (allOff) {
event = [createEvent([name: “switch”, value: “off”])]
} else {
event = [createEvent([name: “switch”, value: “on”])]
}
}
return event
} else {
def result = createEvent(name: “switch”, value: cmd.value ? “on” : “off”, type: “digital”)
def cmds = []
cmds << encap(zwave.switchBinaryV1.switchBinaryGet(), 1)
cmds << encap(zwave.switchBinaryV1.switchBinaryGet(), 2)
return [result, response(commands(cmds))] // returns the result of reponse()
}
}

def zwaveEvent(physicalgraph.zwave.commands.multichannelv3.MultiChannelCmdEncap cmd) {
logging(“MultiChannelCmdEncap ${cmd}”, 2)
def encapsulatedCommand = cmd.encapsulatedCommand([0x32: 3, 0x25: 1, 0x20: 1])
if (encapsulatedCommand) {
zwaveEvent(encapsulatedCommand, cmd.sourceEndPoint as Integer)
}
}

def zwaveEvent(physicalgraph.zwave.commands.manufacturerspecificv2.ManufacturerSpecificReport cmd) {
logging(“ManufacturerSpecificReport ${cmd}”, 2)
def msr = String.format("%04X-%04X-%04X", cmd.manufacturerId, cmd.productTypeId, cmd.productId)
logging(“msr: $msr”, 2)
updateDataValue(“MSR”, msr)
}

def zwaveEvent(physicalgraph.zwave.commands.versionv1.VersionReport cmd) {
def fw = "${cmd.applicationVersion}.${cmd.applicationSubVersion}"
updateDataValue(“fw”, fw)
if (state.MSR == “003B-6341-5044”) {
updateDataValue(“ver”, “${cmd.applicationVersion >> 4}.${cmd.applicationVersion & 0xF}”)
}
def text = "$device.displayName: firmware version: $fw, Z-Wave version: ${cmd.zWaveProtocolVersion}.${cmd.zWaveProtocolSubVersion}"
createEvent(descriptionText: text, isStateChange: false)
}

def zwaveEvent(physicalgraph.zwave.commands.associationv2.AssociationReport cmd) {
log.debug "AssociationReport $cmd"
if (zwaveHubNodeId in cmd.nodeId) state.“association${cmd.groupingIdentifier}” = true
else state.“association${cmd.groupingIdentifier}” = false
}

def zwaveEvent(physicalgraph.zwave.commands.multichannelassociationv2.MultiChannelAssociationReport cmd) {
log.debug "MultiChannelAssociationReport $cmd"
if (cmd.groupingIdentifier == 1) {
if ([0,zwaveHubNodeId,1] == cmd.nodeId) state.“associationMC${cmd.groupingIdentifier}” = true
else state.“associationMC${cmd.groupingIdentifier}” = false
}
}

def zwaveEvent(physicalgraph.zwave.Command cmd) {
// This will capture any commands not handled by other instances of zwaveEvent
// and is recommended for development so you can see every command the device sends
logging(“Unhandled Event: ${cmd}”, 2)
}

def on() {
logging(“on()”, 1)
commands([
zwave.switchAllV1.switchAllOn(),
encap(zwave.switchBinaryV1.switchBinaryGet(), 1),
encap(zwave.switchBinaryV1.switchBinaryGet(), 2)
])
}

def off() {
logging(“off()”, 1)
commands([
zwave.switchAllV1.switchAllOff(),
encap(zwave.switchBinaryV1.switchBinaryGet(), 1),
encap(zwave.switchBinaryV1.switchBinaryGet(), 2)
])
}

void childOn(String dni) {
logging(“childOn($dni)”, 1)
def cmds = []
cmds << new physicalgraph.device.HubAction(command(encap(zwave.switchBinaryV1.switchBinarySet(switchValue: 0xFF), channelNumber(dni))))
cmds << new physicalgraph.device.HubAction(command(encap(zwave.switchBinaryV1.switchBinaryGet(), channelNumber(dni))))
sendHubCommand(cmds, 1000)
}

void childOff(String dni) {
logging(“childOff($dni)”, 1)
def cmds = []
cmds << new physicalgraph.device.HubAction(command(encap(zwave.switchBinaryV1.switchBinarySet(switchValue: 0x00), channelNumber(dni))))
cmds << new physicalgraph.device.HubAction(command(encap(zwave.switchBinaryV1.switchBinaryGet(), channelNumber(dni))))
sendHubCommand(cmds, 1000)
}

void childRefresh(String dni) {
logging(“childRefresh($dni)”, 1)
def cmds = []
cmds << new physicalgraph.device.HubAction(command(encap(zwave.switchBinaryV1.switchBinaryGet(), channelNumber(dni))))
cmds << new physicalgraph.device.HubAction(command(encap(zwave.meterV2.meterGet(scale: 0), channelNumber(dni))))
cmds << new physicalgraph.device.HubAction(command(encap(zwave.meterV2.meterGet(scale: 2), channelNumber(dni))))
sendHubCommand(cmds, 1000)
}

def poll() {
logging(“poll()”, 1)
commands([
encap(zwave.switchBinaryV1.switchBinaryGet(), 1),
encap(zwave.switchBinaryV1.switchBinaryGet(), 2),
])
}

def refresh() {
logging(“refresh()”, 1)
commands([
encap(zwave.switchBinaryV1.switchBinaryGet(), 1),
encap(zwave.switchBinaryV1.switchBinaryGet(), 2),
zwave.meterV2.meterGet(scale: 0),
zwave.meterV2.meterGet(scale: 2),
zwave.sensorMultilevelV5.sensorMultilevelGet(sensorType:1, scale:1)
])
}

def reset() {
logging(“reset()”, 1)
commands([
zwave.meterV2.meterReset(),
zwave.meterV2.meterGet()
])
}

def ping() {
logging(“ping()”, 1)
refresh()
}

def installed() {
logging(“installed()”, 1)
command(zwave.manufacturerSpecificV1.manufacturerSpecificGet())
createChildDevices()
}

//kpd
def configure() {
log.debug "configure() called"
def cmds = []
cmds << zwave.configurationV2.configurationSet(parameterNumber:3, size:1, configurationValue:[1]).format()
cmds << zwave.associationV2.associationSet(groupingIdentifier:2, nodeId:[zwaveHubNodeId]).format()
cmds << zwave.associationV2.associationSet(groupingIdentifier:3, nodeId:[zwaveHubNodeId]).format()
delayBetween(cmds, 2000)
}

def updated()
{
logging(“updated()”, 1)
if (!childDevices) {
createChildDevices()
}
else if (device.label != state.oldLabel) {
childDevices.each {
if (it.label == “${state.oldLabel} (R${channelNumber(it.deviceNetworkId)})”) {
def newLabel = "${device.displayName} (R${channelNumber(it.deviceNetworkId)})"
it.setLabel(newLabel)
}
}
state.oldLabel = device.label
}
def cmds = []
cmds = update_needed_settings()
sendEvent(name: “checkInterval”, value: 2 * 15 * 60 + 2 * 60, displayed: false, data: [protocol: “zwave”, hubHardwareId: device.hub.hardwareID])
sendEvent(name:“needUpdate”, value: device.currentValue(“needUpdate”), displayed:false, isStateChange: true)
if (cmds != []) response(commands(cmds))
}

def generate_preferences(configuration_model)
{
def configuration = parseXml(configuration_model)

configuration.Value.each
{
    if(it.@hidden != "true" && it.@disabled != "true"){
    switch(it.@type)
    {   
        case ["number"]:
            input "${it.@index}", "number",
                title:"${it.@label}\n" + "${it.Help}",
                range: "${it.@min}..${it.@max}",
                defaultValue: "${it.@value}",
                displayDuringSetup: "${it.@displayDuringSetup}"
        break
        case "list":
            def items = []
            it.Item.each { items << ["${it.@value}":"${it.@label}"] }
            input "${it.@index}", "enum",
                title:"${it.@label}\n" + "${it.Help}",
                defaultValue: "${it.@value}",
                displayDuringSetup: "${it.@displayDuringSetup}",
                options: items
        break
        case "decimal":
           input "${it.@index}", "decimal",
                title:"${it.@label}\n" + "${it.Help}",
                range: "${it.@min}..${it.@max}",
                defaultValue: "${it.@value}",
                displayDuringSetup: "${it.@displayDuringSetup}"
        break
        case "boolean":
           input "${it.@index}", "boolean",
                title:"${it.@label}\n" + "${it.Help}",
                defaultValue: "${it.@value}",
                displayDuringSetup: "${it.@displayDuringSetup}"
        break
    }
    }
}

}

/* Code has elements from other community source @CyrilPeponnet (Z-Wave Parameter Sync). */

def update_current_properties(cmd)
{
def currentProperties = state.currentProperties ?: [:]

currentProperties."${cmd.parameterNumber}" = cmd.configurationValue

if (settings."${cmd.parameterNumber}" != null)
{
    if (convertParam(cmd.parameterNumber, settings."${cmd.parameterNumber}") == cmd2Integer(cmd.configurationValue))
    {
        sendEvent(name:"needUpdate", value:"NO", displayed:false, isStateChange: true)
    }
    else
    {
        sendEvent(name:"needUpdate", value:"YES", displayed:false, isStateChange: true)
    }
}

state.currentProperties = currentProperties

}

def update_needed_settings()
{
def cmds = []
def currentProperties = state.currentProperties ?: [:]

def configuration = parseXml(configuration_model())
def isUpdateNeeded = "NO"

cmds << zwave.versionV1.versionGet()

if (state.fw == "5.11") {
   if(state.association2){
       logging("Setting association group 2", 1)
       cmds << zwave.associationV2.associationRemove(groupingIdentifier: 2, nodeId: [])
       cmds << zwave.associationV2.associationGet(groupingIdentifier:2)
    }
    if(state.association3){
       logging("Setting association group 3", 1)
       cmds << zwave.associationV2.associationRemove(groupingIdentifier: 3, nodeId: [])
       cmds << zwave.associationV2.associationGet(groupingIdentifier:3)
    }
    if(!state.associationMC1) {
       logging("Adding MultiChannel association group 1", 1)
       cmds << zwave.associationV2.associationRemove(groupingIdentifier: 1, nodeId: [])
       cmds << zwave.multiChannelAssociationV2.multiChannelAssociationSet(groupingIdentifier: 1, nodeId: [0,zwaveHubNodeId,1])
       cmds << zwave.multiChannelAssociationV2.multiChannelAssociationGet(groupingIdentifier: 1)
    }
} else {           
   if(!state.association2){
      logging("Setting association group 2", 1)
      cmds << zwave.associationV2.associationSet(groupingIdentifier:2, nodeId:zwaveHubNodeId)
      cmds << zwave.associationV2.associationGet(groupingIdentifier:2)
   }
   if(!state.association3){
      logging("Setting association group 3", 1)
      cmds << zwave.associationV2.associationSet(groupingIdentifier:3, nodeId:zwaveHubNodeId)
      cmds << zwave.associationV2.associationGet(groupingIdentifier:3)
   }
}

configuration.Value.each
{     
    if ("${it.@setting_type}" == "zwave" && it.@disabled != "true"){
        if (currentProperties."${it.@index}" == null)
        {
           if (it.@setonly == "true"){
              logging("Parameter ${it.@index} will be updated to " + convertParam(it.@index.toInteger(), settings."${it.@index}"? settings."${it.@index}" : "${it.@value}"), 2)
              def convertedConfigurationValue = convertParam(it.@index.toInteger(), settings."${it.@index}"? settings."${it.@index}" : "${it.@value}")
              cmds << zwave.configurationV1.configurationSet(configurationValue: integer2Cmd(convertedConfigurationValue, it.@byteSize.toInteger()), parameterNumber: it.@index.toInteger(), size: it.@byteSize.toInteger())
           } else {
              isUpdateNeeded = "YES"
              logging("Current value of parameter ${it.@index} is unknown", 2)
              cmds << zwave.configurationV1.configurationGet(parameterNumber: it.@index.toInteger())
           }
        }
        else if ((settings."${it.@index}" != null || "${it.@type}" == "hidden") && cmd2Integer(currentProperties."${it.@index}") != convertParam(it.@index.toInteger(), settings."${it.@index}"? settings."${it.@index}" : "${it.@value}"))
        { 
            isUpdateNeeded = "YES"
            logging("Parameter ${it.@index} will be updated to " + convertParam(it.@index.toInteger(), settings."${it.@index}"? settings."${it.@index}" : "${it.@value}"), 2)
            def convertedConfigurationValue = convertParam(it.@index.toInteger(), settings."${it.@index}"? settings."${it.@index}" : "${it.@value}")
            cmds << zwave.configurationV1.configurationSet(configurationValue: integer2Cmd(convertedConfigurationValue, it.@byteSize.toInteger()), parameterNumber: it.@index.toInteger(), size: it.@byteSize.toInteger())
            cmds << zwave.configurationV1.configurationGet(parameterNumber: it.@index.toInteger())
        } 
    }
}

sendEvent(name:"needUpdate", value: isUpdateNeeded, displayed:false, isStateChange: true)
return cmds

}

def convertParam(number, value) {
def parValue
switch (number){
case 110:
if (value < 0)
parValue = value * -1 + 1000
else
parValue = value
break
default:
parValue = value
break
}
return parValue.toInteger()
}

private def logging(message, level) {
if (logLevel != “0”){
switch (logLevel) {
case “1”:
if (level > 1)
log.debug "$message"
break
case “99”:
log.debug "$message"
break
}
}
}

/**

  • Convert byte values to integer
    */
    def cmd2Integer(array) {

switch(array.size()) {
case 1:
array[0]
break
case 2:
((array[0] & 0xFF) << 8) | (array[1] & 0xFF)
break
case 3:
((array[0] & 0xFF) << 16) | ((array[1] & 0xFF) << 8) | (array[2] & 0xFF)
break
case 4:
((array[0] & 0xFF) << 24) | ((array[1] & 0xFF) << 16) | ((array[2] & 0xFF) << 8) | (array[3] & 0xFF)
break
}
}

def integer2Cmd(value, size) {
switch(size) {
case 1:
[value]
break
case 2:
def short value1 = value & 0xFF
def short value2 = (value >> 8) & 0xFF
[value2, value1]
break
case 3:
def short value1 = value & 0xFF
def short value2 = (value >> 8) & 0xFF
def short value3 = (value >> 16) & 0xFF
[value3, value2, value1]
break
case 4:
def short value1 = value & 0xFF
def short value2 = (value >> 8) & 0xFF
def short value3 = (value >> 16) & 0xFF
def short value4 = (value >> 24) & 0xFF
[value4, value3, value2, value1]
break
}
}

def zwaveEvent(physicalgraph.zwave.commands.configurationv2.ConfigurationReport cmd) {
update_current_properties(cmd)
logging("${device.displayName} parameter ‘${cmd.parameterNumber}’ with a byte size of ‘${cmd.size}’ is set to ‘${cmd2Integer(cmd.configurationValue)}’", 2)
}

private encap(cmd, endpoint) {
if (endpoint) {
zwave.multiChannelV3.multiChannelCmdEncap(destinationEndPoint:endpoint).encapsulate(cmd)
} else {
cmd
}
}

private command(physicalgraph.zwave.Command cmd) {
if (state.sec) {
zwave.securityV1.securityMessageEncapsulation().encapsulate(cmd).format()
} else {
cmd.format()
}
}

private commands(commands, delay=1000) {
delayBetween(commands.collect{ command(it) }, delay)
}

private channelNumber(String dni) {
dni.split("-ep")[-1] as Integer
}

private void createChildDevices() {
state.oldLabel = device.label
try {
for (i in 1…2) {
addChildDevice(“Switch Child Device”, “${device.deviceNetworkId}-ep${i}”, null,
[completedSetup: true, label: “${device.displayName} (R${i})”,
isComponent: false, componentName: “ep$i”, componentLabel: “Relay $i”])
}
} catch (e) {
runIn(2, “sendAlert”)
}
}

private sendAlert() {
sendEvent(
descriptionText: “Child device creation failed. Please make sure that the “Switch Child Device” is installed and published.”,
eventType: “ALERT”,
name: “childDeviceCreation”,
value: “failed”,
displayed: true,
)
}

def configuration_model()
{
’’’









’’’
}

(Eric M) #87

Yep, the configure method (before your changes) calls this block of code. It determines whether you are using the latest 5.11 firmware or not and creates the necessary associations. The changes you are mentioning will not work with the 5.11 version of the switch. You are @ing people that were using the RSM2 device handler on the RSM2-Plus (back in January - which I did not have at the time and had not created a handler for it).

Don’t get me wrong, I’m glad that you got it working, but I’m just saying I don’t think people need to make any additions to the handler as is. It may have been that the configure method didn’t get called when you had my handler installed, or some other error.

(Kpdillon) #88

@erocm1231

thanks for your help. The only thing I can think of is maybe I tried the original RSM code originally then copied and pasted the updated plus code and didn’t hit save… Anyway, it looks like you are saying use

and

and I shoud be good to go, right?

#89

I have read through this thread three times and am still not sure how to solve my problem. My RSM2, which I installed around two years ago, so I assume it is version 1, is not working as I would like. As of a few months ago, I can no longer turn off one of the lights without using the wall switch. I rarely use this light, so maybe it was longer ago than a couple/few months.

Today I would like to try the software presented here by Eric M, but am confused. I want to remove the existing software I’m using (and I am not positive of exactly how - I am using a “Z-Wave Device Multichannel”), and add Eric’s software, but I am not sure what the steps are to do that. Did I miss a reply here that provides step by step directions on setting up this software once the Enerwave has already been paired?

Thank you,
Peter

(A. Harrow) #90

To any of the knowledgeable folks here,

I’ve got a RSM2-Plus installed, connected in the bathroom to a light (Load 1) and an exhaust fan (Load 2).

The light is a CFL and goes on/off with no issues, I can even set motion triggers and it works. However the fan is very “sometime-ish”. It comes on somethings using the ST app, sometimes it doesn’t switch off.

When I turn on the fan, I can see the light flickering and the relay crackles for about a second (or a bit longer than usual).

Secondly, if I set the same motion trigger that works for the light using the fan, I can hear the relay crackling, the light may blink but the fan doesn’t turn on.

I am using the normal ST “device handle” (i hope this is what its called), i removed the SmartThings Multi-channel Control because the two switches it created would just remain in the ON position.

Sometimes, If i have the light turned on with the app, and switch on the fan it turns off the light.

Both the fan and the light work with the manual switches.

Where do I even start trouble shooting this?

Do I try using a the @erocm1231 modules, if so is there a “simple” step 1-2-3 guide?

Is this an electrical / wiring problem?

For what its worth I did a z-wave repair and found no issues.

Thanks in advance.

#91

Had the same issues as the posters above, the problem is that the dual relay switch has a lower max load, I think about 5A on each channel. If you use it with a bunch of CFLs/LEDs and an exhaust fan, it will fail sooner or later because CFLs especially have huge inrush currents. Same with inductive loads like fans, there’s a sudden spike when you first turn on the fan. I believe the mechanical portion of the relay gets jammed when this happens, and you won’t be able to toggle on or off.

For my bathroom, I have 6 CFL bulbs and one exhaust fan on two switches, I ended up having to buy two Levtion Z-wave switches that are rated for such loads. https://smile.amazon.com/Leviton-DZ15S-1BZ-Decora-Switch-Technology/dp/B01MZ0WVKH/ref=sr_1_3?ie=UTF8&qid=1522613812&sr=8-3&keywords=leviton+z-wave+switch

They work perfectly and I’ve had no issues.These tiny relays aren’t made for such high loads. If you absolutely must use a relay due to space considerations, you will need two of the single relays. There’s a reason why there’s not much of a price difference between the dual and single - the rated load is halved on the dual relay, which means it’s probably the same thing internally!

1 Like
(Walter) #92

Great haven’t try it yet I like to ask you since I am new to this and want learn if it is possible to add code that responds to toggle switch positions,
Something like if the relay is turn on by smartthings the toggle will be off we know this has to be but what if this could be cured at the switch if some go’s to shut off at the switch and smartthings has it on then do nothing until you shut off again to right position. and of course the other way around.

This would help me a lot as it drives my crazy when is in wrong position.
Thank you
Walter

(Eric M) #93

This isn’t possible programatically, but some relays have the option to do as you describe. Fibaro for example. From the Fibaro manual:

  1. Switch type
    This parameter defines as what type the device should treat the
    switch connected to the S1 and S2 terminals.
    Available settings: 0 - momentary switch
    1 - toggle switch (contact closed - ON, contact
    opened - OFF)
    2 - toggle switch (device changes status when
    switch changes status)
    Default setting: 2 Parameter size: 1 [byte]
1 Like
(Bologna Biscuit) #94

I have a issue getting my Enerwave ZWN-RSM2 device to add correctly to ST’s. I had this device working great for over a year with no issues. I had a power outage that caused a few of my devices to disappear from my devices list. No problem adding them back; all except the Enerwave ZWN-RSM2. I excluded it and then added it. The problem is it is added a duplex receptacle. I have no idea why it is not showing up as a switch. Any help would be appreciated.

(Eric M) #95

Strange, not sure why that would have happened. Can you manually change the device handler in the IDE to the Enerwave handler?

(Harsh Azad) #96

First of all thanks for the great plugin… it works through smarthings app. But somehow I am unable to use the Google Home integration to switch on/off this relay. It shows up on Google home but doesn’t respond… Is it fixable or is that a limitation of all custom device handlers? Thanks!

(Shahvez Fazail) #97

does any one know how to turn on pairing button without opening up the switch and manually pressing the pair button? any code to turn on and off the button that would put it in pairing mode?

#98

Just curious if anyone knows anything about version 5.12 of the ZWN-RSM2-PLUS, regarding what changed since version 5.11? I just noticed it on Amazon:
https://www.amazon.com/ENERWAVE-ZWN-RSM2-PLUS-NEUTRAL-REQUIRED-Version/dp/B07KQMGH7X/ref=cm_cr_arp_d_product_top?ie=UTF8

(Bryan Castro) #99

@erocm1231 hey there…i just recently purchased a ZWN-RSM2-PLUS and I am lost. I normally purchase the straight z wave switches, but this time I took at a chance at purchasing two of these relays, to use with my existing switches, to control 2 separate gang boxes, each with two 3-way switches in them. I originally installed your handler code but could not get it to work. Then, i deleted that and just tried to use the ST multi-channel control. At this point, I am so confused and will return these things if I cannot get these things working. I have been looking online a lot and i am going in circles.

On my device is says:
Model: ZWN-RSM2-PLUS
FCC ID: ZZHZWN-RSM1S

I am asking if you could just provide me the steps from a-z with what i need to do. Also, can you include a diagram of the hook up to make sure i have them connected properly.

I currently have one of these installed and here are my issues:

  • one side of the 3 way does not manually turn off lights, it just flashes the lights
  • when using ST, it is not turning off lights

Right now in my ST app i have three things showing up: <- none of them working correctly

  • switch endpoint 1
  • switch endpoint 2
  • z-wave device multichannel

hoping you can help as you seem to be the master.

if it helps, i can always give you my cell phone to discuss via phone.

(Guilherme Catarino) #100

I have the same issue, no clue how to solve.
Can anyone help?
tks

(Eric M) #101

Have you installed the device handler? Have you assigned it to the device? Have you installed device sync SmartApp & device handler for it?