mirror of
https://github.com/home-assistant/core.git
synced 2025-07-21 20:27:08 +00:00
Fix mysensors validation for composite entities (#26666)
* Composite entities require multiple value types to be present in child values to function. Any of those value types should trigger an entity update if updated. * Always write platform v names as sets. * Run black.
This commit is contained in:
parent
39edc45e4e
commit
c17057de4b
@ -26,72 +26,72 @@ TYPE = "type"
|
||||
UPDATE_DELAY = 0.1
|
||||
|
||||
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",
|
||||
"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"}
|
||||
CLIMATE_TYPES = {"S_HVAC": {"V_HVAC_FLOW_STATE"}}
|
||||
|
||||
COVER_TYPES = {"S_COVER": ["V_DIMMER", "V_PERCENTAGE", "V_LIGHT", "V_STATUS"]}
|
||||
COVER_TYPES = {"S_COVER": {"V_DIMMER", "V_PERCENTAGE", "V_LIGHT", "V_STATUS"}}
|
||||
|
||||
DEVICE_TRACKER_TYPES = {"S_GPS": "V_POSITION"}
|
||||
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",
|
||||
"S_DIMMER": {"V_DIMMER", "V_PERCENTAGE"},
|
||||
"S_RGB_LIGHT": {"V_RGB"},
|
||||
"S_RGBW_LIGHT": {"V_RGBW"},
|
||||
}
|
||||
|
||||
NOTIFY_TYPES = {"S_INFO": "V_TEXT"}
|
||||
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"],
|
||||
"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",
|
||||
"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"},
|
||||
}
|
||||
|
||||
|
||||
|
@ -121,20 +121,23 @@ def validate_child(gateway, node_id, child, value_type=None):
|
||||
child_type_name = next(
|
||||
(member.name for member in pres if member.value == child.type), None
|
||||
)
|
||||
value_types = [value_type] if value_type else [*child.values]
|
||||
value_type_names = [
|
||||
value_types = {value_type} if value_type else {*child.values}
|
||||
value_type_names = {
|
||||
member.name for member in set_req if member.value in value_types
|
||||
]
|
||||
}
|
||||
platforms = TYPE_TO_PLATFORMS.get(child_type_name, [])
|
||||
if not platforms:
|
||||
_LOGGER.warning("Child type %s is not supported", child.type)
|
||||
return validated
|
||||
|
||||
for platform in platforms:
|
||||
v_names = FLAT_PLATFORM_TYPES[platform, child_type_name]
|
||||
if not isinstance(v_names, list):
|
||||
v_names = [v_names]
|
||||
v_names = [v_name for v_name in v_names if v_name in value_type_names]
|
||||
platform_v_names = FLAT_PLATFORM_TYPES[platform, child_type_name]
|
||||
v_names = platform_v_names & value_type_names
|
||||
if not v_names:
|
||||
child_value_names = {
|
||||
member.name for member in set_req if member.value in child.values
|
||||
}
|
||||
v_names = platform_v_names & child_value_names
|
||||
|
||||
for v_name in v_names:
|
||||
child_schema_gen = SCHEMAS.get((platform, v_name), default_schema)
|
||||
|
Loading…
x
Reference in New Issue
Block a user