Test VIRTUAL_COUNT parameter (#100434)

This commit is contained in:
jan iversen 2023-09-15 15:02:24 +02:00 committed by GitHub
parent b4c095e944
commit 9eb0b844bc
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
3 changed files with 161 additions and 15 deletions

View File

@ -11,6 +11,7 @@ from homeassistant.components.modbus.const import (
CONF_INPUT_TYPE, CONF_INPUT_TYPE,
CONF_LAZY_ERROR, CONF_LAZY_ERROR,
CONF_SLAVE_COUNT, CONF_SLAVE_COUNT,
CONF_VIRTUAL_COUNT,
MODBUS_DOMAIN, MODBUS_DOMAIN,
) )
from homeassistant.const import ( from homeassistant.const import (
@ -265,7 +266,7 @@ ENTITY_ID2 = f"{ENTITY_ID}_1"
CONF_NAME: TEST_ENTITY_NAME, CONF_NAME: TEST_ENTITY_NAME,
CONF_ADDRESS: 51, CONF_ADDRESS: 51,
CONF_SCAN_INTERVAL: 0, CONF_SCAN_INTERVAL: 0,
CONF_SLAVE_COUNT: 1, CONF_VIRTUAL_COUNT: 1,
} }
] ]
}, },
@ -294,9 +295,18 @@ TEST_NAME = "test_sensor"
} }
] ]
}, },
{
CONF_BINARY_SENSORS: [
{
CONF_NAME: TEST_ENTITY_NAME,
CONF_ADDRESS: 51,
CONF_VIRTUAL_COUNT: 3,
}
]
},
], ],
) )
async def test_config_slave_binary_sensor(hass: HomeAssistant, mock_modbus) -> None: async def test_config_virtual_binary_sensor(hass: HomeAssistant, mock_modbus) -> None:
"""Run config test for binary sensor.""" """Run config test for binary sensor."""
assert SENSOR_DOMAIN in hass.config.components assert SENSOR_DOMAIN in hass.config.components
@ -355,33 +365,63 @@ async def test_config_slave_binary_sensor(hass: HomeAssistant, mock_modbus) -> N
STATE_OFF, STATE_OFF,
[STATE_OFF], [STATE_OFF],
), ),
(
{CONF_VIRTUAL_COUNT: 1, CONF_UNIQUE_ID: SLAVE_UNIQUE_ID},
[False] * 8,
STATE_OFF,
[STATE_OFF],
),
( (
{CONF_SLAVE_COUNT: 1, CONF_UNIQUE_ID: SLAVE_UNIQUE_ID}, {CONF_SLAVE_COUNT: 1, CONF_UNIQUE_ID: SLAVE_UNIQUE_ID},
[True] + [False] * 7, [True] + [False] * 7,
STATE_ON, STATE_ON,
[STATE_OFF], [STATE_OFF],
), ),
(
{CONF_VIRTUAL_COUNT: 1, CONF_UNIQUE_ID: SLAVE_UNIQUE_ID},
[True] + [False] * 7,
STATE_ON,
[STATE_OFF],
),
( (
{CONF_SLAVE_COUNT: 1, CONF_UNIQUE_ID: SLAVE_UNIQUE_ID}, {CONF_SLAVE_COUNT: 1, CONF_UNIQUE_ID: SLAVE_UNIQUE_ID},
[False, True] + [False] * 6, [False, True] + [False] * 6,
STATE_OFF, STATE_OFF,
[STATE_ON], [STATE_ON],
), ),
(
{CONF_VIRTUAL_COUNT: 1, CONF_UNIQUE_ID: SLAVE_UNIQUE_ID},
[False, True] + [False] * 6,
STATE_OFF,
[STATE_ON],
),
( (
{CONF_SLAVE_COUNT: 7, CONF_UNIQUE_ID: SLAVE_UNIQUE_ID}, {CONF_SLAVE_COUNT: 7, CONF_UNIQUE_ID: SLAVE_UNIQUE_ID},
[True, False] * 4, [True, False] * 4,
STATE_ON, STATE_ON,
[STATE_OFF, STATE_ON] * 3 + [STATE_OFF], [STATE_OFF, STATE_ON] * 3 + [STATE_OFF],
), ),
(
{CONF_VIRTUAL_COUNT: 7, CONF_UNIQUE_ID: SLAVE_UNIQUE_ID},
[True, False] * 4,
STATE_ON,
[STATE_OFF, STATE_ON] * 3 + [STATE_OFF],
),
( (
{CONF_SLAVE_COUNT: 31, CONF_UNIQUE_ID: SLAVE_UNIQUE_ID}, {CONF_SLAVE_COUNT: 31, CONF_UNIQUE_ID: SLAVE_UNIQUE_ID},
[True, False] * 16, [True, False] * 16,
STATE_ON, STATE_ON,
[STATE_OFF, STATE_ON] * 15 + [STATE_OFF], [STATE_OFF, STATE_ON] * 15 + [STATE_OFF],
), ),
(
{CONF_VIRTUAL_COUNT: 31, CONF_UNIQUE_ID: SLAVE_UNIQUE_ID},
[True, False] * 16,
STATE_ON,
[STATE_OFF, STATE_ON] * 15 + [STATE_OFF],
),
], ],
) )
async def test_slave_binary_sensor( async def test_virtual_binary_sensor(
hass: HomeAssistant, expected, slaves, mock_do_cycle hass: HomeAssistant, expected, slaves, mock_do_cycle
) -> None: ) -> None:
"""Run test for given config.""" """Run test for given config."""

