mirror of
https://github.com/mtan93/SmartThingsPublic.git
synced 2026-03-08 05:31:56 +00:00
MSA-42: Modified SmartThings Laundry Monitor Template which uses a power meter to alert when laundry is done
This commit is contained in:
@@ -0,0 +1,128 @@
|
||||
/**
|
||||
* Laundry Monitor Using Power Meter
|
||||
*
|
||||
* Author: Daniel De Leo
|
||||
*
|
||||
* Sends a message and (optionally) turns on or blinks a light to indicate that laundry is done.
|
||||
* This is a modification of the SmartThings Laundry Monitor Template App. This app uses a power meter
|
||||
* to determine your laundry status instead of an accelerometer.
|
||||
*
|
||||
* Date: 2013-02-21
|
||||
*/
|
||||
|
||||
definition (
|
||||
name: "Laundry Monitor Using Power Meter",
|
||||
namespace: "smartthings",
|
||||
author: "Daniel De Leo",
|
||||
description: "Sends a message and (optionally) turns on or blinks a light to indicate that laundry is done.",
|
||||
category: "Convenience",
|
||||
iconUrl: "https://s3.amazonaws.com/smartapp-icons/FunAndSocial/App-HotTubTuner.png",
|
||||
iconX2Url: "https://s3.amazonaws.com/smartapp-icons/FunAndSocial/App-HotTubTuner%402x.png"
|
||||
)
|
||||
|
||||
preferences {
|
||||
section("Tell me when this washer/dryer has stopped..."){
|
||||
input(name: "meter", type: "capability.powerMeter", title: "When This Power Meter...", required: true, multiple: false)
|
||||
}
|
||||
section("Via a push notification and/or an SMS message"){
|
||||
input "phone", "phone", title: "Phone Number (for SMS, optional)", required: false
|
||||
input "pushAndPhone", "enum", title: "Both Push and SMS?", required: false, options: ["Yes", "No"], defaultValue: "No"
|
||||
}
|
||||
section("And by turning on these lights (optional)") {
|
||||
input "switches", "capability.switch", required: false, multiple: true, title: "Which lights?"
|
||||
input "lightMode", "enum", options: ["Flash Lights", "Turn On Lights"], required: false, defaultValue: "Flash Lights", title: "Action?"
|
||||
}
|
||||
}
|
||||
|
||||
def installed() {
|
||||
initialize()
|
||||
}
|
||||
|
||||
def updated() {
|
||||
unsubscribe()
|
||||
initialize()
|
||||
}
|
||||
|
||||
def initialize() {
|
||||
subscribe(meter, "power", meterHandler)
|
||||
}
|
||||
|
||||
def meterHandler(evt) {
|
||||
def meterValue = evt.value as double
|
||||
if(meterValue == 0 && state.running) {
|
||||
// if meterValue is at 0 Watts and the state is running,
|
||||
// this means washer/dryer is either done or in a soak cycle
|
||||
state.running = false
|
||||
def msg = "${meter.displayName} is finished"
|
||||
|
||||
if(phone) {// Send SMS message if phone number provided
|
||||
sendSms phone, msg
|
||||
}
|
||||
else {// Send Push Notification if no phone number provided
|
||||
sendPush msg
|
||||
}
|
||||
if(pushAndPhone == "Yes" && phone) {//Send both Push and SMS
|
||||
sendPush msg
|
||||
}
|
||||
|
||||
if (switches) {
|
||||
if (lightMode?.equals("Turn On Lights")) {
|
||||
switches.on()
|
||||
}
|
||||
else {
|
||||
flashLights()
|
||||
}
|
||||
}
|
||||
}
|
||||
else if(meterValue > 10 && !state.running) {
|
||||
// if meterValue is greater than 10Watts and the
|
||||
// previous read was 0, this means the machine is
|
||||
// now running
|
||||
state.running = true
|
||||
}
|
||||
}
|
||||
|
||||
private flashLights() {
|
||||
def doFlash = true
|
||||
def onFor = onFor ?: 2000
|
||||
def offFor = offFor ?: 2000
|
||||
def numFlashes = numFlashes ?: 3
|
||||
|
||||
log.debug "LAST ACTIVATED IS: ${state.lastActivated}"
|
||||
if (state.lastActivated) {
|
||||
def elapsed = now() - state.lastActivated
|
||||
def sequenceTime = (numFlashes + 1) * (onFor + offFor)
|
||||
doFlash = elapsed > sequenceTime
|
||||
log.debug "DO FLASH: $doFlash, ELAPSED: $elapsed, LAST ACTIVATED: ${state.lastActivated}"
|
||||
}
|
||||
|
||||
if (doFlash) {
|
||||
log.debug "FLASHING $numFlashes times"
|
||||
state.lastActivated = now()
|
||||
log.debug "LAST ACTIVATED SET TO: ${state.lastActivated}"
|
||||
def initialActionOn = switches.collect{it.currentSwitch != "on"}
|
||||
def delay = 1L
|
||||
numFlashes.times {
|
||||
log.trace "Switch on after $delay msec"
|
||||
switches.eachWithIndex {s, i ->
|
||||
if (initialActionOn[i]) {
|
||||
s.on(delay: delay)
|
||||
}
|
||||
else {
|
||||
s.off(delay:delay)
|
||||
}
|
||||
}
|
||||
delay += onFor
|
||||
log.trace "Switch off after $delay msec"
|
||||
switches.eachWithIndex {s, i ->
|
||||
if (initialActionOn[i]) {
|
||||
s.off(delay: delay)
|
||||
}
|
||||
else {
|
||||
s.on(delay:delay)
|
||||
}
|
||||
}
|
||||
delay += offFor
|
||||
}
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user