def test_has_at_least_one_key():
    """Test has_at_least_one_key validator."""
    schema = vol.Schema(cv.has_at_least_one_key("beer", "soda"))

    for value in (None, [], {}, {"wine": None}):
        with pytest.raises(vol.MultipleInvalid):
            schema(value)

    for value in ({"beer": None}, {"soda": None}):
        schema(value)
Esempio n. 2
0
ATTR_ENTRY_ID = "entry_id"

_LOGGER = logging.getLogger(__name__)
DOMAIN = ha.DOMAIN
SERVICE_RELOAD_CORE_CONFIG = "reload_core_config"
SERVICE_RELOAD_CONFIG_ENTRY = "reload_config_entry"
SERVICE_CHECK_CONFIG = "check_config"
SERVICE_UPDATE_ENTITY = "update_entity"
SERVICE_SET_LOCATION = "set_location"
SCHEMA_UPDATE_ENTITY = vol.Schema({ATTR_ENTITY_ID: cv.entity_ids})
SCHEMA_RELOAD_CONFIG_ENTRY = vol.All(
    vol.Schema({
        vol.Optional(ATTR_ENTRY_ID): str,
        **cv.ENTITY_SERVICE_FIELDS,
    }, ),
    cv.has_at_least_one_key(ATTR_ENTRY_ID, *cv.ENTITY_SERVICE_FIELDS),
)

SHUTDOWN_SERVICES = (SERVICE_OPENPEERPOWER_STOP, SERVICE_OPENPEERPOWER_RESTART)


async def async_setup(opp: ha.OpenPeerPower,
                      config: dict) -> bool:  # noqa: C901
    """Set up general services related to Open Peer Power."""
    async def async_handle_turn_service(service):
        """Handle calls to openpeerpower.turn_on/off."""
        referenced = await async_extract_referenced_entity_ids(opp, service)
        all_referenced = referenced.referenced | referenced.indirectly_referenced

        # Generic turn on/off method requires entity id
        if not all_referenced:
                    CONF_IS_BATTERY_LEVEL,
                    CONF_IS_HUMIDITY,
                    CONF_IS_ILLUMINANCE,
                    CONF_IS_POWER,
                    CONF_IS_PRESSURE,
                    CONF_IS_SIGNAL_STRENGTH,
                    CONF_IS_TEMPERATURE,
                    CONF_IS_TIMESTAMP,
                    CONF_IS_VALUE,
                ]
            ),
            vol.Optional(CONF_BELOW): vol.Any(vol.Coerce(float)),
            vol.Optional(CONF_ABOVE): vol.Any(vol.Coerce(float)),
        }
    ),
    cv.has_at_least_one_key(CONF_BELOW, CONF_ABOVE),
)


async def async_get_conditions(
    opp: OpenPeerPower, device_id: str
) -> List[Dict[str, str]]:
    """List device conditions."""
    conditions: List[Dict[str, str]] = []
    entity_registry = await async_get_registry(opp)
    entries = [
        entry
        for entry in async_entries_for_device(entity_registry, device_id)
        if entry.domain == DOMAIN
    ]
Esempio n. 4
0
    vol.Optional(OZW_INSTANCE, default=1):
    vol.Coerce(int),
    vol.Required(PARAMETER):
    vol.Coerce(int),
    vol.Required(VALUE):
    vol.Any(
        vol.All(
            cv.ensure_list,
            [
                vol.All(
                    {
                        vol.Exclusive(ATTR_LABEL, "bit"): cv.string,
                        vol.Exclusive(ATTR_POSITION, "bit"): vol.Coerce(int),
                        vol.Required(ATTR_VALUE): bool,
                    },
                    cv.has_at_least_one_key(ATTR_LABEL, ATTR_POSITION),
                )
            ],
        ),
        vol.Coerce(int),
        bool,
        cv.string,
    ),
})
def websocket_set_config_parameter(opp, connection, msg):
    """Set a config parameter to a node."""
    _call_util_function(opp, connection, msg, True, set_config_parameter,
                        msg[PARAMETER], msg[VALUE])


@websocket_api.websocket_command({
Esempio n. 5
0
                    ): cv.string,
                    vol.Optional(CONF_IP_PORT): cv.port,
                    vol.Optional(CONF_HUB_USERNAME): cv.string,
                    vol.Optional(CONF_HUB_PASSWORD): cv.string,
                    vol.Optional(CONF_HUB_VERSION, default=2): vol.In([1, 2]),
                    vol.Optional(CONF_OVERRIDE): vol.All(
                        cv.ensure_list_csv, [CONF_DEVICE_OVERRIDE_SCHEMA]
                    ),
                    vol.Optional(CONF_X10): vol.All(
                        cv.ensure_list_csv, [CONF_X10_SCHEMA]
                    ),
                },
                extra=vol.ALLOW_EXTRA,
                required=True,
            ),
            cv.has_at_least_one_key(CONF_PORT, CONF_HOST),
            set_default_port,
        )
    },
    extra=vol.ALLOW_EXTRA,
)


ADD_ALL_LINK_SCHEMA = vol.Schema(
    {
        vol.Required(SRV_ALL_LINK_GROUP): vol.Range(min=0, max=255),
        vol.Required(SRV_ALL_LINK_MODE): vol.In([SRV_CONTROLLER, SRV_RESPONDER]),
    }
)

