A simple way to get alerts when your doorbell is rung

I setup an alert and it’s working…but I cannot seem to now find out where the setting went. It is not under the device.

Is there a place in the app that lists alerts somewhere?

@Mike_Maxwell - did you ever get a response on how this is wired up? I am confused by what I am looking at.

Not directly, but I’ve groked it.
Older mimilites supported a power input of 24v ac or dc. The newer versions are dc only.
So with the ac/dc version the mimo was connected in parallel to the door bell coil, then the power failed message was trapped and used as the door bell indication.
The dc version would likely work in the same manner, however a bridge rectifier needs to be included between the coil and the memo since the new ones don’t support ac supply power.

1 Like

You’ve probably found the setting by now, but for anybody else looking: It depends on how you added the alert. I think you used the same setup as me, i.e. a contact sensor. If so, it is most likely under “Doors & Locks” / door you configured it as. In my case, I installed the “Notify Me” SmartApp, which lives in the “Convenience” section of the dashboard.

Just a small anecdote as to how this helped me just yesterday: I urgently needed some seals to fix our dishwasher and had ordered it as Fedex overnight with Saturday delivery. I didn’t expect a signature to be required by Fedex, but still was a little worried that they wouldn’t leave it. As it turns out, we were not home when the package was delivered. I got a SmartThings push notification that the doorbell rang, and I was able to view my outside-looking IP camera to see the Fedex delivery man walk back to his truck empty handed, meaning he left the package at the door. So I could enjoy the rest of our family breakfast without worrying about whether the package will be there when we get back :D.

As @wackaware mentioned, his device code implements a button.

I use the SmartThings open/close sensor, and finally got tired of looking at the “open” contact sensor in my Things screen. I merged @wackaware’s code with the SmartThings open/close device code to come up with a device that looks like a doorbell (push button) in the device page, but otherwise works like a standard open/close sensor with temperature. This allowed me to keep using the existing SmartApps that subscribe to open / close events, but get a better looking device in the Things page, and will emit proper button pressed / released messages in the activity feed.

The code simply triggers a “push” event when the contact closes, and then 15 seconds later implements a “release”. It will ignore further close events if the button is already “pushed”. This gets rid of the ringing (number of quick open/close events) that I get with my doorbell rings. It probably not a bad idea to make the 15 second value a parameter to be set under prefs, but I’ll leave that as an exercise to the reader :smile:

Code

2 Likes

I’ve got a spare Linear door/window sensor which has an external contact capability. Basically it’s a switch, if you close the circuit it closes the sensor.

I’d like to wire this to my doorbell, but I’m unsure how. Any tips?

Get an external magnetic contact sensor, chuck the magnet, tape the switch to the side of the doorbell coil.

6 Likes

Has anyone already made a doorbell device type based on the standard “Z-Wave Door/Window Sensor” type to be used with a vanilla window sensor dry contact? I’m about to dive into modifying that device, but don’t want to replicate work already done.

@swamplynx, Here’s the code I’m using I created from ST default device type for a door/window contact sensor:

Here’s the code:

https://raw.githubusercontent.com/constjs/jcdevhandlers/master/devicetypes/jscgs350/my-ecolink-doorbell-sensor.src/my-ecolink-doorbell-sensor.groovy

3 Likes

