Refactor child validation (#23482)
* Try to make the process more readable and paritioned. * Validate child values using set message. * Only validate using relevant schemas. * Extract node validation. * Rework const types and schemas. * Rework child validator. * Enhance warning logging message.
This commit is contained in:
parent
c384adeef4
commit
c26af22edd
4 changed files with 214 additions and 179 deletions
|
@ -1,5 +1,5 @@
|
|||
"""MySensors constants."""
|
||||
import homeassistant.helpers.config_validation as cv
|
||||
from collections import defaultdict
|
||||
|
||||
ATTR_DEVICES = 'devices'
|
||||
|
||||
|
@ -25,117 +25,102 @@ NODE_CALLBACK = 'mysensors_node_callback_{}_{}'
|
|||
TYPE = 'type'
|
||||
UPDATE_DELAY = 0.1
|
||||
|
||||
# MySensors const schemas
|
||||
BINARY_SENSOR_SCHEMA = {PLATFORM: 'binary_sensor', TYPE: 'V_TRIPPED'}
|
||||
CLIMATE_SCHEMA = {PLATFORM: 'climate', TYPE: 'V_HVAC_FLOW_STATE'}
|
||||
LIGHT_DIMMER_SCHEMA = {
|
||||
PLATFORM: 'light', TYPE: 'V_DIMMER',
|
||||
SCHEMA: {'V_DIMMER': cv.string, 'V_LIGHT': cv.string}}
|
||||
LIGHT_PERCENTAGE_SCHEMA = {
|
||||
PLATFORM: 'light', TYPE: 'V_PERCENTAGE',
|
||||
SCHEMA: {'V_PERCENTAGE': cv.string, 'V_STATUS': cv.string}}
|
||||
LIGHT_RGB_SCHEMA = {
|
||||
PLATFORM: 'light', TYPE: 'V_RGB', SCHEMA: {
|
||||
'V_RGB': cv.string, 'V_STATUS': cv.string}}
|
||||
LIGHT_RGBW_SCHEMA = {
|
||||
PLATFORM: 'light', TYPE: 'V_RGBW', SCHEMA: {
|
||||
'V_RGBW': cv.string, 'V_STATUS': cv.string}}
|
||||
NOTIFY_SCHEMA = {PLATFORM: 'notify', TYPE: 'V_TEXT'}
|
||||
DEVICE_TRACKER_SCHEMA = {PLATFORM: 'device_tracker', TYPE: 'V_POSITION'}
|
||||
DUST_SCHEMA = [
|
||||
{PLATFORM: 'sensor', TYPE: 'V_DUST_LEVEL'},
|
||||
{PLATFORM: 'sensor', TYPE: 'V_LEVEL'}]
|
||||
SWITCH_LIGHT_SCHEMA = {PLATFORM: 'switch', TYPE: 'V_LIGHT'}
|
||||
SWITCH_STATUS_SCHEMA = {PLATFORM: 'switch', TYPE: 'V_STATUS'}
|
||||
MYSENSORS_CONST_SCHEMA = {
|
||||
'S_DOOR': [BINARY_SENSOR_SCHEMA, {PLATFORM: 'switch', TYPE: 'V_ARMED'}],
|
||||
'S_MOTION': [BINARY_SENSOR_SCHEMA, {PLATFORM: 'switch', TYPE: 'V_ARMED'}],
|
||||
'S_SMOKE': [BINARY_SENSOR_SCHEMA, {PLATFORM: 'switch', TYPE: 'V_ARMED'}],
|
||||
'S_SPRINKLER': [
|
||||
BINARY_SENSOR_SCHEMA, {PLATFORM: 'switch', TYPE: 'V_STATUS'}],
|
||||
'S_WATER_LEAK': [
|
||||
BINARY_SENSOR_SCHEMA, {PLATFORM: 'switch', TYPE: 'V_ARMED'}],
|
||||
'S_SOUND': [
|
||||
BINARY_SENSOR_SCHEMA, {PLATFORM: 'sensor', TYPE: 'V_LEVEL'},
|
||||
{PLATFORM: 'switch', TYPE: 'V_ARMED'}],
|
||||
'S_VIBRATION': [
|
||||
BINARY_SENSOR_SCHEMA, {PLATFORM: 'sensor', TYPE: 'V_LEVEL'},
|
||||
{PLATFORM: 'switch', TYPE: 'V_ARMED'}],
|
||||
'S_MOISTURE': [
|
||||
BINARY_SENSOR_SCHEMA, {PLATFORM: 'sensor', TYPE: 'V_LEVEL'},
|
||||
{PLATFORM: 'switch', TYPE: 'V_ARMED'}],
|
||||
'S_HVAC': [CLIMATE_SCHEMA],
|
||||
'S_COVER': [
|
||||
{PLATFORM: 'cover', TYPE: 'V_DIMMER'},
|
||||
{PLATFORM: 'cover', TYPE: 'V_PERCENTAGE'},
|
||||
{PLATFORM: 'cover', TYPE: 'V_LIGHT'},
|
||||
{PLATFORM: 'cover', TYPE: 'V_STATUS'}],
|
||||
'S_DIMMER': [LIGHT_DIMMER_SCHEMA, LIGHT_PERCENTAGE_SCHEMA],
|
||||
'S_RGB_LIGHT': [LIGHT_RGB_SCHEMA],
|
||||
'S_RGBW_LIGHT': [LIGHT_RGBW_SCHEMA],
|
||||
'S_INFO': [NOTIFY_SCHEMA, {PLATFORM: 'sensor', TYPE: 'V_TEXT'}],
|
||||
'S_GPS': [
|
||||
DEVICE_TRACKER_SCHEMA, {PLATFORM: 'sensor', TYPE: 'V_POSITION'}],
|
||||
'S_TEMP': [{PLATFORM: 'sensor', TYPE: 'V_TEMP'}],
|
||||
'S_HUM': [{PLATFORM: 'sensor', TYPE: 'V_HUM'}],
|
||||
'S_BARO': [
|
||||
{PLATFORM: 'sensor', TYPE: 'V_PRESSURE'},
|
||||
{PLATFORM: 'sensor', TYPE: 'V_FORECAST'}],
|
||||
'S_WIND': [
|
||||
{PLATFORM: 'sensor', TYPE: 'V_WIND'},
|
||||
{PLATFORM: 'sensor', TYPE: 'V_GUST'},
|
||||
{PLATFORM: 'sensor', TYPE: 'V_DIRECTION'}],
|
||||
'S_RAIN': [
|
||||
{PLATFORM: 'sensor', TYPE: 'V_RAIN'},
|
||||
{PLATFORM: 'sensor', TYPE: 'V_RAINRATE'}],
|
||||
'S_UV': [{PLATFORM: 'sensor', TYPE: 'V_UV'}],
|
||||
'S_WEIGHT': [
|
||||
{PLATFORM: 'sensor', TYPE: 'V_WEIGHT'},
|
||||
{PLATFORM: 'sensor', TYPE: 'V_IMPEDANCE'}],
|
||||
'S_POWER': [
|
||||
{PLATFORM: 'sensor', TYPE: 'V_WATT'},
|
||||
{PLATFORM: 'sensor', TYPE: 'V_KWH'},
|
||||
{PLATFORM: 'sensor', TYPE: 'V_VAR'},
|
||||
{PLATFORM: 'sensor', TYPE: 'V_VA'},
|
||||
{PLATFORM: 'sensor', TYPE: 'V_POWER_FACTOR'}],
|
||||
'S_DISTANCE': [{PLATFORM: 'sensor', TYPE: 'V_DISTANCE'}],
|
||||
'S_LIGHT_LEVEL': [
|
||||
{PLATFORM: 'sensor', TYPE: 'V_LIGHT_LEVEL'},
|
||||
{PLATFORM: 'sensor', TYPE: 'V_LEVEL'}],
|
||||
'S_IR': [
|
||||
{PLATFORM: 'sensor', TYPE: 'V_IR_RECEIVE'},
|
||||
{PLATFORM: 'switch', TYPE: 'V_IR_SEND',
|
||||
SCHEMA: {'V_IR_SEND': cv.string, 'V_LIGHT': cv.string}}],
|
||||
'S_WATER': [
|
||||
{PLATFORM: 'sensor', TYPE: 'V_FLOW'},
|
||||
{PLATFORM: 'sensor', TYPE: 'V_VOLUME'}],
|
||||
'S_CUSTOM': [
|
||||
{PLATFORM: 'sensor', TYPE: 'V_VAR1'},
|
||||
{PLATFORM: 'sensor', TYPE: 'V_VAR2'},
|
||||
{PLATFORM: 'sensor', TYPE: 'V_VAR3'},
|
||||
{PLATFORM: 'sensor', TYPE: 'V_VAR4'},
|
||||
{PLATFORM: 'sensor', TYPE: 'V_VAR5'},
|
||||
{PLATFORM: 'sensor', TYPE: 'V_CUSTOM'}],
|
||||
'S_SCENE_CONTROLLER': [
|
||||
{PLATFORM: 'sensor', TYPE: 'V_SCENE_ON'},
|
||||
{PLATFORM: 'sensor', TYPE: 'V_SCENE_OFF'}],
|
||||
'S_COLOR_SENSOR': [{PLATFORM: 'sensor', TYPE: 'V_RGB'}],
|
||||
'S_MULTIMETER': [
|
||||
{PLATFORM: 'sensor', TYPE: 'V_VOLTAGE'},
|
||||
{PLATFORM: 'sensor', TYPE: 'V_CURRENT'},
|
||||
{PLATFORM: 'sensor', TYPE: 'V_IMPEDANCE'}],
|
||||
'S_GAS': [
|
||||
{PLATFORM: 'sensor', TYPE: 'V_FLOW'},
|
||||
{PLATFORM: 'sensor', TYPE: 'V_VOLUME'}],
|
||||
'S_WATER_QUALITY': [
|
||||
{PLATFORM: 'sensor', TYPE: 'V_TEMP'},
|
||||
{PLATFORM: 'sensor', TYPE: 'V_PH'},
|
||||
{PLATFORM: 'sensor', TYPE: 'V_ORP'},
|
||||
{PLATFORM: 'sensor', TYPE: 'V_EC'},
|
||||
{PLATFORM: 'switch', TYPE: 'V_STATUS'}],
|
||||
'S_AIR_QUALITY': DUST_SCHEMA,
|
||||
'S_DUST': DUST_SCHEMA,
|
||||
'S_LIGHT': [SWITCH_LIGHT_SCHEMA],
|
||||
'S_BINARY': [SWITCH_STATUS_SCHEMA],
|
||||
'S_LOCK': [{PLATFORM: 'switch', TYPE: 'V_LOCK_STATUS'}],
|
||||
BINARY_SENSOR_TYPES = {
|
||||
'S_DOOR': 'V_TRIPPED',
|
||||
'S_MOTION': 'V_TRIPPED',
|
||||
'S_SMOKE': 'V_TRIPPED',
|
||||
'S_SPRINKLER': 'V_TRIPPED',
|
||||
'S_WATER_LEAK': 'V_TRIPPED',
|
||||
'S_SOUND': 'V_TRIPPED',
|
||||
'S_VIBRATION': 'V_TRIPPED',
|
||||
'S_MOISTURE': 'V_TRIPPED',
|
||||
}
|
||||
|
||||
CLIMATE_TYPES = {
|
||||
'S_HVAC': 'V_HVAC_FLOW_STATE',
|
||||
}
|
||||
|
||||
COVER_TYPES = {
|
||||
'S_COVER': ['V_DIMMER', 'V_PERCENTAGE', 'V_LIGHT', 'V_STATUS'],
|
||||
}
|
||||
|
||||
DEVICE_TRACKER_TYPES = {
|
||||
'S_GPS': 'V_POSITION',
|
||||
}
|
||||
|
||||
LIGHT_TYPES = {
|
||||
'S_DIMMER': ['V_DIMMER', 'V_PERCENTAGE'],
|
||||
'S_RGB_LIGHT': 'V_RGB',
|
||||
'S_RGBW_LIGHT': 'V_RGBW',
|
||||
}
|
||||
|
||||
NOTIFY_TYPES = {
|
||||
'S_INFO': 'V_TEXT',
|
||||
}
|
||||
|
||||
SENSOR_TYPES = {
|
||||
'S_SOUND': 'V_LEVEL',
|
||||
'S_VIBRATION': 'V_LEVEL',
|
||||
'S_MOISTURE': 'V_LEVEL',
|
||||
'S_INFO': 'V_TEXT',
|
||||
'S_GPS': 'V_POSITION',
|
||||
'S_TEMP': 'V_TEMP',
|
||||
'S_HUM': 'V_HUM',
|
||||
'S_BARO': ['V_PRESSURE', 'V_FORECAST'],
|
||||
'S_WIND': ['V_WIND', 'V_GUST', 'V_DIRECTION'],
|
||||
'S_RAIN': ['V_RAIN', 'V_RAINRATE'],
|
||||
'S_UV': 'V_UV',
|
||||
'S_WEIGHT': ['V_WEIGHT', 'V_IMPEDANCE'],
|
||||
'S_POWER': ['V_WATT', 'V_KWH', 'V_VAR', 'V_VA', 'V_POWER_FACTOR'],
|
||||
'S_DISTANCE': 'V_DISTANCE',
|
||||
'S_LIGHT_LEVEL': ['V_LIGHT_LEVEL', 'V_LEVEL'],
|
||||
'S_IR': 'V_IR_RECEIVE',
|
||||
'S_WATER': ['V_FLOW', 'V_VOLUME'],
|
||||
'S_CUSTOM': ['V_VAR1', 'V_VAR2', 'V_VAR3', 'V_VAR4', 'V_VAR5', 'V_CUSTOM'],
|
||||
'S_SCENE_CONTROLLER': ['V_SCENE_ON', 'V_SCENE_OFF'],
|
||||
'S_COLOR_SENSOR': 'V_RGB',
|
||||
'S_MULTIMETER': ['V_VOLTAGE', 'V_CURRENT', 'V_IMPEDANCE'],
|
||||
'S_GAS': ['V_FLOW', 'V_VOLUME'],
|
||||
'S_WATER_QUALITY': ['V_TEMP', 'V_PH', 'V_ORP', 'V_EC'],
|
||||
'S_AIR_QUALITY': ['V_DUST_LEVEL', 'V_LEVEL'],
|
||||
'S_DUST': ['V_DUST_LEVEL', 'V_LEVEL'],
|
||||
}
|
||||
|
||||
SWITCH_TYPES = {
|
||||
'S_LIGHT': 'V_LIGHT',
|
||||
'S_BINARY': 'V_STATUS',
|
||||
'S_DOOR': 'V_ARMED',
|
||||
'S_MOTION': 'V_ARMED',
|
||||
'S_SMOKE': 'V_ARMED',
|
||||
'S_SPRINKLER': 'V_STATUS',
|
||||
'S_WATER_LEAK': 'V_ARMED',
|
||||
'S_SOUND': 'V_ARMED',
|
||||
'S_VIBRATION': 'V_ARMED',
|
||||
'S_MOISTURE': 'V_ARMED',
|
||||
'S_IR': 'V_IR_SEND',
|
||||
'S_LOCK': 'V_LOCK_STATUS',
|
||||
'S_WATER_QUALITY': 'V_STATUS',
|
||||
}
|
||||
|
||||
|
||||
PLATFORM_TYPES = {
|
||||
'binary_sensor': BINARY_SENSOR_TYPES,
|
||||
'climate': CLIMATE_TYPES,
|
||||
'cover': COVER_TYPES,
|
||||
'device_tracker': DEVICE_TRACKER_TYPES,
|
||||
'light': LIGHT_TYPES,
|
||||
'notify': NOTIFY_TYPES,
|
||||
'sensor': SENSOR_TYPES,
|
||||
'switch': SWITCH_TYPES,
|
||||
}
|
||||
|
||||
FLAT_PLATFORM_TYPES = {
|
||||
(platform, s_type_name): v_type_name
|
||||
for platform, platform_types in PLATFORM_TYPES.items()
|
||||
for s_type_name, v_type_name in platform_types.items()
|
||||
}
|
||||
|
||||
TYPE_TO_PLATFORMS = defaultdict(list)
|
||||
for platform, platform_types in PLATFORM_TYPES.items():
|
||||
for s_type_name in platform_types:
|
||||
TYPE_TO_PLATFORMS[s_type_name].append(platform)
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue