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 UPDATE_DELAY = 0.1
BINARY_SENSOR_TYPES = { BINARY_SENSOR_TYPES = {
"S_DOOR": "V_TRIPPED", "S_DOOR": {"V_TRIPPED"},
"S_MOTION": "V_TRIPPED", "S_MOTION": {"V_TRIPPED"},
"S_SMOKE": "V_TRIPPED", "S_SMOKE": {"V_TRIPPED"},
"S_SPRINKLER": "V_TRIPPED", "S_SPRINKLER": {"V_TRIPPED"},
"S_WATER_LEAK": "V_TRIPPED", "S_WATER_LEAK": {"V_TRIPPED"},
"S_SOUND": "V_TRIPPED", "S_SOUND": {"V_TRIPPED"},
"S_VIBRATION": "V_TRIPPED", "S_VIBRATION": {"V_TRIPPED"},
"S_MOISTURE": "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 = { LIGHT_TYPES = {
"S_DIMMER": ["V_DIMMER", "V_PERCENTAGE"], "S_DIMMER": {"V_DIMMER", "V_PERCENTAGE"},
"S_RGB_LIGHT": "V_RGB", "S_RGB_LIGHT": {"V_RGB"},
"S_RGBW_LIGHT": "V_RGBW", "S_RGBW_LIGHT": {"V_RGBW"},
} }
NOTIFY_TYPES = {"S_INFO": "V_TEXT"} NOTIFY_TYPES = {"S_INFO": {"V_TEXT"}}
SENSOR_TYPES = { SENSOR_TYPES = {
"S_SOUND": "V_LEVEL", "S_SOUND": {"V_LEVEL"},
"S_VIBRATION": "V_LEVEL", "S_VIBRATION": {"V_LEVEL"},
"S_MOISTURE": "V_LEVEL", "S_MOISTURE": {"V_LEVEL"},
"S_INFO": "V_TEXT", "S_INFO": {"V_TEXT"},
"S_GPS": "V_POSITION", "S_GPS": {"V_POSITION"},
"S_TEMP": "V_TEMP", "S_TEMP": {"V_TEMP"},
"S_HUM": "V_HUM", "S_HUM": {"V_HUM"},
"S_BARO": ["V_PRESSURE", "V_FORECAST"], "S_BARO": {"V_PRESSURE", "V_FORECAST"},
"S_WIND": ["V_WIND", "V_GUST", "V_DIRECTION"], "S_WIND": {"V_WIND", "V_GUST", "V_DIRECTION"},
"S_RAIN": ["V_RAIN", "V_RAINRATE"], "S_RAIN": {"V_RAIN", "V_RAINRATE"},
"S_UV": "V_UV", "S_UV": {"V_UV"},
"S_WEIGHT": ["V_WEIGHT", "V_IMPEDANCE"], "S_WEIGHT": {"V_WEIGHT", "V_IMPEDANCE"},
"S_POWER": ["V_WATT", "V_KWH", "V_VAR", "V_VA", "V_POWER_FACTOR"], "S_POWER": {"V_WATT", "V_KWH", "V_VAR", "V_VA", "V_POWER_FACTOR"},
"S_DISTANCE": "V_DISTANCE", "S_DISTANCE": {"V_DISTANCE"},
"S_LIGHT_LEVEL": ["V_LIGHT_LEVEL", "V_LEVEL"], "S_LIGHT_LEVEL": {"V_LIGHT_LEVEL", "V_LEVEL"},
"S_IR": "V_IR_RECEIVE", "S_IR": {"V_IR_RECEIVE"},
"S_WATER": ["V_FLOW", "V_VOLUME"], "S_WATER": {"V_FLOW", "V_VOLUME"},
"S_CUSTOM": ["V_VAR1", "V_VAR2", "V_VAR3", "V_VAR4", "V_VAR5", "V_CUSTOM"], "S_CUSTOM": {"V_VAR1", "V_VAR2", "V_VAR3", "V_VAR4", "V_VAR5", "V_CUSTOM"},
"S_SCENE_CONTROLLER": ["V_SCENE_ON", "V_SCENE_OFF"], "S_SCENE_CONTROLLER": {"V_SCENE_ON", "V_SCENE_OFF"},
"S_COLOR_SENSOR": "V_RGB", "S_COLOR_SENSOR": {"V_RGB"},
"S_MULTIMETER": ["V_VOLTAGE", "V_CURRENT", "V_IMPEDANCE"], "S_MULTIMETER": {"V_VOLTAGE", "V_CURRENT", "V_IMPEDANCE"},
"S_GAS": ["V_FLOW", "V_VOLUME"], "S_GAS": {"V_FLOW", "V_VOLUME"},
"S_WATER_QUALITY": ["V_TEMP", "V_PH", "V_ORP", "V_EC"], "S_WATER_QUALITY": {"V_TEMP", "V_PH", "V_ORP", "V_EC"},
"S_AIR_QUALITY": ["V_DUST_LEVEL", "V_LEVEL"], "S_AIR_QUALITY": {"V_DUST_LEVEL", "V_LEVEL"},
"S_DUST": ["V_DUST_LEVEL", "V_LEVEL"], "S_DUST": {"V_DUST_LEVEL", "V_LEVEL"},
} }
SWITCH_TYPES = { SWITCH_TYPES = {
"S_LIGHT": "V_LIGHT", "S_LIGHT": {"V_LIGHT"},
"S_BINARY": "V_STATUS", "S_BINARY": {"V_STATUS"},
"S_DOOR": "V_ARMED", "S_DOOR": {"V_ARMED"},
"S_MOTION": "V_ARMED", "S_MOTION": {"V_ARMED"},
"S_SMOKE": "V_ARMED", "S_SMOKE": {"V_ARMED"},
"S_SPRINKLER": "V_STATUS", "S_SPRINKLER": {"V_STATUS"},
"S_WATER_LEAK": "V_ARMED", "S_WATER_LEAK": {"V_ARMED"},
"S_SOUND": "V_ARMED", "S_SOUND": {"V_ARMED"},
"S_VIBRATION": "V_ARMED", "S_VIBRATION": {"V_ARMED"},
"S_MOISTURE": "V_ARMED", "S_MOISTURE": {"V_ARMED"},
"S_IR": "V_IR_SEND", "S_IR": {"V_IR_SEND"},
"S_LOCK": "V_LOCK_STATUS", "S_LOCK": {"V_LOCK_STATUS"},
"S_WATER_QUALITY": "V_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( child_type_name = next(
(member.name for member in pres if member.value == child.type), None (member.name for member in pres if member.value == child.type), None
) )
value_types = [value_type] if value_type else [*child.values] value_types = {value_type} if value_type else {*child.values}
value_type_names = [ value_type_names = {
member.name for member in set_req if member.value in value_types member.name for member in set_req if member.value in value_types
] }
platforms = TYPE_TO_PLATFORMS.get(child_type_name, []) platforms = TYPE_TO_PLATFORMS.get(child_type_name, [])
if not platforms: if not platforms:
_LOGGER.warning("Child type %s is not supported", child.type) _LOGGER.warning("Child type %s is not supported", child.type)
return validated return validated
for platform in platforms: for platform in platforms:
v_names = FLAT_PLATFORM_TYPES[platform, child_type_name] platform_v_names = FLAT_PLATFORM_TYPES[platform, child_type_name]
if not isinstance(v_names, list): v_names = platform_v_names & value_type_names
v_names = [v_names] if not v_names:
v_names = [v_name for v_name in v_names if v_name in value_type_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: for v_name in v_names:
child_schema_gen = SCHEMAS.get((platform, v_name), default_schema) child_schema_gen = SCHEMAS.get((platform, v_name), default_schema)