ZHA Zigbee Tested Devices...Please add your device results


I would Want to start with replacement of the Xiaomi Gateway for a more native Zigbee solution. What is the best choice for now after a lot of Development? Deconz Conbee USB with the restapi docker image and component integration in HA? Or direct ZHA with the HUSBZB-1 usb stick? Or with the Zigbee2MQTT solution?
Which one has the best range of device support?
Would like Hue, Tradfri, Xiaomi support.


Ive been using deconz since last year and as production environment since April. It has worked really well for me. (author of deconz component). It supports most devices out there, and the company is quite fast in adding support for devices not working with deconz.

Can’t say anything for the other components.


I struggled to get zha to start with an xbee attached via usb. I finally was able to get it to work by changing some firmware settings. I was able to pair 4 GE Link bulbs and 1 Osram bulb. Anytime HA restarts; I loose the ability to control the bulbs. I can repair the bulbs; but that is painful to do everytime HA restarts.

ZHA is definitely not stable.

2018-08-06 16:46:56 INFO (MainThread) [homeassistant.core] Bus:Handling <Event call_service[L]: domain=light, service_data=entity_id=light.osram_lightify_a19_onoffdim_0003fe4c_3, service=turn_off, service_call_id=1975931664-30>
2018-08-06 16:46:56 DEBUG (MainThread) [zigpy_xbee.zigbee.application] Zigbee request seq 7
2018-08-06 16:46:56 ERROR (MainThread) [homeassistant.core] Error executing service <ServiceCall light.turn_off: entity_id=[‘light.osram_lightify_a19_onoffdim_0003fe4c_3’]>
Traceback (most recent call last):
File “/srv/homeassistant/lib/python3.5/site-packages/homeassistant/core.py”, line 1038, in _event_to_service_call
await service_handler.func(service_call)
File “/srv/homeassistant/lib/python3.5/site-packages/homeassistant/components/light/init.py”, line 362, in async_handle_light_service
await light.async_turn_off(**params)
File “/srv/homeassistant/lib/python3.5/site-packages/homeassistant/components/light/zha.py”, line 127, in async_turn_off
await self._endpoint.on_off.off()
File “/srv/homeassistant/lib/python3.5/site-packages/zigpy/device.py”, line 89, in request
File “/srv/homeassistant/lib/python3.5/site-packages/zigpy_xbee/zigbee/application.py”, line 71, in request
KeyError: 14164


I know this was a while ago, but I’m having a but of trouble understanding what I need to do to add this code to my HA installation. I’d be super happy just to get battery level for my Iris gen 2 (centralite) open close sensors. I’d also love to get the battery level for my iris gen 2 motion sensors. But if I could only have one, the open close ones are the most important. I found one of sensor batterries is either very low and keeps disconnecting, or I’m having some other zha/zigbee issue. Pretty sure it’s battery.

Reading over the comments of the commits, it looks like it was added? or put into a different release??


I have a number of Zigbee network between Plantlink and the vera and Philips hue. I hold a pretty tight control over my bandwidth and would like to know which channel the HUSBZB is on and would like to change it if needed or at least be able to set it at the beginning. I see no option to do so unlike hubitat which uses the same stick. Is it not implemented in bellows?


Has anyone tried the smartthings button yet?


Anyone tried the new smartthings leak detector? I know the older one works well, but these are pretty reasonable. $20


Just got one. Seems to be working fine.

I’ve also tried their “multipurpose sensor”, the door/window sensor and it also works, but for whatever reason reports itself as a “water” sensor.

Edit: both, the open/close magnetic sensor and water leak sensor also have thermometer cluster, so you also get a temperature.


Some info for the devs if anyone interested.
this is for Smartthings water leak sensor:

  NWK: 0xbeef
  IEEE: 28:6d:97:00:xx:xx:xx:xx
    1: profile=0x104, device_type=DeviceType.IAS_ZONE
      Input Clusters:
        Basic (0)
        Power Configuration (1)
        Identify (3)
        Poll Control (32)
        Temperature Measurement (1026)
        IAS Zone (1280)
      Output Clusters:
        Identify (3)
        Ota (25)

I was able to pull the following attributes from it:

endpoint #1
basic cluster
All supported attributes
'0x0000-zcl_version' = 2
'0x0001-app_version' = 9
'0x0003-hw_version' = 0
'0x0004-manufacturer' = b'Samjin'
'0x0005-model' = b'water'
'0x0007-power_source' = 0
'0x4000-sw_build_id' = b''
power cluster
All supported attributes
'0x0020-battery_voltage' = 30
'0x0021-battery_percentage_remaining' = 200
'0x0041-battery_2_percentage_remaining' = 200
temperature cluster
All supported attributes
'0x0000-measured_value' = 2425
'0x0001-min_measured_value' = 0
'0x0002-max_measured_value' = 0
identify cluster
All supported attributes
'0x0000-identify_time' = 0
poll_control cluster
All supported attributes
'0x0000-checkin_interval' = 0
'0x0001-long_poll_interval' = 28
'0x0002-short_poll_interval' = 1
'0x0003-fast_poll_timeout' = 40
ias_zone cluster:
All supported attributes
'0x0000-zone_state' = 1
'0x0001-zone_type' = 42
'0x0002-zone_status' = 32
'0x0010-cie_addr' = xx:xx:xx:xx:xx:xx:xx:xx
'0x0011-zone_id' = 0


