@@ -67,25 +67,42 @@ class Command(t.uint8_t, enum.Enum):
6767 Command .zigbee_green_power : ((t .LVBytes , ), False ),
6868}
6969
70- NETWORK_PARAMETER = {
71- 'mac_address' : (0x01 , t .uint64_t ),
72- 'nwk_panid' : (0x05 , t .uint16_t ),
73- 'nwk_address' : (0x07 , t .uint16_t ),
74- 'nwk_extended_panid' : (0x08 , t .uint64_t ),
75- 'aps_designed_coordinator' : (0x09 , t .uint8_t ),
76- 'channel_mask' : (0x0A , t .uint32_t ),
77- 'aps_extended_panid' : (0x0B , t .uint64_t ),
78- 'trust_center_address' : (0x0E , t .uint64_t ),
79- 'security_mode' : (0x10 , t .uint8_t ),
80- 'network_key' : (0x18 , t .uint8_t ),
81- 'current_channel' : (0x1C , t .uint8_t ),
82- 'permit_join' : (0x21 , t .uint8_t ),
83- 'protocol_version' : (0x22 , t .uint16_t ),
84- 'nwk_update_id' : (0x24 , t .uint8_t ),
85- 'watchdog_ttl' : (0x26 , t .uint32_t ),
86- }
8770
88- NETWORK_PARAMETER_BY_ID = {v [0 ]: (k , v [1 ]) for k , v in NETWORK_PARAMETER .items ()}
71+ class NetworkParameter (t .uint8_t , enum .Enum ):
72+ mac_address = 0x01
73+ nwk_panid = 0x05
74+ nwk_address = 0x07
75+ nwk_extended_panid = 0x08
76+ aps_designed_coordinator = 0x09
77+ channel_mask = 0x0A
78+ aps_extended_panid = 0x0B
79+ trust_center_address = 0x0E
80+ security_mode = 0x10
81+ network_key = 0x18
82+ current_channel = 0x1C
83+ permit_join = 0x21
84+ protocol_version = 0x22
85+ nwk_update_id = 0x24
86+ watchdog_ttl = 0x26
87+
88+
89+ NETWORK_PARAMETER_SCHEMA = {
90+ NetworkParameter .mac_address : t .EUI64 ,
91+ NetworkParameter .nwk_panid : t .uint16_t ,
92+ NetworkParameter .nwk_address : t .uint16_t ,
93+ NetworkParameter .nwk_extended_panid : t .uint64_t ,
94+ NetworkParameter .aps_designed_coordinator : t .uint8_t ,
95+ NetworkParameter .channel_mask : t .uint32_t ,
96+ NetworkParameter .aps_extended_panid : t .uint64_t ,
97+ NetworkParameter .trust_center_address : t .uint64_t ,
98+ NetworkParameter .security_mode : t .uint8_t ,
99+ NetworkParameter .network_key : t .uint8_t ,
100+ NetworkParameter .current_channel : t .uint8_t ,
101+ NetworkParameter .permit_join : t .uint8_t ,
102+ NetworkParameter .protocol_version : t .uint16_t ,
103+ NetworkParameter .nwk_update_id : t .uint8_t ,
104+ NetworkParameter .watchdog_ttl : t .uint32_t ,
105+ }
89106
90107
91108class Status (t .uint8_t , enum .Enum ):
@@ -206,19 +223,44 @@ def change_network_state(self, state):
206223 def _handle_change_network_state (self , data ):
207224 LOGGER .debug ("Change network state response: %s" , NetworkState (data [0 ]).name )
208225
209- def read_parameter (self , id_ ):
210- return self ._command (Command .read_parameter , 1 , id_ )
226+ async def read_parameter (self , id_ ):
227+ try :
228+ if isinstance (id_ , str ):
229+ param = NetworkParameter [id_ ]
230+ else :
231+ param = NetworkParameter (id_ )
232+ except (KeyError , ValueError ):
233+ raise KeyError ("Unknown parameter id: %s" % (id_ , ))
234+
235+ r = await self ._command (Command .read_parameter , 1 , param )
236+ data = NETWORK_PARAMETER_SCHEMA [param ].deserialize (r [2 ])[0 ]
237+ LOGGER .debug ("Read parameter %s response: %s" , param .name , data )
238+ return data
211239
212240 def _handle_read_parameter (self , data ):
213- LOGGER . debug ( "Read parameter %s response: %s" , NETWORK_PARAMETER_BY_ID [ data [ 1 ]][ 0 ], data [ 2 ])
241+ pass
214242
215243 def write_parameter (self , id_ , value ):
216- v = NETWORK_PARAMETER_BY_ID [id_ ][1 ](value ).serialize ()
244+ try :
245+ if isinstance (id_ , str ):
246+ param = NetworkParameter [id_ ]
247+ else :
248+ param = NetworkParameter (id_ )
249+ except (KeyError , ValueError ):
250+ raise KeyError ("Unknown parameter id: %s write request" % (id_ ,))
251+
252+ v = NETWORK_PARAMETER_SCHEMA [param ](value ).serialize ()
217253 length = len (v ) + 1
218- return self ._command (Command .write_parameter , length , id_ , v )
254+ return self ._command (Command .write_parameter , length , param , v )
219255
220256 def _handle_write_parameter (self , data ):
221- LOGGER .debug ("Write parameter %s: SUCCESS" , NETWORK_PARAMETER_BY_ID [data [1 ]][0 ])
257+ try :
258+ param = NetworkParameter (data [1 ])
259+ except ValueError :
260+ LOGGER .error ("Received unknown network param id '%s' response" ,
261+ data [1 ])
262+ return
263+ LOGGER .debug ("Write parameter %s: SUCCESS" , param .name )
222264
223265 def version (self ):
224266 return self ._command (Command .version )
@@ -317,3 +359,9 @@ def _handle_device_state_value(self, value):
317359 if DeviceState .APSDE_DATA_CONFIRM in flags and not self ._data_confirm :
318360 self ._data_confirm = True
319361 asyncio .ensure_future (self ._aps_data_confirm ())
362+
363+ def __getitem__ (self , key ):
364+ return self .read_parameter (key )
365+
366+ def __setitem__ (self , key , value ):
367+ return asyncio .ensure_future (self .write_parameter (key , value ))
0 commit comments