1
1
from __future__ import annotations
2
2
3
- import asyncio
4
3
import logging
5
4
6
5
import zigpy .zdo
7
6
import zigpy .device
8
- import zigpy .zdo .types as zdo_t
9
7
import zigpy .application
10
8
11
- import zigpy_znp .types as t
12
- import zigpy_znp .commands as c
13
- import zigpy_znp .zigbee .application as znp_app
14
-
15
9
LOGGER = logging .getLogger (__name__ )
16
10
17
11
NWK_UPDATE_LOOP_DELAY = 1
@@ -22,13 +16,6 @@ class ZNPCoordinator(zigpy.device.Device):
22
16
Coordinator zigpy device that keeps track of our endpoints and clusters.
23
17
"""
24
18
25
- def __init__ (self , * args , ** kwargs ):
26
- super ().__init__ (* args , ** kwargs )
27
-
28
- assert hasattr (self , "zdo" )
29
- self .zdo = ZNPZDOEndpoint (self )
30
- self .endpoints [0 ] = self .zdo
31
-
32
19
@property
33
20
def manufacturer (self ):
34
21
return "Texas Instruments"
@@ -72,111 +59,3 @@ def request(
72
59
timeout = timeout ,
73
60
use_ieee = use_ieee ,
74
61
)
75
-
76
-
77
- class ZNPZDOEndpoint (zigpy .zdo .ZDO ):
78
- @property
79
- def app (self ) -> zigpy .application .ControllerApplication :
80
- return self .device .application
81
-
82
- def _send_loopback_reply (
83
- self , command_id : zdo_t .ZDOCmd , * , tsn : t .uint8_t , ** kwargs
84
- ):
85
- """
86
- Constructs and sends back a loopback ZDO response.
87
- """
88
-
89
- message = t .uint8_t (tsn ).serialize () + self ._serialize (
90
- command_id , * kwargs .values ()
91
- )
92
-
93
- LOGGER .debug ("Sending loopback reply %s (%s), tsn=%s" , command_id , kwargs , tsn )
94
-
95
- self .app .handle_message (
96
- sender = self .app ._device ,
97
- profile = znp_app .ZDO_PROFILE ,
98
- cluster = command_id ,
99
- src_ep = znp_app .ZDO_ENDPOINT ,
100
- dst_ep = znp_app .ZDO_ENDPOINT ,
101
- message = message ,
102
- )
103
-
104
- def handle_mgmt_nwk_update_req (
105
- self , hdr : zdo_t .ZDOHeader , NwkUpdate : zdo_t .NwkUpdate , * , dst_addressing
106
- ):
107
- """
108
- Handles ZDO `Mgmt_NWK_Update_req` sent to the coordinator.
109
- """
110
-
111
- self .create_catching_task (
112
- self .async_handle_mgmt_nwk_update_req (
113
- hdr , NwkUpdate , dst_addressing = dst_addressing
114
- )
115
- )
116
-
117
- async def async_handle_mgmt_nwk_update_req (
118
- self , hdr : zdo_t .ZDOHeader , NwkUpdate : zdo_t .NwkUpdate , * , dst_addressing
119
- ):
120
- # Energy scans are handled properly by Z-Stack, no need to do anything
121
- if NwkUpdate .ScanDuration not in (
122
- zdo_t .NwkUpdate .CHANNEL_CHANGE_REQ ,
123
- zdo_t .NwkUpdate .CHANNEL_MASK_MANAGER_ADDR_CHANGE_REQ ,
124
- ):
125
- return
126
-
127
- old_network_info = self .app .state .network_info
128
-
129
- if (
130
- t .Channels .from_channel_list ([old_network_info .channel ])
131
- == NwkUpdate .ScanChannels
132
- ):
133
- LOGGER .warning ("NWK update request is ignored when channel does not change" )
134
- self ._send_loopback_reply (
135
- zdo_t .ZDOCmd .Mgmt_NWK_Update_rsp ,
136
- Status = zdo_t .Status .SUCCESS ,
137
- ScannedChannels = t .Channels .NO_CHANNELS ,
138
- TotalTransmissions = 0 ,
139
- TransmissionFailures = 0 ,
140
- EnergyValues = [],
141
- tsn = hdr .tsn ,
142
- )
143
- return
144
-
145
- await self .app ._znp .request (
146
- request = c .ZDO .MgmtNWKUpdateReq .Req (
147
- Dst = 0x0000 ,
148
- DstAddrMode = t .AddrMode .NWK ,
149
- Channels = NwkUpdate .ScanChannels ,
150
- ScanDuration = NwkUpdate .ScanDuration ,
151
- # Missing fields in the request cannot be `None` in the Z-Stack command
152
- ScanCount = NwkUpdate .ScanCount or 0 ,
153
- NwkManagerAddr = NwkUpdate .nwkManagerAddr or 0x0000 ,
154
- ),
155
- RspStatus = t .Status .SUCCESS ,
156
- )
157
-
158
- # Wait until the network info changes, it can take ~5s
159
- while (
160
- self .app .state .network_info .nwk_update_id == old_network_info .nwk_update_id
161
- ):
162
- await self .app .load_network_info (load_devices = False )
163
- await asyncio .sleep (NWK_UPDATE_LOOP_DELAY )
164
-
165
- # Z-Stack automatically increments the NWK update ID instead of setting it
166
- # TODO: Directly set it once radio settings API is finalized.
167
- if NwkUpdate .nwkUpdateId != self .app .state .network_info .nwk_update_id :
168
- LOGGER .warning (
169
- f"`nwkUpdateId` was incremented to"
170
- f" { self .app .state .network_info .nwk_update_id } instead of being"
171
- f" set to { NwkUpdate .nwkUpdateId } "
172
- )
173
-
174
- self ._send_loopback_reply (
175
- zdo_t .ZDOCmd .Mgmt_NWK_Update_rsp ,
176
- Status = zdo_t .Status .SUCCESS ,
177
- ScannedChannels = t .Channels .NO_CHANNELS ,
178
- TotalTransmissions = 0 ,
179
- TransmissionFailures = 0 ,
180
- EnergyValues = [],
181
- tsn = hdr .tsn ,
182
- )
0 commit comments