Esempio n. 6
0
    vol.Optional(CONF_OFFSET, default=0):
    vol.Coerce(float),
    vol.Optional(CONF_MAX_TEMP, default=35):
    cv.positive_int,
    vol.Optional(CONF_MIN_TEMP, default=5):
    cv.positive_int,
    vol.Optional(CONF_STEP, default=0.5):
    vol.Coerce(float),
    vol.Optional(CONF_STRUCTURE, default=DEFAULT_STRUCTURE_PREFIX):
    cv.string,
    vol.Optional(CONF_TEMPERATURE_UNIT, default=DEFAULT_TEMP_UNIT):
    cv.string,
})

COVERS_SCHEMA = vol.All(
    cv.has_at_least_one_key(CALL_TYPE_COIL, CONF_REGISTER),
    BASE_COMPONENT_SCHEMA.extend({
        vol.Optional(CONF_DEVICE_CLASS):
        COVER_DEVICE_CLASSES_SCHEMA,
        vol.Optional(CONF_STATE_CLOSED, default=0):
        cv.positive_int,
        vol.Optional(CONF_STATE_CLOSING, default=3):
        cv.positive_int,
        vol.Optional(CONF_STATE_OPEN, default=1):
        cv.positive_int,
        vol.Optional(CONF_STATE_OPENING, default=2):
        cv.positive_int,
        vol.Optional(CONF_STATUS_REGISTER):
        cv.positive_int,
        vol.Optional(
            CONF_STATUS_REGISTER_TYPE,
Esempio n. 7
0
CONF_PROXY_PORT = "proxy_port"
CONF_TRV = "trv"
CONF_TRVS = "trvs"
DEFAULT_PROXY_PORT = 7878
DEFAULT_PROXY_IP = "127.0.0.1"
DOMAIN = "lightwave"
LIGHTWAVE_LINK = f"{DOMAIN}_link"
LIGHTWAVE_TRV_PROXY = f"{DOMAIN}_proxy"
LIGHTWAVE_TRV_PROXY_PORT = f"{DOMAIN}_proxy_port"

CONFIG_SCHEMA = vol.Schema(
    {
        DOMAIN:
        vol.Schema(
            vol.All(
                cv.has_at_least_one_key(CONF_LIGHTS, CONF_SWITCHES, CONF_TRV),
                {
                    vol.Required(CONF_HOST): cv.string,
                    vol.Optional(CONF_LIGHTS, default={}): {
                        cv.string: vol.Schema(
                            {vol.Required(CONF_NAME): cv.string})
                    },
                    vol.Optional(CONF_SWITCHES, default={}): {
                        cv.string: vol.Schema(
                            {vol.Required(CONF_NAME): cv.string})
                    },
                    vol.Optional(CONF_TRV, default={}): {
                        vol.Optional(CONF_PROXY_PORT,
                                     default=DEFAULT_PROXY_PORT):
                        cv.port,
                        vol.Optional(CONF_PROXY_IP, default=DEFAULT_PROXY_IP):
Esempio n. 8
0
    }
)

CONFIG_SCHEMA = vol.Schema(
    {
        DOMAIN: vol.Schema(
            {
                vol.Required(CONF_HOST): cv.string,
                vol.Required(CONF_USERNAME): cv.string,
                vol.Exclusive(CONF_API_KEY, "auth"): cv.string,
                vol.Exclusive(CONF_PASSWORD, "auth"): cv.string,
                vol.Optional(CONF_PORT, default=DEFAULT_PORT): cv.port,
                vol.Optional(CONF_URLBASE, default=DEFAULT_URLBASE): urlbase,
                vol.Optional(CONF_SSL, default=DEFAULT_SSL): cv.boolean,
            },
            cv.has_at_least_one_key("auth"),
        )
    },
    extra=vol.ALLOW_EXTRA,
)


def setup(opp, config):
    """Set up the Ombi component platform."""

    ombi = pyombi.Ombi(
        ssl=config[DOMAIN][CONF_SSL],
        host=config[DOMAIN][CONF_HOST],
        port=config[DOMAIN][CONF_PORT],
        urlbase=config[DOMAIN][CONF_URLBASE],
        username=config[DOMAIN][CONF_USERNAME],
Esempio n. 9
0
    PLATFORM_SCHEMA,
    BaseNotificationService,
)
from openpeerpower.const import CONTENT_TYPE_JSON
import openpeerpower.helpers.config_validation as cv

CONF_CONNECTION_STRING = "connection_string"
CONF_QUEUE_NAME = "queue"
CONF_TOPIC_NAME = "topic"

ATTR_ASB_MESSAGE = "message"
ATTR_ASB_TITLE = "title"
ATTR_ASB_TARGET = "target"

PLATFORM_SCHEMA = vol.All(
    cv.has_at_least_one_key(CONF_QUEUE_NAME, CONF_TOPIC_NAME),
    PLATFORM_SCHEMA.extend({
        vol.Required(CONF_CONNECTION_STRING):
        cv.string,
        vol.Exclusive(CONF_QUEUE_NAME, "output", "Can only send to a queue or a topic."):
        cv.string,
        vol.Exclusive(CONF_TOPIC_NAME, "output", "Can only send to a queue or a topic."):
        cv.string,
    }),
)

_LOGGER = logging.getLogger(__name__)


def get_service(opp, config, discovery_info=None):
    """Get the notification service."""
Esempio n. 10
0
    def async_register(self) -> None:
        """Register all our services."""
        self._opp.services.async_register(
            const.DOMAIN,
            const.SERVICE_SET_CONFIG_PARAMETER,
            self.async_set_config_parameter,
            schema=vol.Schema(
                vol.All(
                    {
                        vol.Optional(ATTR_DEVICE_ID): vol.All(
                            cv.ensure_list, [cv.string]
                        ),
                        vol.Optional(ATTR_ENTITY_ID): cv.entity_ids,
                        vol.Required(const.ATTR_CONFIG_PARAMETER): vol.Any(
                            vol.Coerce(int), cv.string
                        ),
                        vol.Optional(const.ATTR_CONFIG_PARAMETER_BITMASK): vol.Any(
                            vol.Coerce(int), BITMASK_SCHEMA
                        ),
                        vol.Required(const.ATTR_CONFIG_VALUE): vol.Any(
                            vol.Coerce(int), cv.string
                        ),
                    },
                    cv.has_at_least_one_key(ATTR_DEVICE_ID, ATTR_ENTITY_ID),
                    parameter_name_does_not_need_bitmask,
                ),
            ),
        )

        self._opp.services.async_register(
            const.DOMAIN,
            const.SERVICE_BULK_SET_PARTIAL_CONFIG_PARAMETERS,
            self.async_bulk_set_partial_config_parameters,
            schema=vol.Schema(
                vol.All(
                    {
                        vol.Optional(ATTR_DEVICE_ID): vol.All(
                            cv.ensure_list, [cv.string]
                        ),
                        vol.Optional(ATTR_ENTITY_ID): cv.entity_ids,
                        vol.Required(const.ATTR_CONFIG_PARAMETER): vol.Coerce(int),
                        vol.Required(const.ATTR_CONFIG_VALUE): vol.Any(
                            vol.Coerce(int),
                            {
                                vol.Any(
                                    vol.Coerce(int), BITMASK_SCHEMA, cv.string
                                ): vol.Any(vol.Coerce(int), cv.string)
                            },
                        ),
                    },
                    cv.has_at_least_one_key(ATTR_DEVICE_ID, ATTR_ENTITY_ID),
                ),
            ),
        )

        self._opp.services.async_register(
            const.DOMAIN,
            const.SERVICE_REFRESH_VALUE,
            self.async_poll_value,
            schema=vol.Schema(
                {
                    vol.Required(ATTR_ENTITY_ID): cv.entity_ids,
                    vol.Optional(const.ATTR_REFRESH_ALL_VALUES, default=False): bool,
                }
            ),
        )

        self._opp.services.async_register(
            const.DOMAIN,
            const.SERVICE_SET_VALUE,
            self.async_set_value,
            schema=vol.Schema(
                vol.All(
                    {
                        vol.Optional(ATTR_DEVICE_ID): vol.All(
                            cv.ensure_list, [cv.string]
                        ),
                        vol.Optional(ATTR_ENTITY_ID): cv.entity_ids,
                        vol.Required(const.ATTR_COMMAND_CLASS): vol.Coerce(int),
                        vol.Required(const.ATTR_PROPERTY): vol.Any(
                            vol.Coerce(int), str
                        ),
                        vol.Optional(const.ATTR_PROPERTY_KEY): vol.Any(
                            vol.Coerce(int), str
                        ),
                        vol.Optional(const.ATTR_ENDPOINT): vol.Coerce(int),
                        vol.Required(const.ATTR_VALUE): vol.Any(
                            bool, vol.Coerce(int), vol.Coerce(float), cv.string
                        ),
                        vol.Optional(const.ATTR_WAIT_FOR_RESULT): vol.Coerce(bool),
                    },
                    cv.has_at_least_one_key(ATTR_DEVICE_ID, ATTR_ENTITY_ID),
                ),
            ),
        )
Esempio n. 11
0
async def async_setup(opp: OpenPeerPower, config: ConfigType) -> bool:
    """Set up an input datetime."""
    component = EntityComponent(_LOGGER, DOMAIN, opp)
    id_manager = collection.IDManager()

    yaml_collection = collection.YamlCollection(
        logging.getLogger(f"{__name__}.yaml_collection"), id_manager)
    collection.sync_entity_lifecycle(opp, DOMAIN, DOMAIN, component,
                                     yaml_collection, InputDatetime.from_yaml)

    storage_collection = DateTimeStorageCollection(
        Store(opp, STORAGE_VERSION, STORAGE_KEY),
        logging.getLogger(f"{__name__}.storage_collection"),
        id_manager,
    )
    collection.sync_entity_lifecycle(opp, DOMAIN, DOMAIN, component,
                                     storage_collection, InputDatetime)

    await yaml_collection.async_load([{
        CONF_ID: id_,
        **cfg
    } for id_, cfg in config.get(DOMAIN, {}).items()])
    await storage_collection.async_load()

    collection.StorageCollectionWebsocket(storage_collection, DOMAIN, DOMAIN,
                                          CREATE_FIELDS,
                                          UPDATE_FIELDS).async_setup(opp)

    async def reload_service_handler(service_call: ServiceCall) -> None:
        """Reload yaml entities."""
        conf = await component.async_prepare_reload(skip_reset=True)
        if conf is None:
            conf = {DOMAIN: {}}
        await yaml_collection.async_load([{
            CONF_ID: id_,
            **cfg
        } for id_, cfg in conf.get(DOMAIN, {}).items()])

    openpeerpower.helpers.service.async_register_admin_service(
        opp,
        DOMAIN,
        SERVICE_RELOAD,
        reload_service_handler,
        schema=RELOAD_SERVICE_SCHEMA,
    )

    component.async_register_entity_service(
        "set_datetime",
        vol.All(
            vol.Schema(
                {
                    vol.Optional(ATTR_DATE): cv.date,
                    vol.Optional(ATTR_TIME): cv.time,
                    vol.Optional(ATTR_DATETIME): cv.datetime,
                    vol.Optional(ATTR_TIMESTAMP): vol.Coerce(float),
                },
                extra=vol.ALLOW_EXTRA,
            ),
            cv.has_at_least_one_key(ATTR_DATE, ATTR_TIME, ATTR_DATETIME,
                                    ATTR_TIMESTAMP),
            validate_set_datetime_attrs,
        ),
        "async_set_datetime",
    )

    return True
Esempio n. 12
0
    {
        DOMAIN:
        vol.Schema(
            {
                vol.Exclusive(CONF_EVENT_HUB_CON_STRING, "setup_methods"):
                cv.string,
                vol.Exclusive(CONF_EVENT_HUB_NAMESPACE, "setup_methods"):
                cv.string,
                vol.Optional(CONF_EVENT_HUB_INSTANCE_NAME): cv.string,
                vol.Optional(CONF_EVENT_HUB_SAS_POLICY): cv.string,
                vol.Optional(CONF_EVENT_HUB_SAS_KEY): cv.string,
                vol.Optional(CONF_SEND_INTERVAL, default=5): cv.positive_int,
                vol.Optional(CONF_MAX_DELAY, default=30): cv.positive_int,
                vol.Optional(CONF_FILTER, default={}): FILTER_SCHEMA,
            },
            cv.has_at_least_one_key(CONF_EVENT_HUB_CON_STRING,
                                    CONF_EVENT_HUB_NAMESPACE),
        )
    },
    extra=vol.ALLOW_EXTRA,
)


async def async_setup(opp, yaml_config):
    """Activate Azure EH component."""
    config = yaml_config[DOMAIN]
    if config.get(CONF_EVENT_HUB_CON_STRING):
        client_args = {"conn_str": config[CONF_EVENT_HUB_CON_STRING]}
        conn_str_client = True
    else:
        client_args = {
            "fully_qualified_namespace":
Esempio n. 13
0
                raise vol.Invalid(
                    f"must be a value between 0 and {self.maximum}")
        except ValueError as err:
            raise vol.Invalid("invalid time_pattern value") from err

        return value


TRIGGER_SCHEMA = vol.All(
    vol.Schema({
        vol.Required(CONF_PLATFORM): "time_pattern",
        CONF_HOURS: TimePattern(maximum=23),
        CONF_MINUTES: TimePattern(maximum=59),
        CONF_SECONDS: TimePattern(maximum=59),
    }),
    cv.has_at_least_one_key(CONF_HOURS, CONF_MINUTES, CONF_SECONDS),
)


async def async_attach_trigger(opp, config, action, automation_info):
    """Listen for state changes based on configuration."""
    trigger_id = automation_info.get("trigger_id") if automation_info else None
    hours = config.get(CONF_HOURS)
    minutes = config.get(CONF_MINUTES)
    seconds = config.get(CONF_SECONDS)
    job = OppJob(action)

    # If larger units are specified, default the smaller units to zero
    if minutes is None and hours is not None:
        minutes = 0
    if seconds is None and minutes is not None:
Esempio n. 14
0
            ],
        )
    },
    extra=vol.ALLOW_EXTRA,
)

DELETE_SMS_SCHEMA = vol.Schema(
    {
        vol.Optional(ATTR_HOST): cv.string,
        vol.Required(ATTR_SMS_ID): vol.All(cv.ensure_list, [cv.positive_int]),
    }
)

SET_OPTION_SCHEMA = vol.Schema(
    vol.All(
        cv.has_at_least_one_key(ATTR_FAILOVER, ATTR_AUTOCONNECT),
        {
            vol.Optional(ATTR_HOST): cv.string,
            vol.Optional(ATTR_FAILOVER): vol.In(FAILOVER_MODES),
            vol.Optional(ATTR_AUTOCONNECT): vol.In(AUTOCONNECT_MODES),
        },
    )
)

CONNECT_LTE_SCHEMA = vol.Schema({vol.Optional(ATTR_HOST): cv.string})

DISCONNECT_LTE_SCHEMA = vol.Schema({vol.Optional(ATTR_HOST): cv.string})


@attr.s
class ModemData:
Esempio n. 15
0
    CONF_NAME,
    CONF_RESOURCE,
    CONF_RESOURCE_TEMPLATE,
    CONF_VALUE_TEMPLATE,
)
from openpeerpower.exceptions import PlatformNotReady
import openpeerpower.helpers.config_validation as cv

from . import async_get_config_and_coordinator, create_rest_data_from_config
from .entity import RestEntity
from .schema import BINARY_SENSOR_SCHEMA, RESOURCE_SCHEMA

PLATFORM_SCHEMA = PLATFORM_SCHEMA.extend({**RESOURCE_SCHEMA, **BINARY_SENSOR_SCHEMA})

PLATFORM_SCHEMA = vol.All(
    cv.has_at_least_one_key(CONF_RESOURCE, CONF_RESOURCE_TEMPLATE), PLATFORM_SCHEMA
)


async def async_setup_platform(opp, config, async_add_entities, discovery_info=None):
    """Set up the REST binary sensor."""
    # Must update the sensor now (including fetching the rest resource) to
    # ensure it's updating its state.
    if discovery_info is not None:
        conf, coordinator, rest = await async_get_config_and_coordinator(
            opp, BINARY_SENSOR_DOMAIN, discovery_info
        )
    else:
        conf = config
        coordinator = None
        rest = create_rest_data_from_config(opp, conf)
Esempio n. 16
0
    vol.Optional(CONF_DEPARTURE):
    cv.time,
    vol.Optional(CONF_NAME, default=DEFAULT_NAME):
    cv.string,
    vol.Optional(CONF_MODE, default=TRAVEL_MODE_CAR):
    vol.In(TRAVEL_MODE),
    vol.Optional(CONF_ROUTE_MODE, default=ROUTE_MODE_FASTEST):
    vol.In(ROUTE_MODE),
    vol.Optional(CONF_TRAFFIC_MODE, default=False):
    cv.boolean,
    vol.Optional(CONF_UNIT_SYSTEM):
    vol.In(UNITS),
})

PLATFORM_SCHEMA = vol.All(
    cv.has_at_least_one_key(CONF_DESTINATION_LATITUDE,
                            CONF_DESTINATION_ENTITY_ID),
    cv.has_at_least_one_key(CONF_ORIGIN_LATITUDE, CONF_ORIGIN_ENTITY_ID),
    cv.key_value_schemas(
        CONF_MODE,
        {
            None:
            PLATFORM_SCHEMA,
            TRAVEL_MODE_BICYCLE:
            PLATFORM_SCHEMA,
            TRAVEL_MODE_CAR:
            PLATFORM_SCHEMA,
            TRAVEL_MODE_PEDESTRIAN:
            PLATFORM_SCHEMA,
            TRAVEL_MODE_PUBLIC:
            PLATFORM_SCHEMA,
            TRAVEL_MODE_TRUCK:
Esempio n. 17
0
        vol.Optional(CONF_OPTIMISTIC):
        cv.boolean,
        vol.Optional(CONF_TILT_OPTIMISTIC):
        cv.boolean,
        vol.Optional(POSITION_ACTION):
        cv.SCRIPT_SCHEMA,
        vol.Optional(TILT_ACTION):
        cv.SCRIPT_SCHEMA,
        vol.Optional(CONF_FRIENDLY_NAME):
        cv.string,
        vol.Optional(CONF_ENTITY_ID):
        cv.entity_ids,
        vol.Optional(CONF_UNIQUE_ID):
        cv.string,
    }),
    cv.has_at_least_one_key(OPEN_ACTION, POSITION_ACTION),
)

PLATFORM_SCHEMA = PLATFORM_SCHEMA.extend(
    {vol.Required(CONF_COVERS): cv.schema_with_slug_keys(COVER_SCHEMA)})


async def _async_create_entities(opp, config):
    """Create the Template cover."""
    covers = []

    for device, device_config in config[CONF_COVERS].items():
        state_template = device_config.get(CONF_VALUE_TEMPLATE)
        position_template = device_config.get(CONF_POSITION_TEMPLATE)
        tilt_template = device_config.get(CONF_TILT_TEMPLATE)
        icon_template = device_config.get(CONF_ICON_TEMPLATE)
Esempio n. 18
0
from openpeerpower.helpers import config_validation as cv, entity_platform

from .const import DOMAIN, SMARTTUB_CONTROLLER
from .entity import SmartTubSensorBase

_LOGGER = logging.getLogger(__name__)

# the desired duration, in hours, of the cycle
ATTR_DURATION = "duration"
ATTR_CYCLE_LAST_UPDATED = "cycle_last_updated"
ATTR_MODE = "mode"
# the hour of the day at which to start the cycle (0-23)
ATTR_START_HOUR = "start_hour"

SET_PRIMARY_FILTRATION_SCHEMA = vol.All(
    cv.has_at_least_one_key(ATTR_DURATION, ATTR_START_HOUR),
    cv.make_entity_service_schema(
        {
            vol.Optional(ATTR_DURATION): vol.All(int, vol.Range(min=1,
                                                                max=24)),
            vol.Optional(ATTR_START_HOUR): vol.All(int, vol.Range(min=0,
                                                                  max=23)),
        }, ),
)

SET_SECONDARY_FILTRATION_SCHEMA = {
    vol.Required(ATTR_MODE):
    vol.In({
        mode.name.lower()
        for mode in
        smarttub.SpaSecondaryFiltrationCycle.SecondaryFiltrationMode
Esempio n. 19
0
EVENT_HANGOUTS_CONVERSATIONS_RESOLVED = "hangouts_conversations_resolved"
EVENT_HANGOUTS_MESSAGE_RECEIVED = "hangouts_message_received"

CONF_CONVERSATION_ID = "id"
CONF_CONVERSATION_NAME = "name"

SERVICE_SEND_MESSAGE = "send_message"
SERVICE_UPDATE = "update"
SERVICE_RECONNECT = "reconnect"

TARGETS_SCHEMA = vol.All(
    vol.Schema({
        vol.Exclusive(CONF_CONVERSATION_ID, "id or name"): cv.string,
        vol.Exclusive(CONF_CONVERSATION_NAME, "id or name"): cv.string,
    }),
    cv.has_at_least_one_key(CONF_CONVERSATION_ID, CONF_CONVERSATION_NAME),
)
MESSAGE_SEGMENT_SCHEMA = vol.Schema({
    vol.Required("text"): cv.string,
    vol.Optional("is_bold"): cv.boolean,
    vol.Optional("is_italic"): cv.boolean,
    vol.Optional("is_strikethrough"): cv.boolean,
    vol.Optional("is_underline"): cv.boolean,
    vol.Optional("parse_str"): cv.boolean,
    vol.Optional("link_target"): cv.string,
})
MESSAGE_DATA_SCHEMA = vol.Schema({
    vol.Optional("image_file"): cv.string,
    vol.Optional("image_url"): cv.string
})
Esempio n. 20
0
    ),
)
PLATFORM_SCHEMA = cv.PLATFORM_SCHEMA.extend({
    vol.Optional(CONF_SCAN_INTERVAL):
    cv.time_period,
    vol.Optional(CONF_TRACK_NEW):
    cv.boolean,
    vol.Optional(CONF_CONSIDER_HOME, default=DEFAULT_CONSIDER_HOME):
    vol.All(cv.time_period, cv.positive_timedelta),
    vol.Optional(CONF_NEW_DEVICE_DEFAULTS, default={}):
    NEW_DEVICE_DEFAULTS_SCHEMA,
})
PLATFORM_SCHEMA_BASE = cv.PLATFORM_SCHEMA_BASE.extend(PLATFORM_SCHEMA.schema)
SERVICE_SEE_PAYLOAD_SCHEMA = vol.Schema(
    vol.All(
        cv.has_at_least_one_key(ATTR_MAC, ATTR_DEV_ID),
        {
            ATTR_MAC:
            cv.string,
            ATTR_DEV_ID:
            cv.string,
            ATTR_HOST_NAME:
            cv.string,
            ATTR_LOCATION_NAME:
            cv.string,
            ATTR_GPS:
            cv.gps,
            ATTR_GPS_ACCURACY:
            cv.positive_int,
            ATTR_BATTERY:
            cv.positive_int,
Esempio n. 21
0
        vol.Optional(CONF_VERIFY_REGISTER): cv.positive_int,
        vol.Optional(CONF_VERIFY_STATE, default=True): cv.boolean,
    }
)

COILS_SCHEMA = vol.Schema(
    {
        vol.Required(CONF_COIL): cv.positive_int,
        vol.Required(CONF_NAME): cv.string,
        vol.Required(CONF_SLAVE): cv.positive_int,
        vol.Optional(CONF_HUB, default=DEFAULT_HUB): cv.string,
    }
)

PLATFORM_SCHEMA = vol.All(
    cv.has_at_least_one_key(CONF_COILS, CONF_REGISTERS),
    PLATFORM_SCHEMA.extend(
        {
            vol.Optional(CONF_COILS): [COILS_SCHEMA],
            vol.Optional(CONF_REGISTERS): [REGISTERS_SCHEMA],
        }
    ),
)


def setup_platform(opp, config, add_entities, discovery_info=None):
    """Read configuration and create Modbus devices."""
    switches = []
    if CONF_COILS in config:
        for coil in config[CONF_COILS]:
            hub_name = coil[CONF_HUB]
Esempio n. 22
0
            vol.Schema(
                {
                    vol.Optional(ENABLED): cv.boolean,
                    vol.Optional(LEVEL): vol.All(
                        cv.string,
                        vol.Lower,
                        vol.In([log_level.value for log_level in LogLevel]),
                        lambda val: LogLevel(val),  # pylint: disable=unnecessary-lambda
                    ),
                    vol.Optional(LOG_TO_FILE): cv.boolean,
                    vol.Optional(FILENAME): cv.string,
                    vol.Optional(FORCE_CONSOLE): cv.boolean,
                }
            ),
            cv.has_at_least_one_key(
                ENABLED, FILENAME, FORCE_CONSOLE, LEVEL, LOG_TO_FILE
            ),
            filename_is_present_if_logging_to_file,
        ),
    },
)
@websocket_api.async_response
@async_get_entry
async def websocket_update_log_config(
    opp: OpenPeerPower,
    connection: ActiveConnection,
    msg: dict,
    entry: ConfigEntry,
    client: Client,
) -> None:
    """Update the driver log config."""
