Wireless Wall Switch (ZME_WALLC-S) to control Smartthings devices and routines

  1. Make sure that you are using the same device (zwave.me z wave plus secure wireless wall controller)
  2. set device to inclusion mode (on the instructions that come with the device)
  3. Smartthings should recognise this as a z wave device - add what it finds
  4. go to smartthings IDE and change device type to this one
  5. should now work with button controller smartapp

If the above steps dont work - go to live logging and let me know what you see when you press buttons

the latest version of the code is here:

/**
 *  Copyright 2015 AdamV
 *
 *  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.
 *
 */
metadata {
	definition (name: "Secure Wall Controller", namespace: "Z-Wave.me", author: "AdamV") {
		capability "Actuator"
		capability "Button"
        capability "Battery"
        
		fingerprint deviceId: "0x1801", inClusters: "0x5E, 0x8F, 0x73, 0x98, 0x86, 0x72, 0x70, 0x85, 0x2D, 0x8E, 0x80, 0x84, 0x5A, 0x59, 0x5B, 0xEF, 0x20, 0x5B, 0x26, 0x27, 0x2B, 0x60"
    }

	simulator {
		status "button 1 pushed":  "command: 9881, payload: 00 5B 03 DE 00 01"
		status "button 1 held":  "command: 98C1, payload: 00 5B 03 E4 02 01"
		status "button 2 pushed":  "command: 9881, payload: 00 5B 03 E0 00 02"
		status "button 2 held":  "command: 98C1, payload: 00 5B 03 E6 02 01"
		status "button 3 pushed":  "command: 9881, 00 5B 03 E1 00 05"
		status "button 3 held":  "command: 98C1, payload: 00 5B 03 E8 02 01"
		status "button 4 pushed":  "command: 9881, payload: 00 5B 03 E2 00 06"
		status "button 4 held":  "command: 98C1, payload: 00 5B 03 EA 02 01"
		status "wakeup":  "command: 8003, payload: FF"
	}
	tiles {
		standardTile("button", "device.button", width: 2, height: 2) {
			state "default", label: "", icon: "st.Home.home30", backgroundColor: "#ffffff"
        }
    	 valueTile("battery", "device.battery", inactiveLabel: false, decoration: "flat") {
         	tileAttribute ("device.battery", key: "PRIMARY_CONTROL"){
                        state "battery", label:'${currentValue}% battery', unit:""
        }
        }
        main "button"
		details(["button", "battery"])
	}
    
}

