Skip to content

Commit 079d0eb

Browse files
authored
Subscribe to all ZDO clusters with a single callback (#178)
1 parent 824c2b2 commit 079d0eb

File tree

3 files changed

+17
-7
lines changed

3 files changed

+17
-7
lines changed

docs/Z-Stack Monitor and Test API.pdf

-519 KB
Binary file not shown.

tests/conftest.py

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -856,7 +856,12 @@ def zdo_route_check(self, request):
856856

857857
@reply_to(c.ZDO.MsgCallbackRegister.Req(partial=True))
858858
def register_zdo_callback(self, request):
859-
self.zdo_callbacks.add(request.ClusterId)
859+
if request.ClusterId == 0xFFFF:
860+
for cluster_id in zdo_t.ZDOCmd:
861+
self.zdo_callbacks.add(cluster_id)
862+
else:
863+
self.zdo_callbacks.add(request.ClusterId)
864+
860865
return c.ZDO.MsgCallbackRegister.Rsp(Status=t.Status.SUCCESS)
861866

862867
@reply_to(c.UTIL.AssocFindDevice.Req(Index=0))

zigpy_znp/zigbee/application.py

Lines changed: 11 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -210,12 +210,7 @@ async def start_network(self, *, read_only=False):
210210
await self.register_endpoints()
211211

212212
# Receive a callback for every known ZDO command
213-
for cluster_id in zdo_t.ZDOCmd:
214-
# Ignore outgoing ZDO requests, only receive announcements and responses
215-
if cluster_id.name.endswith(("_req", "_set")):
216-
continue
217-
218-
await self._znp.request(c.ZDO.MsgCallbackRegister.Req(ClusterId=cluster_id))
213+
await self._znp.request(c.ZDO.MsgCallbackRegister.Req(ClusterId=0xFFFF))
219214

220215
# Setup the coordinator as a zigpy device and initialize it to request node info
221216
self.devices[self.state.node_info.ieee] = ZNPCoordinator(
@@ -521,6 +516,16 @@ async def on_zdo_message(self, msg: c.ZDO.MsgCbIncoming.Callback) -> None:
521516
Global callback for all ZDO messages.
522517
"""
523518

519+
try:
520+
zdo_t.ZDOCmd(msg.ClusterId)
521+
except ValueError:
522+
pass
523+
else:
524+
# Ignore loopback ZDO requests, only receive announcements and responses
525+
if zdo_t.ZDOCmd(msg.ClusterId).name.endswith(("_req", "_set")):
526+
LOGGER.debug("Ignoring loopback ZDO request")
527+
return
528+
524529
message = t.uint8_t(msg.TSN).serialize() + msg.Data
525530
hdr, data = zdo_t.ZDOHeader.deserialize(msg.ClusterId, message)
526531
names, types = zdo_t.CLUSTERS[msg.ClusterId]

0 commit comments

Comments
 (0)