Esempio n. 23
0
    return config


# configuration.yaml schemas (legacy)
BINARY_SENSOR_SCHEMA_YAML = vol.All(
    vol.Schema(
        {
            vol.Exclusive(CONF_ZONE, "s_io"): ensure_zone,
            vol.Exclusive(CONF_PIN, "s_io"): ensure_pin,
            vol.Required(CONF_TYPE): DEVICE_CLASSES_SCHEMA,
            vol.Optional(CONF_NAME): cv.string,
            vol.Optional(CONF_INVERSE, default=False): cv.boolean,
        }
    ),
    cv.has_at_least_one_key(CONF_PIN, CONF_ZONE),
)

SENSOR_SCHEMA_YAML = vol.All(
    vol.Schema(
        {
            vol.Exclusive(CONF_ZONE, "s_io"): ensure_zone,
            vol.Exclusive(CONF_PIN, "s_io"): ensure_pin,
            vol.Required(CONF_TYPE): vol.All(vol.Lower, vol.In(["dht", "ds18b20"])),
            vol.Optional(CONF_NAME): cv.string,
            vol.Optional(CONF_POLL_INTERVAL, default=3): vol.All(
                vol.Coerce(int), vol.Range(min=1)
            ),
        }
    ),
    cv.has_at_least_one_key(CONF_PIN, CONF_ZONE),
Esempio n. 24
0
DEFAULT_MIN_TEMP = 7
DEFAULT_MAX_TEMP = 35
DEFAULT_MIN_HUMIDITY = 30
DEFAULT_MAX_HUMIDITY = 99

ENTITY_ID_FORMAT = DOMAIN + ".{}"
SCAN_INTERVAL = timedelta(seconds=60)

CONVERTIBLE_ATTRIBUTE = [
    ATTR_TEMPERATURE, ATTR_TARGET_TEMP_LOW, ATTR_TARGET_TEMP_HIGH
]

_LOGGER = logging.getLogger(__name__)

SET_TEMPERATURE_SCHEMA = vol.All(
    cv.has_at_least_one_key(ATTR_TEMPERATURE, ATTR_TARGET_TEMP_HIGH,
                            ATTR_TARGET_TEMP_LOW),
    make_entity_service_schema({
        vol.Exclusive(ATTR_TEMPERATURE, "temperature"):
        vol.Coerce(float),
        vol.Inclusive(ATTR_TARGET_TEMP_HIGH, "temperature"):
        vol.Coerce(float),
        vol.Inclusive(ATTR_TARGET_TEMP_LOW, "temperature"):
        vol.Coerce(float),
        vol.Optional(ATTR_HVAC_MODE):
        vol.In(HVAC_MODES),
    }),
)


async def async_setup(opp: OpenPeerPower, config: ConfigType) -> bool:
    """Set up climate entities."""
Esempio n. 25
0
)

