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)
Пример #2
0
    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]
Пример #3
0
    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]),
})

Пример #4
0
    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(
Пример #5
0
    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,
Пример #6
0
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:
Пример #7
0
            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,
)
Пример #8
0
    "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):
Пример #9
0
    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):
Пример #10
0
    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):
Пример #11
0
_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)
Пример #12
0
    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)
Пример #13
0
    {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(
Пример #14
0
    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]):
Пример #15
0
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({
Пример #16
0
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
                })
Пример #17
0
        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,
            }],
Пример #18
0
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):
Пример #19
0
    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(
Пример #20
0
_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]"),
Пример #21
0
    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,
Пример #22
0
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,
Пример #23
0
    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]
Пример #24
0
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)),
Пример #25
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
Пример #26
0
            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.
    """
Пример #27
0
    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):
Пример #28
0
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(
Пример #29
0
            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']
Пример #30
0
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,
})
Пример #31
0
        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,
Пример #32
0
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)