TL:DR; If you want range, ease of use, and Tier 1 Home Assistant integration, use ZHA. However, if you’re wanting to use less common devices (and I highly recommend the Xiaomi devices) then ZHA is unusable but zigbee2mqtt handles the task quite well.
Note: I started with zigbee2mqtt. Seeing the new ZHA work in Home Assistant and wanting to explore other options, I picked up the Nortek HUSBZB-1.
ZHA works for many things, works partially for some things, and doesn’t work at all for some things.
For the better known bulb brands, it mostly works. I tested Sengled Whites, Sylvania Whites, and Sylvania Tuneable Whites. The bulbs pair easily and show up in the ZHA panel right away. The only issue I had was that each of these bulbs, at one point or another, after a restart of Home Assistant, would show as “on” when they were actually off. I would turn them “off” in Home Assistant and then restart, and they would still show as “on”. To fix it, I had to turn them “off” and then “on” and then “off” again in Home Assistant. Then, after a restart, the state was correct. It seems that turning them “off” when they are already actually off does not generate the state report that ZHA expects, so, while the UI moves to “off” and stays there, the internal state database doesn’t get updated. On a restart, the state database is polled, and the light is shown as “on”.
For Xiaomi devices (I tested the Mija Button, the Aqara Motion, and the Aqara Cube) they basically don’t work. All three of these devices were very difficult to pair. Once paired, they presented sensors that don’t actually exist. “Reconfiguring” the node would cause the non-existent sensors to show as “unavailable”.
The Mija button reports as “on” when it’s not pressed and “off” when it is pressed. There is no detection of double, triple, quadruple, or long click. I wrote code to handle this device properly and submitted it to the developer, however, I don’t advise using it. After a restart of Home Assistant, this device doesn’t report at all.
The cube’s rotate readings are slow to report and odd in general. After a restart of Home Assistant, this device doesn’t report at all.
The motion sensor creates a presence binary sensor (along with a handful of other sensors that report nothing). After a reconfigure of the node and a restart of Home Assistant, the motion sensor creates a motion binary sensor and stops updating the previously created presence binary sensor. Additionally, the lux sensor stops reporting.
I also tested the newest version of the SmartThings Multi Purpose sensor (the IM6001-MPP01). It would occasionally stop reporting it’s data and a reconfigure was needed to get it to report again. It also created several sensors that did not have descriptions and were never updated. It, however, did continue to work after a reconfigure and a Home Assistant restart.
Comparing ZHA to zigbee2mqtt there are a few notes.
First of all, the range with the HUSBZB-1 is FAR better than with the CC2531. With zigbee2mqtt, I need to be aware of this and add routing devices (like the Sylvania bulbs) near the CC2531 first. One the routing devices have been added, the end devices can be added without issue.
The Sengled bulbs are difficult to pair with zigbee2mqtt. On top of that, the frequently become unroutable which means requests to turn off and on the bulb fail. The Sylvania bulbs had no issue at all.
The Xiaomi devices worked perfectly. They report as expected and even provide more data than what is available when using the native Xiaomi hub.
The Smart Thing Multi Purpose Sensor paired with zigbee2mqtt, however, no reports were ever received. Also, the pairing process took quite some time.
In regard to speed, ZHA seems to be much faster than zigbee2mqtt. This isn’t something you’d usually notice since, relatively speaking, it’s all pretty fast. However, when putting 4 bulbs into a light group and then turning the group on or off and watching the bulbs, there is a noticeable delay between the change in each bulb with both platforms. However, with ZHA, that delay is quite a bit shorter. On the plus side, zigbee2mqtt supports device groups. Once these bulbs are places in a group with each other, they all turn on and off at exactly the same time.