Oh, nice...I used to live somewhat near there. That's a cool area.
Sorry to hear that about Bali support. I'm always worried that I'll hit a wall with support when I'm not following their "approved" path. That's part of the reason I haven't gotten in touch with them on my issue. (Plus, to their point, my issue actually didn't happen with SmartThings, but I'm sticking with Hubitat. )
Good call on migrating more devices, I'd think. It seems like the additional repeaters should help, though I'm no Z-Wave expert...I'm sure others will chime in on that.
As far as repeaters near my "problem child", there's just the other wall-powered shade that's about 6-8 feet away, but ironically, my problem shade is the closest device to my hub (about 15 feet line-of-sight).
Sure, I'm just using the Z-Wave Shade driver that @DeveloperDavidB has posted before, with the modified parse() routine below. (I apologize in advance for the code. This could probably be done better/easier, but I'm still learning Groovy.)
def parse(String description) {
def result = null
def hexVal = null
def movingHex = null
if (description != "updated") {
log("parse() >> zwave.parse($description)", "DEBUG")
if(description.trim().endsWith("payload: 00 00 00")) {
sendEvent(name: "level", value: 0, unit: "%")
log("Shade is down, setting level to 0%.", "DEBUG")
} else if(description.contains("command: 2603")) {
if(description.contains("isMulticast")) {
log("Detected isMulticast string", "DEBUG")
def mcastIdx = description.lastIndexOf(",")
def dummyStr = description.substring(0,mcastIdx)
hexVal = dummyStr.trim()[-8..-7]
movingHex = dummyStr.trim()[-2..-1]
} else {
hexVal = description.trim()[-8..-7]
movingHex = description.trim()[-2..-1]
}
log("hexVal = ${hexVal}.", "DEBUG")
try {
def intVal = zigbee.convertHexToInt(hexVal)
def movingInt = zigbee.convertHexToInt(movingHex)
log("intVal = ${intVal}.", "DEBUG")
if(movingInt == 0) {
log("Shade has stopped.", "INFO")
} else if(movingInt == 254) {
log("Shade is moving.", "INFO")
} else {
log("movingInt = ${movingInt}.", "INFO")
}
sendEvent(name: "level", value: intVal, unit: "%")
} catch(e) {
log("Exception ${e}", "ERROR")
}
} else if(description.contains("command: 8003")) {
log("Battery Reported.", "DEBUG")
}
def cmd = zwave.parse(description, [0x20: 1, 0x26: 1, 0x70: 1])
if (cmd) {
result = zwaveEvent(cmd)
}
}
if (result?.name == 'hail' && hubFirmwareLessThan("000.011.00602")) {
result = [result, response(zwave.basicV1.basicGet())]
log("Was hailed: requesting state update", "DEBUG")
} else {
log("Parse returned ${result?.descriptionText}", "DEBUG")
}
return result
}