Compare commits

..

2 Commits

Author SHA1 Message Date
Aaron Miller 8d79379bba Merge pull request #1927 from aaron-miller/DVCSMP-2595
[DVCSMP-2595] Set scheduled executions for Lights off with no motion SA to overwrite
2017-05-10 13:29:03 -05:00
Aaron Miller 5b7a7097b8 [DVCSMP-2595] Set scheduled executions for Lights off with no motion SA to overwrite 2017-04-20 13:20:55 -05:00
4 changed files with 44 additions and 56 deletions
@@ -25,7 +25,6 @@ metadata {
fingerprint profileId: "0104", inClusters: "0000, 0003, 0004, 0005, 0006, 0008" fingerprint profileId: "0104", inClusters: "0000, 0003, 0004, 0005, 0006, 0008"
fingerprint profileId: "0104", inClusters: "0000, 0003, 0004, 0005, 0006, 0008, 0B04, FC0F", outClusters: "0019", manufacturer: "OSRAM", model: "LIGHTIFY A19 ON/OFF/DIM", deviceJoinName: "SYLVANIA Smart A19 Soft White" fingerprint profileId: "0104", inClusters: "0000, 0003, 0004, 0005, 0006, 0008, 0B04, FC0F", outClusters: "0019", manufacturer: "OSRAM", model: "LIGHTIFY A19 ON/OFF/DIM", deviceJoinName: "SYLVANIA Smart A19 Soft White"
fingerprint profileId: "0104", inClusters: "0000, 0003, 0004, 0005, 0006, 0008, FC0F", outClusters: "0019", manufacturer: "OSRAM", model: "LIGHTIFY A19 ON/OFF/DIM 10 Year", deviceJoinName: "SYLVANIA Smart 10-Year A19"
fingerprint profileId: "0104", inClusters: "0000, 0003, 0004, 0005, 0006, 0008, FF00", outClusters: "0019", manufacturer: "MRVL", model: "MZ100", deviceJoinName: "Wemo Bulb" fingerprint profileId: "0104", inClusters: "0000, 0003, 0004, 0005, 0006, 0008, FF00", outClusters: "0019", manufacturer: "MRVL", model: "MZ100", deviceJoinName: "Wemo Bulb"
fingerprint profileId: "0104", inClusters: "0000, 0003, 0004, 0005, 0006, 0008, 0B05", outClusters: "0019", manufacturer: "OSRAM SYLVANIA", model: "iQBR30", deviceJoinName: "Sylvania Ultra iQ" fingerprint profileId: "0104", inClusters: "0000, 0003, 0004, 0005, 0006, 0008, 0B05", outClusters: "0019", manufacturer: "OSRAM SYLVANIA", model: "iQBR30", deviceJoinName: "Sylvania Ultra iQ"
fingerprint profileId: "0104", inClusters: "0000, 0003, 0004, 0005, 0006, 0008, FC0F", outClusters: "0019", manufacturer: "OSRAM", model: "LIGHTIFY PAR38 ON/OFF/DIM", deviceJoinName: "SYLVANIA Smart PAR38 Soft White" fingerprint profileId: "0104", inClusters: "0000, 0003, 0004, 0005, 0006, 0008, FC0F", outClusters: "0019", manufacturer: "OSRAM", model: "LIGHTIFY PAR38 ON/OFF/DIM", deviceJoinName: "SYLVANIA Smart PAR38 Soft White"
@@ -765,6 +765,7 @@ def turnOffSwitch() {
} else { } else {
device.off(); device.off();
return [Device_id: params.id, result_action: "200"] return [Device_id: params.id, result_action: "200"]
} }
} }
@@ -788,7 +789,6 @@ def getTempSensorsStatus(id) {
return [] return []
} else { } else {
def bat = getBatteryStatus(device.id) def bat = getBatteryStatus(device.id)
def scale = [Scale: location.temperatureScale] return [temperature: device.currentValue('temperature')] + bat
return [temperature: device.currentValue('temperature')] + bat + scale
} }
} }
@@ -15,66 +15,66 @@ definition(
) )
preferences { preferences {
section("Light switches to turn off") { section("Light switches to turn off") {
input "switches", "capability.switch", title: "Choose light switches", multiple: true input "switches", "capability.switch", title: "Choose light switches", multiple: true
} }
section("Turn off when there is no motion and presence") { section("Turn off when there is no motion and presence") {
input "motionSensor", "capability.motionSensor", title: "Choose motion sensor" input "motionSensor", "capability.motionSensor", title: "Choose motion sensor"
input "presenceSensors", "capability.presenceSensor", title: "Choose presence sensors", multiple: true input "presenceSensors", "capability.presenceSensor", title: "Choose presence sensors", multiple: true
} }
section("Delay before turning off") { section("Delay before turning off") {
input "delayMins", "number", title: "Minutes of inactivity?" input "delayMins", "number", title: "Minutes of inactivity?"
} }
} }
def installed() { def installed() {
subscribe(motionSensor, "motion", motionHandler) subscribe(motionSensor, "motion", motionHandler)
subscribe(presenceSensors, "presence", presenceHandler) subscribe(presenceSensors, "presence", presenceHandler)
} }
def updated() { def updated() {
unsubscribe() unsubscribe()
subscribe(motionSensor, "motion", motionHandler) subscribe(motionSensor, "motion", motionHandler)
subscribe(presenceSensors, "presence", presenceHandler) subscribe(presenceSensors, "presence", presenceHandler)
} }
def motionHandler(evt) { def motionHandler(evt) {
log.debug "handler $evt.name: $evt.value" log.debug "handler $evt.name: $evt.value"
if (evt.value == "inactive") { if (evt.value == "inactive") {
runIn(delayMins * 60, scheduleCheck, [overwrite: false]) runIn(delayMins * 60, scheduleCheck, [overwrite: true])
} }
} }
def presenceHandler(evt) { def presenceHandler(evt) {
log.debug "handler $evt.name: $evt.value" log.debug "handler $evt.name: $evt.value"
if (evt.value == "not present") { if (evt.value == "not present") {
runIn(delayMins * 60, scheduleCheck, [overwrite: false]) runIn(delayMins * 60, scheduleCheck, [overwrite: true])
} }
} }
def isActivePresence() { def isActivePresence() {
// check all the presence sensors, make sure none are present // check all the presence sensors, make sure none are present
def noPresence = presenceSensors.find{it.currentPresence == "present"} == null def noPresence = presenceSensors.find{it.currentPresence == "present"} == null
!noPresence !noPresence
} }
def scheduleCheck() { def scheduleCheck() {
log.debug "scheduled check" log.debug "scheduled check"
def motionState = motionSensor.currentState("motion") def motionState = motionSensor.currentState("motion")
if (motionState.value == "inactive") { if (motionState.value == "inactive") {
def elapsed = now() - motionState.rawDateCreated.time def elapsed = now() - motionState.rawDateCreated.time
def threshold = 1000 * 60 * delayMins - 1000 def threshold = 1000 * 60 * delayMins - 1000
if (elapsed >= threshold) { if (elapsed >= threshold) {
if (!isActivePresence()) { if (!isActivePresence()) {
log.debug "Motion has stayed inactive since last check ($elapsed ms) and no presence: turning lights off" log.debug "Motion has stayed inactive since last check ($elapsed ms) and no presence: turning lights off"
switches.off() switches.off()
} else { } else {
log.debug "Presence is active: do nothing" log.debug "Presence is active: do nothing"
}
} else {
log.debug "Motion has not stayed inactive long enough since last check ($elapsed ms): do nothing"
} }
} else {
log.debug "Motion has not stayed inactive long enough since last check ($elapsed ms): do nothing"
}
} else { } else {
log.debug "Motion is active: do nothing" log.debug "Motion is active: do nothing"
} }
} }
@@ -162,17 +162,6 @@ def registerAllDeviceSubscriptions() {
registerChangeHandler(inputs) registerChangeHandler(inputs)
} }
//Subscribe to events from a list of devices
def registerChangeHandler(myList) {
myList.each { myDevice ->
def theAtts = myDevice.supportedAttributes
theAtts.each { att ->
subscribe(myDevice, att.name, deviceEventHandler)
log.info "Registering for ${myDevice.displayName}.${att.name}"
}
}
}
//Endpoints function: Subscribe to events from a specific device //Endpoints function: Subscribe to events from a specific device
def registerDeviceChange() { def registerDeviceChange() {
def subscriptionEndpt = params.subscriptionURL def subscriptionEndpt = params.subscriptionURL