mirror of
https://github.com/esphome/esphome.git
synced 2026-08-22 22:26:21 +00:00
Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com> Co-authored-by: J. Nick Koston <nick@koston.org>
40 lines
1.6 KiB
Python
40 lines
1.6 KiB
Python
"""Tests for modbus configuration validation."""
|
|
|
|
import pytest
|
|
|
|
from esphome import config_validation as cv
|
|
from esphome.components import modbus
|
|
from esphome.components.modbus import CONF_MODBUS_ID, _validate_server_address
|
|
from esphome.const import CONF_ADDRESS
|
|
|
|
|
|
def test_server_address_accepts_valid_unit_address() -> None:
|
|
# A normal unit address (1-247) is accepted and returned as an int.
|
|
assert _validate_server_address(1) == 1
|
|
assert _validate_server_address(247) == 247
|
|
|
|
|
|
def test_server_address_accepts_hex_string() -> None:
|
|
# hex_uint8_t parses hex strings, and the validator returns the parsed int.
|
|
assert _validate_server_address("0x10") == 0x10
|
|
|
|
|
|
def test_server_address_zero_rejected() -> None:
|
|
# Address 0 is the Modbus broadcast address and cannot identify a server device.
|
|
with pytest.raises(cv.Invalid, match="broadcast address"):
|
|
_validate_server_address(0)
|
|
|
|
|
|
def test_server_schema_rejects_address_zero() -> None:
|
|
# The server-role schema wires in _validate_server_address, so address 0 is rejected there too.
|
|
schema = modbus.modbus_device_schema(0x01, role="server")
|
|
with pytest.raises(cv.Invalid, match="broadcast address"):
|
|
schema({CONF_MODBUS_ID: "hub", CONF_ADDRESS: 0})
|
|
|
|
|
|
def test_client_schema_still_accepts_address_zero() -> None:
|
|
# Not rejected for clients today, but not supported either: a client broadcast gets no reply and
|
|
# stalls the hub for the full send-wait.
|
|
schema = modbus.modbus_device_schema(0x01)
|
|
assert schema({CONF_MODBUS_ID: "hub", CONF_ADDRESS: 0})[CONF_ADDRESS] == 0
|