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:
Martin Hjelmare 2019-09-17 21:00:17 +02:00 committed by Paulus Schoutsen
parent 39edc45e4e
commit c17057de4b
2 changed files with 63 additions and 60 deletions

View File

@ -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"},
}

View File

@ -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)