I ended up getting the Electrolama stick which is on the zigbee2mqtt compatible list of controllers. I ordered it on Tindie and it came in about two weeks from England. It’s based on the better CC2652R TI chip.
So far no issues at all with it. The fan works fine, no dropped connections, and quickly reconnects after a restart. It is now more reliable then it was on the Smartthings hub even. The cc2531 definitely doesn’t pair well with this fan and if you want to keep this fan an upgraded chip seems like the way to go.
Link to zigbee2mqtt compatible chips below. It’s first on the list.
Supported adapters | zigbee2mqtt.io
On another note though, when it came over from zigbee2mqtt into Home-assistant only the first 3 speeds are supported on this 4 speed fan. There’s no option to set high or the “smart” breeze mode. I got around it using the zigbee2mqtt palette in Node red which can set these two high and smart modes, but will probably need to do a custom fan template to mqtt to support all 4 speeds and the breeze mode right from home assistant.
If anyone needs it, here is a Node red flow I put together for Alexa control using this skill. It would come in as a bulb but percentages could be set for all 4 speeds, and 1 percent would set the smart/breeze mode - Introduction — Node-RED Smart Home Control documentation
[{"id":"a695a1be.001e28","type":"alexa-smart-home-v3","z":"a40e0c60.10e8c","conf":"","device":"30837","acknowledge":true,"name":"","topic":"","x":180,"y":2980,"wires":[["f143594b.5d1fa8"]]},{"id":"f143594b.5d1fa8","type":"switch","z":"a40e0c60.10e8c","name":"Fan Sets","property":"payload","propertyType":"msg","rules":[{"t":"eq","v":"OFF","vt":"str"},{"t":"eq","v":"0","vt":"str"},{"t":"eq","v":"1","vt":"num"},{"t":"btwn","v":"2","vt":"num","v2":"39","v2t":"num"},{"t":"eq","v":"ON","vt":"str"},{"t":"btwn","v":"40","vt":"num","v2":"59","v2t":"num"},{"t":"btwn","v":"60","vt":"num","v2":"79","v2t":"num"},{"t":"btwn","v":"80","vt":"num","v2":"100","v2t":"num"}],"checkall":"true","repair":false,"outputs":8,"x":380,"y":2980,"wires":[["2a72cba1.9277bc"],["2a72cba1.9277bc"],["d9dc35cf.15a0f8"],["3b6e5eff.4bb07a"],["6ff086e8.052d4"],["6ff086e8.052d4"],["b4b63eeb.cf809"],["c8e33ab4.fb9318"]]},{"id":"2a72cba1.9277bc","type":"api-call-service","z":"a40e0c60.10e8c","name":"Turn off","server":"","version":1,"debugenabled":false,"service_domain":"fan","service":"turn_off","entityId":"fan.bedroom_fan_3","data":"","dataType":"json","mergecontext":"","output_location":"","output_location_type":"none","mustacheAltTags":false,"x":640,"y":2900,"wires":[[]]},{"id":"d9dc35cf.15a0f8","type":"function","z":"a40e0c60.10e8c","name":"Smart Mode","func":"var payload = msg.payload;\nmsg.payload = { \n \"fan_mode\": \"smart\"\n }\nreturn msg","outputs":1,"noerr":0,"initialize":"","finalize":"","x":630,"y":2960,"wires":[["fd3144a7.b159"]]},{"id":"fd3144a7.b159","type":"zigbee2mqtt-out","z":"a40e0c60.10e8c","name":"","server":"","friendly_name":"Bedroom Fan","device_id":"0x0022a3000029410e","command":"state","commandType":"z2m_cmd","payload":"payload","payloadType":"msg","transition":0,"x":900,"y":3040,"wires":[]},{"id":"3b6e5eff.4bb07a","type":"function","z":"a40e0c60.10e8c","name":"Low","func":"var payload = msg.payload;\nmsg.payload = { \n \"fan_mode\": \"low\"\n }\nreturn msg","outputs":1,"noerr":0,"initialize":"","finalize":"","x":630,"y":3000,"wires":[["fd3144a7.b159"]]},{"id":"6ff086e8.052d4","type":"function","z":"a40e0c60.10e8c","name":"Medium","func":"var payload = msg.payload;\nmsg.payload = { \n \"fan_mode\": \"medium\"\n }\nreturn msg","outputs":1,"noerr":0,"initialize":"","finalize":"","x":640,"y":3040,"wires":[["fd3144a7.b159"]]},{"id":"b4b63eeb.cf809","type":"function","z":"a40e0c60.10e8c","name":"MH","func":"var payload = msg.payload;\nmsg.payload = { \n \"fan_mode\": \"high\"\n }\nreturn msg","outputs":1,"noerr":0,"initialize":"","finalize":"","x":630,"y":3080,"wires":[["fd3144a7.b159"]]},{"id":"c8e33ab4.fb9318","type":"function","z":"a40e0c60.10e8c","name":"High","func":"var payload = msg.payload;\nmsg.payload = { \n \"fan_mode\": \"on\"\n }\nreturn msg","outputs":1,"noerr":0,"initialize":"","finalize":"","x":630,"y":3120,"wires":[["fd3144a7.b159"]]},{"id":"9102cdcf.0d17e","type":"function","z":"a40e0c60.10e8c","name":"On or Off","func":"if (msg.payload == \"off\") {\n return { \"payload\" : { \"state\" : { \"power\" : \"OFF\" } }, \"acknowledge\" : true };\n}\nelse {\n return { \"payload\" : { \"state\" : { \"power\" : \"ON\" } }, \"acknowledge\" : true };\n}","outputs":1,"noerr":0,"initialize":"","finalize":"","x":540,"y":2780,"wires":[["59b054d2.958d54"]]},{"id":"7144f837.9c2bc","type":"stoptimer","z":"a40e0c60.10e8c","duration":"1","units":"Second","payloadtype":"num","payloadval":"0","name":"","x":720,"y":2840,"wires":[["59b054d2.958d54"],[]]},{"id":"59b054d2.958d54","type":"alexa-smart-home-v3-state","z":"a40e0c60.10e8c","conf":"","device":"30837","name":"","x":970,"y":2840,"wires":[]},{"id":"cd1feaf0.788fc","type":"zigbee2mqtt-in","z":"a40e0c60.10e8c","name":"Fan Mode","server":"","friendly_name":"Bedroom Fan","device_id":"0x0022a3000029410e","state":"fan_mode","outputAtStartup":true,"x":220,"y":2820,"wires":[["48742e58.67c"]]},{"id":"9cfe2f7d.b00ee","type":"function","z":"a40e0c60.10e8c","name":"Translate","func":"if (msg.payload == \"on\") {\n return { \"payload\" : { \"state\" : { \"brightness\" : 100 } }, \"acknowledge\" : true };\n}\nelse if (msg.payload == \"smart\") {\n return { \"payload\" : { \"state\" : { \"brightness\" : 1 } }, \"acknowledge\" : true };\n}\nelse if (msg.payload == \"low\") {\n return { \"payload\" : { \"state\" : { \"brightness\" : 25 } }, \"acknowledge\" : true };\n}\nelse if (msg.payload == \"medium\") {\n return { \"payload\" : { \"state\" : { \"brightness\" : 50 } }, \"acknowledge\" : true };\n}\nelse if (msg.payload == \"high\") {\n return { \"payload\" : { \"state\" : { \"brightness\" : 75 } }, \"acknowledge\" : true };\n}","outputs":1,"noerr":0,"initialize":"","finalize":"","x":540,"y":2840,"wires":[["7144f837.9c2bc"]]},{"id":"48742e58.67c","type":"switch","z":"a40e0c60.10e8c","name":"Off?","property":"payload","propertyType":"msg","rules":[{"t":"eq","v":"off","vt":"str"},{"t":"else"}],"checkall":"true","repair":false,"outputs":2,"x":390,"y":2820,"wires":[["9102cdcf.0d17e"],["9102cdcf.0d17e","9cfe2f7d.b00ee"]]}]