Skip to content

Commit f52b9f5

Browse files
authored
use zigpy packet_received (#160)
1 parent 66a1f42 commit f52b9f5

File tree

2 files changed

+48
-61
lines changed

2 files changed

+48
-61
lines changed

tests/test_application.py

Lines changed: 26 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44
import zigpy.exceptions
55
import zigpy.state
66
import zigpy.types as t
7+
import zigpy.zdo
78
import zigpy.zdo.types as zdo_t
89

910
from zigpy_xbee.api import XBee
@@ -105,17 +106,15 @@ def _test_rx(
105106
def test_rx(app):
106107
device = mock.MagicMock()
107108
app.handle_message = mock.MagicMock()
108-
_test_rx(app, device, mock.sentinel.src_nwk, data=mock.sentinel.message)
109-
assert app.handle_message.call_count == 1
110-
assert app.handle_message.call_args == (
111-
(
112-
device,
113-
mock.sentinel.profile_id,
114-
mock.sentinel.cluster_id,
115-
mock.sentinel.src_ep,
116-
mock.sentinel.dst_ep,
117-
mock.sentinel.message,
118-
),
109+
_test_rx(app, device, 0x1234, data=b"\x01\x02\x03\x04")
110+
app.handle_message.assert_called_once_with(
111+
sender=device,
112+
profile=mock.sentinel.profile_id,
113+
cluster=mock.sentinel.cluster_id,
114+
src_ep=mock.sentinel.src_ep,
115+
dst_ep=mock.sentinel.dst_ep,
116+
message=b"\x01\x02\x03\x04",
117+
dst_addressing=t.AddrMode.NWK,
119118
)
120119

121120

@@ -140,7 +139,8 @@ def test_rx_nwk_0000(app):
140139
def test_rx_unknown_device(app, device):
141140
"""Unknown NWK, but existing device."""
142141
app.handle_message = mock.MagicMock()
143-
app.handle_join = mock.MagicMock()
142+
app.create_task = mock.MagicMock()
143+
app._discover_unknown_device = mock.MagicMock()
144144
dev = device(nwk=0x1234)
145145
app.devices[dev.ieee] = dev
146146

@@ -155,15 +155,17 @@ def test_rx_unknown_device(app, device):
155155
mock.sentinel.rxopts,
156156
b"",
157157
)
158-
assert app.handle_join.call_count == 1
159-
assert app.handle_message.call_count == 1
158+
assert app.create_task.call_count == 1
159+
app._discover_unknown_device.assert_called_once_with(0x3334)
160+
assert app.handle_message.call_count == 0
160161
assert len(app.devices) == num_before_rx
161162

162163

163164
def test_rx_unknown_device_ieee(app):
164165
"""Unknown NWK, and unknown IEEE."""
165166
app.handle_message = mock.MagicMock()
166-
app.handle_join = mock.MagicMock()
167+
app.create_task = mock.MagicMock()
168+
app._discover_unknown_device = mock.MagicMock()
167169
app.get_device = mock.MagicMock(side_effect=KeyError)
168170
app.handle_rx(
169171
b"\xff\xff\xff\xff\xff\xff\xff\xff",
@@ -175,7 +177,8 @@ def test_rx_unknown_device_ieee(app):
175177
mock.sentinel.rxopts,
176178
b"",
177179
)
178-
assert app.handle_join.call_count == 0
180+
assert app.create_task.call_count == 1
181+
app._discover_unknown_device.assert_called_once_with(0x3334)
179182
assert app.get_device.call_count == 2
180183
assert app.handle_message.call_count == 0
181184

@@ -201,6 +204,8 @@ def _device(new=False, zdo_init=False, nwk=t.uint16_t(0x1234)):
201204
def _device_join(app, dev, data):
202205
app.handle_message = mock.MagicMock()
203206
app.handle_join = mock.MagicMock()
207+
app.create_task = mock.MagicMock()
208+
app._discover_unknown_device = mock.MagicMock()
204209

205210
dst_ep = 0
206211
cluster_id = 0x0013
@@ -212,21 +217,21 @@ def _device_join(app, dev, data):
212217

213218
def test_device_join_new(app, device):
214219
dev = device()
215-
data = b"\xee" + dev.nwk.serialize() + dev.ieee.serialize()
220+
data = b"\xee" + dev.nwk.serialize() + dev.ieee.serialize() + b"\x40"
216221

217222
_device_join(app, dev, data)
218223

219224

220225
def test_device_join_inconsistent_nwk(app, device):
221226
dev = device()
222-
data = b"\xee" + b"\x01\x02" + dev.ieee.serialize()
227+
data = b"\xee" + b"\x01\x02" + dev.ieee.serialize() + b"\x40"
223228

224229
_device_join(app, dev, data)
225230

226231

227232
def test_device_join_inconsistent_ieee(app, device):
228233
dev = device()
229-
data = b"\xee" + dev.nwk.serialize() + b"\x01\x02\x03\x04\x05\x06\x07\x08"
234+
data = b"\xee" + dev.nwk.serialize() + b"\x01\x02\x03\x04\x05\x06\x07\x08" + b"\x40"
230235

231236
_device_join(app, dev, data)
232237

@@ -568,6 +573,7 @@ def test_rx_device_annce(app, ieee, nwk):
568573
cluster_id = zdo_t.ZDOCmd.Device_annce
569574
device = mock.MagicMock()
570575
device.status = device.Status.NEW
576+
device.zdo = zigpy.zdo.ZDO(None)
571577
app.get_device = mock.MagicMock(return_value=device)
572578
app.handle_join = mock.MagicMock()
573579
app.handle_message = mock.MagicMock()
@@ -589,10 +595,7 @@ def test_rx_device_annce(app, ieee, nwk):
589595
)
590596

591597
assert app.handle_message.call_count == 1
592-
assert app.handle_join.call_count == 1
593-
assert app.handle_join.call_args[0][0] == nwk
594-
assert app.handle_join.call_args[0][1] == ieee
595-
assert app.handle_join.call_args[0][2] == 0
598+
app.handle_join.assert_called_once_with(nwk=nwk, ieee=ieee, parent_nwk=None)
596599

597600

598601
async def _test_mrequest(app, send_success=True, send_timeout=False, **kwargs):

zigpy_xbee/zigbee/application.py

Lines changed: 22 additions & 38 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,6 @@
44
import logging
55
import math
66
import statistics
7-
import time
87
from typing import Any
98

109
import zigpy.application
@@ -341,49 +340,34 @@ def handle_modem_status(self, status):
341340
def handle_rx(
342341
self, src_ieee, src_nwk, src_ep, dst_ep, cluster_id, profile_id, rxopts, data
343342
):
344-
if src_nwk == 0:
345-
LOGGER.info("handle_rx self addressed")
343+
src = zigpy.types.AddrModeAddress(
344+
addr_mode=zigpy.types.AddrMode.NWK, address=src_nwk
345+
)
346346

347-
ember_ieee = zigpy.types.EUI64(src_ieee)
348-
if dst_ep == 0 and cluster_id == zdo_t.ZDOCmd.Device_annce:
349-
# ZDO Device announce request
350-
nwk, rest = zigpy.types.NWK.deserialize(data[1:])
351-
ieee, rest = zigpy.types.EUI64.deserialize(rest)
352-
LOGGER.info("New device joined: NWK 0x%04x, IEEE %s", nwk, ieee)
353-
if ember_ieee != ieee:
354-
LOGGER.warning(
355-
"Announced IEEE %s is different from originator %s",
356-
str(ieee),
357-
str(ember_ieee),
358-
)
359-
if src_nwk != nwk:
360-
LOGGER.warning(
361-
"Announced 0x%04x NWK is different from originator 0x%04x",
362-
nwk,
363-
src_nwk,
364-
)
365-
self.handle_join(nwk, ieee, 0)
347+
dst = zigpy.types.AddrModeAddress(
348+
addr_mode=zigpy.types.AddrMode.NWK, address=self.state.node_info.nwk
349+
)
366350

367-
try:
368-
self._device.last_seen = time.time()
369-
except KeyError:
370-
pass
351+
if src == dst:
352+
LOGGER.info("handle_rx self addressed")
371353

372354
try:
373-
device = self.get_device(nwk=src_nwk)
355+
self._device.update_last_seen()
374356
except KeyError:
375-
if ember_ieee != UNKNOWN_IEEE and ember_ieee in self.devices:
376-
self.handle_join(src_nwk, ember_ieee, 0)
377-
device = self.get_device(ieee=ember_ieee)
378-
else:
379-
LOGGER.debug(
380-
"Received frame from unknown device: 0x%04x/%s",
381-
src_nwk,
382-
str(ember_ieee),
383-
)
384-
return
357+
pass
385358

386-
self.handle_message(device, profile_id, cluster_id, src_ep, dst_ep, data)
359+
self.packet_received(
360+
zigpy.types.ZigbeePacket(
361+
src=src,
362+
src_ep=src_ep,
363+
dst=dst,
364+
dst_ep=dst_ep,
365+
tsn=None,
366+
profile_id=profile_id,
367+
cluster_id=cluster_id,
368+
data=zigpy.types.SerializableBytes(data),
369+
)
370+
)
387371

388372

389373
class XBeeCoordinator(zigpy.quirks.CustomDevice):

0 commit comments

Comments
 (0)