├── AdvancedZwaveDimmerV2.json
├── AeonLaundry.json
├── AeonSmartStrip.json
├── AlexaATT.json
├── BatteryMonitor.json
├── ColorCastWeather.json
├── ColorCoord.json
├── CooperEatonRF9500
├── CooperEatonRF9500.json
├── DDNDS Update
├── DimWithMe.json
├── EzMultiNew.json
├── GarageDoorLGK.json
├── GardenHue.json
├── HSM200_1_10.hex
├── HSM200_2_8.hex
├── HomiHeimanGas.json
├── Hubitat.apk
├── HubitatSmartAlarm.json
├── IsMyHomeSecure.json
├── KeenVentLGK.json
├── LGKSendMailV2.json
├── LGKSendMailV3.json
├── LGKSmartUPSStatus.json
├── LGKUPSStatus.groovy
├── LGKVirtualGarageDoorApp.json
├── LGKrepository.json
├── Link2Switches.json
├── Mower Update Longitude.json
├── Mower update latitude.json
├── MyCT100.json
├── MyUtilTechSiren.json
├── QubinoWeatherStation.json
├── RoofCoilController.json
├── ST814.json
├── Smartstrip Switch 1.json
├── Smartstrip Switch 2.json
├── Smartstrip Switch 3.json
├── Smartstrip Switch 4.json
├── SpruceController.json
├── Tesla.json
├── TeslaV3.json
├── TotalComfort.json
├── WaterValve.json
├── ZW15SM.json
├── ZW189_Range_Extender_7_US_A_V1_02_OTA.gbl
├── ZWavePCController_v5_39.zip
├── ZigbeeWhiteColorTemp.json
├── advzwavedimmerlgkv2.groovy
├── aeonhemdryer.groovy
├── aeonrangev7.groovy
├── aeonsmartstrip.groovey
├── alexattschild.groovy
├── alexattsparentv0.6.groovy
├── amazonaws
├── apc_hw05_aos712_sumx712_bootmon109.7z
├── bad dash test driver
├── baddash
├── batterymonitor.groovey
├── colorcastweather.groovy
├── colorcoordinator.groovy
├── darksky.groovy
├── dayton.groovy
├── dbconsistencychecker.groovy
├── dimwithme.groovy
├── echo speaks device
├── ecowittest.groovy
├── ecowittgateway.groovy
├── ecowittparent.groovy
├── ecowittsensor.groovy
├── ecowittsensortest
├── evb105watervalue.groovey
├── ezmultinew.groovy
├── garagedoorlgk.groovy
├── gardenhue.groovey
├── gezwaveplus.groovy
├── googleiframe.groovy
├── goveelan.groovy
├── homeygas.groovy
├── honeywell.groovy
├── honeywellhome
├── honeywellhomedriver
├── hubigraph
├── hubigraph radar tile
├── hubigraph time graph
├── hubigraph time line
├── hubigraph_lts
├── hubitatdbchecker.json
├── hubitatsmartalarmdevicetype.groovy
├── hublinks.txt
├── hubstats.groovy
├── husqapp.groovy
├── husqdsriver.groovy
├── iptracker.groovy
├── keenventlgk.groovy
├── lgkemailv3.groovy
├── lgkemilv3child.groovy
├── lgkgaragedoor.groovy
├── linktwoswitches.groovy
├── myct100.groovy
├── myutiltechsiren.groovy
├── notificationdevice.groovy
├── openweatheralerts
├── quibinoweather.groovy
├── rf9500.groovey
├── ring extender
├── roofcoilcontroler.groovy
├── secure.groovey
├── sendmailold
├── simulatedgaragedoorv2.groovy
├── smartups test v5
├── sprucecontrollerdevice.groovy
├── sprucescheduler.groovy
├── sprucesensorlgk.groovy
├── sprucesmartapp.groovy
├── stg814v4.groovey
├── tccnew.groovy
├── teslaConnectTeslafi.groovy
├── teslaConnectTessie.groovy
├── teslaFiVehicle.groovy
├── tesla_tessie.json
├── teslaapptest
├── teslaconnect.groovy
├── teslaconnectv2.groovy
├── teslaconnectv3.groovy
├── tesladashcss
├── tesladashlayout
├── tesladriver.groovy
├── tesladrivertest
├── teslatest.groovy
├── tessieVehicle.groovy
├── tile.txt
├── tilecolor.txt
├── totalcomfortapic.groovy
├── totalcomfortapicTest.groovy
├── upscustomcolors.txt
├── vacatlighting.groovy
├── virtdoor.groovey
├── washingmachine.json
├── wirelesstagapp.groovy
├── wirelesstagdevice.groovy
├── wirelesstagmotion.groovy
├── wirelesstagsensor.groovy
├── wirelesstagwater.groovy
├── zigbeewhitecolortemp.groovy
├── zooz zac38
└── zw15sm.groovey
/AdvancedZwaveDimmerV2.json:
--------------------------------------------------------------------------------
1 | {
2 | "packageName": "Advance Dimmer With Color Control",
3 | "author": "Larry Kahn",
4 | "version": "3.0",
5 | "minimumHEVersion": "2.0",
6 | "dateReleased": "2020-10-19",
7 | "drivers": [
8 | {
9 | "id": "851db8fa-89bf-4bc3-98a2-a6fef847da2b",
10 | "name": "Advanced Zwave Dimmer Switch w Color Control V2",
11 | "namespace": "lgkapps",
12 | "location": "https://raw.githubusercontent.com/lgkahn/hubitat/master/advzwavedimmerlgkv2.groovy",
13 | "required": true
14 | }
15 | ]
16 | }
17 |
--------------------------------------------------------------------------------
/AeonLaundry.json:
--------------------------------------------------------------------------------
1 | {
2 | "packageName": "Aeon HEM Dryer",
3 | "author": "Larry Kahn",
4 | "version": "1.1",
5 | "minimumHEVersion": "1.2",
6 | "dateReleased": "2020-10-19",
7 | "drivers": [
8 | {
9 | "id": "d06e8a17-4728-434e-82e3-aac08aa4ffde",
10 | "name": "Aeon HEM V1 Laundry DTH",
11 | "namespace": "MikeMaxwell",
12 | "location": "https://raw.githubusercontent.com/lgkahn/hubitat/master/aeonhemdryer.groovy",
13 | "required": true
14 | }
15 | ]
16 | }
17 |
--------------------------------------------------------------------------------
/AeonSmartStrip.json:
--------------------------------------------------------------------------------
1 | {
2 | "packageName": "Aeon Smartstrip",
3 | "author": "Larry Kahn",
4 | "version": "1.0",
5 | "minimumHEVersion": "1.0",
6 | "dateReleased": "2020-10-19",
7 | "drivers": [
8 | {
9 | "id": "5f1b1d65-13e5-428e-be79-7c32e27a49dc",
10 | "name": "Aeon SmartStrip LGK",
11 | "namespace": "smartthings",
12 | "location": "https://raw.githubusercontent.com/lgkahn/hubitat/master/aeonsmartstrip.groovey",
13 | "required": true
14 | }
15 | ]
16 | }
--------------------------------------------------------------------------------
/AlexaATT.json:
--------------------------------------------------------------------------------
1 | {
2 | "packageName": "Alexa Text To Speach",
3 | "author": "Larry Kahn",
4 | "version": "1.02",
5 | "minimumHEVersion": "1.0",
6 | "dateReleased": "2020-10-19",
7 | "drivers": [
8 | {
9 | "id": "fcd6dc78-a4a7-4e0d-9466-ba863a58ce30",
10 | "name": "Child Alexa TTS",
11 | "namespace": "ogiewon",
12 | "location": "https://raw.githubusercontent.com/lgkahn/hubitat/master/alexattschild.groovy",
13 | "required": true
14 | }
15 | ],
16 | "apps": [
17 | {
18 | "id": "629a89ac-8645-49b7-9fb0-69da6b831562",
19 | "name": "Alexa TTS Manager",
20 | "namespace": "ogiewon",
21 | "location": "https://raw.githubusercontent.com/lgkahn/hubitat/master/alexattsparentv0.6.groovy",
22 | "required": true,
23 | "oauth": true,
24 | "primary": false
25 | }
26 | ]
27 | }
28 |
--------------------------------------------------------------------------------
/BatteryMonitor.json:
--------------------------------------------------------------------------------
1 | {
2 | "packageName": "Nightly Battery Monitor APP",
3 | "author": "Larry Kahn",
4 | "version": "1.2",
5 | "minimumHEVersion": "1.0",
6 | "dateReleased": "2020-10-19",
7 | "apps": [
8 | {
9 | "id": "bbee4967-06bb-4d06-b928-3fe31bffbcd8",
10 | "name": "BatteryMonitor",
11 | "namespace": "notoriousbdg",
12 | "location": "https://raw.githubusercontent.com/lgkahn/hubitat/master/batterymonitor.groovey",
13 | "required": true,
14 | "oauth": false,
15 | "primary": false
16 | }
17 | ]
18 | }
19 |
--------------------------------------------------------------------------------
/ColorCastWeather.json:
--------------------------------------------------------------------------------
1 | {
2 | "packageName": "Color Cast Weather Alerts with Lights on Weather",
3 | "author": "Larry Kahn",
4 | "version": "2.7",
5 | "minimumHEVersion": "2.0",
6 | "dateReleased": "2020-10-19",
7 | "apps": [
8 | {
9 | "id": "f8407b5a-6f95-43f7-a2ed-9794f65df054",
10 | "name": "ColorCast Weather Lamp",
11 | "namespace": "lgkapps",
12 | "location": "https://raw.githubusercontent.com/lgkahn/hubitat/master/colorcastweather.groovy",
13 | "required": true,
14 | "oauth": false,
15 | "primary": false
16 | }
17 | ]
18 | }
19 |
--------------------------------------------------------------------------------
/ColorCoord.json:
--------------------------------------------------------------------------------
1 | {
2 | "packageName": "Color Coord",
3 | "author": "Larry Kahn",
4 | "version": "1.0",
5 | "minimumHEVersion": "1.0",
6 | "dateReleased": "2020-10-19",
7 | "apps": [
8 | {
9 | "id": "2ec80302-fe86-40ae-bd1f-3324c291641a",
10 | "name": "Color Coordinator",
11 | "namespace": "MichaelStruck",
12 | "location": "https://raw.githubusercontent.com/lgkahn/hubitat/master/colorcoordinator.groovy",
13 | "required": true,
14 | "oauth": false,
15 | "primary": false
16 | }
17 | ]
18 | }
--------------------------------------------------------------------------------
/CooperEatonRF9500:
--------------------------------------------------------------------------------
1 | /**
2 | * Copyright 2015 SmartThings
3 | *
4 | * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except
5 | * in compliance with the License. You may obtain a copy of the License at:
6 | *
7 | * http://www.apache.org/licenses/LICENSE-2.0
8 | *
9 | * Unless required by applicable law or agreed to in writing, software distributed under the License is distributed
10 | * on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License
11 | * for the specific language governing permissions and limitations under the License.
12 | *
13 | */
14 | metadata {
15 | definition (name: "Cooper RF9500 Stock new", namespace: "lgkapps", author: "juano23@gmail.com") {
16 | capability "Switch"
17 | capability "Switch Level"
18 | capability "PushableButton"
19 | capability "Actuator"
20 |
21 | //fingerprint deviceId: "0x1200", inClusters: "0x77 0x86 0x75 0x73 0x85 0x72 0xEF", outClusters: "0x26"
22 | }
23 |
24 | // simulator metadata
25 | simulator {
26 | // status messages
27 | status "on": "on/off: 1"
28 | status "off": "on/off: 0"
29 |
30 | // reply messages
31 | reply "zcl on-off on": "on/off: 1"
32 | reply "zcl on-off off": "on/off: 0"
33 | }
34 |
35 | // UI tile definitions
36 | tiles {
37 | standardTile("switch", "device.switch", width: 2, height: 2, canChangeIcon: true) {
38 | state "off", label: '${name}', action: "switch.on", icon: "st.Home.home30", backgroundColor: "#ffffff"
39 | state "on", label: '${name}', action: "switch.off", icon: "st.Home.home30", backgroundColor: "#79b821"
40 | }
41 | standardTile("refresh", "device.switch", inactiveLabel: false, decoration: "flat") {
42 | state "default", label:"", action:"refresh.refresh", icon:"st.secondary.refresh"
43 | }
44 | controlTile("levelSliderControl", "device.level", "slider", height: 1, width: 3, inactiveLabel: false) {
45 | state "level", action:"switch level.setLevel"
46 | }
47 | valueTile("level", "device.level", inactiveLabel: false, decoration: "flat") {
48 | state "level", label:'${currentValue} %', unit:"%", backgroundColor:"#ffffff"
49 | }
50 | main "switch"
51 | details(["switch", "refresh", "level", "levelSliderControl"])
52 | }
53 | }
54 |
55 | def parse(String description) {
56 | def results = []
57 | if (description.startsWith("Err")) {
58 | results = createEvent(descriptionText:description, displayed:true)
59 | } else {
60 | def cmd = zwave.parse(description, [0x26: 1, 0x2B: 1, 0x80: 1, 0x84: 1])
61 | if(cmd) results += zwaveEvent(cmd)
62 | if(!results) results = [ descriptionText: cmd, displayed: false ]
63 | }
64 | log.debug("Parsed '$description' to $results")
65 | return results
66 | }
67 |
68 | def on() {
69 | sendEvent(name: "switch", value: "on")
70 | }
71 |
72 | def off() {
73 | sendEvent(name: "switch", value: "off")
74 | }
75 |
76 | def levelup() {
77 | //log.debug "in level up"
78 |
79 | def curlevel = device.currentValue('level') as Integer
80 | // log.debug "cur level = $curlevel"
81 | if (curlevel <= 95)
82 | setLevel(curlevel + 5);
83 | }
84 |
85 | def leveldown() {
86 | //log.debug "in level down"
87 |
88 | def curlevel = device.currentValue('level') as Integer
89 | // log.debug "cur level = $curlevel"
90 | if (curlevel > 5)
91 | setLevel(curlevel - 5)
92 | }
93 |
94 | def setLevel(value) {
95 | log.trace "setLevel($value)"
96 | sendEvent(name: "level", value: value)
97 | sendEvent(name:"switch.setLevel",value:value)
98 | }
99 |
100 | def zwaveEvent(hubitat.zwave.commands.wakeupv1.WakeUpNotification cmd) {
101 | def results = [createEvent(descriptionText: "$device.displayName woke up", isStateChange: false)]
102 |
103 | results += configurationCmds().collect{ response(it) }
104 | results << response(zwave.wakeUpV1.wakeUpNoMoreInformation().format())
105 |
106 | return results
107 | }
108 |
109 | // A zwave command for a button press was received convert to button number
110 | def zwaveEvent(hubitat.zwave.commands.switchmultilevelv1.SwitchMultilevelStartLevelChange cmd) {
111 | [ descriptionText: "startlevel $cmd"]
112 | log.info "startlevel $cmd"
113 | if (cmd.upDown == true) {
114 | Integer buttonid = 2
115 | leveldown()
116 | checkbuttonEvent(buttonid)
117 | } else if (cmd.upDown == false) {
118 | Integer buttonid = 3
119 | levelup()
120 | checkbuttonEvent(buttonid)
121 | }
122 | }
123 |
124 | // The controller likes to repeat the command... ignore repeats
125 | def checkbuttonEvent(buttonid){
126 |
127 | if (state.lastScene == buttonid && (state.repeatCount < 4) && (now() - state.repeatStart < 2000)) {
128 | log.debug "Button ${buttonid} repeat ${state.repeatCount}x ${now()}"
129 | state.repeatCount = state.repeatCount + 1
130 | createEvent([:])
131 | }
132 | else {
133 | // If the button was really pressed, store the new scene and handle the button press
134 | state.lastScene = buttonid
135 | state.lastLevel = 0
136 | state.repeatCount = 0
137 | state.repeatStart = now()
138 |
139 | buttonEvent(buttonid)
140 | }
141 | }
142 |
143 | // Handle a button being pressed
144 | def buttonEvent(button) {
145 | button = button as Integer
146 | log.trace "Button $button pressed"
147 | def result = []
148 | if (button == 1) {
149 | def mystate = device.currentValue('switch');
150 | if (mystate == "on")
151 | off()
152 | else
153 | on()
154 | }
155 | updateState("currentButton", "$button")
156 | // update the device state, recording the button press
157 | result << createEvent(name: "button", value: "pushed", data: [buttonNumber: button], descriptionText: "$device.displayName button $button was pushed", isStateChange: true)
158 | result
159 | }
160 |
161 | def zwaveEvent(hubitat.zwave.commands.basicv1.BasicGet cmd) {
162 | [ descriptionText: "$cmd"]
163 | if(1){
164 | Integer buttonid = 1
165 | checkbuttonEvent(buttonid)
166 | }
167 | }
168 |
169 | def zwaveEvent(hubitat.zwave.commands.basicv1.BasicSet cmd) {
170 | [ descriptionText: "$cmd"]
171 | if(1){
172 | Integer buttonid = 1
173 | log.info "button $buttonid pressed"
174 | checkbuttonEvent(buttonid)
175 | }
176 | }
177 |
178 | def zwaveEvent(hubitat.zwave.commands.switchmultilevelv1.SwitchMultilevelStopLevelChange cmd) {
179 | createEvent([:])
180 | }
181 |
182 |
183 | def zwaveEvent(hubitat.zwave.Command cmd) {
184 | [ descriptionText: "$cmd"]
185 | }
186 |
187 | // Update State
188 | def updateState(String name, String value) {
189 | state[name] = value
190 | device.updateDataValue(name, value)
191 | }
192 |
--------------------------------------------------------------------------------
/CooperEatonRF9500.json:
--------------------------------------------------------------------------------
1 | {
2 | "packageName": "Cooper Eaton RF9500",
3 | "author": "Larry Kahn",
4 | "version": "1.0",
5 | "minimumHEVersion": "1.0",
6 | "dateReleased": "2020-10-19",
7 | "drivers": [
8 | {
9 | "id": "27222e21-2f22-44af-b6c5-367319fd4eb1",
10 | "name": "Cooper RF9500 Stock new",
11 | "namespace": "lgkapps",
12 | "location": "https://raw.githubusercontent.com/lgkahn/hubitat/master/rf9500.groovey",
13 | "required": true
14 | }
15 | ]
16 | }
--------------------------------------------------------------------------------
/DimWithMe.json:
--------------------------------------------------------------------------------
1 | {
2 | "packageName": "Dim With Me",
3 | "author": "Larry Kahn",
4 | "version": "1.0",
5 | "minimumHEVersion": "1.0",
6 | "dateReleased": "2020-10-19",
7 | "apps": [
8 | {
9 | "id": "c3c7c179-ee1b-47b7-ab7b-ed1ecb36307e",
10 | "name": "Dim With Me",
11 | "namespace": "wackware",
12 | "location": "https://raw.githubusercontent.com/lgkahn/hubitat/master/dimwithme.groovy",
13 | "required": true,
14 | "oauth": false,
15 | "primary": false
16 | }
17 | ]
18 | }
--------------------------------------------------------------------------------
/EzMultiNew.json:
--------------------------------------------------------------------------------
1 | {
2 | "packageName": "EZ Multi aka HSM200 Driver",
3 | "author": "Larry Kahn",
4 | "version": "1.1",
5 | "minimumHEVersion": "1.0.1",
6 | "dateReleased": "2020-10-19",
7 | "drivers": [
8 | {
9 | "id": "f10ae02a-0173-4f48-a208-2b98a8efa8d7",
10 | "name": "EZmultiPli new",
11 | "namespace": "erocm123",
12 | "location": "https://raw.githubusercontent.com/lgkahn/hubitat/master/ezmultinew.groovy",
13 | "required": true
14 | }
15 | ]
16 | }
17 |
--------------------------------------------------------------------------------
/GarageDoorLGK.json:
--------------------------------------------------------------------------------
1 | {
2 | "packageName": "Z wave garage door with added switch for alexa",
3 | "author": "Larry Kahn",
4 | "version": "1.0.0",
5 | "minimumHEVersion": "1.0.0",
6 | "dateReleased": "2020-10-19",
7 | "drivers": [
8 | {
9 | "id": "9befb4c0-1983-4527-95e5-043ce659aa42",
10 | "name": "Z-Wave Garage Door Opener - LGK",
11 | "namespace": "lgkapps",
12 | "location": "https://raw.githubusercontent.com/lgkahn/hubitat/master/garagedoorlgk.groovy",
13 | "required": true
14 | }
15 | ]
16 | }
--------------------------------------------------------------------------------
/GardenHue.json:
--------------------------------------------------------------------------------
1 | {
2 | "packageName": "Garden Hue Color Light Show",
3 | "author": "Larry Kahn",
4 | "version": "5.1",
5 | "minimumHEVersion": "1.0",
6 | "dateReleased": "2020-10-19",
7 | "apps": [
8 | {
9 | "id": "d9d4013d-a4e5-408a-ae9c-68e22615dd6f",
10 | "name": "Garden Hue",
11 | "namespace": "lgkapps",
12 | "location": "https://raw.githubusercontent.com/lgkahn/hubitat/master/gardenhue.groovey",
13 | "required": true,
14 | "oauth": false,
15 | "primary": false
16 | }
17 | ]
18 | }
19 |
--------------------------------------------------------------------------------
/HomiHeimanGas.json:
--------------------------------------------------------------------------------
1 | {
2 | "packageName": "Homey/Heiman Gas Detector",
3 | "author": "Larry Kahn",
4 | "version": "4.1",
5 | "minimumHEVersion": "1.0.0",
6 | "dateReleased": "2020-10-19",
7 | "drivers": [
8 | {
9 | "id": "f27e6969-dbad-4118-a3ef-2d5081d3c8c0",
10 | "name": "Homi/Heiman Gas Detector",
11 | "namespace": "lgkahn",
12 | "location": "https://raw.githubusercontent.com/lgkahn/hubitat/master/homeygas.groovy",
13 | "required": true
14 | }
15 | ]
16 | }
17 |
--------------------------------------------------------------------------------
/Hubitat.apk:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/lgkahn/hubitat/92d277962091904ab2a7bfd7e0ca3758976e63fe/Hubitat.apk
--------------------------------------------------------------------------------
/HubitatSmartAlarm.json:
--------------------------------------------------------------------------------
1 | {
2 | "packageName": "Hubitat Smart Alarm Notification Device",
3 | "author": "Larry Kahn",
4 | "version": "1.0.0",
5 | "minimumHEVersion": "1.0.0",
6 | "dateReleased": "2020-10-19",
7 | "drivers": [
8 | {
9 | "id": "bb9ff403-45d3-4f30-a30a-2c72da38b14f",
10 | "name": "Hubitat Smart Alarm Notification Device",
11 | "namespace": "lgkapps",
12 | "location": "https://raw.githubusercontent.com/lgkahn/hubitat/master/hubitatsmartalarmdevicetype.groovy",
13 | "required": true
14 | }
15 | ]
16 | }
--------------------------------------------------------------------------------
/IsMyHomeSecure.json:
--------------------------------------------------------------------------------
1 | {
2 | "packageName": "Is My Home Secure - checks doors locks after mode change",
3 | "author": "Larry Kahn",
4 | "version": "1.3",
5 | "minimumHEVersion": "1.0",
6 | "dateReleased": "2020-10-19",
7 | "apps": [
8 | {
9 | "id": "580948b8-d671-4bcd-86c2-3c71af68a2a1",
10 | "name": "Is my home secure?",
11 | "namespace": "tslagle13",
12 | "location": "https://raw.githubusercontent.com/lgkahn/hubitat/master/secure.groovey",
13 | "required": true,
14 | "oauth": false,
15 | "primary": false
16 | }
17 | ]
18 | }
19 |
--------------------------------------------------------------------------------
/KeenVentLGK.json:
--------------------------------------------------------------------------------
1 | {
2 | "packageName": "Keen Vent Driver for Hubitat with temp/pressure added",
3 | "author": "Larry Kahn",
4 | "version": "1.3.0",
5 | "minimumHEVersion": "1.0.0",
6 | "dateReleased": "2020-10-19",
7 | "drivers": [
8 | {
9 | "id": "3656f1c2-eb3d-402a-a6c2-b80a30041bf4",
10 | "name": "Keen Home Smart Vent - lgk V2",
11 | "namespace": "lgkapps",
12 | "location": "https://raw.githubusercontent.com/lgkahn/hubitat/master/keenventlgk.groovy",
13 | "required": true
14 | }
15 | ]
16 | }
17 |
--------------------------------------------------------------------------------
/LGKSendMailV2.json:
--------------------------------------------------------------------------------
1 | {
2 | "packageName": "Send Mail totaly implemented in hubitat no server needed",
3 | "author": "Larry Kahn",
4 | "version": "4.01",
5 | "minimumHEVersion": "2.1.0",
6 | "dateReleased": "2020-10-19",
7 | "drivers": [
8 | {
9 | "id": "8efdf78f-a4c1-4f26-99af-34b0553d3a9a",
10 | "name": "LGK Sendmail V2",
11 | "namespace": "lgkapps",
12 | "location": "https://raw.githubusercontent.com/lgkahn/hubitat/master/sendmail%20V2",
13 | "required": true
14 | }
15 | ]
16 | }
17 |
--------------------------------------------------------------------------------
/LGKSendMailV3.json:
--------------------------------------------------------------------------------
1 | {
2 | "packageName": "Send Mail totaly implemented in hubitat no server needed",
3 | "author": "Larry Kahn",
4 | "version": "4.94",
5 | "minimumHEVersion": "2.2.2",
6 | "dateReleased": "2020-10-19",
7 | "drivers": [
8 | {
9 | "id": "e99532ef-5822-4928-a326-71ff8ac01cab",
10 | "name": "LGK Sendmail V3",
11 | "namespace": "lgkapps",
12 | "location": "https://raw.githubusercontent.com/lgkahn/hubitat/master/lgkemailv3.groovy",
13 | "required": true
14 | },
15 | {
16 | "id": "4865d52f-82d1-4418-bcfa-cc4823ef5620",
17 | "name": "LGK Sendmail V3 Child",
18 | "namespace": "lgkapps",
19 | "location": "https://raw.githubusercontent.com/lgkahn/hubitat/master/lgkemilv3child.groovy",
20 | "required": true
21 | }
22 | ]
23 | }
24 |
--------------------------------------------------------------------------------
/LGKSmartUPSStatus.json:
--------------------------------------------------------------------------------
1 | {
2 | "packageName": "LGK Smart UPS Status",
3 | "author": "Larry Kahn",
4 | "version": "4.4",
5 | "minimumHEVersion": "1.11",
6 | "dateReleased": "2020-10-19",
7 | "drivers": [
8 | {
9 | "id": "60175215-9bf3-4a24-a10c-42cc7f95c68e",
10 | "name": "LGK SmartUPS Status",
11 | "namespace": "lgkapps",
12 | "location": "https://raw.githubusercontent.com/lgkahn/hubitat/master/LGKUPSStatus.groovy",
13 | "required": true
14 | }
15 | ]
16 | }
17 |
--------------------------------------------------------------------------------
/LGKVirtualGarageDoorApp.json:
--------------------------------------------------------------------------------
1 | {
2 | "packageName": "Virtual Garage Door App to lick relay/switch and sensor",
3 | "author": "Larry Kahn",
4 | "version": "1.4.0",
5 | "minimumHEVersion": "1.0.0",
6 | "dateReleased": "2020-10-19",
7 | "apps": [
8 | {
9 | "id": "84eee394-099e-4586-b784-e39bcb4e9913",
10 | "name": "LGK Virtual Garage Door",
11 | "namespace": "lgkapps",
12 | "location": "https://raw.githubusercontent.com/lgkahn/hubitat/master/lgkgaragedoor.groovy",
13 | "required": true,
14 | "oauth": false,
15 | "primary": false
16 | }
17 | ],
18 | "drivers": [
19 | {
20 | "id": "a1ac1e15-de89-4031-ab06-104d4f2a24d8",
21 | "name": "Simulated Garage Door Opener V2",
22 | "namespace": "smartthings/testing",
23 | "location": "https://raw.githubusercontent.com/lgkahn/hubitat/master/simulatedgaragedoorv2.groovy",
24 | "required": true
25 | }
26 | ]
27 | }
28 |
--------------------------------------------------------------------------------
/Link2Switches.json:
--------------------------------------------------------------------------------
1 | {
2 | "packageName": "Link 2 Switches",
3 | "author": "Larry Kahn",
4 | "version": "1.0.0",
5 | "minimumHEVersion": "1.0.0",
6 | "dateReleased": "2020-10-19",
7 | "apps": [
8 | {
9 | "id": "9b26924b-e58e-40b0-8354-066f9c3a387f",
10 | "name": "Link Two Switches",
11 | "namespace": "lgkapps",
12 | "location": "https://raw.githubusercontent.com/lgkahn/hubitat/master/linktwoswitches.groovy",
13 | "required": true,
14 | "oauth": false,
15 | "primary": false
16 | }
17 | ]
18 | }
--------------------------------------------------------------------------------
/Mower Update Longitude.json:
--------------------------------------------------------------------------------
1 | {"deviceReplacements":{"1525":{"deviceName":"Husqvarna AutoMower","deviceLabel":"Mower: Automower - HUSQVARNA AUTOMOWER\\u00ae 430XH","deviceTypeName":"Husqvarna AutoMower","deviceTypeNamespace":"imnotbob"},"1527":{"deviceName":"Mower Location","deviceLabel":"Mower Location","deviceTypeName":"Google Map iFrame","deviceTypeNamespace":"gomce62"}},"appReplacements":{"1374":{"appTypeName":"Rule-5.1","appTypeNamespace":"hubitat","appType":"sys","appName":"Rule-5.1","appLabel":"Mower Update Longitude","parentAppInstalledAppId":"1091","parentAppTypeName":"Rule Machine","parentAppTypeNamespace":"hubitat","parentAppName":"Rule Machine","parentAppLabel":"Rule Machine","childApps":{},"singleInstance":false}},"appData":{"1374":{"state":{"ndx":2,"dateFormat":"yyyy-MM-dd","nestedBlock":[],"installedRules":[{"1199":"Charge truck"},{"1101":"Garage Lights on when door Opens"},{"1092":"Hot Tub Approaching Max"},{"1136":"Hub Update Avail"},{"1363":"Mower Stuck Alert"},{"1373":"Mower update latitude"},{"1096":"Rachio - Start"},{"1097":"Rachio Stop All"},{"1371":"Weather station device orphaned"},{"1264":"pause the tv"},{"1265":"resume the tv"}],"clonedName":"Mower Update Longitude","tCustomAttrType1":"NUMBER","selectActionsParams":{"label":"Mower Update Longitude"},"editCondIf":null,"waitDone":{},"stopOnST":false,"usesTime":false,"nestedIf":[],"trigCustoms":["longitude","longitude"],"repeating":null,"capabDone":true,"skipping":false,"lastEvtName":"Mower: Automower - HUSQVARNA AUTOMOWER\\u00ae 430XH","locationBlocked":[],"pbFixed":true,"ruleNdx":1,"actionList":["1","3"],"timeTriggers":[],"locVars":{},"allVarsO":[],"actLabelIndent":"","varSettingsUpdated":true,"certainTimes":[],"allVarsS":[],"allVarsT":[],"paramsDone":true,"prevState":{"1525":-88.60297,"PB":"true"},"eval":{},"lastEvtText":"longitude is -88.60297","capabstrue":{"1":"Mower: Automower - HUSQVARNA AUTOMOWER\\u00ae 430XH reports longitude(-88.6029316) *changed*"},"paramNdx.1":1,"installedCapabs":["CarbonDioxideMeasurement","Configuration","RelativeHumidityMeasurement","ColorMode","HealthCheck","Initialize","PowerSource","SpeechSynthesis","DoubleTapableButton","TamperAlert","Light","Battery","Valve","RelaySwitch","CarbonMonoxideDetector","PresenceSensor","ColorControl","Polling","ChangeLevel","PowerMeter","IlluminanceMeasurement","Switch","Tone","Sensor","WaterSensor","EnergyMeter","ThreeAxis","Variable","GasDetector","VoltageMeasurement","ContactSensor","Notification","Refresh","ReleasableButton","SwitchLevel","ColorTemperature","HoldableButton","MotionSensor","DoorControl","Outlet","UltravioletIndex","Telnet","Actuator","Thermostat","AudioVolume","PressureMeasurement","LockCodes","Indicator","PushableButton","Lock","GarageDoorControl","TemperatureMeasurement","AccelerationSensor","AirQuality","Alarm","SmokeDetector"],"paramNdx.3":1,"nestedSkipAll":[],"lastEvtDate":"2022-06-28","nestedInIf":[],"actions":{"1":{"wait":null,"delay":"","modes":{},"method":"getDefinedAction","indent":"","rule":null,"label":"setLongitude(%value%(-88.60292)) on Mower Location\\n","cond":0},"3":{"wait":null,"delay":"0:00:02","modes":{},"method":"getDefinedAction","indent":"","rule":null,"label":"updateFrame() on Mower Location --> delayed: 0:00:02\\n","cond":0}},"usesDate":false,"actNdx":4,"lastEvtValue":"-88.60297","allVarsGT":[],"installed":true,"waitEvents":[],"private":"true","waitNdx":{},"hasDevice":"setLongitude(%value%(-88.60292)) on [Mower Location]","allVars":{},"simpleCond":false,"changedValues":true,"nestedRepIf":[],"lastEvtTime":"03:28","condOper":"cond","nestedElse":[],"allVarsI":[],"varTriggersFixed":true,"cutAction":[],"allVarsD":[],"broken":false,"stopped":false,"rulesList":[],"nestedLabel":[],"oldInputAct":true,"inputAct":true,"lastEvtDevId":"1525","waitCondNdx":1,"token":0,"capabsfalse":{},"stPrimed":true,"timeTriggersW":{},"allLocalVars":{},"varSettingsOld":{},"timeFormat":"hh:mm","olddValues":true,"thisStr":".1"},"appSettings":[{"deviceList":null,"multiple":false,"name":"tCapab1","type":"enum","value":"Custom Attribute"},{"deviceList":null,"multiple":false,"name":"delayMin.3","type":"number","value":"00"},{"deviceList":null,"multiple":false,"name":"tCapab2","type":"enum","value":""},{"deviceList":null,"multiple":false,"name":"actionDone","type":"button","value":""},{"deviceList":null,"multiple":false,"name":"uVar1.1","type":"bool","value":"false"},{"deviceList":null,"multiple":false,"name":"cCmd.1","type":"enum","value":"setLongitude"},{"deviceList":null,"multiple":true,"name":"copyAct","type":"enum","value":null},{"deviceList":null,"multiple":false,"name":"delayHour.2","type":"number","value":""},{"deviceList":null,"multiple":false,"name":"pausRule","type":"button","value":""},{"deviceList":null,"multiple":false,"name":"delayMinute.2","type":"number","value":""},{"deviceList":null,"multiple":true,"name":"disableAct","type":"enum","value":null},{"deviceList":null,"multiple":false,"name":"useLastDev.3","type":"bool","value":""},{"deviceList":null,"multiple":false,"name":"insertAct","type":"enum","value":""},{"deviceList":null,"multiple":false,"name":"useLastDev.1","type":"bool","value":""},{"deviceList":null,"multiple":false,"name":"useST","type":"bool","value":""},{"deviceList":null,"multiple":false,"name":"cCmd.3","type":"enum","value":"updateFrame"},{"deviceList":null,"multiple":false,"name":"actSubType.1","type":"enum","value":"getDefinedAction"},{"deviceList":null,"multiple":false,"name":"tstate1","type":"text","value":"*changed*"},{"deviceList":null,"multiple":false,"name":"tCustomAttr1","type":"enum","value":"longitude"},{"deviceList":null,"multiple":false,"name":"actSubType.3","type":"enum","value":"getDefinedAction"},{"deviceList":null,"multiple":false,"name":"myCapab.1","type":"enum","value":"Actuator"},{"deviceList":null,"multiple":false,"name":"myCapab.3","type":"enum","value":"Actuator"},{"deviceList":null,"multiple":false,"name":"refreshActions","type":"button","value":""},{"deviceList":null,"multiple":false,"name":"delayHor.3","type":"number","value":"00"},{"deviceList":null,"multiple":false,"name":"dValues","type":"bool","value":"true"},{"deviceList":null,"multiple":false,"name":"hasAll","type":"button","value":""},{"deviceList":null,"multiple":false,"name":"cancelCapab","type":"button","value":""},{"deviceList":null,"multiple":false,"name":"actType.1","type":"enum","value":"modeActs"},{"deviceList":null,"multiple":false,"name":"uVar.2","type":"bool","value":""},{"deviceList":null,"multiple":false,"name":"moreParams","type":"button","value":""},{"deviceList":null,"multiple":false,"name":"stopRule","type":"button","value":""},{"deviceList":null,"multiple":false,"name":"origLabel","type":"text","value":"Mower Update Longitude"},{"deviceList":null,"multiple":false,"name":"ReltDev1","type":"enum","value":"*changed*"},{"deviceList":null,"multiple":false,"name":"delaySec.3","type":"decimal","value":"2"},{"deviceList":null,"multiple":false,"name":"actType.3","type":"enum","value":"modeActs"},{"deviceList":null,"multiple":true,"name":"logging","type":"enum","value":null},{"deviceList":null,"multiple":false,"name":"editCond","type":"enum","value":""},{"deviceList":null,"multiple":false,"name":"delayAct.1","type":"enum","value":"none"},{"deviceList":null,"multiple":false,"name":"actType.4","type":"enum","value":""},{"deviceList":null,"multiple":false,"name":"delayAct.3","type":"enum","value":"hrs:min:sec"},{"deviceList":null,"multiple":false,"name":"updateRule","type":"button","value":""},{"deviceList":null,"multiple":false,"name":"runAction","type":"button","value":""},{"deviceList":null,"multiple":false,"name":"editParam","type":"enum","value":""},{"deviceList":null,"multiple":false,"name":"randomAct.3","type":"bool","value":""},{"deviceList":null,"multiple":false,"name":"randomAct.2","type":"bool","value":""},{"deviceList":null,"multiple":false,"name":"delete","type":"enum","value":""},{"deviceList":{"1525":"Mower: Automower - HUSQVARNA AUTOMOWER\\u00ae 430XH"},"multiple":false,"name":"tDev1","type":"capability.*","value":null},{"deviceList":null,"multiple":false,"name":"cpType1.1","type":"enum","value":"decimal"},{"deviceList":null,"multiple":false,"name":"cpType1.3","type":"enum","value":""},{"deviceList":null,"multiple":false,"name":"cpVal1.1","type":"text","value":"%value%"},{"deviceList":null,"multiple":false,"name":"actionCancel","type":"button","value":""},{"deviceList":null,"multiple":false,"name":"cancelAct.2","type":"bool","value":""},{"deviceList":null,"multiple":false,"name":"cancelAct.3","type":"bool","value":""},{"deviceList":null,"multiple":false,"name":"editAct","type":"enum","value":"1"},{"deviceList":{"1527":"Mower Location"},"multiple":true,"name":"devices.1","type":"capability.actuator","value":null},{"deviceList":null,"multiple":false,"name":"pointless","type":"button","value":""},{"deviceList":{"1527":"Mower Location"},"multiple":true,"name":"devices.3","type":"capability.actuator","value":null},{"deviceList":null,"multiple":false,"name":"comments","type":"textarea","value":""},{"deviceList":null,"multiple":true,"name":"cutAct","type":"enum","value":null},{"deviceList":null,"multiple":false,"name":"delParam","type":"enum","value":""},{"deviceList":null,"multiple":true,"name":"deleteAct","type":"enum","value":null},{"deviceList":null,"multiple":false,"name":"xVar1.1","type":"enum","value":""}],"subscriptions":[{"handler":"allHandler","name":"longitude","type":"DEVICE","typeId":1525,"typeName":"Mower: Automower - HUSQVARNA AUTOMOWER\\u00ae 430XH","filter":"true"}]}}}
--------------------------------------------------------------------------------
/Mower update latitude.json:
--------------------------------------------------------------------------------
1 | {"deviceReplacements":{"1525":{"deviceName":"Husqvarna AutoMower","deviceLabel":"Mower: Automower - HUSQVARNA AUTOMOWER\\u00ae 430XH","deviceTypeName":"Husqvarna AutoMower","deviceTypeNamespace":"imnotbob"},"1527":{"deviceName":"Mower Location","deviceLabel":"Mower Location","deviceTypeName":"Google Map iFrame","deviceTypeNamespace":"gomce62"}},"appReplacements":{"1373":{"appTypeName":"Rule-5.1","appTypeNamespace":"hubitat","appType":"sys","appName":"Rule-5.1","appLabel":"Mower update latitude","parentAppInstalledAppId":"1091","parentAppTypeName":"Rule Machine","parentAppTypeNamespace":"hubitat","parentAppName":"Rule Machine","parentAppLabel":"Rule Machine","childApps":{},"singleInstance":false}},"appData":{"1373":{"state":{"actionDone":true,"ndx":2,"dateFormat":"yyyy-MM-dd","nestedBlock":[],"installedRules":[{"1199":"Charge truck"},{"1101":"Garage Lights on when door Opens"},{"1092":"Hot Tub Approaching Max"},{"1136":"Hub Update Avail"},{"1363":"Mower Stuck Alert"},{"1374":"Mower Update Longitude"},{"1096":"Rachio - Start"},{"1097":"Rachio Stop All"},{"1371":"Weather station device orphaned"},{"1264":"pause the tv"},{"1265":"resume the tv"}],"clonedName":"Mower update latitude","tCustomAttrType1":"NUMBER","selectActionsParams":{"label":"test"},"editCondIf":null,"stopOnST":false,"usesTime":false,"nestedIf":[],"trigCustoms":["latitude","latitude"],"repeating":null,"capabDone":true,"skipping":false,"lastEvtName":"Mower: Automower - HUSQVARNA AUTOMOWER\\u00ae 430XH","locationBlocked":[],"pbFixed":true,"ruleNdx":1,"actionList":["1"],"timeTriggers":[],"locVars":{},"allVarsO":[],"actLabelIndent":"","varSettingsUpdated":true,"certainTimes":[],"allVarsS":[],"allVarsT":[],"prevState":{"1525":47.1263133,"PB":"true","1181":104.4},"eval":{},"lastEvtText":"latitude is 47.1263133","capabstrue":{"1":"Mower: Automower - HUSQVARNA AUTOMOWER\\u00ae 430XH reports latitude(47.1263333) *changed*"},"paramNdx.1":1,"installedCapabs":["CarbonDioxideMeasurement","Configuration","RelativeHumidityMeasurement","ColorMode","HealthCheck","Initialize","PowerSource","SpeechSynthesis","DoubleTapableButton","TamperAlert","Light","Battery","Valve","RelaySwitch","CarbonMonoxideDetector","PresenceSensor","ColorControl","Polling","ChangeLevel","PowerMeter","IlluminanceMeasurement","Switch","Tone","Sensor","WaterSensor","EnergyMeter","ThreeAxis","Variable","GasDetector","VoltageMeasurement","ContactSensor","Notification","Refresh","ReleasableButton","SwitchLevel","ColorTemperature","HoldableButton","MotionSensor","DoorControl","Outlet","UltravioletIndex","Telnet","Actuator","Thermostat","AudioVolume","PressureMeasurement","LockCodes","Indicator","PushableButton","Lock","GarageDoorControl","TemperatureMeasurement","AccelerationSensor","AirQuality","Alarm","SmokeDetector"],"nestedSkipAll":[],"lastEvtDate":"2022-06-28","nestedInIf":[],"actions":{"1":{"wait":null,"delay":"","modes":{},"method":"getDefinedAction","indent":"","rule":null,"label":"setLatitude(%value%(47.1262883)) on Mower Location\\n","cond":0}},"usesDate":false,"actNdx":2,"lastEvtValue":"47.1263133","allVarsGT":[],"installed":true,"waitEvents":[],"private":"true","isPredicate":false,"allVars":{},"simpleCond":false,"changedValues":true,"nestedRepIf":[],"lastEvtTime":"03:28","condOper":"cond","nestedElse":[],"allVarsI":[],"varTriggersFixed":true,"needWaitCancel":false,"cutAction":[],"allVarsD":[],"broken":false,"stopped":false,"rulesList":[],"nestedLabel":[],"oldInputAct":true,"inputAct":true,"lastEvtDevId":"1525","waitCondNdx":1,"token":0,"capabsfalse":{"2":{}},"stPrimed":true,"timeTriggersW":{},"allLocalVars":{},"varSettingsOld":{},"timeFormat":"hh:mm","olddValues":true,"needWaitDone":false},"appSettings":[{"deviceList":null,"multiple":false,"name":"tCapab1","type":"enum","value":"Custom Attribute"},{"deviceList":null,"multiple":false,"name":"tCapab2","type":"enum","value":""},{"deviceList":null,"multiple":false,"name":"actionDone","type":"button","value":""},{"deviceList":null,"multiple":false,"name":"runAction","type":"button","value":""},{"deviceList":null,"multiple":false,"name":"uVar1.1","type":"bool","value":""},{"deviceList":null,"multiple":false,"name":"cCmd.1","type":"enum","value":"setLatitude"},{"deviceList":null,"multiple":true,"name":"copyAct","type":"enum","value":null},{"deviceList":null,"multiple":false,"name":"editParam","type":"enum","value":""},{"deviceList":null,"multiple":false,"name":"pausRule","type":"button","value":""},{"deviceList":null,"multiple":true,"name":"disableAct","type":"enum","value":null},{"deviceList":null,"multiple":false,"name":"insertAct","type":"enum","value":""},{"deviceList":null,"multiple":false,"name":"delete","type":"enum","value":""},{"deviceList":null,"multiple":false,"name":"useLastDev.1","type":"bool","value":""},{"deviceList":null,"multiple":false,"name":"useST","type":"bool","value":""},{"deviceList":{"1525":"Mower: Automower - HUSQVARNA AUTOMOWER\\u00ae 430XH"},"multiple":false,"name":"tDev1","type":"capability.*","value":null},{"deviceList":null,"multiple":false,"name":"actSubType.1","type":"enum","value":"getDefinedAction"},{"deviceList":null,"multiple":false,"name":"cpType1.1","type":"enum","value":"decimal"},{"deviceList":null,"multiple":false,"name":"actSubType.2","type":"enum","value":""},{"deviceList":null,"multiple":false,"name":"tstate1","type":"text","value":"*changed*"},{"deviceList":null,"multiple":false,"name":"tCustomAttr1","type":"enum","value":"latitude"},{"deviceList":null,"multiple":false,"name":"cpVal1.1","type":"text","value":"%value%"},{"deviceList":null,"multiple":false,"name":"actionCancel","type":"button","value":""},{"deviceList":null,"multiple":false,"name":"myCapab.1","type":"enum","value":"Actuator"},{"deviceList":null,"multiple":false,"name":"refreshActions","type":"button","value":""},{"deviceList":null,"multiple":false,"name":"dValues","type":"bool","value":"true"},{"deviceList":null,"multiple":false,"name":"editAct","type":"enum","value":""},{"deviceList":null,"multiple":false,"name":"badAttr","type":"button","value":""},{"deviceList":{"1527":"Mower Location"},"multiple":true,"name":"devices.1","type":"capability.actuator","value":null},{"deviceList":null,"multiple":false,"name":"pointless","type":"button","value":""},{"deviceList":null,"multiple":false,"name":"comments","type":"textarea","value":""},{"deviceList":null,"multiple":false,"name":"hasAll","type":"button","value":""},{"deviceList":null,"multiple":false,"name":"cancelCapab","type":"button","value":""},{"deviceList":null,"multiple":false,"name":"actType.1","type":"enum","value":"modeActs"},{"deviceList":null,"multiple":true,"name":"cutAct","type":"enum","value":null},{"deviceList":null,"multiple":false,"name":"moreParams","type":"button","value":""},{"deviceList":null,"multiple":false,"name":"delParam","type":"enum","value":""},{"deviceList":null,"multiple":false,"name":"stopRule","type":"button","value":""},{"deviceList":null,"multiple":false,"name":"rCapab_2","type":"enum","value":""},{"deviceList":null,"multiple":false,"name":"origLabel","type":"text","value":"Mower update latitude"},{"deviceList":null,"multiple":false,"name":"ReltDev1","type":"enum","value":"*changed*"},{"deviceList":null,"multiple":true,"name":"logging","type":"enum","value":null},{"deviceList":null,"multiple":true,"name":"deleteAct","type":"enum","value":null},{"deviceList":null,"multiple":false,"name":"actType.2","type":"enum","value":"modeActs"},{"deviceList":null,"multiple":false,"name":"editCond","type":"enum","value":""},{"deviceList":null,"multiple":false,"name":"delayAct.1","type":"enum","value":"none"},{"deviceList":null,"multiple":false,"name":"updateRule","type":"button","value":""}],"subscriptions":[{"handler":"allHandler","name":"latitude","type":"DEVICE","typeId":1525,"typeName":"Mower: Automower - HUSQVARNA AUTOMOWER\\u00ae 430XH","filter":"true"}]}}}
--------------------------------------------------------------------------------
/MyCT100.json:
--------------------------------------------------------------------------------
1 | {
2 | "packageName": "CT100 Driver",
3 | "author": "Larry Kahn",
4 | "version": "1.0.0",
5 | "minimumHEVersion": "1.0.0",
6 | "dateReleased": "2020-10-19",
7 | "drivers": [
8 | {
9 | "id": "3a213f75-05d6-4c04-83f1-c6a920d74b72",
10 | "name": "My CT100 Thermostat",
11 | "namespace": "smartthings",
12 | "location": "https://raw.githubusercontent.com/lgkahn/hubitat/master/myct100.groovy",
13 | "required": true
14 | }
15 | ]
16 | }
--------------------------------------------------------------------------------
/MyUtilTechSiren.json:
--------------------------------------------------------------------------------
1 | {
2 | "packageName": "Util Tech Siren",
3 | "author": "Larry Kahn",
4 | "version": "1.0.0",
5 | "minimumHEVersion": "1.0.0",
6 | "dateReleased": "2020-10-19",
7 | "drivers": [
8 | {
9 | "id": "b129009b-629b-44ac-9642-888962423575",
10 | "name": "My Utilitech Z-Wave Siren",
11 | "namespace": "jscgs350",
12 | "location": "https://raw.githubusercontent.com/lgkahn/hubitat/master/myutiltechsiren.groovy",
13 | "required": true
14 | }
15 | ]
16 | }
--------------------------------------------------------------------------------
/QubinoWeatherStation.json:
--------------------------------------------------------------------------------
1 | {
2 | "packageName": "Qubino Weather Station (not working)",
3 | "author": "Larry Kahn",
4 | "version": "1.0.0",
5 | "minimumHEVersion": "1.0.0",
6 | "dateReleased": "2020-10-19",
7 | "drivers": [
8 | {
9 | "id": "1565b4a3-020c-485c-96ee-8be039e377c7",
10 | "name": "Qubino Weatherstation",
11 | "namespace": "LGK-Apps",
12 | "location": "https://raw.githubusercontent.com/lgkahn/hubitat/master/quibinoweather.groovy",
13 | "required": true
14 | }
15 | ]
16 | }
--------------------------------------------------------------------------------
/RoofCoilController.json:
--------------------------------------------------------------------------------
1 | {
2 | "packageName": "Turn a switch on/off based on date and temp.",
3 | "author": "Larry Kahn",
4 | "version": "1.2.3",
5 | "minimumHEVersion": "1.2.3",
6 | "dateReleased": "2020-10-19",
7 | "apps": [
8 | {
9 | "id": "c65e3a8f-75b7-4d82-a6e7-f0ed09e1e787",
10 | "name": "Roof Coil Controller",
11 | "namespace": "smartthings",
12 | "location": "https://raw.githubusercontent.com/lgkahn/hubitat/master/roofcoilcontroler.groovy",
13 | "required": true,
14 | "oauth": false,
15 | "primary": false
16 | }
17 | ]
18 | }
--------------------------------------------------------------------------------
/ST814.json:
--------------------------------------------------------------------------------
1 | {
2 | "packageName": "EverSource St814 temp sensor",
3 | "author": "Larry Kahn",
4 | "version": "4.0.0",
5 | "minimumHEVersion": "4.0.0",
6 | "dateReleased": "2020-10-19",
7 | "drivers": [
8 | {
9 | "id": "bd6c93b8-88e6-49b5-8afe-94ff9ee9a4bc",
10 | "name": "EverSpring ST814 V4",
11 | "namespace": "lgkapps",
12 | "location": "https://raw.githubusercontent.com/lgkahn/hubitat/master/stg814v4.groovey",
13 | "required": true
14 | }
15 | ]
16 | }
--------------------------------------------------------------------------------
/Smartstrip Switch 2.json:
--------------------------------------------------------------------------------
1 | {"deviceReplacements":{"131":{"deviceName":"Aeon SmartStrip LGK","deviceLabel":"Aeon Powerstrip","deviceTypeName":"Aeon SmartStrip LGK","deviceTypeNamespace":"smartthings"},"159":{"deviceName":"Aeon PS Sw2","deviceLabel":"Switch2","deviceTypeName":"Virtual Switch","deviceTypeNamespace":"hubitat"}},"appReplacements":{"231":{"appTypeName":"Rule-4.0","appTypeNamespace":"hubitat","appName":"Rule-4.0","appLabel":"Smartstrip Switch 2","parentAppTypeName":"Rule Machine","parentAppLabel":"Rule Machine","singleInstance":false}},"appData":{"231":{"state":{"actionListMain":["2","5","1","6","3","7","4","8","9"],"connectors":{},"actionDone":true,"parens":{"1":0,"2":0,"3":0},"hasRuleAct":false,"selectActionsParams":{"thisStr":"Main","label":"Smartstrip Switch 2"},"editCondIf":null,"waitBV":{},"usesTime":false,"inIf":false,"trigCustoms":[],"repeating":[],"capabDone":true,"refreshActions":false,"lastEvtName":"Switch2","skippingMain":false,"skipAllMain":null,"locationBlocked":[],"hasAll":false,"inRepIf":false,"ndx.false":10,"lvList":[],"ruleNdx":4,"firstR":{"1":false,"2":false,"3":false},"allVarsO":["WateringTime"],"timeTriggers":[],"actLabelIndent":"","howManyT":16,"certainTimes":[],"subscribedVariables":[],"paramsDone":false,"prevState":{"PB":"true","158":"on","159":"on","131":"on"},"eval":{"1":["1"],"2":[4],"3":[7]},"installedCapabs":["Polling","PowerMeter","PushableButton","IlluminanceMeasurement","ReleasableButton","HealthCheck","Outlet","Battery","Indicator","MotionSensor","ColorTemperature","SpeechSynthesis","Initialize","PresenceSensor","Light","Thermostat","AccelerationSensor","Refresh","RelativeHumidityMeasurement","TamperAlert","ThreeAxis","EnergyMeter","Telnet","ColorMode","UltravioletIndex","TemperatureMeasurement","HoldableButton","Notification","SwitchLevel","Switch","ChangeLevel","Configuration","PressureMeasurement","Actuator","Sensor","ContactSensor","ColorControl","VoltageMeasurement","DoubleTapableButton","PowerSource"],"capabstrue":{"1.true":"Switch2(off) turns *changed*","2.true":{}},"wasEndSR":false,"blockIfMain":false,"lastEvtDate":"26-Jan-2021","actionsMain":{"1":{"wait":null,"delay":"","modes":{},"method":"getDefinedAction","indent":"\\t\\t","rule":0,"label":"\\t\\ton2() on Aeon Powerstrip\\n","cond":0},"2":{"wait":null,"delay":"","modes":{},"method":"getIfThen","indent":"","rule":1,"label":"IF (Switch2(off) is on(F) [FALSE]) THEN\\n","cond":0},"3":{"wait":null,"delay":"","modes":{},"method":"getElse","indent":"\\t","rule":0,"label":"ELSE\\n","cond":0},"4":{"wait":null,"delay":"","modes":{},"method":"getDefinedAction","indent":"\\t\\t","rule":0,"label":"\\t\\toff2() on Aeon Powerstrip\\n","cond":0},"5":{"wait":null,"delay":"","modes":{},"method":"getIfThen","indent":"\\t","rule":2,"label":"\\tIF (Aeon Powerstrip switch2(off) off(T) [TRUE]) THEN\\n","cond":0},"6":{"wait":null,"delay":"","modes":{},"method":"getEndIf","indent":"\\t","rule":0,"label":"\\tEND-IF\\n","cond":0},"7":{"wait":null,"delay":"","modes":{},"method":"getIfThen","indent":"\\t","rule":3,"label":"\\tIF (Aeon Powerstrip switch2(off) on(F) [FALSE]) THEN\\n","cond":0},"8":{"wait":null,"delay":"","modes":{},"method":"getEndIf","indent":"\\t","rule":0,"label":"\\tEND-IF\\n","cond":0},"9":{"wait":null,"delay":"","modes":{},"method":"getEndIf","indent":"","rule":0,"label":"END-IF\\n","cond":0}},"nestedInIf":[],"actNdx":10,"hasRule":false,"lastEvtValue":"on","installed":true,"private":"true","waitEvents":[],"capabActDone":false,"skipTypeMain":"else","gvList":["WateringTime"],"hasDevice":null,"hasCondition":false,"ndx.true":2,"editingRule":0,"allVars":{"WateringTime":{"val":2,"type":"Number"}},"simpleCond":false,"nestedRepIf":[],"nestedBlockMain":[],"lastEvtTime":"04:03 PM","condOper":"cond","waitB":{},"inRepeat":false,"cutAction":[],"hasWaitEvent":false,"nestedIfMain":[],"nestedLabel":[],"waitBL":{},"paramNdx":1,"lastEvtDevId":"159","howMany":5,"hasCompleteRule":false,"varUseList":{},"waitCondNdx":1,"token":0,"hasElse":false,"nestedSkipAllMain":[],"capabsfalse":{"4.false":"Aeon Powerstrip switch2(off) off","10.false":{},"7.false":"Aeon Powerstrip switch2(off) on","1.false":"Switch2(off) is on"},"timeTriggersW":{},"timeFormat":"hh:mm a","waitConds":[]},"appSettings":[{"deviceList":null,"multiple":false,"name":"tCapab1","type":"enum","value":"Switch"},{"deviceList":null,"multiple":false,"name":"tCapab2","type":"enum","value":""},{"deviceList":null,"multiple":false,"name":"myCapabMain.1","type":"enum","value":"Switch"},{"deviceList":null,"multiple":false,"name":"actionDone","type":"button","value":""},{"deviceList":null,"multiple":false,"name":"actSubTypeMain.9","type":"enum","value":"END-IF"},{"deviceList":null,"multiple":false,"name":"myCapabMain.4","type":"enum","value":"Switch"},{"deviceList":null,"multiple":false,"name":"actSubTypeMain.7","type":"enum","value":"IF (conditions) THEN"},{"deviceList":null,"multiple":false,"name":"actSubTypeMain.8","type":"enum","value":"END-IF"},{"deviceList":null,"multiple":false,"name":"actSubTypeMain.5","type":"enum","value":"IF (conditions) THEN"},{"deviceList":null,"multiple":false,"name":"actSubTypeMain.6","type":"enum","value":"END-IF"},{"deviceList":null,"multiple":false,"name":"actSubTypeMain.3","type":"enum","value":"ELSE"},{"deviceList":null,"multiple":false,"name":"pausRule","type":"button","value":""},{"deviceList":null,"multiple":false,"name":"actSubTypeMain.4","type":"enum","value":"Run Custom Action"},{"deviceList":null,"multiple":false,"name":"actSubTypeMain.1","type":"enum","value":"Run Custom Action"},{"deviceList":{"131":null},"multiple":true,"name":"devicesMain.4","type":"capability.switch","value":null},{"deviceList":null,"multiple":false,"name":"actSubTypeMain.2","type":"enum","value":"IF (conditions) THEN"},{"deviceList":null,"multiple":false,"name":"state7","type":"enum","value":"on"},{"deviceList":null,"multiple":false,"name":"insertAct","type":"enum","value":""},{"deviceList":null,"multiple":false,"name":"cond","type":"enum","value":null},{"deviceList":null,"multiple":false,"name":"state1","type":"enum","value":"on"},{"deviceList":null,"multiple":false,"name":"not1","type":"bool","value":""},{"deviceList":null,"multiple":false,"name":"state4","type":"enum","value":"off"},{"deviceList":{"131":null},"multiple":true,"name":"devicesMain.1","type":"capability.switch","value":null},{"deviceList":null,"multiple":false,"name":"tstate1","type":"enum","value":"*changed*"},{"deviceList":null,"multiple":false,"name":"actTypeMain.10","type":"enum","value":""},{"deviceList":null,"multiple":false,"name":"refreshActions","type":"button","value":""},{"deviceList":null,"multiple":false,"name":"rCustomAttrType4","type":"enum","value":"ENUM"},{"deviceList":null,"multiple":false,"name":"hasAll","type":"button","value":""},{"deviceList":null,"multiple":false,"name":"cancelCapab","type":"button","value":""},{"deviceList":null,"multiple":false,"name":"editToken","type":"button","value":""},{"deviceList":{"159":null},"multiple":true,"name":"rDev1","type":"capability.switch","value":null},{"deviceList":null,"multiple":false,"name":"rCustomAttrType7","type":"enum","value":"ENUM"},{"deviceList":{"131":null},"multiple":false,"name":"rDev7","type":"capability.*","value":null},{"deviceList":null,"multiple":false,"name":"origLabel","type":"text","value":"Smartstrip Switch 2"},{"deviceList":null,"multiple":false,"name":"cpType_Main.11","type":"enum","value":""},{"deviceList":null,"multiple":false,"name":"eraseRule","type":"button","value":""},{"deviceList":{"131":null},"multiple":false,"name":"rDev4","type":"capability.*","value":null},{"deviceList":null,"multiple":true,"name":"logging","type":"enum","value":null},{"deviceList":null,"multiple":false,"name":"editCond","type":"enum","value":""},{"deviceList":null,"multiple":false,"name":"updateRule","type":"button","value":""},{"deviceList":null,"multiple":false,"name":"hasRule","type":"button","value":""},{"deviceList":null,"multiple":false,"name":"runAction","type":"button","value":""},{"deviceList":null,"multiple":false,"name":"rCustomAttr7","type":"enum","value":"switch2"},{"deviceList":null,"multiple":false,"name":"rCustomAttr4","type":"enum","value":"switch2"},{"deviceList":null,"multiple":false,"name":"delete","type":"enum","value":""},{"deviceList":null,"multiple":false,"name":"rCapab7","type":"enum","value":"Custom Attribute"},{"deviceList":null,"multiple":false,"name":"cpType_Main.41","type":"enum","value":""},{"deviceList":{"159":null},"multiple":true,"name":"tDev1","type":"capability.switch","value":null},{"deviceList":null,"multiple":false,"name":"rCapab4","type":"enum","value":"Custom Attribute"},{"deviceList":null,"multiple":false,"name":"rCapab1","type":"enum","value":"Switch"},{"deviceList":null,"multiple":false,"name":"actionCancel","type":"button","value":""},{"deviceList":null,"multiple":false,"name":"editAct","type":"enum","value":""},{"deviceList":null,"multiple":false,"name":"actTypeMain.9","type":"enum","value":"Conditional Actions"},{"deviceList":null,"multiple":false,"name":"comments","type":"textarea","value":""},{"deviceList":null,"multiple":false,"name":"rCapab10","type":"enum","value":""},{"deviceList":null,"multiple":false,"name":"cutAct","type":"enum","value":""},{"deviceList":null,"multiple":false,"name":"delayActMain.1","type":"bool","value":""},{"deviceList":null,"multiple":false,"name":"not4","type":"bool","value":""},{"deviceList":null,"multiple":false,"name":"delayActMain.4","type":"bool","value":""},{"deviceList":null,"multiple":false,"name":"not7","type":"bool","value":""},{"deviceList":null,"multiple":false,"name":"actTypeMain.2","type":"enum","value":"Conditional Actions"},{"deviceList":null,"multiple":false,"name":"actTypeMain.1","type":"enum","value":"Set Mode, Variables or File, Run Custom Action"},{"deviceList":null,"multiple":true,"name":"deleteAct","type":"enum","value":null},{"deviceList":null,"multiple":false,"name":"oper","type":"enum","value":null},{"deviceList":null,"multiple":false,"name":"actTypeMain.4","type":"enum","value":"Set Mode, Variables or File, Run Custom Action"},{"deviceList":null,"multiple":false,"name":"cCmdMain.4","type":"enum","value":"off2"},{"deviceList":null,"multiple":false,"name":"actTypeMain.3","type":"enum","value":"Conditional Actions"},{"deviceList":null,"multiple":false,"name":"actTypeMain.6","type":"enum","value":"Conditional Actions"},{"deviceList":null,"multiple":false,"name":"actTypeMain.5","type":"enum","value":"Conditional Actions"},{"deviceList":null,"multiple":false,"name":"actTypeMain.8","type":"enum","value":"Conditional Actions"},{"deviceList":null,"multiple":false,"name":"cCmdMain.1","type":"enum","value":"on2"},{"deviceList":null,"multiple":false,"name":"actTypeMain.7","type":"enum","value":"Conditional Actions"}],"subscriptions":[{"handler":"allHandler","name":"switch","type":"DEVICE","typeId":159,"typeName":"Switch2","filter":"true"}]}}}
--------------------------------------------------------------------------------
/Smartstrip Switch 3.json:
--------------------------------------------------------------------------------
1 | {"deviceReplacements":{"131":{"deviceName":"Aeon SmartStrip LGK","deviceLabel":"Aeon Powerstrip","deviceTypeName":"Aeon SmartStrip LGK","deviceTypeNamespace":"smartthings"},"160":{"deviceName":"Aeon PS Sw3","deviceLabel":"Switch3","deviceTypeName":"Virtual Switch","deviceTypeNamespace":"hubitat"}},"appReplacements":{"232":{"appTypeName":"Rule-4.0","appTypeNamespace":"hubitat","appName":"Rule-4.0","appLabel":"Smartstrip Switch 3","parentAppTypeName":"Rule Machine","parentAppLabel":"Rule Machine","singleInstance":false}},"appData":{"232":{"state":{"actionListMain":["2","5","1","6","3","7","4","8","9"],"connectors":{},"actionDone":true,"parens":{"1":0,"2":0,"3":0},"hasRuleAct":false,"selectActionsParams":{"thisStr":"Main","label":"Smartstrip Switch 3"},"editCondIf":null,"waitBV":{},"usesTime":false,"inIf":false,"trigCustoms":[],"repeating":[],"capabDone":true,"refreshActions":false,"lastEvtName":"Switch3","skippingMain":false,"skipAllMain":null,"locationBlocked":[],"hasAll":false,"inRepIf":false,"ndx.false":10,"lvList":[],"ruleNdx":4,"firstR":{"1":false,"2":false,"3":false},"allVarsO":["WateringTime"],"timeTriggers":[],"actLabelIndent":"","howManyT":16,"certainTimes":[],"subscribedVariables":[],"paramsDone":false,"prevState":{"PB":"true","158":"on","160":"on","131":"on"},"eval":{"1":["1"],"2":[4],"3":[7]},"installedCapabs":["Polling","PowerMeter","PushableButton","IlluminanceMeasurement","ReleasableButton","HealthCheck","Outlet","Battery","Indicator","MotionSensor","ColorTemperature","SpeechSynthesis","Initialize","PresenceSensor","Light","Thermostat","AccelerationSensor","Refresh","RelativeHumidityMeasurement","TamperAlert","ThreeAxis","EnergyMeter","Telnet","ColorMode","UltravioletIndex","TemperatureMeasurement","HoldableButton","Notification","SwitchLevel","Switch","ChangeLevel","Configuration","PressureMeasurement","Actuator","Sensor","ContactSensor","ColorControl","VoltageMeasurement","DoubleTapableButton","PowerSource"],"capabstrue":{"1.true":"Switch3(off) turns *changed*","2.true":{}},"wasEndSR":false,"blockIfMain":false,"lastEvtDate":"26-Jan-2021","actionsMain":{"1":{"wait":null,"delay":"","modes":{},"method":"getDefinedAction","indent":"\\t\\t","rule":0,"label":"\\t\\ton3() on Aeon Powerstrip\\n","cond":0},"2":{"wait":null,"delay":"","modes":{},"method":"getIfThen","indent":"","rule":1,"label":"IF (Switch3(off) is on(F) [FALSE]) THEN\\n","cond":0},"3":{"wait":null,"delay":"","modes":{},"method":"getElse","indent":"\\t","rule":0,"label":"ELSE\\n","cond":0},"4":{"wait":null,"delay":"","modes":{},"method":"getDefinedAction","indent":"\\t\\t","rule":0,"label":"\\t\\toff3() on Aeon Powerstrip\\n","cond":0},"5":{"wait":null,"delay":"","modes":{},"method":"getIfThen","indent":"\\t","rule":2,"label":"\\tIF (Aeon Powerstrip switch3(off) off(T) [TRUE]) THEN\\n","cond":0},"6":{"wait":null,"delay":"","modes":{},"method":"getEndIf","indent":"\\t","rule":0,"label":"\\tEND-IF\\n","cond":0},"7":{"wait":null,"delay":"","modes":{},"method":"getIfThen","indent":"\\t","rule":3,"label":"\\tIF (Aeon Powerstrip switch3(off) on(F) [FALSE]) THEN\\n","cond":0},"8":{"wait":null,"delay":"","modes":{},"method":"getEndIf","indent":"\\t","rule":0,"label":"\\tEND-IF\\n","cond":0},"9":{"wait":null,"delay":"","modes":{},"method":"getEndIf","indent":"","rule":0,"label":"END-IF\\n","cond":0}},"nestedInIf":[],"actNdx":10,"hasRule":false,"lastEvtValue":"on","installed":true,"private":"true","waitEvents":[],"capabActDone":false,"skipTypeMain":"else","gvList":["WateringTime"],"hasDevice":null,"hasCondition":false,"ndx.true":2,"editingRule":0,"allVars":{"WateringTime":{"val":2,"type":"Number"}},"simpleCond":false,"nestedRepIf":[],"nestedBlockMain":[],"lastEvtTime":"04:03 PM","condOper":"cond","waitB":{},"inRepeat":false,"cutAction":[],"hasWaitEvent":false,"nestedIfMain":[],"nestedLabel":[],"waitBL":{},"paramNdx":1,"lastEvtDevId":"160","howMany":5,"hasCompleteRule":false,"varUseList":{},"waitCondNdx":1,"token":0,"hasElse":false,"nestedSkipAllMain":[],"capabsfalse":{"4.false":"Aeon Powerstrip switch3(off) off","10.false":{},"7.false":"Aeon Powerstrip switch3(off) on","1.false":"Switch3(off) is on"},"timeTriggersW":{},"timeFormat":"hh:mm a","waitConds":[]},"appSettings":[{"deviceList":null,"multiple":false,"name":"tCapab1","type":"enum","value":"Switch"},{"deviceList":null,"multiple":false,"name":"tCapab2","type":"enum","value":""},{"deviceList":null,"multiple":false,"name":"myCapabMain.1","type":"enum","value":"Switch"},{"deviceList":null,"multiple":false,"name":"actionDone","type":"button","value":""},{"deviceList":null,"multiple":false,"name":"actSubTypeMain.9","type":"enum","value":"END-IF"},{"deviceList":null,"multiple":false,"name":"myCapabMain.4","type":"enum","value":"Switch"},{"deviceList":null,"multiple":false,"name":"actSubTypeMain.7","type":"enum","value":"IF (conditions) THEN"},{"deviceList":null,"multiple":false,"name":"actSubTypeMain.8","type":"enum","value":"END-IF"},{"deviceList":null,"multiple":false,"name":"actSubTypeMain.5","type":"enum","value":"IF (conditions) THEN"},{"deviceList":null,"multiple":false,"name":"actSubTypeMain.6","type":"enum","value":"END-IF"},{"deviceList":null,"multiple":false,"name":"actSubTypeMain.3","type":"enum","value":"ELSE"},{"deviceList":null,"multiple":false,"name":"pausRule","type":"button","value":""},{"deviceList":null,"multiple":false,"name":"actSubTypeMain.4","type":"enum","value":"Run Custom Action"},{"deviceList":null,"multiple":false,"name":"actSubTypeMain.1","type":"enum","value":"Run Custom Action"},{"deviceList":{"131":null},"multiple":true,"name":"devicesMain.4","type":"capability.switch","value":null},{"deviceList":null,"multiple":false,"name":"actSubTypeMain.2","type":"enum","value":"IF (conditions) THEN"},{"deviceList":null,"multiple":false,"name":"state7","type":"enum","value":"on"},{"deviceList":null,"multiple":false,"name":"insertAct","type":"enum","value":""},{"deviceList":null,"multiple":false,"name":"cond","type":"enum","value":null},{"deviceList":null,"multiple":false,"name":"state1","type":"enum","value":"on"},{"deviceList":null,"multiple":false,"name":"not1","type":"bool","value":""},{"deviceList":null,"multiple":false,"name":"state4","type":"enum","value":"off"},{"deviceList":{"131":null},"multiple":true,"name":"devicesMain.1","type":"capability.switch","value":null},{"deviceList":null,"multiple":false,"name":"tstate1","type":"enum","value":"*changed*"},{"deviceList":null,"multiple":false,"name":"actTypeMain.10","type":"enum","value":""},{"deviceList":null,"multiple":false,"name":"refreshActions","type":"button","value":""},{"deviceList":null,"multiple":false,"name":"rCustomAttrType4","type":"enum","value":"ENUM"},{"deviceList":null,"multiple":false,"name":"hasAll","type":"button","value":""},{"deviceList":null,"multiple":false,"name":"cancelCapab","type":"button","value":""},{"deviceList":null,"multiple":false,"name":"editToken","type":"button","value":""},{"deviceList":{"160":null},"multiple":true,"name":"rDev1","type":"capability.switch","value":null},{"deviceList":null,"multiple":false,"name":"rCustomAttrType7","type":"enum","value":"ENUM"},{"deviceList":{"131":null},"multiple":false,"name":"rDev7","type":"capability.*","value":null},{"deviceList":null,"multiple":false,"name":"origLabel","type":"text","value":"Smartstrip Switch 3"},{"deviceList":null,"multiple":false,"name":"cpType_Main.11","type":"enum","value":""},{"deviceList":null,"multiple":false,"name":"eraseRule","type":"button","value":""},{"deviceList":{"131":null},"multiple":false,"name":"rDev4","type":"capability.*","value":null},{"deviceList":null,"multiple":true,"name":"logging","type":"enum","value":null},{"deviceList":null,"multiple":false,"name":"editCond","type":"enum","value":""},{"deviceList":null,"multiple":false,"name":"updateRule","type":"button","value":""},{"deviceList":null,"multiple":false,"name":"hasRule","type":"button","value":""},{"deviceList":null,"multiple":false,"name":"runAction","type":"button","value":""},{"deviceList":null,"multiple":false,"name":"rCustomAttr7","type":"enum","value":"switch3"},{"deviceList":null,"multiple":false,"name":"rCustomAttr4","type":"enum","value":"switch3"},{"deviceList":null,"multiple":false,"name":"delete","type":"enum","value":""},{"deviceList":null,"multiple":false,"name":"rCapab7","type":"enum","value":"Custom Attribute"},{"deviceList":null,"multiple":false,"name":"cpType_Main.41","type":"enum","value":""},{"deviceList":{"160":null},"multiple":true,"name":"tDev1","type":"capability.switch","value":null},{"deviceList":null,"multiple":false,"name":"rCapab4","type":"enum","value":"Custom Attribute"},{"deviceList":null,"multiple":false,"name":"rCapab1","type":"enum","value":"Switch"},{"deviceList":null,"multiple":false,"name":"actionCancel","type":"button","value":""},{"deviceList":null,"multiple":false,"name":"editAct","type":"enum","value":""},{"deviceList":null,"multiple":false,"name":"actTypeMain.9","type":"enum","value":"Conditional Actions"},{"deviceList":null,"multiple":false,"name":"comments","type":"textarea","value":""},{"deviceList":null,"multiple":false,"name":"rCapab10","type":"enum","value":""},{"deviceList":null,"multiple":false,"name":"cutAct","type":"enum","value":""},{"deviceList":null,"multiple":false,"name":"delayActMain.1","type":"bool","value":""},{"deviceList":null,"multiple":false,"name":"not4","type":"bool","value":""},{"deviceList":null,"multiple":false,"name":"delayActMain.4","type":"bool","value":""},{"deviceList":null,"multiple":false,"name":"not7","type":"bool","value":""},{"deviceList":null,"multiple":false,"name":"actTypeMain.2","type":"enum","value":"Conditional Actions"},{"deviceList":null,"multiple":false,"name":"actTypeMain.1","type":"enum","value":"Set Mode, Variables or File, Run Custom Action"},{"deviceList":null,"multiple":true,"name":"deleteAct","type":"enum","value":null},{"deviceList":null,"multiple":false,"name":"oper","type":"enum","value":null},{"deviceList":null,"multiple":false,"name":"actTypeMain.4","type":"enum","value":"Set Mode, Variables or File, Run Custom Action"},{"deviceList":null,"multiple":false,"name":"cCmdMain.4","type":"enum","value":"off3"},{"deviceList":null,"multiple":false,"name":"actTypeMain.3","type":"enum","value":"Conditional Actions"},{"deviceList":null,"multiple":false,"name":"actTypeMain.6","type":"enum","value":"Conditional Actions"},{"deviceList":null,"multiple":false,"name":"actTypeMain.5","type":"enum","value":"Conditional Actions"},{"deviceList":null,"multiple":false,"name":"actTypeMain.8","type":"enum","value":"Conditional Actions"},{"deviceList":null,"multiple":false,"name":"cCmdMain.1","type":"enum","value":"on3"},{"deviceList":null,"multiple":false,"name":"actTypeMain.7","type":"enum","value":"Conditional Actions"}],"subscriptions":[{"handler":"allHandler","name":"switch","type":"DEVICE","typeId":160,"typeName":"Switch3","filter":"true"}]}}}
--------------------------------------------------------------------------------
/Smartstrip Switch 4.json:
--------------------------------------------------------------------------------
1 | {"deviceReplacements":{"131":{"deviceName":"Aeon SmartStrip LGK","deviceLabel":"Aeon Powerstrip","deviceTypeName":"Aeon SmartStrip LGK","deviceTypeNamespace":"smartthings"},"161":{"deviceName":"Aeon PS Sw4","deviceLabel":"Switch4","deviceTypeName":"Virtual Switch","deviceTypeNamespace":"hubitat"}},"appReplacements":{"233":{"appTypeName":"Rule-4.0","appTypeNamespace":"hubitat","appName":"Rule-4.0","appLabel":"Smartstrip Switch 4","parentAppTypeName":"Rule Machine","parentAppLabel":"Rule Machine","singleInstance":false}},"appData":{"233":{"state":{"actionListMain":["2","5","1","6","3","7","4","8","9"],"connectors":{},"actionDone":true,"parens":{"1":0,"2":0,"3":0},"hasRuleAct":false,"selectActionsParams":{"thisStr":"Main","label":"Smartstrip Switch 4"},"editCondIf":null,"waitBV":{},"usesTime":false,"inIf":false,"trigCustoms":[],"repeating":[],"capabDone":true,"refreshActions":false,"lastEvtName":"Switch4","skippingMain":false,"skipAllMain":null,"locationBlocked":[],"hasAll":false,"inRepIf":false,"ndx.false":10,"lvList":[],"ruleNdx":4,"firstR":{"1":false,"2":false,"3":false},"allVarsO":["WateringTime"],"timeTriggers":[],"actLabelIndent":"","howManyT":16,"certainTimes":[],"subscribedVariables":[],"paramsDone":false,"prevState":{"PB":"true","158":"on","161":"on","131":"on"},"eval":{"1":["1"],"2":[4],"3":[7]},"installedCapabs":["Polling","PowerMeter","PushableButton","IlluminanceMeasurement","ReleasableButton","HealthCheck","Outlet","Battery","Indicator","MotionSensor","ColorTemperature","SpeechSynthesis","Initialize","PresenceSensor","Light","Thermostat","AccelerationSensor","Refresh","RelativeHumidityMeasurement","TamperAlert","ThreeAxis","EnergyMeter","Telnet","ColorMode","UltravioletIndex","TemperatureMeasurement","HoldableButton","Notification","SwitchLevel","Switch","ChangeLevel","Configuration","PressureMeasurement","Actuator","Sensor","ContactSensor","ColorControl","VoltageMeasurement","DoubleTapableButton","PowerSource"],"capabstrue":{"1.true":"Switch4(off) turns *changed*","2.true":{}},"wasEndSR":false,"blockIfMain":false,"lastEvtDate":"26-Jan-2021","actionsMain":{"1":{"wait":null,"delay":"","modes":{},"method":"getDefinedAction","indent":"\\t\\t","rule":0,"label":"\\t\\ton4() on Aeon Powerstrip\\n","cond":0},"2":{"wait":null,"delay":"","modes":{},"method":"getIfThen","indent":"","rule":1,"label":"IF (Switch4(off) is on(F) [FALSE]) THEN\\n","cond":0},"3":{"wait":null,"delay":"","modes":{},"method":"getElse","indent":"\\t","rule":0,"label":"ELSE\\n","cond":0},"4":{"wait":null,"delay":"","modes":{},"method":"getDefinedAction","indent":"\\t\\t","rule":0,"label":"\\t\\toff4() on Aeon Powerstrip\\n","cond":0},"5":{"wait":null,"delay":"","modes":{},"method":"getIfThen","indent":"\\t","rule":2,"label":"\\tIF (Aeon Powerstrip switch4(off) off(T) [TRUE]) THEN\\n","cond":0},"6":{"wait":null,"delay":"","modes":{},"method":"getEndIf","indent":"\\t","rule":0,"label":"\\tEND-IF\\n","cond":0},"7":{"wait":null,"delay":"","modes":{},"method":"getIfThen","indent":"\\t","rule":3,"label":"\\tIF (Aeon Powerstrip switch4(off) on(F) [FALSE]) THEN\\n","cond":0},"8":{"wait":null,"delay":"","modes":{},"method":"getEndIf","indent":"\\t","rule":0,"label":"\\tEND-IF\\n","cond":0},"9":{"wait":null,"delay":"","modes":{},"method":"getEndIf","indent":"","rule":0,"label":"END-IF\\n","cond":0}},"nestedInIf":[],"actNdx":10,"hasRule":false,"lastEvtValue":"on","installed":true,"private":"true","waitEvents":[],"capabActDone":false,"skipTypeMain":"else","gvList":["WateringTime"],"hasDevice":null,"hasCondition":false,"ndx.true":2,"editingRule":0,"allVars":{"WateringTime":{"val":2,"type":"Number"}},"simpleCond":false,"nestedRepIf":[],"nestedBlockMain":[],"lastEvtTime":"04:03 PM","condOper":"cond","waitB":{},"inRepeat":false,"cutAction":[],"hasWaitEvent":false,"nestedIfMain":[],"nestedLabel":[],"waitBL":{},"paramNdx":1,"lastEvtDevId":"161","howMany":5,"hasCompleteRule":false,"varUseList":{},"waitCondNdx":1,"token":0,"hasElse":false,"nestedSkipAllMain":[],"capabsfalse":{"4.false":"Aeon Powerstrip switch4(off) off","10.false":{},"7.false":"Aeon Powerstrip switch4(off) on","1.false":"Switch4(off) is on"},"timeTriggersW":{},"timeFormat":"hh:mm a","waitConds":[]},"appSettings":[{"deviceList":null,"multiple":false,"name":"tCapab1","type":"enum","value":"Switch"},{"deviceList":null,"multiple":false,"name":"tCapab2","type":"enum","value":""},{"deviceList":null,"multiple":false,"name":"myCapabMain.1","type":"enum","value":"Switch"},{"deviceList":null,"multiple":false,"name":"actionDone","type":"button","value":""},{"deviceList":null,"multiple":false,"name":"actSubTypeMain.9","type":"enum","value":"END-IF"},{"deviceList":null,"multiple":false,"name":"myCapabMain.4","type":"enum","value":"Switch"},{"deviceList":null,"multiple":false,"name":"actSubTypeMain.7","type":"enum","value":"IF (conditions) THEN"},{"deviceList":null,"multiple":false,"name":"actSubTypeMain.8","type":"enum","value":"END-IF"},{"deviceList":null,"multiple":false,"name":"actSubTypeMain.5","type":"enum","value":"IF (conditions) THEN"},{"deviceList":null,"multiple":false,"name":"actSubTypeMain.6","type":"enum","value":"END-IF"},{"deviceList":null,"multiple":false,"name":"actSubTypeMain.3","type":"enum","value":"ELSE"},{"deviceList":null,"multiple":false,"name":"pausRule","type":"button","value":""},{"deviceList":null,"multiple":false,"name":"actSubTypeMain.4","type":"enum","value":"Run Custom Action"},{"deviceList":null,"multiple":false,"name":"actSubTypeMain.1","type":"enum","value":"Run Custom Action"},{"deviceList":{"131":null},"multiple":true,"name":"devicesMain.4","type":"capability.switch","value":null},{"deviceList":null,"multiple":false,"name":"actSubTypeMain.2","type":"enum","value":"IF (conditions) THEN"},{"deviceList":null,"multiple":false,"name":"state7","type":"enum","value":"on"},{"deviceList":null,"multiple":false,"name":"insertAct","type":"enum","value":""},{"deviceList":null,"multiple":false,"name":"cond","type":"enum","value":null},{"deviceList":null,"multiple":false,"name":"state1","type":"enum","value":"on"},{"deviceList":null,"multiple":false,"name":"not1","type":"bool","value":""},{"deviceList":null,"multiple":false,"name":"state4","type":"enum","value":"off"},{"deviceList":{"131":null},"multiple":true,"name":"devicesMain.1","type":"capability.switch","value":null},{"deviceList":null,"multiple":false,"name":"tstate1","type":"enum","value":"*changed*"},{"deviceList":null,"multiple":false,"name":"actTypeMain.10","type":"enum","value":""},{"deviceList":null,"multiple":false,"name":"refreshActions","type":"button","value":""},{"deviceList":null,"multiple":false,"name":"rCustomAttrType4","type":"enum","value":"ENUM"},{"deviceList":null,"multiple":false,"name":"hasAll","type":"button","value":""},{"deviceList":null,"multiple":false,"name":"cancelCapab","type":"button","value":""},{"deviceList":null,"multiple":false,"name":"editToken","type":"button","value":""},{"deviceList":{"161":null},"multiple":true,"name":"rDev1","type":"capability.switch","value":null},{"deviceList":null,"multiple":false,"name":"rCustomAttrType7","type":"enum","value":"ENUM"},{"deviceList":{"131":null},"multiple":false,"name":"rDev7","type":"capability.*","value":null},{"deviceList":null,"multiple":false,"name":"origLabel","type":"text","value":"Smartstrip Switch 4"},{"deviceList":null,"multiple":false,"name":"cpType_Main.11","type":"enum","value":""},{"deviceList":null,"multiple":false,"name":"eraseRule","type":"button","value":""},{"deviceList":{"131":null},"multiple":false,"name":"rDev4","type":"capability.*","value":null},{"deviceList":null,"multiple":true,"name":"logging","type":"enum","value":null},{"deviceList":null,"multiple":false,"name":"editCond","type":"enum","value":""},{"deviceList":null,"multiple":false,"name":"updateRule","type":"button","value":""},{"deviceList":null,"multiple":false,"name":"hasRule","type":"button","value":""},{"deviceList":null,"multiple":false,"name":"runAction","type":"button","value":""},{"deviceList":null,"multiple":false,"name":"rCustomAttr7","type":"enum","value":"switch4"},{"deviceList":null,"multiple":false,"name":"rCustomAttr4","type":"enum","value":"switch4"},{"deviceList":null,"multiple":false,"name":"delete","type":"enum","value":""},{"deviceList":null,"multiple":false,"name":"rCapab7","type":"enum","value":"Custom Attribute"},{"deviceList":null,"multiple":false,"name":"cpType_Main.41","type":"enum","value":""},{"deviceList":{"161":null},"multiple":true,"name":"tDev1","type":"capability.switch","value":null},{"deviceList":null,"multiple":false,"name":"rCapab4","type":"enum","value":"Custom Attribute"},{"deviceList":null,"multiple":false,"name":"rCapab1","type":"enum","value":"Switch"},{"deviceList":null,"multiple":false,"name":"actionCancel","type":"button","value":""},{"deviceList":null,"multiple":false,"name":"editAct","type":"enum","value":""},{"deviceList":null,"multiple":false,"name":"actTypeMain.9","type":"enum","value":"Conditional Actions"},{"deviceList":null,"multiple":false,"name":"comments","type":"textarea","value":""},{"deviceList":null,"multiple":false,"name":"rCapab10","type":"enum","value":""},{"deviceList":null,"multiple":false,"name":"cutAct","type":"enum","value":""},{"deviceList":null,"multiple":false,"name":"delayActMain.1","type":"bool","value":""},{"deviceList":null,"multiple":false,"name":"not4","type":"bool","value":""},{"deviceList":null,"multiple":false,"name":"delayActMain.4","type":"bool","value":""},{"deviceList":null,"multiple":false,"name":"not7","type":"bool","value":""},{"deviceList":null,"multiple":false,"name":"actTypeMain.2","type":"enum","value":"Conditional Actions"},{"deviceList":null,"multiple":false,"name":"actTypeMain.1","type":"enum","value":"Set Mode, Variables or File, Run Custom Action"},{"deviceList":null,"multiple":true,"name":"deleteAct","type":"enum","value":null},{"deviceList":null,"multiple":false,"name":"oper","type":"enum","value":null},{"deviceList":null,"multiple":false,"name":"actTypeMain.4","type":"enum","value":"Set Mode, Variables or File, Run Custom Action"},{"deviceList":null,"multiple":false,"name":"cCmdMain.4","type":"enum","value":"off4"},{"deviceList":null,"multiple":false,"name":"actTypeMain.3","type":"enum","value":"Conditional Actions"},{"deviceList":null,"multiple":false,"name":"actTypeMain.6","type":"enum","value":"Conditional Actions"},{"deviceList":null,"multiple":false,"name":"actTypeMain.5","type":"enum","value":"Conditional Actions"},{"deviceList":null,"multiple":false,"name":"actTypeMain.8","type":"enum","value":"Conditional Actions"},{"deviceList":null,"multiple":false,"name":"cCmdMain.1","type":"enum","value":"on4"},{"deviceList":null,"multiple":false,"name":"actTypeMain.7","type":"enum","value":"Conditional Actions"}],"subscriptions":[{"handler":"allHandler","name":"switch","type":"DEVICE","typeId":161,"typeName":"Switch4","filter":"true"}]}}}
--------------------------------------------------------------------------------
/SpruceController.json:
--------------------------------------------------------------------------------
1 | {
2 | "packageName": "Spruce V1 (non wifi) Controller",
3 | "author": "Larry Kahn",
4 | "version": "2.1.0",
5 | "minimumHEVersion": "2.1.0",
6 | "dateReleased": "2020-10-19",
7 | "drivers": [
8 | {
9 | "id": "e14a104d-2864-4853-aa7b-b480e8b23c61",
10 | "name": "",
11 | "namespace": "",
12 | "location": "https://raw.githubusercontent.com/lgkahn/hubitat/master/sprucecontrollerdevice.groovy",
13 | "required": true
14 | }
15 | ],
16 | "apps": [
17 | {
18 | "id": "2382e06a-f5e7-4f15-96cb-23be3f91b981",
19 | "name": "Spruce Smart Zone",
20 | "namespace": "plaidsystems",
21 | "location": "https://raw.githubusercontent.com/lgkahn/hubitat/master/sprucesmartapp.groovy",
22 | "required": true,
23 | "oauth": true,
24 | "primary": false
25 | }
26 | ]
27 | }
--------------------------------------------------------------------------------
/Tesla.json:
--------------------------------------------------------------------------------
1 | {
2 | "packageName": "Tesla Connect app and drvier",
3 | "author": "Larry Kahn",
4 | "version": "1.8",
5 | "minimumHEVersion": "1.0.0",
6 | "dateReleased": "2020-10-19",
7 | "drivers": [
8 | {
9 | "id": "b06f7e9e-0c0a-4aef-adbd-f491fc4934e3",
10 | "name": "Tesla",
11 | "namespace": "trentfoley",
12 | "location": "https://raw.githubusercontent.com/lgkahn/hubitat/master/tesladriver.groovy",
13 | "required": true
14 | }
15 | ],
16 | "apps": [
17 | {
18 | "id": "b9aed348-87e2-41e6-b8b9-da6a84963ae8",
19 | "name": "Tesla Connect",
20 | "namespace": "trentfoley",
21 | "location": "https://raw.githubusercontent.com/lgkahn/hubitat/master/teslaconnect.groovy",
22 | "required": true,
23 | "oauth": true,
24 | "primary": false
25 | }
26 | ]
27 | }
28 |
--------------------------------------------------------------------------------
/TeslaV3.json:
--------------------------------------------------------------------------------
1 | {
2 | "packageName": "Tesla Connect V3 app and driver (Depracated) .. see tessie integraiton.",
3 | "author": "Larry Kahn",
4 | "version": "3.6",
5 | "minimumHEVersion": "2.3.0",
6 | "dateReleased": "2022-05-28",
7 | "drivers": [
8 | {
9 | "id": "c3a3166b-4488-4e95-85ac-2911ff4fa855",
10 | "name": "Tesla",
11 | "namespace": "trentfoley",
12 | "location": "https://raw.githubusercontent.com/lgkahn/hubitat/master/tesladriver.groovy",
13 | "required": true
14 | }
15 | ],
16 | "apps": [
17 | {
18 | "id": "3ad6d3af-0a1f-4186-8df4-c1abe329a507",
19 | "name": "Tesla Connect 3.0",
20 | "namespace": "trentfoley",
21 | "location": "https://raw.githubusercontent.com/lgkahn/hubitat/master/teslaconnectv3.groovy",
22 | "required": true,
23 | "oauth": false,
24 | "primary": false
25 | }
26 | ]
27 | }
28 |
--------------------------------------------------------------------------------
/TotalComfort.json:
--------------------------------------------------------------------------------
1 | {
2 | "packageName": "Total Comfort Old API",
3 | "author": "Larry Kahn",
4 | "version": "1.3.17",
5 | "minimumHEVersion": "1.2.3",
6 | "dateReleased": "2020-10-19",
7 | "apps": [
8 | {
9 | "id": "67ac9a79-6191-4f30-b40b-c0236a93c005",
10 | "name": "Total Comfort API C",
11 | "namespace": "Total Comfort API",
12 | "location": "https://raw.githubusercontent.com/lgkahn/hubitat/master/totalcomfortapic.groovy",
13 | "required": true,
14 | "oauth": false,
15 | "primary": false
16 | }
17 | ]
18 | }
19 |
--------------------------------------------------------------------------------
/WaterValve.json:
--------------------------------------------------------------------------------
1 | {
2 | "packageName": "Water Valve (evb105 and others) with switch and contact added",
3 | "author": "Larry Kahn",
4 | "version": "1.0",
5 | "minimumHEVersion": "1.0",
6 | "dateReleased": "2020-10-19",
7 | "drivers": [
8 | {
9 | "id": "e2769777-62c8-4bd5-8cfc-a9ee611871b4",
10 | "name": "Econet EBV105 Water Valve",
11 | "namespace": "lgkapps",
12 | "location": "https://raw.githubusercontent.com/lgkahn/hubitat/master/evb105watervalue.groovey",
13 | "required": true
14 | }
15 | ]
16 | }
--------------------------------------------------------------------------------
/ZW15SM.json:
--------------------------------------------------------------------------------
1 | {
2 | "packageName": "EnerWave ZW15sm power monitoring switch",
3 | "author": "Larry Kahn",
4 | "version": "1,0.0",
5 | "minimumHEVersion": "1.0.0",
6 | "dateReleased": "2020-10-19",
7 | "drivers": [
8 | {
9 | "id": "2e2606e9-8109-467b-b694-40c12920330d",
10 | "name": "Enerwave ZW15SM Metering Switch",
11 | "namespace": "smartthings",
12 | "location": "https://raw.githubusercontent.com/lgkahn/hubitat/master/zw15sm.groovey",
13 | "required": true
14 | }
15 | ]
16 | }
--------------------------------------------------------------------------------
/ZW189_Range_Extender_7_US_A_V1_02_OTA.gbl:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/lgkahn/hubitat/92d277962091904ab2a7bfd7e0ca3758976e63fe/ZW189_Range_Extender_7_US_A_V1_02_OTA.gbl
--------------------------------------------------------------------------------
/ZWavePCController_v5_39.zip:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/lgkahn/hubitat/92d277962091904ab2a7bfd7e0ca3758976e63fe/ZWavePCController_v5_39.zip
--------------------------------------------------------------------------------
/ZigbeeWhiteColorTemp.json:
--------------------------------------------------------------------------------
1 | {
2 | "packageName": "Zigbee white color temp bulb driver",
3 | "author": "Larry Kahn",
4 | "version": "1,0.0",
5 | "minimumHEVersion": "1.0.0",
6 | "dateReleased": "2020-10-19",
7 | "drivers": [
8 | {
9 | "id": "1c77e83c-6fa5-4bfa-8e27-36ac668146e1",
10 | "name": "ZigBee White Color Temperature Bulb - LGK Modified",
11 | "namespace": "smartthings",
12 | "location": "https://raw.githubusercontent.com/lgkahn/hubitat/master/zigbeewhitecolortemp.groovy",
13 | "required": true
14 | }
15 | ]
16 | }
--------------------------------------------------------------------------------
/alexattschild.groovy:
--------------------------------------------------------------------------------
1 | /**
2 | * Child Alexa TTS
3 | *
4 | * https://raw.githubusercontent.com/ogiewon/Hubitat/master/AlexaTTS/Drivers/child-alexa-tts.src/child-alexa-tts.groovy
5 | *
6 | * Copyright 2018 Daniel Ogorchock
7 | *
8 | * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except
9 | * in compliance with the License. You may obtain a copy of the License at:
10 | *
11 | * http://www.apache.org/licenses/LICENSE-2.0
12 | *
13 | * Unless required by applicable law or agreed to in writing, software distributed under the License is distributed
14 | * on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License
15 | * for the specific language governing permissions and limitations under the License.
16 | *
17 | * Change History:
18 | *
19 | * Date Who What
20 | * ---- --- ----
21 | * 2018-10-20 Dan Ogorchock Original Creation
22 | * 2018-11-18 Stephan Hackett Added support for Virtual Containers
23 | * 2020-07-29 nh.schottfam Remove characters from message text that may cause issues
24 | * 2020-09-25 lgk add volume
25 | * 2020-10-04 lgk add set volume as command so it can be called from rule machione.
26 | */
27 |
28 | attribute "currentVolume", "number"
29 | capability "Configuration"
30 |
31 | command "setVolume", [[name: "volumeLevel", type: "intteger", range: "1..100"]]
32 |
33 | metadata {
34 | definition (name: "Child Alexa TTS", namespace: "ogiewon", author: "Dan Ogorchock", importUrl: "https://raw.githubusercontent.com/ogiewon/Hubitat/master/AlexaTTS/Drivers/child-alexa-tts.src/child-alexa-tts.groovy") {
35 | capability "Speech Synthesis"
36 | }
37 | }
38 |
39 |
40 | preferences {
41 | input("volumeLevel", "integer", title: "Volume level for this device (0-99)?", range: "1…100", defaultValue: 75, required: true)
42 | }
43 |
44 | def configure()
45 | {
46 | }
47 |
48 | def updated()
49 |
50 | {
51 | log.debug "in updated current volume = $volumeLevel, prior volume = $state.currentVolume"
52 | if (state.currentVolume != volumeLevel)
53 | {
54 | log.debug "Resetting Volume"
55 | sendEvent(name: "currentVolume", value: volumeLevel)
56 | updateVolume()
57 | }
58 | }
59 |
60 | def updateVolume(newLevel)
61 | {
62 | log.debug "In update volume ... new level = $newLevel!"
63 |
64 | def name = device.deviceNetworkId.split("-")[-1]
65 | def vId = device.data.vcId
66 |
67 | if(vId) parent.childComm("setVolume", newLevel, vId)
68 | else parent.setVolume(newLevel.toInteger(), name)
69 |
70 | }
71 | def updateVolume()
72 | {
73 | updateVolume(volumeLevel)
74 | }
75 |
76 | def installed()
77 | {
78 | log.debug "in initialize"
79 | state.currentVolume = volumeLevel
80 | }
81 |
82 | def setVolume(level)
83 | {
84 | if (level)
85 | {
86 | log.debug "In setVolume command: new level = $level"
87 | sendEvent(name: "currentVolume", value: level)
88 | state.currentVolume = level
89 | updateVolume(level)
90 | }
91 | }
92 |
93 | def speak(message) {
94 | String nmsg = message.replaceAll(/(\r\n|\r|\n|\\r\\n|\\r|\\n)+/, " ")
95 | log.debug "Speaking message = '${nmsg}'"
96 | def name = device.deviceNetworkId.split("-")[-1]
97 | def vId = device.data.vcId
98 | if(vId) parent.childComm("speakMessage", nmsg.toString(), vId)
99 | else parent.speakMessage(nmsg.toString(), name)
100 | }
101 |
--------------------------------------------------------------------------------
/apc_hw05_aos712_sumx712_bootmon109.7z:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/lgkahn/hubitat/92d277962091904ab2a7bfd7e0ca3758976e63fe/apc_hw05_aos712_sumx712_bootmon109.7z
--------------------------------------------------------------------------------
/bad dash test driver:
--------------------------------------------------------------------------------
1 |
2 | metadata {
3 | definition (name: "badDashTest", namespace: "lgkahn", author: "Larry Kahn") {
4 | capability "Actuator"
5 | capability "Initialize"
6 |
7 |
8 | attribute "firmwareAlerts", "string"
9 |
10 |
11 | command "setAttr"
12 |
13 | }
14 |
15 |
16 | }
17 |
18 | import java.time.*;
19 | import java.time.LocalDateTime
20 | import java.time.format.DateTimeFormatter
21 |
22 | def initialize()
23 | {
24 | setAttr()
25 |
26 | }
27 |
28 |
29 | private setAttr()
30 | {
31 | log.debug "Processing Firmware Alert Data"
32 |
33 | def myresults = "
"
34 |
35 | def name1 = "APP_w207_autosteerUnavailable"
36 | def name2 = "UI_a002_DoorOpen"
37 | def name3 = "DI_a172_accelPressedInNP"
38 |
39 | def time1 = "05/24/2025 6:40 PM"
40 | def time2 = "05/24/2025 6:39 PM"
41 | def time3 = "05/23/2025 11:45 AM"
42 |
43 | def desc1 = "An attempt is made to engage Autosteer, but Autosteer is not available. Autosteer will not be activated."
44 | def desc2 = "The passenger or rear door(s) (except for Model X Falcon door(s)) is detected as open when the vehicle is shifted into a gear other than Park, which may lead to the passenger or rear door(s) being open while driving."
45 | def desc3 = "The drive interface (DI) electronic control unit (ECU) detects that the accelerator was pressed while the vehicle is in Park or Neutral."
46 |
47 | def impact1 = "Autosteer will not be activated."
48 | def impact2 = "The passenger or rear door(s) may open while driving."
49 | def impact3 = "The DI ECU does not provide any torque, and displays user-facing message."
50 |
51 | def cond1 = "Attempt is made to engage Autosteer when the feature is not available."
52 | def cond2 = "The passenger or rear door(s) is detected as open when the vehicle is shifted into the Drive, Reverse, or Neutral gears."
53 | def cond3 = "The DI ECU detects that the accelerator pedal was pressed while the vehicle is in Park or Neutral."
54 |
55 |
56 | def hoverstr1 = "Condition: $cond1, Description: $desc1, Impact: $impact1"
57 | def hoverstr2 = "Condition: $cond2, Description: $desc2, Impact: $impact2"
58 | def hoverstr3 = "Condition: $cond3, Description: $desc3, Impact: $impact3"
59 |
60 | myresults = myresults + "${name1} | ${time1} |
"
61 | myresults = myresults + "${name2} | ${time2} |
"
62 | myresults = myresults + "${name3} | ${time3} |
"
63 |
64 | myresults = myresults + "
"
65 | sendEvent(name: "firmwareAlerts", value: myresults)
66 | }
67 |
--------------------------------------------------------------------------------
/baddash:
--------------------------------------------------------------------------------
1 |
2 | metadata {
3 | definition (name: "badDashTest", namespace: "lgkahn", author: "Larry Kahn") {
4 | capability "Actuator"
5 | capability "Initialize"
6 |
7 |
8 | attribute "firmwareAlerts", "string"
9 |
10 |
11 | command "setAttr"
12 |
13 | }
14 |
15 |
16 | }
17 |
18 | import java.time.*;
19 | import java.time.LocalDateTime
20 | import java.time.format.DateTimeFormatter
21 |
22 | def initialize()
23 | {
24 | setAttr()
25 |
26 | }
27 |
28 |
29 | private setAttr()
30 | {
31 | log.debug "Processing Firmware Alert Data"
32 |
33 | def myresults = ""
34 |
35 | def name1 = "APP_w207_autosteerUnavailable"
36 | def name2 = "UI_a002_DoorOpen"
37 | def name3 = "DI_a172_accelPressedInNP"
38 |
39 | def time1 = "05/24/2025 6:40 PM"
40 | def time2 = "05/24/2025 6:39 PM"
41 | def time3 = "05/23/2025 11:45 AM"
42 |
43 | def desc1 = "An attempt is made to engage Autosteer, but Autosteer is not available. Autosteer will not be activated."
44 | def desc2 = "The passenger or rear door(s) (except for Model X Falcon door(s)) is detected as open when the vehicle is shifted into a gear other than Park, which may lead to the passenger or rear door(s) being open while driving."
45 | def desc3 = "The drive interface (DI) electronic control unit (ECU) detects that the accelerator was pressed while the vehicle is in Park or Neutral."
46 |
47 | def impact1 = "Autosteer will not be activated."
48 | def impact2 = "The passenger or rear door(s) may open while driving."
49 | def impact3 = "The DI ECU does not provide any torque, and displays user-facing message."
50 |
51 | def cond1 = "Attempt is made to engage Autosteer when the feature is not available."
52 | def cond2 = "The passenger or rear door(s) is detected as open when the vehicle is shifted into the Drive, Reverse, or Neutral gears."
53 | def cond3 = "The DI ECU detects that the accelerator pedal was pressed while the vehicle is in Park or Neutral."
54 |
55 |
56 | def hoverstr1 = "Condition: $cond1, Description: $desc1, Impact: $impact1"
57 | def hoverstr2 = "Condition: $cond2, Description: $desc2, Impact: $impact2"
58 | def hoverstr3 = "Condition: $cond3, Description: $desc3, Impact: $impact3"
59 |
60 | myresults = myresults + "${name1} | ${time1} |
"
61 | myresults = myresults + "${name2} | ${time2} |
"
62 | myresults = myresults + "${name3} | ${time3} |
"
63 |
64 | myresults = myresults + "
"
65 | sendEvent(name: "firmwareAlerts", value: myresults)
66 | }
67 |
--------------------------------------------------------------------------------
/colorcoordinator.groovy:
--------------------------------------------------------------------------------
1 | /**
2 | * Color Coordinator
3 | * Version 1.0.0 - 7/4/15
4 | * By Michael Struck
5 | *
6 | * 1.0.0 - Initial release
7 | *
8 | *
9 | * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except
10 | * in compliance with the License. You may obtain a copy of the License at:
11 | *
12 | * http://www.apache.org/licenses/LICENSE-2.0
13 | *
14 | * Unless required by applicable law or agreed to in writing, software distributed under the License is distributed
15 | * on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License
16 | * for the specific language governing permissions and limitations under the License.
17 | * 2020 lgk port to hubitat
18 | */
19 | definition(
20 | name: "Color Coordinator",
21 | namespace: "MichaelStruck",
22 | author: "Michael Struck",
23 | description: "Ties multiple colored lights to one specific light's settings",
24 | category: "Convenience",
25 | iconUrl: "https://raw.githubusercontent.com/MichaelStruck/SmartThings/master/Other-SmartApps/ColorCoordinator/CC.png",
26 | iconX2Url: "https://raw.githubusercontent.com/MichaelStruck/SmartThings/master/Other-SmartApps/ColorCoordinator/CC@2x.png"
27 | )
28 |
29 | preferences {
30 | page name: "mainPage"
31 | }
32 |
33 | def mainPage() {
34 | dynamicPage(name: "mainPage", title: "", install: true, uninstall: true) {
35 | section("Master Light") {
36 | input "master", "capability.colorControl", title: "Colored Light"
37 | }
38 | section("Lights that follow the master settings") {
39 | input "slaves", "capability.colorControl", title: "Colored Lights", multiple: true, required: false
40 | }
41 | section([mobileOnly:true], "Options") {
42 | label(title: "Assign a name", required: false)
43 | href "pageAbout", title: "About ${textAppName()}", description: "Tap to get application version, license and instructions"
44 | }
45 | }
46 | }
47 |
48 | page(name: "pageAbout", title: "About ${textAppName()}") {
49 | section {
50 | paragraph "${textVersion()}\n${textCopyright()}\n\n${textLicense()}\n"
51 | }
52 | section("Instructions") {
53 | paragraph textHelp()
54 | }
55 | }
56 |
57 | def installed() {
58 | init()
59 | }
60 |
61 | def updated(){
62 | unsubscribe()
63 | init()
64 | }
65 |
66 | def init() {
67 | subscribe(master, "switch", onOffHandler)
68 | subscribe(master, "level", colorHandler)
69 | subscribe(master, "hue", colorHandler)
70 | subscribe(master, "saturation", colorHandler)
71 | subscribe(master, "colorTemperature", tempHandler)
72 | }
73 | //-----------------------------------
74 | def onOffHandler(evt){
75 | if (master.currentValue("switch") == "on"){
76 | slaves?.on()
77 | }
78 | else {
79 | slaves?.off()
80 | }
81 | }
82 |
83 | def colorHandler(evt) {
84 | def dimLevel = master.currentValue("level")
85 | def hueLevel = master.currentValue("hue")
86 | def saturationLevel = master.currentValue("saturation")
87 | def newValue = [hue: hueLevel, saturation: saturationLevel, level: dimLevel as Integer]
88 | slaves?.setColor(newValue)
89 | }
90 |
91 | def tempHandler(evt){
92 | if (evt.value != "--") {
93 | def tempLevel = master.currentValue("colorTemperature")
94 | slaves?.setColorTemperature(tempLevel)
95 | }
96 | }
97 |
98 | //Version/Copyright/Information/Help
99 |
100 | private def textAppName() {
101 | def text = "Color Coordinator"
102 | }
103 |
104 | private def textVersion() {
105 | def text = "Version 1.0.0 (07/04/2015)"
106 | }
107 |
108 | private def textCopyright() {
109 | def text = "Copyright © 2015 Michael Struck"
110 | }
111 |
112 | private def textLicense() {
113 | def text =
114 | "Licensed under the Apache License, Version 2.0 (the 'License'); "+
115 | "you may not use this file except in compliance with the License. "+
116 | "You may obtain a copy of the License at"+
117 | "\n\n"+
118 | " http://www.apache.org/licenses/LICENSE-2.0"+
119 | "\n\n"+
120 | "Unless required by applicable law or agreed to in writing, software "+
121 | "distributed under the License is distributed on an 'AS IS' BASIS, "+
122 | "WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. "+
123 | "See the License for the specific language governing permissions and "+
124 | "limitations under the License."
125 | }
126 |
127 | private def textHelp() {
128 | def text =
129 | "This application will allow you to control the settings of multiple colored lights with one control. " +
130 | "Simply choose a master control light, and then choose the lights that will follow the settings of the master, "+
131 | "including on/off conditions, hue, saturation, level and color temperature."
132 | }
133 |
--------------------------------------------------------------------------------
/darksky.groovy:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/lgkahn/hubitat/92d277962091904ab2a7bfd7e0ca3758976e63fe/darksky.groovy
--------------------------------------------------------------------------------
/dimwithme.groovy:
--------------------------------------------------------------------------------
1 | /**
2 | * dim-with-me.app.groovy
3 | * Dim With Me
4 | *
5 | * Author: todd@wackford.net
6 | * Date: 2013-11-12
7 | */
8 | /**
9 | * App Name: Dim With Me
10 | * lgk 2020 port to hubitat
11 | * Author: Todd Wackford
12 | * twack@wackware.net
13 | * Date: 2013-11-12
14 | * Version: 0.2
15 | *
16 | * Use this program with a virtual dimmer as the master for best results.
17 | *
18 | * This app lets the user select from a list of dimmers to act as a triggering
19 | * master for other dimmers or regular switches. Regular switches come on
20 | * anytime the master dimmer is on or dimmer level is set to more than 0%.
21 | * of the master dimmer.
22 | *
23 | ******************************************************************************
24 | * Changes
25 | ******************************************************************************
26 | *
27 | * Change 1: 2014-10-22 (wackford)
28 | * Fixed bug in setlevelwhen on/off was coming in
29 | *
30 | * Change 2: 2014-11-01 (wackford)
31 | * added subscription to switch.level event. Shouldn't change much
32 | * but some devices only sending level event and not setLevel.
33 | *
34 | ******************************************************************************
35 |
36 | Other Info: Special thanks to Danny Kleinman at ST for helping me get the
37 | state stuff figured out. The Android state filtering had me
38 | stumped.
39 | *
40 | ******************************************************************************
41 | */
42 |
43 |
44 | // Automatically generated. Make future change here.
45 | definition(
46 | name: "Dim With Me",
47 | namespace: "wackware",
48 | author: "todd@wackford.net",
49 | description: "Follows the dimmer level of another dimmer",
50 | category: "My Apps",
51 | iconUrl: "https://s3.amazonaws.com/smartapp-icons/Convenience/Cat-Convenience.png",
52 | iconX2Url: "https://s3.amazonaws.com/smartapp-icons/Convenience/Cat-Convenience%402x.png"
53 | )
54 |
55 | preferences {
56 | section("When this...") {
57 | input "masters", "capability.switchLevel",
58 | multiple: false,
59 | title: "Master Dimmer Switch...",
60 | required: true
61 | }
62 |
63 | section("Then these will follow with on/off...") {
64 | input "slaves2", "capability.switch",
65 | multiple: true,
66 | title: "Slave On/Off Switch(es)...",
67 | required: false
68 | }
69 |
70 | section("And these will follow with dimming level...") {
71 | input "slaves", "capability.switchLevel",
72 | multiple: true,
73 | title: "Slave Dimmer Switch(es)...",
74 | required: true
75 | }
76 | }
77 |
78 | def installed()
79 | {
80 | subscribe(masters, "switch.on", switchOnHandler)
81 | subscribe(masters, "switch.off", switchOffHandler)
82 | subscribe(masters, "switch.setLevel", switchSetLevelHandler)
83 | subscribe(masters, "switch", switchSetLevelHandler)
84 | }
85 |
86 | def updated()
87 | {
88 | unsubscribe()
89 | subscribe(masters, "switch.on", switchOnHandler)
90 | subscribe(masters, "switch.off", switchOffHandler)
91 | subscribe(masters, "switch.setLevel", switchSetLevelHandler)
92 | subscribe(masters, "switch", switchSetLevelHandler)
93 | log.info "subscribed to all of switches events"
94 | }
95 |
96 | def switchSetLevelHandler(evt)
97 | {
98 |
99 | if ((evt.value == "on") || (evt.value == "off" ))
100 | return
101 | def level = evt.value.toFloat()
102 | level = level.toInteger()
103 | log.info "switchSetLevelHandler Event: ${level}"
104 | slaves?.setLevel(level)
105 | }
106 |
107 | def switchOffHandler(evt) {
108 | log.info "switchoffHandler Event: ${evt.value}"
109 | slaves?.off()
110 | slaves2?.off()
111 | }
112 |
113 | def switchOnHandler(evt) {
114 | log.info "switchOnHandler Event: ${evt.value}"
115 | def dimmerValue = masters.latestValue("level") //can be turned on by setting the level
116 | slaves?.on()
117 | slaves2?.on()
118 | }
119 |
--------------------------------------------------------------------------------
/evb105watervalue.groovey:
--------------------------------------------------------------------------------
1 | /**
2 | * Copyright 2015 lgkahn v2.0
3 | *
4 | * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except
5 | * in compliance with the License. You may obtain a copy of the License at:
6 | *
7 | * http://www.apache.org/licenses/LICENSE-2.0
8 | *
9 | * Unless required by applicable law or agreed to in writing, software distributed under the License is distributed
10 | * on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License
11 | * for the specific language governing permissions and limitations under the License.
12 | *
13 | * Econet ebv105 water valve .. as modified from standard smartthings switch device type.
14 | * under door control instead of switches as the states more closely match a valve..
15 | * so for smartapps youd use doors to close and open , also needs valve capability so it can
16 | * be selected and closed from smart home monitor, and finally needs contact sensor capability
17 | * which other drivers were lacking so you can check state and do your own alerts from
18 | * notify me when smart app. Also correct signature to map to eBV105
19 | * tested by me for both notify when app, and also leak detection shut-off in smart home monitor.
20 | *
21 | * also I looked at Sidney Johnsons device type, so I also give him credit.
22 | * v2 noticed there is a light on the valve, so added capability indicator back to allow
23 | * you to set it on either when valve open or closed.
24 | * v2 added switch capability and alias so it can be controlled for ifttt and amazon echo etc.
25 |
26 | */
27 | metadata {
28 | definition (name: "Econet EBV105 Water Valve", namespace: "lgkapps", author: "lgkahn") {
29 | capability "Actuator"
30 | capability "Polling"
31 | capability "Refresh"
32 | capability "Sensor"
33 | capability "Door Control"
34 | capability "Contact Sensor"
35 | capability "Valve"
36 | capability "Indicator"
37 | capability "Switch"
38 |
39 |
40 | }
41 |
42 | // simulator metadata
43 | simulator {
44 | status "open": "command: 2003, payload: FF"
45 | status "closed": "command: 2003, payload: 00"
46 |
47 | // reply messages
48 | reply "2001FF,delay 100,2502": "command: 2503, payload: FF"
49 | reply "200100,delay 100,2502": "command: 2503, payload: 00"
50 | }
51 |
52 | fingerprint deviceId: "0x1001", inClusters: "0x5E 0x86 0x72 0x73 0x85 0x59 0x25 0x20 0x27 0x70"
53 |
54 | // tile definitions
55 |
56 | tiles {
57 | standardTile("contact", "device.contact", width: 3, height: 3, canChangeIcon: true) {
58 | state "open", label: '${name}', action: "door control.close", icon: "st.valves.water.open", backgroundColor: "#00cccc", nextState:"closing"
59 | state "closed", label: '${name}', action: "door control.open", icon: "st.valves.water.closed", backgroundColor: "#cc0000", nextState:"opening"
60 | state "opening", label: '${name}', action: "door control.close", icon: "st.valves.water.open", backgroundColor: "#53a730"
61 | state "closing", label: '${name}', action: "door control.open", icon: "st.valves.water.closed", backgroundColor: "#cccc00"
62 | }
63 |
64 | standardTile("valve", "device.valve", width: 1, height: 1, canChangeIcon: true) {
65 | state "open", label: '${name}', icon: "st.valves.water.open", backgroundColor: "#00cccc"
66 | state "closed", label: '${name}', icon: "st.valves.water.closed", backgroundColor: "#cc0000"
67 | }
68 |
69 | /*
70 | // tile definitions
71 | tiles(scale: 2) {
72 | multiAttributeTile(name:"contact", type: "generic", width: 6, height: 4, canChangeIcon: true){
73 | tileAttribute ("device.contact", key: "PRIMARY_CONTROL") {
74 | attributeState "open", label: '${name}', action: "valve.close", icon: "st.valves.water.open", backgroundColor: "#79b821", nextState: closing
75 | attributeState "opening", label: '${name}', action: "valve.close", icon: "st.valves.water.open", backgroundColor: "#79b821"
76 | attributeState "closing", label: '${name}', action: "valve.open", icon: "st.valves.water.closed", backgroundColor: "#ffffff"
77 | attributeState "closed", label: '${name}', action: "valve.open", icon: "st.valves.water.closed", backgroundColor: "#cc0000", nextState: ppening
78 | }
79 | }
80 | */
81 | standardTile("indicator", "device.indicatorStatus", width: 1, height: 1, inactiveLabel: false, decoration: "flat") {
82 | state "when on", action:"indicator.indicatorWhenOn", icon:"st.indicators.lit-when-off"
83 | state "when off", action:"indicator.indicatorNever", icon:"st.indicators.lit-when-on"
84 | state "never", action:"indicator.indicatorWhenOff", icon:"st.indicators.never-lit"
85 | }
86 |
87 |
88 | standardTile("refresh", "device.switch", width: 1, height: 1, inactiveLabel: false, decoration: "flat") {
89 | state "default", label:'', action:"refresh.refresh", icon:"st.secondary.refresh"
90 | }
91 |
92 | main "contact"
93 | details(["contact","refresh"])
94 | }
95 | }
96 |
97 | def parse(String description) {
98 | //log.debug "in parse desc = $description"
99 | def result = null
100 | def cmd = zwave.parse(description)
101 | if (cmd) {
102 | result = createEvent(zwaveEvent(cmd))
103 | }
104 | else {
105 | log.debug "Parse returned ${result?.descriptionText}"
106 | }
107 | return result
108 | }
109 |
110 | //def zwaveEvent(physicalgraph.zwave.commands.switchbinaryv1.SwitchBinaryReport cmd) {
111 | def zwaveEvent(hubitat.zwave.commands.switchbinaryv1.SwitchBinaryReport cmd) {
112 | //log.debug "in binary report cmd = $cmd"
113 | if (cmd.value == 0)
114 | {
115 | log.debug "sending closed"
116 | sendEvent(name: "contact", value: "closed")
117 | sendEvent(name: "door", value: "closed")
118 | sendEvent(name: "valve", value: "closed")
119 | sendEvent(name: "switch", value: "off")
120 | }
121 | else {
122 | log.debug "sending open"
123 | sendEvent(name: "contact", value: "open")
124 | sendEvent(name: "door", value: "open")
125 | sendEvent(name: "valve", value: "open")
126 | sendEvent(name: "switch", value: "on")
127 | }
128 | }
129 |
130 |
131 | //def zwaveEvent(physicalgraph.zwave.commands.configurationv1.ConfigurationReport cmd) {
132 | def zwaveEvent(hubitat.zwave.commands.configurationv1.ConfigurationReport cmd) {
133 | def value = "when off"
134 | if (cmd.configurationValue[0] == 1) {value = "when on"}
135 | if (cmd.configurationValue[0] == 2) {value = "never"}
136 | [name: "indicatorStatus", value: value, display: false]
137 | }
138 |
139 |
140 | //def zwaveEvent(physicalgraph.zwave.commands.manufacturerspecificv2.ManufacturerSpecificReport cmd) {
141 | def zwaveEvent(hubitat.zwave.commands.manufacturerspecificv2.ManufacturerSpecificReport cmd) {
142 | if (state.manufacturer != cmd.manufacturerName) {
143 | updateDataValue("manufacturer", cmd.manufacturerName)
144 | }
145 | }
146 |
147 | //def zwaveEvent(physicalgraph.zwave.Command cmd) {
148 | def zwaveEvent(hubitat.zwave.Command cmd) {
149 | // Handles all Z-Wave commands we aren't interested in
150 | [:]
151 | }
152 |
153 | def on()
154 | {
155 | open()
156 | }
157 |
158 | def off()
159 | {
160 | close()
161 | }
162 |
163 | def open() {
164 | //log.debug "in open"
165 | delayBetween([
166 | zwave.basicV1.basicSet(value: 0xFF).format(),
167 | zwave.switchBinaryV1.switchBinaryGet().format()
168 | ], 6000)
169 |
170 | }
171 |
172 | def close() {
173 | //log.debug "in close"
174 |
175 | delayBetween([
176 | zwave.basicV1.basicSet(value: 0x00).format(),
177 | zwave.switchBinaryV1.switchBinaryGet().format()
178 | ], 6000)
179 |
180 | }
181 |
182 | def poll() {
183 | delayBetween([
184 | zwave.switchBinaryV1.switchBinaryGet().format(),
185 | zwave.manufacturerSpecificV1.manufacturerSpecificGet().format()
186 | ])
187 | }
188 |
189 | def refresh() {
190 | delayBetween([
191 | zwave.switchBinaryV1.switchBinaryGet().format(),
192 | zwave.manufacturerSpecificV1.manufacturerSpecificGet().format()
193 | ])
194 | }
195 |
196 |
197 | def indicatorWhenOn() {
198 | sendEvent(name: "indicatorStatus", value: "when open", display: false)
199 | zwave.configurationV1.configurationSet(configurationValue: [1], parameterNumber: 3, size: 1).format()
200 | }
201 |
202 | def indicatorWhenOff() {
203 | log.debug "in when off"
204 | sendEvent(name: "indicatorStatus", value: "when closed", display: false)
205 | zwave.configurationV1.configurationSet(configurationValue: [0], parameterNumber: 3, size: 1).format()
206 | }
207 |
208 | def indicatorNever() {
209 | sendEvent(name: "indicatorStatus", value: "never", display: false)
210 | zwave.configurationV1.configurationSet(configurationValue: [2], parameterNumber: 3, size: 1).format()
211 | }
212 |
--------------------------------------------------------------------------------
/googleiframe.groovy:
--------------------------------------------------------------------------------
1 | /**
2 | * dashboard Google Map iFrame
3 | *
4 | *
5 | * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except
6 | * in compliance with the License. You may obtain a copy of the License at:
7 | *
8 | * http://www.apache.org/licenses/LICENSE-2.0
9 | *
10 | * Unless required by applicable law or agreed to in writing, software distributed under the License is distributed
11 | * on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License
12 | * for the specific language governing permissions and limitations under the License.
13 | *
14 | * Special thanks goes to mbarone who created the original iFrame driver that the majority of this driver code as leveraged.
15 | * The original iframe code this driver is based on is available at https://raw.githubusercontent.com/michaelbarone/hubitat/master/drivers/iFrame.groovy
16 | *
17 | * This main purpose of this driver is to be able to create Hubitat rules that read the Latitude and Longitude attributes from other drivers and load into this driver so that
18 | * a Google Map can be displayed where the device is located.
19 | *
20 | *
21 | * Directions:
22 | * 1 Create a virtual device with this driver.
23 | * 2 Enter in the latitude and longitude coorindates for the Map you want to embed and/or create a Hubitat Rule to auotmatically update the latitude
24 | * and longitude commands each time some othe device attributes change
25 | * 3 add this device to your dashboard, select the attribute and choose the "iFrame" attribute
26 | *
27 | * optional:
28 | * 4 update the css to style the iframe tile on the dashboard:
29 | *
30 | * // replace '#tile-33' with this driver/device on your dashboard
31 | *
32 | * #tile-33 .tile-title {
33 | * display:none;
34 | * }
35 | *
36 | * #tile-33 .tile-contents, #tile-33 .tile-primary{
37 | * padding: 0;
38 | * height:100%;
39 | * }
40 | *
41 | *
42 | *
43 | *
44 | *
45 | * Change History:
46 | *
47 | * Date Who What
48 | * ---- --- ----
49 | * 6-19-22 gomce62 initial release
50 | *
51 | */
52 |
53 |
54 | preferences {
55 | input name: "txtEnable", type: "bool", title: "Enable descriptionText logging", defaultValue: true
56 |
57 | }
58 | metadata {
59 | definition (name: "Google Map iFrame", namespace: "gomce62", author: "gomce62", importUrl: "https://raw.githubusercontent.com/gomce62/Hubitat/Drivers/Google_Map_iFrame.groovy") {
60 | capability "Actuator"
61 | command "SetLatitudeLongitude", ["number","number"]
62 | command "setLatitude", ["number"]
63 | command "setLongitude", ["number"]
64 | command "updateFrame"
65 |
66 | attribute "iFrame", "text"
67 | attribute "longitude", "number"
68 | attribute "latitude", "number"
69 |
70 | }
71 | }
72 |
73 |
74 | def installed() {
75 | log.warn "installed..."
76 | sendEvent(name: "iFrame", value: "")
77 | }
78 |
79 | def setLatitude(lat)
80 | {
81 | sendEvent(name: "latitude", value:lat)
82 | }
83 |
84 | def setLongitude(lon)
85 | {
86 | sendEvent(name: "longitude", value:lon)
87 | }
88 |
89 | def SetLatitudeLongitude(lat,lon) {
90 | def descriptionText = "${device.displayName} was set to $lat $lon"
91 | if (txtEnable) log.info "${descriptionText}"
92 | sendEvent(name: "longitude", value:lon)
93 | sendEvent(name: "latitude", value:lat)
94 | sendEvent(name: "iFrame", value: "
")
95 |
96 | }
97 |
98 | def updateFrame() {
99 |
100 | def lon = device.currentValue('longitude')
101 | def lat = device.currentValue('latitude')
102 |
103 | if (lon == null) lon = 0.0
104 | if (lat == null) lat = 0.0
105 |
106 | log.debug "current long = $lon"
107 | log.debug "current lat = $lat"
108 |
109 | sendEvent(name: "iFrame", value: "
")
110 |
111 | }
112 |
--------------------------------------------------------------------------------
/honeywellhomedriver:
--------------------------------------------------------------------------------
1 | /*
2 | Hubitat Driver For Honeywell Thermistat
3 |
4 | Copyright 2020 - Taylor Brown
5 |
6 | Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
7 |
8 | The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
9 |
10 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
11 |
12 | Major Releases:
13 | 11-25-2020 : Initial
14 | 11-27-2020 : Alpha Release (0.1)
15 | 12-15-2020 : Beta 1 Release (0.2.0)
16 | lgk 12-24-2020 add lastUpdated and humidity
17 | lgk 10/24 new attributes
18 |
19 | */
20 | import groovy.json.JsonSlurper
21 | import groovy.json.JsonOutput
22 |
23 | metadata {
24 | definition (
25 | name: "Honeywell Home Thermostat",
26 | description:"Driver for Lyric (LCC) and T series (TCC) Honeywell Thermostats, Requires corisponding Honeywell Home App.",
27 | importUrl:"https://raw.githubusercontent.com/thecloudtaylor/hubitat-honeywell/main/honeywellhomedriver.groovy",
28 | namespace: "thecloudtaylor",
29 | author: "Taylor Brown") {
30 | capability "Actuator"
31 | capability "Temperature Measurement"
32 | capability "Relative Humidity Measurement"
33 | capability "Thermostat"
34 | capability "Refresh"
35 |
36 | //Maybe?
37 | capability "Sensor"
38 | attribute "thermostatFanState", "enum", ["true", "false"]
39 |
40 | // lgk new attributes
41 | attribute "fanOperatingState", "enum", ["on", "off"]
42 | attribute "macID", "String"
43 | attribute "maxCoolSetPoint", "Number"
44 | attribute "minCoolSetPoint", "Number"
45 | attribute "maxHeatSetPoint", "Number"
46 | attribute "minHeatSetPoint", "Number"
47 | attribute "vacationHold", "enum", ["true", "false"]
48 | attribute "deviceName", "String"
49 | attribute "isAlive", "enum", ["true", "false"]
50 | attribute "model", "String"
51 | // lgk end new attributes
52 |
53 | attribute "emergencyHeatActive", "enum", [null, "true", "false"]
54 | attribute "autoChangeoverActive", "enum", ["unsupported", "true", "false"]
55 | attribute "allowedModes", "enum", ["EmergencyHeat", "Heat", "Off", "Cool","Auto"]
56 | attribute "units", "enum", ["F", "C"]
57 | attribute "lastUpdate", "string"
58 | attribute "hourlyRuntimePercentage", "Number"
59 | attribute "lastDayPercentage", "Number"
60 | attribute "lastMonthPercentage", "Number"
61 | attribute "monthStats", "String"
62 | attribute "yearStats", "String"
63 |
64 | }
65 | preferences{
66 | input ("heatModeEnabled", "bool",
67 | title: "Allow Heat Mode, if false heat mode will be iqnored",
68 | defaultValue:true)
69 | input ("coolModeEnabled", "bool",
70 | title: "Allow Cool Mode, if false heat mode will be iqnored",
71 | defaultValue:true)
72 | input ("debugLogs", "bool",
73 | title: "Enable debug logging",
74 | defaultValue: false)
75 | input ("descriptionText", "bool",
76 | title: "Enable description text logging",
77 | defaultValue: true)
78 | }
79 | }
80 |
81 | void LogDebug(logMessage)
82 | {
83 | if(debugLogs)
84 | {
85 | log.debug "${device.displayName} ${logMessage}";
86 | }
87 | }
88 |
89 | void LogInfo(logMessage)
90 | {
91 | log.info "${device.displayName} ${logMessage}";
92 | }
93 |
94 | void LogWarn(logMessage)
95 | {
96 | log.warn "${device.displayName} ${logMessage}";
97 | }
98 |
99 | void disableDebugLog()
100 | {
101 | LogWarn("Disabling Debug Logging.");
102 | device.updateSetting("debugLogs",[value:"false",type:"bool"]);
103 | }
104 |
105 | void installed()
106 | {
107 | LogInfo("Installing.");
108 | heatModeEnabled = true
109 | coolModeEnabled = true
110 | debugLogs = false
111 | descriptionText = true
112 | refresh()
113 | }
114 |
115 | void uninstalled()
116 | {
117 | LogInfo("Uninstalling.");
118 | }
119 |
120 | void updated()
121 | {
122 | LogInfo("Updating.");
123 | refresh()
124 | }
125 |
126 | void parse(String message)
127 | {
128 | LogDebug("ParseCalled: ${message}");
129 | }
130 |
131 | void auto()
132 | {
133 | LogDebug("auto called");
134 |
135 | if(device.currentValue("allowedModes").contains("Auto"))
136 | {
137 | setThermostatMode("auto")
138 | }
139 | else
140 | {
141 | LogWarn("Auto not in the supported modes.")
142 | }
143 | }
144 |
145 | void cool()
146 | {
147 | LogDebug("cool called");
148 |
149 | setThermostatMode("cool")
150 | }
151 |
152 | void emergencyHeat()
153 | {
154 | LogDebug("emergencyHeat called");
155 |
156 | LogWarn("EmergancyHeat Not Supported")
157 |
158 | }
159 |
160 | void fanAuto()
161 | {
162 | LogDebug("fanAuto called");
163 | setThermostatFanMode("auto")
164 | }
165 |
166 | void fanCirculate()
167 | {
168 | LogDebug("fanCirculate called");
169 | setThermostatFanMode("circulate")
170 | }
171 |
172 | void fanOn()
173 | {
174 | LogDebug("fanOn called");
175 | setThermostatFanMode("on")
176 | }
177 |
178 | void heat()
179 | {
180 | LogDebug("heat called");
181 |
182 | setThermostatMode("heat")
183 | }
184 |
185 | void off()
186 | {
187 | LogDebug("off called");
188 |
189 | setThermostatMode("off")
190 | }
191 |
192 | //Defined Command : temperature required (NUMBER) - Cooling setpoint in degrees
193 | void setCoolingSetpoint(temperature)
194 | {
195 | LogDebug("setCoolingSetpoint() - autoChangeoverActive: ${device.currentValue("autoChangeoverActive")}");
196 |
197 | //setThermosatSetPoint(com.hubitat.app.DeviceWrapper device, mode=null, autoChangeoverActive=false, heatPoint=null, coolPoint=null)
198 | if (!parent.setThermosatSetPoint(device, null, device.currentValue("autoChangeoverActive"), device.currentValue("emergencyHeatActive"), null, temperature))
199 | {
200 | LogWarn("Set cooling point failed, attempting a refresh and re-try.")
201 | parent.refreshThermosat(device)
202 | parent.setThermosatSetPoint(device, null, device.currentValue("autoChangeoverActive"), device.currentValue("emergencyHeatActive"), null, temperature)
203 | }
204 | else
205 | {
206 | LogInfo("Cooling setpoint changed to ${temperature}")
207 | }
208 | }
209 |
210 | //Defined Command : temperature required (NUMBER) - Heating setpoint in degrees
211 | void setHeatingSetpoint(temperature)
212 | {
213 | LogDebug("setHeatingSetpoint() - autoChangeoverActive: ${device.currentValue("autoChangeoverActive")}");
214 |
215 | //setThermosatSetPoint(com.hubitat.app.DeviceWrapper device, mode=null, autoChangeoverActive=false, heatPoint=null, coolPoint=null)
216 | if (!parent.setThermosatSetPoint(device, null, device.currentValue("autoChangeoverActive"), device.currentValue("emergencyHeatActive"), temperature, null))
217 | {
218 | LogWarn("Set heating point failed, attempting a refresh and re-try.")
219 | parent.refreshThermosat(device)
220 | parent.setThermosatSetPoint(device, null, device.currentValue("autoChangeoverActive"), device.currentValue("emergencyHeatActive"), temperature, null)
221 | }
222 | else
223 | {
224 | LogInfo("Heating setpoint changed to ${temperature}")
225 | }
226 | }
227 |
228 | //Defined Command : JSON_OBJECT (JSON_OBJECT) - JSON_OBJECT
229 | void setSchedule(JSON_OBJECT)
230 | {
231 | LogDebug("setSchedule called");
232 | }
233 |
234 | //Defined Command : fanmode required (ENUM) - Fan mode to set
235 | void setThermostatFanMode(fanmode)
236 | {
237 | LogDebug("setThermostatFanMode called");
238 |
239 | if(device.currentValue("supportedThermostatFanModes").contains(fanmode))
240 | {
241 | if(!parent.setThermosatFan(device, fanmode))
242 | {
243 | LogWarn("Set fan mode failed, attempting a refresh and re-try.")
244 | parent.refreshThermosat(device)
245 | parent.setThermosatFan(device, fanmode);
246 | }
247 | else
248 | {
249 | LogInfo("Fan Mode Chanaged to: ${fanmode}")
250 | }
251 | }
252 | else
253 | {
254 | LogWarn("${fanmode} not in the supported fan modes.")
255 | }
256 | }
257 |
258 | //Defined Command : thermostatmode required (ENUM) - Thermostat mode to set
259 | void setThermostatMode(thermostatmode)
260 | {
261 | LogDebug("setThermostatMode() - autoChangeoverActive: ${device.currentValue("autoChangeoverActive")}");
262 |
263 | if (thermostatmode == "heat" && !heatModeEnabled)
264 | {
265 | LogInfo("Heating Mode Requested but Not Allowed, Iqnoring")
266 | return
267 | }
268 |
269 | if (thermostatmode == "cool" && !coolModeEnabled)
270 | {
271 | LogInfo("Cooling Mode Requested but Not Allowed, Iqnoring")
272 | return
273 | }
274 |
275 | //setThermosatSetPoint(com.hubitat.app.DeviceWrapper device, mode=null, autoChangeoverActive=false, heatPoint=null, coolPoint=null)
276 | if (!parent.setThermosatSetPoint(device, thermostatmode, device.currentValue("autoChangeoverActive"), device.currentValue("emergencyHeatActive"), null, null))
277 | {
278 | LogWarn("Set point failed, attempting a refresh and re-try.")
279 | parent.refreshThermosat(device)
280 | parent.setThermosatSetPoint(device, thermostatmode, device.currentValue("autoChangeoverActive"), device.currentValue("emergencyHeatActive"), null, null);
281 | }
282 | else
283 | {
284 | LogInfo("mode changed to ${thermostatmode}")
285 | }
286 | }
287 |
288 | void refresh()
289 | {
290 | LogDebug("Refresh called");
291 | parent.refreshThermosat(device)
292 | }
293 |
--------------------------------------------------------------------------------
/hubitatdbchecker.json:
--------------------------------------------------------------------------------
1 | {
2 | "packageName": "Hubitat Database Consistency/ghost checker",
3 | "author": "lgkahn",
4 | "version": "1.4",
5 | "minimumHEVersion": "0.0",
6 | "dateReleased": "2025-03-24",
7 | "drivers": [
8 | {
9 | "id": "8005147c-854a-425c-af7b-bc8b79a30c84",
10 | "name": "LGK Zwave table/devices comparison.",
11 | "namespace": "lgkapps",
12 | "location": "https://raw.githubusercontent.com/lgkahn/hubitat/refs/heads/master/dbconsistencychecker.groovy",
13 | "required": false
14 | }
15 | ]
16 | }
17 |
--------------------------------------------------------------------------------
/hubitatsmartalarmdevicetype.groovy:
--------------------------------------------------------------------------------
1 | /* Copyright 2015 lgkahn
2 | *
3 | * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except
4 | * in compliance with the License. You may obtain a copy of the License at:
5 | *
6 | * http://www.apache.org/licenses/LICENSE-2.0
7 | * version 1.0
8 | * Unless required by applicable law or agreed to in writing, software distributed under the License is distributed
9 | * on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License
10 | * for the specific language governing permissions and limitations under the License.
11 | *
12 | */
13 |
14 | metadata {
15 | definition (name: "Hubitat Smart Alarm Notification Device", namespace: "lgkapps", author: "Larry Kahn kahn@lgk.com") {
16 | capability "Notification"
17 | capability "Switch"
18 | capability "Configuration"
19 |
20 | command "onPhysical"
21 | command "offPhysical"
22 | attribute "armDisarm", "string"
23 | attribute "armStay", "string"
24 | attribute "armAway", "string"
25 | attribute "lastAlert", "string"
26 | attribute "lastAlertTime", "string"
27 | attribute "status", "string"
28 | attribute "armStatus", "string"
29 | attribute "statusText", "string"
30 | attribute "lastAlertType", "string"
31 | attribute "lastAlertDateTime", "string"
32 |
33 |
34 | }
35 |
36 | }
37 |
38 | def parse(String description) {
39 | log.debug "in parse desc = $description"
40 | def pair = description.split(":")
41 | createEvent(name: pair[0].trim(), value: pair[1].trim())
42 | }
43 |
44 | def installed() {
45 | log.debug "in installed"
46 | sendEvent(name: "status" , value: "All Ok")
47 | sendEvent(name: "lastAlert" , value: "None")
48 | sendEvent(name: "lastAlertType" , value: "None")
49 | sendEvent(name: "armStatus" , value: "Unknown")
50 | sendEvent(name: "statusText", value:"Unknown")
51 | sendEvent(name: "armDisarm", value: "unlite")
52 | sendEvent(name: "armStay", value: "unlite")
53 | sendEvent(name: "armAway", value: "unlite")
54 | sendEvent(name: "lastAlertDateTime", value: "None")
55 |
56 |
57 | }
58 |
59 |
60 | def deviceNotification(String desc)
61 | {
62 | log.debug "in device notification"
63 | log.debug "desc = $desc"
64 |
65 | def currentTime = new Date(now())
66 | //log.debug "got current time= $currentTime"
67 |
68 | def parts = desc.split(":")
69 |
70 | if (parts.length == 2)
71 | {
72 |
73 | def command = parts[0]
74 | def value = parts[1]
75 | log.debug "command = *$command* value = *$value*"
76 |
77 | switch (command)
78 | {
79 | case "Status":
80 | log.debug "got status thestatus = *$value*"
81 | sendEvent(name: "armStatus", value: value)
82 |
83 | switch (value)
84 | {
85 | case " Disarmed":
86 | log.debug "Setting disarm tile"
87 | sendEvent(name: "armDisarm", value: "lite")
88 | sendEvent(name: "armStay", value: "unlite")
89 | sendEvent(name: "armAway", value: "unlite")
90 | break;
91 |
92 | case " Armed - Away":
93 | log.debug "setting arm away tile"
94 | sendEvent(name: "armDisarm", value: "unlite")
95 | sendEvent(name: "armStay", value: "unlite")
96 | sendEvent(name: "armAway", value: "lite")
97 | break;
98 |
99 | case " Armed - Stay":
100 | log.debug "setting arm stay tile"
101 | sendEvent(name: "armDisarm", value: "unlite")
102 | sendEvent(name: "armStay", value: "lite")
103 | sendEvent(name: "armAway", value: "unlite")
104 | break;
105 | default: log.debug "in default case value = $value"
106 | }
107 |
108 | sendEvent(name: "status" , value: "All Ok")
109 | sendEvent(name:"statusText", value: value)
110 | break;
111 |
112 | case "Alert":
113 | log.debug "got Alert message value = $value"
114 | break;
115 |
116 | case "Zones":
117 | log.debug "Got Zone Message zone = $value"
118 | sendEvent(name: "lastAlert", value: value)
119 | break;
120 |
121 | case "AlertType":
122 | log.debug "Got alert type Message = *$value*"
123 | onPhysical()
124 |
125 | switch (value) {
126 | case " smoke":
127 | sendEvent(name: "status" , value: "Smoke/CO/Gas Alert")
128 | sendEvent(name: "lastAlertType" , value: "Smoke/CO/Gas Alert")
129 | sendEvent(name: "lastAlertDateTime" , value: currentTime)
130 | break;
131 |
132 | case " water":
133 | sendEvent(name: "status" , value: "Water Alert")
134 | sendEvent(name: "lastAlertType" , value: "Water Alert")
135 | sendEvent(name: "lastAlertDateTime" , value: currentTime)
136 | break;
137 |
138 |
139 | case " temp":
140 | sendEvent(name: "status" , value: "Temperature Alert")
141 | sendEvent(name: "lastAlertType" , value: "Temperature Alert")
142 | sendEvent(name: "lastAlertDateTime" , value: currentTime)
143 | break;
144 |
145 | default:
146 | sendEvent(name: "status" , value: "Intrusion Alert")
147 | sendEvent(name: "lastAlertType" , value: "Intrusion Alert")
148 | sendEvent(name: "lastAlertDateTime" , value: currentTime)
149 | break;
150 | }
151 |
152 | break;
153 |
154 | default:
155 | log.debug "Got unknown Message!"
156 | }
157 |
158 | } // have valid command
159 |
160 | }
161 |
162 | def configure()
163 | {
164 | updated()
165 | }
166 |
167 | def updated()
168 | {
169 |
170 | def currentTime = new Date(now())
171 | // log.debug "in updated"
172 | sendEvent(name: "status" , value: "All Ok")
173 | sendEvent(name: "lastAlert" , value: "None")
174 | sendEvent(name: "lastAlertType" , value: "None")
175 | sendEvent(name: "armStatus" , value: "Unknown")
176 |
177 | // for testing onPhysical()
178 | sendEvent(name: "armDisarm", value: "unlite")
179 | sendEvent(name: "armStay", value: "unlite")
180 | sendEvent(name: "armAway", value: "unlite")
181 |
182 | sendEvent(name: "lastAlertDateTime", value: currentTime)
183 | sendEvent(name: "statusText", value: "None")
184 | }
185 |
186 | def on() {
187 | sendEvent(name: "switch", value: "on")
188 | }
189 |
190 |
191 | def off() {
192 | log.debug "in off"
193 | sendEvent(name: "switch", value: "off")
194 | }
195 |
196 |
197 | def onPhysical() {
198 | sendEvent(name: "switch", value: "on", type: "physical")
199 | }
200 |
201 | def offPhysical() {
202 | log.debug " in off physical"
203 | sendEvent(name: "switch", value: "off", type: "physical")
204 | }
205 |
206 |
--------------------------------------------------------------------------------
/hublinks.txt:
--------------------------------------------------------------------------------
1 | http://192.168.11.109/hub/advanced/freeOSMemoryStatus
2 | http://192.168.11.109/hub/advanced/freeOSMemory
3 |
4 | http://192.168.11.109/hub/stats
5 | http://192.168.11.109/hub/enableStats
6 |
7 |
8 |
9 | nh.schottfam
10 | 4m
11 | http://hubIP/hub/advanced/freeOSMemoryStatus
12 | http://hubIP/hub/advanced/freeOSMemory
13 |
14 | Database and JVM
15 | http://hubIP/hub/cleanupDatabase. - system does the regularly itself
16 | http://hubIP/hub/forceGC. - system does this regularly itself
17 |
18 | View and enable stats
19 | http://hubIP/hub/stats
20 | http://hubIP/hub/enableStats
21 |
22 | http://hubIP/hub/zwave/nodeCleanup
23 |
24 | Http://192.168.11.109/hub/zigbee/getChildAndRouteInfo
25 |
26 | --FILTERED--
27 | http://IP/hub/advanced/freeOSMemory 1
28 | http://IP/hub/advanced/freeOSMemoryStatus
29 | http://IP/hub/advanced/network/installethtool
30 | http://IP/hub/advanced/network/lanautonegconfigstatus
31 | --FILTERED--
32 | http://IP/hub/cpuInfo 1
33 | --FILTERED--
34 | http://IP/hub/devLogs
35 | http://IP/hub/disableStats
36 | http://IP/hub/echoDiscovery
37 | --FILTERED--
38 | http://IP/hub/enableStats
39 | http://IP/hub/events
40 | http://IP/hub/events/:id/dataTablesJson
41 | http://IP/hub/fileManager
42 | http://IP/hub/fileManager/delete
43 | http://IP/hub/fileManager/json
44 | http://IP/hub/fileManager/upload
45 | http://IP/hub/forceGC
46 | http://IP/hub/forceStopJoin
47 | --FILTERED--
48 | http://IP/hub/lanDeviceInfo
49 | http://IP/hub/lanDevices
50 | http://IP/hub/lanDevicesStart
51 | http://IP/hub/list/data
52 | http://IP/hub/loggerAdd
53 | http://IP/hub/loggerlist
54 | http://IP/hub/loggerSave
55 | http://IP/hub/memoryUsage
56 | http://IP/hub/messages
57 | http://IP/hub/networkTest
58 | http://IP/hub/networkTest/ping/gateway
59 | http://IP/hub/networkTest/ping/:ip
60 | http://IP/hub/networkTest/speedtest
61 | http://IP/hub/networkTest/traceroute/:ip
62 | --FILTERED--
63 | http://IP/hub/reboot
64 | --FILTERED--
65 | http://IP/hub/resetHub
66 | http://IP/hub/resetzigbee
67 | http://IP/hub/restart
68 | --FILTERED--
69 | http://IP/hub/searchIrisDevices
70 | http://IP/hub/searchZigbeeDevices
71 | http://IP/hub/searchZwaveDevices
72 | --FILTERED--
73 | http://IP/hub/shutdown
74 | --FILTERED--
75 | http://IP/hub/startZwaveJoin
76 | http://IP/hub/stats
77 | http://IP/hub/stopHub/:id
78 | http://IP/hub/stopJoin
79 | --FILTERED--
80 | http://IP/hub/stopZWaveExclude
81 | http://IP/hub/threadInfo
82 | http://IP/hub/toggleUISecurityEnabled
83 | http://IP/hub/toggleUISSLEnabled
84 | http://IP/hub/tts/edit
85 | http://IP/hub/tts/updateDefaultVoice
86 | http://IP/hub/update
87 | http://IP/hub/updatezigbeechannel
88 | --FILTERED--
89 | http://IP/hub/zigbee/getChildAndRouteInfo
90 | http://IP/hub/zigbee/getSettings
91 | http://IP/hub/zigbeeInfo
92 | http://IP/hub/zigbeeLogs
93 | http://IP/hub/zigbee/setLowRamConcentrator/:value
94 | http://IP/hub/zigbee/setpower/:power
95 | http://IP/hub/zigbee/setRouteTableSize/:size
96 | http://IP/hub/zigbee/setSourceRouteTableSize/:size
97 | http://IP/hub/zigbee/update
98 | --FILTERED--
99 | http://IP/hub/zwaveCancelRepair
100 | http://IP/hub/zwave/discoverDevice
101 | http://IP/hub/zwaveExclude
102 | http://IP/hub/zwaveExclude/status
103 | http://IP/hub/zwave/failedNodeCheck
104 | http://IP/hub/zwaveInfo
105 | http://IP/hub/zwaveInfo?statusMessage=
106 | http://IP/hub/zwaveLearn
107 | http://IP/hub/zwaveLogs
108 | http://IP/hub/zwave/nodeCleanup
109 | http://IP/hub/zwaveNodeDetail
110 | http://IP/hub/zwaveNodeDetailGet
111 | http://IP/hub/zwave/nodeReinitialize
112 | http://IP/hub/zwave/nodeRemove
113 | http://IP/hub/zwaveNodeRepair
114 | http://IP/hub/zwave/nodeReplace
115 | http://IP/hub/zwave/nodeReplace/info
116 | http://IP/hub/zwave/nodeReplace/security
117 | http://IP/hub/zwave/nodeReplace/securityCode
118 | http://IP/hub/zwave/nodeReplace/securityKeys
119 | http://IP/hub/zwave/nodeReplace/status
120 | http://IP/hub/zwave/nodeReplace/stop
121 | http://IP/hub/zwave/nodeReplace/test
122 | http://IP/hub/zwave/nodeReplace/testDSK
123 | http://IP/hub/zwave/nodeReplace/testGrantKeys
124 | http://IP/hub/zwave/nodeReplace/:zwaveNodeId
125 | http://IP/hub/zwave/pingNode
126 | http://IP/hub/zwaveRefreshAllNodes
127 | http://IP/hub/zwave/refreshNodeStatus
128 | http://IP/hub/zwaveRepair
129 | http://IP/hub/zwave/reset
130 | http://IP/hub/zwave/securityCode
131 | http://IP/hub/zwave/securityKeys
132 | --FILTERED--
133 | http://IP/hub/zwavetxpower
134 | --FILTERED--
135 | http://IP/hub/zwaveVersion
136 |
137 | Filtered out the dangerous ones :slight_smile:
138 |
--------------------------------------------------------------------------------
/iptracker.groovy:
--------------------------------------------------------------------------------
1 | /* modified by lg kahn to remember old ip address and notify when it changes
2 | the idea here is to send a message when the ip has changed. cannot send a message in an app
3 | but can through a rule, so add an attribute that iphas changed, and monitor that through rule machine
4 |
5 | */
6 | command "Update"
7 | capability "Initialize"
8 |
9 | /* lgk add missing attributes so can be queried by dashboard */
10 |
11 | attribute "country", "string"
12 | attribute "country_iso", "string"
13 | attribute "country_eu", "string"
14 | attribute "region_name", "string"
15 | attribute "region_code", "string"
16 | attribute "metro_code", "string"
17 | attribute "zip_code", "string"
18 | attribute "city", "string"
19 | attribute "latitude", "string"
20 | attribute "longitude", "string"
21 | attribute "time_zone", "string"
22 | attribute "asn", "strring"
23 | attribute "asn_org", "string"
24 | attribute "hostname", "string"
25 | attribute "lastIP", "string"
26 | attribute "lastUpdate", "string"
27 | attribute "ip", "string"
28 | attribute "IPChanged", "boolean"
29 |
30 | preferences {
31 | input "timedelay", "number", title:"Number of seconds before rechecking", description: "", required: true, displayDuringSetup: true, defaultValue: "3600"
32 | input ("logdebugs", "bool", title: "Log debugging messages", defaultValue: false, displayDuringSetup: false)
33 | input name: "autoUpdate", type: "bool", title: "Enable Auto updating", defaultValue: true
34 | }
35 |
36 |
37 | metadata {
38 | definition (name: "PublicIPTracker", namespace: "PublicIPTracker", author: "MC, lgkahn", importUrl: "https://raw.githubusercontent.com/mikec85/hubitatdrivers/master/publiciptracker/PublicIPTracker.groovy") {
39 |
40 | }
41 | }
42 |
43 | void debugOff() {
44 | log.warn("Disabling debug logging")
45 | device.updateSetting("logdebugs", [value:"false", type:"bool"])
46 | }
47 |
48 | void initialize(){
49 |
50 | if (autoUpdate) runIn(timedelay.toInteger(), Update)
51 |
52 | if (logdebugs) log.debug "Debug logging will be disabled in 300 seconds"
53 |
54 | runIn(300, debugOff)
55 | sendEvent(name: "IPChanged", value: false)
56 | state.IPChanged = false
57 |
58 | sendEvent(name: "ip", value: "0.0.0.0")
59 | }
60 |
61 |
62 | def version()
63 | {
64 | updateDataValue("driverVersion", "0.2.0")
65 | return "0.2.0"
66 | }
67 |
68 |
69 | def updateData(String name, String data) {
70 |
71 | updateDataValue(name, data)
72 | sendEvent(name: name, value: data)
73 |
74 | }
75 |
76 | def installed()
77 | {
78 | initialize()
79 | }
80 |
81 |
82 | def Update() {
83 |
84 | if (autoUpdate) runIn(timedelay.toInteger(), Update)
85 |
86 |
87 | if (state.ip != null)
88 | {
89 | state.lastIP = state.ip
90 | sendEvent(name: "lastIP", value: state.lastIP)
91 | }
92 |
93 | ipdata = GetIFConfig()
94 | if (ipdata != null)
95 | {
96 |
97 | def now = new Date().format('MM/dd/yyyy h:mm a',location.timeZone)
98 | sendEvent(name: "lastUpdate", value: now, descriptionText: "Last Update: $now")
99 |
100 |
101 | if(logdebugs) log.info ipdata
102 |
103 | state.ip = ipdata.ip
104 |
105 | updateData("ip", "${ipdata.ip}")
106 | updateData("country", "${ipdata.country}")
107 | updateData("ip_decimal", "${ipdata.ip_decimal}")
108 | updateData("country", "${ipdata.country}")
109 | updateData("country_iso", "${ipdata.country_iso}")
110 | updateData("country_eu", "${ipdata.country_eu}")
111 | updateData("region_name", "${ipdata.region_name}")
112 | updateData("region_code", "${ipdata.region_code}")
113 | updateData("metro_code", "${ipdata.metro_code}")
114 | updateData("zip_code", "${ipdata.zip_code}")
115 | updateData("city", "${ipdata.city}")
116 | updateData("latitude", "${ipdata.latitude}")
117 | updateData("longitude", "${ipdata.longitude}")
118 | updateData("time_zone", "${ipdata.time_zone}")
119 | updateData("asn", "${ipdata.asn}")
120 | updateData("asn_org", "${ipdata.asn_org}")
121 | updateData("hostname", "${ipdata.hostname}")
122 |
123 |
124 | if ((state.ip != null) && (state.lastIP != null))
125 | {
126 | if (state.ip != state.lastIP)
127 | {
128 | log.debug "Ip Changed: old = $state.lastIP, new = $state.ip, hostname = $ipdata.hostname!"
129 | state.IPChanged = true
130 | sendEvent(name: "IPChanged", value: true)
131 | }
132 | else
133 | {
134 | state.IPChanged = false
135 | sendEvent(name: "IPChanged", value: false)
136 | }
137 | }
138 | }
139 | }
140 |
141 | def GetIFConfig() {
142 |
143 | def wxURI2 = "https://ifconfig.co/"
144 |
145 | def requestParams2 =
146 | [
147 | uri: wxURI2,
148 | headers: [
149 | Host: "ifconfig.co",
150 | Accept: "application/json"
151 | ]
152 |
153 | ]
154 | try{
155 | httpGet(requestParams2)
156 | {
157 | response ->
158 | if (response?.status == 200)
159 | {
160 | if (logEnable) log.info response.data
161 | return response.data
162 | }
163 | else
164 | {
165 | log.warn "${response?.status}"
166 | }
167 | }
168 |
169 | } catch (Exception e){
170 | log.info e
171 | }
172 | }
173 |
--------------------------------------------------------------------------------
/linktwoswitches.groovy:
--------------------------------------------------------------------------------
1 | /**
2 | * Copyright 2015 SmartThings
3 | *
4 | * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except
5 | * in compliance with the License. You may obtain a copy of the License at:
6 | *
7 | * http://www.apache.org/licenses/LICENSE-2.0
8 | *
9 | * Unless required by applicable law or agreed to in writing, software distributed under the License is distributed
10 | * on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License
11 | * for the specific language governing permissions and limitations under the License.
12 | *
13 | * Links Two Switchs
14 | *
15 | * Author: kahn@lgk.com
16 | *
17 | * Date: 2015-11-08
18 | */
19 | definition(
20 | name: "Link Two Switches",
21 | namespace: "lgkapps",
22 | author: "kahn@lgk.com",
23 | description: "Based on the big switch but links two switches so one either one changes the other follows suit. You can two this with the new smart lighting, but you would need two separate smartapps instead of one.",
24 | category: "Convenience",
25 | iconUrl: "https://s3.amazonaws.com/smartapp-icons/Meta/light_outlet.png",
26 | iconX2Url: "https://s3.amazonaws.com/smartapp-icons/Meta/light_outlet@2x.png"
27 | )
28 |
29 | preferences {
30 | section("Master Switch?") {
31 | input "master", "capability.switch", title: "Where?"
32 | }
33 | section("Linked Switch?") {
34 | input "linked", "capability.switch", title: "Where?"
35 | }
36 | }
37 |
38 | def installed()
39 | {
40 | subscribe(master, "switch.on", onHandler)
41 | subscribe(master, "switch.off", offHandler)
42 | //subscribe(master, "level", dimHandler)
43 |
44 | subscribe(linked, "switch.on", linkedOnHandler)
45 | subscribe(linked, "switch.off", linkedOffHandler)
46 | //subscribe(linked, "level", linkedDimHandler)
47 |
48 | }
49 |
50 | def updated()
51 | {
52 | unsubscribe()
53 | subscribe(master, "switch.on", onHandler)
54 | subscribe(master, "switch.off", offHandler)
55 |
56 | subscribe(linked, "switch.on", linkedOnHandler)
57 | subscribe(linked, "switch.off", linkedOffHandler)
58 |
59 | log.debug "in updated ... master state= $master.currentSwitch"
60 | log.debug "in updated ... linked state= $linked.currentSwitch"
61 | }
62 |
63 | def logHandler(evt) {
64 | log.debug evt.value
65 | }
66 |
67 | def onHandler(evt) {
68 | log.debug "In Master on handler"
69 | log.debug evt.value
70 | if (linked.currentSwitch == "off")
71 | { log.debug "Master turned On, (Linked was off) turning it on"
72 | linked.on()
73 | }
74 | }
75 |
76 | def linkedOnHandler(evt) {
77 | log.debug "In Linked on handler"
78 | log.debug evt.value
79 | if (master.currentSwitch == "off")
80 | { log.debug "Linked turned On, (Master was off) turning it on"
81 | master.on()
82 | }
83 | }
84 |
85 | def offHandler(evt) {
86 | log.debug evt.value
87 | log.debug "In Master off handler"
88 | if (linked.currentSwitch == "on")
89 | { log.debug "Master turned Off, (Linked was on) turning it off"
90 | linked.off()
91 | }
92 | }
93 |
94 | def linkedOffHandler(evt) {
95 | log.debug evt.value
96 | log.debug "In Linked off handler"
97 | if (master.currentSwitch == "on")
98 | { log.debug "Linked turned Off, (Master was on) turning it off"
99 | master.off()
100 | }
101 | }
102 |
103 | def dimHandler(evt) {
104 | log.debug "In Master Dim Handler"
105 | log.debug "Dim level: $evt.value"
106 | linked.setLevel(evt.value)
107 | }
108 |
109 |
110 | def LinkedDimHandler(evt) {
111 | log.debug "In Linked Dim Handler"
112 | log.debug "Dim level: $evt.value"
113 | // do nothing here as we would go in a loop. I dont have a dimmer on linked switch anyeaymaster.setLevel(evt.value)
114 | }
115 |
116 |
--------------------------------------------------------------------------------
/myct100.groovy:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/lgkahn/hubitat/92d277962091904ab2a7bfd7e0ca3758976e63fe/myct100.groovy
--------------------------------------------------------------------------------
/myutiltechsiren.groovy:
--------------------------------------------------------------------------------
1 | /**
2 | * Utilitech/Everspring Siren
3 | *
4 | * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except
5 | * in compliance with the License. You may obtain a copy of the License at:
6 | *
7 | * http://www.apache.org/licenses/LICENSE-2.0
8 | *
9 | * Unless required by applicable law or agreed to in writing, software distributed under the License is distributed
10 | * on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License
11 | * for the specific language governing permissions and limitations under the License.
12 | *
13 | * Updates:
14 | * -------
15 | * 02-19-2016 : Initial commit
16 | * 03-11-2016 : Due to ST's v2.1.0 app totally hosing up SECONDARY_CONTROL, implemented a workaround to display that info in a separate tile.
17 | * 08-14-2016 : Reimplemented SECONDARY_CONTROL (looks like formatting issues were fixed.
18 | * 08-27-2016 : Modified the device handler for my liking, primarly for looks and feel.
19 | * 01-31-2017 : Modified the device handler for my liking, primarly for looks and feel. Cleaned up code a bit.
20 | * 03-11-2017 : Changed from valueTile to standardTile for a few tiles since ST's mobile app v2.3.x changed something between the two.
21 | *
22 | */
23 | metadata {
24 | definition (name: "My Utilitech Z-Wave Siren", namespace: "jscgs350", author: "SmartThings") {
25 | capability "Actuator"
26 | capability "Alarm"
27 | capability "Battery"
28 | capability "Polling"
29 | capability "Refresh"
30 | capability "Sensor"
31 | capability "Switch"
32 |
33 | attribute "alarmState", "string"
34 |
35 | }
36 |
37 | tiles(scale: 2) {
38 | multiAttributeTile(name:"alarm", type: "generic", width: 6, height: 4, canChangeIcon: true){
39 | tileAttribute ("device.alarm", key: "PRIMARY_CONTROL") {
40 | attributeState "both", label:'alarm!', action:'alarm.off', icon:"st.alarm.alarm.alarm", backgroundColor:"#e86d13"
41 | attributeState "off", label:'off', action:'alarm.strobe', icon:"st.security.alarm.clear", backgroundColor:"#ffffff"
42 | }
43 | tileAttribute ("device.battery", key: "SECONDARY_CONTROL") {
44 | attributeState("default", label:'${currentValue}% battery', icon: "https://raw.githubusercontent.com/constjs/jcdevhandlers/master/img/battery-icon-614x460.png")
45 | }
46 | }
47 | standardTile("refresh", "device.refresh", width: 6, height: 2, inactiveLabel: false, decoration: "flat") {
48 | state "default", label:'Refresh', action:"refresh.refresh", icon:"st.secondary.refresh-icon"
49 | }
50 | standardTile("blankTile", "statusText", inactiveLabel: false, decoration: "flat", width: 1, height: 1) {
51 | state "default", label:'', icon:"http://cdn.device-icons.smartthings.com/secondary/device-activity-tile@2x.png"
52 | }
53 | standardTile("statusText", "statusText", inactiveLabel: false, decoration: "flat", width: 5, height: 1) {
54 | state "statusText", label:'${currentValue}', backgroundColor:"#ffffff"
55 | }
56 | main "alarm"
57 | details(["alarm", "blankTile","statusText","refresh"])
58 | }
59 | }
60 |
61 | def parse(String description) {
62 | log.debug "parse($description)"
63 | def result = null
64 | def cmd = zwave.parse(description, [0x20: 1])
65 | if (cmd) {
66 | result = createEvents(cmd)
67 | }
68 |
69 | def statusTextmsg = ""
70 | statusTextmsg = "Siren is ${device.currentState('alarmState').value} (tap to toggle on/off)."
71 | sendEvent("name":"statusText", "value":statusTextmsg)
72 | // log.debug statusTextmsg
73 |
74 | log.debug "Parse returned ${result?.descriptionText}"
75 | return result
76 | }
77 |
78 | def createEvents(hubitat.zwave.commands.batteryv1.BatteryReport cmd) {
79 | def map = [ name: "battery", unit: "%" ]
80 | if (cmd.batteryLevel == 0xFF) {
81 | map.value = 1
82 | map.descriptionText = "$device.displayName has a low battery"
83 | } else {
84 | map.value = cmd.batteryLevel
85 | }
86 | state.lastbatt = new Date().time
87 | createEvent(map)
88 | }
89 |
90 | def poll() {
91 | if (secondsPast(state.lastbatt, 36*60*60)) {
92 | return zwave.batteryV1.batteryGet().format
93 | } else {
94 | return null
95 | }
96 | }
97 |
98 | private Boolean secondsPast(timestamp, seconds) {
99 | if (!(timestamp instanceof Number)) {
100 | if (timestamp instanceof Date) {
101 | timestamp = timestamp.time
102 | } else if ((timestamp instanceof String) && timestamp.isNumber()) {
103 | timestamp = timestamp.toLong()
104 | } else {
105 | return true
106 | }
107 | }
108 | return (new Date().time - timestamp) > (seconds * 1000)
109 | }
110 |
111 | def on() {
112 | log.debug "sending on"
113 | [
114 | zwave.basicV1.basicSet(value: 0xFF).format(),
115 | zwave.basicV1.basicGet().format()
116 | ]
117 | }
118 |
119 | def off() {
120 | log.debug "sending off"
121 | [
122 | zwave.basicV1.basicSet(value: 0x00).format(),
123 | zwave.basicV1.basicGet().format()
124 | ]
125 | }
126 |
127 | def strobe() {
128 | log.debug "sending stobe/on command"
129 | [
130 | zwave.basicV1.basicSet(value: 0xFF).format(),
131 | zwave.basicV1.basicGet().format()
132 | ]
133 | }
134 |
135 | def both() {
136 | log.debug "Sending ON command to ${device.displayName} even though BOTH was called"
137 | [
138 | zwave.basicV1.basicSet(value: 0xFF).format(),
139 | zwave.basicV1.basicGet().format()
140 | ]
141 | }
142 |
143 | def refresh() {
144 | log.debug "sending battery refresh command"
145 | zwave.batteryV1.batteryGet().format()
146 | }
147 |
148 | def createEvents(hubitat.zwave.commands.basicv1.BasicReport cmd)
149 | {
150 | def switchValue = cmd.value ? "on" : "off"
151 | def alarmValue
152 | if (cmd.value == 0) {
153 | alarmValue = "off"
154 | sendEvent(name: "alarmState", value: "standing by")
155 | }
156 | else if (cmd.value <= 33) {
157 | alarmValue = "strobe"
158 | sendEvent(name: "alarmState", value: "ON - strobe only!")
159 | }
160 | else if (cmd.value <= 66) {
161 | alarmValue = "siren"
162 | sendEvent(name: "alarmState", value: "ON - siren only!")
163 | }
164 | else {
165 | alarmValue = "both"
166 | sendEvent(name: "alarmState", value: "ON - strobe and siren!")
167 | }
168 | [
169 | createEvent([name: "switch", value: switchValue, type: "digital", displayed: false]),
170 | createEvent([name: "alarm", value: alarmValue, type: "digital"])
171 | ]
172 | }
173 |
174 | def createEvents(hubitat.zwave.Command cmd) {
175 | log.warn "UNEXPECTED COMMAND: $cmd"
176 | }
177 |
--------------------------------------------------------------------------------
/notificationdevice.groovy:
--------------------------------------------------------------------------------
1 | /* Copyright 2015 lgkahn
2 | *
3 | * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except
4 | * in compliance with the License. You may obtain a copy of the License at:
5 | *
6 | * http://www.apache.org/licenses/LICENSE-2.0
7 | * version 1.0
8 | * Unless required by applicable law or agreed to in writing, software distributed under the License is distributed
9 | * on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License
10 | * for the specific language governing permissions and limitations under the License.
11 | *
12 | */
13 |
14 | metadata {
15 | definition (name: "LGK Virtual Email Notification Device", namespace: "lgkapps", author: "Larry Kahn kahn@lgk.com") {
16 | capability "Notification"
17 | capability "Switch"
18 | capability "Configuration"
19 |
20 | command "onPhysical"
21 | command "offPhysical"
22 | attribute "device", "string"
23 | attribute "status", "string"
24 | attribute "description", "string"
25 |
26 |
27 | }
28 |
29 | }
30 |
31 | def parse(String description) {
32 | log.debug "in parse desc = $description"
33 | def pair = description.split(":")
34 | createEvent(name: pair[0].trim(), value: pair[1].trim())
35 | }
36 |
37 | def installed() {
38 | log.debug "in installed"
39 | sendEvent(name: "status" , value: "none")
40 | sendEvent(name: "device" , value: "None")
41 | sendEvent(name: "description", value: "none")
42 |
43 | }
44 |
45 | def deviceNotification(String desc)
46 | {
47 | log.debug "in device notification"
48 | log.debug "desc = $desc"
49 |
50 | def currentTime = new Date(now())
51 | log.debug "got current time= $currentTime"
52 |
53 | def parts = desc.split(":")
54 |
55 | if (parts.length == 6)
56 | {
57 |
58 | // shoudl be desc:value:device:value:status:value
59 | //id desc:living room switch:on:
60 | def command1 = parts[0]
61 | def value1 = parts[1]
62 | log.debug "desc = *$value1*"
63 |
64 | def command2 = parts[2]
65 | def value2 = parts[3]
66 |
67 | log.debug "device = *$command2* name = *$value2*"
68 | def command3 = parts[4]
69 | def value3 = parts[5]
70 | log.debug "status = *$command3* value = *$value3*"
71 |
72 | sendEvent(name: "status", value:value3)
73 | sendEvent(name: "description", value: value1)
74 | sendEvent(name: "device", value: value2)
75 | on()
76 |
77 | }
78 | }
79 |
80 | def configure()
81 | {
82 | updated()
83 | }
84 |
85 | def updated()
86 | {
87 |
88 | def currentTime = new Date(now())
89 | // log.debug "in updated"
90 | sendEvent(name: "status" , value: "none")
91 | sendEvent(name: "device" , value: "None")
92 | sendEvent(name: "description", value: "none")
93 | }
94 |
95 | def on() {
96 | sendEvent(name: "switch", value: "on")
97 | }
98 |
99 |
100 | def off() {
101 | log.debug "in off"
102 | sendEvent(name: "switch", value: "off")
103 | }
104 |
105 |
106 | def onPhysical() {
107 | sendEvent(name: "switch", value: "on", type: "physical")
108 | }
109 |
110 | def offPhysical() {
111 | log.debug " in off physical"
112 | sendEvent(name: "switch", value: "off", type: "physical")
113 | }
114 |
115 |
--------------------------------------------------------------------------------
/rf9500.groovey:
--------------------------------------------------------------------------------
1 | /**
2 | * Copyright 2015 SmartThings
3 | *
4 | * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except
5 | * in compliance with the License. You may obtain a copy of the License at:
6 | *
7 | * http://www.apache.org/licenses/LICENSE-2.0
8 | *
9 | * Unless required by applicable law or agreed to in writing, software distributed under the License is distributed
10 | * on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License
11 | * for the specific language governing permissions and limitations under the License.
12 | *
13 | */
14 | metadata {
15 | definition (name: "Cooper RF9500 Stock new", namespace: "lgkapps", author: "juano23@gmail.com") {
16 | capability "Switch"
17 | capability "Switch Level"
18 | capability "PushableButton"
19 | capability "Actuator"
20 | capability "Configuration"
21 |
22 | //fingerprint deviceId: "0x1200", inClusters: "0x77 0x86 0x75 0x73 0x85 0x72 0xEF", outClusters: "0x26"
23 | }
24 |
25 | // simulator metadata
26 | simulator {
27 | // status messages
28 | status "on": "on/off: 1"
29 | status "off": "on/off: 0"
30 |
31 | // reply messages
32 | reply "zcl on-off on": "on/off: 1"
33 | reply "zcl on-off off": "on/off: 0"
34 | }
35 |
36 |
37 | preferences {
38 |
39 | input("debug", "bool", title: "Turn on debugging logging?", required: true, defaultValue: false)
40 | }
41 | }
42 |
43 |
44 | def configure()
45 | {
46 |
47 | if (debug) log.debug "In configure cuurent level = $state.level"
48 |
49 | }
50 |
51 | def parse(String description)
52 | {
53 | if (debug) log.debug "in parse current level = $state.level"
54 | def results = []
55 | if (description.startsWith("Err")) {
56 | results = createEvent(descriptionText:description, displayed:true)
57 | } else {
58 | def cmd = zwave.parse(description, [0x26: 1, 0x2B: 1, 0x80: 1, 0x84: 1])
59 | if(cmd) results += zwaveEvent(cmd)
60 | if(!results) results = [ descriptionText: cmd, displayed: false ]
61 | }
62 | if (debug) log.debug("Parsed '$description' to $results")
63 | return results
64 | }
65 |
66 | def on() {
67 | sendEvent(name: "switch", value: "on")
68 | }
69 |
70 | def off() {
71 | sendEvent(name: "switch", value: "off")
72 | }
73 |
74 | def levelup() {
75 | if (debug) log.debug "in level up"
76 |
77 | def curlevel = device.currentValue('level') as Integer
78 | if (debug) log.debug "cur level = $curlevel"
79 | if (curlevel <= 95)
80 | setLevel(curlevel + 5);
81 | }
82 |
83 | def leveldown() {
84 | if (debug) log.debug "in level down"
85 |
86 | def curlevel = device.currentValue('level') as Integer
87 | if (debug) log.debug "cur level = $curlevel"
88 | if (curlevel > 5)
89 | setLevel(curlevel - 5)
90 | }
91 |
92 | def setLevel(value) {
93 | if (debug) log.trace "setLevel($value)"
94 | sendEvent(name: "level", value: value)
95 | sendEvent(name:"switch.setLevel",value:value)
96 | }
97 |
98 | def zwaveEvent(hubitat.zwave.commands.wakeupv1.WakeUpNotification cmd) {
99 | def results = [createEvent(descriptionText: "$device.displayName woke up", isStateChange: false)]
100 |
101 | results += configurationCmds().collect{ response(it) }
102 | results << response(zwave.wakeUpV1.wakeUpNoMoreInformation().format())
103 |
104 | return results
105 | }
106 |
107 | // A zwave command for a button press was received convert to button number
108 | def zwaveEvent(hubitat.zwave.commands.switchmultilevelv1.SwitchMultilevelStartLevelChange cmd) {
109 | [ descriptionText: "startlevel $cmd"]
110 | if (debug) log.info "startlevel $cmd"
111 | if (cmd.upDown == true) {
112 | Integer buttonid = 2
113 | levelup()
114 | checkbuttonEvent(buttonid)
115 | } else if (cmd.upDown == false) {
116 | Integer buttonid = 3
117 | leveldown()
118 | checkbuttonEvent(buttonid)
119 | }
120 | }
121 |
122 | // The controller likes to repeat the command... ignore repeats
123 | def checkbuttonEvent(buttonid){
124 |
125 | if (state.lastScene == buttonid && (state.repeatCount < 4) && (now() - state.repeatStart < 2000)) {
126 | log.debug "Button ${buttonid} repeat ${state.repeatCount}x ${now()}"
127 | state.repeatCount = state.repeatCount + 1
128 | createEvent([:])
129 | }
130 | else {
131 | // If the button was really pressed, store the new scene and handle the button press
132 | state.lastScene = buttonid
133 | state.lastLevel = 0
134 | state.repeatCount = 0
135 | state.repeatStart = now()
136 |
137 | buttonEvent(buttonid)
138 | }
139 | }
140 |
141 | // Handle a button being pressed
142 | def buttonEvent(button) {
143 | button = button as Integer
144 | log.trace "Button $button pressed"
145 | def result = []
146 | if (button == 1) {
147 | def mystate = device.currentValue('switch');
148 | if (mystate == "on")
149 | off()
150 | else
151 | on()
152 | }
153 | updateState("currentButton", "$button")
154 | // update the device state, recording the button press
155 | result << createEvent(name: "button", value: "pushed", data: [buttonNumber: button], descriptionText: "$device.displayName button $button was pushed", isStateChange: true)
156 | result
157 | }
158 |
159 | def zwaveEvent(hubitat.zwave.commands.basicv1.BasicGet cmd) {
160 | [ descriptionText: "$cmd"]
161 | if(1){
162 | Integer buttonid = 1
163 | checkbuttonEvent(buttonid)
164 | }
165 | }
166 |
167 | def zwaveEvent(hubitat.zwave.commands.basicv1.BasicSet cmd) {
168 | [ descriptionText: "$cmd"]
169 | if(1){
170 | Integer buttonid = 1
171 | log.info "button $buttonid pressed"
172 | checkbuttonEvent(buttonid)
173 | }
174 | }
175 |
176 | def zwaveEvent(hubitat.zwave.commands.switchmultilevelv1.SwitchMultilevelStopLevelChange cmd) {
177 | createEvent([:])
178 | }
179 |
180 |
181 | def zwaveEvent(hubitat.zwave.Command cmd) {
182 | [ descriptionText: "$cmd"]
183 | }
184 |
185 | // Update State
186 | def updateState(String name, String value) {
187 | state[name] = value
188 | device.updateDataValue(name, value)
189 | }
190 |
191 |
--------------------------------------------------------------------------------
/simulatedgaragedoorv2.groovy:
--------------------------------------------------------------------------------
1 | /**
2 | * Z-Wave Garage Door Opener
3 | *
4 | * Copyright 2014 SmartThings
5 | *
6 | * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except
7 | * in compliance with the License. You may obtain a copy of the License at:
8 | *
9 | * http://www.apache.org/licenses/LICENSE-2.0
10 | *
11 | * Unless required by applicable law or agreed to in writing, software distributed under the License is distributed
12 | * on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License
13 | * for the specific language governing permissions and limitations under the License.
14 | *
15 | */
16 | metadata {
17 | definition (name: "Simulated Garage Door Opener V2", namespace: "smartthings/testing", author: "SmartThings") {
18 | capability "Actuator"
19 | capability "Door Control"
20 | capability "Garage Door Control"
21 | capability "Contact Sensor"
22 | capability "Refresh"
23 | capability "Sensor"
24 | capability "Health Check"
25 | capability "Switch"
26 | capability "Configuration"
27 |
28 | }
29 |
30 | simulator {
31 |
32 | }
33 |
34 | tiles {
35 | standardTile("toggle", "device.door", width: 2, height: 2) {
36 | state("closed", label:'${name}', action:"door control.open", icon:"st.doors.garage.garage-closed", backgroundColor:"#00A0DC", nextState:"opening")
37 | state("open", label:'${name}', action:"door control.close", icon:"st.doors.garage.garage-open", backgroundColor:"#e86d13", nextState:"closing")
38 | state("opening", label:'${name}', icon:"st.doors.garage.garage-closed", backgroundColor:"#e86d13")
39 | state("closing", label:'${name}', icon:"st.doors.garage.garage-open", backgroundColor:"#00A0DC")
40 |
41 | }
42 |
43 | standardTile("toggle", "device.garageDoor", width: 2, height: 2) {
44 | state("closed", label:'${name}', action:"garage door control.open", icon:"st.doors.garage.garage-closed", backgroundColor:"#00A0DC", nextState:"opening")
45 | state("open", label:'${name}', action:"gharage door control.close", icon:"st.doors.garage.garage-open", backgroundColor:"#e86d13", nextState:"closing")
46 | state("opening", label:'${name}', icon:"st.doors.garage.garage-closed", backgroundColor:"#e86d13")
47 | state("closing", label:'${name}', icon:"st.doors.garage.garage-open", backgroundColor:"#00A0DC")
48 |
49 | }
50 | standardTile("open", "device.door", inactiveLabel: false, decoration: "flat") {
51 | state "default", label:'open', action:"door control.open", icon:"st.doors.garage.garage-opening"
52 | }
53 | standardTile("close", "device.door", inactiveLabel: false, decoration: "flat") {
54 | state "default", label:'close', action:"door control.close", icon:"st.doors.garage.garage-closing"
55 | }
56 |
57 | standardTile("open", "device.garageDoor", inactiveLabel: false, decoration: "flat") {
58 | state "default", label:'open', action:"garage door control.open", icon:"st.doors.garage.garage-opening"
59 | }
60 | standardTile("close", "device.garageDoor", inactiveLabel: false, decoration: "flat") {
61 | state "default", label:'close', action:"garage door control.close", icon:"st.doors.garage.garage-closing"
62 | }
63 | main "toggle"
64 | details(["toggle", "open", "close"])
65 |
66 | }
67 | }
68 |
69 | def parse(String description) {
70 | log.trace "parse($description)"
71 | }
72 |
73 | def open() {
74 | sendEvent(name: "door", value: "opening")
75 | sendEvent(name: "garageDoor", value: "opening")
76 | runIn(2, finishOpening)
77 | }
78 |
79 | def close() {
80 | sendEvent(name: "door", value: "closing")
81 | sendEvent(name: "garageDoor", value: "closing")
82 | runIn(2, finishClosing)
83 | }
84 |
85 | def finishOpening() {
86 | sendEvent(name: "door", value: "open")
87 | sendEvent(name: "garageDoor", value: "open")
88 | sendEvent(name: "contact", value: "open")
89 | }
90 |
91 | def finishClosing() {
92 | sendEvent(name: "door", value: "closed")
93 | sendEvent(name: "garageDoor", value: "closed")
94 | sendEvent(name: "contact", value: "closed")
95 | }
96 |
97 | def configure()
98 | {
99 | installed()
100 | }
101 |
102 | def installed() {
103 | log.debug "Executing 'installed'"
104 | initialize()
105 | }
106 |
107 | def refresh() {
108 | sendEvent(name: "DeviceWatch-DeviceStatus", value: "online")
109 | }
110 |
111 | def ping() {
112 | refresh()
113 | }
114 |
115 | def updated() {
116 | log.debug "Executing 'updated'"
117 | initialize()
118 | }
119 |
120 | private initialize() {
121 | log.debug "Executing 'initialize'"
122 |
123 | sendEvent(name: "DeviceWatch-DeviceStatus", value: "online")
124 | sendEvent(name: "healthStatus", value: "online")
125 | //sendEvent(name: "DeviceWatch-Enroll", value: [protocol: "cloud", scheme:"untracked"].encodeAsJson(), displayed: false)
126 | }
127 |
128 | def on()
129 | {
130 | open()
131 | }
132 |
133 | def off()
134 | {
135 | close()
136 | }
137 |
138 |
--------------------------------------------------------------------------------
/sprucesensorlgk.groovy:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/lgkahn/hubitat/92d277962091904ab2a7bfd7e0ca3758976e63fe/sprucesensorlgk.groovy
--------------------------------------------------------------------------------
/stg814v4.groovey:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/lgkahn/hubitat/92d277962091904ab2a7bfd7e0ca3758976e63fe/stg814v4.groovey
--------------------------------------------------------------------------------
/tesla_tessie.json:
--------------------------------------------------------------------------------
1 | {
2 | "packageName": "Tesla Connect via Tessie app and driver",
3 | "author": "Larry Kahn",
4 | "version": "2.41",
5 | "minimumHEVersion": "2.3.0",
6 | "dateReleased": "2024-01-17",
7 | "apps": [
8 | {
9 | "id": "611ddab2-cae5-415d-aeea-64bd2baeef4c",
10 | "name": "Tesla Connect Tessie",
11 | "namespace": "lgkahn",
12 | "location": "https://raw.githubusercontent.com/lgkahn/hubitat/master/teslaConnectTessie.groovy",
13 | "required": true,
14 | "oauth": false,
15 | "primary": false
16 | }
17 | ],
18 | "drivers": [
19 | {
20 | "id": "fab8254d-f23e-46fe-bea1-bddde821a436",
21 | "name": "tessieVehicle",
22 | "namespace": "lgkahn",
23 | "location": "https://raw.githubusercontent.com/lgkahn/hubitat/master/tessieVehicle.groovy",
24 | "required": true
25 | }
26 | ]
27 | }
28 |
--------------------------------------------------------------------------------
/virtdoor.groovey:
--------------------------------------------------------------------------------
1 | /**
2 | * Copyright 2015 SmartThings
3 | *
4 | * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except
5 | * in compliance with the License. You may obtain a copy of the License at:
6 | *
7 | * http://www.apache.org/licenses/LICENSE-2.0
8 | *
9 | * Unless required by applicable law or agreed to in writing, software distributed under the License is distributed
10 | * on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License
11 | * for the specific language governing permissions and limitations under the License.
12 | *
13 | * Author: LGKahn kahn-st@lgk.com
14 | * version 2 user defineable timeout before checking if door opened or closed correctly. Raised default to 25 secs. You can reduce it to 15 secs. if you have custom simulated door with < 6 sec wait.
15 | * Version 3. add code to get name of device so messages don't alwasy says garage door for instance if you are using it on a fence gate etc.
16 | */
17 |
18 | definition(
19 | name: "LGK Virtual Garage Door - Separate Open/Close switch",
20 | namespace: "lgkapps",
21 | author: "lgkahn kahn-st@lgk.com",
22 | description: "Sync the Simulated garage door device/gate/fence with 3 actual devices, either a tilt or contact sensor and a separte opener and closer switch or relay. The simulated device will then control the actual garage door. In addition, the virtual device will sync when the garage door is opened manually, \n It also attempts to double check the door was actually closed in case the beam was crossed. ",
23 | category: "Convenience",
24 | iconUrl: "https://s3.amazonaws.com/smartapp-icons/Meta/garage_contact.png",
25 | iconX2Url: "https://s3.amazonaws.com/smartapp-icons/Meta/garage_contact@2x.png"
26 | )
27 |
28 | preferences {
29 | section("Choose the switch/relay that opens the garage?"){
30 | input "opener", "capability.switch", title: "Physical Garage Opener?", required: true
31 | }
32 | section("Choose the switch/relay that closes the garage?"){
33 | input "closer", "capability.switch", title: "Physical Garage Closer?", required: true
34 | }
35 | section("Choose the sensor that senses if the garage is open closed? "){
36 | input "sensor", "capability.contactSensor", title: "Physical Garage Door Open/Closed?", required: true
37 | }
38 |
39 | section("Choose the Virtual Garage Door Device? "){
40 | input "virtualgd", "capability.doorControl", title: "Virtual Garage Door?", required: true
41 | }
42 |
43 | section("Choose the Virtual Garage Door Device sensor (same as above device)?"){
44 | input "virtualgdbutton", "capability.contactSensor", title: "Virtual Garage Door Open/Close Sensor?", required: true
45 | }
46 |
47 | section("Timeout before checking if the door opened or closed correctly?"){
48 | input "checkTimeout", "number", title: "Door Operation Check Timeout?", required: true, defaultValue: 25
49 | }
50 |
51 | section( "Notifications" ) {
52 | input "sendPushMessage", "capability.notification", title: "Notification Devices: Hubitat PhoneApp or Pushover", multiple: true, required: false
53 |
54 | //input("recipients", "contact", title: "Send notifications to") {
55 | // input "sendPushMessage", "enum", title: "Send a push notification?", options: ["Yes", "No"], required: false
56 | // input "phone1", "phone", title: "Send a Text Message?", required: false
57 | // }
58 | }
59 |
60 | }
61 |
62 | def installed()
63 | {
64 | def realgdstate = sensor.currentContact
65 | def virtualgdstate = virtualgd.currentContact
66 | //log.debug "in installed ... current state= $realgdstate"
67 | //log.debug "gd state= $virtualgd.currentContact"
68 |
69 | subscribe(sensor, "contact", contactHandler)
70 | subscribe(virtualgdbutton, "contact", virtualgdcontactHandler)
71 |
72 | // sync them up if need be set virtual same as actual
73 | if (realgdstate != virtualgdstate)
74 | {
75 | if (realgdstate == "open")
76 | {
77 | virtualgd.open()
78 | }
79 | else virtualgd.close()
80 | }
81 | }
82 |
83 | def updated()
84 | {
85 | def realgdstate = sensor.currentContact
86 | def virtualgdstate = virtualgd.currentContact
87 | //log.debug "in updated ... current state= $realgdstate"
88 | //log.debug "in updated ... gd state= $virtualgd.currentContact"
89 |
90 |
91 | unsubscribe()
92 | subscribe(sensor, "contact", contactHandler)
93 | subscribe(virtualgdbutton, "contact", virtualgdcontactHandler)
94 |
95 | // sync them up if need be set virtual same as actual
96 | if (realgdstate != virtualgdstate)
97 | {
98 | if (realgdstate == "open")
99 | {
100 | log.debug "opening virtual door"
101 | mysend("virtualgd.displayName Opened!")
102 | virtualgd.open()
103 | }
104 | else {
105 | virtualgd.close()
106 | log.debug "closing virtual door"
107 | mysend("$virtualgd.displayName Closed!")
108 | }
109 | }
110 | // for debugging and testing uncomment temperatureHandlerTest()
111 | }
112 |
113 | def contactHandler(evt)
114 | {
115 | def virtualgdstate = virtualgd.currentContact
116 | // how to determine which contact
117 | //log.debug "in contact handler for actual door open/close event. event = $evt"
118 |
119 | if("open" == evt.value)
120 | {
121 | // contact was opened, turn on a light maybe?
122 | log.debug "Contact is in ${evt.value} state"
123 | // reset virtual door if necessary
124 | if (virtualgdstate != "open")
125 | {
126 | mysend("$virtualgd.displayName Opened Manually syncing with Virtual Device!")
127 | virtualgd.open()
128 | }
129 | }
130 | if("closed" == evt.value)
131 | {
132 | // contact was closed, turn off the light?
133 | log.debug "Contact is in ${evt.value} state"
134 | //reset virtual door
135 | if (virtualgdstate != "closed")
136 | {
137 | mysend("$virtualgd.displayName Closed Manually syncing with Virtual Device!")
138 | virtualgd.close()
139 | }
140 | }
141 | }
142 |
143 | def virtualgdcontactHandler(evt) {
144 | // how to determine which contact
145 | def realgdstate = sensor.currentContact
146 | //log.debug "in virtual gd contact/button handler event = $evt"
147 | //log.debug "in virtualgd contact handler check timeout = $checkTimeout"
148 |
149 | if("open" == evt.value)
150 | {
151 | // contact was opened, turn on a light maybe?
152 | log.debug "Contact is in ${evt.value} state"
153 | // check to see if door is not in open state if so open
154 | if (realgdstate != "open")
155 | {
156 | log.debug "opening real gd to correspond with button press"
157 | mysend("$virtualgd.displayName Opened syncing with Actual Device!")
158 | opener.on()
159 | runIn(checkTimeout, checkIfActuallyOpened)
160 |
161 | }
162 | }
163 | if("closed" == evt.value)
164 | {
165 | // contact was closed, turn off the light?
166 | log.debug "Contact is in ${evt.value} state"
167 | if (realgdstate != "closed")
168 | {
169 | log.debug "closing real gd to correspond with button press"
170 | mysend("$virtualgd.displayName Closed syncing with Actual Device!")
171 | closer.on()
172 | runIn(checkTimeout, checkIfActuallyClosed)
173 | }
174 | }
175 | }
176 |
177 | private mysend(msg) {
178 | if (location.contactBookEnabled) {
179 | log.debug("sending notifications to: ${recipients?.size()}")
180 | sendNotificationToContacts(msg, recipients)
181 | }
182 | else {
183 | if (sendPushMessage) {
184 | log.debug("sending push message")
185 | sendPushMessage.deviceNotification(msg)
186 | }
187 |
188 |
189 | }
190 |
191 | log.debug msg
192 | }
193 |
194 |
195 | def checkIfActuallyClosed()
196 | {
197 | def realgdstate = sensor.currentContact
198 | def virtualgdstate = virtualgd.currentContact
199 | //log.debug "in checkifopen ... current state= $realgdstate"
200 | //log.debug "in checkifopen ... gd state= $virtualgd.currentContact"
201 |
202 |
203 | // sync them up if need be set virtual same as actual
204 | if (realgdstate == "open" && virtualgdstate == "closed")
205 | {
206 | log.debug "opening virtual door as it didnt close.. beam probably crossed"
207 | mysend("Resetting $virtualgd.displayName to Open as real device didn't close (beam probably crossed)!")
208 | virtualgd.open()
209 | }
210 | }
211 |
212 |
213 |
214 | def checkIfActuallyOpened()
215 | {
216 | def realgdstate = sensor.currentContact
217 | def virtualgdstate = virtualgd.currentContact
218 | //log.debug "in checkifopen ... current state= $realgdstate"
219 | //log.debug "in checkifopen ... gd state= $virtualgd.currentContact"
220 |
221 |
222 | // sync them up if need be set virtual same as actual
223 | if (realgdstate == "closed" && virtualgdstate == "open")
224 | {
225 | log.debug "opening virtual door as it didnt open.. track blocked?"
226 | mysend("Resetting $virtualgd.displayName to Closed as real device didn't open! (track blocked?)")
227 | virtualgd.close()
228 | }
229 | }
230 |
--------------------------------------------------------------------------------
/washingmachine.json:
--------------------------------------------------------------------------------
1 | {"deviceReplacements":{"441":{"deviceName":"Zooz Power Switch","deviceLabel":"Washing Machine","deviceTypeName":"Zooz Power Switch","deviceTypeNamespace":"hubitat"},"90":{"deviceName":"AlexaTTS-All Echos","deviceLabel":"AlexaTTS All Echos","deviceTypeName":"Child Alexa TTS","deviceTypeNamespace":"ogiewon"},"14":{"deviceName":"LGK ATT Sendmail","deviceLabel":"Att Txt gateway Sendmail","deviceTypeName":"LGK Sendmail V2","deviceTypeNamespace":"lgkapps"}},"appReplacements":{"987":{"appTypeName":"Rule-4.1","appTypeNamespace":"hubitat","appName":"Rule-4.1","appLabel":"Washing Machine is Done","parentAppTypeName":"Rule Machine","parentAppLabel":"Rule Machine","singleInstance":false}},"appData":{"987":{"state":{"actionListMain":["2","3","4"],"connectors":{},"actionDone":true,"hasRuleAct":false,"selectActionsParams":{"thisStr":"Main","label":"Washing Machine is Done"},"editCondIf":null,"waitDone":{"Main.2":{"3":true},"Main.1":{"1":true,"2":true},"Main.3":{"4":true}},"usesTime":false,"trigCustoms":[],"repeating":[],"capabDone":true,"lastEvtName":"Washing Machine","skippingMain":false,"locationBlocked":[],"ndx.false":2,"lvList":[],"ruleNdx":1,"timeTriggers":[],"allVarsO":["TeslaChargeLimit","TeslaTemp","WateringTime"],"actLabelIndent":"","howManyT":7,"subscribedVariables":[],"certainTimes":[],"prevState":{"441":0.000,"PB":"true"},"capabstrue":{"-4.true":{},"1.true":"Power level of Washing Machine(18.561) reports >= 300.0","-3.true":{},"2.true":{},"-1.true":{},"-2.true":{}},"installedCapabs":["Variable","Polling","PowerMeter","PushableButton","IlluminanceMeasurement","CarbonMonoxideDetector","FanControl","ReleasableButton","HealthCheck","Battery","Outlet","Indicator","Valve","MotionSensor","Alarm","SpeechSynthesis","ColorTemperature","PresenceSensor","SmokeDetector","Thermostat","DoorControl","AccelerationSensor","Refresh","Light","RelativeHumidityMeasurement","Initialize","ThreeAxis","ThermostatMode","EnergyMeter","TamperAlert","Telnet","ThermostatSetpoint","ColorMode","UltravioletIndex","TemperatureMeasurement","GarageDoorControl","Lock","Notification","CarbonDioxideMeasurement","HoldableButton","SwitchLevel","WaterSensor","Tone","Switch","ChangeLevel","Configuration","PressureMeasurement","Actuator","Sensor","ContactSensor","LockCodes","ColorControl","VoltageMeasurement","DoubleTapableButton","PowerSource"],"lastEvtDate":"25-Mar-2021","actionsMain":{"2":{"wait":[3],"delay":"","modes":{},"method":"getWaitEvents","indent":"","rule":0,"label":"Wait for event: Power level of Washing Machine(0.000) is <= 4.0\\n","cond":0},"3":{"wait":[4],"delay":"0:02:00","modes":{},"method":"getWaitEvents","indent":"","rule":0,"label":"Wait for event: --> elapsed time: 0:02:00\\n","cond":0},"4":{"wait":null,"delay":"","modes":{},"method":"getMsg","indent":"","rule":0,"label":"Notify Att Txt gateway Sendmail and Speak on AlexaTTS All Echos: 'Washing Machine is Done!'\\n","cond":0}},"nestedInIf":[],"actNdx":5,"lastEvtValue":0,"installed":true,"waitEvents":[],"private":"true","waitNdx":{"Main.2":[3],"Main.1":[1,2],"Main.3":[4]},"gvList":["TeslaChargeLimit","TeslaTemp","WateringTime"],"hasDevice":null,"ndx.true":2,"allVars":{"WateringTime":{"val":2,"type":"Number"},"TeslaChargeLimit":{"val":90,"type":"Number"},"TeslaTemp":{"val":67,"type":"Number"}},"simpleCond":false,"nestedRepIf":[],"nestedBlockMain":[],"lastEvtTime":"04:04 PM","waitMethod":"allHandlerW","cutAction":[],"stopped":false,"nestedIfMain":[],"nestedLabel":[],"paramNdx":1,"lastEvtDevId":"441","howMany":12,"varUseList":{},"waitCondNdx":5,"token":0,"nestedSkipAllMain":[],"capabsfalse":{"1.false":"Power level of Washing Machine(16.355) reports >= 80.0"},"timeTriggersW":{},"timeFormat":"hh:mm a","waitConds":[]},"appSettings":[{"deviceList":null,"multiple":false,"name":"tCapab1","type":"enum","value":"Power meter"},{"deviceList":null,"multiple":false,"name":"istVar-3","type":"bool","value":""},{"deviceList":null,"multiple":false,"name":"tCapab2","type":"enum","value":""},{"deviceList":null,"multiple":false,"name":"istVar-1","type":"bool","value":""},{"deviceList":null,"multiple":false,"name":"delayMinMain.3","type":"number","value":"2"},{"deviceList":null,"multiple":false,"name":"actionDone","type":"button","value":""},{"deviceList":{"441":null},"multiple":true,"name":"tDev-1","type":"capability.powerMeter","value":null},{"deviceList":{"441":null},"multiple":true,"name":"tDev-3","type":"capability.powerMeter","value":null},{"deviceList":null,"multiple":false,"name":"actSubTypeMain.3","type":"enum","value":"Wait for Events"},{"deviceList":null,"multiple":false,"name":"actSubTypeMain.4","type":"enum","value":"Send or Speak a Message"},{"deviceList":null,"multiple":false,"name":"pausRule","type":"button","value":""},{"deviceList":null,"multiple":false,"name":"actSubTypeMain.2","type":"enum","value":"Wait for Events"},{"deviceList":null,"multiple":false,"name":"insertAct","type":"enum","value":""},{"deviceList":null,"multiple":false,"name":"state1","type":"decimal","value":"80.0"},{"deviceList":null,"multiple":false,"name":"delaySecMain.3","type":"text","value":""},{"deviceList":null,"multiple":false,"name":"tstate1","type":"decimal","value":"300"},{"deviceList":null,"multiple":false,"name":"refreshActions","type":"button","value":""},{"deviceList":null,"multiple":false,"name":"dValues","type":"bool","value":"true"},{"deviceList":null,"multiple":false,"name":"doneWaits","type":"button","value":""},{"deviceList":null,"multiple":false,"name":"istVar1","type":"bool","value":""},{"deviceList":null,"multiple":false,"name":"hasAll","type":"button","value":""},{"deviceList":null,"multiple":false,"name":"anotherWait","type":"button","value":""},{"deviceList":null,"multiple":false,"name":"cancelCapab","type":"button","value":""},{"deviceList":null,"multiple":false,"name":"istDev-1","type":"bool","value":"false"},{"deviceList":{"441":null},"multiple":true,"name":"rDev1","type":"capability","value":null},{"deviceList":null,"multiple":false,"name":"stopRule","type":"button","value":""},{"deviceList":null,"multiple":false,"name":"origLabel","type":"text","value":"Washing Machine is Done"},{"deviceList":null,"multiple":false,"name":"ReltDev1","type":"enum","value":">="},{"deviceList":null,"multiple":true,"name":"logging","type":"enum","value":"[\\"Actions\\",\\"App Events\\"]"},{"deviceList":null,"multiple":false,"name":"editCond","type":"enum","value":null},{"deviceList":null,"multiple":false,"name":"istDev-3","type":"bool","value":"false"},{"deviceList":null,"multiple":false,"name":"updateRule","type":"button","value":""},{"deviceList":{"90":null},"multiple":true,"name":"speakMain.4Device","type":"capability.speechSynthesis","value":null},{"deviceList":null,"multiple":false,"name":"runAction","type":"button","value":""},{"deviceList":null,"multiple":false,"name":"istDev1","type":"bool","value":"false"},{"deviceList":null,"multiple":false,"name":"delete","type":"enum","value":""},{"deviceList":{"441":null},"multiple":true,"name":"tDev1","type":"capability.powerMeter","value":null},{"deviceList":{"14":null},"multiple":true,"name":"noteMain.4","type":"capability.notification","value":null},{"deviceList":null,"multiple":false,"name":"rCapab1","type":"enum","value":"Power meter"},{"deviceList":null,"multiple":false,"name":"actionCancel","type":"button","value":""},{"deviceList":null,"multiple":false,"name":"ranMsgMain.4","type":"bool","value":""},{"deviceList":null,"multiple":false,"name":"RelrDev1","type":"enum","value":">="},{"deviceList":null,"multiple":false,"name":"ReltDev-1","type":"enum","value":"<="},{"deviceList":null,"multiple":false,"name":"editAct","type":"enum","value":""},{"deviceList":null,"multiple":false,"name":"delayHorMain.3","type":"number","value":""},{"deviceList":null,"multiple":false,"name":"tCapab-4","type":"enum","value":"Elapsed Time"},{"deviceList":null,"multiple":false,"name":"tCapab-3","type":"enum","value":"Power meter"},{"deviceList":null,"multiple":false,"name":"comments","type":"textarea","value":""},{"deviceList":null,"multiple":false,"name":"tCapab-2","type":"enum","value":"Elapsed Time"},{"deviceList":null,"multiple":false,"name":"ReltDev-3","type":"enum","value":"<="},{"deviceList":null,"multiple":false,"name":"tCapab-1","type":"enum","value":"Power meter"},{"deviceList":null,"multiple":false,"name":"cutAct","type":"enum","value":""},{"deviceList":null,"multiple":false,"name":"speakMain.4","type":"bool","value":"true"},{"deviceList":null,"multiple":false,"name":"delayActMain.3","type":"bool","value":"true"},{"deviceList":null,"multiple":false,"name":"tstate-1","type":"decimal","value":"4"},{"deviceList":null,"multiple":false,"name":"delayActMain.2","type":"bool","value":""},{"deviceList":null,"multiple":false,"name":"tstate-3","type":"decimal","value":"4"},{"deviceList":null,"multiple":false,"name":"delayActMain.4","type":"bool","value":""},{"deviceList":null,"multiple":false,"name":"actTypeMain.2","type":"enum","value":"Delay or Repeat Actions, Wait"},{"deviceList":null,"multiple":true,"name":"deleteAct","type":"enum","value":null},{"deviceList":null,"multiple":false,"name":"msgMain.4","type":"textarea","value":"Washing Machine is Done!"},{"deviceList":null,"multiple":false,"name":"actTypeMain.4","type":"enum","value":"Send, Speak or Log a Message, Send HTTP Request"},{"deviceList":null,"multiple":false,"name":"actTypeMain.3","type":"enum","value":"Delay or Repeat Actions, Wait"},{"deviceList":null,"multiple":false,"name":"actTypeMain.5","type":"enum","value":""}],"subscriptions":[{"handler":"allHandler","name":"power","type":"DEVICE","typeId":441,"typeName":"Washing Machine","filter":"true"}]}}}
2 |
--------------------------------------------------------------------------------
/wirelesstagdevice.groovy:
--------------------------------------------------------------------------------
1 | /**
2 | * Wireless Tag Generic
3 | *
4 | * Copyright 2014 Dave Swanson (swanny)
5 | *
6 | * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except
7 | * in compliance with the License. You may obtain a copy of the License at:
8 | *
9 | * http://www.apache.org/licenses/LICENSE-2.0
10 | *
11 | * Unless required by applicable law or agreed to in writing, software distributed under the License is distributed
12 | * on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License
13 | * for the specific language governing permissions and limitations under the License.
14 | */
15 | metadata {
16 | definition (name: 'Wireless Tag Generic', namespace: 'swanny', author: 'swanny') {
17 | capability 'Relative Humidity Measurement'
18 | capability 'Temperature Measurement'
19 | capability 'Illuminance Measurement'
20 | capability 'Battery'
21 | capability 'Refresh'
22 | capability 'Polling'
23 | capability 'Sensor'
24 |
25 | command 'generateEvent'
26 | command 'initialSetup'
27 |
28 | attribute 'tagType', 'string'
29 | attribute "lastUpdate", "string"
30 | attribute "lastTemperature", "number"
31 | attribute "temperatureChange", "number"
32 | attribute "signaldBm", "number"
33 | attribute "motionArmed", "string"
34 | attribute "signaldBm" , "number"
35 | }
36 |
37 |
38 | preferences {
39 | input("debug", "bool", title: "Enable logging?", required: true, defaultValue: false)
40 | input("descText", "bool", title: "Enable descriptionText logging?", required: true, defaultValue: false)
41 | }
42 | }
43 |
44 | // parse events into attributes
45 | void parse(String description) {
46 | log.debug "Parsing '${description}'"
47 | }
48 |
49 | // handle commands
50 | void poll() {
51 | log.debug 'poll'
52 | parent.pollChild(this)
53 | }
54 |
55 | void refresh() {
56 | log.debug 'refresh'
57 | parent.refreshChild(this)
58 | }
59 |
60 | def logsOff()
61 | {
62 | log.debug "Turning off Logging!"
63 | device.updateSetting("debug",[value:"false",type:"bool"])
64 | }
65 |
66 | void updated()
67 | {
68 |
69 | sendEvent(name: "temperatureChange", value: 0.00)
70 |
71 | if (debug)
72 | {
73 | log.debug "Turning off logging in 1/2 hour!"
74 | runIn(1800,logsOff)
75 | }
76 | }
77 |
78 | void initialSetup() {
79 | updated()
80 | }
81 |
82 | private Boolean attributeUpdateNumber(BigDecimal val, String attribute, String measure = null, Integer decimals = -1) {
83 | //
84 | // Only update "attribute" if different
85 | // Return true if "attribute" has actually been updated/created
86 | //
87 |
88 | // If rounding is required we use the Float one because the BigDecimal is not supported/not working on Hubitat
89 | if (debug) log.debug "in attr update number val [ $val attribute = $attribute"
90 |
91 | if (decimals >= 0) val = val.toFloat().round(decimals).toBigDecimal();
92 |
93 | BigDecimal integer = val.toBigInteger();
94 |
95 | // We don't strip zeros on an integer otherwise it gets converted to scientific exponential notation
96 | val = (val == integer)? integer: val.stripTrailingZeros();
97 |
98 | // Coerce Object -> BigDecimal
99 | if ((device.currentValue(attribute) as BigDecimal) != val) {
100 | if (measure) sendEvent(name: attribute, value: val, unit: measure);
101 | else sendEvent(name: attribute, value: val);
102 | return (true);
103 | }
104 |
105 | return (false);
106 | }
107 |
108 | void generateEvent(Map results) {
109 | if (debug) log.debug "parsing data $results"
110 |
111 | def devName = device.getLabel()
112 |
113 | if (debug) log.debug "parsing data $results"
114 |
115 | if (results) {
116 | results.each { name, value ->
117 | valueUnit = null
118 |
119 | switch (name) {
120 | case 'battery':
121 | case 'humidity':
122 | valueUnit = '%'
123 | break
124 | case 'illuminance':
125 | valueUnit = 'Lux'
126 | break
127 | }
128 |
129 | if (name == "signaldBm")
130 | {
131 | sendEvent(name: "signaldBm", value: value)
132 | }
133 |
134 | else if (name == 'temperature') {
135 |
136 | double tempValue = getTemperature(value)
137 | boolean isChange = isStateChange(device, name, tempValue.toString())
138 |
139 | BigDecimal degrees = tempValue.toBigDecimal();
140 |
141 | def lastTemp = (device.currentValue("temperature") as BigDecimal)
142 | BigDecimal change = 0.00
143 |
144 | if (lastTemp != null)
145 | change = (degrees - lastTemp as BigDecimal)
146 | else lastTemp = 0.00
147 |
148 | //if (debug) log.debug "name: $devName, isChange: $isChange"
149 | // if (device.currentState(name)?.value != tempValue) {
150 |
151 | String measure = "°F";
152 | if (getTemperatureScale() == 'C') measure = "°C";
153 |
154 | if (isChange)
155 | {
156 | def now = new Date().format('MM/dd/yyyy h:mm a',location.timeZone)
157 |
158 | sendEvent(name: "lastUpdate", value: now)
159 | sendEvent(name: name, value: tempValue, unit: measure, isStateChange: isChange, displayed: isChange)
160 | }
161 |
162 | attributeUpdateNumber(lastTemp,"lastTemperature",measure,1)
163 | Boolean hasChanged = (attributeUpdateNumber(degrees, "temperature", measure, 1))
164 |
165 | if (debug) log.debug "In update temp val = $tempValue, measure = $measure lastTemp = $lastTemp, change = $change, hasChanged = $hasChanged"
166 | if (descText) log.info "Tag ($devName) Update: $tempValue, change: $change"
167 | if (hasChanged == true)
168 | {
169 | sendEvent(name: "temperatureChange", value: change)
170 | }
171 | else
172 | {
173 | sendEvent(name: "temperatureChange", value: 0.00)
174 | }
175 | }
176 | else {
177 | boolean isChange = isStateChange(device, name, value.toString())
178 | // log.debug "name: $name, isChange: $isChange"
179 | // log.debug "Previous: ${device.currentState(name)?.value}, New: $value"
180 | // if (device.currentState(name)?.value == value) {
181 | // log.debug "It shouldn't be a state change..."
182 | // }
183 | // if (device.currentState(name)?.value != value) {
184 | if (isChange) {
185 | // log.debug "It's a state change!"
186 | if (valueUnit) {
187 | sendEvent(name: name, value: value, unit: valueUnit, isStateChange: isChange, displayed: isChange)
188 | } else {
189 | sendEvent(name: name, value: value, isStateChange: isChange, displayed: isChange)
190 | }
191 | }
192 | }
193 | }
194 | }
195 | }
196 |
197 | double getTemperature(double value) {
198 | double returnVal = value
199 | if (getTemperatureScale() == 'C') {
200 | returnVal = value
201 | } else {
202 | returnVal = (celsiusToFahrenheit(value) as double)
203 | }
204 | return returnVal.round(1)
205 | }
206 |
--------------------------------------------------------------------------------
/wirelesstagsensor.groovy:
--------------------------------------------------------------------------------
1 | /**
2 | * Wireless Sensor Tag Motion Device Driver
3 | *
4 | * author: Bart Hazer
5 | *
6 | * Modified from https://github.com/st-swanny/smartthings/tree/master/WirelessTags which had the following license:
7 | *
8 | * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except
9 | * in compliance with the License. You may obtain a copy of the License at:
10 | *
11 | * http://www.apache.org/licenses/LICENSE-2.0
12 | *
13 | * Unless required by applicable law or agreed to in writing, software distributed under the License is distributed
14 | * on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License
15 | * for the specific language governing permissions and limitations under the License.
16 | *
17 | */
18 | metadata {
19 | definition (name: "Wireless Sensor Tag", namespace: "bhazer", author: "Bart Hazer") {
20 | capability "Presence Sensor"
21 | capability "Acceleration Sensor"
22 | capability "Motion Sensor"
23 | capability "Sensor"
24 | capability "Tone"
25 | capability "Relative Humidity Measurement"
26 | capability "Temperature Measurement"
27 | capability "Signal Strength"
28 | capability "Battery"
29 | capability "Refresh"
30 | capability "Polling"
31 | capability "Switch"
32 | capability "Contact Sensor"
33 | capability "Illuminance Measurement"
34 |
35 | command "generateEvent"
36 | // lgk arm and disarm motion are not implemented in parent so comment out
37 | //command "armMotion"
38 | //command "disarmMotion"
39 |
40 | command "setDoorClosedPosition"
41 | command "initialSetup"
42 |
43 | attribute "tagType","string"
44 | attribute "motionMode", "string"
45 | attribute "motion", "string"
46 | attribute "motionArmed", "string"
47 | attribute "signaldBm" , "number"
48 | }
49 |
50 | simulator {
51 | // TODO: define status and reply messages here
52 | }
53 |
54 |
55 | preferences {
56 | input "motionDecay", "number", title: "Motion Rearm Time", description: "Seconds (min 60 for now)", defaultValue: 60, required: true, displayDuringSetup: true
57 | input("debug", "bool", title: "Enable logging?", required: true, defaultValue: false)
58 | }
59 | }
60 |
61 | // parse events into attributes
62 | def parse(String description) {
63 | if (debug) log.debug "Parsing '${description}'"
64 | }
65 |
66 | // handle commands
67 | def beep() {
68 | if (debug) log.debug "Executing 'beep'"
69 | parent.beep(this, 3)
70 | }
71 |
72 | def on() {
73 | if (debug) log.debug "Executing 'on'"
74 | parent.light(this, true, false)
75 | sendEvent(name: "switch", value: "on")
76 | }
77 |
78 | def off() {
79 | if (debug) log.debug "Executing 'off'"
80 | parent.light(this, false, false)
81 | sendEvent(name: "switch", value: "off")
82 | }
83 |
84 | void poll() {
85 | log.debug "poll"
86 | parent.pollChild(this)
87 | }
88 |
89 | def refresh() {
90 | log.debug "refresh"
91 | parent.refreshChild(this)
92 | }
93 |
94 | def armMotion() {
95 | log.trace "armMotion"
96 | parent.armMotion(this)
97 | }
98 |
99 | def disarmMotion() {
100 | log.trace "disarmMotion"
101 | parent.disarmMotion(this)
102 | }
103 |
104 | def setDoorClosedPosition() {
105 | log.debug "set door closed pos"
106 | parent.disarmMotion(this)
107 | parent.armMotion(this)
108 | }
109 |
110 | def initialSetup() {
111 | }
112 |
113 | def getMotionDecay() {
114 | def timer = (settings.motionDecay != null) ? settings.motionDecay.toInteger() : 60
115 | return timer
116 | }
117 |
118 | def updated() {
119 | log.trace "updated"
120 | }
121 |
122 | void generateEvent(Map results) {
123 | if (debug) log.debug "parsing data $results"
124 |
125 | if(results) {
126 | results.each { name, value ->
127 | if (name == "water") {
128 | // Doesn't have this capability. Do nothing.
129 | } else if (name == "temperature") {
130 | sendEvent(name: name, value: getTemperature(value), unit: getTemperatureScale())
131 | } else {
132 | //log.debug "name = $name, value = $value"
133 | sendEvent(name: name, value: value)
134 | }
135 | }
136 | }
137 | }
138 |
139 | def getTemperature(value) {
140 | def celsius = value
141 | if(getTemperatureScale() == "C"){
142 | return celsius
143 | } else {
144 | return celsiusToFahrenheit(celsius).toDouble().round(1)
145 | }
146 | }
147 |
--------------------------------------------------------------------------------
/wirelesstagwater.groovy:
--------------------------------------------------------------------------------
1 | /**
2 | * Wireless Tag Water
3 | *
4 | * Copyright 2014 Dave Swanson (swanny)
5 | *
6 | * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except
7 | * in compliance with the License. You may obtain a copy of the License at:
8 | *
9 | * http://www.apache.org/licenses/LICENSE-2.0
10 | *
11 | * Unless required by applicable law or agreed to in writing, software distributed under the License is distributed
12 | * on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License
13 | * for the specific language governing permissions and limitations under the License.,
14 | * lgk remove smartthings crap and add capability water sensor and set wet if greater than user specified level and dry otherwise.
15 | * also add last update and signal dbm attr and set tagtype
16 | * also add debug and text logging and remove unused capilities.
17 | */
18 | metadata {
19 | definition (name: "Wireless Tag Water", namespace: "bhazer", author: "swanny") {
20 | capability "Water Sensor"
21 | // capability "Presence Sensor"
22 | capability "Relative Humidity Measurement"
23 | capability "Temperature Measurement"
24 | capability "Sensor"
25 | capability "Battery"
26 | capability "Refresh"
27 | capability "Polling"
28 |
29 | command "generateEvent"
30 | command "initialSetup"
31 |
32 | attribute 'tagType', 'string'
33 | attribute "lastUpdate", "string"
34 | attribute "signaldBm", "number"
35 | }
36 |
37 | preferences {
38 | input("debug", "bool", title: "Enable logging?", required: true, defaultValue: false)
39 | input("triggerLevel", "number", title: "Humidity level at which to trigger wet, and dry below?", required: true, defaultValue: 75)
40 | }
41 |
42 |
43 | }
44 |
45 |
46 | // parse events into attributes
47 | def parse(String description) {
48 | if (debug) log.debug "Parsing '${description}'"
49 | }
50 |
51 | void poll() {
52 | log.debug "poll"
53 | parent.pollChild(this)
54 | }
55 |
56 | def refresh() {
57 | log.debug "refresh"
58 | parent.refreshChild(this)
59 | }
60 |
61 | def initialSetup() {
62 |
63 | }
64 |
65 | def updated() {
66 | log.trace "updated"
67 | def tl = triggerLevel
68 | log.debug "TriggerLevel = $tl"
69 | sendEvent(name: "tagType", value: "Water")
70 | }
71 |
72 | void generateEvent(Map results)
73 | {
74 | if (debug) log.debug "parsing data $results"
75 | def tl = triggerLevel
76 | if(results)
77 | {
78 | results.each { name, value ->
79 |
80 | if (name=="temperature") {
81 | def tempValue = getTemperature(value)
82 | sendEvent(name: name, value: tempValue, unit: getTemperatureScale())
83 | }
84 | else {
85 | // log.debug "name = $name , value = $value"
86 |
87 | if (name =="humidity")
88 | {
89 | if (debug)
90 | {
91 | log.debug "TrigerLevel = $tl"
92 | log.debug "humidity value = $value"
93 | }
94 |
95 | if (value >= tl)
96 | {
97 | sendEvent(name: "water", value: "wet")
98 | log.debug "Alert Device $name is WET, humidity >= $triggerLevel!"
99 | }
100 | else {
101 | sendEvent(name: "water", value: "dry")
102 | log.debug "Device $name is now dry!"
103 |
104 | }
105 | }
106 | sendEvent(name: name, value: value)
107 | }
108 | }
109 |
110 | def now = new Date().format('MM/dd/yyyy h:mm a',location.timeZone)
111 | sendEvent(name: "lastUpdate", value: now)
112 | sendEvent(name: name, value: tempValue, unit: measure, isStateChange: isChange, displayed: isChange)
113 | sendEvent(name: "tagType", value: "Water")
114 |
115 | }
116 | }
117 |
118 | def getTemperature(value) {
119 | def celsius = value
120 | if(getTemperatureScale() == "C"){
121 | return celsius
122 | } else {
123 | return celsiusToFahrenheit(celsius).toDouble().round(1)
124 | }
125 | }
126 |
--------------------------------------------------------------------------------
/zigbeewhitecolortemp.groovy:
--------------------------------------------------------------------------------
1 | /**
2 | * Copyright 2015 SmartThings
3 | *
4 | * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except
5 | * in compliance with the License. You may obtain a copy of the License at:
6 | *
7 | * http://www.apache.org/licenses/LICENSE-2.0
8 | *
9 | * Unless required by applicable law or agreed to in writing, software distributed under the License is distributed
10 | * on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License
11 | *
12 | * ZigBee White Color Temperature Bulb
13 | *
14 | * Author: SmartThings
15 | * Date: 2015-09-22
16 | */
17 |
18 | metadata {
19 | definition (name: "ZigBee White Color Temperature Bulb - LGK Modified", namespace: "smartthings", author: "SmartThings") {
20 |
21 | capability "Actuator"
22 | capability "Color Temperature"
23 | capability "Configuration"
24 | capability "Refresh"
25 | capability "Switch"
26 | capability "Switch Level"
27 |
28 | attribute "colorName", "string"
29 | command "setGenericName"
30 |
31 | attribute "CoolWhite", "string"
32 | attribute "SoftWhite", "string"
33 | attribute "Moonlight", "string"
34 | attribute "Daylight", "string"
35 |
36 | command "setColorSoftWhite"
37 | command "setColorMoonlight"
38 | command "setColorCoolWhite"
39 | command "setColorDaylight"
40 |
41 | fingerprint profileId: "0104", inClusters: "0000, 0003, 0004, 0005, 0006, 0008, 0300", outClusters: "0019"
42 | fingerprint profileId: "0104", inClusters: "0000, 0003, 0004, 0005, 0006, 0008, 0300, 0B04", outClusters: "0019"
43 | fingerprint profileId: "0104", inClusters: "0000, 0003, 0004, 0005, 0006, 0008, 0300, 0B04, FC0F", outClusters: "0019", manufacturer: "OSRAM", model: "LIGHTIFY BR Tunable White", deviceJoinName: "OSRAM LIGHTIFY LED Flood BR30 Tunable White"
44 | fingerprint profileId: "0104", inClusters: "0000, 0003, 0004, 0005, 0006, 0008, 0300, 0B04, FC0F", outClusters: "0019", manufacturer: "OSRAM", model: "LIGHTIFY RT Tunable White", deviceJoinName: "OSRAM LIGHTIFY LED Recessed Kit RT 5/6 Tunable White"
45 | fingerprint profileId: "0104", inClusters: "0000, 0003, 0004, 0005, 0006, 0008, 0300, 0B04, FC0F", outClusters: "0019", manufacturer: "OSRAM", model: "Classic A60 TW", deviceJoinName: "OSRAM LIGHTIFY LED Tunable White 60W"
46 | fingerprint profileId: "0104", inClusters: "0000, 0003, 0004, 0005, 0006, 0008, 0300, 0B04, FC0F", outClusters: "0019", manufacturer: "OSRAM", model: "LIGHTIFY A19 Tunable White", deviceJoinName: "OSRAM LIGHTIFY LED Tunable White 60W"
47 | }
48 |
49 | // UI tile definitions
50 | tiles(scale: 2) {
51 | multiAttributeTile(name:"switch", type: "lighting", width: 6, height: 4, canChangeIcon: true){
52 | tileAttribute ("device.switch", key: "PRIMARY_CONTROL") {
53 | attributeState "on", label:'${name}', action:"switch.off", icon:"st.switches.light.on", backgroundColor:"#79b821", nextState:"turningOff"
54 | attributeState "off", label:'${name}', action:"switch.on", icon:"st.switches.light.off", backgroundColor:"#ffffff", nextState:"turningOn"
55 | attributeState "turningOn", label:'${name}', action:"switch.off", icon:"st.switches.light.on", backgroundColor:"#79b821", nextState:"turningOff"
56 | attributeState "turningOff", label:'${name}', action:"switch.on", icon:"st.switches.light.off", backgroundColor:"#ffffff", nextState:"turningOn"
57 | }
58 | tileAttribute ("device.level", key: "SLIDER_CONTROL") {
59 | attributeState "level", action:"switch level.setLevel"
60 | }
61 | // lgk color name not working in latest android version as secondary control so add as std tile for now
62 | // this is why it was not added as a tile below in default driver
63 | // tileAttribute ("device.colorName", key: "SECONDARY_CONTROL") {
64 | // attributeState "colorName", label:'${currentValue}'
65 | // }
66 | }
67 |
68 | standardTile("refresh", "device.refresh", inactiveLabel: false, decoration: "flat", width: 2, height: 2) {
69 | state "default", label:"", action:"refresh.refresh", icon:"st.secondary.refresh"
70 | }
71 |
72 | controlTile("colorTempSliderControl", "device.colorTemperature", "slider", width: 4, height: 2, inactiveLabel: false, range:"(2700..6500)") {
73 | state "colorTemperature", action:"color temperature.setColorTemperature"
74 | }
75 | valueTile("colorTemp", "device.colorTemperature", inactiveLabel: false, decoration: "flat", width: 2, height: 2) {
76 | state "colorTemperature", label: '${currentValue} K'
77 | }
78 | valueTile("colorName", "device.colorName", inactiveLabel: false, decoration: "flat", width: 2, height: 2) {
79 | state "colorName", label: '${currentValue}'
80 | }
81 |
82 |
83 |
84 |
85 | // lgk new tiles
86 | valueTile("SoftWhite", "device.SoftWhite", width: 2, height: 2) {
87 | state "unlite", label:'Soft White',backgroundColor: "#ffffff", action: "setColorSoftWhite"
88 | state "lite", label:'Soft White',backgroundColor: "#4f9558"
89 | }
90 |
91 | valueTile("Moonlight", "device.Moonlight", width: 2, height: 2) {
92 | state "unlite", label:'Moonlight',backgroundColor: "#ffffff", action: "setColorMoonlight"
93 | state "lite", label:'Moonlight',backgroundColor: "#4f9558"
94 | }
95 |
96 | valueTile("CoolWhite", "device.CoolWhite", width: 2, height: 2) {
97 | state "unlite", label:'Cool White',backgroundColor: "#ffffff", action: "setColorCoolWhite"
98 | state "lite", label:'Cool White',backgroundColor: "#4f9558"
99 | }
100 |
101 | valueTile("Daylight", "device.Daylight", width: 2, height: 2) {
102 | state "unlite", label:'Daylight',backgroundColor: "#ffffff", action: "setColorDaylight"
103 | state "lite", label:'Daylight',backgroundColor: "#4f9558"
104 | }
105 |
106 | // lgk end new tiles
107 | main(["switch"])
108 | details(["switch", "colorTempSliderControl", "colorTemp","colorName","SoftWhite","Moonlight",
109 | "refresh","CoolWhite","Daylight"])
110 | }
111 | }
112 |
113 | // Parse incoming device messages to generate events
114 | def parse(String description) {
115 | // log.debug "description is $description"
116 | def event = zigbee.getEvent(description)
117 | if (event) {
118 | sendEvent(event)
119 | }
120 | else {
121 | log.warn "DID NOT PARSE MESSAGE for description : $description"
122 | //log.debug zigbee.parseDescriptionAsMap(description)
123 | }
124 | }
125 |
126 | def off() {
127 | log.debug "turned off"
128 | zigbee.off()
129 | }
130 |
131 | def on() {
132 | log.debug "turned on"
133 | zigbee.on()
134 | }
135 |
136 | def setLevel(value) {
137 | log.debug "set level"
138 | zigbee.setLevel(value)
139 | }
140 |
141 | def refresh() {
142 | zigbee.onOffRefresh() + zigbee.levelRefresh() + zigbee.colorTemperatureRefresh() + zigbee.onOffConfig() + zigbee.levelConfig() + zigbee.colorTemperatureConfig()
143 | }
144 |
145 | def configure() {
146 | log.debug "Configuring Reporting and Bindings."
147 | zigbee.onOffConfig() + zigbee.levelConfig() + zigbee.colorTemperatureConfig() + zigbee.onOffRefresh() + zigbee.levelRefresh() + zigbee.colorTemperatureRefresh()
148 | }
149 |
150 | def setColorTemperature(value) {
151 | log.debug "in set color temp value = $value"
152 | sendEvent(name: "colorTemperature", value: value, displayed:false)
153 | setGenericName(value)
154 | zigbee.setColorTemperature(value)
155 |
156 | }
157 |
158 | //Naming based on the wiki article here: http://en.wikipedia.org/wiki/Color_temperature
159 | def setGenericName(value){
160 | if (value != null) {
161 | def genericName = "White"
162 | if (value < 3300) {
163 | genericName = "Soft White"
164 | } else if (value < 4150) {
165 | genericName = "Moonlight"
166 | } else if (value <= 5000) {
167 | genericName = "Cool White"
168 | } else if (value >= 5000) {
169 | genericName = "Daylight"
170 | }
171 | log.debug "in set generic name setting colorname to $genericName"
172 |
173 | sendEvent(name: "colorName", value: genericName)
174 | }
175 | }
176 |
177 |
178 | // lgk new code
179 | def setColorSoftWhite()
180 | {
181 | log.debug "Soft White tile Pressed!"
182 | setColorTemperature(3000)
183 |
184 | sendEvent(name: "CoolWhite", value: "unlite")
185 | sendEvent(name: "SoftWhite", value: "lite")
186 | sendEvent(name: "Moonlight", value: "unlite")
187 | sendEvent(name: "Daylight", value: "unlite")
188 | }
189 |
190 | def setColorMoonlight()
191 | {
192 | log.debug "Moonlight tile Pressed!"
193 | setColorTemperature(4100)
194 |
195 | sendEvent(name: "CoolWhite", value: "unlite")
196 | sendEvent(name: "SoftWhite", value: "unlite")
197 | sendEvent(name: "Moonlight", value: "lite")
198 | sendEvent(name: "Daylight", value: "unlite")
199 | }
200 |
201 | def setColorCoolWhite()
202 | {
203 | log.debug "Cool White tile Pressed!"
204 | setColorTemperature(4900)
205 |
206 | sendEvent(name: "CoolWhite", value: "lite")
207 | sendEvent(name: "SoftWhite", value: "unlite")
208 | sendEvent(name: "Moonlight", value: "unlite")
209 | sendEvent(name: "Daylight", value: "unlite")
210 | }
211 |
212 | def setColorDaylight()
213 | {
214 | log.debug "Daylight tile Pressed!"
215 | setColorTemperature(6400)
216 |
217 | sendEvent(name: "CoolWhite", value: "unlite")
218 | sendEvent(name: "SoftWhite", value: "unlite")
219 | sendEvent(name: "Moonlight", value: "unlite")
220 | sendEvent(name: "Daylight", value: "lite")
221 | }
222 |
223 |
224 |
--------------------------------------------------------------------------------
/zw15sm.groovey:
--------------------------------------------------------------------------------
1 | /**
2 | * Copyright 2015 SmartThings
3 | *
4 | * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except
5 | * in compliance with the License. You may obtain a copy of the License at:
6 | *
7 | * http://www.apache.org/licenses/LICENSE-2.0
8 | *
9 | * Unless required by applicable law or agreed to in writing, software distributed under the License is distributed
10 | * on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License
11 | * for the specific language governing permissions and limitations under the License.
12 | * modified by lgkahn v1 for control of the on/off light
13 | * the lite when on/off is not the normal parameter settings of the config class and there also
14 | * is no never lite option.. So custom code for this device only.
15 | *
16 | */
17 | metadata {
18 | definition (name: "Enerwave ZW15SM Metering Switch", namespace: "smartthings", author: "LGKahn") {
19 | capability "Energy Meter"
20 | capability "Actuator"
21 | capability "Switch"
22 | capability "Power Meter"
23 | capability "Polling"
24 | capability "Refresh"
25 | capability "Configuration"
26 | capability "Sensor"
27 | capability "Indicator"
28 |
29 | fingerprint inClusters: "0x25,0x32"
30 | }
31 |
32 |
33 | preferences {
34 | input("ReportTime", "number", title: "Report Timeout Interval?", description: "The time in minutes after which an update is sent?", defaultValue: 3, required: false)
35 | input("WattageChange", "number", title: "Wattage change before reporting: 1-25?", description: "The minimum wattage change before reporting?",defaultValue: 15, required: false)
36 | }
37 |
38 | // simulator metadata
39 | simulator {
40 | status "on": "command: 2003, payload: FF"
41 | status "off": "command: 2003, payload: 00"
42 |
43 | for (int i = 0; i <= 10000; i += 1000) {
44 | status "power ${i} W": new hubitat.zwave.Zwave().meterV1.meterReport(
45 | scaledMeterValue: i, precision: 3, meterType: 4, scale: 2, size: 4).incomingMessage()
46 | }
47 | for (int i = 0; i <= 100; i += 10) {
48 | status "energy ${i} kWh": new hubitat.zwave.Zwave().meterV1.meterReport(
49 | scaledMeterValue: i, precision: 3, meterType: 0, scale: 0, size: 4).incomingMessage()
50 | }
51 |
52 | // reply messages
53 | reply "2001FF,delay 100,2502": "command: 2503, payload: FF"
54 | reply "200100,delay 100,2502": "command: 2503, payload: 00"
55 |
56 | }
57 |
58 | // tile definitions
59 | tiles {
60 | standardTile("switch", "device.switch", width: 2, height: 2, canChangeIcon: true) {
61 | state "on", label: '${name}', action: "switch.off", icon: "st.switches.switch.on", backgroundColor: "#79b821"
62 | state "off", label: '${name}', action: "switch.on", icon: "st.switches.switch.off", backgroundColor: "#ffffff"
63 | }
64 | valueTile("power", "device.power") {
65 | state "default", label:'${currentValue} W'
66 | }
67 | valueTile("energy", "device.energy") {
68 | state "default", label:'${currentValue} kWh'
69 | }
70 | standardTile("reset", "device.energy", inactiveLabel: false, decoration: "flat") {
71 | state "default", label:'reset kWh', action:"reset"
72 | }
73 | standardTile("refresh", "device.power", inactiveLabel: false, decoration: "flat") {
74 | state "default", label:'', action:"refresh.refresh", icon:"st.secondary.refresh"
75 | }
76 |
77 | standardTile("indicatorStatus", "device.indicatorStatus", width: 1, height: 1, inactiveLabel: false, decoration: "flat") {
78 | state "when off", action:"indicator.indicatorWhenOn", icon:"st.indicators.lit-when-off"
79 | state "when on", action:"indicator.indicatorWhenOff", icon:"st.indicators.lit-when-on"
80 |
81 | }
82 | main(["switch","power","energy"])
83 | details(["switch","power","energy","indicatorStatus","refresh","reset"])
84 | }
85 | }
86 |
87 |
88 | def parse(String description) {
89 | def result = null
90 | // log.debug "in parse desc = $description"
91 |
92 | if(description == "updated") return
93 | def cmd = zwave.parse(description, [0x20: 1, 0x32: 1, 0x72: 2])
94 | if (cmd) {
95 | result = zwaveEvent(cmd)
96 | }
97 | return result
98 | }
99 |
100 |
101 |
102 | def zwaveEvent(hubitat.zwave.commands.meterv1.MeterReport cmd) {
103 | //log.debug "in meter report cmd = $cmd "
104 | if (cmd.scale == 0) {
105 | log.debug "got energy/kWh = $cmd.scaledMeterValue"
106 | createEvent(name: "energy", value: cmd.scaledMeterValue, unit: "kWh")
107 | } else if (cmd.scale == 1) {
108 | createEvent(name: "energy", value: cmd.scaledMeterValue, unit: "kVAh")
109 | } else if (cmd.scale == 2) {
110 | log.debug "got power/W = $cmd.scaledMeterValue"
111 | createEvent(name: "power", value: Math.round(cmd.scaledMeterValue), unit: "W")
112 | }
113 | }
114 |
115 | def zwaveEvent(hubitat.zwave.commands.basicv1.BasicReport cmd)
116 | {
117 | def evt = createEvent(name: "switch", value: cmd.value ? "on" : "off", type: "physical")
118 | if (evt.isStateChange) {
119 | [evt, response(["delay 3000", zwave.meterV2.meterGet(scale: 2).format()])]
120 | } else {
121 | evt
122 | }
123 | }
124 |
125 | def zwaveEvent(hubitat.zwave.commands.switchbinaryv1.SwitchBinaryReport cmd)
126 | {
127 | createEvent(name: "switch", value: cmd.value ? "on" : "off", type: "digital")
128 | }
129 |
130 |
131 | def zwaveEvent(hubitat.zwave.commands.configurationv1.ConfigurationReport cmd) {
132 |
133 | // log.debug "in config report got indicatorstatus = $state.currentIndicatorStatus"
134 | [name: "indicatorStatus", value: state.currentIndicatorStatus, display: true]
135 | }
136 |
137 | def zwaveEvent(hubitat.zwave.commands.manufacturerspecificv2.ManufacturerSpecificReport cmd) {
138 | log.debug "in manuf specific report"
139 | def result = []
140 |
141 |
142 | result << response(delayBetween([
143 | zwave.meterV2.meterGet(scale: 0).format(),
144 | zwave.meterV2.meterGet(scale: 2).format(),
145 | ]))
146 |
147 | result
148 | }
149 |
150 | def zwaveEvent(hubitat.zwave.Command cmd) {
151 | log.debug "$device.displayName: Unhandled: $cmd"
152 | [:]
153 | }
154 |
155 | def on() {
156 | log.debug "in on"
157 | [
158 | zwave.basicV1.basicSet(value: 0xFF).format(),
159 | zwave.switchBinaryV1.switchBinaryGet().format(),
160 | "delay 3000",
161 | zwave.meterV2.meterGet(scale: 2).format()
162 | ]
163 | }
164 |
165 | def off() {
166 | log.debug "in off"
167 | [
168 | zwave.basicV1.basicSet(value: 0x00).format(),
169 | zwave.switchBinaryV1.switchBinaryGet().format(),
170 | "delay 3000",
171 | zwave.meterV2.meterGet(scale: 2).format()
172 | ]
173 | }
174 |
175 | def poll() {
176 | delayBetween([
177 | zwave.switchBinaryV1.switchBinaryGet().format(),
178 | zwave.meterV2.meterGet(scale: 0).format(),
179 | zwave.meterV2.meterGet(scale: 2).format()
180 | ])
181 | }
182 |
183 | def refresh() {
184 | def value = "when off"
185 | // log.debug "in refresh for when on got indicatorstatus = $state.currentIndicatorStatus"
186 | sendEvent(name: "indicatorStatus", value: state.currentIndicatorStatus, display: true)
187 |
188 | delayBetween([
189 | zwave.switchBinaryV1.switchBinaryGet().format(),
190 | zwave.meterV2.meterGet(scale: 0).format(),
191 | zwave.meterV2.meterGet(scale: 2).format()
192 | ])
193 |
194 |
195 | }
196 |
197 | def configure() {
198 | if (settings.WattageChange < 1 || settings.WattageChange > 25)
199 | {
200 | settings.WattageChange = 5;
201 | }
202 |
203 | log.debug "In configure timeout value = $settings.ReportTime"
204 | log.debug "Wattage change = $settings.WattageChange"
205 | def wattageadjust = settings.WattageChange * 10;
206 | log.debug "Wattage change = $settings.WattageChange adjusted: $wattageadjust "
207 |
208 | delayBetween([
209 | zwave.configurationV1.configurationSet(parameterNumber: 8, size: 1, scaledConfigurationValue: settings.ReportTime).format(), //send meter report every x minutes.
210 | zwave.configurationV1.configurationSet(parameterNumber: 10, size: 1, scaledConfigurationValue: settings.ReportTime).format(), //accumulated energy report meter interval
211 | zwave.configurationV1.configurationSet(parameterNumber: 11, size: 1, scaledConfigurationValue: 1).format(), //send only meter report when wattage change 1=meter, 2=multilevel , 3=both, 0=none
212 | zwave.configurationV1.configurationSet(parameterNumber: 12, size: 1, scaledConfigurationValue: wattageadjust).format(),//Minimum change in wattage 0-255
213 | zwave.configurationV1.configurationSet(parameterNumber: 9, size: 1, scaledConfigurationValue: 0).format(),// dont send multilevel report
214 | ])
215 | }
216 |
217 | def reset() {
218 | log.debug "in reset"
219 | state.currentIndicatorStatus = "when on"
220 | return [
221 | zwave.meterV2.meterReset().format(),
222 | zwave.meterV2.meterGet(scale: 0).format()
223 | ]
224 | }
225 |
226 | def indicatorWhenOn() {
227 | log.debug "in when on"
228 | state.currentIndicatorStatus = "when on"
229 | sendEvent(name: "indicatorStatus", value: "when on", display: true)
230 | zwave.configurationV1.configurationSet(parameterNumber: 0x01, size: 1, scaledConfigurationValue: 1).format()
231 | }
232 |
233 | def indicatorWhenOff() {
234 | log.debug "in when off"
235 | state.currentIndicatorStatus = "when off"
236 | sendEvent(name: "indicatorStatus", value: "when off", display: true)
237 | zwave.configurationV1.configurationSet(parameterNumber: 0x01, size: 1, scaledConfigurationValue: 0).format()
238 | }
239 |
240 |
241 | def updated()
242 | {
243 | log.debug "in updated"
244 | configure();
245 | }
246 |
--------------------------------------------------------------------------------