Add Modbus fan speed support (#104577)
Co-authored-by: jan iversen <jancasacondor@gmail.com>
This commit is contained in:
parent
22119a2fd8
commit
e051244927
6 changed files with 587 additions and 16 deletions
|
@ -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(
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue