Honor the Modbus verify states for coils (#180490)

Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com>
This commit is contained in:
Franck Nijhof
2026-08-28 19:19:06 +02:00
committed by GitHub
co-authored by Copilot Autofix powered by AI
parent 1eb4cd856c
commit 72b0c4b7bc
2 changed files with 60 additions and 15 deletions
+16 -15
View File
@@ -374,20 +374,21 @@ class ModbusToggleEntity(ModbusBaseEntity, ToggleEntity, RestoreEntity):
self._attr_available = True
if self._verify_type in (CALL_TYPE_COIL, CALL_TYPE_DISCRETE):
self._attr_is_on = bool(result.bits[0] & 1)
value = int(result.bits[0] & 1)
else:
value = int(result.registers[0])
if value in self._state_on:
self._attr_is_on = True
elif value in self._state_off:
self._attr_is_on = False
elif value is not None:
LOGGER.error(
(
"Unexpected response from modbus device slave %s register %s,"
" got 0x%2x"
),
self._device_address,
self._verify_address,
value,
)
if value in self._state_on:
self._attr_is_on = True
elif value in self._state_off:
self._attr_is_on = False
elif value is not None:
LOGGER.error(
(
"Unexpected response from modbus device slave %s register %s,"
" got 0x%2x"
),
self._device_address,
self._verify_address,
value,
)
+44
View File
@@ -478,6 +478,50 @@ async def test_service_switch_update(hass: HomeAssistant, mock_modbus_ha) -> Non
assert hass.states.get(ENTITY_ID).state == STATE_ON
@pytest.mark.parametrize(
"do_config",
[
{
CONF_SWITCHES: [
{
CONF_NAME: TEST_ENTITY_NAME,
CONF_ADDRESS: 1234,
CONF_WRITE_TYPE: CALL_TYPE_COIL,
CONF_COMMAND_ON: 0,
CONF_COMMAND_OFF: 1,
CONF_VERIFY: {
CONF_STATE_ON: [0],
CONF_STATE_OFF: [1],
},
}
]
},
],
)
@pytest.mark.parametrize(
("coil_value", "expected_state"),
[
(0x00, STATE_ON),
(0x01, STATE_OFF),
],
)
async def test_switch_verify_coil_inverted(
hass: HomeAssistant,
mock_modbus_ha: mock.AsyncMock,
coil_value: int,
expected_state: str,
) -> None:
"""Run test for an inverted coil switch, where state_on is 0."""
mock_modbus_ha.read_coils.return_value = ReadResult([coil_value])
await hass.services.async_call(
HOMEASSISTANT_DOMAIN,
SERVICE_UPDATE_ENTITY,
{ATTR_ENTITY_ID: ENTITY_ID},
blocking=True,
)
assert hass.states.get(ENTITY_ID).state == expected_state
@pytest.mark.parametrize(
"do_config",
[