├── 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 + "" 61 | myresults = myresults + "" 62 | myresults = myresults + "" 63 | 64 | myresults = myresults + "

${name1}

${time1}

${name2}

${time2}

${name3}

${time3}
" 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 + "" 61 | myresults = myresults + "" 62 | myresults = myresults + "" 63 | 64 | myresults = myresults + "

${name1}

${time1}

${name2}

${time2}

${name3}

${time3}
" 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 | --------------------------------------------------------------------------------