I changed the cycleFan implementation to look like:
def cycleFan(devices) { //all fans will sync speeds with fisrt fan in the list
log.info "Cycling: $devices"
def mySpeed = devices.currentSpeed
def newSpeed = "off"
if(mySpeed[0] == "off") newSpeed = "low"
if(mySpeed[0] == "low") newSpeed = "medium"
if(mySpeed[0] == "medium-low") newSpeed = "medium"
if(mySpeed[0] == "medium") newSpeed = "high"
if(mySpeed[0] == "high") newSpeed = "off"
log.debug "cycleFan: mySpeed = ${mySpeed}, devices = ${devices}, newSpeed = ${newSpeed}"
devices.setSpeed(newSpeed)
}
This works better, but the fan control device seems to incorrectly report "low" as its value when set to 100%, per comment here: Lutron Fan Control Behavior
So really I just end up alternating between two speeds. Hopefully that issue is fixed soon. But it seems neither Button Controller nor ABC correctly work with the Lutron Fan Control as-is.