[ALPHA RELEASE] Simple Door Chime App

Been working great! Although, the HSM subscription would probably be more useful listening to the hub modes instead. Below is the app code I am using currently:

definition(
	name: "Door Chime",
	namespace: "djdizzyd",
	author: "Bryan Copeland",
	description: "Door Chime App",
	category: "Convenience",
	iconUrl: "",
	iconX2Url: "",
	importUrl: "https://raw.githubusercontent.com/djdizzyd/hubitat/master/Apps/simple-doorchime/doorchime.groovy"
)

preferences {
	page(name: "mainPage")
}

def mainPage() {
	dynamicPage(name: "mainPage", title: " ", install: true, uninstall: true) {
		section {
			input "thisName", "text", title: "Name this door chime", submitOnChange: true
			if(thisName) app.updateLabel("$thisName") else app.updateSetting("thisName", "Door Chime")
			input "contactDev", "capability.contactSensor", title: "Select Contact Sensor", submitOnChange: true, required: true, multiple: true
			input "debounce", "bool", title: "Enable Debounce", submitOnChange: true, required: true, defaultValue: false
			if (debounce) {
				input "delayTime", "number", title: "Enter number of milliseconds to delay for debounce", submitOnChange: true, defaultValue: 1000
			}
			input "chimeType", "enum", title: "Type of chime device", options: ["chime": "chime", "speechSynthesis": "TTS", "tone": "Tone/Beep"], submitOnChange: true
			if (chimeType){
				input "chimeDev", "capability.$chimeType", title: "Select Chime Device", submitOnChange:true, required: true, hideWhenEmpty: "chimeType"
			}
			if (chimeDev) {
				switch (chimeType) {
					case "chime":
						if (chimeDev.hasAttribute("soundEffects")) {
                            def soundEffectsList = chimeDev.currentState("soundEffects").value
                            if(enableLog==null) {log.debug "sound effects list: " + soundEffectsList
                                                } else {
                                if(enableLog) log.debug "sound effects list: " + soundEffectsList
                            }
							input "soundNum", "number", title: "Sound to play", submitOnChange: false, required: true
						}
						break;
					case "speechSynthesis":
						input "speakText", "text", title: "Text to speak", submitOnChange: false, required: true
						break;
				}
			}
            input "useHSM", "enum", title: "Use HSM Status for Chime?", options: ["disUse": "No", "disArmed": "Only when Disarmed"], submitOnChange: false, defaultValue: "No"
            input "enableLog", "bool", title: "Enable Logging", submitOnChange: false, required: true, defaultValue: true
		}
	}
}

def installed() {
	initialize()
}

def updated() {
	unsubscribe()
	unschedule()
	initialize()
}

def initialize() {
    if(enableLog) log.debug "initializing"
    for (dev in contactDev) {
        if(enableLog) log.debug "subscribing to " + dev.getDisplayName()
	    subscribe(dev, "contact.open", handler)
        }
    if (useHSM=="disArmed") { 
            if(enableLog) log.debug "subscribing to HSM Status"
            subscribe(location, "hsmStatus", statusHandler)
            }
}

def handler(evt) { 
    if(useHSM=="disArmed") {
        if(location.hsmStatus=="allDisarmed") {
	if (debounce) {
		runInMillis(delayTime, debounced, [data: [o: evt.value, d: evt.device.getDisplayName()]])
		if(enableLog) log.info "Contact $evt.device $evt.value, start delay of $delayTime milliseconds"
	} else {
		debounced([o: evt.value, d: evt.device.getDisplayName()])
	}
        } else {
            if(location.hsmStatus=="disarmed") {
            	if (debounce) {
		runInMillis(delayTime, debounced, [data: [o: evt.value, d: evt.device.getDisplayName()]])
		if(enableLog) log.info "Contact $evt.device $evt.value, start delay of $delayTime milliseconds"
	} else {
		debounced([o: evt.value, d: evt.device.getDisplayName()])
	}
}
    }
    } else {
                    	if (debounce) {
		runInMillis(delayTime, debounced, [data: [o: evt.value, d: evt.device.getDisplayName()]])
		if(enableLog) log.info "Contact $evt.device $evt.value, start delay of $delayTime milliseconds"
    } else {
		debounced([o: evt.value, d: evt.device.getDisplayName()])
                        }
    }
}

def debounced(data) {
	if(data.o == "open") {
		if(enableLog) log.info "Contact $data.d debounced chiming" +  chimeDev.getDisplayName() + " sound number $soundNum"
		chimeAction()
	} 
}
                        

def chimeAction() {
	log.info "Chime Action"
	switch(chimeType) {
		case("chime"): 
			//chime Type
			if(enableLog) log.debug "playing sound: $soundNum on " + chimeDev.getDisplayName()
			chimeDev.playSound(soundNum.toInteger())
			break;
		case("speechSynthesis"):
			// speech Type
			if(enableLog) log.debug "Speaking '$speakText' on " + chimeDev.getDisplayName()
			chimeDev.speak(speakText)
			break;
		case("tone"):
			// tone Type
			if(enableLog) log.debug "Sending beep to " + chimeDev.getDisplayName()
			chimeDev.beep()
			break;
	}
}
1 Like