_LOWER_STRING_LIST = vol.All(
    cv.ensure_list,
    [vol.All(cv.string, vol.Lower)],
    vol.Length(min=1, msg="List cannot be empty"),
)

_EXCL_INCL_SLUG_LIST = vol.All(
    vol.Schema(
        {
            vol.Exclusive(CONF_EXCLUDE, "incl_excl"): _SLUG_LIST,
            vol.Exclusive(CONF_INCLUDE, "incl_excl"): _SLUG_LIST,
        }
    ),
    cv.has_at_least_one_key(CONF_EXCLUDE, CONF_INCLUDE),
    _excl_incl_list_to_filter_dict,
)

_EXCL_INCL_LOWER_STRING_LIST = vol.All(
    vol.Schema(
        {
            vol.Exclusive(CONF_EXCLUDE, "incl_excl"): _LOWER_STRING_LIST,
            vol.Exclusive(CONF_INCLUDE, "incl_excl"): _LOWER_STRING_LIST,
        }
    ),
    cv.has_at_least_one_key(CONF_EXCLUDE, CONF_INCLUDE),
    _excl_incl_list_to_filter_dict,
)

_THRESHOLD = vol.All(vol.Coerce(int), vol.Range(min=1))
Esempio n. 26
0
EVENT_MATRIX_COMMAND = "matrix_command"

