diff --git a/tests/components/modbus/test_binary_sensor.py b/tests/components/modbus/test_binary_sensor.py index 1e413fcc764..7f668b26e04 100644 --- a/tests/components/modbus/test_binary_sensor.py +++ b/tests/components/modbus/test_binary_sensor.py @@ -11,6 +11,7 @@ from homeassistant.components.modbus.const import ( CONF_INPUT_TYPE, CONF_LAZY_ERROR, CONF_SLAVE_COUNT, + CONF_VIRTUAL_COUNT, MODBUS_DOMAIN, ) from homeassistant.const import ( @@ -265,7 +266,7 @@ ENTITY_ID2 = f"{ENTITY_ID}_1" CONF_NAME: TEST_ENTITY_NAME, CONF_ADDRESS: 51, 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.""" 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], ), + ( + {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}, [True] + [False] * 7, STATE_ON, [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}, [False, True] + [False] * 6, STATE_OFF, [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}, [True, False] * 4, STATE_ON, [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}, [True, False] * 16, STATE_ON, [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 ) -> None: """Run test for given config.""" diff --git a/tests/components/modbus/test_init.py b/tests/components/modbus/test_init.py index c2f3e639580..a68ac2d3738 100644 --- a/tests/components/modbus/test_init.py +++ b/tests/components/modbus/test_init.py @@ -50,6 +50,7 @@ from homeassistant.components.modbus.const import ( CONF_SWAP_BYTE, CONF_SWAP_WORD, CONF_SWAP_WORD_BYTE, + CONF_VIRTUAL_COUNT, DEFAULT_SCAN_INTERVAL, MODBUS_DOMAIN as DOMAIN, RTUOVERTCP, @@ -263,11 +264,23 @@ async def test_ok_struct_validator(do_config) -> None: CONF_STRUCTURE: ">f", 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_DATA_TYPE: DataType.STRING, CONF_SLAVE_COUNT: 2, }, + { + CONF_NAME: TEST_ENTITY_NAME, + CONF_DATA_TYPE: DataType.STRING, + CONF_VIRTUAL_COUNT: 2, + }, { CONF_NAME: TEST_ENTITY_NAME, CONF_DATA_TYPE: DataType.INT16, @@ -279,6 +292,12 @@ async def test_ok_struct_validator(do_config) -> None: CONF_SLAVE_COUNT: 2, 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_DATA_TYPE: DataType.INT16, diff --git a/tests/components/modbus/test_sensor.py b/tests/components/modbus/test_sensor.py index 14bccbafac4..0833c0e2f7f 100644 --- a/tests/components/modbus/test_sensor.py +++ b/tests/components/modbus/test_sensor.py @@ -21,6 +21,7 @@ from homeassistant.components.modbus.const import ( CONF_SWAP_NONE, CONF_SWAP_WORD, CONF_SWAP_WORD_BYTE, + CONF_VIRTUAL_COUNT, CONF_ZERO_SUPPRESS, MODBUS_DOMAIN, 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: @@ -671,6 +682,21 @@ async def test_all_sensor(hass: HomeAssistant, mock_do_cycle, expected) -> None: False, ["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, @@ -680,6 +706,15 @@ async def test_all_sensor(hass: HomeAssistant, mock_do_cycle, expected) -> None: False, ["16909060"], ), + ( + { + CONF_VIRTUAL_COUNT: 0, + CONF_UNIQUE_ID: SLAVE_UNIQUE_ID, + }, + [0x0102, 0x0304], + False, + ["16909060"], + ), ( { CONF_SLAVE_COUNT: 1, @@ -689,6 +724,15 @@ async def test_all_sensor(hass: HomeAssistant, mock_do_cycle, expected) -> None: False, ["16909060", "67305985"], ), + ( + { + CONF_VIRTUAL_COUNT: 1, + CONF_UNIQUE_ID: SLAVE_UNIQUE_ID, + }, + [0x0102, 0x0304, 0x0403, 0x0201], + False, + ["16909060", "67305985"], + ), ( { CONF_SLAVE_COUNT: 3, @@ -712,6 +756,29 @@ async def test_all_sensor(hass: HomeAssistant, mock_do_cycle, expected) -> None: "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, @@ -721,6 +788,15 @@ async def test_all_sensor(hass: HomeAssistant, mock_do_cycle, expected) -> None: True, [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, @@ -730,9 +806,18 @@ async def test_all_sensor(hass: HomeAssistant, mock_do_cycle, expected) -> None: False, [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.""" entity_registry = er.async_get(hass) 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_SWAP: CONF_SWAP_BYTE, 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_SWAP: CONF_SWAP_WORD, 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_SWAP: CONF_SWAP_WORD, 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_DATA_TYPE: DataType.UINT16, 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_DATA_TYPE: DataType.UINT32, 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_DATA_TYPE: DataType.UINT64, 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_DATA_TYPE: DataType.UINT16, 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_DATA_TYPE: DataType.UINT32, 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_DATA_TYPE: DataType.UINT64, 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.""" for i in range(0, len(expected)): entity_id = f"{SENSOR_DOMAIN}.{TEST_ENTITY_NAME}".replace(" ", "_") @@ -1230,7 +1317,7 @@ async def mock_restore(hass): CONF_NAME: TEST_ENTITY_NAME, CONF_ADDRESS: 51, CONF_SCAN_INTERVAL: 0, - CONF_SLAVE_COUNT: 1, + CONF_VIRTUAL_COUNT: 1, } ] },