def parse(String description) {
	def results = []

	if (description.startsWith("Err")) {
		log.debug("An error has occurred")
		} 
    else {
        def cmd = zwave.parse(description.replace("98C1", "9881"), [0x98: 1, 0x20: 1, 0x84: 1, 0x80: 1, 0x60: 3, 0x2B: 1])
        if (cmd) {
       	results = zwaveEvent(cmd)
       	//	log.debug(cmd)
		}
//		if(cmd) results += zwaveEvent(cmd)
//		if(!results) results = [ descriptionText: cmd, displayed: false ]

    }
    log.debug("Description from device: $description")
   
	def BUTTON_IDs = [ 1, 2, 5, 6 ]
    
// Split string by comma xter, will return an array.
    String [] sections = description.split( "," )
//    log.debug("sections: $sections")

// Remove all whitespace from beginning and end of each section string.
 	for (def i = 0; i < sections.length; i++) {
        sections[ i ] = sections[ i ].trim()
	}
//    log.debug("Trimmed sections: $sections")

// Fetch the command and payload strings from the sections array.
	String command = sections[ 1 ]
	String payload = sections[ 2 ]
//	log.debug( "Command: $command" )
//	log.debug( "Payload: $payload" )

// Get the command ID and payload ID from these strings.
	String commandID = command[-4..-1]
	String payloadID = payload[-2..-1]

//	log.debug( "CommandID: $commandID" )
//	log.debug( "PayloadID: $payloadID" )

// Coerce the payloadID to a Number from a string (using base 10 as radix)
	Integer payloadIDint = payloadID.toInteger()
//    log.debug(payloadIDint)


// Determine which button was pressed.
	if ( commandID == "9881" && payloadIDint == BUTTON_IDs[ 0 ]) {
        	Integer button = 1
            results = createEvent(name: "button", value: "pushed", data: [buttonNumber: button], descriptionText: "$device.displayName button $button was pushed", isStateChange: true)
        	log.debug( "Button $button was pushed" )
            }
    else if  ( commandID == "9881" && payloadIDint == BUTTON_IDs[ 1 ]) {
        	Integer button = 2
            results = createEvent(name: "button", value: "pushed", data: [buttonNumber: button], descriptionText: "$device.displayName button $button was pushed", isStateChange: true)
        	log.debug( "Button $button was pushed" )
            }
    	else if  ( commandID == "9881" && payloadIDint == BUTTON_IDs[ 2 ]) {
        	Integer button = 3
            results = createEvent(name: "button", value: "pushed", data: [buttonNumber: button], descriptionText: "$device.displayName button $button was pushed", isStateChange: true)
        	log.debug( "Button $button was pushed" )
            }
    	else if  ( commandID == "9881" && payloadIDint == BUTTON_IDs[ 3 ]) {
        	Integer button = 4
            results = createEvent(name: "button", value: "pushed", data: [buttonNumber: button], descriptionText: "$device.displayName button $button was pushed", isStateChange: true)
        	log.debug( "Button $button was pushed" )
            }
        else if  ( commandID == "98C1" && payloadIDint == BUTTON_IDs[ 0 ]) {
        	Integer button = 1
            results = createEvent(name: "button", value: "held", data: [buttonNumber: button], descriptionText: "$device.displayName button $button was held", isStateChange: true)
        	log.debug( "Button $button was held" )
            }
    	else if  ( commandID == "98C1" && payloadIDint == BUTTON_IDs[ 1 ]) {
        	Integer button = 2
            results = createEvent(name: "button", value: "held", data: [buttonNumber: button], descriptionText: "$device.displayName button $button was pushed", isStateChange: true)
        	log.debug( "Button $button was held" )
            }
    	else if  ( commandID == "98C1" && payloadIDint == BUTTON_IDs[ 2 ]) {
        	Integer button = 4
            results = createEvent(name: "button", value: "held", data: [buttonNumber: button], descriptionText: "$device.displayName button $button was pushed", isStateChange: true)
        	log.debug( "Button $button was held" ) 
            }
    	else if  ( commandID == "98C1" && payloadIDint == BUTTON_IDs[ 3 ]) {
        	Integer button = 4
            results = createEvent(name: "button", value: "held", data: [buttonNumber: button], descriptionText: "$device.displayName button $button was pushed", isStateChange: true)
        	log.debug( "Button $button was held" )
			}    
    	else {
        	log.debug( "Commands and Button ID combinations unaccounted for happened" )
            }
         
       return results
//        return commandID
    }
  

def zwaveEvent(physicalgraph.zwave.commands.securityv1.SecurityMessageEncapsulation cmd) {
        def encapsulatedCommand = cmd.encapsulatedCommand([0x98: 1, 0x20: 1])

        // can specify command class versions here like in zwave.parse
        if (encapsulatedCommand) {
        		log.debug(encapsulatedCommand)
                return zwaveEvent(encapsulatedCommand)
        }
}

def zwaveEvent(physicalgraph.zwave.commands.centralscenev1.CentralSceneNotification cmd) {
		log.debug( "keyAttributes: $cmd.keyAttributes")
        log.debug( "sceneNumber: $cmd.sceneNumber")
        log.debug( "sequenceNumber: $cmd.sequenceNumber")
      // 	log.debug( "payload: $cmd.payload")
}

def zwaveEvent(physicalgraph.zwave.commands.wakeupv1.WakeUpNotification cmd) {
	[ createEvent(descriptionText: "${device.displayName} woke up"),
	  response(zwave.wakeUpV1.wakeUpNoMoreInformation()) ]
}

def zwaveEvent(physicalgraph.zwave.commands.batteryv1.BatteryReport cmd) {
        def map = [ name: "battery", unit: "%" ]
        if (cmd.batteryLevel == 0xFF) {  // Special value for low battery alert
                map.value = 1
                map.descriptionText = "${device.displayName} has a low battery"
                map.isStateChange = true
        } else {
                map.value = cmd.batteryLevel
                log.debug ("Battery: $cmd.batteryLevel")
        }
        // Store time of last battery update so we don't ask every wakeup, see WakeUpNotification handler
        state.lastbatt = new Date().time
        createEvent(map)
}

