5 Inspired by code written by Paul Malmsten, 2010 6 Inspired by code written by Amit Synderman and Marco Sangalli 9 This module implements an XBee ZB (ZigBee) API library. 16 Provides an implementation of the XBee API for XBee ZB (ZigBee) modules 19 Commands may be sent to a device by instantiating this class with 20 a serial port object (see PySerial) and then calling the send 21 method with the proper information specified by the API. Data may 22 be read from a device synchronously by calling wait_read_frame. 23 For asynchronous reads, see the defintion of XBeeBase. 35 [{
'name':
'id',
'len':1,
'default':
'\x08'},
36 {
'name':
'frame_id',
'len':1,
'default':
'\x01'},
37 {
'name':
'command',
'len':2,
'default':
None},
38 {
'name':
'parameter',
'len':
None,
'default':
None}],
40 [{
'name':
'id',
'len':1,
'default':
'\x09'},
41 {
'name':
'frame_id',
'len':1,
'default':
'\x01'},
42 {
'name':
'command',
'len':2,
'default':
None},
43 {
'name':
'parameter',
'len':
None,
'default':
None}],
45 [{
'name':
'id',
'len':1,
'default':
'\x17'},
46 {
'name':
'frame_id',
'len':1,
'default':
'\x00'},
48 {
'name':
'dest_addr_long',
'len':8,
'default':struct.pack(
'>Q', 0)},
49 {
'name':
'dest_addr',
'len':2,
'default':
'\xFF\xFE'},
50 {
'name':
'options',
'len':1,
'default':
'\x02'},
51 {
'name':
'command',
'len':2,
'default':
None},
52 {
'name':
'parameter',
'len':
None,
'default':
None}],
54 [{
'name':
'id',
'len':1,
'default':
'\x10'},
55 {
'name':
'frame_id',
'len':1,
'default':
'\x01'},
56 {
'name':
'dest_addr_long',
'len':8,
'default':
None},
57 {
'name':
'dest_addr',
'len':2,
'default':
None},
58 {
'name':
'broadcast_radius',
'len':1,
'default':
'\x00'},
59 {
'name':
'options',
'len':1,
'default':
'\x00'},
60 {
'name':
'data',
'len':
None,
'default':
None}],
62 [{
'name':
'id',
'len':1,
'default':
'\x11'},
63 {
'name':
'frame_id',
'len':1,
'default':
'\x00'},
64 {
'name':
'dest_addr_long',
'len':8,
'default':
None},
65 {
'name':
'dest_addr',
'len':2,
'default':
None},
66 {
'name':
'src_endpoint',
'len':1,
'default':
None},
67 {
'name':
'dest_endpoint',
'len':1,
'default':
None},
68 {
'name':
'cluster',
'len':1,
'default':
None},
69 {
'name':
'profile',
'len':1,
'default':
None},
70 {
'name':
'broadcast_radius',
'len':1,
'default':
'\x00'},
71 {
'name':
'options',
'len':1,
'default':
'\x00'},
72 {
'name':
'data',
'len':
None,
'default':
None}]
89 api_responses = {
"\x90":
92 [{
'name':
'source_addr_long',
'len':8},
93 {
'name':
'source_addr',
'len':2},
94 {
'name':
'options',
'len':1},
95 {
'name':
'rf_data',
'len':
None}]},
97 {
'name':
'rx_explicit',
99 [{
'name':
'source_addr_long',
'len':8},
100 {
'name':
'source_addr',
'len':2},
101 {
'name':
'source_endpoint',
'len':1},
102 {
'name':
'dest_endpoint',
'len':1},
103 {
'name':
'cluster',
'len':2},
104 {
'name':
'profile',
'len':2},
105 {
'name':
'options',
'len':1},
106 {
'name':
'rf_data',
'len':
None}]},
108 {
'name':
'rx_io_data_long_addr',
110 [{
'name':
'source_addr_long',
'len':8},
111 {
'name':
'source_addr',
'len':2},
112 {
'name':
'options',
'len':1},
113 {
'name':
'samples',
'len':
None}],
114 'parse_as_io_samples':
'samples'},
118 [{
'name':
'frame_id',
'len':1},
119 {
'name':
'dest_addr',
'len':2},
120 {
'name':
'retries',
'len':1},
121 {
'name':
'deliver_status',
'len':1},
122 {
'name':
'discover_status',
'len':1}]},
126 [{
'name':
'status',
'len':1}]},
128 {
'name':
'at_response',
130 [{
'name':
'frame_id',
'len':1},
131 {
'name':
'command',
'len':2},
132 {
'name':
'status',
'len':1},
133 {
'name':
'parameter',
'len':
None}]},
135 {
'name':
'remote_at_response',
137 [{
'name':
'frame_id',
'len':1},
138 {
'name':
'source_addr_long',
'len':8},
139 {
'name':
'source_addr',
'len':2},
140 {
'name':
'command',
'len':2},
141 {
'name':
'status',
'len':1},
142 {
'name':
'parameter',
'len':
None}]},
144 {
'name':
'node_id_indicator',
146 [{
'name':
'sender_addr_long',
'len':8},
147 {
'name':
'sender_addr',
'len':2},
148 {
'name':
'options',
'len':1},
149 {
'name':
'source_addr',
'len':2},
150 {
'name':
'source_addr_long',
'len':8},
151 {
'name':
'node_id',
'len':
'null_terminated'},
152 {
'name':
'parent_source_addr',
'len':2},
153 {
'name':
'device_type',
'len':1},
154 {
'name':
'source_event',
'len':1},
155 {
'name':
'digi_profile_id',
'len':2},
156 {
'name':
'manufacturer_id',
'len':2}]}
161 super(ZigBee, self).
__init__(*args, **kwargs)
165 _parse_samples_header: binary data in XBee ZB IO data format -> 166 (int, [int ...], [int ...], int, int) 168 _parse_samples_header will read the first three bytes of the 169 binary data given and will return the number of samples which 170 follow, a list of enabled digital inputs, a list of enabled 171 analog inputs, the dio_mask, and the size of the header in bytes 173 _parse_samples_header is overloaded here to support the additional 174 IO lines offered by the XBee ZB 179 sample_count = ord(io_bytes[0])
182 dio_mask = (ord(io_bytes[1]) << 8 | ord(io_bytes[2])) & 0x0E7F
185 aio_mask = ord(io_bytes[3])
191 for i
in range(0,13):
192 if dio_mask & (1 << i):
198 if aio_mask & (1 << i):
203 return (sample_count, dio_chans, aio_chans, dio_mask, header_size)
def _parse_samples_header(self, io_bytes)
def __init__(self, args, kwargs)