Skip to content

Commit 54a8e32

Browse files
authored
Fix writing network settings with missing TX power (#695)
* Fix restoration when `tx_power = None` * Add a unit test * Revert `tx_power=0` back to `tx_power=8` in tests
1 parent 02d7870 commit 54a8e32

File tree

2 files changed

+41
-4
lines changed

2 files changed

+41
-4
lines changed

bellows/zigbee/application.py

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -73,6 +73,8 @@
7373
"54:EF:44": 0x115F, # Lumi
7474
}
7575

76+
DEFAULT_TX_POWER = 8 # dBm
77+
7678
LIB_VERSION = importlib.metadata.version("bellows")
7779
LOGGER = logging.getLogger(__name__)
7880

@@ -522,7 +524,11 @@ async def write_network_info(
522524
parameters = t.EmberNetworkParameters()
523525
parameters.panId = t.EmberPanId(network_info.pan_id)
524526
parameters.extendedPanId = t.EUI64(network_info.extended_pan_id)
525-
parameters.radioTxPower = t.uint8_t(network_info.tx_power)
527+
parameters.radioTxPower = (
528+
t.uint8_t(network_info.tx_power)
529+
if network_info.tx_power is not None
530+
else DEFAULT_TX_POWER
531+
)
526532
parameters.radioChannel = t.uint8_t(network_info.channel)
527533
parameters.joinMethod = t.EmberJoinMethod.USE_MAC_ASSOCIATION
528534
parameters.nwkManagerId = t.EmberNodeId(network_info.nwk_manager_id)

tests/test_application.py

Lines changed: 34 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,7 @@
2828
import bellows.types.struct
2929
import bellows.uart as uart
3030
import bellows.zigbee.application
31-
from bellows.zigbee.application import ControllerApplication
31+
from bellows.zigbee.application import DEFAULT_TX_POWER, ControllerApplication
3232
import bellows.zigbee.device
3333
from bellows.zigbee.device import EZSPEndpoint, EZSPGroupEndpoint
3434
from bellows.zigbee.util import map_rssi_to_energy
@@ -104,7 +104,7 @@ def _create_app_for_startup(
104104
nwk_params = bellows.types.struct.EmberNetworkParameters(
105105
extendedPanId=t.ExtendedPanId.convert("aa:bb:cc:dd:ee:ff:aa:bb"),
106106
panId=t.EmberPanId(0x55AA),
107-
radioTxPower=0,
107+
radioTxPower=8,
108108
radioChannel=25,
109109
joinMethod=t.EmberJoinMethod.USE_MAC_ASSOCIATION,
110110
nwkManagerId=t.EmberNodeId(0x0000),
@@ -2032,7 +2032,7 @@ def zigpy_backup() -> zigpy.backups.NetworkBackup:
20322032
channel=t.uint8_t(25),
20332033
channel_mask=t.Channels.ALL_CHANNELS,
20342034
security_level=t.uint8_t(1),
2035-
tx_power=0,
2035+
tx_power=8,
20362036
network_key=zigpy.state.Key(
20372037
key=t.KeyData.convert(
20382038
"41:63:74:75:61:6c:4e:65:74:77:6f:72:6b:4b:65:79"
@@ -2251,6 +2251,37 @@ async def test_write_network_info(
22512251
]
22522252

22532253

2254+
async def test_write_network_info_with_none_tx_power(
2255+
app: ControllerApplication,
2256+
ieee: zigpy_t.EUI64,
2257+
zigpy_backup: zigpy.backups.NetworkBackup,
2258+
) -> None:
2259+
"""Test that write_network_info uses DEFAULT_TX_POWER when tx_power is None."""
2260+
network_info = zigpy_backup.network_info.replace(tx_power=None)
2261+
2262+
with patch.object(app, "_reset"):
2263+
await app.write_network_info(
2264+
node_info=zigpy_backup.node_info,
2265+
network_info=network_info,
2266+
)
2267+
2268+
# Verify formNetwork was called with DEFAULT_TX_POWER instead of None
2269+
assert app._ezsp._protocol.formNetwork.mock_calls == [
2270+
call(
2271+
parameters=t.EmberNetworkParameters(
2272+
panId=network_info.pan_id,
2273+
extendedPanId=network_info.extended_pan_id,
2274+
radioTxPower=DEFAULT_TX_POWER,
2275+
radioChannel=network_info.channel,
2276+
joinMethod=t.EmberJoinMethod.USE_MAC_ASSOCIATION,
2277+
nwkManagerId=t.EmberNodeId(0x0000),
2278+
nwkUpdateId=network_info.nwk_update_id,
2279+
channels=network_info.channel_mask,
2280+
)
2281+
)
2282+
]
2283+
2284+
22542285
async def test_write_network_info_restores_route_table(
22552286
app: ControllerApplication,
22562287
ieee: zigpy_t.EUI64,

0 commit comments

Comments
 (0)