ATTR_IMAGES = "images"  # optional images

COMMAND_SCHEMA = vol.All(
    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]),
    }),
    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=[]):
Esempio n. 27
0
    def async_register(self):
        """Register all our services."""
        self._opp.services.async_register(
            const.DOMAIN,
            const.SERVICE_ADD_NODE,
            self.async_add_node,
            schema=vol.Schema({
                vol.Optional(const.ATTR_INSTANCE_ID, default=1):
                vol.Coerce(int),
                vol.Optional(const.ATTR_SECURE, default=False):
                vol.Coerce(bool),
            }),
        )
        self._opp.services.async_register(
            const.DOMAIN,
            const.SERVICE_REMOVE_NODE,
            self.async_remove_node,
            schema=vol.Schema({
                vol.Optional(const.ATTR_INSTANCE_ID, default=1):
                vol.Coerce(int)
            }),
        )
        self._opp.services.async_register(
            const.DOMAIN,
            const.SERVICE_CANCEL_COMMAND,
            self.async_cancel_command,
            schema=vol.Schema({
                vol.Optional(const.ATTR_INSTANCE_ID, default=1):
                vol.Coerce(int)
            }),
        )

        self._opp.services.async_register(
            const.DOMAIN,
            const.SERVICE_SET_CONFIG_PARAMETER,
            self.async_set_config_parameter,
            schema=vol.Schema({
                vol.Optional(const.ATTR_INSTANCE_ID, default=1):
                vol.Coerce(int),
                vol.Required(const.ATTR_NODE_ID):
                vol.Coerce(int),
                vol.Required(const.ATTR_CONFIG_PARAMETER):
                vol.Coerce(int),
                vol.Required(const.ATTR_CONFIG_VALUE):
                vol.Any(
                    vol.All(
                        cv.ensure_list,
                        [
                            vol.All(
                                {
                                    vol.Exclusive(ATTR_LABEL, "bit"):
                                    cv.string,
                                    vol.Exclusive(ATTR_POSITION, "bit"):
                                    vol.Coerce(int),
                                    vol.Required(ATTR_VALUE):
                                    bool,
                                },
                                cv.has_at_least_one_key(
                                    ATTR_LABEL, ATTR_POSITION),
                            )
                        ],
                    ),
                    vol.Coerce(int),
                    bool,
                    cv.string,
                ),
            }),
        )
