Add Modbus fan speed support (#104577)

Co-authored-by: jan iversen <jancasacondor@gmail.com>
This commit is contained in:
Cían Hughes 2023-12-07 07:19:03 +00:00 committed by GitHub
parent 22119a2fd8
commit e051244927
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
6 changed files with 587 additions and 16 deletions

View file

@ -40,9 +40,19 @@ from homeassistant.components.modbus.const import (
CALL_TYPE_WRITE_REGISTERS,
CONF_BAUDRATE,
CONF_BYTESIZE,
CONF_CLIMATES,
CONF_CLOSE_COMM_ON_ERROR,
CONF_DATA_TYPE,
CONF_DEVICE_ADDRESS,
CONF_FAN_MODE_HIGH,
CONF_FAN_MODE_OFF,
CONF_FAN_MODE_ON,
CONF_FAN_MODE_REGISTER,
CONF_FAN_MODE_VALUES,
CONF_HVAC_MODE_COOL,
CONF_HVAC_MODE_HEAT,
CONF_HVAC_MODE_REGISTER,
CONF_HVAC_MODE_VALUES,
CONF_INPUT_TYPE,
CONF_MSG_WAIT,
CONF_PARITY,
@ -53,6 +63,7 @@ from homeassistant.components.modbus.const import (
CONF_SWAP_BYTE,
CONF_SWAP_WORD,
CONF_SWAP_WORD_BYTE,
CONF_TARGET_TEMP,
CONF_VIRTUAL_COUNT,
DEFAULT_SCAN_INTERVAL,
MODBUS_DOMAIN as DOMAIN,
@ -68,6 +79,7 @@ from homeassistant.components.modbus.const import (
)
from homeassistant.components.modbus.validators import (
duplicate_entity_validator,
duplicate_fan_mode_validator,
duplicate_modbus_validator,
nan_validator,
number_validator,
@ -361,6 +373,25 @@ async def test_duplicate_modbus_validator(do_config) -> None:
assert len(do_config) == 1
@pytest.mark.parametrize(
"do_config",
[
{
CONF_ADDRESS: 11,
CONF_FAN_MODE_VALUES: {
CONF_FAN_MODE_ON: 7,
CONF_FAN_MODE_OFF: 9,
CONF_FAN_MODE_HIGH: 9,
},
}
],
)
async def test_duplicate_fan_mode_validator(do_config) -> None:
"""Test duplicate modbus validator."""
duplicate_fan_mode_validator(do_config)
assert len(do_config[CONF_FAN_MODE_VALUES]) == 2
@pytest.mark.parametrize(
"do_config",
[
@ -404,12 +435,170 @@ async def test_duplicate_modbus_validator(do_config) -> None:
],
}
],
[
{
CONF_NAME: TEST_MODBUS_NAME,
CONF_TYPE: TCP,
CONF_HOST: TEST_MODBUS_HOST,
CONF_PORT: TEST_PORT_TCP,
CONF_CLIMATES: [
{
CONF_NAME: TEST_ENTITY_NAME,
CONF_ADDRESS: 117,
CONF_SLAVE: 0,
},
{
CONF_NAME: TEST_ENTITY_NAME + " 2",
CONF_ADDRESS: 117,
CONF_SLAVE: 0,
},
],
}
],
],
)
async def test_duplicate_entity_validator(do_config) -> None:
"""Test duplicate entity validator."""
duplicate_entity_validator(do_config)
assert len(do_config[0][CONF_SENSORS]) == 1
if CONF_SENSORS in do_config[0]:
assert len(do_config[0][CONF_SENSORS]) == 1
elif CONF_CLIMATES in do_config[0]:
assert len(do_config[0][CONF_CLIMATES]) == 1
@pytest.mark.parametrize(
"do_config",
[
[
{
CONF_NAME: TEST_MODBUS_NAME,
CONF_TYPE: TCP,
CONF_HOST: TEST_MODBUS_HOST,
CONF_PORT: TEST_PORT_TCP,
CONF_CLIMATES: [
{
CONF_NAME: TEST_ENTITY_NAME,
CONF_ADDRESS: 117,
CONF_SLAVE: 0,
},
{
CONF_NAME: TEST_ENTITY_NAME + " 2",
CONF_ADDRESS: 117,
CONF_SLAVE: 0,
},
],
}
],
[
{
CONF_NAME: TEST_MODBUS_NAME,
CONF_TYPE: TCP,
CONF_HOST: TEST_MODBUS_HOST,
CONF_PORT: TEST_PORT_TCP,
CONF_CLIMATES: [
{
CONF_NAME: TEST_ENTITY_NAME,
CONF_ADDRESS: 118,
CONF_SLAVE: 0,
CONF_HVAC_MODE_REGISTER: {
CONF_ADDRESS: 119,
CONF_HVAC_MODE_VALUES: {
CONF_HVAC_MODE_COOL: 0,
CONF_HVAC_MODE_HEAT: 1,
},
},
},
{
CONF_NAME: TEST_ENTITY_NAME + " 2",
CONF_ADDRESS: 117,
CONF_SLAVE: 0,
CONF_HVAC_MODE_REGISTER: {
CONF_ADDRESS: 118,
CONF_HVAC_MODE_VALUES: {
CONF_HVAC_MODE_COOL: 0,
CONF_HVAC_MODE_HEAT: 1,
},
},
},
],
}
],
[
{
CONF_NAME: TEST_MODBUS_NAME,
CONF_TYPE: TCP,
CONF_HOST: TEST_MODBUS_HOST,
CONF_PORT: TEST_PORT_TCP,
CONF_CLIMATES: [
{
CONF_NAME: TEST_ENTITY_NAME,
CONF_ADDRESS: 117,
CONF_SLAVE: 0,
CONF_FAN_MODE_REGISTER: {
CONF_ADDRESS: 120,
CONF_FAN_MODE_VALUES: {
CONF_FAN_MODE_ON: 0,
CONF_FAN_MODE_HIGH: 1,
},
},
},
{
CONF_NAME: TEST_ENTITY_NAME + " 2",
CONF_ADDRESS: 118,
CONF_SLAVE: 0,
CONF_TARGET_TEMP: 99,
CONF_FAN_MODE_REGISTER: {
CONF_ADDRESS: 120,
CONF_FAN_MODE_VALUES: {
CONF_FAN_MODE_ON: 0,
CONF_FAN_MODE_HIGH: 1,
},
},
},
],
}
],
[
{
CONF_NAME: TEST_MODBUS_NAME,
CONF_TYPE: TCP,
CONF_HOST: TEST_MODBUS_HOST,
CONF_PORT: TEST_PORT_TCP,
CONF_CLIMATES: [
{
CONF_NAME: TEST_ENTITY_NAME,
CONF_ADDRESS: 117,
CONF_SLAVE: 0,
CONF_FAN_MODE_REGISTER: {
CONF_ADDRESS: 120,
CONF_FAN_MODE_VALUES: {
CONF_FAN_MODE_ON: 0,
CONF_FAN_MODE_HIGH: 1,
},
},
},
{
CONF_NAME: TEST_ENTITY_NAME + " 2",
CONF_ADDRESS: 118,
CONF_SLAVE: 0,
CONF_TARGET_TEMP: 117,
CONF_FAN_MODE_REGISTER: {
CONF_ADDRESS: 121,
CONF_FAN_MODE_VALUES: {
CONF_FAN_MODE_ON: 0,
CONF_FAN_MODE_HIGH: 1,
},
},
},
],
}
],
],
)
async def test_duplicate_entity_validator_with_climate(do_config) -> None:
"""Test duplicate entity validator."""
duplicate_entity_validator(do_config)
assert len(do_config[0][CONF_CLIMATES]) == 1
@pytest.mark.parametrize(