def validate_datapoint(value): if isinstance(value, dict): return cv.Schema({ cv.Required(CONF_FROM): cv.float_, cv.Required(CONF_TO): cv.float_, })(value) value = cv.string(value) if "->" not in value: raise cv.Invalid("Datapoint mapping must contain '->'") a, b = value.split("->", 1) a, b = a.strip(), b.strip() return validate_datapoint({CONF_FROM: cv.float_(a), CONF_TO: cv.float_(b)})
def parse_latlon(value): if isinstance(value, str) and value.endswith("°"): # strip trailing degree character value = value[:-1] try: return cv.float_(value) except cv.Invalid: pass value = cv.string_strict(value) m = LAT_LON_REGEX.match(value) if m is None: raise cv.Invalid("Invalid format for latitude/longitude") sign = m.group(1) deg = m.group(2) minute = m.group(3) second = m.group(4) d = m.group(5) val = float(deg or 0) + float(minute or 0) / 60 + float(second or 0) / 3600 if sign == "-": val *= -1 if d and d in "SW": val *= -1 return val