Bali Autowave Shades - Erratic Behavior

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. :grin:)

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
}