mirror of
https://github.com/home-assistant/core.git
synced 2026-09-26 01:11:51 -04:00
modbus: Do not modify registers (return wrong data). (#151131)
This commit is contained in:
@@ -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()
|
||||
|
||||
@@ -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."""
|
||||
|
||||
Reference in New Issue
Block a user