Haha… Just finished coding my own as well. Feel free to take a gander.

       /**
     *  Z-Wave Door/Window Sensor
     *
     *  Author: SmartThings
     *  Date: 2013-11-3
     */
    
    // for the UI
    metadata {
    	// Automatically generated. Make future change here.
    	definition (name: "Dry Contact Doorbell Device", namespace: "smartthings", author: "SmarthThings") {
    		capability "Contact Sensor"
    		capability "Sensor"
    		capability "Battery"
    		capability "Configuration"
    
    		fingerprint deviceId: "0x2001", inClusters: "0x30,0x80,0x84,0x85,0x86,0x72"
    		fingerprint deviceId: "0x07", inClusters: "0x30"
    		fingerprint deviceId: "0x0701", inClusters: "0x5E,0x86,0x72,0x98", outClusters: "0x5A,0x82"
    	}
    
    	// simulator metadata
    	simulator {
    		// status messages
    		status "open":  "command: 2001, payload: FF"
    		status "closed": "command: 2001, payload: 00"
    		status "wakeup": "command: 8407, payload: 00"
    	}
    
    	// UI tile definitions
    	tiles {
    		standardTile("button", "device.button", width: 2, height: 2) {
    			state "open", label: 'Doorbell', icon: "st.Home.home30", backgroundColor: "#B0E0E6"
    			state "closed", label: 'Ding-Dong', icon: "st.Home.home30", backgroundColor: "#53a7c0"
    		}
    		valueTile("battery", "device.battery", inactiveLabel: false, decoration: "flat") {
    			state "battery", label:'${currentValue}% battery', unit:""
    		}
    
    		main "button"
    		details(["button", "battery"])
    	}
    }
    
    def parse(String description) {
    	def result = null
    	if (description.startsWith("Err 106")) {
    		if (!state.sec) {
    			log.debug description
    		} else {
    			result = createEvent(
    				descriptionText: "This sensor failed to complete the network security key exchange. If you are unable to control it via SmartThings, you must remove it from your network and add it again.",
    				eventType: "ALERT",
    				name: "secureInclusion",
    				value: "failed",
    				isStateChange: true,
    			)
    		}
    	} else if (description != "updated") {
    		def cmd = zwave.parse(description, [0x20: 1, 0x25: 1, 0x30: 1, 0x31: 5, 0x80: 1, 0x84: 1, 0x71: 3, 0x9C: 1])
    		if (cmd) {
    			result = zwaveEvent(cmd)
    		}
    	}
    	log.debug "parsed '$description' to $result"
    	return result
    }
    
    def updated() {
    	def cmds = []
    	if (!state.MSR) {
    		cmds = [
    			zwave.manufacturerSpecificV2.manufacturerSpecificGet().format(),
    			"delay 1200",
    			zwave.wakeUpV1.wakeUpNoMoreInformation().format()
    		]
    	} else if (!state.lastbat) {
    		cmds = []
    	} else {
    		cmds = [zwave.wakeUpV1.wakeUpNoMoreInformation().format()]
    	}
    	response(cmds)
    }
    
    def configure() {
    	delayBetween([
    		zwave.manufacturerSpecificV2.manufacturerSpecificGet().format(),
    		batteryGetCommand()
    	], 6000)
    }
    
    // "Push" the button when the contact closes
    def sensorValueEvent(value) {
    	log.debug "Pushing button"
        if (device.currentValue("button") != "closed") 
        {
    		sendEvent( name : "button", value : "closed", descriptionText: "$device.displayName was pressed", unit : "" )
    		runIn(10, "releaseButton")
    	}
    }
    
    // "Release" the button
    void releaseButton() {
    	log.debug("Releasing button")
    	sendEvent( name : "button", value: "open", descriptionText: "$device.displayName was released")
    }
    
    
    def zwaveEvent(physicalgraph.zwave.commands.basicv1.BasicReport cmd)
    {
    	sensorValueEvent(cmd.value)
    }
    
    def zwaveEvent(physicalgraph.zwave.commands.basicv1.BasicSet cmd)
    {
    	sensorValueEvent(cmd.value)
    }
    
    def zwaveEvent(physicalgraph.zwave.commands.switchbinaryv1.SwitchBinaryReport cmd)
    {
    	sensorValueEvent(cmd.value)
    }
    
    def zwaveEvent(physicalgraph.zwave.commands.sensorbinaryv1.SensorBinaryReport cmd)
    {
    	sensorValueEvent(cmd.sensorValue)
    }
    
    def zwaveEvent(physicalgraph.zwave.commands.sensoralarmv1.SensorAlarmReport cmd)
    {
    	sensorValueEvent(cmd.sensorState)
    }
    
    def zwaveEvent(physicalgraph.zwave.commands.notificationv3.NotificationReport cmd)
    {
    	def result = []
    	if (cmd.notificationType == 0x06 && cmd.event == 0x16) {
    		result << sensorValueEvent(1)
    	} else if (cmd.notificationType == 0x06 && cmd.event == 0x17) {
    		result << sensorValueEvent(0)
    	} else if (cmd.notificationType == 0x07) {
    		if (cmd.v1AlarmType == 0x07) {  // special case for nonstandard messages from Monoprice door/window sensors
    			result << sensorValueEvent(cmd.v1AlarmLevel)
    		} else if (cmd.event == 0x01 || cmd.event == 0x02) {
    			result << sensorValueEvent(1)
    		} else if (cmd.event == 0x03) {
    			result << createEvent(descriptionText: "$device.displayName covering was removed", isStateChange: true)
    			result << response(zwave.wakeUpV1.wakeUpIntervalSet(seconds:4*3600, nodeid:zwaveHubNodeId))
    			if(!state.MSR) result << response(zwave.manufacturerSpecificV2.manufacturerSpecificGet())
    		} else if (cmd.event == 0x05 || cmd.event == 0x06) {
    			result << createEvent(descriptionText: "$device.displayName detected glass breakage", isStateChange: true)
    		} else if (cmd.event == 0x07) {
    			if(!state.MSR) result << response(zwave.manufacturerSpecificV2.manufacturerSpecificGet())
    			result << createEvent(name: "motion", value: "active", descriptionText:"$device.displayName detected motion")
    		}
    	} else if (cmd.notificationType) {
    		def text = "Notification $cmd.notificationType: event ${([cmd.event] + cmd.eventParameter).join(", ")}"
    		result << createEvent(name: "notification$cmd.notificationType", value: "$cmd.event", descriptionText: text, displayed: false)
    	} else {
    		def value = cmd.v1AlarmLevel == 255 ? "active" : cmd.v1AlarmLevel ?: "inactive"
    		result << createEvent(name: "alarm $cmd.v1AlarmType", value: value, displayed: false)
    	}
    	result
    }
    
    def zwaveEvent(physicalgraph.zwave.commands.wakeupv1.WakeUpNotification cmd)
    {
    	def event = createEvent(descriptionText: "${device.displayName} woke up", isStateChange: false)
    	def cmds = []
    	if (!state.MSR) {
    		cmds << zwave.wakeUpV1.wakeUpIntervalSet(seconds:4*3600, nodeid:zwaveHubNodeId).format()
    		cmds << zwave.manufacturerSpecificV2.manufacturerSpecificGet().format()
    		cmds << "delay 1200"
    	}
    	if (!state.lastbat || now() - state.lastbat > 53*60*60*1000) {
    		cmds << batteryGetCommand()
    	} else {
    		cmds << zwave.wakeUpV1.wakeUpNoMoreInformation().format()
    	}
    	[event, response(cmds)]
    }
    
    def zwaveEvent(physicalgraph.zwave.commands.batteryv1.BatteryReport cmd) {
    	def map = [ name: "battery", unit: "%" ]
    	if (cmd.batteryLevel == 0xFF) {
    		map.value = 1
    		map.descriptionText = "${device.displayName} has a low battery"
    		map.isStateChange = true
    	} else {
    		map.value = cmd.batteryLevel
    	}
    	state.lastbat = now()
    	[createEvent(map), response(zwave.wakeUpV1.wakeUpNoMoreInformation())]
    }
    
    def zwaveEvent(physicalgraph.zwave.commands.manufacturerspecificv2.ManufacturerSpecificReport cmd) {
    	def result = []
    
    	def msr = String.format("%04X-%04X-%04X", cmd.manufacturerId, cmd.productTypeId, cmd.productId)
    	log.debug "msr: $msr"
    	updateDataValue("MSR", msr)
    
    	retypeBasedOnMSR()
    
    	result << createEvent(descriptionText: "$device.displayName MSR: $msr", isStateChange: false)
    
    	if (msr == "011A-0601-0901") {  // Enerwave motion doesn't always get the associationSet that the hub sends on join
    		result << response(zwave.associationV1.associationSet(groupingIdentifier:1, nodeId:zwaveHubNodeId))
    	} else if (!device.currentState("battery")) {
    		if(msr == "0086-0102-0059") state.sec = 1
    		result << response(batteryGetCommand())
    	}
    
    	result
    }
    
    def zwaveEvent(physicalgraph.zwave.commands.securityv1.SecurityMessageEncapsulation cmd) {
    	def encapsulatedCommand = cmd.encapsulatedCommand([0x20: 1, 0x85: 2, 0x70: 1])
    	// log.debug "encapsulated: $encapsulatedCommand"
    	if (encapsulatedCommand) {
    		state.sec = 1
    		zwaveEvent(encapsulatedCommand)
    	}
    }
    
    def zwaveEvent(physicalgraph.zwave.Command cmd) {
    	createEvent(descriptionText: "$device.displayName: $cmd", displayed: false)
    }
    
    def batteryGetCommand() {
    	def cmd = zwave.batteryV1.batteryGet()
    	if (state.sec) {
    		cmd = zwave.securityV1.securityMessageEncapsulation().encapsulate(cmd)
    	}
    	cmd.format()
    }
    
    def retypeBasedOnMSR() {
    	switch (state.MSR) {
    		case "0086-0002-002D":
    			log.debug("Changing device type to Z-Wave Water Sensor")
    			setDeviceType("Z-Wave Water Sensor")
    			break
    		case "011F-0001-0001":  // Schlage motion
    		case "014A-0001-0001":  // Ecolink motion
    		case "0060-0001-0002":  // Everspring SP814
    		case "0060-0001-0003":  // Everspring HSP02
    		case "011A-0601-0901":  // Enerwave ZWN-BPC
    			log.debug("Changing device type to Z-Wave Motion Sensor")
    			setDeviceType("Z-Wave Motion Sensor")
    			break
    		
    	}
    }
