diff --git a/homeassistant/components/modbus/__init__.py b/homeassistant/components/modbus/__init__.py index 5f3ddd7a4b5..875669e6dd7 100644 --- a/homeassistant/components/modbus/__init__.py +++ b/homeassistant/components/modbus/__init__.py @@ -312,7 +312,7 @@ SENSOR_SCHEMA = vol.All( vol.Optional(CONF_STATE_CLASS): SENSOR_STATE_CLASSES_SCHEMA, vol.Optional(CONF_UNIT_OF_MEASUREMENT): cv.string, vol.Exclusive(CONF_VIRTUAL_COUNT, "vir_sen_count"): cv.positive_int, - vol.Optional(CONF_SLAVE_COUNT, "vir_sen_count"): cv.positive_int, + vol.Exclusive(CONF_SLAVE_COUNT, "vir_sen_count"): cv.positive_int, vol.Optional(CONF_MIN_VALUE): number_validator, vol.Optional(CONF_MAX_VALUE): number_validator, vol.Optional(CONF_NAN_VALUE): nan_validator, diff --git a/tests/components/modbus/conftest.py b/tests/components/modbus/conftest.py index d4c7dfa5e10..a08743b7e6c 100644 --- a/tests/components/modbus/conftest.py +++ b/tests/components/modbus/conftest.py @@ -10,7 +10,7 @@ from pymodbus.exceptions import ModbusException import pytest from homeassistant.components.modbus.const import MODBUS_DOMAIN as DOMAIN, TCP -from homeassistant.const import CONF_HOST, CONF_NAME, CONF_PORT, CONF_SLAVE, CONF_TYPE +from homeassistant.const import CONF_HOST, CONF_NAME, CONF_PORT, CONF_TYPE from homeassistant.core import HomeAssistant from homeassistant.setup import async_setup_component import homeassistant.util.dt as dt_util @@ -87,9 +87,6 @@ async def mock_modbus_fixture( for key in conf: if config_addon: conf[key][0].update(config_addon) - for entity in conf[key]: - if CONF_SLAVE not in entity: - entity[CONF_SLAVE] = 0 caplog.set_level(logging.WARNING) config = { DOMAIN: [ diff --git a/tests/components/modbus/test_binary_sensor.py b/tests/components/modbus/test_binary_sensor.py index 7f668b26e04..2069aa23b8f 100644 --- a/tests/components/modbus/test_binary_sensor.py +++ b/tests/components/modbus/test_binary_sensor.py @@ -8,6 +8,7 @@ from homeassistant.components.modbus.const import ( CALL_TYPE_DISCRETE, CALL_TYPE_REGISTER_HOLDING, CALL_TYPE_REGISTER_INPUT, + CONF_DEVICE_ADDRESS, CONF_INPUT_TYPE, CONF_LAZY_ERROR, CONF_SLAVE_COUNT, @@ -60,6 +61,18 @@ SLAVE_UNIQUE_ID = "ground_floor_sensor" } ] }, + { + CONF_BINARY_SENSORS: [ + { + CONF_NAME: TEST_ENTITY_NAME, + CONF_ADDRESS: 51, + CONF_DEVICE_ADDRESS: 10, + CONF_INPUT_TYPE: CALL_TYPE_DISCRETE, + CONF_DEVICE_CLASS: "door", + CONF_LAZY_ERROR: 10, + } + ] + }, { CONF_BINARY_SENSORS: [ { @@ -70,6 +83,16 @@ SLAVE_UNIQUE_ID = "ground_floor_sensor" } ] }, + { + CONF_BINARY_SENSORS: [ + { + CONF_NAME: TEST_ENTITY_NAME, + CONF_ADDRESS: 51, + CONF_DEVICE_ADDRESS: 10, + CONF_INPUT_TYPE: CALL_TYPE_REGISTER_INPUT, + } + ] + }, ], ) async def test_config_binary_sensor(hass: HomeAssistant, mock_modbus) -> None: @@ -299,7 +322,7 @@ TEST_NAME = "test_sensor" CONF_BINARY_SENSORS: [ { CONF_NAME: TEST_ENTITY_NAME, - CONF_ADDRESS: 51, + CONF_ADDRESS: 52, CONF_VIRTUAL_COUNT: 3, } ] diff --git a/tests/components/modbus/test_climate.py b/tests/components/modbus/test_climate.py index 4ab78df0c81..f2de0177c74 100644 --- a/tests/components/modbus/test_climate.py +++ b/tests/components/modbus/test_climate.py @@ -11,6 +11,7 @@ from homeassistant.components.climate.const import ( from homeassistant.components.modbus.const import ( CONF_CLIMATES, CONF_DATA_TYPE, + CONF_DEVICE_ADDRESS, CONF_HVAC_MODE_AUTO, CONF_HVAC_MODE_COOL, CONF_HVAC_MODE_DRY, @@ -57,6 +58,16 @@ ENTITY_ID = f"{CLIMATE_DOMAIN}.{TEST_ENTITY_NAME}".replace(" ", "_") } ], }, + { + CONF_CLIMATES: [ + { + CONF_NAME: TEST_ENTITY_NAME, + CONF_TARGET_TEMP: 117, + CONF_ADDRESS: 117, + CONF_DEVICE_ADDRESS: 10, + } + ], + }, { CONF_CLIMATES: [ { diff --git a/tests/components/modbus/test_cover.py b/tests/components/modbus/test_cover.py index 66e4537d67e..b91b38b1f70 100644 --- a/tests/components/modbus/test_cover.py +++ b/tests/components/modbus/test_cover.py @@ -7,6 +7,7 @@ from homeassistant.components.cover import DOMAIN as COVER_DOMAIN from homeassistant.components.modbus.const import ( CALL_TYPE_COIL, CALL_TYPE_REGISTER_HOLDING, + CONF_DEVICE_ADDRESS, CONF_INPUT_TYPE, CONF_LAZY_ERROR, CONF_STATE_CLOSED, @@ -62,6 +63,18 @@ ENTITY_ID2 = f"{ENTITY_ID}_2" } ] }, + { + CONF_COVERS: [ + { + CONF_NAME: TEST_ENTITY_NAME, + CONF_ADDRESS: 1234, + CONF_INPUT_TYPE: CALL_TYPE_REGISTER_HOLDING, + CONF_DEVICE_ADDRESS: 10, + CONF_SCAN_INTERVAL: 20, + CONF_LAZY_ERROR: 10, + } + ] + }, ], ) async def test_config_cover(hass: HomeAssistant, mock_modbus) -> None: diff --git a/tests/components/modbus/test_fan.py b/tests/components/modbus/test_fan.py index 2d2cc83162d..e47ed5c2371 100644 --- a/tests/components/modbus/test_fan.py +++ b/tests/components/modbus/test_fan.py @@ -8,6 +8,7 @@ from homeassistant.components.modbus.const import ( CALL_TYPE_DISCRETE, CALL_TYPE_REGISTER_HOLDING, CALL_TYPE_REGISTER_INPUT, + CONF_DEVICE_ADDRESS, CONF_FANS, CONF_INPUT_TYPE, CONF_LAZY_ERROR, @@ -75,6 +76,24 @@ ENTITY_ID2 = f"{ENTITY_ID}_2" } ] }, + { + CONF_FANS: [ + { + CONF_NAME: TEST_ENTITY_NAME, + CONF_ADDRESS: 1234, + CONF_DEVICE_ADDRESS: 1, + CONF_COMMAND_OFF: 0x00, + CONF_COMMAND_ON: 0x01, + CONF_LAZY_ERROR: 10, + CONF_VERIFY: { + CONF_INPUT_TYPE: CALL_TYPE_REGISTER_HOLDING, + CONF_ADDRESS: 1235, + CONF_STATE_OFF: 0, + CONF_STATE_ON: 1, + }, + } + ] + }, { CONF_FANS: [ { diff --git a/tests/components/modbus/test_init.py b/tests/components/modbus/test_init.py index a68ac2d3738..f9c7fb42b2d 100644 --- a/tests/components/modbus/test_init.py +++ b/tests/components/modbus/test_init.py @@ -41,6 +41,7 @@ from homeassistant.components.modbus.const import ( CONF_BAUDRATE, CONF_BYTESIZE, CONF_DATA_TYPE, + CONF_DEVICE_ADDRESS, CONF_INPUT_TYPE, CONF_MSG_WAIT, CONF_PARITY, @@ -517,6 +518,20 @@ async def test_duplicate_entity_validator(do_config) -> None: } ], }, + { + # Special test for scan_interval validator with scan_interval: 0 + CONF_TYPE: TCP, + CONF_HOST: TEST_MODBUS_HOST, + CONF_PORT: TEST_PORT_TCP, + CONF_SENSORS: [ + { + CONF_NAME: TEST_ENTITY_NAME, + CONF_ADDRESS: 117, + CONF_DEVICE_ADDRESS: 0, + CONF_SCAN_INTERVAL: 0, + } + ], + }, ], ) async def test_config_modbus( diff --git a/tests/components/modbus/test_light.py b/tests/components/modbus/test_light.py index 46763b3b3a2..a5871bdbd67 100644 --- a/tests/components/modbus/test_light.py +++ b/tests/components/modbus/test_light.py @@ -8,6 +8,7 @@ from homeassistant.components.modbus.const import ( CALL_TYPE_DISCRETE, CALL_TYPE_REGISTER_HOLDING, CALL_TYPE_REGISTER_INPUT, + CONF_DEVICE_ADDRESS, CONF_INPUT_TYPE, CONF_LAZY_ERROR, CONF_STATE_OFF, @@ -75,6 +76,23 @@ ENTITY_ID2 = f"{ENTITY_ID}_2" } ] }, + { + CONF_LIGHTS: [ + { + CONF_NAME: TEST_ENTITY_NAME, + CONF_ADDRESS: 1234, + CONF_DEVICE_ADDRESS: 1, + CONF_COMMAND_OFF: 0x00, + CONF_COMMAND_ON: 0x01, + CONF_VERIFY: { + CONF_INPUT_TYPE: CALL_TYPE_REGISTER_HOLDING, + CONF_ADDRESS: 1235, + CONF_STATE_OFF: 0, + CONF_STATE_ON: 1, + }, + } + ] + }, { CONF_LIGHTS: [ { diff --git a/tests/components/modbus/test_sensor.py b/tests/components/modbus/test_sensor.py index 0833c0e2f7f..46c38873a93 100644 --- a/tests/components/modbus/test_sensor.py +++ b/tests/components/modbus/test_sensor.py @@ -8,6 +8,7 @@ from homeassistant.components.modbus.const import ( CALL_TYPE_REGISTER_HOLDING, CALL_TYPE_REGISTER_INPUT, CONF_DATA_TYPE, + CONF_DEVICE_ADDRESS, CONF_INPUT_TYPE, CONF_LAZY_ERROR, CONF_MAX_VALUE, @@ -86,6 +87,23 @@ SLAVE_UNIQUE_ID = "ground_floor_sensor" } ] }, + { + CONF_SENSORS: [ + { + CONF_NAME: TEST_ENTITY_NAME, + CONF_ADDRESS: 51, + CONF_DEVICE_ADDRESS: 10, + CONF_DATA_TYPE: DataType.INT16, + CONF_PRECISION: 0, + CONF_SCALE: 1, + CONF_OFFSET: 0, + CONF_STATE_CLASS: SensorStateClass.MEASUREMENT, + CONF_LAZY_ERROR: 10, + CONF_INPUT_TYPE: CALL_TYPE_REGISTER_HOLDING, + CONF_DEVICE_CLASS: "battery", + } + ] + }, { CONF_SENSORS: [ { diff --git a/tests/components/modbus/test_switch.py b/tests/components/modbus/test_switch.py index 7a79e19869a..ff7d6860f3b 100644 --- a/tests/components/modbus/test_switch.py +++ b/tests/components/modbus/test_switch.py @@ -11,6 +11,7 @@ from homeassistant.components.modbus.const import ( CALL_TYPE_DISCRETE, CALL_TYPE_REGISTER_HOLDING, CALL_TYPE_REGISTER_INPUT, + CONF_DEVICE_ADDRESS, CONF_INPUT_TYPE, CONF_LAZY_ERROR, CONF_STATE_OFF, @@ -85,6 +86,24 @@ ENTITY_ID2 = f"{ENTITY_ID}_2" } ] }, + { + CONF_SWITCHES: [ + { + CONF_NAME: TEST_ENTITY_NAME, + CONF_ADDRESS: 1234, + CONF_DEVICE_ADDRESS: 1, + CONF_COMMAND_OFF: 0x00, + CONF_COMMAND_ON: 0x01, + CONF_DEVICE_CLASS: "switch", + CONF_VERIFY: { + CONF_INPUT_TYPE: CALL_TYPE_REGISTER_HOLDING, + CONF_ADDRESS: 1235, + CONF_STATE_OFF: 0, + CONF_STATE_ON: 1, + }, + } + ] + }, { CONF_SWITCHES: [ {