From 338be8c70b9b38802beebbc89e21e530a2d9dead Mon Sep 17 00:00:00 2001 From: Matthias Alphart Date: Tue, 30 Mar 2021 18:14:38 +0200 Subject: [PATCH] KNX passive group addresses (#48009) --- homeassistant/components/knx/schema.py | 125 +++++++++++++------------ 1 file changed, 63 insertions(+), 62 deletions(-) diff --git a/homeassistant/components/knx/schema.py b/homeassistant/components/knx/schema.py index bfb8ba62c39..fb4b29fbd70 100644 --- a/homeassistant/components/knx/schema.py +++ b/homeassistant/components/knx/schema.py @@ -34,6 +34,7 @@ ga_validator = vol.Any( vol.All(vol.Coerce(int), vol.Range(min=1, max=65535)), msg="value does not match pattern for KNX group address '
//', '
/' or '' (eg.'1/2/3', '9/234', '123')", ) +ga_list_validator = vol.All(cv.ensure_list, [ga_validator]) ia_validator = vol.Any( cv.matches_regex(IndividualAddress.ADDRESS_RE.pattern), @@ -99,7 +100,7 @@ class BinarySensorSchema: vol.Optional(CONF_SYNC_STATE, default=True): sync_state_validator, vol.Optional(CONF_IGNORE_INTERNAL_STATE, default=False): cv.boolean, vol.Optional(CONF_INVERT, default=False): cv.boolean, - vol.Required(CONF_STATE_ADDRESS): ga_validator, + vol.Required(CONF_STATE_ADDRESS): ga_list_validator, vol.Optional(CONF_CONTEXT_TIMEOUT): vol.All( vol.Coerce(float), vol.Range(min=0, max=10) ), @@ -169,27 +170,27 @@ class ClimateSchema: vol.Optional( CONF_TEMPERATURE_STEP, default=DEFAULT_TEMPERATURE_STEP ): vol.All(float, vol.Range(min=0, max=2)), - vol.Required(CONF_TEMPERATURE_ADDRESS): ga_validator, - vol.Required(CONF_TARGET_TEMPERATURE_STATE_ADDRESS): ga_validator, - vol.Optional(CONF_TARGET_TEMPERATURE_ADDRESS): ga_validator, - vol.Optional(CONF_SETPOINT_SHIFT_ADDRESS): ga_validator, - vol.Optional(CONF_SETPOINT_SHIFT_STATE_ADDRESS): ga_validator, - vol.Optional(CONF_OPERATION_MODE_ADDRESS): ga_validator, - vol.Optional(CONF_OPERATION_MODE_STATE_ADDRESS): ga_validator, - vol.Optional(CONF_CONTROLLER_STATUS_ADDRESS): ga_validator, - vol.Optional(CONF_CONTROLLER_STATUS_STATE_ADDRESS): ga_validator, - vol.Optional(CONF_CONTROLLER_MODE_ADDRESS): ga_validator, - vol.Optional(CONF_CONTROLLER_MODE_STATE_ADDRESS): ga_validator, - vol.Optional(CONF_HEAT_COOL_ADDRESS): ga_validator, - vol.Optional(CONF_HEAT_COOL_STATE_ADDRESS): ga_validator, + vol.Required(CONF_TEMPERATURE_ADDRESS): ga_list_validator, + vol.Required(CONF_TARGET_TEMPERATURE_STATE_ADDRESS): ga_list_validator, + vol.Optional(CONF_TARGET_TEMPERATURE_ADDRESS): ga_list_validator, + vol.Optional(CONF_SETPOINT_SHIFT_ADDRESS): ga_list_validator, + vol.Optional(CONF_SETPOINT_SHIFT_STATE_ADDRESS): ga_list_validator, + vol.Optional(CONF_OPERATION_MODE_ADDRESS): ga_list_validator, + vol.Optional(CONF_OPERATION_MODE_STATE_ADDRESS): ga_list_validator, + vol.Optional(CONF_CONTROLLER_STATUS_ADDRESS): ga_list_validator, + vol.Optional(CONF_CONTROLLER_STATUS_STATE_ADDRESS): ga_list_validator, + vol.Optional(CONF_CONTROLLER_MODE_ADDRESS): ga_list_validator, + vol.Optional(CONF_CONTROLLER_MODE_STATE_ADDRESS): ga_list_validator, + vol.Optional(CONF_HEAT_COOL_ADDRESS): ga_list_validator, + vol.Optional(CONF_HEAT_COOL_STATE_ADDRESS): ga_list_validator, vol.Optional( CONF_OPERATION_MODE_FROST_PROTECTION_ADDRESS - ): ga_validator, - vol.Optional(CONF_OPERATION_MODE_NIGHT_ADDRESS): ga_validator, - vol.Optional(CONF_OPERATION_MODE_COMFORT_ADDRESS): ga_validator, - vol.Optional(CONF_OPERATION_MODE_STANDBY_ADDRESS): ga_validator, - vol.Optional(CONF_ON_OFF_ADDRESS): ga_validator, - vol.Optional(CONF_ON_OFF_STATE_ADDRESS): ga_validator, + ): ga_list_validator, + vol.Optional(CONF_OPERATION_MODE_NIGHT_ADDRESS): ga_list_validator, + vol.Optional(CONF_OPERATION_MODE_COMFORT_ADDRESS): ga_list_validator, + vol.Optional(CONF_OPERATION_MODE_STANDBY_ADDRESS): ga_list_validator, + vol.Optional(CONF_ON_OFF_ADDRESS): ga_list_validator, + vol.Optional(CONF_ON_OFF_STATE_ADDRESS): ga_list_validator, vol.Optional( CONF_ON_OFF_INVERT, default=DEFAULT_ON_OFF_INVERT ): cv.boolean, @@ -230,13 +231,13 @@ class CoverSchema: SCHEMA = vol.Schema( { vol.Optional(CONF_NAME, default=DEFAULT_NAME): cv.string, - vol.Optional(CONF_MOVE_LONG_ADDRESS): ga_validator, - vol.Optional(CONF_MOVE_SHORT_ADDRESS): ga_validator, - vol.Optional(CONF_STOP_ADDRESS): ga_validator, - vol.Optional(CONF_POSITION_ADDRESS): ga_validator, - vol.Optional(CONF_POSITION_STATE_ADDRESS): ga_validator, - vol.Optional(CONF_ANGLE_ADDRESS): ga_validator, - vol.Optional(CONF_ANGLE_STATE_ADDRESS): ga_validator, + vol.Optional(CONF_MOVE_LONG_ADDRESS): ga_list_validator, + vol.Optional(CONF_MOVE_SHORT_ADDRESS): ga_list_validator, + vol.Optional(CONF_STOP_ADDRESS): ga_list_validator, + vol.Optional(CONF_POSITION_ADDRESS): ga_list_validator, + vol.Optional(CONF_POSITION_STATE_ADDRESS): ga_list_validator, + vol.Optional(CONF_ANGLE_ADDRESS): ga_list_validator, + vol.Optional(CONF_ANGLE_STATE_ADDRESS): ga_list_validator, vol.Optional( CONF_TRAVELLING_TIME_DOWN, default=DEFAULT_TRAVEL_TIME ): cv.positive_float, @@ -295,10 +296,10 @@ class FanSchema: SCHEMA = vol.Schema( { vol.Optional(CONF_NAME, default=DEFAULT_NAME): cv.string, - vol.Required(KNX_ADDRESS): ga_validator, - vol.Optional(CONF_STATE_ADDRESS): ga_validator, - vol.Optional(CONF_OSCILLATION_ADDRESS): ga_validator, - vol.Optional(CONF_OSCILLATION_STATE_ADDRESS): ga_validator, + vol.Required(KNX_ADDRESS): ga_list_validator, + vol.Optional(CONF_STATE_ADDRESS): ga_list_validator, + vol.Optional(CONF_OSCILLATION_ADDRESS): ga_list_validator, + vol.Optional(CONF_OSCILLATION_STATE_ADDRESS): ga_list_validator, vol.Optional(CONF_MAX_STEP): cv.byte, } ) @@ -333,10 +334,10 @@ class LightSchema: COLOR_SCHEMA = vol.Schema( { - vol.Optional(KNX_ADDRESS): ga_validator, - vol.Optional(CONF_STATE_ADDRESS): ga_validator, - vol.Required(CONF_BRIGHTNESS_ADDRESS): ga_validator, - vol.Optional(CONF_BRIGHTNESS_STATE_ADDRESS): ga_validator, + vol.Optional(KNX_ADDRESS): ga_list_validator, + vol.Optional(CONF_STATE_ADDRESS): ga_list_validator, + vol.Required(CONF_BRIGHTNESS_ADDRESS): ga_list_validator, + vol.Optional(CONF_BRIGHTNESS_STATE_ADDRESS): ga_list_validator, } ) @@ -344,25 +345,25 @@ class LightSchema: vol.Schema( { vol.Optional(CONF_NAME, default=DEFAULT_NAME): cv.string, - vol.Optional(KNX_ADDRESS): ga_validator, - vol.Optional(CONF_STATE_ADDRESS): ga_validator, - vol.Optional(CONF_BRIGHTNESS_ADDRESS): ga_validator, - vol.Optional(CONF_BRIGHTNESS_STATE_ADDRESS): ga_validator, + vol.Optional(KNX_ADDRESS): ga_list_validator, + vol.Optional(CONF_STATE_ADDRESS): ga_list_validator, + vol.Optional(CONF_BRIGHTNESS_ADDRESS): ga_list_validator, + vol.Optional(CONF_BRIGHTNESS_STATE_ADDRESS): ga_list_validator, vol.Exclusive(CONF_INDIVIDUAL_COLORS, "color"): { vol.Inclusive(CONF_RED, "colors"): COLOR_SCHEMA, vol.Inclusive(CONF_GREEN, "colors"): COLOR_SCHEMA, vol.Inclusive(CONF_BLUE, "colors"): COLOR_SCHEMA, vol.Optional(CONF_WHITE): COLOR_SCHEMA, }, - vol.Exclusive(CONF_COLOR_ADDRESS, "color"): ga_validator, - vol.Optional(CONF_COLOR_STATE_ADDRESS): ga_validator, - vol.Optional(CONF_COLOR_TEMP_ADDRESS): ga_validator, - vol.Optional(CONF_COLOR_TEMP_STATE_ADDRESS): ga_validator, + vol.Exclusive(CONF_COLOR_ADDRESS, "color"): ga_list_validator, + vol.Optional(CONF_COLOR_STATE_ADDRESS): ga_list_validator, + vol.Optional(CONF_COLOR_TEMP_ADDRESS): ga_list_validator, + vol.Optional(CONF_COLOR_TEMP_STATE_ADDRESS): ga_list_validator, vol.Optional( CONF_COLOR_TEMP_MODE, default=DEFAULT_COLOR_TEMP_MODE ): vol.All(vol.Upper, cv.enum(ColorTempModes)), - vol.Exclusive(CONF_RGBW_ADDRESS, "color"): ga_validator, - vol.Optional(CONF_RGBW_STATE_ADDRESS): ga_validator, + vol.Exclusive(CONF_RGBW_ADDRESS, "color"): ga_list_validator, + vol.Optional(CONF_RGBW_STATE_ADDRESS): ga_list_validator, vol.Optional(CONF_MIN_KELVIN, default=DEFAULT_MIN_KELVIN): vol.All( vol.Coerce(int), vol.Range(min=1) ), @@ -415,7 +416,7 @@ class SceneSchema: SCHEMA = vol.Schema( { vol.Optional(CONF_NAME, default=DEFAULT_NAME): cv.string, - vol.Required(KNX_ADDRESS): ga_validator, + vol.Required(KNX_ADDRESS): ga_list_validator, vol.Required(CONF_SCENE_NUMBER): cv.positive_int, } ) @@ -434,8 +435,8 @@ class SensorSchema: vol.Optional(CONF_NAME, default=DEFAULT_NAME): cv.string, vol.Optional(CONF_SYNC_STATE, default=True): sync_state_validator, vol.Optional(CONF_ALWAYS_CALLBACK, default=False): cv.boolean, - vol.Required(CONF_STATE_ADDRESS): ga_validator, vol.Required(CONF_TYPE): sensor_type_validator, + vol.Required(CONF_STATE_ADDRESS): ga_list_validator, } ) @@ -451,8 +452,8 @@ class SwitchSchema: { vol.Optional(CONF_NAME, default=DEFAULT_NAME): cv.string, vol.Optional(CONF_INVERT, default=False): cv.boolean, - vol.Required(KNX_ADDRESS): ga_validator, - vol.Optional(CONF_STATE_ADDRESS): ga_validator, + vol.Required(KNX_ADDRESS): ga_list_validator, + vol.Optional(CONF_STATE_ADDRESS): ga_list_validator, } ) @@ -483,18 +484,18 @@ class WeatherSchema: vol.Optional(CONF_NAME, default=DEFAULT_NAME): cv.string, vol.Optional(CONF_SYNC_STATE, default=True): sync_state_validator, vol.Optional(CONF_KNX_CREATE_SENSORS, default=False): cv.boolean, - vol.Required(CONF_KNX_TEMPERATURE_ADDRESS): ga_validator, - vol.Optional(CONF_KNX_BRIGHTNESS_SOUTH_ADDRESS): ga_validator, - vol.Optional(CONF_KNX_BRIGHTNESS_EAST_ADDRESS): ga_validator, - vol.Optional(CONF_KNX_BRIGHTNESS_WEST_ADDRESS): ga_validator, - vol.Optional(CONF_KNX_BRIGHTNESS_NORTH_ADDRESS): ga_validator, - vol.Optional(CONF_KNX_WIND_SPEED_ADDRESS): ga_validator, - vol.Optional(CONF_KNX_WIND_BEARING_ADDRESS): ga_validator, - vol.Optional(CONF_KNX_RAIN_ALARM_ADDRESS): ga_validator, - vol.Optional(CONF_KNX_FROST_ALARM_ADDRESS): ga_validator, - vol.Optional(CONF_KNX_WIND_ALARM_ADDRESS): ga_validator, - vol.Optional(CONF_KNX_DAY_NIGHT_ADDRESS): ga_validator, - vol.Optional(CONF_KNX_AIR_PRESSURE_ADDRESS): ga_validator, - vol.Optional(CONF_KNX_HUMIDITY_ADDRESS): ga_validator, + vol.Required(CONF_KNX_TEMPERATURE_ADDRESS): ga_list_validator, + vol.Optional(CONF_KNX_BRIGHTNESS_SOUTH_ADDRESS): ga_list_validator, + vol.Optional(CONF_KNX_BRIGHTNESS_EAST_ADDRESS): ga_list_validator, + vol.Optional(CONF_KNX_BRIGHTNESS_WEST_ADDRESS): ga_list_validator, + vol.Optional(CONF_KNX_BRIGHTNESS_NORTH_ADDRESS): ga_list_validator, + vol.Optional(CONF_KNX_WIND_SPEED_ADDRESS): ga_list_validator, + vol.Optional(CONF_KNX_WIND_BEARING_ADDRESS): ga_list_validator, + vol.Optional(CONF_KNX_RAIN_ALARM_ADDRESS): ga_list_validator, + vol.Optional(CONF_KNX_FROST_ALARM_ADDRESS): ga_list_validator, + vol.Optional(CONF_KNX_WIND_ALARM_ADDRESS): ga_list_validator, + vol.Optional(CONF_KNX_DAY_NIGHT_ADDRESS): ga_list_validator, + vol.Optional(CONF_KNX_AIR_PRESSURE_ADDRESS): ga_list_validator, + vol.Optional(CONF_KNX_HUMIDITY_ADDRESS): ga_list_validator, } )