Compare commits

...

7 Commits

Author SHA1 Message Date
Marco
d2aa30fb45 MSA-1849: Send an alert of one presence sensor leaves without the other 2017-03-18 18:30:04 -07:00
Zach Varberg
f734c5490b Merge pull request #1793 from varzac/fix-open-close-temp-offset
[DVCSMP-2516] Properly handle tempOffset in smartsense sensors
2017-03-17 08:56:17 -05:00
Jack Chi
4dac7b5379 Merge pull request #1786 from skt123/aeon_siren
[CHF-552] Implementation of Health Check for Aeon Siren.
2017-03-16 10:18:08 -07:00
Zach Varberg
a79d56e467 Properly handle tempOffset in smartsense sensors
This was accidentally dropped as a part of the zigbee DTH cleanup that
was done a while ago.  This properly adjusts according to the offset.

This resolves: https://smartthings.atlassian.net/browse/DVCSMP-2516
2017-03-16 09:30:52 -05:00
sushant.k1
1326881142 Implemented of Health Check for Aeon Siren. 2017-03-16 15:24:53 +05:30
Vinay Rao
be0c16c76d Merge pull request #1782 from SmartThingsCommunity/staging
Rolling down staging to master
2017-03-14 17:39:53 -07:00
Vinay Rao
16cb20685c Merge pull request #1781 from SmartThingsCommunity/staging
Rolling down staging to master
2017-03-14 17:33:04 -07:00
8 changed files with 188 additions and 1 deletions

View File

@@ -0,0 +1,2 @@
.st-ignore
README.md

View File

@@ -0,0 +1,37 @@
# Aeon Siren
Cloud Execution
Works with:
* [Aeon Labs Siren (Gen 5)](https://www.smartthings.com/works-with-smartthings/aeon-labs/aeon-labs-siren-gen-5)
## Table of contents
* [Capabilities](#capabilities)
* [Health](#device-health)
## Capabilities
* **Actuator** - represents that a Device has commands
* **Alarm** - allows for interacting with devices that serve as alarms
* **Switch** - can detect state (possible values: on/off)
* **Health Check** - indicates ability to get device health notifications
## Device Health
Aeon Labs Siren (Gen 5) is polled by the hub.
As of hubCore version 0.14.38 the hub sends up reports every 15 minutes regardless of whether the state changed.
Device-Watch allows 2 check-in misses from device plus some lag time. So Check-in interval = (2*15 + 2)mins = 32 mins.
Not to mention after going OFFLINE when the device is plugged back in, it might take a considerable amount of time for
the device to appear as ONLINE again. This is because if this listening device does not respond to two poll requests in a row,
it is not polled for 5 minutes by the hub. This can delay up the process of being marked ONLINE by quite some time.
* __32min__ checkInterval
## Troubleshooting
If the device doesn't pair when trying from the SmartThings mobile app, it is possible that the device is out of range.
Pairing needs to be tried again by placing the device closer to the hub.
Instructions related to pairing, resetting and removing the device from SmartThings can be found in the following link:
* [Aeon Labs Siren (Gen 5) Troubleshooting Tips](https://support.smartthings.com/hc/en-us/articles/204555240-Aeon-Labs-Siren-Gen-5-)

View File

@@ -20,10 +20,11 @@ metadata {
capability "Actuator"
capability "Alarm"
capability "Switch"
capability "Health Check"
command "test"
fingerprint deviceId: "0x1005", inClusters: "0x5E,0x98"
fingerprint deviceId: "0x1005", inClusters: "0x5E,0x98", deviceJoinName: "Aeon Labs Siren (Gen 5)"
}
simulator {
@@ -58,6 +59,9 @@ metadata {
}
def updated() {
// Device-Watch simply pings if no device events received for 32min(checkInterval)
sendEvent(name: "checkInterval", value: 2 * 15 * 60 + 2 * 60, displayed: false, data: [protocol: "zwave", hubHardwareId: device.hub.hardwareID])
if(!state.sound) state.sound = 1
if(!state.volume) state.volume = 3
@@ -148,3 +152,10 @@ def test() {
private secure(physicalgraph.zwave.Command cmd) {
zwave.securityV1.securityMessageEncapsulation().encapsulate(cmd).format()
}
/**
* PING is used by Device-Watch in attempt to reach the Device
* */
def ping() {
secure(zwave.basicV1.basicGet())
}

View File

@@ -106,6 +106,12 @@ def parse(String description) {
}
}
}
} else if (map.name == "temperature") {
if (tempOffset) {
map.value = (int) map.value + (int) tempOffset
}
map.descriptionText = temperatureScale == 'C' ? '{{ device.displayName }} was {{ value }}°C' : '{{ device.displayName }} was {{ value }}°F'
map.translatable = true
}
log.debug "Parse returned $map"

View File

@@ -112,6 +112,12 @@ def parse(String description) {
map = getMotionResult(value)
}
}
} else if (map.name == "temperature") {
if (tempOffset) {
map.value = (int) map.value + (int) tempOffset
}
map.descriptionText = temperatureScale == 'C' ? '{{ device.displayName }} was {{ value }}°C' : '{{ device.displayName }} was {{ value }}°F'
map.translatable = true
}
log.debug "Parse returned $map"

View File

@@ -95,6 +95,12 @@ def parse(String description) {
}
}
}
} else if (map.name == "temperature") {
if (tempOffset) {
map.value = (int) map.value + (int) tempOffset
}
map.descriptionText = temperatureScale == 'C' ? '{{ device.displayName }} was {{ value }}°C' : '{{ device.displayName }} was {{ value }}°F'
map.translatable = true
}
log.debug "Parse returned $map"

