Skip to content

Commit 431a52e

Browse files
authored
Dynamic reply timeout. (#54)
1 parent 63f727e commit 431a52e

File tree

2 files changed

+23
-4
lines changed

2 files changed

+23
-4
lines changed

tests/test_application.py

Lines changed: 15 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -8,14 +8,22 @@
88
from zigpy.types import EUI64
99
import zigpy.zdo.types as zdo_t
1010
from zigpy_deconz.api import Deconz
11-
from zigpy_deconz.zigbee.application import ControllerApplication
11+
import zigpy_deconz.zigbee.application
1212
from zigpy_deconz.zigbee import application
1313
from zigpy_deconz import types as t
1414

1515

1616
@pytest.fixture
17-
def app(database_file=None):
18-
return ControllerApplication(Deconz(), database_file=database_file)
17+
def app(monkeypatch, database_file=None):
18+
app = zigpy_deconz.zigbee.application.ControllerApplication(
19+
Deconz(), database_file=database_file)
20+
monkeypatch.setattr(zigpy_deconz.zigbee.application,
21+
'TIMEOUT_REPLY_ENDDEV',
22+
.1)
23+
monkeypatch.setattr(zigpy_deconz.zigbee.application,
24+
'TIMEOUT_REPLY_ROUTER',
25+
.1)
26+
return app
1927

2028

2129
@pytest.fixture
@@ -176,6 +184,10 @@ def aps_data_request(req_id, dst_addr_ep, profile, cluster, src_ep, data):
176184

177185
app._api.aps_data_request = mock.MagicMock(
178186
side_effect=asyncio.coroutine(aps_data_request))
187+
app.get_device = mock.MagicMock(
188+
return_value=zigpy.device.Device(app,
189+
mock.sentinel.ieee,
190+
mock.sentinel.nwk))
179191

180192
return await app.request(nwk, 0x0260, 1, 2, 3, seq, b'\x01\x02\x03', expect_reply=expect_reply, **kwargs)
181193

zigpy_deconz/zigbee/application.py

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,8 @@
1616

1717
CHANGE_NETWORK_WAIT = 1
1818
SEND_CONFIRM_TIMEOUT = 30
19+
TIMEOUT_REPLY_ROUTER = 6
20+
TIMEOUT_REPLY_ENDDEV = 29
1921

2022

2123
class ControllerApplication(zigpy.application.ControllerApplication):
@@ -82,7 +84,8 @@ async def form_network(self, channel=15, pan_id=None, extended_pan_id=None):
8284
raise Exception("Could not form network.")
8385

8486
@zigpy.util.retryable_request
85-
async def request(self, nwk, profile, cluster, src_ep, dst_ep, sequence, data, expect_reply=True, timeout=10):
87+
async def request(self, nwk, profile, cluster, src_ep, dst_ep, sequence, data, expect_reply=True,
88+
timeout=TIMEOUT_REPLY_ROUTER):
8689
LOGGER.debug("Zigbee request with id %s, data: %s", sequence, binascii.hexlify(data))
8790
assert sequence not in self._pending
8891
dst_addr_ep = t.DeconzAddressEndpoint()
@@ -111,6 +114,10 @@ async def request(self, nwk, profile, cluster, src_ep, dst_ep, sequence, data, e
111114
if not expect_reply:
112115
return
113116

117+
dev = self.get_device(nwk=nwk)
118+
if dev.node_desc.is_end_device in (True, None):
119+
LOGGER.debug("Extending timeout for %s/0x%04x", dev.ieee, nwk)
120+
timeout = TIMEOUT_REPLY_ENDDEV
114121
return await asyncio.wait_for(req.reply, timeout)
115122

116123
async def broadcast(self, profile, cluster, src_ep, dst_ep, grpid, radius,

0 commit comments

Comments
 (0)