modbus: Do not modify registers (return wrong data). (#151131)

This commit is contained in:
jan iversen
2025-09-01 11:48:19 +02:00
committed by GitHub
parent dd0dce7968
commit a053142601
2 changed files with 44 additions and 1 deletions
+4 -1
View File
@@ -4,6 +4,7 @@ from __future__ import annotations
from abc import abstractmethod
from collections.abc import Callable
import copy
from datetime import datetime, timedelta
import struct
from typing import Any, cast
@@ -280,7 +281,9 @@ class BaseStructPlatform(BasePlatform, RestoreEntity):
"""Convert registers to proper result."""
if self._swap:
registers = self._swap_registers(registers, self._slave_count)
registers = self._swap_registers(
copy.deepcopy(registers), self._slave_count
)
byte_string = b"".join([x.to_bytes(2, byteorder="big") for x in registers])
if self._data_type == DataType.STRING:
return byte_string.decode()
+40
View File
@@ -1357,6 +1357,46 @@ async def test_wrap_sensor(hass: HomeAssistant, mock_do_cycle, expected) -> None
assert hass.states.get(ENTITY_ID).state == expected
@pytest.mark.parametrize(
"do_config",
[
{
CONF_SENSORS: [
{
CONF_NAME: TEST_ENTITY_NAME,
CONF_ADDRESS: 201,
},
],
},
],
)
@pytest.mark.parametrize(
("config_addon", "register_words", "expected"),
[
(
{
CONF_SWAP: CONF_SWAP_WORD,
CONF_DATA_TYPE: DataType.UINT32,
},
[0x0102, 0x0304],
"50594050",
),
],
)
async def test_wrap_regs_ok_sensor(
hass: HomeAssistant, mock_modbus_ha, mock_do_cycle, expected
) -> None:
"""Run test for sensor struct."""
assert hass.states.get(ENTITY_ID).state == expected
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
@pytest.fixture(name="mock_restore")
async def mock_restore(hass: HomeAssistant) -> None:
"""Mock restore cache."""