forked from djdizzyd/ring_hubitat_codahq
-
Notifications
You must be signed in to change notification settings - Fork 26
/
Copy pathring-virtual-contact-sensor.groovy
104 lines (86 loc) · 3.56 KB
/
ring-virtual-contact-sensor.groovy
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
/**
* Ring Virtual Contact Sensor Driver
*
* Copyright 2019-2020 Ben Rimmasch
* Copyright 2021 Caleb Morse
*
* 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.
*/
metadata {
definition(name: "Ring Virtual Contact Sensor", namespace: "ring-hubitat-codahq", author: "Ben Rimmasch") {
capability "Contact Sensor"
capability "Battery"
capability "Refresh"
capability "Sensor"
capability "TamperAlert"
attribute "bypassed", "enum", ["true", "false"]
attribute "chirp", "string"
attribute "commStatus", "enum", ["error", "ok", "update-queued", "updating", "waiting-for-join", "wrong-network"]
attribute "firmware", "string"
command "setChirp", [[name: "Set Chirp", type: "ENUM", description: "Choose the sound your Base Station and Keypads will make when this contact sensor is triggered",
constraints: ['ding-dong', 'harp', 'navi', 'wind-chime', 'none']]]
}
preferences {
input name: "descriptionTextEnable", type: "bool", title: "Enable descriptionText logging", defaultValue: false
input name: "logEnable", type: "bool", title: "Enable debug logging", defaultValue: false
input name: "traceLogEnable", type: "bool", title: "Enable trace logging", defaultValue: false
}
}
void logInfo(msg) {
if (descriptionTextEnable) { log.info msg }
}
void logDebug(msg) {
if (logEnable) { log.debug msg }
}
void logTrace(msg) {
if (traceLogEnable) { log.trace msg }
}
void setChirp(chirp) {
final Map data = [chirps: [(device.getDataValue("zid")): [type: chirp]]]
parent.apiWebsocketRequestSetDeviceSecurityPanel(device.getDataValue("src"), data)
}
void refresh() {
parent.refresh(device.getDataValue("src"))
}
void setValues(final Map deviceInfo) {
logDebug "setValues(${deviceInfo})"
if (deviceInfo.faulted != null) {
checkChanged("contact", deviceInfo.faulted ? "open" : "closed")
}
if (deviceInfo.batteryLevel != null) {
checkChanged("battery", deviceInfo.batteryLevel, "%")
}
// Update attributes where deviceInfo key is the same as attribute name and no conversion is necessary
for (final entry in deviceInfo.subMap(["bypassed", "chirp", "commStatus", "firmware", "tamper"])) {
checkChanged(entry.key, entry.value)
}
// Update state values
Map stateValues = deviceInfo.subMap(['impulseType', 'lastCommTime', 'lastUpdate', 'nextExpectedWakeup', 'signalStrength'])
if (stateValues) {
state << stateValues
}
}
void setPassthruValues(final Map deviceInfo) {
logDebug "setPassthruValues(${deviceInfo})"
if (deviceInfo.percent != null) {
log.warn "${device.label} is updating firmware: ${deviceInfo.percent}% complete"
}
}
void runCleanup() {
device.removeDataValue('firmware') // Is an attribute now
}
boolean checkChanged(final String attribute, final newStatus, final String unit=null, final String type=null) {
final boolean changed = device.currentValue(attribute) != newStatus
if (changed) {
logInfo "${attribute.capitalize()} for device ${device.label} is ${newStatus}"
}
sendEvent(name: attribute, value: newStatus, unit: unit, type: type)
return changed
}