I currently have a TI CC2531 based Controller for Zigbee2MQTT, and the performance is poor. Based on how much my Zigbee network is expanding with the really low cost of Zigbee hardware (despite my preference for Z-wave for reliability when it counts), I’m upgrading my Controller to the zzh! from electrolama. The new controller is based on the CC2652 and has a decent external antenna, and should hopefully improve my awful Zigbee reception and reliance on IKEA repeaters to get any signal at all.

Network map Before

As you can see in the ‘Before’ network diagram, most of my devices don’t want to connect directly to the controller, and those that do get very low link quality index. The laundry_temp_humid_sensor is physically located in the same room only a few feet away from the CC2531 and only gets an lqi of 68, while the andrew_bed_motion is only one wall over (~10 feet and 1 wall in between) and gets an lqi of 5. That’s really terrible. The first repeater (bed_andrew_repeater) is actually plugged in to the same power strip as the CC2531’s raspberry pi and is about 3 feet away, so the poor antenna on the CC2531 is obvious when we see how many devices want that repeater instead of the controller.

Back when I bought my IKEA Blinds, I also bought the CC2531 pre-flashed with controller firmware to use in my Zigbee network, but due to life getting in the way I didn’t end up setting up that network until a few months ago. Back then, the CC2531 was the recommended dongle from Zigbee2MQTT. In the time since, the CC2531 became less recommended compared to the CC2652, and now it’s listed as NOT recommended (but still supported). The zzh! helps support the Zigbee2MQTT developer somewhat, and I felt comfortable selecting that dongle for my network. I was fully aware that I could possibly have to re-pair everything, although migrating from the CC2531 to CC2652 sometimes does not require re-pairing if all goes well.

The first step in the transition is to flash my new CC2652-based zzh! with the correct firmware. The firmware primarily used with Zigbee2MQTT and open-hardware dongles is the open-source Z-Stack-firmware. I then followed Electrolama’s Guide to flash the dongle. Not wanting to deal with a Windows-only flashing utility from TI, I chose this option (with the open-source Python utility) despite the Windows version having a GUI.

Next step is to backup the configuration. I ran the backup script manually, then renamed the file it generated so that particular backup will persist forever in case I need to roll back. After that, I shut down the Pi, replaced the USB dongle, and booted it back up.

When I rebooted, I had to make a few configuration changes to zigbee2mqtt:

  • The new dongle was at /dev/ttyUSB0 instead of /dev/ttyACM0
  • The new dongle requires ‘rtscts: false’ in the advanced section of the yaml

After making those changes (with the service stopped, since it will overwirite configuration.yaml on its own), I started the service and it seemed to work fine. Devices in my network re-appeared as available in Home Assistant. I then ran a network map and got… odd results. No device links, just a cloud of devices. I went through the house and found out that most of my devices appeared to be working (motion lights followed me, etc.) but they still don’t show up in the link map.

I did a new backup and gave it a day to get over itself. Zigbee lacks a way to force neighbor updates like Z-wave’s ‘Heal’ function, since you basically just have to hope the devices discover new neighbors and links when they wake up and try to communicate. I had a few stubborn devices - two Aqara door switches on my south and center garage doors (but not the north!), and the basement temperature + humidity sensor. I eventually gave up and re-paired them, which was a bit of a hassle.

Network map after settling

Was the upgrade worth it? The CC2652 supports 50 direct children, while the CC2531 only supported 20. Of course, you can have more than that if your nodes are connected via routers. The devices which are now direct children of the CC2652 seem to have better signal strength than before, and many of them are significantly further from the controller than the children of the CC2531. Overall, I’d say you should definitely start with a CC2652 or upgrade as soon as possible, so you don’t start running into the limitations of the CC2531 when you have a larger network that’s more hassle to reconfigure.