From b8f7d3972c10e69ad46c34a4ceb2f2d61706acf0 Mon Sep 17 00:00:00 2001 From: zigpy-review-bot <286747149+zigpy-review-bot@users.noreply.github.com> Date: Sun, 20 Sep 2026 20:45:08 +0200 Subject: [PATCH] Send EZSP v14+ multicasts and broadcasts without a NWK alias `sendMulticast` and `sendBroadcast` were called with `alias=0x0000`. The stack only treats `SL_ZIGBEE_NULL_NODE_ID` (0xFFFF) as "not aliased": any other value makes it overwrite the NWK sequence number of the outgoing frame with the provided one, which was zigpy's TSN. Those counters are kept per group, per device and per application and all start at zero, so unrelated frames left the coordinator with the same NWK source and sequence number and were dropped by routers as broadcast duplicates. Related: #756 --- bellows/ezsp/v14/__init__.py | 12 ++++++++---- tests/test_ezsp_v14.py | 8 ++++---- 2 files changed, 12 insertions(+), 8 deletions(-) diff --git a/bellows/ezsp/v14/__init__.py b/bellows/ezsp/v14/__init__.py index e80a4e73..40513e31 100644 --- a/bellows/ezsp/v14/__init__.py +++ b/bellows/ezsp/v14/__init__.py @@ -13,6 +13,8 @@ from . import commands, config from ..v13 import EZSPv13 +NULL_NODE_ID = 0xFFFF + class EZSPv14(EZSPv13): """EZSP Version 14 Protocol version handler.""" @@ -125,8 +127,8 @@ async def send_multicast( aps_frame=aps_frame, hops=radius, broadcast_addr=t.BroadcastAddress.RX_ON_WHEN_IDLE, - alias=0x0000, - sequence=aps_frame.sequence, + alias=NULL_NODE_ID, + sequence=0x00, # NWK sequence, only used with an alias message_tag=message_tag, message=data, ) @@ -142,10 +144,12 @@ async def send_broadcast( aps_sequence: t.uint8_t, data: bytes, ) -> tuple[t.sl_Status, t.uint8_t]: + # `aps_sequence` is not used + status, sequence = await self.sendBroadcast( - alias=0x0000, + alias=NULL_NODE_ID, destination=address, - sequence=aps_sequence, + sequence=0x00, # NWK sequence, only used with an alias aps_frame=aps_frame, radius=radius, message_tag=message_tag, diff --git a/tests/test_ezsp_v14.py b/tests/test_ezsp_v14.py index 813599e4..56c9f83f 100644 --- a/tests/test_ezsp_v14.py +++ b/tests/test_ezsp_v14.py @@ -253,8 +253,8 @@ async def test_send_multicast(ezsp_f) -> None: aps_frame=t.EmberApsFrame(sequence=0x34), hops=12, broadcast_addr=t.BroadcastAddress.RX_ON_WHEN_IDLE, - alias=0x0000, - sequence=0x34, + alias=0xFFFF, + sequence=0x00, message_tag=0x0042, message=b"hello", ) @@ -276,9 +276,9 @@ async def test_send_broadcast(ezsp_f) -> None: assert message_tag == 0x42 assert ezsp_f.sendBroadcast.mock_calls == [ call( - alias=0x0000, + alias=0xFFFF, destination=t.BroadcastAddress.ALL_ROUTERS_AND_COORDINATOR, - sequence=34, + sequence=0x00, aps_frame=t.EmberApsFrame(), radius=12, message_tag=0x42,