From 3c4abf4aa8a5006363fa4d477aec01d99d9a5c4c Mon Sep 17 00:00:00 2001 From: ryancasler Date: Thu, 16 May 2019 20:19:15 -0400 Subject: [PATCH 1/2] Added enable/disable --- Drivers/XBee/xbee.groovy | 79 ++++++++++++++++++++++++++++++++++++++++ 1 file changed, 79 insertions(+) diff --git a/Drivers/XBee/xbee.groovy b/Drivers/XBee/xbee.groovy index 70c881c..de4e12e 100644 --- a/Drivers/XBee/xbee.groovy +++ b/Drivers/XBee/xbee.groovy @@ -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 } } @@ -140,3 +148,74 @@ 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 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() +} + \ No newline at end of file From c6b2c6fd780a6ce506df5f3fade7f765bda6fda8 Mon Sep 17 00:00:00 2001 From: ryancasler Date: Sat, 18 May 2019 03:25:55 -0400 Subject: [PATCH 2/2] Updated for fixes. --- Drivers/XBee/xbee.groovy | 48 ++++++++++++++++++---------------------- 1 file changed, 22 insertions(+), 26 deletions(-) diff --git a/Drivers/XBee/xbee.groovy b/Drivers/XBee/xbee.groovy index de4e12e..4da28cc 100644 --- a/Drivers/XBee/xbee.groovy +++ b/Drivers/XBee/xbee.groovy @@ -114,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() { @@ -148,23 +161,6 @@ 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 enable() { // Force presence per user settings