Esempio n. 28
0
SERVICE_GET_ZWAVE_PARAMETER_SCHEMA = {
    vol.Required(CONF_PARAMETER): vol.Coerce(int)
}

SERVICE_SET_ZWAVE_PARAMETER_SCHEMA = {
    vol.Required(CONF_PARAMETER):
    vol.Coerce(int),
    vol.Required(CONF_VALUE):
    vol.Coerce(int),
    vol.Required(CONF_SIZE):
    vol.All(vol.Coerce(int), vol.In(VALID_PARAMETER_SIZES)),
}

SERVICE_SET_VARIABLE_SCHEMA = vol.All(
    cv.has_at_least_one_key(CONF_ADDRESS, CONF_TYPE, CONF_NAME),
    vol.Schema({
        vol.Exclusive(CONF_NAME, SCHEMA_GROUP):
        cv.string,
        vol.Inclusive(CONF_ADDRESS, SCHEMA_GROUP):
        vol.Coerce(int),
        vol.Inclusive(CONF_TYPE, SCHEMA_GROUP):
        vol.All(vol.Coerce(int), vol.Range(1, 2)),
        vol.Optional(CONF_INIT, default=False):
        bool,
        vol.Required(CONF_VALUE):
        vol.Coerce(int),
        vol.Optional(CONF_ISY):
        cv.string,
    }),
)
Esempio n. 29
0
            cv.ensure_list,
            [
                vol.Schema({
                    vol.Optional(CONF_ID): cv.string,
                    vol.Required(CONF_NAME): cv.string,
                    vol.Optional(CONF_ICON): cv.icon,
                    vol.Required(CONF_ENTITIES): STATES_SCHEMA,
                })
            ],
        ),
    },
    extra=vol.ALLOW_EXTRA,
)