It is… BUT…

Not all devices act as repeaters. Battery operated devices, for instance, almost NEVER act as repeaters, as it would drain their batteries too quickly.

Phillips Hue bulbs DO act as repeaters. But, as far as other brands go, you’d have to do research on each specific device to find out.


How do you get the endpoint information for the devices?


I have a Hampton Bay/King of Fans ZHA fan/light control. It works except for dimming. The light is recognized as a switch instead of a dimmer. I’m not sure why since the profile is 0x104.

  NWK: 0xc2b7
  IEEE: 00:22:a3:00:00:21:ee:f7
    1: profile=0x104, device_type=14
      Input Clusters:
        Basic (0)
        Identify (3)
        Groups (4)
        Scenes (5)
        On/Off (6)
        Level control (8)
        Fan Control (514)
      Output Clusters:
        Identify (3)
        Ota (25)


Check earlier in this thread. This was discussed a few weeks back. You need to override device type in configuration.yaml


Ah, you’re too quick! I was just coming back to say I had found your earlier post and it’s fixed. Thanks for your help!


OK, I lied, it doesn’t work entirely. If I press the on/off switch, it goes on, but not off (it worked correctly as a switch). I can set the dim level to off and it goes off, but not the switch. It also doesn’t seem to be receiving updates for the slider or switch.


Has anyone tried the new Centralite 3210-L2 plugs? I just got one from Lowes, and it seems identical to my previous Iris 3210-L plugs, but I haven’t been able to get it to pair. I’ve been calling zha.permit and then plugging it in, but I can’t remember if there was some other trick to getting the previous Iris smart plug to pair.

EDIT: Got it working. Had to hold down the button while plugging it in to put it in pairing mode. Works fine, along with power usage reporting.


I have three of the KoF devices and I can only get one of them to switch to a light device and it has the same issues that you stated. I have not been able to figure out anything past that. Have you had any more luck with it?


KoF requires zigpy quirks to function properly. It was packaged for Zigpy release 0.2.0 a few days ago and was merged as a requirement into Dev tree of homeassistant, so I’m expecting next version of hass to use Zigpy 0.2.0 out of the box.
Until then, unless you are running a Hass in a docker, you could try manually installing latest Zigpy and start Hass with --skip-pip option so it won’t try installing older version of Zigpy


I’m using this quick’n’dirty code. Change some hardcoded parameters, like DEVICE_NWK = 0xbeef to the NWK address of the device you want to scan and also DATABASE and HUSBZB port to match your environment

import asyncio
import bellows.ezsp
import logging

from bellows.zigbee.application import ControllerApplication
from zigpy.exceptions import ZigbeeException

DEVICE_NWK = 0xce99
DATABASE = '/home/lex/.ha-dev/zigbee.db'
HUSBZB_PORT = '/dev/ttyUSB1'

_LOGGER = logging.getLogger(__name__)

async def start():
    global APP

    radio = bellows.ezsp.EZSP()
    await radio.connect(HUSBZB_PORT, 57600)

    APP = ControllerApplication(radio, DATABASE)
    await APP.startup(auto_form=True)
    return APP

async def scan_cluster(cluster):
    supported = {}
    unsupported = {}
    for attr_id, attr in cluster.attributes.items():
        attr_name = attr[0]
        _LOGGER.info("Trying '{}' attribute attr id: {}".format(attr_name, attr_id))
        res, fail = {}, {}
            res, fail = await cluster.read_attributes([attr_name], allow_cache=False)
        except ZigbeeException as ex:
            _LOGGER.error("Failed to read '{}' attribute. Error: {}".format(attr_name, ex))

        if attr_name in res:
            val = res.get(attr_name)
            _LOGGER.info("'{}' = {}".format(attr_name, val))
            supported["0x{:04x}-{}".format(attr_id, attr_name)] = val
        elif attr_name in fail:
            unsupported["0x{:04x}-{}".format(attr_id, attr_name)] = fail.get(attr_name)
            _LOGGER.debug("attr {} read fail: {}".format(attr_name, fail))
            _LOGGER.error("Something unexpected reading '{}' attribute. {}/{}".format(attr_name, res, fail))
        await asyncio.sleep(0.6)

    print("All supported attributes")
    for attr in sorted(iter(supported.keys())):
        print("'{}' = {}".format(attr, supported[attr]))
    print("All un-supported attributes")
    for attr in sorted(iter(unsupported.keys())):
        print("'{}' = {}".format(attr, unsupported[attr]))

async def task(device_nwk):
    app = await start()
    dev = app.get_device(nwk=device_nwk)
    print("Scanning device 0x{:04x}".format(device_nwk))
    for epid, ep in dev.endpoints.items():
        if epid == 0:
        print("endpoint #{}".format(epid))
        await scan_endpoint(ep)

async def scan_endpoint(ep):
    for cluster in ep.in_clusters.values():
        print("{} cluster".format(cluster.ep_attribute))
        await scan_cluster(cluster)

def main():
    loop = asyncio.get_event_loop()

if __name__ == '__main__':


@Quatuor, thank you so much for that. I had upgraded to the new releases of zigpy and bellows, but forgot to add the --skip-pip command to my hass startup script. Once I did that, the one light that I have been able to get to show up as a light has worked perfectly.