Adding dynamic property, using static or global vars?


(Im Brian) #1

I’m working on a door-knocking app. I have a SmartSense Multi on my front door and it can detect if the door is shut and if there’s a knock. Awesome. However, I’m getting a false positive for every time I shut the door (the contact is closed and its acceleration is active).

What I’d like to do is add a custom property to the multi (without having to tinker with writing a whole new custom device type) to register the last time the door was open. If the door was opened within a set amount of time, it’s probably just you shutting or locking the door. If adding a property to an existing object is not possible, is there a way to use a static variable within a function - or even a global var to store this last timestamp?

Sorry for the noob questions, java / groovy are new to me.


(Chrisb) #2

I’d look to handling this in the code of the app rather than in the devise type.

What I would look at doing is subscribing to when the sensor is opened and closed. When it’s opened use change a state variable to false, and then when close run a procedure in a minute to change the state.

Something like this:

def doorSensorOpen(evt) {
     state.doorClosed = false
     }

When the door opens, we change the state variable to false.

def doorSensorsClose(evt) {
     runIn(60, closeState)
     }

def closeState() {
     state.doorClosed = true
     }

What this does is when the door closes, it schedule the ‘closeState’ procedure to run in 60 seconds. This gives a 1 minute for the accelerator time to stop moving.

Then in your procedure where you run the actions when acceleration happens, put in a conditional:

def accelerationCheck {
     if (state.doorClosed = true) {
          Insert you code to do stuff here
     }
}

That way you need acceleration AND the variable needs to say closed. And that won’t say closed until the door has been closed for at least a minute.


Any Documentation on "physicalgraph device HubAction"?
(Im Brian) #3

Ahh - the “state” variable was the secret sauce I was looking for. I can load state.lastOpen = now() when a door is open and check for elapsed time when a knock is felt to see if the door’s been opened recently.

Thanks so much for all your help!


(Chrisb) #4

Just a personal preference probably, but I’d base it on when the door is closed. If someone were to leave the door open for a while and the time expired then you’d get a false positive when the door closed.


(Im Brian) #5

Fair enough - I’ll give that a go. I did have that set originally but moved it to “open” for a reason I can no longer recall. I was juggling things around a lot trying to sort out a way of storing the timestamp, so I’m sure it’s irrelevant now. Updated on SmartThings - will update github later.