1 Like

Got a pic of your open/close sensor mounted on the doorbell?

1 Like

I wasn’t exaggerating when I said scotch tape and blue tack :smile:.

2 Likes

LOL, awesome… that’s exactly what mine looks like. I’ll give it a shot today!

I’m going to be a dissenting voice and not “like” a project with open wires and scotch tape. Because, fires. Seriously. Electricity can spark, spark can flame. And scotch tape is highly flammable.

Use a project box, people! They’re inexpensive (under $10), they look good, they’re made for electrical gear. Your local electrical supply house will have lots in many shapes and sizes. Usually black or gray, but also blue, green, clear, and white. Get a good quality brand. (And if you must use tape, use electrician’s tape. The supply house will also have choices in this.)

Here, just as an example, one of the better brands of project boxes:

http://www.amazon.com/Hammond-1591ESBK-ABS-Project-Black/dp/B0002BSRIO

3 Likes

I would like to have my doorbell disabled during certain times of the day. Any ideas or starting point suggestions?

What’s the current doorbell device like? And are you willing to replace it?

If you’re willing to replace it, the easiest way is just to replace it with a non-ringing open/close sensor, and then have that open/close sensor trigger whatever sound you like, and put that on your time schedule.

I have a contact sensor on my front gate that I have smart things monitor and send a text to my phone when the gate opens. The text notification sound is my doorbell.

