Table of Contents
Intro
So, my first Zigbee bulbs were a bunch of Philips Hues. I snagged a pretty good deal on the bundle, but honestly, they were still pricey even with the discount. I was expecting top-notch quality, but two of them kicked the bucket in under two years, which got me looking for other options.
The first (and only) alternative I’ve tried is this eWeLink
model CK-BL702-AL-01(7009_Z102LG03-1)
. Yeah, the name is a mouthful and sounds kinda scary, but they were only four bucks each on AliExpress! I ordered six of them to swap out the old Philips WiZ WiFi downlights in my kitchen.
The lights showed up surprisingly fast and they were all working perfectly. Pairing them with Home Assistant was a breeze, they just worked with the standard Zigbee 3.0 pairing, no funny business.
Now, let’s take a look at the Zigbee signature for these lights:
{
"node_descriptor": {
"logical_type": 1,
"complex_descriptor_available": 0,
"user_descriptor_available": 0,
"reserved": 0,
"aps_flags": 0,
"frequency_band": 8,
"mac_capability_flags": 142,
"manufacturer_code": 4742,
"maximum_buffer_size": 127,
"maximum_incoming_transfer_size": 242,
"server_mask": 11264,
"maximum_outgoing_transfer_size": 242,
"descriptor_capability_field": 0
},
"endpoints": {
"1": {
"profile_id": "0x0104",
"device_type": "0x010d",
"input_clusters": [
"0x0000",
"0x0003",
"0x0004",
"0x0005",
"0x0006",
"0x0008",
"0x0300",
"0x1000",
"0xef00",
"0xfc11",
"0xfc57"
],
"output_clusters": [
"0x0019"
]
}
},
"manufacturer": "eWeLink",
"model": "CK-BL702-AL-01(7009_Z102LG03-1)",
"class": "zigpy.device.Device"
}
Node Descriptor
Logical Type
Logical Type set to 1
means these lights are Zigbee Routers, which is great news. Routers help extend your network’s range and make it more reliable.
Complex Descriptor Available
This device doesn’t have a complex descriptor, which is totally normal. Most devices skip this.
User Descriptor Available
This is different from the complex descriptor, it’s meant for storing a custom label on the device itself. It’s empty here, which is standard if you’ve never set one. I don’t think Home Assistant even lets you edit this field right now anyway.
Honestly, HA’s own labeling system is way more flexible, since it’s not limited to a measly 16 characters like this Zigbee field.
Reserved
This is just an unused field saved for future features, so 0
is exactly what we’d expect.
APS Flags
The Application Support Sub-layer (APS) flags are all zeros, which is pretty common.
Frequency Band
Value 8
means it’s using the 2.4 GHz
band, the same crowded-but-universal frequency everything else uses.
Medium Access Control Capability Flags
142
is 1000 1110
in binary (LSB 0111 0001
):
Bit | Name | Value | Note |
---|---|---|---|
0 | Alternate PAN coordinator | 0 | Can’t become a coordinator |
1 | Device type | 1 | Full function, can route |
2 | Power source | 1 | Mains-powered (not battery) |
3 | Receiver ON when idle | 1 | Always awake and listening |
4 | Reserved | 0 | Reserved |
5 | Reserved | 0 | Reserved |
6 | Security capability | 0 | Doesn’t handle security at this level |
7 | Allocate address | 1 | Can help joining new devices |
This looks… interesting. The security capability bit being zero seems suspicious, but this is my first time digging this deep into a Zigbee descriptor. Maybe Zigbee 3.0 handles security at a different level and this flag is just legacy stuff?
Manufacturer Code
4742
appears to be Signify Netherlands B.V. (the company behind Philips Hue). This is pretty clever, these bulbs are basically pretending to be Hue bulbs to sneak into a Hue Bridge ecosystem.
Maximum Buffer Size
127
is the most common value and means it can handle the largest standard packet size.
Maximum Incoming Transfer Size
242
is weird here. To actually transfer chunks this big, the device would need to support packet fragmentation… but that capability isn’t advertised in the APS flags. Something’s not adding up.
Server Mask
All the flags set here are “reserved”, meaning the device is using them for some non-standard, manufacturer-specific services. Not unusual for Zigbee devices trying to add (or pretending to have) extra features.
Maximum Outgoing Transfer Size
Same issue as before, 242
suggests it should support large outgoing transfers, but the APS flags don’t back that up. Another inconsistency.
Descriptor Capability Field
0
is standard, just confirms there are no extra descriptors beyond the basics.
Endpoint 1 of 1
Profile ID
0x0104
is Zigbee Light Link (ZLL), the standard profile for smart lights.
Device Type
0x010D
means “Extended Color Light.” This is exactly what we’d expect for a tunable white + RGB bulb, so Home Assistant should recognize it without any issues.
Input Clusters
ID | Note |
---|---|
0x0000 |
Basic: Mandatory info like version and manufacturer. |
0x0003 |
Identify: Makes the light blink, useful for finding it in a group. |
0x0004 |
Groups: Lets you control multiple lights together. |
0x0005 |
Scenes: Can save and recall preset colors/brightness. |
0x0006 |
On/Off: The basics. |
0x0008 |
Level Control: Dimming. |
0x0300 |
Color Control: Handles all the colors and white temperatures. |
0x1000 |
Touchlink Commissioning: Lets you pair by holding it close to a bridge. |
0xef00 |
Manufacturer Specific: Who knows? Custom feature. |
0xfc11 |
Manufacturer Specific: Another custom thing. |
0xfc57 |
Manufacturer Specific: Could be for custom firmware updates. |
Output Clusters
ID | Note |
---|---|
0x0019 |
OTA Updates: Can receive firmware over-the-air. |
Manufacturer
It’s showing as eWeLink
, but it’s super easy to spoof this field when compiling firmware, so this doesn’t necessarily mean it’s officially from them.
Model
CK-BL702-AL-01(7009_Z102LG03-1)
, that’s a model number alright.
Class
zigpy.device.Device
means Home Assistant is using a generic driver with no special quirks. It should just work without any fancy custom handling.
Conclusion
Take this with a grain of salt, since it’s the first Zigbee device I’ve really dug into. But I’ll be reviewing a lot more of these soon, I’m going all-in on Zigbee and want to really understand how it works under the hood.