Fix write_registers calling after the upgrade of pymodbus to 3.8.x (#139017)

pull/135258/head
Claudio Ruggeri - CR-Tech 2025-02-22 04:16:15 +01:00 committed by GitHub
parent bf83f5a671
commit baa3b15dbc
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
3 changed files with 29 additions and 0 deletions

View File

@ -384,6 +384,11 @@ class ModbusHub:
{ATTR_SLAVE: slave} if slave is not None else {ATTR_SLAVE: 1}
)
entry = self._pb_request[use_call]
if use_call in {"write_registers", "write_coils"}:
if not isinstance(value, list):
value = [value]
kwargs[entry.value_attr_name] = value
try:
result: ModbusPDU = await entry.func(address, **kwargs)

View File

@ -42,6 +42,7 @@ class ReadResult:
self.registers = register_words
self.bits = register_words
self.value = register_words
self.count = len(register_words) if register_words is not None else 0
def isError(self):
"""Set error state."""

View File

@ -12,6 +12,7 @@ from homeassistant.components.modbus.const import (
CALL_TYPE_DISCRETE,
CALL_TYPE_REGISTER_HOLDING,
CALL_TYPE_REGISTER_INPUT,
CALL_TYPE_X_REGISTER_HOLDINGS,
CONF_DEVICE_ADDRESS,
CONF_INPUT_TYPE,
CONF_STATE_OFF,
@ -50,6 +51,7 @@ from tests.common import async_fire_time_changed
ENTITY_ID = f"{SWITCH_DOMAIN}.{TEST_ENTITY_NAME}".replace(" ", "_")
ENTITY_ID2 = f"{ENTITY_ID}_2"
ENTITY_ID3 = f"{ENTITY_ID}_3"
ENTITY_ID4 = f"{ENTITY_ID}_4"
@pytest.mark.parametrize(
@ -330,6 +332,13 @@ async def test_restore_state_switch(
CONF_SCAN_INTERVAL: 0,
CONF_VERIFY: {CONF_STATE_ON: [1, 3]},
},
{
CONF_NAME: f"{TEST_ENTITY_NAME} 4",
CONF_ADDRESS: 19,
CONF_WRITE_TYPE: CALL_TYPE_X_REGISTER_HOLDINGS,
CONF_SCAN_INTERVAL: 0,
CONF_VERIFY: {CONF_STATE_ON: [1, 3]},
},
],
},
],
@ -381,6 +390,20 @@ async def test_switch_service_turn(
await hass.async_block_till_done()
assert hass.states.get(ENTITY_ID3).state == STATE_OFF
mock_modbus.read_holding_registers.return_value = ReadResult([0x03])
assert hass.states.get(ENTITY_ID4).state == STATE_OFF
await hass.services.async_call(
SWITCH_DOMAIN, SERVICE_TURN_ON, service_data={ATTR_ENTITY_ID: ENTITY_ID4}
)
await hass.async_block_till_done()
assert hass.states.get(ENTITY_ID4).state == STATE_ON
mock_modbus.read_holding_registers.return_value = ReadResult([0x00])
await hass.services.async_call(
SWITCH_DOMAIN, SERVICE_TURN_OFF, service_data={ATTR_ENTITY_ID: ENTITY_ID4}
)
await hass.async_block_till_done()
assert hass.states.get(ENTITY_ID4).state == STATE_OFF
mock_modbus.write_register.side_effect = ModbusException("fail write_")
await hass.services.async_call(
SWITCH_DOMAIN, SERVICE_TURN_ON, service_data={ATTR_ENTITY_ID: ENTITY_ID2}