It would be easy to take any DNLA sound device and have that act as the chime part. Basically just play the sound you specified. So instead of having smart things send a text, smart things turn on the DNLA player.

Aeon been promising a Z wave doorbell with some different sounds for a while now, most recently with a promised delivery date of the summer. If it ever actually arrives, then again, you could easily control the time schedule from smartthings.

so lots of different ways, but all of those require replacing the doorbell button you currently have.

There are some other ways to do it with a relay in between your current doorbell button and your current chime, but that gets more into electrical wiring.

I would try and use modes for this. Create mode(s) where the doorbell doesn’t function if the system is in currently in that mode.

1 Like

If all you want to do is disable the doorbell at certain times, I would wire in one of these dry contact relays to either of the two wires running from your doorbell button to your doorbell ringer:

1 Like

The use of one or more Modes ("location.mode") is the common paradigm established by SmartThings, but it is a rather limited feature since only one mode can be active at a time. It is really difficult to accommodate different use categories (home, away, night, day, do not disturb, armed, disarmed…) in only one global Mode. (NB: Technically there is one mode for each Location on your Account … since a single Account can have multiple hubs, and the hubs may be at distinct locations).

The two alternatives that I consider:

  • Use a start / end schedule preference in the SmartApp that links button to sound.

  • Add a Virtual Switch Device to turn “Do Not Disturb” on and off. A separate SmartApp could flip this switch based on a schedule or various other criteria (such as when you are in the bathroom, as detected by a Motion Sensor)? The possibilities are endless.

I prefer the second approach because it allows easy manual override, and you can link multiple SmartApps to the same switch (or similar Switches) to handle arbitrarily complex useful scenarios. Perhaps the switch activates a red Hue bulb to indicate that “do not disturb” is active,… Etc., etc.

1 Like