Fix write_registers calling after the upgrade of pymodbus to 3.8.x (#139017)
parent
bf83f5a671
commit
baa3b15dbc
|
@ -384,6 +384,11 @@ class ModbusHub:
|
||||||
{ATTR_SLAVE: slave} if slave is not None else {ATTR_SLAVE: 1}
|
{ATTR_SLAVE: slave} if slave is not None else {ATTR_SLAVE: 1}
|
||||||
)
|
)
|
||||||
entry = self._pb_request[use_call]
|
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
|
kwargs[entry.value_attr_name] = value
|
||||||
try:
|
try:
|
||||||
result: ModbusPDU = await entry.func(address, **kwargs)
|
result: ModbusPDU = await entry.func(address, **kwargs)
|
||||||
|
|
|
@ -42,6 +42,7 @@ class ReadResult:
|
||||||
self.registers = register_words
|
self.registers = register_words
|
||||||
self.bits = register_words
|
self.bits = register_words
|
||||||
self.value = register_words
|
self.value = register_words
|
||||||
|
self.count = len(register_words) if register_words is not None else 0
|
||||||
|
|
||||||
def isError(self):
|
def isError(self):
|
||||||
"""Set error state."""
|
"""Set error state."""
|
||||||
|
|
|
@ -12,6 +12,7 @@ from homeassistant.components.modbus.const import (
|
||||||
CALL_TYPE_DISCRETE,
|
CALL_TYPE_DISCRETE,
|
||||||
CALL_TYPE_REGISTER_HOLDING,
|
CALL_TYPE_REGISTER_HOLDING,
|
||||||
CALL_TYPE_REGISTER_INPUT,
|
CALL_TYPE_REGISTER_INPUT,
|
||||||
|
CALL_TYPE_X_REGISTER_HOLDINGS,
|
||||||
CONF_DEVICE_ADDRESS,
|
CONF_DEVICE_ADDRESS,
|
||||||
CONF_INPUT_TYPE,
|
CONF_INPUT_TYPE,
|
||||||
CONF_STATE_OFF,
|
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_ID = f"{SWITCH_DOMAIN}.{TEST_ENTITY_NAME}".replace(" ", "_")
|
||||||
ENTITY_ID2 = f"{ENTITY_ID}_2"
|
ENTITY_ID2 = f"{ENTITY_ID}_2"
|
||||||
ENTITY_ID3 = f"{ENTITY_ID}_3"
|
ENTITY_ID3 = f"{ENTITY_ID}_3"
|
||||||
|
ENTITY_ID4 = f"{ENTITY_ID}_4"
|
||||||
|
|
||||||
|
|
||||||
@pytest.mark.parametrize(
|
@pytest.mark.parametrize(
|
||||||
|
@ -330,6 +332,13 @@ async def test_restore_state_switch(
|
||||||
CONF_SCAN_INTERVAL: 0,
|
CONF_SCAN_INTERVAL: 0,
|
||||||
CONF_VERIFY: {CONF_STATE_ON: [1, 3]},
|
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()
|
await hass.async_block_till_done()
|
||||||
assert hass.states.get(ENTITY_ID3).state == STATE_OFF
|
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_")
|
mock_modbus.write_register.side_effect = ModbusException("fail write_")
|
||||||
await hass.services.async_call(
|
await hass.services.async_call(
|
||||||
SWITCH_DOMAIN, SERVICE_TURN_ON, service_data={ATTR_ENTITY_ID: ENTITY_ID2}
|
SWITCH_DOMAIN, SERVICE_TURN_ON, service_data={ATTR_ENTITY_ID: ENTITY_ID2}
|
||||||
|
|
Loading…
Reference in New Issue