def configurationCmds() {
	def cmds = []
	def hubId = zwaveHubNodeId
	(1..4).each { button ->
		cmds << zwave.configurationV1.configurationSet(parameterNumber: 240+button, scaledConfigurationValue: 1).format()
	}
	(1..4).each { button ->
		cmds << zwave.configurationV1.configurationSet(parameterNumber: (button-1)*40, configurationValue: [hubId, (button-1)*40 + 1, 0, 0]).format()
		cmds << zwave.configurationV1.configurationSet(parameterNumber: (button-1)*40 + 20, configurationValue: [hubId, (button-1)*40 + 21, 0, 0]).format()
	}
	cmds
}

  def configure() {
    def commands = [ ]
	
    for (def i = 1; i <= 4; i++) {
        commands << zwave.associationV1.associationSet(groupingIdentifier: i, nodeId: zwaveHubNodeId).format()
    	commands << zwave.sceneControllerConfV1.sceneControllerConfSet(groupId:i, sceneId:i).format()
	}
	
    log.debug("Sending configuration: ${commands}")
	
    delayBetween(commands, 1250)
}
1 Like

Ok - I need some help again! So I decided to go back to this device handler to finally get the last bits working perfectly.

I finally have it reporting absolutely everything correctly:

All button pushes - handled
All button long holds - registers the start and end
Battery
Wake up notifications
configuration

Now that I do - I wanted to see if anyone has a smartapp - or knows how I can modify the button controller smart app so that when the button hold starts, it triggers lights to start dimming up or down and a variable rate (decided in the code) and when the button is released it stops the process?

Anyone done anything like this?

Thank you!

