Skip to content
Open
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
93 changes: 84 additions & 9 deletions Drivers/XBee/xbee.groovy
Original file line number Diff line number Diff line change
Expand Up @@ -5,12 +5,20 @@ metadata {
capability "Configuration"
capability "Battery"
capability "Presence Sensor"
capability "Switch"
command "disable"
command "enable"
}

preferences {

input "fullVoltageValue", "enum", title:"Battery 100% mV:", required:true, defaultValue:3300, options:[3000:"3000 mV",3300:"3300 mV",3600:"3600 mV"]
input "checkInterval", "enum", title:"Minutes elapsed until sensor is not present", required:true, defaultValue:3, options:[1:"1 Minute",2:"2 Minutes",3:"3 Minutes", 4:"4 Minutes",5:"5 Minutes"]
input "disabledMode", "enum", title: "When disabling sensor, set presence to:", description: "Tap to set",
defaultValue:"auto", options: ["auto", "present", "not present"], displayDuringSetup: false
input "enabledMode", "enum", title: "When enabling sensor, set presence to:", description: "Tap to set",
defaultValue:"auto", options: ["auto", "present", "not present"], displayDuringSetup: false
input name: "logEnable", type: "bool", title: "Enable debug logging", defaultValue: true
}
}

Expand Down Expand Up @@ -106,19 +114,32 @@ private handlePresenceEvent(present) {
}
def linkText = getLinkText(device)
def descriptionText
def enabledStatus = ""
if ( present )
descriptionText = "{{ linkText }} has arrived"
else
descriptionText = "{{ linkText }} has left"
def eventMap = [
name: "presence",
value: present ? "present" : "not present",
linkText: linkText,
descriptionText: descriptionText,
translatable: true
]
log.debug "Creating presence event: ${device.displayName} ${eventMap.name} is ${eventMap.value}"
sendEvent(eventMap)
if ((device.currentValue("enabled") == "disabled-present") || (device.currentValue("enabled") == "disabled-not present")) {
// Device is disabled so we won't generate a presence event but instead just track the status behind the scenes by generating an enabled event
if (logEnable) log.debug "${linkText} is ${device.currentValue("enabled")}: not creating presence event"
enabledStatus = "disabled-"
enabledStatus = enabledStatus.concat(present ? "present" : "not present")
if (device.currentValue("enabled") != enabledStatus) sendEvent(name: "enabled", value: enabledStatus, isStateChange: true)
}
else {
def eventMap = [
name: "presence",
value: present ? "present" : "not present",
linkText: linkText,
descriptionText: descriptionText,
translatable: true
]
enabledStatus = "enabled-"
enabledStatus = enabledStatus.concat(present ? "present" : "not present")
if (device.currentValue("enabled") != enabledStatus) sendEvent(name: "enabled", value: enabledStatus, isStateChange: true)
if (logEnable)log.debug "Creating presence event: ${device.displayName} ${eventMap.name} is ${eventMap.value} with status ${device.currentValue("enabled")}"
sendEvent(eventMap)
}
}

private startTimer() {
Expand All @@ -140,3 +161,57 @@ def checkPresenceCallback() {
handlePresenceEvent(false)
}
}

def enable() {
// Force presence per user settings
if (logEnable)log.debug "Setting sensor presence to ${settings.enabledMode}"
sendEvent(name: "switch", value: "on", isStateChange: true)
if (settings.enabledMode && (settings.enabledMode != "auto")) {
stopTimer()
sendEvent(name: "presence", value: settings.enabledMode, translatable: true)
}
else if (settings.enabledMode && (settings.enabledMode == "auto"))
startTimer()
// Enable the device and update the enabled status to reflect the new status
if (logEnable)log.debug "Enabling ${getLinkText(device)}"
if (device.currentValue("presence") == "present")
sendEvent(name: "enabled", value: "enabled-present", isStateChange: true)
else if (device.currentValue("presence") == "not present")
sendEvent(name: "enabled", value: "enabled-not present", isStateChange: true)
}

def disable() {
// Force presence per user settings
if (logEnable)log.debug "Setting sensor presence to ${settings.disabledMode}"
sendEvent(name: "switch", value: "off", isStateChange: true)
if (settings.disabledMode && (settings.disabledMode != "auto")) {
stopTimer()
sendEvent(name: "presence", value: settings.disabledMode, translatable: true)
}
else if (settings.disabledMode && (settings.disabledMode == "auto"))
startTimer()
// Disable the device and update the enabled status to reflect the new status
if (logEnable)log.debug "Disabling ${getLinkText(device)}"
state.updatePresence = false
if (device.currentValue("presence") == "present")
sendEvent(name: "enabled", value: "disabled-present", isStateChange: true)
else if (device.currentValue("presence") == "not present")
sendEvent(name: "enabled", value: "disabled-not present", isStateChange: true)
}

def toggle() {
// Button pressed, toggle the enabled state (which also tracks the current presence)
if ((device.currentValue("enabled") == "enabled-present") || (device.currentValue("enabled") == "enabled-not present"))
disable()
else
enable()
}

def on(){
enable()
}

def off(){
disable()
}