Change default slave id from 0 to 1 in modbus actions (#142865)

* set default slave id in service calls

* add test

* revert out of scope change
This commit is contained in:
Claudio Ruggeri - CR-Tech 2025-07-01 13:15:32 +02:00 committed by GitHub
parent 5fea4915ef
commit c92873bbff
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
2 changed files with 88 additions and 2 deletions

View File

@ -172,7 +172,7 @@ async def async_modbus_setup(
async def async_write_register(service: ServiceCall) -> None: async def async_write_register(service: ServiceCall) -> None:
"""Write Modbus registers.""" """Write Modbus registers."""
slave = 0 slave = 1
if ATTR_UNIT in service.data: if ATTR_UNIT in service.data:
slave = int(float(service.data[ATTR_UNIT])) slave = int(float(service.data[ATTR_UNIT]))
@ -195,7 +195,7 @@ async def async_modbus_setup(
async def async_write_coil(service: ServiceCall) -> None: async def async_write_coil(service: ServiceCall) -> None:
"""Write Modbus coil.""" """Write Modbus coil."""
slave = 0 slave = 1
if ATTR_UNIT in service.data: if ATTR_UNIT in service.data:
slave = int(float(service.data[ATTR_UNIT])) slave = int(float(service.data[ATTR_UNIT]))
if ATTR_SLAVE in service.data: if ATTR_SLAVE in service.data:

View File

@ -1327,3 +1327,89 @@ async def test_check_default_slave(
assert mock_modbus.read_holding_registers.mock_calls assert mock_modbus.read_holding_registers.mock_calls
first_call = mock_modbus.read_holding_registers.mock_calls[0] first_call = mock_modbus.read_holding_registers.mock_calls[0]
assert first_call.kwargs["slave"] == expected_slave_value assert first_call.kwargs["slave"] == expected_slave_value
@pytest.mark.parametrize(
"do_config",
[
{
CONF_NAME: TEST_MODBUS_NAME,
CONF_TYPE: SERIAL,
CONF_BAUDRATE: 9600,
CONF_BYTESIZE: 8,
CONF_METHOD: "rtu",
CONF_PORT: TEST_PORT_SERIAL,
CONF_PARITY: "E",
CONF_STOPBITS: 1,
CONF_SENSORS: [
{
CONF_NAME: "dummy_noslave",
CONF_ADDRESS: 8888,
}
],
},
],
)
@pytest.mark.parametrize(
"do_write",
[
{
DATA: ATTR_VALUE,
VALUE: 15,
SERVICE: SERVICE_WRITE_REGISTER,
FUNC: CALL_TYPE_WRITE_REGISTER,
},
{
DATA: ATTR_STATE,
VALUE: False,
SERVICE: SERVICE_WRITE_COIL,
FUNC: CALL_TYPE_WRITE_COIL,
},
],
)
@pytest.mark.parametrize(
"do_return",
[
{VALUE: ReadResult([0x0001]), DATA: ""},
{VALUE: ExceptionResponse(0x06), DATA: "Pymodbus:"},
{VALUE: ModbusException("fail write_"), DATA: "Pymodbus:"},
],
)
async def test_pb_service_write_no_slave(
hass: HomeAssistant,
do_write,
do_return,
caplog: pytest.LogCaptureFixture,
mock_modbus_with_pymodbus,
) -> None:
"""Run test for service write_register in case of missing slave/unit parameter."""
func_name = {
CALL_TYPE_WRITE_COIL: mock_modbus_with_pymodbus.write_coil,
CALL_TYPE_WRITE_REGISTER: mock_modbus_with_pymodbus.write_register,
}
value_arg_name = {
CALL_TYPE_WRITE_COIL: "value",
CALL_TYPE_WRITE_REGISTER: "value",
}
data = {
ATTR_HUB: TEST_MODBUS_NAME,
ATTR_ADDRESS: 16,
do_write[DATA]: do_write[VALUE],
}
mock_modbus_with_pymodbus.reset_mock()
caplog.clear()
caplog.set_level(logging.DEBUG)
func_name[do_write[FUNC]].return_value = do_return[VALUE]
await hass.services.async_call(DOMAIN, do_write[SERVICE], data, blocking=True)
assert func_name[do_write[FUNC]].called
assert func_name[do_write[FUNC]].call_args.args == (data[ATTR_ADDRESS],)
assert func_name[do_write[FUNC]].call_args.kwargs == {
"slave": 1,
value_arg_name[do_write[FUNC]]: data[do_write[DATA]],
}
if do_return[DATA]:
assert any(message.startswith("Pymodbus:") for message in caplog.messages)