View File

@@ -88,6 +88,12 @@ def parse(String description) {
log.warn "TEMP REPORTING CONFIG FAILED- error code: ${descMap.data[0]}"
}
}
} else if (map.name == "temperature") {
if (tempOffset) {
map.value = (int) map.value + (int) tempOffset
}
map.descriptionText = temperatureScale == 'C' ? '{{ device.displayName }} was {{ value }}°C' : '{{ device.displayName }} was {{ value }}°F'
map.translatable = true
}
log.debug "Parse returned $map"

View File

@@ -0,0 +1,113 @@
/**
* Double Presence
*
* Copyright 2014 Matt Nohr
*
* Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except
* in compliance with the License. You may obtain a copy of the License at:
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software distributed under the License is distributed
* on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License
* for the specific language governing permissions and limitations under the License.
*
*/
definition(
name: "Linked Presence",
namespace: "mrnohr",
author: "Matt Nohr",
description: "Send an alert of one presence sensor leaves without the other",
category: "My Apps",
iconUrl: "https://s3.amazonaws.com/smartapp-icons/Meta/text_presence.png",
iconX2Url: "https://s3.amazonaws.com/smartapp-icons/Meta/text_presence@2x.png")
/**
* Based on the discussion here: http://community.smartthings.com/t/linking-presence-sensors-in-pairs-for-seniors/4915
*
* Get an alert if one presence sensor leaves without the other one. The alert could be turning on a light, or sending
* a push/text message. The original idea was to monitor aging parents where one parent shouldn't be leaving the house
* without the other one. Could also work with parents and children, making sure a child doesn't leave without a parent.
*
* It works by subscribing to "not present" events for the "dependant" presence sensor. If the "main" sensor hasn't also
* recently left (in the past minute), then send the alert.
*/
preferences {
section("Presence Sensors") {
input "sensorDependant", "capability.presenceSensor", title: "When this person leaves alone"
input "sensorMain", "capability.presenceSensor", title: "Without this person"
input "timeDelay", "number", title: "With this delay (minutes)", default: 1
}
section("Alerts") {
input "switches", "capability.switch", title: "Turn on some lights?", required: false, multiple: true
input "sendPushMessage", "enum", title: "Send a push notification?", options: ["Yes", "No"], required: false
input "phoneNumber", "phone", title: "Send a text message?", required: false
}
}
def installed() {
log.debug "Installed with settings: ${settings}"
initialize()
}
def updated() {
log.debug "Updated with settings: ${settings}"
unsubscribe()
unschedule()
initialize()
}
def initialize() {
subscribe(sensorDependant, "presence.not present", "leavingHandler")
}
//this will just handle scheduling/calling the checkOtherPresence method to handle the delay
def leavingHandler(evt) {
if(timeDelay > 0) {
log.debug "scheduling presence check for $timeDelay minute(s)"
runIn(timeDelay * 60, "checkOtherPresence")
} else {
checkOtherPresence()
}
}
def checkOtherPresence() {
log.debug "checking other presence sensor"
def dependantEvent = sensorDependant.latestState("presence")
//first make sure the dependant is still away
if(dependantEvent.value == "not present") {
//make sure there is an event first, just in the rare case there are no events
def mainEvent = sensorMain.latestState("presence")
if(mainEvent) {
//compare latest events from both devices
def eventTimeDifference = Math.abs(dependantEvent.date.time - mainEvent.date.time) / (1000 * 60) //minutes
def allowedTimeDifference = 1 //maybe use same timeDelay?
//make sure dependant left with main
if(mainEvent != "not present" || eventTimeDifference > allowedTimeDifference) {
def message = "$sensorDependant left without $sensorMain"
log.warn message
send(message) // send push/text
switches.on() // turn on lights
}
} else {
//this should only happen if sensorMain is brand new and has never had any events
log.warn "$sensorDependant left but no events for $sensorMain"
}
}
}
private send(msg) {
if(sendPushMessage != "No") {
log.debug "Sending push notification: $msg"
sendPush(msg)
}
if(phoneNumber) {
log.debug "Sending text notification: $msg"
sendSms(phoneNumber, msg)
}
}