def test_matches_regex(): """Test matches_regex validator.""" schema = vol.Schema(cv.matches_regex('.*uiae.*')) with pytest.raises(vol.Invalid): schema(1.0) with pytest.raises(vol.Invalid): schema(" nrtd ") test_str = "This is a test including uiae." assert(schema(test_str) == test_str)
DOMAIN: vol.Schema({ vol.Optional(CONF_API_KEY): cv.string, vol.Optional(CONF_HOST): cv.string, vol.Optional(CONF_PORT, default=DEFAULT_PORT): cv.port, }) }, extra=vol.ALLOW_EXTRA) SERVICE_DECONZ = 'configure' SERVICE_FIELD = 'field' SERVICE_ENTITY = 'entity' SERVICE_DATA = 'data' SERVICE_SCHEMA = vol.All(vol.Schema({ vol.Optional(SERVICE_ENTITY): cv.entity_id, vol.Optional(SERVICE_FIELD): cv.matches_regex('/.*'), vol.Required(SERVICE_DATA): dict, }), cv.has_at_least_one_key(SERVICE_ENTITY, SERVICE_FIELD)) SERVICE_DEVICE_REFRESH = 'device_refresh' async def async_setup(hass, config): """Load configuration for deCONZ component. Discovery has loaded the component if DOMAIN is not present in config. """ if DOMAIN in config: deconz_config = None if CONF_HOST in config[DOMAIN]: deconz_config = config[DOMAIN]
vol.Schema({ vol.Exclusive(CONF_WORD, 'trigger'): cv.string, vol.Exclusive(CONF_EXPRESSION, 'trigger'): cv.is_regex, vol.Required(CONF_NAME): cv.string, vol.Optional(CONF_ROOMS, default=[]): vol.All(cv.ensure_list, [cv.string]), }), # Make sure it's either a word or an expression command cv.has_at_least_one_key(CONF_WORD, CONF_EXPRESSION) ) CONFIG_SCHEMA = vol.Schema({ DOMAIN: vol.Schema({ vol.Required(CONF_HOMESERVER): cv.url, vol.Optional(CONF_VERIFY_SSL, default=True): cv.boolean, vol.Required(CONF_USERNAME): cv.matches_regex("@[^:]*:.*"), vol.Required(CONF_PASSWORD): cv.string, vol.Optional(CONF_ROOMS, default=[]): vol.All(cv.ensure_list, [cv.string]), vol.Optional(CONF_COMMANDS, default=[]): [COMMAND_SCHEMA] }) }, extra=vol.ALLOW_EXTRA) SERVICE_SEND_MESSAGE = 'send_message' SERVICE_SCHEMA_SEND_MESSAGE = vol.Schema({ vol.Required(ATTR_MESSAGE): cv.string, vol.Required(ATTR_TARGET): vol.All(cv.ensure_list, [cv.string]), })
if isinstance(value, (str, int)): try: parse_device_group_address(value) return value except CouldNotParseAddress: pass raise vol.Invalid( f"value '{value}' is not a valid KNX group address '<main>/<middle>/<sub>', '<main>/<sub>' " "or '<free>' (eg.'1/2/3', '9/234', '123'), nor xknx internal address 'i-<string>'." ) ga_list_validator = vol.All(cv.ensure_list, [ga_validator]) ia_validator = vol.Any( cv.matches_regex(IndividualAddress.ADDRESS_RE.pattern), vol.All(vol.Coerce(int), vol.Range(min=1, max=65535)), msg= "value does not match pattern for KNX individual address '<area>.<line>.<device>' (eg.'1.1.100')", ) def sensor_type_validator(value: Any) -> str | int: """Validate that value is parsable as sensor type.""" if isinstance(value, (str, int)) and DPTBase.parse_transcoder(value) is not None: return value raise vol.Invalid(f"value '{value}' is not a valid sensor type.") sync_state_validator = vol.Any(
CONF_TMAX, CONF_HMIN, CONF_HMAX, XIAOMI_TYPE_DICT, MMTS_DICT, SW_CLASS_DICT, CN_NAME_DICT, ) _LOGGER = logging.getLogger(__name__) # regex constants for configuration schema MAC_REGEX = "(?i)^(?:[0-9A-F]{2}[:]){5}(?:[0-9A-F]{2})$" AES128KEY_REGEX = "(?i)^[A-F0-9]{32}$" SENSOR_NAMES_LIST_SCHEMA = vol.Schema({cv.matches_regex(MAC_REGEX): cv.string}) ENCRYPTORS_LIST_SCHEMA = vol.Schema( {cv.matches_regex(MAC_REGEX): cv.matches_regex(AES128KEY_REGEX)}) PLATFORM_SCHEMA = PLATFORM_SCHEMA.extend({ vol.Optional(CONF_ROUNDING, default=DEFAULT_ROUNDING): cv.boolean, vol.Optional(CONF_DECIMALS, default=DEFAULT_DECIMALS): cv.positive_int, vol.Optional(CONF_PERIOD, default=DEFAULT_PERIOD): cv.positive_int, vol.Optional(CONF_LOG_SPIKES, default=DEFAULT_LOG_SPIKES): cv.boolean, vol.Optional(CONF_USE_MEDIAN, default=DEFAULT_USE_MEDIAN): cv.boolean,
ATTR_UPDATED = "updated" CONF_ATTRIBUTION = "Data provided by Environment Canada" CONF_STATION = "station" CONF_LOOP = "loop" CONF_PRECIP_TYPE = "precip_type" MIN_TIME_BETWEEN_UPDATES = datetime.timedelta(minutes=10) PLATFORM_SCHEMA = PLATFORM_SCHEMA.extend({ vol.Optional(CONF_LOOP, default=True): cv.boolean, vol.Optional(CONF_NAME): cv.string, vol.Optional(CONF_STATION): cv.matches_regex(r"^C[A-Z]{4}$|^[A-Z]{3}$"), vol.Inclusive(CONF_LATITUDE, "latlon"): cv.latitude, vol.Inclusive(CONF_LONGITUDE, "latlon"): cv.longitude, vol.Optional(CONF_PRECIP_TYPE): ["RAIN", "SNOW"], }) def setup_platform(hass, config, add_devices, discovery_info=None): """Set up the Environment Canada camera.""" if config.get(CONF_STATION): radar_object = ECRadar(station_id=config[CONF_STATION], precip_type=config.get(CONF_PRECIP_TYPE)) else:
vol.Optional(CONF_NAME): cv.string, vol.Optional(CONF_ACTIVATION, default=STATE_HIGH): vol.All( vol.Lower, vol.Any(STATE_HIGH, STATE_LOW) ), vol.Optional(CONF_MOMENTARY): vol.All(vol.Coerce(int), vol.Range(min=10)), vol.Optional(CONF_PAUSE): vol.All(vol.Coerce(int), vol.Range(min=10)), vol.Optional(CONF_REPEAT): vol.All(vol.Coerce(int), vol.Range(min=-1)), } ), cv.has_at_least_one_key(CONF_PIN, CONF_ZONE), ) DEVICE_SCHEMA_YAML = vol.All( vol.Schema( { vol.Required(CONF_ID): cv.matches_regex("[0-9a-f]{12}"), vol.Optional(CONF_BINARY_SENSORS): vol.All( cv.ensure_list, [BINARY_SENSOR_SCHEMA_YAML] ), vol.Optional(CONF_SENSORS): vol.All(cv.ensure_list, [SENSOR_SCHEMA_YAML]), vol.Optional(CONF_SWITCHES): vol.All(cv.ensure_list, [SWITCH_SCHEMA_YAML]), vol.Inclusive(CONF_HOST, "host_info"): cv.string, vol.Inclusive(CONF_PORT, "host_info"): cv.port, vol.Optional(CONF_BLINK, default=True): cv.boolean, vol.Optional(CONF_API_HOST, default=""): vol.Any("", cv.url), vol.Optional(CONF_DISCOVERY, default=True): cv.boolean, } ), import_device_validator, )
"telephony-class-application", ] SUPPORTED_OPTIONS = [ CONF_VOICE, CONF_GENDER, CONF_ENCODING, CONF_SPEED, CONF_PITCH, CONF_GAIN, CONF_PROFILES, ] GENDER_SCHEMA = vol.All(vol.Upper, vol.In(texttospeech.enums.SsmlVoiceGender.__members__)) VOICE_SCHEMA = cv.matches_regex(VOICE_REGEX) SCHEMA_ENCODING = vol.All(vol.Upper, vol.In(texttospeech.enums.AudioEncoding.__members__)) SPEED_SCHEMA = vol.All(vol.Coerce(float), vol.Clamp(min=MIN_SPEED, max=MAX_SPEED)) PITCH_SCHEMA = vol.All(vol.Coerce(float), vol.Clamp(min=MIN_PITCH, max=MAX_PITCH)) GAIN_SCHEMA = vol.All(vol.Coerce(float), vol.Clamp(min=MIN_GAIN, max=MAX_GAIN)) PROFILES_SCHEMA = vol.All(cv.ensure_list, [vol.In(SUPPORTED_PROFILES)]) PLATFORM_SCHEMA = PLATFORM_SCHEMA.extend({ vol.Optional(CONF_KEY_FILE): cv.string, vol.Optional(CONF_LANG, default=DEFAULT_LANG): vol.In(SUPPORTED_LANGUAGES), vol.Optional(CONF_GENDER, default=DEFAULT_GENDER):
MEASUREMENT_DICT, REPORT_UNKNOWN_LIST, SERVICE_CLEANUP_ENTRIES, ) from .bt_helpers import (BT_INTERFACES, BT_MULTI_SELECT, DEFAULT_BT_INTERFACE, reset_bluetooth) _LOGGER = logging.getLogger(__name__) CONFIG_YAML = {} UPDATE_UNLISTENER = None DEVICE_SCHEMA = vol.Schema({ vol.Optional(CONF_MAC): cv.matches_regex(MAC_REGEX), vol.Optional(CONF_NAME): cv.string, vol.Optional(CONF_DEVICE_ENCRYPTION_KEY): vol.Any(cv.matches_regex(AES128KEY24_REGEX), cv.matches_regex(AES128KEY32_REGEX)), vol.Optional(CONF_TEMPERATURE_UNIT): cv.temperature_unit, vol.Optional(CONF_DEVICE_DECIMALS, default=DEFAULT_DEVICE_DECIMALS): vol.In([DEFAULT_DEVICE_DECIMALS, 0, 1, 2, 3, 4]), vol.Optional(CONF_DEVICE_USE_MEDIAN, default=DEFAULT_DEVICE_USE_MEDIAN): vol.In([DEFAULT_DEVICE_USE_MEDIAN, True, False]), vol.Optional(CONF_DEVICE_RESTORE_STATE, default=DEFAULT_DEVICE_RESTORE_STATE): vol.In([DEFAULT_DEVICE_RESTORE_STATE, True, False]), vol.Optional(CONF_DEVICE_RESET_TIMER, default=DEFAULT_DEVICE_RESET_TIMER):
DOMAIN, ) _LOGGER = logging.getLogger(__name__) # regex constants for configuration schema MAC_REGEX = "(?i)^(?:[0-9A-F]{2}[:]){5}(?:[0-9A-F]{2})$" AES128KEY_REGEX = "(?i)^[A-F0-9]{32}$" DEVICE_SCHEMA = vol.Schema({ vol.Optional(CONF_MAC): cv.string, vol.Optional(CONF_NAME): cv.string, vol.Optional(CONF_ENCRYPTION_KEY): cv.matches_regex(AES128KEY_REGEX), vol.Optional(CONF_TEMPERATURE_UNIT): cv.temperature_unit, }) CONFIG_SCHEMA = vol.Schema( { DOMAIN: vol.Schema({ vol.Optional(CONF_ROUNDING, default=DEFAULT_ROUNDING): cv.boolean, vol.Optional(CONF_DECIMALS, default=DEFAULT_DECIMALS): cv.positive_int, vol.Optional(CONF_PERIOD, default=DEFAULT_PERIOD): cv.positive_int, vol.Optional(CONF_LOG_SPIKES, default=DEFAULT_LOG_SPIKES):
_LOGGER = logging.getLogger(__name__) # 百度 CLIENT_ID = "clientid" CLIENT_SECRET = "clientSecret" # 验证数据 PLATFORM_SCHEMA = PLATFORM_SCHEMA.extend({ vol.Required("baidu"): { vol.Required(CLIENT_ID): cv.string, vol.Required(CLIENT_SECRET): cv.string }, vol.Required("cameras"): [{ vol.Required(CONF_ENTITY_ID): cv.entity_domain("camera"), vol.Optional(CONF_SCAN_INTERVAL, default=5): vol.All(vol.Coerce(int), vol.Range(min=1)), vol.Optional("changes", default=100): vol.All(vol.Coerce(int), vol.Range(min=0)), vol.Optional("frame"): [{vol.Required("name"): cv.string, vol.Required("area"): cv.matches_regex("^([1-9][0-9]*)+(,[1-9][0-9]*){5,}$")}] }] }) async def async_setup_platform(hass, config, async_add_devices, discovery_info=None): _LOGGER.info("人体识别加载成功.....") client_id = config.get('baidu')[CLIENT_ID] client_secret = config.get('baidu')[CLIENT_SECRET] camera_entitys = config.get('cameras') # 初始化百度并获取token _baidubody = baiduBody(hass, client_id, client_secret)
PROBE_2_MIN: 'Probe 2 Min', PROBE_2_MAX: 'Probe 2 Max', } # exclude these keys from thermoworks data EXCLUDE_KEYS = [ FIRMWARE ] PLATFORM_SCHEMA = PLATFORM_SCHEMA.extend({ vol.Required(CONF_EMAIL): cv.string, vol.Required(CONF_PASSWORD): cv.string, vol.Optional(CONF_MONITORED_CONDITIONS, default=[PROBE_1, PROBE_2]): vol.All(cv.ensure_list, [vol.In(SENSOR_TYPES)]), vol.Optional(CONF_EXCLUDE, default=[]): vol.All(cv.ensure_list, [cv.matches_regex(SERIAL_REGEX)]), }) def setup_platform(hass, config, add_entities, discovery_info=None): """Set up the thermoworks sensor.""" import thermoworks_smoke from requests.exceptions import HTTPError email = config[CONF_EMAIL] password = config[CONF_PASSWORD] monitored_variables = config[CONF_MONITORED_CONDITIONS] excluded = config[CONF_EXCLUDE] try: mgr = thermoworks_smoke.initialize_app(email, password, True, excluded)
{vol.Optional(CONF_FEED_TYPE): cv.string, vol.Required(CONF_FEED_URL): cv.url} ) FEEDS_SCHEMA = vol.Schema( { vol.Optional(CONF_FEED_BLOG): FEED_SCHEMA, vol.Optional(CONF_FEED_WIKI): FEED_SCHEMA, vol.Optional(CONF_FEED_CALENDAR): FEED_SCHEMA, vol.Optional(CONF_FEED_FLICKER): FEED_SCHEMA, } ) CACHE_SCHEMA = vol.Schema( { vol.Required(CONF_CACHE_SCHEDULE): cv.matches_regex( r"(m.02|m.05|m.10|m.15|m.30|h.01|h.02|h.04|h.08|h.12|d.01)" ) } ) RADIO_SHOW_SCHEMA = vol.Schema( { vol.Required(CONF_RADIO_SHOW_NAME): cv.string, vol.Required(CONF_RADIO_SHOW_URL): cv.url, vol.Required(CONF_RADIO_SHOW_TYPE): cv.matches_regex(r"(mp3|ogg)"), vol.Required(CONF_RADIO_SHOW_START): cv.string, vol.Required(CONF_RADIO_SHOW_END): cv.string, } ) KEYMASTER_SCHEMA = vol.Schema(
CONF_HMIN, CONF_HMAX, XIAOMI_TYPE_DICT, MMTS_DICT, SW_CLASS_DICT, CN_NAME_DICT, ) _LOGGER = logging.getLogger(__name__) # regex constants for configuration schema MAC_REGEX = "(?i)^(?:[0-9A-F]{2}[:]){5}(?:[0-9A-F]{2})$" AES128KEY_REGEX = "(?i)^[A-F0-9]{32}$" ENCRYPTORS_LIST_SCHEMA = vol.Schema( {cv.matches_regex(MAC_REGEX): cv.matches_regex(AES128KEY_REGEX)}) PLATFORM_SCHEMA = PLATFORM_SCHEMA.extend({ vol.Optional(CONF_ROUNDING, default=DEFAULT_ROUNDING): cv.boolean, vol.Optional(CONF_DECIMALS, default=DEFAULT_DECIMALS): cv.positive_int, vol.Optional(CONF_PERIOD, default=DEFAULT_PERIOD): cv.positive_int, vol.Optional(CONF_LOG_SPIKES, default=DEFAULT_LOG_SPIKES): cv.boolean, vol.Optional(CONF_USE_MEDIAN, default=DEFAULT_USE_MEDIAN): cv.boolean, vol.Optional(CONF_ACTIVE_SCAN, default=DEFAULT_ACTIVE_SCAN): cv.boolean, vol.Optional(CONF_HCI_INTERFACE, default=[DEFAULT_HCI_INTERFACE]):
SERVICE_PARAM_FILENAME = "filename" SERVICE_PARAM_FORMAT = "format" SERVICE_PARAM_EXCLUDE = CONF_EXCLUDE SERVICE_PARAM_BEGINTIME = "begintimestamp" SERVCE_PARAM_ENDTIME = "endtimestamp" SERVICE_PARAM_LASTHOURS = "lasthours" EPOCH_START = "01/01/1970 00:00:00" EPOCH_END = "31/12/2037 23:59:59" SNAPTOGIF_CREATE_SCHEMA = vol.Schema({ vol.Required(SERVICE_PARAM_SOURCE): cv.isdir, vol.Required(SERVICE_PARAM_DESTINATION): cv.isdir, vol.Optional(SERVICE_PARAM_FILENAME, default="latest"): cv.matches_regex(r'^[^<>:;,.?"*|/\\]+$'), vol.Optional(SERVICE_PARAM_FORMAT, default="gif"): vol.In(["gif", "mp4"]), vol.Optional(SERVICE_PARAM_EXCLUDE, default=[]): cv.ensure_list_csv, vol.Optional(SERVICE_PARAM_BEGINTIME, default=EPOCH_START): cv.matches_regex( r"[0-3][0-9]/[0-1][0-9]/\d{4} [0-2][0-9]:[0-5][0-9]:[0-5][0-9]"), vol.Optional(SERVCE_PARAM_ENDTIME, default=EPOCH_END): cv.matches_regex( r"[0-3][0-9]/[0-1][0-9]/\d{4} [0-2][0-9]:[0-5][0-9]:[0-5][0-9]"), vol.Optional(SERVICE_PARAM_LASTHOURS, default=0.0): cv.positive_float, }) SNAPTOGIF_DEL_SCHEMA = vol.Schema({
USERCODE_TYPE_TAG = 2 CONF_USER_CODE = 'user_code' CONF_TAGS = 'tags' CONF_INDEX = 'index' CONF_ZWAVE_NODE_ID = 'zwave_node_id' CONF_OZW_LOG = 'ozw_log' DEFAULT_OZW_LOG_FILENAME = "OZW_Log.txt" ATTR_EDITABLE = 'editable' ATTR_NAME = 'name' USER_CODE_SCHEMA = vol.All( cv.string, cv.matches_regex(r'[0-9a-fA-F][0-9a-fA-F]( [0-9a-fA-F][0-9a-fA-F]){9}')) CONFIG_SCHEMA = vol.Schema( { DOMAIN: vol.Schema({ vol.Required(CONF_ZWAVE_NODE_ID): cv.positive_int, vol.Optional(CONF_OZW_LOG): cv.string, vol.Required(CONF_TAGS): vol.Schema([ vol.Schema({ vol.Required(CONF_NAME): cv.string, vol.Required(CONF_USER_CODE): USER_CODE_SCHEMA })
vol.Optional(CONF_REPEAT): vol.All(vol.Coerce(int), vol.Range(min=-1)), }), cv.has_at_least_one_key(CONF_PIN, CONF_ZONE)) # pylint: disable=no-value-for-parameter CONFIG_SCHEMA = vol.Schema( { DOMAIN: vol.Schema({ vol.Required(CONF_ACCESS_TOKEN): cv.string, vol.Optional(CONF_API_HOST): vol.Url(), vol.Required(CONF_DEVICES): [{ vol.Required(CONF_ID): cv.matches_regex("[0-9a-f]{12}"), vol.Optional(CONF_BINARY_SENSORS): vol.All(cv.ensure_list, [_BINARY_SENSOR_SCHEMA]), vol.Optional(CONF_SENSORS): vol.All(cv.ensure_list, [_SENSOR_SCHEMA]), vol.Optional(CONF_SWITCHES): vol.All(cv.ensure_list, [_SWITCH_SCHEMA]), vol.Optional(CONF_HOST): cv.string, vol.Optional(CONF_PORT): cv.port, vol.Optional(CONF_BLINK, default=True): cv.boolean, vol.Optional(CONF_DISCOVERY, default=True): cv.boolean, }],
from .renault_vehicle import RenaultVehicleProxy _LOGGER = logging.getLogger(__name__) RENAULT_SERVICES = "renault_services" SCHEMA_CHARGE_MODE = "charge_mode" SCHEMA_SCHEDULES = "schedules" SCHEMA_TEMPERATURE = "temperature" SCHEMA_VIN = "vin" SCHEMA_WHEN = "when" SERVICE_AC_CANCEL = "ac_cancel" SERVICE_AC_CANCEL_SCHEMA = vol.Schema({ vol.Required(SCHEMA_VIN): cv.matches_regex(REGEX_VIN), }) SERVICE_AC_START = "ac_start" SERVICE_AC_START_SCHEMA = vol.Schema({ vol.Required(SCHEMA_VIN): cv.matches_regex(REGEX_VIN), vol.Optional(SCHEMA_WHEN): cv.datetime, vol.Optional(SCHEMA_TEMPERATURE): cv.positive_int, }) SERVICE_CHARGE_SET_MODE = "charge_set_mode" SERVICE_CHARGE_SET_MODE_SCHEMA = vol.Schema({ vol.Required(SCHEMA_VIN): cv.matches_regex(REGEX_VIN), vol.Required(SCHEMA_CHARGE_MODE):
CONF_LOG_SPIKES, CONF_USE_MEDIAN, CONF_ACTIVE_SCAN, CONF_HCI_INTERFACE, CONF_BATT_ENTITIES, CONF_REPORT_UNKNOWN, CONF_RESTORE_STATE, CONF_ENCRYPTION_KEY, DOMAIN, MAC_REGEX, AES128KEY_REGEX, ) DEVICE_SCHEMA = vol.Schema( { vol.Optional(CONF_MAC): cv.matches_regex(MAC_REGEX), vol.Optional(CONF_NAME): cv.string, vol.Optional(CONF_ENCRYPTION_KEY): cv.matches_regex(AES128KEY_REGEX), vol.Optional(CONF_TEMPERATURE_UNIT): cv.temperature_unit, } ) DOMAIN_SCHEMA = vol.Schema( { vol.Optional(CONF_ROUNDING, default=DEFAULT_ROUNDING): cv.boolean, vol.Optional(CONF_DECIMALS, default=DEFAULT_DECIMALS): cv.positive_int, vol.Optional(CONF_PERIOD, default=DEFAULT_PERIOD): cv.positive_int, vol.Optional(CONF_LOG_SPIKES, default=DEFAULT_LOG_SPIKES): cv.boolean, vol.Optional(CONF_USE_MEDIAN, default=DEFAULT_USE_MEDIAN): cv.boolean, vol.Optional(CONF_ACTIVE_SCAN, default=DEFAULT_ACTIVE_SCAN): cv.boolean, # vol.Optional(
_LOGGER = logging.getLogger(__name__) CAMERA_SERVICE_SCHEMA = vol.Schema( {vol.Required(ATTR_ENTITY_ID): cv.comp_entity_ids}) PLATFORM_SCHEMA = PLATFORM_SCHEMA.extend({ vol.Required(CONF_PATH): cv.isdir, vol.Optional(CONF_NAME, default=CONF_DEFAULT_NAME): cv.string, vol.Optional(CONF_DELAY_TIME, default=1.0): cv.positive_float, vol.Optional(CONF_EXCLUDE, default=[]): cv.ensure_list, vol.Optional(CONF_PARAM_BEGINTIME, default=EPOCH_START): cv.matches_regex( r"[0-3][0-9]/[0-1][0-9]/\d{4} [0-2][0-9]:[0-5][0-9]:[0-5][0-9]"), vol.Optional(CONF_PARAM_ENDTIME, default=EPOCH_END): cv.matches_regex( r"[0-3][0-9]/[0-1][0-9]/\d{4} [0-2][0-9]:[0-5][0-9]:[0-5][0-9]"), vol.Optional(CONF_PARAM_LASTHOURS, default=0.0): cv.positive_float, }) CAMERA_SERVICE_IMAGE_FILELIST = CAMERA_SERVICE_SCHEMA.extend({ vol.Required(CONF_PATH): cv.isdir, vol.Optional(CONF_EXCLUDE, default=[]): cv.ensure_list, vol.Optional(CONF_PARAM_BEGINTIME, default=EPOCH_START): cv.matches_regex( r"[0-3][0-9]/[0-1][0-9]/\d{4} [0-2][0-9]:[0-5][0-9]:[0-5][0-9]"),
CONF_TMAX, CONF_HMIN, CONF_HMAX, XIAOMI_TYPE_DICT, MMTS_DICT, ) _LOGGER = logging.getLogger(__name__) # regex constants for configuration schema MAC_REGEX = "(?i)^(?:[0-9A-F]{2}[:]){5}(?:[0-9A-F]{2})$" AES128KEY_REGEX = "(?i)^[A-F0-9]{32}$" ENCRYPTORS_LIST_SCHEMA = vol.Schema( { cv.matches_regex(MAC_REGEX): cv.matches_regex(AES128KEY_REGEX) } ) PLATFORM_SCHEMA = PLATFORM_SCHEMA.extend( { vol.Optional(CONF_ROUNDING, default=DEFAULT_ROUNDING): cv.boolean, vol.Optional(CONF_DECIMALS, default=DEFAULT_DECIMALS): cv.positive_int, vol.Optional(CONF_PERIOD, default=DEFAULT_PERIOD): cv.positive_int, vol.Optional(CONF_LOG_SPIKES, default=DEFAULT_LOG_SPIKES): cv.boolean, vol.Optional(CONF_USE_MEDIAN, default=DEFAULT_USE_MEDIAN): cv.boolean, vol.Optional(CONF_ACTIVE_SCAN, default=DEFAULT_ACTIVE_SCAN): cv.boolean, vol.Optional( CONF_HCI_INTERFACE, default=[DEFAULT_HCI_INTERFACE] ): vol.All(cv.ensure_list, [cv.positive_int]), vol.Optional(CONF_BATT_ENTITIES, default=DEFAULT_BATT_ENTITIES): cv.boolean,
BT_INTERFACES = aiobs.get_bt_interface_mac([0, 1, 2, 3]) BT_HCI_INTERFACES = list(BT_INTERFACES.keys()) BT_MAC_INTERFACES = list(BT_INTERFACES.values()) try: DEFAULT_BT_INTERFACE = list(BT_INTERFACES.items())[0][1] DEFAULT_HCI_INTERFACE = list(BT_INTERFACES.items())[0][0] except IndexError: DEFAULT_BT_INTERFACE = '00:00:00:00:00:00' DEFAULT_HCI_INTERFACE = 0 BT_HCI_INTERFACES = [0] BT_MAC_INTERFACES = ['00:00:00:00:00:00'] _LOGGER.warning("No Bluetooth interface found. Make sure Bluetooth is installed on your system") DEVICE_SCHEMA = vol.Schema( { vol.Optional(CONF_MAC): cv.matches_regex(MAC_REGEX), vol.Optional(CONF_NAME): cv.string, vol.Optional(CONF_ENCRYPTION_KEY): cv.matches_regex(AES128KEY_REGEX), vol.Optional(CONF_TEMPERATURE_UNIT): cv.temperature_unit, vol.Optional( CONF_DEVICE_DECIMALS, default=DEFAULT_DEVICE_DECIMALS ): vol.In([DEFAULT_DEVICE_DECIMALS, 0, 1, 2, 3, 4]), vol.Optional( CONF_DEVICE_USE_MEDIAN, default=DEFAULT_DEVICE_USE_MEDIAN ): vol.In([DEFAULT_DEVICE_USE_MEDIAN, True, False]), vol.Optional( CONF_DEVICE_RESTORE_STATE, default=DEFAULT_DEVICE_RESTORE_STATE ): vol.In([DEFAULT_DEVICE_RESTORE_STATE, True, False]), vol.Optional( CONF_DEVICE_RESET_TIMER, default=DEFAULT_DEVICE_RESET_TIMER ): cv.positive_int,
PROBE_2_MIN: "Probe 2 Min", PROBE_2_MAX: "Probe 2 Max", } # exclude these keys from thermoworks data EXCLUDE_KEYS = [FIRMWARE] PLATFORM_SCHEMA = PLATFORM_SCHEMA.extend({ vol.Required(CONF_EMAIL): cv.string, vol.Required(CONF_PASSWORD): cv.string, vol.Optional(CONF_MONITORED_CONDITIONS, default=[PROBE_1, PROBE_2]): vol.All(cv.ensure_list, [vol.In(SENSOR_TYPES)]), vol.Optional(CONF_EXCLUDE, default=[]): vol.All(cv.ensure_list, [cv.matches_regex(SERIAL_REGEX)]), }) def setup_platform( hass: HomeAssistant, config: ConfigType, add_entities: AddEntitiesCallback, discovery_info: DiscoveryInfoType | None = None, ) -> None: """Set up the thermoworks sensor.""" email = config[CONF_EMAIL] password = config[CONF_PASSWORD] monitored_variables = config[CONF_MONITORED_CONDITIONS] excluded = config[CONF_EXCLUDE]
from pysmartblinds import Blind _LOGGER = logging.getLogger(__name__) CONF_BLINDS = 'blinds' MAC_REGEX = '^([0-9a-fA-F]{2}(:|$)){6}$' TOKEN_REGEX = '^[0-9a-fA-F]+$' ATTR_TRANSITION = 'transition' TILT_FEATURES = (SUPPORT_OPEN_TILT | SUPPORT_CLOSE_TILT | SUPPORT_STOP_TILT | SUPPORT_SET_TILT_POSITION) BLIND_SCHEMA = vol.Schema({ vol.Required(CONF_MAC): cv.matches_regex(MAC_REGEX), vol.Required(CONF_ACCESS_TOKEN): cv.matches_regex(TOKEN_REGEX), vol.Optional(CONF_FRIENDLY_NAME): cv.string, }) PLATFORM_SCHEMA = PLATFORM_SCHEMA.extend({ vol.Required(CONF_BLINDS): vol.Schema({cv.slug: BLIND_SCHEMA}), }) # SERVICE_TO_METHOD[SERVICE_SET_COVER_TILT_POSITION]['schema'] = ( # SERVICE_TO_METHOD[SERVICE_SET_COVER_TILT_POSITION]['schema'].extend({ # vol.Optional(ATTR_TRANSITION): # vol.All(vol.Coerce(float), vol.Range(min=0)),
vol.All(cv.ensure_list, [SENSOR_SCHEMA]), vol.Optional(CONF_SWITCHES): vol.All(cv.ensure_list, [SWITCH_SCHEMA]), vol.Optional(CONF_BLINK, default=True): cv.boolean, vol.Optional(CONF_API_HOST, default=""): vol.Any("", cv.url), vol.Optional(CONF_DISCOVERY, default=True): cv.boolean, }, extra=vol.REMOVE_EXTRA, ) CONFIG_ENTRY_SCHEMA = vol.Schema( { vol.Required(CONF_ID): cv.matches_regex("[0-9a-f]{12}"), vol.Required(CONF_HOST): cv.string, vol.Required(CONF_PORT): cv.port, vol.Required(CONF_MODEL): vol.Any(*KONN_PANEL_MODEL_NAMES), vol.Required(CONF_ACCESS_TOKEN): cv.matches_regex("[a-zA-Z0-9]+"), vol.Required(CONF_DEFAULT_OPTIONS): OPTIONS_SCHEMA, }, extra=vol.REMOVE_EXTRA, ) class KonnectedFlowHandler(config_entries.ConfigFlow, domain=DOMAIN): """Handle a config flow for NEW_NAME.""" VERSION = 1 CONNECTION_CLASS = config_entries.CONN_CLASS_LOCAL_PUSH
vol.Optional(CONF_HOST): cv.string, vol.Optional(CONF_PORT, default=DEFAULT_PORT): cv.port, }) }, extra=vol.ALLOW_EXTRA) SERVICE_DECONZ = 'configure' SERVICE_FIELD = 'field' SERVICE_ENTITY = 'entity' SERVICE_DATA = 'data' SERVICE_SCHEMA = vol.All( vol.Schema({ vol.Optional(SERVICE_ENTITY): cv.entity_id, vol.Optional(SERVICE_FIELD): cv.matches_regex('/.*'), vol.Required(SERVICE_DATA): dict, vol.Optional(CONF_BRIDGEID): str }), cv.has_at_least_one_key(SERVICE_ENTITY, SERVICE_FIELD)) SERVICE_DEVICE_REFRESH = 'device_refresh' SERVICE_DEVICE_REFRESCH_SCHEMA = vol.All( vol.Schema({vol.Optional(CONF_BRIDGEID): str})) async def async_setup(hass, config): """Load configuration for deCONZ component. Discovery has loaded the component if DOMAIN is not present in config. """
NEW_LIGHT, NEW_SCENE, NEW_SENSOR, ) DECONZ_SERVICES = "deconz_services" SERVICE_FIELD = "field" SERVICE_ENTITY = "entity" SERVICE_DATA = "data" SERVICE_CONFIGURE_DEVICE = "configure" SERVICE_CONFIGURE_DEVICE_SCHEMA = vol.All( vol.Schema({ vol.Optional(SERVICE_ENTITY): cv.entity_id, vol.Optional(SERVICE_FIELD): cv.matches_regex("/.*"), vol.Required(SERVICE_DATA): dict, vol.Optional(CONF_BRIDGE_ID): str, }), cv.has_at_least_one_key(SERVICE_ENTITY, SERVICE_FIELD), ) SERVICE_DEVICE_REFRESH = "device_refresh" SERVICE_REMOVE_ORPHANED_ENTRIES = "remove_orphaned_entries" SELECT_GATEWAY_SCHEMA = vol.All(vol.Schema({vol.Optional(CONF_BRIDGE_ID): str})) async def async_setup_services(hass): """Set up services for deCONZ integration.""" if hass.data.get(DECONZ_SERVICES, False):
try: BT_INTERFACES = hci_get_mac([0, 1, 2, 3]) BT_HCI_INTERFACES = list(BT_INTERFACES.keys()) BT_MAC_INTERFACES = list(BT_INTERFACES.values()) DEFAULT_BT_INTERFACE = list(BT_INTERFACES.items())[0][1] DEFAULT_HCI_INTERFACE = list(BT_INTERFACES.items())[0][0] except IndexError: DEFAULT_BT_INTERFACE = '00:00:00:00:00:00' DEFAULT_HCI_INTERFACE = 0 BT_HCI_INTERFACES = [0] BT_MAC_INTERFACES = ['00:00:00:00:00:00'] _LOGGER.warning("No Bluetooth interface found. Make sure Bluetooth is installed on your system") DEVICE_SCHEMA = vol.Schema( { vol.Optional(CONF_MAC): cv.matches_regex(MAC_REGEX), vol.Optional(CONF_NAME): cv.string, vol.Optional(CONF_ENCRYPTION_KEY): vol.Any( cv.matches_regex(AES128KEY24_REGEX), cv.matches_regex(AES128KEY32_REGEX) ), vol.Optional(CONF_TEMPERATURE_UNIT): cv.temperature_unit, vol.Optional( CONF_DEVICE_DECIMALS, default=DEFAULT_DEVICE_DECIMALS ): vol.In([DEFAULT_DEVICE_DECIMALS, 0, 1, 2, 3, 4]), vol.Optional( CONF_DEVICE_USE_MEDIAN, default=DEFAULT_DEVICE_USE_MEDIAN ): vol.In([DEFAULT_DEVICE_USE_MEDIAN, True, False]), vol.Optional( CONF_DEVICE_RESTORE_STATE, default=DEFAULT_DEVICE_RESTORE_STATE ): vol.In([DEFAULT_DEVICE_RESTORE_STATE, True, False]), vol.Optional(
vol.All(vol.Coerce(int), vol.Range(min=10)), vol.Optional(CONF_PAUSE): vol.All(vol.Coerce(int), vol.Range(min=10)), vol.Optional(CONF_REPEAT): vol.All(vol.Coerce(int), vol.Range(min=-1)), }), cv.has_at_least_one_key(CONF_PIN, CONF_ZONE) ) # pylint: disable=no-value-for-parameter CONFIG_SCHEMA = vol.Schema( { DOMAIN: vol.Schema({ vol.Required(CONF_ACCESS_TOKEN): cv.string, vol.Optional(CONF_API_HOST): vol.Url(), vol.Required(CONF_DEVICES): [{ vol.Required(CONF_ID): cv.matches_regex("[0-9a-f]{12}"), vol.Optional(CONF_BINARY_SENSORS): vol.All( cv.ensure_list, [_BINARY_SENSOR_SCHEMA]), vol.Optional(CONF_SWITCHES): vol.All( cv.ensure_list, [_SWITCH_SCHEMA]), vol.Optional(CONF_HOST): cv.string, vol.Optional(CONF_PORT): cv.port, vol.Optional(CONF_BLINK, default=True): cv.boolean, vol.Optional(CONF_DISCOVERY, default=True): cv.boolean, }], }), }, extra=vol.ALLOW_EXTRA, ) DEPENDENCIES = ['http']
FEED_SCHEMA = vol.Schema({ vol.Optional(CONF_FEED_TYPE): cv.string, vol.Required(CONF_FEED_URL): cv.url }) FEEDS_SCHEMA = vol.Schema({ vol.Optional(CONF_FEED_BLOG): FEED_SCHEMA, vol.Optional(CONF_FEED_WIKI): FEED_SCHEMA, vol.Optional(CONF_FEED_CALENDAR): FEED_SCHEMA, vol.Optional(CONF_FEED_FLICKER): FEED_SCHEMA, }) CACHE_SCHEMA = vol.Schema({ vol.Required(CONF_CACHE_SCHEDULE): cv.matches_regex( r"(m.02|m.05|m.10|m.15|m.30|h.01|h.02|h.04|h.08|h.12|d.01)") }) RADIO_SHOW_SCHEMA = vol.Schema({ vol.Required(CONF_RADIO_SHOW_NAME): cv.string, vol.Required(CONF_RADIO_SHOW_URL): cv.url, vol.Required(CONF_RADIO_SHOW_TYPE): cv.matches_regex(r"(mp3|ogg)"), vol.Required(CONF_RADIO_SHOW_START): cv.string, vol.Required(CONF_RADIO_SHOW_END): cv.string, })
vol.All(cv.ensure_list, [cv.string]), }), # Make sure it's either a word or an expression command cv.has_at_least_one_key(CONF_WORD, CONF_EXPRESSION), ) CONFIG_SCHEMA = vol.Schema( { DOMAIN: vol.Schema({ vol.Required(CONF_HOMESERVER): cv.url, vol.Optional(CONF_VERIFY_SSL, default=True): cv.boolean, vol.Required(CONF_USERNAME): cv.matches_regex("@[^:]*:.*"), vol.Required(CONF_PASSWORD): cv.string, vol.Optional(CONF_ROOMS, default=[]): vol.All(cv.ensure_list, [cv.string]), vol.Optional(CONF_COMMANDS, default=[]): [COMMAND_SCHEMA], }) }, extra=vol.ALLOW_EXTRA, ) SERVICE_SEND_MESSAGE = "send_message" SERVICE_SCHEMA_SEND_MESSAGE = vol.Schema({ vol.Required(ATTR_MESSAGE): cv.string,
from pysmartblinds import Blind _LOGGER = logging.getLogger(__name__) CONF_BLINDS = 'blinds' MAC_REGEX = '^([0-9a-fA-F]{2}(:|$)){6}$' TOKEN_REGEX = '^[0-9a-fA-F]+$' ATTR_TRANSITION = 'transition' TILT_FEATURES = (SUPPORT_OPEN_TILT | SUPPORT_CLOSE_TILT | SUPPORT_STOP_TILT | SUPPORT_SET_TILT_POSITION) BLIND_SCHEMA = vol.Schema({ vol.Required(CONF_MAC): cv.matches_regex(MAC_REGEX), vol.Required(CONF_ACCESS_TOKEN): cv.matches_regex(TOKEN_REGEX), vol.Optional(CONF_FRIENDLY_NAME): cv.string, }) PLATFORM_SCHEMA = PLATFORM_SCHEMA.extend({ vol.Required(CONF_BLINDS): vol.Schema({cv.slug: BLIND_SCHEMA}), }) def setup_platform(hass, config, add_devices, discovery_info=None): """Set up the blind.""" blinds = [] for device, device_config in config[CONF_BLINDS].items(): friendly_name = device_config.get(CONF_FRIENDLY_NAME, device)