View File

@ -50,6 +50,7 @@ from homeassistant.components.modbus.const import (
CONF_SWAP_BYTE, CONF_SWAP_BYTE,
CONF_SWAP_WORD, CONF_SWAP_WORD,
CONF_SWAP_WORD_BYTE, CONF_SWAP_WORD_BYTE,
CONF_VIRTUAL_COUNT,
DEFAULT_SCAN_INTERVAL, DEFAULT_SCAN_INTERVAL,
MODBUS_DOMAIN as DOMAIN, MODBUS_DOMAIN as DOMAIN,
RTUOVERTCP, RTUOVERTCP,
@ -263,11 +264,23 @@ async def test_ok_struct_validator(do_config) -> None:
CONF_STRUCTURE: ">f", CONF_STRUCTURE: ">f",
CONF_SLAVE_COUNT: 5, CONF_SLAVE_COUNT: 5,
}, },
{
CONF_NAME: TEST_ENTITY_NAME,
CONF_COUNT: 2,
CONF_DATA_TYPE: DataType.CUSTOM,
CONF_STRUCTURE: ">f",
CONF_VIRTUAL_COUNT: 5,
},
{ {
CONF_NAME: TEST_ENTITY_NAME, CONF_NAME: TEST_ENTITY_NAME,
CONF_DATA_TYPE: DataType.STRING, CONF_DATA_TYPE: DataType.STRING,
CONF_SLAVE_COUNT: 2, CONF_SLAVE_COUNT: 2,
}, },
{
CONF_NAME: TEST_ENTITY_NAME,
CONF_DATA_TYPE: DataType.STRING,
CONF_VIRTUAL_COUNT: 2,
},
{ {
CONF_NAME: TEST_ENTITY_NAME, CONF_NAME: TEST_ENTITY_NAME,
CONF_DATA_TYPE: DataType.INT16, CONF_DATA_TYPE: DataType.INT16,
@ -279,6 +292,12 @@ async def test_ok_struct_validator(do_config) -> None:
CONF_SLAVE_COUNT: 2, CONF_SLAVE_COUNT: 2,
CONF_DATA_TYPE: DataType.INT32, CONF_DATA_TYPE: DataType.INT32,
}, },
{
CONF_NAME: TEST_ENTITY_NAME,
CONF_COUNT: 2,
CONF_VIRTUAL_COUNT: 2,
CONF_DATA_TYPE: DataType.INT32,
},
{ {
CONF_NAME: TEST_ENTITY_NAME, CONF_NAME: TEST_ENTITY_NAME,
CONF_DATA_TYPE: DataType.INT16, CONF_DATA_TYPE: DataType.INT16,

View File

@ -21,6 +21,7 @@ from homeassistant.components.modbus.const import (
CONF_SWAP_NONE, CONF_SWAP_NONE,
CONF_SWAP_WORD, CONF_SWAP_WORD,
CONF_SWAP_WORD_BYTE, CONF_SWAP_WORD_BYTE,
CONF_VIRTUAL_COUNT,
CONF_ZERO_SUPPRESS, CONF_ZERO_SUPPRESS,
MODBUS_DOMAIN, MODBUS_DOMAIN,
DataType, DataType,
@ -150,6 +151,16 @@ SLAVE_UNIQUE_ID = "ground_floor_sensor"
} }
] ]
}, },
{
CONF_SENSORS: [
{
CONF_NAME: TEST_ENTITY_NAME,
CONF_ADDRESS: 51,
CONF_DATA_TYPE: DataType.INT32,
CONF_VIRTUAL_COUNT: 5,
}
]
},
], ],
) )
async def test_config_sensor(hass: HomeAssistant, mock_modbus) -> None: async def test_config_sensor(hass: HomeAssistant, mock_modbus) -> None:
@ -671,6 +682,21 @@ async def test_all_sensor(hass: HomeAssistant, mock_do_cycle, expected) -> None:
False, False,
["34899771392", "0"], ["34899771392", "0"],
), ),
(
{
CONF_VIRTUAL_COUNT: 1,
CONF_UNIQUE_ID: SLAVE_UNIQUE_ID,
CONF_DATA_TYPE: DataType.FLOAT32,
},
[
0x5102,
0x0304,
int.from_bytes(struct.pack(">f", float("nan"))[0:2]),
int.from_bytes(struct.pack(">f", float("nan"))[2:4]),
],
False,
["34899771392", "0"],
),
( (
{ {
CONF_SLAVE_COUNT: 0, CONF_SLAVE_COUNT: 0,
@ -680,6 +706,15 @@ async def test_all_sensor(hass: HomeAssistant, mock_do_cycle, expected) -> None:
False, False,
["16909060"], ["16909060"],
), ),
(
{
CONF_VIRTUAL_COUNT: 0,
CONF_UNIQUE_ID: SLAVE_UNIQUE_ID,
},
[0x0102, 0x0304],
False,
["16909060"],
),
( (
{ {
CONF_SLAVE_COUNT: 1, CONF_SLAVE_COUNT: 1,
@ -689,6 +724,15 @@ async def test_all_sensor(hass: HomeAssistant, mock_do_cycle, expected) -> None:
False, False,
["16909060", "67305985"], ["16909060", "67305985"],
), ),
(
{
CONF_VIRTUAL_COUNT: 1,
CONF_UNIQUE_ID: SLAVE_UNIQUE_ID,
},
[0x0102, 0x0304, 0x0403, 0x0201],
False,
["16909060", "67305985"],
),
( (
{ {
CONF_SLAVE_COUNT: 3, CONF_SLAVE_COUNT: 3,
@ -712,6 +756,29 @@ async def test_all_sensor(hass: HomeAssistant, mock_do_cycle, expected) -> None:
"219025152", "219025152",
], ],
), ),
(
{
CONF_VIRTUAL_COUNT: 3,
CONF_UNIQUE_ID: SLAVE_UNIQUE_ID,
},
[
0x0102,
0x0304,
0x0506,
0x0708,
0x090A,
0x0B0C,
0x0D0E,
0x0F00,
],
False,
[
"16909060",
"84281096",
"151653132",
"219025152",
],
),
( (
{ {
CONF_SLAVE_COUNT: 1, CONF_SLAVE_COUNT: 1,
@ -721,6 +788,15 @@ async def test_all_sensor(hass: HomeAssistant, mock_do_cycle, expected) -> None:
True, True,
[STATE_UNAVAILABLE, STATE_UNKNOWN], [STATE_UNAVAILABLE, STATE_UNKNOWN],
), ),
(
{
CONF_VIRTUAL_COUNT: 1,
CONF_UNIQUE_ID: SLAVE_UNIQUE_ID,
},
[0x0102, 0x0304, 0x0403, 0x0201],
True,
[STATE_UNAVAILABLE, STATE_UNKNOWN],
),
( (
{ {
CONF_SLAVE_COUNT: 1, CONF_SLAVE_COUNT: 1,
@ -730,9 +806,18 @@ async def test_all_sensor(hass: HomeAssistant, mock_do_cycle, expected) -> None:
False, False,
[STATE_UNAVAILABLE, STATE_UNKNOWN], [STATE_UNAVAILABLE, STATE_UNKNOWN],
), ),
(
{
CONF_VIRTUAL_COUNT: 1,
CONF_UNIQUE_ID: SLAVE_UNIQUE_ID,
},
[],
False,
[STATE_UNAVAILABLE, STATE_UNKNOWN],
),
], ],
) )
async def test_slave_sensor(hass: HomeAssistant, mock_do_cycle, expected) -> None: async def test_virtual_sensor(hass: HomeAssistant, mock_do_cycle, expected) -> None:
"""Run test for sensor.""" """Run test for sensor."""
entity_registry = er.async_get(hass) entity_registry = er.async_get(hass)
for i in range(0, len(expected)): for i in range(0, len(expected)):
@ -766,7 +851,7 @@ async def test_slave_sensor(hass: HomeAssistant, mock_do_cycle, expected) -> Non
[ [
( (
{ {
CONF_SLAVE_COUNT: 0, CONF_VIRTUAL_COUNT: 0,
CONF_UNIQUE_ID: SLAVE_UNIQUE_ID, CONF_UNIQUE_ID: SLAVE_UNIQUE_ID,
CONF_SWAP: CONF_SWAP_BYTE, CONF_SWAP: CONF_SWAP_BYTE,
CONF_DATA_TYPE: DataType.UINT16, CONF_DATA_TYPE: DataType.UINT16,
@ -777,7 +862,7 @@ async def test_slave_sensor(hass: HomeAssistant, mock_do_cycle, expected) -> Non
), ),
( (
{ {
CONF_SLAVE_COUNT: 0, CONF_VIRTUAL_COUNT: 0,
CONF_UNIQUE_ID: SLAVE_UNIQUE_ID, CONF_UNIQUE_ID: SLAVE_UNIQUE_ID,
CONF_SWAP: CONF_SWAP_WORD, CONF_SWAP: CONF_SWAP_WORD,
CONF_DATA_TYPE: DataType.UINT32, CONF_DATA_TYPE: DataType.UINT32,
@ -788,7 +873,7 @@ async def test_slave_sensor(hass: HomeAssistant, mock_do_cycle, expected) -> Non
), ),
( (
{ {
CONF_SLAVE_COUNT: 0, CONF_VIRTUAL_COUNT: 0,
CONF_UNIQUE_ID: SLAVE_UNIQUE_ID, CONF_UNIQUE_ID: SLAVE_UNIQUE_ID,
CONF_SWAP: CONF_SWAP_WORD, CONF_SWAP: CONF_SWAP_WORD,
CONF_DATA_TYPE: DataType.UINT64, CONF_DATA_TYPE: DataType.UINT64,
@ -799,7 +884,7 @@ async def test_slave_sensor(hass: HomeAssistant, mock_do_cycle, expected) -> Non
), ),
( (
{ {
CONF_SLAVE_COUNT: 1, CONF_VIRTUAL_COUNT: 1,
CONF_UNIQUE_ID: SLAVE_UNIQUE_ID, CONF_UNIQUE_ID: SLAVE_UNIQUE_ID,
CONF_DATA_TYPE: DataType.UINT16, CONF_DATA_TYPE: DataType.UINT16,
CONF_SWAP: CONF_SWAP_BYTE, CONF_SWAP: CONF_SWAP_BYTE,
@ -810,7 +895,7 @@ async def test_slave_sensor(hass: HomeAssistant, mock_do_cycle, expected) -> Non
), ),
( (
{ {
CONF_SLAVE_COUNT: 1, CONF_VIRTUAL_COUNT: 1,
CONF_UNIQUE_ID: SLAVE_UNIQUE_ID, CONF_UNIQUE_ID: SLAVE_UNIQUE_ID,
CONF_DATA_TYPE: DataType.UINT32, CONF_DATA_TYPE: DataType.UINT32,
CONF_SWAP: CONF_SWAP_WORD, CONF_SWAP: CONF_SWAP_WORD,
@ -821,7 +906,7 @@ async def test_slave_sensor(hass: HomeAssistant, mock_do_cycle, expected) -> Non
), ),
( (
{ {
CONF_SLAVE_COUNT: 1, CONF_VIRTUAL_COUNT: 1,
CONF_UNIQUE_ID: SLAVE_UNIQUE_ID, CONF_UNIQUE_ID: SLAVE_UNIQUE_ID,
CONF_DATA_TYPE: DataType.UINT64, CONF_DATA_TYPE: DataType.UINT64,
CONF_SWAP: CONF_SWAP_WORD, CONF_SWAP: CONF_SWAP_WORD,
@ -832,7 +917,7 @@ async def test_slave_sensor(hass: HomeAssistant, mock_do_cycle, expected) -> Non
), ),
( (
{ {
CONF_SLAVE_COUNT: 3, CONF_VIRTUAL_COUNT: 3,
CONF_UNIQUE_ID: SLAVE_UNIQUE_ID, CONF_UNIQUE_ID: SLAVE_UNIQUE_ID,
CONF_DATA_TYPE: DataType.UINT16, CONF_DATA_TYPE: DataType.UINT16,
CONF_SWAP: CONF_SWAP_BYTE, CONF_SWAP: CONF_SWAP_BYTE,
@ -843,7 +928,7 @@ async def test_slave_sensor(hass: HomeAssistant, mock_do_cycle, expected) -> Non
), ),
( (
{ {
CONF_SLAVE_COUNT: 3, CONF_VIRTUAL_COUNT: 3,
CONF_UNIQUE_ID: SLAVE_UNIQUE_ID, CONF_UNIQUE_ID: SLAVE_UNIQUE_ID,
CONF_DATA_TYPE: DataType.UINT32, CONF_DATA_TYPE: DataType.UINT32,
CONF_SWAP: CONF_SWAP_WORD, CONF_SWAP: CONF_SWAP_WORD,
@ -868,7 +953,7 @@ async def test_slave_sensor(hass: HomeAssistant, mock_do_cycle, expected) -> Non
), ),
( (
{ {
CONF_SLAVE_COUNT: 3, CONF_VIRTUAL_COUNT: 3,
CONF_UNIQUE_ID: SLAVE_UNIQUE_ID, CONF_UNIQUE_ID: SLAVE_UNIQUE_ID,
CONF_DATA_TYPE: DataType.UINT64, CONF_DATA_TYPE: DataType.UINT64,
CONF_SWAP: CONF_SWAP_WORD, CONF_SWAP: CONF_SWAP_WORD,
@ -901,7 +986,9 @@ async def test_slave_sensor(hass: HomeAssistant, mock_do_cycle, expected) -> Non
), ),
], ],
) )
async def test_slave_swap_sensor(hass: HomeAssistant, mock_do_cycle, expected) -> None: async def test_virtual_swap_sensor(
hass: HomeAssistant, mock_do_cycle, expected
) -> None:
"""Run test for sensor.""" """Run test for sensor."""
for i in range(0, len(expected)): for i in range(0, len(expected)):
entity_id = f"{SENSOR_DOMAIN}.{TEST_ENTITY_NAME}".replace(" ", "_") entity_id = f"{SENSOR_DOMAIN}.{TEST_ENTITY_NAME}".replace(" ", "_")
@ -1230,7 +1317,7 @@ async def mock_restore(hass):
CONF_NAME: TEST_ENTITY_NAME, CONF_NAME: TEST_ENTITY_NAME,
CONF_ADDRESS: 51, CONF_ADDRESS: 51,
CONF_SCAN_INTERVAL: 0, CONF_SCAN_INTERVAL: 0,
CONF_SLAVE_COUNT: 1, CONF_VIRTUAL_COUNT: 1,
} }
] ]
}, },