diff --git a/devicetypes/smartthings/zwave-door-window-sensor.src/zwave-door-window-sensor.groovy b/devicetypes/smartthings/zwave-door-window-sensor.src/zwave-door-window-sensor.groovy index 870f106..6a88c27 100644 --- a/devicetypes/smartthings/zwave-door-window-sensor.src/zwave-door-window-sensor.groovy +++ b/devicetypes/smartthings/zwave-door-window-sensor.src/zwave-door-window-sensor.groovy @@ -28,7 +28,6 @@ metadata { fingerprint deviceId: "0x0701", inClusters: "0x5E,0x98" fingerprint deviceId: "0x0701", inClusters: "0x5E,0x86,0x72,0x98", outClusters: "0x5A,0x82" fingerprint deviceId: "0x0701", inClusters: "0x5E,0x80,0x71,0x85,0x70,0x72,0x86,0x30,0x31,0x84,0x59,0x73,0x5A,0x8F,0x98,0x7A", outClusters:"0x20" // Philio multi+ - fingerprint deviceId: "0x0701", inClusters: "0x5E,0x72,0x5A,0x80,0x73,0x84,0x85,0x59,0x71,0x70,0x7A,0x98" // Vision door/window } // simulator metadata @@ -83,12 +82,12 @@ def updated() { cmds = [ command(zwave.manufacturerSpecificV2.manufacturerSpecificGet()), "delay 1200", - zwave.wakeUpV1.wakeUpNoMoreInformation() + zwave.wakeUpV1.wakeUpNoMoreInformation().format() ] } else if (!state.lastbat) { cmds = [] } else { - cmds = [zwave.wakeUpV1.wakeUpNoMoreInformation()] + cmds = [zwave.wakeUpV1.wakeUpNoMoreInformation().format()] } response(cmds) } diff --git a/smartapps/smartthings/gentle-wake-up.src/gentle-wake-up.groovy b/smartapps/smartthings/gentle-wake-up.src/gentle-wake-up.groovy index 11f295c..89dd9f6 100644 --- a/smartapps/smartthings/gentle-wake-up.src/gentle-wake-up.groovy +++ b/smartapps/smartthings/gentle-wake-up.src/gentle-wake-up.groovy @@ -39,6 +39,7 @@ preferences { page(name: "completionPage") page(name: "numbersPage") page(name: "controllerExplanationPage") + page(name: "unsupportedDevicesPage") } def rootPage() { @@ -47,6 +48,9 @@ def rootPage() { section("What to dim") { input(name: "dimmers", type: "capability.switchLevel", title: "Dimmers", description: null, multiple: true, required: true, submitOnChange: true) if (dimmers) { + if (dimmersContainUnsupportedDevices()) { + href(name: "toUnsupportedDevicesPage", page: "unsupportedDevicesPage", title: "Some of your selected dimmers don't seem to be supported", description: "Tap here to fix it", required: true) + } href(name: "toNumbersPage", page: "numbersPage", title: "Duration & Direction", description: numbersPageHrefDescription(), state: "complete") } } @@ -71,6 +75,31 @@ def rootPage() { } } +def unsupportedDevicesPage() { + + def unsupportedDimmers = dimmers.findAll { !hasSetLevelCommand(it) } + + dynamicPage(name: "unsupportedDevicesPage") { + if (unsupportedDimmers) { + section("These devices do not support the setLevel command") { + unsupportedDimmers.each { + paragraph deviceLabel(it) + } + } + section { + input(name: "dimmers", type: "capability.sensor", title: "Please remove the above devices from this list.", submitOnChange: true, multiple: true) + } + section { + paragraph "If you think there is a mistake here, please contact support." + } + } else { + section { + paragraph "You're all set. You can hit the back button, now. Thanks for cleaning up your settings :)" + } + } + } +} + def controllerExplanationPage() { dynamicPage(name: "controllerExplanationPage", title: "How To Control Gentle Wake Up") { @@ -528,14 +557,16 @@ def updateDimmers(percentComplete) { } else { def shouldChangeColors = (colorize && colorize != "false") - def canChangeColors = hasSetColorCommand(dimmer) - log.debug "Setting ${deviceLabel(dimmer)} to ${nextLevel}" - - if (shouldChangeColors && canChangeColors) { - dimmer.setColor([hue: getHue(dimmer, nextLevel), saturation: 100, level: nextLevel]) - } else { + if (shouldChangeColors && hasSetColorCommand(dimmer)) { + def hue = getHue(dimmer, nextLevel) + log.debug "Setting ${deviceLabel(dimmer)} level to ${nextLevel} and hue to ${hue}" + dimmer.setColor([hue: hue, saturation: 100, level: nextLevel]) + } else if (hasSetLevelCommand(dimmer)) { + log.debug "Setting ${deviceLabel(dimmer)} level to ${nextLevel}" dimmer.setLevel(nextLevel) + } else { + log.warn "${deviceLabel(dimmer)} does not have setColor or setLevel commands." } } @@ -817,24 +848,21 @@ private getRedHue(level) { if (level >= 96) return 17 } +private dimmersContainUnsupportedDevices() { + def found = dimmers.find { hasSetLevelCommand(it) == false } + return found != null +} + private hasSetLevelCommand(device) { - def isDimmer = false - device.supportedCommands.each { - if (it.name.contains("setLevel")) { - isDimmer = true - } - } - return isDimmer + return hasCommand(device, "setLevel") } private hasSetColorCommand(device) { - def hasColor = false - device.supportedCommands.each { - if (it.name.contains("setColor")) { - hasColor = true - } - } - return hasColor + return hasCommand(device, "setColor") +} + +private hasCommand(device, String command) { + return (device.supportedCommands.find { it.name == command } != null) } private dimmersWithSetColorCommand() { @@ -1073,4 +1101,4 @@ def hasStartLevel() { def hasEndLevel() { return (endLevel != null && endLevel != "") -} +} \ No newline at end of file diff --git a/smartapps/smartthings/logitech-harmony-connect.src/logitech-harmony-connect.groovy b/smartapps/smartthings/logitech-harmony-connect.src/logitech-harmony-connect.groovy index e3dda08..250eb58 100644 --- a/smartapps/smartthings/logitech-harmony-connect.src/logitech-harmony-connect.groovy +++ b/smartapps/smartthings/logitech-harmony-connect.src/logitech-harmony-connect.groovy @@ -823,8 +823,8 @@ def deviceHandler(evt) { } def sendToHarmony(evt, String callbackUrl) { - def callback = new URI(callbackUrl) - if(isIP(callback.host)){ + def callback = new URI(callbackUrl) + if (callback.port != -1) { def host = callback.port != -1 ? "${callback.host}:${callback.port}" : callback.host def path = callback.query ? "${callback.path}?${callback.query}".toString() : callback.path sendHubCommand(new physicalgraph.device.HubAction( @@ -852,25 +852,6 @@ def sendToHarmony(evt, String callbackUrl) { } } -public static boolean isIP(String str) { - try { - String[] parts = str.split("\\."); - if (parts.length != 4) return false; - for (int i = 0; i < 4; ++i) { - int p - try { - p = Integer.parseInt(parts[i]); - } catch (Exception e) { - return false; - } - if (p > 255 || p < 0) return false; - } - return true; - } catch (Exception e) { - return false; - } -} - def listHubs() { location.hubs?.findAll { it.type.toString() == "PHYSICAL" }?.collect { hubItem(it) } }