diff --git a/devicetypes/smartthings/dimmer-switch.src/dimmer-switch.groovy b/devicetypes/smartthings/dimmer-switch.src/dimmer-switch.groovy index 6b7eca1..4218b3d 100644 --- a/devicetypes/smartthings/dimmer-switch.src/dimmer-switch.groovy +++ b/devicetypes/smartthings/dimmer-switch.src/dimmer-switch.groovy @@ -55,136 +55,141 @@ metadata { } } - standardTile("indicator", "device.indicatorStatus", width: 2, height: 2, inactiveLabel: false, decoration: "flat") { + standardTile("indicator", "device.indicatorStatus", height: 2, width: 2, inactiveLabel: false, decoration: "flat") { state "when off", action:"indicator.indicatorWhenOn", icon:"st.indicators.lit-when-off" state "when on", action:"indicator.indicatorNever", icon:"st.indicators.lit-when-on" state "never", action:"indicator.indicatorWhenOff", icon:"st.indicators.never-lit" } - - standardTile("refresh", "device.switch", width: 2, height: 2, inactiveLabel: false, decoration: "flat") { - state "default", label:'', action:"refresh.refresh", icon:"st.secondary.refresh" - } - - valueTile("level", "device.level", inactiveLabel: false, decoration: "flat", width: 2, height: 2) { - state "level", label:'${currentValue} %', unit:"%", backgroundColor:"#ffffff" + standardTile("refresh", "device.switch", height: 2, width: 2, inactiveLabel: false, decoration: "flat") { + state "default", label:"", action:"refresh.refresh", icon:"st.secondary.refresh" } main(["switch"]) - details(["switch", "level", "indicator", "refresh"]) - + details(["switch", "refresh", "indicator"]) } } def parse(String description) { - def result = null - if (description != "updated") { - log.debug "parse() >> zwave.parse($description)" - def cmd = zwave.parse(description, [0x20: 1, 0x26: 1, 0x70: 1]) - if (cmd) { - result = zwaveEvent(cmd) - } + def item1 = [ + canBeCurrentState: false, + linkText: getLinkText(device), + isStateChange: false, + displayed: false, + descriptionText: description, + value: description + ] + def result + def cmd = zwave.parse(description, [0x20: 1, 0x26: 1, 0x70: 1]) + if (cmd) { + result = createEvent(cmd, item1) } - if (result?.name == 'hail' && hubFirmwareLessThan("000.011.00602")) { - result = [result, response(zwave.basicV1.basicGet())] - log.debug "Was hailed: requesting state update" - } else { - log.debug "Parse returned ${result?.descriptionText}" + else { + item1.displayed = displayed(description, item1.isStateChange) + result = [item1] } - return result + log.debug "Parse returned ${result?.descriptionText}" + result } -def zwaveEvent(physicalgraph.zwave.commands.basicv1.BasicReport cmd) { - dimmerEvents(cmd) -} - -def zwaveEvent(physicalgraph.zwave.commands.basicv1.BasicSet cmd) { - dimmerEvents(cmd) -} - -def zwaveEvent(physicalgraph.zwave.commands.switchmultilevelv1.SwitchMultilevelReport cmd) { - dimmerEvents(cmd) -} - -def zwaveEvent(physicalgraph.zwave.commands.switchmultilevelv1.SwitchMultilevelSet cmd) { - dimmerEvents(cmd) -} - -private dimmerEvents(physicalgraph.zwave.Command cmd) { - def value = (cmd.value ? "on" : "off") - def result = [createEvent(name: "switch", value: value)] - if (cmd.value && cmd.value <= 100) { - result << createEvent(name: "level", value: cmd.value, unit: "%") +def createEvent(physicalgraph.zwave.commands.basicv1.BasicReport cmd, Map item1) { + def result = doCreateEvent(cmd, item1) + for (int i = 0; i < result.size(); i++) { + result[i].type = "physical" } - return result + result } +def createEvent(physicalgraph.zwave.commands.basicv1.BasicSet cmd, Map item1) { + def result = doCreateEvent(cmd, item1) + for (int i = 0; i < result.size(); i++) { + result[i].type = "physical" + } + result +} + +def createEvent(physicalgraph.zwave.commands.switchmultilevelv1.SwitchMultilevelStartLevelChange cmd, Map item1) { + [] +} + +def createEvent(physicalgraph.zwave.commands.switchmultilevelv1.SwitchMultilevelStopLevelChange cmd, Map item1) { + [response(zwave.basicV1.basicGet())] +} + +def createEvent(physicalgraph.zwave.commands.switchmultilevelv1.SwitchMultilevelSet cmd, Map item1) { + def result = doCreateEvent(cmd, item1) + for (int i = 0; i < result.size(); i++) { + result[i].type = "physical" + } + result +} + +def createEvent(physicalgraph.zwave.commands.switchmultilevelv1.SwitchMultilevelReport cmd, Map item1) { + def result = doCreateEvent(cmd, item1) + result[0].descriptionText = "${item1.linkText} is ${item1.value}" + result[0].handlerName = cmd.value ? "statusOn" : "statusOff" + for (int i = 0; i < result.size(); i++) { + result[i].type = "digital" + } + result +} + +def doCreateEvent(physicalgraph.zwave.Command cmd, Map item1) { + def result = [item1] + + item1.name = "switch" + item1.value = cmd.value ? "on" : "off" + item1.handlerName = item1.value + item1.descriptionText = "${item1.linkText} was turned ${item1.value}" + item1.canBeCurrentState = true + item1.isStateChange = isStateChange(device, item1.name, item1.value) + item1.displayed = item1.isStateChange + + if (cmd.value >= 5) { + def item2 = new LinkedHashMap(item1) + item2.name = "level" + item2.value = cmd.value as String + item2.unit = "%" + item2.descriptionText = "${item1.linkText} dimmed ${item2.value} %" + item2.canBeCurrentState = true + item2.isStateChange = isStateChange(device, item2.name, item2.value) + item2.displayed = false + result << item2 + } + result +} def zwaveEvent(physicalgraph.zwave.commands.configurationv1.ConfigurationReport cmd) { - log.debug "ConfigurationReport $cmd" def value = "when off" if (cmd.configurationValue[0] == 1) {value = "when on"} if (cmd.configurationValue[0] == 2) {value = "never"} - createEvent([name: "indicatorStatus", value: value]) + [name: "indicatorStatus", value: value, display: false] } -def zwaveEvent(physicalgraph.zwave.commands.hailv1.Hail cmd) { - createEvent([name: "hail", value: "hail", descriptionText: "Switch button was pressed", displayed: false]) -} - -def zwaveEvent(physicalgraph.zwave.commands.manufacturerspecificv2.ManufacturerSpecificReport cmd) { - log.debug "manufacturerId: ${cmd.manufacturerId}" - log.debug "manufacturerName: ${cmd.manufacturerName}" - log.debug "productId: ${cmd.productId}" - log.debug "productTypeId: ${cmd.productTypeId}" - def msr = String.format("%04X-%04X-%04X", cmd.manufacturerId, cmd.productTypeId, cmd.productId) - updateDataValue("MSR", msr) - createEvent([descriptionText: "$device.displayName MSR: $msr", isStateChange: false]) -} - -def zwaveEvent(physicalgraph.zwave.commands.switchmultilevelv1.SwitchMultilevelStopLevelChange cmd) { - [createEvent(name:"switch", value:"on"), response(zwave.switchMultilevelV1.switchMultilevelGet().format())] -} - -def zwaveEvent(physicalgraph.zwave.Command cmd) { - // Handles all Z-Wave commands we aren't interested in - [:] +def createEvent(physicalgraph.zwave.Command cmd, Map map) { + // Handles any Z-Wave commands we aren't interested in + log.debug "UNHANDLED COMMAND $cmd" } def on() { - delayBetween([ - zwave.basicV1.basicSet(value: 0xFF).format(), - zwave.switchMultilevelV1.switchMultilevelGet().format() - ],5000) + log.info "on" + delayBetween([zwave.basicV1.basicSet(value: 0xFF).format(), zwave.switchMultilevelV1.switchMultilevelGet().format()], 5000) } def off() { - delayBetween([ - zwave.basicV1.basicSet(value: 0x00).format(), - zwave.switchMultilevelV1.switchMultilevelGet().format() - ],5000) + delayBetween ([zwave.basicV1.basicSet(value: 0x00).format(), zwave.switchMultilevelV1.switchMultilevelGet().format()], 5000) } def setLevel(value) { - log.debug "setLevel >> value: $value" def valueaux = value as Integer - def level = Math.max(Math.min(valueaux, 99), 0) - if (level > 0) { - sendEvent(name: "switch", value: "on") - } else { - sendEvent(name: "switch", value: "off") - } - sendEvent(name: "level", value: level, unit: "%") + def level = Math.min(valueaux, 99) delayBetween ([zwave.basicV1.basicSet(value: level).format(), zwave.switchMultilevelV1.switchMultilevelGet().format()], 5000) } def setLevel(value, duration) { - log.debug "setLevel >> value: $value, duration: $duration" def valueaux = value as Integer - def level = Math.max(Math.min(valueaux, 99), 0) + def level = Math.min(valueaux, 99) def dimmingDuration = duration < 128 ? duration : 128 + Math.round(duration / 60) - def getStatusDelay = duration < 128 ? (duration*1000)+2000 : (Math.round(duration / 60)*60*1000)+2000 - delayBetween ([zwave.switchMultilevelV2.switchMultilevelSet(value: level, dimmingDuration: dimmingDuration).format(), - zwave.switchMultilevelV1.switchMultilevelGet().format()], getStatusDelay) + zwave.switchMultilevelV2.switchMultilevelSet(value: level, dimmingDuration: dimmingDuration).format() } def poll() { @@ -192,27 +197,21 @@ def poll() { } def refresh() { - log.debug "refresh() is called" - def commands = [] - commands << zwave.switchMultilevelV1.switchMultilevelGet().format() - if (getDataValue("MSR") == null) { - commands << zwave.manufacturerSpecificV1.manufacturerSpecificGet().format() - } - delayBetween(commands,100) + zwave.switchMultilevelV1.switchMultilevelGet().format() } def indicatorWhenOn() { - sendEvent(name: "indicatorStatus", value: "when on") + sendEvent(name: "indicatorStatus", value: "when on", display: false) zwave.configurationV1.configurationSet(configurationValue: [1], parameterNumber: 3, size: 1).format() } def indicatorWhenOff() { - sendEvent(name: "indicatorStatus", value: "when off") + sendEvent(name: "indicatorStatus", value: "when off", display: false) zwave.configurationV1.configurationSet(configurationValue: [0], parameterNumber: 3, size: 1).format() } def indicatorNever() { - sendEvent(name: "indicatorStatus", value: "never") + sendEvent(name: "indicatorStatus", value: "never", display: false) zwave.configurationV1.configurationSet(configurationValue: [2], parameterNumber: 3, size: 1).format() } @@ -223,4 +222,4 @@ def invertSwitch(invert=true) { else { zwave.configurationV1.configurationSet(configurationValue: [0], parameterNumber: 4, size: 1).format() } -} \ No newline at end of file +}