From b88b582d1c5d7a9a71dee513a931d44ba4f25d19 Mon Sep 17 00:00:00 2001 From: puddly <32534428+puddly@users.noreply.github.com> Date: Wed, 17 Nov 2021 18:15:47 -0500 Subject: [PATCH 1/2] Implement ZDO converter for `Mgmt_NWK_Update_req` --- zigpy_znp/zigbee/zdo_converters.py | 30 ++++++++++++++++++++++++++++++ 1 file changed, 30 insertions(+) diff --git a/zigpy_znp/zigbee/zdo_converters.py b/zigpy_znp/zigbee/zdo_converters.py index 69eb1c02..cf5b0091 100644 --- a/zigpy_znp/zigbee/zdo_converters.py +++ b/zigpy_znp/zigbee/zdo_converters.py @@ -102,6 +102,36 @@ (lambda addr: c.ZDO.MgmtLeaveRsp.Callback(partial=True, Src=addr.address)), (lambda rsp: (ZDOCmd.Mgmt_Leave_rsp, {"Status": rsp.Status})), ), + ZDOCmd.Mgmt_NWK_Update_req: ( + ( + lambda addr, NwkUpdate: c.ZDO.MgmtNWKUpdateReq.Req( + Dst=addr.address, + DstAddrMode=addr.mode, + Channels=NwkUpdate.ScanChannels, + ScanDuration=NwkUpdate.ScanDuration, + ScanCount=NwkUpdate.ScanCount, + # XXX: nwkUpdateId is hard-coded to `_NIB.nwkUpdateId + 1` + NwkManagerAddr=NwkUpdate.nwkManagerAddr, + ) + ), + ( + lambda addr: c.ZDO.MgmtNWKUpdateNotify.Callback( + partial=True, Src=addr.address + ) + ), + ( + lambda rsp: ( + ZDOCmd.Mgmt_NWK_Update_rsp, + { + "Status": rsp.Status, + "ScannedChannels": rsp.ScannedChannels, + "TotalTransmissions": rsp.TotalTransmissions, + "TransmissionFailures": rsp.TransmissionFailures, + "EnergyValues": rsp.EnergyValues, + }, + ) + ), + ), ZDOCmd.Bind_req: ( ( lambda addr, SrcAddress, SrcEndpoint, ClusterID, DstAddress: ( From 5039182c2859e22a2019973617a5b45a7570d32b Mon Sep 17 00:00:00 2001 From: puddly <32534428+puddly@users.noreply.github.com> Date: Wed, 17 Nov 2021 23:59:56 -0500 Subject: [PATCH 2/2] Switch energy scan command to use zigpy methods --- zigpy_znp/tools/energy_scan.py | 22 ++++++++++------------ zigpy_znp/zigbee/zdo_converters.py | 2 +- 2 files changed, 11 insertions(+), 13 deletions(-) diff --git a/zigpy_znp/tools/energy_scan.py b/zigpy_znp/tools/energy_scan.py index 15637e72..e05f0c13 100644 --- a/zigpy_znp/tools/energy_scan.py +++ b/zigpy_znp/tools/energy_scan.py @@ -4,8 +4,9 @@ import itertools from collections import deque, defaultdict +import zigpy.zdo.types as zdo_t + import zigpy_znp.types as t -import zigpy_znp.commands as c from zigpy_znp.tools.common import setup_parser from zigpy_znp.zigbee.application import ControllerApplication @@ -34,20 +35,17 @@ async def perform_energy_scan(radio_path, num_scans=None): if num_scans is not None and i > num_scans: break - rsp = await app._znp.request_callback_rsp( - request=c.ZDO.MgmtNWKUpdateReq.Req( - Dst=0x0000, - DstAddrMode=t.AddrMode.NWK, - Channels=t.Channels.ALL_CHANNELS, - ScanDuration=0x02, # exponent + rsp = await app.get_device(nwk=0x0000).zdo.Mgmt_NWK_Update_req( + zdo_t.NwkUpdate( + ScanChannels=t.Channels.ALL_CHANNELS, + ScanDuration=0x02, ScanCount=1, - NwkManagerAddr=0x0000, - ), - RspStatus=t.Status.SUCCESS, - callback=c.ZDO.MgmtNWKUpdateNotify.Callback(partial=True, Src=0x0000), + ) ) - for channel, energy in zip(rsp.ScannedChannels, rsp.EnergyValues): + _, scanned_channels, _, _, energy_values = rsp + + for channel, energy in zip(scanned_channels, energy_values): energies = channel_energies[channel] energies.append(energy) diff --git a/zigpy_znp/zigbee/zdo_converters.py b/zigpy_znp/zigbee/zdo_converters.py index cf5b0091..33d6719e 100644 --- a/zigpy_znp/zigbee/zdo_converters.py +++ b/zigpy_znp/zigbee/zdo_converters.py @@ -111,7 +111,7 @@ ScanDuration=NwkUpdate.ScanDuration, ScanCount=NwkUpdate.ScanCount, # XXX: nwkUpdateId is hard-coded to `_NIB.nwkUpdateId + 1` - NwkManagerAddr=NwkUpdate.nwkManagerAddr, + NwkManagerAddr=NwkUpdate.nwkManagerAddr or 0x0000, ) ), (