zigpy-zboss 2.0.2__tar.gz → 2.0.3__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {zigpy_zboss-2.0.2/zigpy_zboss.egg-info → zigpy_zboss-2.0.3}/PKG-INFO +1 -1
- {zigpy_zboss-2.0.2 → zigpy_zboss-2.0.3}/tests/test_uart.py +36 -0
- {zigpy_zboss-2.0.2 → zigpy_zboss-2.0.3}/zigpy_zboss/__init__.py +1 -1
- {zigpy_zboss-2.0.2 → zigpy_zboss-2.0.3}/zigpy_zboss/uart.py +7 -1
- {zigpy_zboss-2.0.2 → zigpy_zboss-2.0.3}/zigpy_zboss/zigbee/device.py +3 -3
- {zigpy_zboss-2.0.2 → zigpy_zboss-2.0.3/zigpy_zboss.egg-info}/PKG-INFO +1 -1
- {zigpy_zboss-2.0.2 → zigpy_zboss-2.0.3}/COPYING +0 -0
- {zigpy_zboss-2.0.2 → zigpy_zboss-2.0.3}/LICENSE +0 -0
- {zigpy_zboss-2.0.2 → zigpy_zboss-2.0.3}/README.md +0 -0
- {zigpy_zboss-2.0.2 → zigpy_zboss-2.0.3}/pyproject.toml +0 -0
- {zigpy_zboss-2.0.2 → zigpy_zboss-2.0.3}/setup.cfg +0 -0
- {zigpy_zboss-2.0.2 → zigpy_zboss-2.0.3}/setup.py +0 -0
- {zigpy_zboss-2.0.2 → zigpy_zboss-2.0.3}/tests/test_commands.py +0 -0
- {zigpy_zboss-2.0.2 → zigpy_zboss-2.0.3}/tests/test_config.py +0 -0
- {zigpy_zboss-2.0.2 → zigpy_zboss-2.0.3}/tests/test_frame.py +0 -0
- {zigpy_zboss-2.0.2 → zigpy_zboss-2.0.3}/tests/test_nvids.py +0 -0
- {zigpy_zboss-2.0.2 → zigpy_zboss-2.0.3}/tests/test_types_basic.py +0 -0
- {zigpy_zboss-2.0.2 → zigpy_zboss-2.0.3}/tests/test_types_cstruct.py +0 -0
- {zigpy_zboss-2.0.2 → zigpy_zboss-2.0.3}/tests/test_types_named.py +0 -0
- {zigpy_zboss-2.0.2 → zigpy_zboss-2.0.3}/tests/test_utils.py +0 -0
- {zigpy_zboss-2.0.2 → zigpy_zboss-2.0.3}/zigpy_zboss/api.py +0 -0
- {zigpy_zboss-2.0.2 → zigpy_zboss-2.0.3}/zigpy_zboss/checksum.py +0 -0
- {zigpy_zboss-2.0.2 → zigpy_zboss-2.0.3}/zigpy_zboss/commands/__init__.py +0 -0
- {zigpy_zboss-2.0.2 → zigpy_zboss-2.0.3}/zigpy_zboss/commands/af.py +0 -0
- {zigpy_zboss-2.0.2 → zigpy_zboss-2.0.3}/zigpy_zboss/commands/aps.py +0 -0
- {zigpy_zboss-2.0.2 → zigpy_zboss-2.0.3}/zigpy_zboss/commands/ncp_config.py +0 -0
- {zigpy_zboss-2.0.2 → zigpy_zboss-2.0.3}/zigpy_zboss/commands/nwk_mgmt.py +0 -0
- {zigpy_zboss-2.0.2 → zigpy_zboss-2.0.3}/zigpy_zboss/commands/security.py +0 -0
- {zigpy_zboss-2.0.2 → zigpy_zboss-2.0.3}/zigpy_zboss/commands/zdo.py +0 -0
- {zigpy_zboss-2.0.2 → zigpy_zboss-2.0.3}/zigpy_zboss/config.py +0 -0
- {zigpy_zboss-2.0.2 → zigpy_zboss-2.0.3}/zigpy_zboss/debug.py +0 -0
- {zigpy_zboss-2.0.2 → zigpy_zboss-2.0.3}/zigpy_zboss/exceptions.py +0 -0
- {zigpy_zboss-2.0.2 → zigpy_zboss-2.0.3}/zigpy_zboss/frames.py +0 -0
- {zigpy_zboss-2.0.2 → zigpy_zboss-2.0.3}/zigpy_zboss/logger.py +0 -0
- {zigpy_zboss-2.0.2 → zigpy_zboss-2.0.3}/zigpy_zboss/nvram.py +0 -0
- {zigpy_zboss-2.0.2 → zigpy_zboss-2.0.3}/zigpy_zboss/tools/__init__.py +0 -0
- {zigpy_zboss-2.0.2 → zigpy_zboss-2.0.3}/zigpy_zboss/tools/config.py +0 -0
- {zigpy_zboss-2.0.2 → zigpy_zboss-2.0.3}/zigpy_zboss/tools/factory_reset_ncp.py +0 -0
- {zigpy_zboss-2.0.2 → zigpy_zboss-2.0.3}/zigpy_zboss/tools/get_ncp_version.py +0 -0
- {zigpy_zboss-2.0.2 → zigpy_zboss-2.0.3}/zigpy_zboss/tools/get_nwk_keys.py +0 -0
- {zigpy_zboss-2.0.2 → zigpy_zboss-2.0.3}/zigpy_zboss/tools/log2pcap.py +0 -0
- {zigpy_zboss-2.0.2 → zigpy_zboss-2.0.3}/zigpy_zboss/types/__init__.py +0 -0
- {zigpy_zboss-2.0.2 → zigpy_zboss-2.0.3}/zigpy_zboss/types/basic.py +0 -0
- {zigpy_zboss-2.0.2 → zigpy_zboss-2.0.3}/zigpy_zboss/types/commands.py +0 -0
- {zigpy_zboss-2.0.2 → zigpy_zboss-2.0.3}/zigpy_zboss/types/cstruct.py +0 -0
- {zigpy_zboss-2.0.2 → zigpy_zboss-2.0.3}/zigpy_zboss/types/named.py +0 -0
- {zigpy_zboss-2.0.2 → zigpy_zboss-2.0.3}/zigpy_zboss/types/nvids.py +0 -0
- {zigpy_zboss-2.0.2 → zigpy_zboss-2.0.3}/zigpy_zboss/types/structs.py +0 -0
- {zigpy_zboss-2.0.2 → zigpy_zboss-2.0.3}/zigpy_zboss/utils.py +0 -0
- {zigpy_zboss-2.0.2 → zigpy_zboss-2.0.3}/zigpy_zboss/zigbee/__init__.py +0 -0
- {zigpy_zboss-2.0.2 → zigpy_zboss-2.0.3}/zigpy_zboss/zigbee/application.py +0 -0
- {zigpy_zboss-2.0.2 → zigpy_zboss-2.0.3}/zigpy_zboss.egg-info/SOURCES.txt +0 -0
- {zigpy_zboss-2.0.2 → zigpy_zboss-2.0.3}/zigpy_zboss.egg-info/dependency_links.txt +0 -0
- {zigpy_zboss-2.0.2 → zigpy_zboss-2.0.3}/zigpy_zboss.egg-info/requires.txt +0 -0
- {zigpy_zboss-2.0.2 → zigpy_zboss-2.0.3}/zigpy_zboss.egg-info/top_level.txt +0 -0
|
@@ -280,6 +280,42 @@ async def test_connection_lost(dummy_serial_conn, mocker, event_loop):
|
|
|
280
280
|
assert (await conn_lost_fut) == exception
|
|
281
281
|
|
|
282
282
|
|
|
283
|
+
@pytest.mark.asyncio
|
|
284
|
+
async def test_connect_url_port_skips_path_check(mocker, event_loop):
|
|
285
|
+
"""A URL-style port (``socket://``/``tcp://``) has no filesystem path.
|
|
286
|
+
|
|
287
|
+
``connect()`` must not gate on ``os.path.exists`` for such ports, otherwise
|
|
288
|
+
it spins in the retry loop until the timeout and never opens the connection
|
|
289
|
+
(regression for ser2net bridges and native-TCP NCPs).
|
|
290
|
+
"""
|
|
291
|
+
target_url = "socket://127.0.0.1:6638"
|
|
292
|
+
|
|
293
|
+
def create_serial_conn(loop, protocol_factory, url, *args, **kwargs):
|
|
294
|
+
assert url == target_url
|
|
295
|
+
fut = event_loop.create_future()
|
|
296
|
+
protocol = protocol_factory()
|
|
297
|
+
event_loop.add_writer = lambda *a, **k: None
|
|
298
|
+
event_loop.add_reader = lambda *a, **k: None
|
|
299
|
+
event_loop.remove_writer = lambda *a, **k: None
|
|
300
|
+
event_loop.remove_reader = lambda *a, **k: None
|
|
301
|
+
transport = mocker.Mock()
|
|
302
|
+
transport.serial = mocker.Mock()
|
|
303
|
+
protocol.connection_made(transport)
|
|
304
|
+
fut.set_result((transport, protocol))
|
|
305
|
+
return fut
|
|
306
|
+
|
|
307
|
+
mocker.patch("serialx.create_serial_connection", new=create_serial_conn)
|
|
308
|
+
# A socket:// path never exists on disk; the check must be skipped for it.
|
|
309
|
+
exists = mocker.patch("zigpy_zboss.uart.os.path.exists", return_value=False)
|
|
310
|
+
|
|
311
|
+
protocol = await zboss_uart.connect(
|
|
312
|
+
conf.SCHEMA_DEVICE({conf.CONF_DEVICE_PATH: target_url}), api=mocker.Mock()
|
|
313
|
+
)
|
|
314
|
+
|
|
315
|
+
assert protocol is not None
|
|
316
|
+
exists.assert_not_called()
|
|
317
|
+
|
|
318
|
+
|
|
283
319
|
# ToFix: this is not testing the uart test_connection_made method
|
|
284
320
|
# @pytest.mark.asyncio
|
|
285
321
|
# async def test_connection_made(dummy_serial_conn, mocker):
|
|
@@ -288,8 +288,14 @@ async def connect(config: conf.ConfigType, api) -> ZbossNcpProtocol:
|
|
|
288
288
|
last_exc: OSError | None = None
|
|
289
289
|
protocol = None
|
|
290
290
|
|
|
291
|
+
# URL-style ports (``socket://``, ``tcp://``, ``rfc2217://``, …) are not
|
|
292
|
+
# filesystem paths, so the local-device existence check below must be
|
|
293
|
+
# skipped for them; otherwise the loop spins until the timeout and the
|
|
294
|
+
# connection is never opened (e.g. ser2net or a native TCP NCP).
|
|
295
|
+
is_local_device = "://" not in port
|
|
296
|
+
|
|
291
297
|
while loop.time() < deadline:
|
|
292
|
-
if not os.path.exists(port):
|
|
298
|
+
if is_local_device and not os.path.exists(port):
|
|
293
299
|
await asyncio.sleep(CONNECT_OPEN_RETRY_DELAY)
|
|
294
300
|
continue
|
|
295
301
|
|
|
@@ -73,7 +73,7 @@ class ZbossZDO(ZigpyZDO):
|
|
|
73
73
|
)
|
|
74
74
|
)
|
|
75
75
|
if res.StatusCode != 0:
|
|
76
|
-
return (res.StatusCode
|
|
76
|
+
return (res.StatusCode, dst_address, cluster)
|
|
77
77
|
|
|
78
78
|
return (zdo_t.Status.SUCCESS, dst_address, cluster)
|
|
79
79
|
|
|
@@ -81,7 +81,7 @@ class ZbossZDO(ZigpyZDO):
|
|
|
81
81
|
"""Unbinding request."""
|
|
82
82
|
if dst_address.addrmode == t.AddrMode.IEEE:
|
|
83
83
|
addr_mode = t_zboss.BindAddrMode.IEEE
|
|
84
|
-
dst_eui64 =
|
|
84
|
+
dst_eui64 = dst_address.ieee
|
|
85
85
|
# ZBOSS does not support the NWK mode for binding
|
|
86
86
|
elif dst_address.addrmode == t.AddrMode.NWK:
|
|
87
87
|
self.log(
|
|
@@ -114,7 +114,7 @@ class ZbossZDO(ZigpyZDO):
|
|
|
114
114
|
)
|
|
115
115
|
)
|
|
116
116
|
if res.StatusCode != 0:
|
|
117
|
-
return (res.StatusCode
|
|
117
|
+
return (res.StatusCode, dst_address, cluster)
|
|
118
118
|
|
|
119
119
|
return (zdo_t.Status.SUCCESS, dst_address, cluster)
|
|
120
120
|
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|