CREATE_SCENE_SCHEMA = vol.All(
    cv.has_at_least_one_key(CONF_ENTITIES, CONF_SNAPSHOT),
    _ensure_no_intersection,
    vol.Schema({
        vol.Required(CONF_SCENE_ID): cv.slug,
        vol.Optional(CONF_ENTITIES, default={}): STATES_SCHEMA,
        vol.Optional(CONF_SNAPSHOT, default=[]): cv.entity_ids,
    }),
)

SERVICE_APPLY = "apply"
SERVICE_CREATE = "create"
SCENECONFIG = namedtuple("SceneConfig",
                         [CONF_ID, CONF_NAME, CONF_ICON, STATES])
_LOGGER = logging.getLogger(__name__)

Esempio n. 30
0
DOMAIN = "upb"

ATTR_ADDRESS = "address"
ATTR_BLINK_RATE = "blink_rate"
ATTR_BRIGHTNESS = "brightness"
ATTR_BRIGHTNESS_PCT = "brightness_pct"
ATTR_RATE = "rate"
CONF_NETWORK = "network"
EVENT_UPB_SCENE_CHANGED = "upb.scene_changed"

VALID_BRIGHTNESS = vol.All(vol.Coerce(int), vol.Clamp(min=0, max=255))
VALID_BRIGHTNESS_PCT = vol.All(vol.Coerce(float), vol.Range(min=0, max=100))
VALID_RATE = vol.All(vol.Coerce(float), vol.Clamp(min=-1, max=3600))

UPB_BRIGHTNESS_RATE_SCHEMA = vol.All(
    cv.has_at_least_one_key(ATTR_BRIGHTNESS, ATTR_BRIGHTNESS_PCT),
    cv.make_entity_service_schema(
        {
            vol.Exclusive(ATTR_BRIGHTNESS, ATTR_BRIGHTNESS): VALID_BRIGHTNESS,
            vol.Exclusive(ATTR_BRIGHTNESS_PCT, ATTR_BRIGHTNESS): VALID_BRIGHTNESS_PCT,
            vol.Optional(ATTR_RATE, default=-1): VALID_RATE,
        }
    ),
)

UPB_BLINK_RATE_SCHEMA = {
    vol.Required(ATTR_BLINK_RATE, default=0.5): vol.All(
        vol.Coerce(float), vol.Range(min=0, max=4.25)
    )
}