For anyone who wants the code for their own use (I haven’t seen any other wall controllers on smartthings community that can be made to 1. Look so nice (loads of faceplate and rocker switches compatible) and 2. actually handle the hold state correctly (FINALLY!) - see below:

/**
 *  Copyright 2015 AdamV
 *
 *  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.
 *
 */
metadata {
	definition (name: "Secure Wall Controller", namespace: "Z-Wave.me", author: "AdamV") {
		capability "Actuator"
		capability "Button"
capability "Contact Sensor"
capability "Battery"
		capability "Configuration" 
capability "Refresh"


		fingerprint deviceId: "0x1801", inClusters: "0x5E, 0x70, 0x85, 0x2D, 0x8E, 0x80, 0x84, 0x8F, 0x5A, 0x59, 0x5B, 0x73, 0x86, 0x72, 0xEF, 0x20, 0x5B, 0x26, 0x27, 0x2B, 0x60"
   														
   }

	simulator {
		status "button 1 pushed":  "command: 9881, payload: 00 5B 03 DE 00 01"
		status "button 1 held":  "command: 98C1, payload: 00 5B 03 E4 02 01"
		status "button 2 pushed":  "command: 9881, payload: 00 5B 03 E0 00 02"
		status "button 2 held":  "command: 98C1, payload: 00 5B 03 E6 02 01"
		status "button 3 pushed":  "command: 9881, 00 5B 03 E1 00 05"
		status "button 3 held":  "command: 98C1, payload: 00 5B 03 E8 02 01"
		status "button 4 pushed":  "command: 9881, payload: 00 5B 03 E2 00 06"
		status "button 4 held":  "command: 98C1, payload: 00 5B 03 EA 02 01"
		status "wakeup":  "command: 8003, payload: FF"
	}
	tiles {
		standardTile("button", "device.button", width: 2, height: 2) {
			state "default", label: "", icon: "st.Home.home30", backgroundColor: "#ffffff"
}
 valueTile("battery", "device.battery", inactiveLabel: false, decoration: "flat") {
 	tileAttribute ("device.battery", key: "PRIMARY_CONTROL"){
                state "battery", label:'${currentValue}% battery', unit:""
}
}
standardTile("configure", "device.button", width: 2, height: 2) {
			state "default", label: "configure", backgroundColor: "#ffffff", action: "configure"
}

main "button"
		details(["button", "battery", "configure"])
	}

}

def parse(String description) {
	def results = []

log.debug(“RAW command: $description”)
if (description.startsWith(“Err”)) {
log.debug(“An error has occurred”)
}
else {

def cmd = zwave.parse(description.replace("98C1", "9881"), [0x98: 1, 0x20: 1, 0x84: 1, 0x80: 1, 0x60: 3, 0x2B: 1, 0x26: 1])
log.debug "Parsed Command: $cmd"
if (cmd) {
results = zwaveEvent(cmd)

		}
//		if(cmd) results += zwaveEvent(cmd)
//		if(!results) results = [ descriptionText: cmd, displayed: false ]

}

/*   
	def BUTTON_IDs = [ 1, 2, 5, 6 ]

// Split string by comma xter, will return an array.

String [] sections = description.split( “,” )
// log.debug(“sections: $sections”)

// Remove all whitespace from beginning and end of each section string.
 	for (def i = 0; i < sections.length; i++) {
sections[ i ] = sections[ i ].trim()
	}
//    log.debug("Trimmed sections: $sections")

// Fetch the command and payload strings from the sections array.
	String command = sections[ 1 ]
	String payload = sections[ 2 ]
//	log.debug( "Command: $command" )
//	log.debug( "Payload: $payload" )

// Get the command ID and payload ID from these strings.
	String commandID = command[-4..-1]
	String payloadID = payload[-2..-1]

//	log.debug( "CommandID: $commandID" )
//	log.debug( "PayloadID: $payloadID" )

// Coerce the payloadID to a Number from a string (using base 10 as radix)
	Integer payloadIDint = payloadID.toInteger()
//    log.debug(payloadIDint)
*/
/*
// Determine which button was pressed.
	if ( commandID == "9881" && payloadIDint == BUTTON_IDs[ 0 ]) {
	Integer button = 1
    results = createEvent(name: "button", value: "pushed", data: [buttonNumber: button], descriptionText: "$device.displayName button $button was pushed", isStateChange: true)
	log.debug( "Button $button was pushed" )
    }

else if ( commandID == “9881” && payloadIDint == BUTTON_IDs[ 1 ]) {
Integer button = 2
results = createEvent(name: “button”, value: “pushed”, data: [buttonNumber: button], descriptionText: “$device.displayName button $button was pushed”, isStateChange: true)
log.debug( “Button $button was pushed” )
}
else if ( commandID == “9881” && payloadIDint == BUTTON_IDs[ 2 ]) {
Integer button = 3
results = createEvent(name: “button”, value: “pushed”, data: [buttonNumber: button], descriptionText: “$device.displayName button $button was pushed”, isStateChange: true)
log.debug( “Button $button was pushed” )
}
else if ( commandID == “9881” && payloadIDint == BUTTON_IDs[ 3 ]) {
Integer button = 4
results = createEvent(name: “button”, value: “pushed”, data: [buttonNumber: button], descriptionText: “$device.displayName button $button was pushed”, isStateChange: true)
log.debug( “Button $button was pushed” )
}
else if ( commandID == “98C1” && payloadIDint == BUTTON_IDs[ 0 ]) {
Integer button = 1
results = createEvent(name: “button”, value: “held”, data: [buttonNumber: button], descriptionText: “$device.displayName button $button was held”, isStateChange: true)
log.debug( “Button $button was held” )
}
else if ( commandID == “98C1” && payloadIDint == BUTTON_IDs[ 1 ]) {
Integer button = 2
results = createEvent(name: “button”, value: “held”, data: [buttonNumber: button], descriptionText: “$device.displayName button $button was pushed”, isStateChange: true)
log.debug( “Button $button was held” )
}
else if ( commandID == “98C1” && payloadIDint == BUTTON_IDs[ 2 ]) {
Integer button = 4
results = createEvent(name: “button”, value: “held”, data: [buttonNumber: button], descriptionText: “$device.displayName button $button was pushed”, isStateChange: true)
log.debug( “Button $button was held” )
}
else if ( commandID == “98C1” && payloadIDint == BUTTON_IDs[ 3 ]) {
Integer button = 4
results = createEvent(name: “button”, value: “held”, data: [buttonNumber: button], descriptionText: “$device.displayName button $button was pushed”, isStateChange: true)
log.debug( “Button $button was held” )
}
else {
log.debug( “Commands and Button ID combinations unaccounted for happened” )
}

return results
// return commandID
*/
}

def zwaveEvent(physicalgraph.zwave.commands.securityv1.SecurityMessageEncapsulation cmd) {
def encapsulatedCommand = cmd.encapsulatedCommand([0x98: 1, 0x20: 1])

// can specify command class versions here like in zwave.parse
if (encapsulatedCommand) {
		log.debug(encapsulatedCommand)
        return zwaveEvent(encapsulatedCommand)
}
}

def zwaveEvent(physicalgraph.zwave.commands.centralscenev1.CentralSceneNotification cmd) {
		log.debug( "keyAttributes: $cmd.keyAttributes")
log.debug( "sceneNumber: $cmd.sceneNumber")
log.debug( "sequenceNumber: $cmd.sequenceNumber")

// log.debug( “payload: $cmd.payload”)
}

def zwaveEvent(physicalgraph.zwave.commands.wakeupv1.WakeUpNotification cmd) {
	[ createEvent(descriptionText: "${device.displayName} woke up"),
	  response(zwave.wakeUpV1.wakeUpNoMoreInformation()) ]
}

def zwaveEvent(physicalgraph.zwave.commands.switchmultilevelv1.SwitchMultilevelGet cmd) {
	log.debug "Multilevel get: $cmd"
}
def zwaveEvent(physicalgraph.zwave.commands.switchmultilevelv1.SwitchMultilevelReport cmd) {
	log.debug "Multilevel report: $cmd"
}

def zwaveEvent(physicalgraph.zwave.commands.batteryv1.BatteryReport cmd) {
def map = [ name: "battery", unit: "%" ]
if (cmd.batteryLevel == 0xFF) {  // Special value for low battery alert
        map.value = 1
        map.descriptionText = "${device.displayName} has a low battery"
        map.isStateChange = true
} else {
        map.value = cmd.batteryLevel
        log.debug ("Battery: $cmd.batteryLevel")
}
// Store time of last battery update so we don't ask every wakeup, see WakeUpNotification handler
state.lastbatt = new Date().time
createEvent(map)
}

def zwaveEvent(physicalgraph.zwave.commands.basicv1.BasicReport cmd){
log.debug "basic event: $cmd.value"
}

def zwaveEvent(physicalgraph.zwave.commands.sceneactivationv1.SceneActivationSet cmd) {
	log.debug( "Dimming Duration: $cmd.dimmingDuration")

log.debug( “Button code: $cmd.sceneId”)

if ( cmd.sceneId == 11 ) {
Integer button = 1
sendEvent(name: “button”, value: “pushed”, data: [buttonNumber: button], descriptionText: “$device.displayName button $button was pushed”, isStateChange: true)
log.debug( “Button $button was pushed” )
}
else if ( cmd.sceneId == 13 ) {
Integer button = 1
sendEvent(name: “button”, value: “hold start”, data: [buttonNumber: button], descriptionText: “Button $button is closed”)
log.debug( “Button $button Hold start” )
}
else if ( cmd.sceneId == 15 ) {
Integer button = 1
sendEvent(name: “button”, value: “hold stop”, data: [buttonNumber: button], descriptionText: “Button $button is open”)
log.debug( “Button $button Hold stop” )
}
else if ( cmd.sceneId == 21 ) {
Integer button = 2
sendEvent(name: “button”, value: “pushed”, data: [buttonNumber: button], descriptionText: “$device.displayName button $button was pushed”, isStateChange: true)
log.debug( “Button $button was pushed” )
}
else if ( cmd.sceneId == 23 ) {
Integer button = 2
sendEvent(name: “button”, value: “hold start”, data: [buttonNumber: button], descriptionText: “Button $button is closed”)
log.debug( “Button $button Hold start” )
}
else if ( cmd.sceneId == 25 ) {
Integer button = 2
sendEvent(name: “button”, value: “hold stop”, data: [buttonNumber: button], descriptionText: “Button $button is open”)
log.debug( “Button $button Hold stop” )
}
else if ( cmd.sceneId == 12 ) {
Integer button = 3
sendEvent(name: “button”, value: “pushed”, data: [buttonNumber: button], descriptionText: “$device.displayName button $button was pushed”, isStateChange: true)
log.debug( “Button $button was pushed” )
}
else if ( cmd.sceneId == 14 ) {
Integer button = 3
sendEvent(name: “button”, value: “hold start”, data: [buttonNumber: button], descriptionText: “Button $button is closed”)
log.debug( “Button $button Hold start” )
}
else if ( cmd.sceneId == 16 ) {
Integer button = 3
sendEvent(name: “button”, value: “hold stop”, data: [buttonNumber: button], descriptionText: “Button $button is open”)
log.debug( “Button $button Hold stop” )
}
else if ( cmd.sceneId == 22 ) {
Integer button = 4
sendEvent(name: “button”, value: “pushed”, data: [buttonNumber: button], descriptionText: “$device.displayName button $button was pushed”, isStateChange: true)
log.debug( “Button $button was pushed” )
}
else if ( cmd.sceneId == 24 ) {
Integer button = 4
sendEvent(name: “button”, value: “hold start”, data: [buttonNumber: button], descriptionText: “Button $button is closed”)
log.debug( “Button $button Hold start” )
}
else if ( cmd.sceneId == 26 ) {
Integer button = 4
sendEvent(name: “button”, value: “hold stop”, data: [buttonNumber: button], descriptionText: “Button $button is open”)
log.debug( “Button $button Hold stop” )
}
else {
log.debug( “Commands and Button ID combinations unaccounted for happened” )
}
}

/*
def zwaveEvent(physicalgraph.zwave.Command cmd) {
	[ descriptionText: "$device.displayName: $cmd", linkText:device.displayName, displayed: false ]
	log.debug "command event: $cmd"
}
*/

/* def configure() {
	def cmds = configurationCmds()
	log.debug("Sending configuration: $cmds")
	return cmds
}
def configurationCmds() {
	//zwave.configurationV1.configurationReport().format()

//zwave.associationGrpInfoV1.associationGroupCommandListGet().format()
//zwave.associationCommandConfigurationV1.commandConfigurationGet().format()

	//zwave.configurationV1.configurationSet(parameterNumber:11, size:14, scaledConfigurationValue:8).format()
	def cmds = []
	def hubId = zwaveHubNodeId
	(11..14).each { button ->
		cmds << zwave.configurationV1.configurationSet(parameterNumber: button, scaledConfigurationValue: 4).format()
	}
/*	(1..4).each { button ->
		cmds << zwave.configurationV1.configurationSet(parameterNumber: (button-1)*40, configurationValue: [hubId, (button-1)*40 + 1, 0, 0]).format()
		cmds << zwave.configurationV1.configurationSet(parameterNumber: (button-1)*40 + 20, configurationValue: [hubId, (button-1)*40 + 21, 0, 0]).format()
	}*/

/*
cmds

}
*/

  def configure() {

def commands = [ ]

   //     for (def i = 1; i <= 2; i++) {

// commands << zwave.associationV1.associationSet(groupingIdentifier: i, nodeId: zwaveHubNodeId).format()
// commands << zwave.sceneControllerConfV1.sceneControllerConfSet(groupId:i, sceneId:i).format()
// commands << zwave.configurationV1.configurationSet(parameterNumber:i, size:1, scaledConfigurationValue:2).format()
//}

for (def i = 11; i <= 12; i++) {
commands << zwave.associationV1.associationSet(groupingIdentifier: 2, nodeId: zwaveHubNodeId).format()
// commands << zwave.sceneControllerConfV1.sceneControllerConfSet(groupId:i, sceneId:i).format()
commands << zwave.configurationV1.configurationSet(parameterNumber:i, size:1, scaledConfigurationValue:4).format()
}
for (def i = 13; i <= 14; i++) {
commands << zwave.associationV1.associationSet(groupingIdentifier: 3, nodeId: zwaveHubNodeId).format()
// commands << zwave.sceneControllerConfV1.sceneControllerConfSet(groupId:i, sceneId:i).format()
commands << zwave.configurationV1.configurationSet(parameterNumber:i, size:1, scaledConfigurationValue:4).format()
}

log.debug(“Sending configuration: ${commands}”)

delayBetween(commands, 1250)
}

Nice!

Are you going to put a release topic in the device type section? That way more people will find it. :sunglasses: Or do you want to wait for more feedback?

https://community.smartthings.com/c/projects-stories/community-created-device-types

I didn’t know about that thread - good idea!

I think there are a few things I need to do before I release:

  • Clean up code (loads of redundant stuff in there now)
  • Create (or find) an accompanying smartapp (without this its not as useful as it could be)
  • I’ll have to write up the configuration process (it’s not intuitive)
  • Probably take some pics of the completed switches with cover plates and rockers so people know what this looks like

@tgauchat & @codytruscott If you know of any smartapps that facilitate dimming up or down based on the duration that a button is held (starts dimming up or down on trigger and stops dimming up or down on different trigger) - please let me know

Also - anyone know if its possible to update the firmware of a z-wave plus device through smartthings? I ask this because some of the wall controllers that arrive are using a firmware 1.0 and others 1.3. the ones on 1.3 are noticeably quicker at communicating with the hub.

Many thanks

Tagging @duncan on firmware updates for Zwave plus devices

We’re planning to add Z-Wave OTA firmware updates but it hasn’t been put on a timeline yet – it’s likely still a ways out.

2 Likes

Moving to this thread (all code updated here):

1 Like

Hi @AdamV

if you have time could you help out with the wall switch.

duwi z-wave.me 05443, if I include it into the network it is detected as aeon key fob and looking at the log nothing is received when I press the a button. so I have changed the device over to your device type " Secure Wall Controller" and then press configure. in the log I see ‎21‎:‎49‎:‎51: debug Sending configuration, I try waking the switch up. but still nothing in the log.

I have found some information bellow about the switch. it used to work with vera ok.

http://www.vrdigitalworld.com/smarthome/test-des-interrupteurs-muraux-duwi-z-wave-me-05443-et-05460?lang=en

Thanks

Paul

Hi Paul,

Firstly, this is a different switch, so I wouldn’t expect it to work out the box with this device type.

Also, just because nothing shows in the logs, doesn’t mean that it’s not registering your button presses.

So I would try the following to ascertain if it is working / not working and how to sort it:

  1. Make sure that you do a full factory reset on the device and then include to smartthings

  2. reassign the original aeon keyfob device type. Then go to the button controller smartapp (from marketplace) and assign all four button presses to lights or sometihing in your house that you would notice (I realise that this device only has two buttons - but in the event that the aeon device type does work then we wont know which number of button it shows up as). Then test the switch and see if there is a result.

  3. If no. 1 does not work / yield any results, then reassign my device type and make an edit to line 71 (currently nothing there) and put: log.debug (“Parsed command: $cmd”)

  4. Then go to live logging and press the buttons. For each button press you should get a RAW command entry and a Parsed command entry. Then put these results here and we’ll take a look and see what we can do. If you do not get results for RAW and Parsed then it means that either the device is not compatible with Smartthings at all or is not configured correctly. If the issue is configuration then we’ll have to find the original manual and do some fiddling - and it wont be easy… but it may be fixable.

1 Like

Hi @AdamV

I have tried they above and nothing was reported at all in the log files. I am wondering if the switch needs a parameter changing to work. I have given up on them and purchased one of the Popp 009303 Z-Wave Plus Battery Wall Controller and got that to work with your code in 10 min. if you fancy a challenge I would gladly loan you one of the switched to play with if you like. (I would cover postage both ways)

Thanks for your support and code.

Paul

Glad to hear that you’re using the newer model - I find that they are pretty responsive. Don’t forget to find nicer back plates and switches than the ones that come with (if you care about those kind of things)

I’m happy to have a go at the other switch - but only if there are others who are affected by this - otherwise it would be a load of work for nothing seeing as you are happy with the Popp solution.

Can you please share some details related with your setup here?
What are the exact components you are using and what are their specifications?
Also which wireless interface it uses for the control?

pcb fabrication

My setup just includes multiple Wall controllers (these to be exact) but the device type and smartapp that I have made will work with a few different variations of this. I have also some glass and chrome faceplates and buttons which are compatible with this controller. The wireless interface is Z Wave

Has anyone had any luck in connecting the duwi z-wave.me 05443?
WEll it connects, but I can’t do anything with it. I’d like to set it up to turn off all the lights downstairs…

Any help would be greatly appreciated!!

Unfortunately I don’t have that device.

If I were in your position I’d include it with ST, and then in the device handler get it to output whatever it receives to the logs so we can see what happens on button presses, holds, double clicks etc you’ll need to know that as the starting point.

Do you have the instructions for it? It will probably need some configuration as well, and all the configuration settings will be explained in the manual.

Hi Adam,

I’ll try that. The included manual is quite bad and so far I haven’t been able to find a more comprehensive one.

It would be quite cool to have these switches working as they fit on the wall like it’s supposed to be there :slight_smile:

Hi, i also bought some of these Wall Switches. The Type 1 to be exact : Z-Wave-WallC-S.
They work really well, and report all 4 buttons individually and even do hold and release events :slight_smile:

However, i have some issues not realted to the connection to smartthings at all… maybe somebody of you already had the same problem. The Wall controler also needs the Frame and Paddles. In the Manual it lists some different kind of manufacturers and series its compatible with. One of them is the Reflex SI from Busch & Jäger. The Frame fits perfectly, but the double paddle i bought (2505-214) does not fit at all.

Anybody knows which paddles are compatible?
I never thought that there are thousands of options to simple wall switches…

Go to schalterversand.de and buttons that are compatible with “radio transmitters” will work.

I’m currently abroad so wont be fast at responding if you run into trouble - if you can wait until 7th July I’ll be happy to help you find compatible buttons - they are tricky to find but well worth it when you do!

1 Like

Great tip! Thx… however, i dont seem to find just the paddles available there… There are some complete solutions, from Kopp (HK05; Paris), but i’d like to use at least some of the Busch & Jäger components i already have (the frame) if at all possible…

Am I right to assume you are using the smartthings UK hub in Germany as well?

Duncan
I am having a similar issue to these guys but with a configure command on a Cooper Aspire scene controller. Here are the logs I’m getting:

3a070224-d2eb-4030-9f71-dc2eff4af506 9:54:58 PM: debug Cooper Scene Cont: null
3a070224-d2eb-4030-9f71-dc2eff4af506 9:54:58 PM: warn Exception ‘java.lang.IndexOutOfBoundsException: toIndex = 9’ encountered parsing 'cmd: 7006, payload: 05 FF E0’
3a070224-d2eb-4030-9f71-dc2eff4af506 9:54:58 PM: debug Parsing Cooper Scene Cont: zw device: 1A, command: 7006, payload: 05 FF E0
3a070224-d2eb-4030-9f71-dc2eff4af506 9:54:57 PM: debug Cooper Scene Cont: null
3a070224-d2eb-4030-9f71-dc2eff4af506 9:54:57 PM: warn Exception ‘java.lang.IndexOutOfBoundsException: toIndex = 9’ encountered parsing 'cmd: 7006, payload: 04 FF E0’
3a070224-d2eb-4030-9f71-dc2eff4af506 9:54:57 PM: debug Parsing Cooper Scene Cont: zw device: 1A, command: 7006, payload: 04 FF E0
3a070224-d2eb-4030-9f71-dc2eff4af506 9:54:56 PM: debug Cooper Scene Cont: null
3a070224-d2eb-4030-9f71-dc2eff4af506 9:54:56 PM: warn Exception ‘java.lang.IndexOutOfBoundsException: toIndex = 9’ encountered parsing 'cmd: 7006, payload: 03 FF E0’
3a070224-d2eb-4030-9f71-dc2eff4af506 9:54:56 PM: debug Parsing Cooper Scene Cont: zw device: 1A, command: 7006, payload: 03 FF E0
3a070224-d2eb-4030-9f71-dc2eff4af506 9:54:55 PM: debug Cooper Scene Cont: null
3a070224-d2eb-4030-9f71-dc2eff4af506 9:54:55 PM: warn Exception ‘java.lang.IndexOutOfBoundsException: toIndex = 9’ encountered parsing 'cmd: 7006, payload: 02 FF E0’
3a070224-d2eb-4030-9f71-dc2eff4af506 9:54:55 PM: debug Parsing Cooper Scene Cont: zw device: 1A, command: 7006, payload: 02 FF E0
3a070224-d2eb-4030-9f71-dc2eff4af506 9:54:54 PM: debug Cooper Scene Cont: null
3a070224-d2eb-4030-9f71-dc2eff4af506 9:54:54 PM: warn Exception ‘java.lang.IndexOutOfBoundsException: toIndex = 9’ encountered parsing 'cmd: 7006, payload: 01 FF 0F’
3a070224-d2eb-4030-9f71-dc2eff4af506 9:54:54 PM: debug Parsing Cooper Scene Cont: zw device: 1A, command: 7006, payload: 01 FF 0F

The commands being sent are:
delayBetween([
zwave.configurationV1.configurationGet(parameterNumber:1).format(),
zwave.configurationV1.configurationGet(parameterNumber:2).format(),
zwave.configurationV1.configurationGet(parameterNumber:3).format(),
zwave.configurationV1.configurationGet(parameterNumber:4).format(),
zwave.configurationV1.configurationGet(parameterNumber:5).format()
],1000)

I’m wondering if you have any ideas for how to get this working.

Thanks Scott