[RELEASE] Vision Shock Sensor (ZS 5101)

So you’re seeing that warning with the default DTH that ST assigned?

If so, can you post pictures of the manual?

Are you seeing the same live logging errors that @Craig_Shaffer posted?

Here is the only page with real info:

Thanks.

The DTH below is the same as the live one, but it has a bunch of additional logging so you should only install it if you’re trying to get the Monoprice device to work.

After updating the code and publishing it, open live logging and tap the device, then wait about 15 seconds, and tap it again, and do that a few more times. Put it on a table or something and tap it at a different strength each time, you can also try shaking it very lightly because I think if you shake it too hard it won’t report anything.

The device reports inactive after about 10 seconds so you need to wait at least 15 seconds between each test.

Then post the live logging data.

/**
 *  Vision Shock Sensor v1.2.1 (TEST2)
 *  (ZS 5101)
 *
 *  Author: 
 *    Kevin LaFramboise (krlaframboise)
 *
 *  URL to documentation: https://community.smartthings.com/t/release-vision-shock-sensor-zs-5101/81628?u=krlaframboise
 *    
 *  Changelog:
 *
 *    1.2.1 (08/31/2017)
 *    	- Using Notification Report to detect activity is unreliable in the Monoprice version so switched to BasicSet.
 *
 *    1.2 (07/23/2017)
 *    	- Fixed potential issue with secure version.
 *
 *    1.1 (05/23/2017)
 *    	- Added support for the Monoprice Shock Sensor
 *
 *    1.0.2 (04/23/2017)
 *    	- SmartThings broke parse method response handling so switched to sendhubaction.
 *
 *    1.0.1 (04/20/2017)
 *      - Added workaround for ST Health Check bug.
 *
 *    1.0 (03/13/2017)
 *      -  Initial Release
 *
 *  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: "Vision Shock Sensor", 
		namespace: "krlaframboise", 
		author: "Kevin LaFramboise"
	) {
		capability "Sensor"
		capability "Acceleration Sensor"
		capability "Contact Sensor"
		capability "Motion Sensor"
		capability "Water Sensor"
		capability "Battery"
		capability "Configuration"
		capability "Tamper Alert"
		capability "Refresh"
		capability "Health Check"
				
		attribute "lastCheckin", "string"
		attribute "lastActivity", "string"
		attribute "lastUpdate", "string"
		attribute "primaryStatus", "enum", ["aActive", "aInactive", "mActive", "mInactive"]
		attribute "secondaryStatus", "enum", ["open", "closed", "active", "inactive", "wet", "dry", "detected", "clear", ""]
		
		fingerprint mfr:"0109", prod:"2003", deviceJoinName:"Vision Shock Sensor"
				
		fingerprint mfr:"0109", prod:"2003", model:"0307", deviceJoinName:"Monoprice Shock Sensor"
	}
	
	simulator { }
	
	preferences {	
		input "primaryCapability", "enum",
			title: "Primary Capability:",
			defaultValue: primaryCapabilitySetting,
			required: false,
			displayDuringSetup: true,
			options: primaryCapabilityOptions.collect { it.name }
		input "secondaryCapability", "enum",
			title: "Secondary Capability (Tamper/External Sensor):",
			defaultValue: secondaryCapabilitySetting,
			required: false,
			displayDuringSetup: true,
			options: secondaryCapabilityOptions.collect { it.name }
		input "checkinInterval", "enum",
			title: "Checkin Interval:",
			defaultValue: checkinIntervalSetting,
			required: false,
			displayDuringSetup: true,
			options: checkinIntervalOptions.collect { it.name }
		input "batteryReportingInterval", "enum",
			title: "Battery Reporting Interval:",
			defaultValue: batteryReportingIntervalSetting,
			required: false,
			displayDuringSetup: true,
			options: checkinIntervalOptions.collect { it.name }
		input "debugOutput", "bool", 
			title: "Enable debug logging?", 
			defaultValue: true, 
			required: false
	}

	tiles(scale: 2) {
		multiAttributeTile(name:"primaryTile", type: "generic", width: 6, height: 4){
			tileAttribute ("device.primaryStatus", key: "PRIMARY_CONTROL") {
				attributeState "aInactive", 
					label:'INACTIVE', 
					icon:"st.motion.acceleration.inactive", 
					backgroundColor:"#ffffff"
				attributeState "aActive", 
					label:'ACTIVE', 
					icon:"st.motion.acceleration.active", 
					backgroundColor:"#00a0dc"
				attributeState "mInactive", 
					label:'NO MOTION', 
					icon:"st.motion.motion.inactive", 
					backgroundColor:"#ffffff"
				attributeState "mActive", 
					label:'MOTION', 
					icon:"st.motion.motion.active", 
					backgroundColor:"#00a0dc"
			}
			tileAttribute ("device.secondaryStatus", key: "SECONDARY_CONTROL") {
				attributeState "", label:''
				attributeState "closed", label:'CLOSED'
				attributeState "open", label:'OPEN'
				attributeState "inactive", label:'NO MOTION'
				attributeState "active", label:'MOTION'
				attributeState "dry", label:'DRY'
				attributeState "wet", label:'WET'
				attributeState "detected", label:'TAMPER DETECTED'
				attributeState "clear", label:'TAMPER CLEAR'				
			}
		}	
		
		valueTile("battery", "device.battery", decoration: "flat", width: 2, height: 2){
			state "battery", label:'${currentValue}% Battery', unit:""
		}
		
		standardTile("refresh", "device.refresh", width: 2, height: 2) {
			state "refresh", label:'Refresh', action: "refresh", icon:"st.secondary.refresh-icon"
		}
		
		valueTile("lastActivity", "device.lastActivity", decoration: "flat", width: 2, height: 2){
			state "lastActivity", label:'Last\nActivity\n\n${currentValue}'
		}
					
		main "primaryTile"
		details(["primaryTile", "battery", "lastActivity", "refresh"])
	}
}

// Sets flag so that configuration is updated the next time it wakes up.
def updated() {	
	// This method always gets called twice when preferences are saved.
	if (!isDuplicateCommand(state.lastUpdated, 3000)) {
		state.lastUpdated = new Date().time
		logTrace "updated()"
		state.pendingChanges = true
		refresh()
	}
	return []
}

// Initializes the device state when paired and updates the device's configuration.
def configure() {
	logTrace "configure()"
	def cmds = []
	
	if (!state.isConfigured) {
		sendEvent(createLastActivityEventMap())
		state.isConfigured = true		
		logTrace "Waiting 1 second because this is the first time being configured"		
		cmds << "delay 1000"
	}
	
	initializeCheckin()
	
	cmds << wakeUpIntervalSetCmd(checkinIntervalSettingMinutes)
		
	return cmds
}

private initializeCheckin() {
	// Set the Health Check interval so that it can be skipped once plus 2 minutes.
	def checkInterval = ((checkinIntervalSettingMinutes * 2 * 60) + (2 * 60))
	
	logTrace "initializeCheckin() checkInterval=${checkInterval}"
	
	sendEvent(name: "checkInterval", value: checkInterval, displayed: false, data: [protocol: "zwave", hubHardwareId: device.hub.hardwareID])
}

// Required for HealthCheck Capability, but doesn't actually do anything because this device sleeps.
def ping() {
	logDebug "ping()"	
}

def refresh() {
	logTrace "refresh()"
	createPrimaryEventMaps(false)?.each {
		sendEvent(it)
	}
	createSecondaryEventMaps(false)?.each {
		sendEvent(it)
	}
	resetAttribute("contact", "closed")
	resetAttribute("acceleration", "inactive")
	resetAttribute("motion", "inactive")
	resetAttribute("water", "dry")
	resetAttribute("tamper", "clear")
	return []
}

private resetAttribute(attr, val) {
	if (attr != primaryCapabilitySettingAttribute && attr != secondaryCapabilitySettingAttribute && device.currentValue(attr) != val) {
		sendEvent(name: attr, value: val, displayed: false)
	}
}

// Processes messages received from device.
def parse(String description) {
	def result = []

	if (!isDuplicateCommand(state.lastCheckin, 30000)) {
		state.lastCheckin = new Date().time
		sendEvent(name: "lastCheckin", value: convertToLocalTimeString(new Date()), displayed: false, isStateChange: true)
	}	
	def cmd = zwave.parse(description, commandClassVersions)
	if (cmd) {
		logTrace "Parsed Cmd: $cmd"
		result += zwaveEvent(cmd)
	}
	else {
		log.warn "Unable to parse description: $description"
	}		
	return result
}

def zwaveEvent(physicalgraph.zwave.commands.securityv1.SecurityMessageEncapsulation cmd) {
	def encapCmd = cmd.encapsulatedCommand(commandClassVersions)
		
	def result = []
	if (encapCmd) {
		result += zwaveEvent(encapCmd)
	}
	else {
		log.warn "Unable to extract encapsulated cmd from $cmd"
		result << createEvent(descriptionText: "$cmd")
	}
	return result
}

private getCommandClassVersions() {
	[		
		0x20: 1,  // Basic		
		0x22: 1,  // Application Status (Model 0308)
		0x30: 2,	// Sensor Binary
		0x59: 1,  // AssociationGrpInfo (Model 0308)
		0x5A: 1,  // DeviceResetLocally (Model 0308)
		0x5E: 2,  // ZwaveplusInfo (Model 0308)
		0x7A: 2,  // Firmware Update MD (Model 0308)
		0x71: 3,  // Alarm v1 or Notification (v4)
		0x72: 2,  // ManufacturerSpecific
		0x73: 1,  // Powerlevel (Model 0308)
		0x80: 1,  // Battery
		0x84: 2,  // WakeUp
		0x85: 2,  // Association
		0x86: 1,  // Version (v2)
		0x98: 1   // Security (Model 0308)
	]
}

// Updates devices configuration, if needed, and creates the event with the last lastcheckin event.
def zwaveEvent(physicalgraph.zwave.commands.wakeupv2.WakeUpNotification cmd)
{
	logTrace "WakeUpNotification: $cmd"
	def cmds = []
	
	sendEvent(name: "lastUpdate", value: convertToLocalTimeString(new Date()), displayed: false, isStateChange: true)
	
	if (!state.isConfigured || state.pendingChanges) {
		state.pendingChanges = false
		cmds += configure()
	}
	
	if (canReportBattery()) {
		cmds << batteryGetCmd()
	}
		
	if (cmds) {
		cmds << "delay 2000"
	}
	cmds << wakeUpNoMoreInfoCmd()
	
	return response(cmds)
}

private canReportBattery() {
	def reportEveryMS = (batteryReportingIntervalSettingMinutes * 60 * 1000)
		
	return (!state.lastBatteryReport || ((new Date().time) - state.lastBatteryReport > reportEveryMS)) 
}

// Creates the event for the battery level.
def zwaveEvent(physicalgraph.zwave.commands.batteryv1.BatteryReport cmd) {
	logTrace "BatteryReport: $cmd"
	def val = (cmd.batteryLevel == 0xFF ? 1 : cmd.batteryLevel)
	if (val > 100) {
		val = 100
	}
	else if (val <= 0) {
		val = 1
	}
	state.lastBatteryReport = new Date().time		
	[
		createEvent(createEventMap("battery", val, "%"))
	]
}	

def zwaveEvent(physicalgraph.zwave.commands.basicv1.BasicSet cmd) {
	logTrace "Basic Set: $cmd"	
	def result = []
	createPrimaryEventMaps(cmd.value == 0XFF)?. each {
		result << createEvent(it)
	}	
	return result
}

def zwaveEvent(physicalgraph.zwave.commands.sensorbinaryv2.SensorBinaryReport cmd) {
	logTrace "SensorBinaryReport: $cmd"	
	return []
}

// Logs unexpected events from the device.
def zwaveEvent(physicalgraph.zwave.Command cmd) {
	logDebug "Unhandled Command: $cmd"
	return []
}

// Contact event is being created using Sensor Binarry command class so this event is ignored.
def zwaveEvent(physicalgraph.zwave.commands.notificationv3.NotificationReport cmd) {
	logTrace "NotificationReport: $cmd"		
	def result = []
	if (cmd.notificationType == 7) {
		if (cmd.event == 2 || cmd.v1AlarmType == 2) {
			// createPrimaryEventMaps(cmd.v1AlarmLevel == 0XFF)?. each {
				// result << createEvent(it)
			// }			
		}
		else if (cmd.event == 3) {
			createSecondaryEventMaps(true)?.each {
				result << createEvent(it)
			}
		}
		if (!isDuplicateCommand(state.lastActivity, 5000)) {
			state.lastActivity = new Date().time
			result << createEvent(createLastActivityEventMap())
		}
	}	
	return result
}

private createLastActivityEventMap() {
	return [name: "lastActivity", value: convertToLocalTimeString(new Date()), displayed: false]
}

private createPrimaryEventMaps(isActive) {	
	def statusVal
	if (primaryCapabilitySettingAttribute == "motion") {
		statusVal = isActive ? "mActive" : "mInactive"
	}
	else {
		statusVal = isActive ? "aActive" : "aInactive"
	}
	def result = []
	result << createEventMap(primaryCapabilitySettingAttribute, isActive ? "active" : "inactive")
	result << [name: "primaryStatus", value: statusVal, displayed: false]
	return result
}

private createSecondaryEventMaps(isActive) {
	def val
	switch (secondaryCapabilitySettingAttribute) {
		case "motion":
			val = isActive ? "active" : "inactive"
			break
		case "contact":
			val = isActive ? "open" : "closed"
			break
		case "water":
			val = isActive ? "wet" : "dry"
			break
		case "tamper":
			val = isActive ? "detected" : "clear"
			break
		default:
			val = ""
	}
	
	def result = []
	if (val) {
		result << createEventMap(secondaryCapabilitySettingAttribute, val)
	}
	result << [name: "secondaryStatus", value: val, displayed: false]
	return result
}

private createEventMap(name, value, unit=null) {	
	def isStateChange = (device.currentValue(name) != value)	
	def eventMap = [
		name: name,
		value: value,
		displayed: isStateChange,
		isStateChange: isStateChange,
		descriptionText: "${name} ${value}${unit ? unit : ''}"
	]
	if (unit) {
		eventMap.unit = unit
	}	
	if (isStateChange) {
		logDebug "${eventMap.descriptionText}"
	}
	// logTrace "Creating Event: ${eventMap}"
	return eventMap
}

private wakeUpIntervalSetCmd(minutesVal) {
	state.checkinIntervalMinutes = minutesVal
	logTrace "wakeUpIntervalSetCmd(${minutesVal})"
	
	return secureCmd(zwave.wakeUpV2.wakeUpIntervalSet(seconds:(minutesVal * 60), nodeid:zwaveHubNodeId))
}

private wakeUpNoMoreInfoCmd() {
	return secureCmd(zwave.wakeUpV2.wakeUpNoMoreInformation())
}

private batteryGetCmd() {
	return secureCmd(zwave.batteryV1.batteryGet())
}

private secureCmd(cmd) {
	if (zwaveInfo?.zw?.contains("s") || ("0x98" in device.rawDescription?.split(" "))) {
		return zwave.securityV1.securityMessageEncapsulation().encapsulate(cmd).format()
	}
	else {
		return cmd.format()
	}	
}

// Settings
private getPrimaryCapabilitySettingAttribute() {
	return primaryCapabilityOptions?.find { primaryCapabilitySetting == it.name }?.value ?: "acceleration"
}

private getPrimaryCapabilitySetting() {
	return settings?.primaryCapability ?: findDefaultOptionName(primaryCapabilityOptions)
}

private getSecondaryCapabilitySettingAttribute() {
	return secondaryCapabilityOptions?.find { secondaryCapabilitySetting == it.name }?.value
}

private getSecondaryCapabilitySetting() {
	return settings?.secondaryCapability ?: findDefaultOptionName(secondaryCapabilityOptions)
}

private getCheckinIntervalSettingMinutes() {
	return convertOptionSettingToInt(checkinIntervalOptions, checkinIntervalSetting) ?: 720
}

private getCheckinIntervalSetting() {
	return settings?.checkinInterval ?: findDefaultOptionName(checkinIntervalOptions)
}

private getBatteryReportingIntervalSettingMinutes() {
	return convertOptionSettingToInt(checkinIntervalOptions, batteryReportingIntervalSetting) ?: checkinIntervalSettingMinutes
}

private getBatteryReportingIntervalSetting() {
	return settings?.batteryReportingInterval ?: findDefaultOptionName(checkinIntervalOptions)
}

private getCheckinIntervalOptions() {
	[
		[name: "10 Minutes", value: 10],
		[name: "15 Minutes", value: 15],
		[name: "30 Minutes", value: 30],
		[name: "1 Hour", value: 60],
		[name: "2 Hours", value: 120],
		[name: "3 Hours", value: 180],
		[name: "6 Hours", value: 360],
		[name: "9 Hours", value: 540],
		[name: formatDefaultOptionName("12 Hours"), value: 720],
		[name: "18 Hours", value: 1080],
		[name: "24 Hours", value: 1440]
	]
}

private getPrimaryCapabilityOptions() {
	[
		[name: formatDefaultOptionName("Acceleration Sensor"), value: "acceleration"],
		[name: "Motion Sensor", value: "motion"]
	]
}

private getSecondaryCapabilityOptions() {
	[
		[name: "Contact Sensor", value: "contact"],
		[name: "Motion Sensor", value: "motion"],
		[name: "None", value: ""],
		[name: formatDefaultOptionName("Tamper Alert"), value: "tamper"],
		[name: "Water Sensor", value: "water"]
	]
}

private convertOptionSettingToInt(options, settingVal) {
	return safeToInt(options?.find { "${settingVal}" == it.name }?.value, 0)
}

private formatDefaultOptionName(val) {
	return "${val}${defaultOptionSuffix}"
}

private findDefaultOptionName(options) {
	def option = options?.find { it.name?.contains("${defaultOptionSuffix}") }
	return option?.name ?: ""
}

private getDefaultOptionSuffix() {
	return "   (Default)"
}

private safeToInt(val, defaultVal=-1) {
	return "${val}"?.isInteger() ? "${val}".toInteger() : defaultVal
}

private convertToLocalTimeString(dt) {
	def timeZoneId = location?.timeZone?.ID
	if (timeZoneId) {
		return dt.format("MM/dd/yyyy hh:mm:ss a", TimeZone.getTimeZone(timeZoneId))
	}
	else {
		return "$dt"
	}	
}

private isDuplicateCommand(lastExecuted, allowedMil) {
	!lastExecuted ? false : (lastExecuted + allowedMil > new Date().time) 
}

private logDebug(msg) {
	if (settings?.debugOutput || settings?.debugOutput == null) {
		log.debug "$msg"
	}
}

private logTrace(msg) {
	log.trace "$msg"
}

I tried it but there was nothing posted to the log when the unit was
tapped. I tried it several times but nothing was posted to the log.
Perhaps my sensor is just no good.

Sorry for my delayed response.
I get the same behavior. I just tried the debug code above and do not get anything logged from taps. The red light on the unit does flash when tapped. If you keep shaking it the light does not flash again.
If you open the unit no messages log. If you close it (thus pushing the tamper switch closed), the following is logged:
8:23:34 PM: trace WakeUpNotification: WakeUpNotification()
b2cf1e88-3973-4ba4-95ac-cbfeb4f9c8d3
8:23:34 PM: trace Parsed Cmd: SecurityMessageEncapsulation(commandByte: [], commandClassIdentifier: 132, commandIdentifier: 7, reserved13: 0, secondFrame: false, sequenceCounter: 0, sequenced: false)

Another user just reported that the Monoprice shock sensor works with the generic zwave door/window sensor DTH.

Have you tried that DTH?

My vision shock (actually Monoprice) sensors work fine for detecting vibration on the windows. I have them configured to send a notification and set off the alarm siren. That works fine. The problem is that they are not under the control of the top level Android app arm/disarm setting. The door sensors obey the arm/disarm, but not the vision shock. So if I set the system to “disarmed” a twig hitting the window will set the siren off. Clearly that’s not right. “Disarmed” should apply to all sensors. Any ideas/suggestions how I might tackle this? Thanks.

The default handler did not work for me last week BUT it is possible that it was in a weird state with all of the mucking around that I’ve been doing. I’ll do the whole ‘remove device, delete DTHs, pull batteries out of hub, etc’ tonight and report back what happens with a clean install.

OK. The default handler DOES work. I didn’t even need to reset the hub. I just deleted the device, deleted the custom DTH and did ‘add a thing’.

I’m not going to be available until next Monday so if there’s anything you want me to try, I’ll gladly do it then.

Here’s what’s logged when shaken:

7:41:06 PM: debug Parsed 'zw device: 0A, command: 9881, payload: 00 71 05 02 FF 00 FF 07 02 00 ’ to [[name:contact, value:open, descriptionText:Z-Wave Plus Door/Window Sensor is open, isStateChange:false, displayed:false, linkText:Z-Wave Plus Door/Window Sensor]]
6569cb70-1683-45f5-8c84-ffb6e35d221a 7:41:06 PM: debug encapsulated: NotificationReport(event: 2, eventParameter: [], eventParametersLength: 0, notificationStatus: 255, notificationType: 7, reserved61: 0, sequence: false, v1AlarmLevel: 255, v1AlarmType: 2, zensorNetSourceNodeId: 0)
6569cb70-1683-45f5-8c84-ffb6e35d221a 7:41:06 PM: debug Parsed 'zw device: 0A, command: 9881, payload: 00 20 01 FF ’ to [name:contact, value:open, descriptionText:Z-Wave Plus Door/Window Sensor is open, isStateChange:true, displayed:true, linkText:Z-Wave Plus Door/Window Sensor]
6569cb70-1683-45f5-8c84-ffb6e35d221a 7:41:06 PM: debug encapsulated: BasicSet(value: 255)

This is the end-of-motion log:

7:41:17 PM: debug Parsed 'zw device: 0A, command: 9881, payload: 00 71 05 02 00 00 FF 07 00 01 02 ’ to [[descriptionText:Z-Wave Plus Door/Window Sensor covering replaced, isStateChange:true, displayed:false, linkText:Z-Wave Plus Door/Window Sensor]]
6569cb70-1683-45f5-8c84-ffb6e35d221a 7:41:17 PM: debug encapsulated: NotificationReport(event: 0, eventParameter: [2], eventParametersLength: 1, notificationStatus: 255, notificationType: 7, reserved61: 0, sequence: false, v1AlarmLevel: 0, v1AlarmType: 2, zensorNetSourceNodeId: 0)
6569cb70-1683-45f5-8c84-ffb6e35d221a 7:41:17 PM: debug Parsed 'zw device: 0A, command: 9881, payload: 00 20 01 00 ’ to [name:contact, value:closed, descriptionText:Z-Wave Plus Door/Window Sensor is closed, isStateChange:true, displayed:true, linkText:Z-Wave Plus Door/Window Sensor]
6569cb70-1683-45f5-8c84-ffb6e35d221a 7:41:17 PM: debug encapsulated: BasicSet(value: 0)

This is what was logged during the initial device add:

6569cb70-1683-45f5-8c84-ffb6e35d221a 7:38:06 PM: debug Parsed 'zw device: 0A, command: 9881, payload: 00 20 01 00 ’ to [name:contact, value:closed, descriptionText:Z-Wave Plus Door/Window Sensor is closed, isStateChange:true, displayed:true, linkText:Z-Wave Plus Door/Window Sensor]
6569cb70-1683-45f5-8c84-ffb6e35d221a 7:38:06 PM: debug encapsulated: BasicSet(value: 0)
6569cb70-1683-45f5-8c84-ffb6e35d221a 7:37:55 PM: debug Parsed 'zw device: 0A, command: 9881, payload: 00 71 05 02 FF 00 FF 07 02 00 ’ to [[name:contact, value:open, descriptionText:Z-Wave Plus Door/Window Sensor is open, isStateChange:false, displayed:false, linkText:Z-Wave Plus Door/Window Sensor]]
6569cb70-1683-45f5-8c84-ffb6e35d221a 7:37:55 PM: debug encapsulated: NotificationReport(event: 2, eventParameter: [], eventParametersLength: 0, notificationStatus: 255, notificationType: 7, reserved61: 0, sequence: false, v1AlarmLevel: 255, v1AlarmType: 2, zensorNetSourceNodeId: 0)
6569cb70-1683-45f5-8c84-ffb6e35d221a 7:37:55 PM: debug Parsed 'zw device: 0A, command: 9881, payload: 00 20 01 FF ’ to [name:contact, value:open, descriptionText:Z-Wave Plus Door/Window Sensor is open, isStateChange:true, displayed:true, linkText:Z-Wave Plus Door/Window Sensor]
6569cb70-1683-45f5-8c84-ffb6e35d221a 7:37:55 PM: debug encapsulated: BasicSet(value: 255)
6569cb70-1683-45f5-8c84-ffb6e35d221a 7:37:42 PM: debug Parsed 'zw device: 0A, command: 9881, payload: 00 71 05 02 00 00 FF 07 00 01 02 ’ to [[descriptionText:Z-Wave Plus Door/Window Sensor covering replaced, isStateChange:true, displayed:false, linkText:Z-Wave Plus Door/Window Sensor]]
6569cb70-1683-45f5-8c84-ffb6e35d221a 7:37:42 PM: debug encapsulated: NotificationReport(event: 0, eventParameter: [2], eventParametersLength: 1, notificationStatus: 255, notificationType: 7, reserved61: 0, sequence: false, v1AlarmLevel: 0, v1AlarmType: 2, zensorNetSourceNodeId: 0)
6569cb70-1683-45f5-8c84-ffb6e35d221a 7:37:42 PM: debug Parsed 'zw device: 0A, command: 9881, payload: 00 20 01 00 ’ to [name:contact, value:closed, descriptionText:Z-Wave Plus Door/Window Sensor is closed, isStateChange:true, displayed:true, linkText:Z-Wave Plus Door/Window Sensor]
6569cb70-1683-45f5-8c84-ffb6e35d221a 7:37:42 PM: debug encapsulated: BasicSet(value: 0)
6569cb70-1683-45f5-8c84-ffb6e35d221a 7:37:31 PM: debug Parsed 'zw device: 0A, command: 9881, payload: 00 71 05 02 FF 00 FF 07 02 00 ’ to [[name:contact, value:open, descriptionText:Z-Wave Plus Door/Window Sensor is open, isStateChange:false, displayed:false, linkText:Z-Wave Plus Door/Window Sensor]]
6569cb70-1683-45f5-8c84-ffb6e35d221a 7:37:31 PM: debug encapsulated: NotificationReport(event: 2, eventParameter: [], eventParametersLength: 0, notificationStatus: 255, notificationType: 7, reserved61: 0, sequence: false, v1AlarmLevel: 255, v1AlarmType: 2, zensorNetSourceNodeId: 0)
6569cb70-1683-45f5-8c84-ffb6e35d221a 7:37:31 PM: debug Parsed 'zw device: 0A, command: 9881, payload: 00 20 01 FF ’ to [name:contact, value:open, descriptionText:Z-Wave Plus Door/Window Sensor is open, isStateChange:true, displayed:true, linkText:Z-Wave Plus Door/Window Sensor]
6569cb70-1683-45f5-8c84-ffb6e35d221a 7:37:31 PM: debug encapsulated: BasicSet(value: 255)
6569cb70-1683-45f5-8c84-ffb6e35d221a 7:37:14 PM: debug Parsed 'zw device: 0A, command: 9881, payload: 00 84 07 ’ to [[name:WakeUp, value:wakeup, descriptionText:Z-Wave Plus Door/Window Sensor woke up, isStateChange:true, displayed:false, linkText:Z-Wave Plus Door/Window Sensor], physicalgraph.device.HubMultiAction@475a775c]
6569cb70-1683-45f5-8c84-ffb6e35d221a 7:37:14 PM: debug not checking battery, was updated 3 min ago
6569cb70-1683-45f5-8c84-ffb6e35d221a 7:37:14 PM: debug encapsulated: WakeUpNotification()
6569cb70-1683-45f5-8c84-ffb6e35d221a 7:37:13 PM: debug Parsed 'zw device: 0A, command: 9881, payload: 00 71 05 03 00 00 FF 07 00 01 03 ’ to [[name:contact, value:closed, descriptionText:Z-Wave Plus Door/Window Sensor is closed, isStateChange:false, displayed:false, linkText:Z-Wave Plus Door/Window Sensor]]
6569cb70-1683-45f5-8c84-ffb6e35d221a 7:37:13 PM: debug encapsulated: NotificationReport(event: 0, eventParameter: [3], eventParametersLength: 1, notificationStatus: 255, notificationType: 7, reserved61: 0, sequence: false, v1AlarmLevel: 0, v1AlarmType: 3, zensorNetSourceNodeId: 0)
6569cb70-1683-45f5-8c84-ffb6e35d221a 7:37:07 PM: debug Parsed 'zw device: 0A, command: 9881, payload: 00 71 05 03 FF 00 FF 07 03 00 ’ to [[descriptionText:Z-Wave Plus Door/Window Sensor covering was removed, isStateChange:true, displayed:true, linkText:Z-Wave Plus Door/Window Sensor]]
6569cb70-1683-45f5-8c84-ffb6e35d221a 7:37:07 PM: debug encapsulated: NotificationReport(event: 3, eventParameter: [], eventParametersLength: 0, notificationStatus: 255, notificationType: 7, reserved61: 0, sequence: false, v1AlarmLevel: 255, v1AlarmType: 3, zensorNetSourceNodeId: 0)
6569cb70-1683-45f5-8c84-ffb6e35d221a 7:37:07 PM: debug Parsed 'zw device: 0A, command: 9881, payload: 00 71 05 02 00 00 FF 07 00 01 02 ’ to [[descriptionText:Z-Wave Plus Door/Window Sensor covering replaced, isStateChange:true, displayed:false, linkText:Z-Wave Plus Door/Window Sensor]]
6569cb70-1683-45f5-8c84-ffb6e35d221a 7:37:07 PM: debug encapsulated: NotificationReport(event: 0, eventParameter: [2], eventParametersLength: 1, notificationStatus: 255, notificationType: 7, reserved61: 0, sequence: false, v1AlarmLevel: 0, v1AlarmType: 2, zensorNetSourceNodeId: 0)
6569cb70-1683-45f5-8c84-ffb6e35d221a 7:37:07 PM: debug Parsed 'zw device: 0A, command: 9881, payload: 00 20 01 00 ’ to [name:contact, value:closed, descriptionText:Z-Wave Plus Door/Window Sensor is closed, isStateChange:true, displayed:true, linkText:Z-Wave Plus Door/Window Sensor]
6569cb70-1683-45f5-8c84-ffb6e35d221a 7:37:07 PM: debug encapsulated: BasicSet(value: 0)
6569cb70-1683-45f5-8c84-ffb6e35d221a 7:35:45 PM: debug Parsed 'zw device: 0A, command: 9881, payload: 00 20 01 FF ’ to [name:contact, value:open, descriptionText:Z-Wave Plus Door/Window Sensor is open, isStateChange:true, displayed:true, linkText:Z-Wave Plus Door/Window Sensor]
6569cb70-1683-45f5-8c84-ffb6e35d221a 7:35:45 PM: debug encapsulated: BasicSet(value: 255)
6569cb70-1683-45f5-8c84-ffb6e35d221a 7:35:10 PM: debug Parsed 'zw device: 0A, command: 9881, payload: 00 84 07 ’ to [[name:WakeUp, value:wakeup, descriptionText:Z-Wave Plus Door/Window Sensor woke up, isStateChange:true, displayed:false, linkText:Z-Wave Plus Door/Window Sensor], physicalgraph.device.HubMultiAction@42706aaf]
6569cb70-1683-45f5-8c84-ffb6e35d221a 7:35:10 PM: debug not checking battery, was updated 0 min ago
6569cb70-1683-45f5-8c84-ffb6e35d221a 7:35:10 PM: debug encapsulated: WakeUpNotification()
6569cb70-1683-45f5-8c84-ffb6e35d221a 7:34:10 PM: debug Parsed 'zw device: 0A, command: 9881, payload: 00 80 03 5A ’ to [[name:battery, unit:%, value:90, isStateChange:true, displayed:true, linkText:Z-Wave Plus Door/Window Sensor, descriptionText:Z-Wave Plus Door/Window Sensor battery is 90%]]
6569cb70-1683-45f5-8c84-ffb6e35d221a 7:34:10 PM: debug encapsulated: BatteryReport(batteryLevel: 90)
6569cb70-1683-45f5-8c84-ffb6e35d221a 7:34:09 PM: debug Parsed 'zw device: 0A, command: 9881, payload: 00 72 05 01 09 20 03 03 07 ’ to [[name:ManufacturerCode, value:0109, isStateChange:true, displayed:true, linkText:Z-Wave Plus Door/Window Sensor, descriptionText:Z-Wave Plus Door/Window Sensor manufacturer code is 0109], [name:ProduceTypeCode, value:2003, isStateChange:true, displayed:true, linkText:Z-Wave Plus Door/Window Sensor, descriptionText:Z-Wave Plus Door/Window Sensor produce type code is 2003], [name:ProductCode, value:0307, isStateChange:true, displayed:true, linkText:Z-Wave Plus Door/Window Sensor, descriptionText:Z-Wave Plus Door/Window Sensor product code is 0307], [name:WirelessConfig, value:ZWP, isStateChange:true, displayed:true, linkText:Z-Wave Plus Door/Window Sensor, descriptionText:Z-Wave Plus Door/Window Sensor wireless config is ZWP]]
6569cb70-1683-45f5-8c84-ffb6e35d221a 7:34:09 PM: debug MSR 0109 2003 0307
6569cb70-1683-45f5-8c84-ffb6e35d221a 7:34:09 PM: debug encapsulated: ManufacturerSpecificReport(manufacturerId: 265, manufacturerName: Vision Security, productId: 775, productTypeId: 8195)
6569cb70-1683-45f5-8c84-ffb6e35d221a 7:34:08 PM: debug configure()

The device will most likely work with my DTH now too…

It’s possible there’s something in my code messing up the inclusion of the Monoprice device so I’ll compare it against that default DTH.

You are correct, It works with your DTH now. I edited the device to use the DTH code you have in git. logs are:

9:14:07 PM: debug acceleration inactive
6569cb70-1683-45f5-8c84-ffb6e35d221a 9:13:56 PM: debug acceleration active
6569cb70-1683-45f5-8c84-ffb6e35d221a 9:12:31 PM: debug acceleration inactive
6569cb70-1683-45f5-8c84-ffb6e35d221a 9:12:20 PM: debug acceleration active

When you have a moment, please remove the device and DTH, add the device, and test to see if the default zwave door/window sensor its assigned works.

Multiple users have confirmed that the Monoprice device works with the default DTH so if yours doesn’t then you most likely have a bad device and should return it.

If it works with the default DTH, install my DTH and see if the device still works.

@cscamp20 if you’re still having trouble you should try the same thing.

I’m not sure what you mean by “I have them configured to send”.

If you’re using the default zwave door/window sensor DTH and letting the Security Monitor in SHM handle the notification then that sensor should be treated like any other contact sensor.

If you’re using my DTH and had to setup a custom monitor because SHM isn’t including it in the contact sensor or motion sensor list, go into the device settings and change the Primary Capability to Motion so that SHM treat it like any other motion sensor.

Thanks. I guess I’m not understanding how this is implemented. Under the Security Monitoring there are 2 categories: open/closed and motion. Before adding the vibration sensors all my door sensors were added to “open/closed” and this put them under the arm/disarm control. I therefore put the vibration sensors in this grouping thinking that they too would be placed under arm/disarm control, especially since all the sensors are explicitly identified by name. The Primary Capability of the vibration sensors was left at “acceleration” since I thought arm/disarm at the highest level is concerned about handling events only, i.e. “arm” means handle the events, “disarm” means ignore.

If I understand you correctly that’s insufficient; i.e. the Primary Capability must match the group (either “open/closed” or “motion”) that they’re a member of. Since “Acceleration” isn’t a choice in the Security Monitoring would something be lost in handling/processing by setting the Primary Capability of the vibration sensors to “Motion” (“open/closed” isn’t even shown as a choice)? And what then is the purpose of the secondary device capability setting?

UPDATE: I just confirmed that the Primary Capability name must match the Security Monitoring grouping name. When that is true the arm/disarm also works for the vibration sensors.

Appreciate you help Kevin. I’m returning mine to monoprice. My shock sensors just wont work maybe because both of it are bad. I’ll try a different brand.

Smart Home Monitor doesn’t recognize the acceleration capability which is why you have to change the primary capability to Motion Sensor.

This device has terminals inside that allow you to attach an external sensor and the secondary capability setting determines which capability is used when the external sensor is triggered or the device is opened.

These seem to have a high infant mortality rate as the many HW trouble reports seem to suggest. I ordered 3 and one of these was DOA. Monoprice sent a replacement which was ok.

The rboy handler doesn’t work for me either. I have the same device from Monoprice and pay for rboy stuff. I think I’ve tried 5 device handlers but none work. Most just get the signal when it joins and that’s it. Door sometimes but even that isn’t consistent when it seems to work at first.

1 Like

I bought 2 of these and had this problem so I returned them for 2 replacements with the same results for those as well. What are the chances I got 4 bad devices?