def manager(): """Return a flow manager.""" handlers = Registry() entries = [] async def async_create_flow(handler_name, *, context, data): handler = handlers.get(handler_name) if handler is None: raise data_entry_flow.UnknownHandler flow = handler() flow.init_step = context.get("init_step", "init") flow.source = context.get("source") return flow async def async_add_entry(flow, result): if result["type"] == data_entry_flow.RESULT_TYPE_CREATE_ENTRY: result["source"] = flow.context.get("source") entries.append(result) return result manager = data_entry_flow.FlowManager(None, async_create_flow, async_add_entry) manager.mock_created_entries = entries manager.mock_reg_handler = handlers.register return manager
def manager(): """Return a flow manager.""" handlers = Registry() entries = [] class FlowManager(data_entry_flow.FlowManager): """Test flow manager.""" async def async_create_flow(self, handler_key, *, context, data): """Test create flow.""" handler = handlers.get(handler_key) if handler is None: raise data_entry_flow.UnknownHandler flow = handler() flow.init_step = context.get("init_step", "init") return flow async def async_finish_flow(self, flow, result): """Test finish flow.""" if result["type"] == data_entry_flow.RESULT_TYPE_CREATE_ENTRY: result["source"] = flow.context.get("source") entries.append(result) return result mgr = FlowManager(None) mgr.mock_created_entries = entries mgr.mock_reg_handler = handlers.register return mgr
def manager(): """Return a flow manager.""" handlers = Registry() entries = [] async def async_create_flow(handler_name, *, context, data): handler = handlers.get(handler_name) if handler is None: raise data_entry_flow.UnknownHandler flow = handler() flow.init_step = context.get('init_step', 'init') \ if context is not None else 'init' flow.source = context.get('source') \ if context is not None else 'user_input' return flow async def async_add_entry(flow, result): if result['type'] == data_entry_flow.RESULT_TYPE_CREATE_ENTRY: result['source'] = flow.context.get('source') \ if flow.context is not None else 'user' entries.append(result) return result manager = data_entry_flow.FlowManager(None, async_create_flow, async_add_entry) manager.mock_created_entries = entries manager.mock_reg_handler = handlers.register return manager
def __init__(self, client): """Initialize.""" self._client = client self.data = {} self.zip_code = client.zip_code self.fetchers = Registry() self.fetchers.register(TYPE_ALLERGY_FORECAST)(self._client.allergens.extended) self.fetchers.register(TYPE_ALLERGY_OUTLOOK)(self._client.allergens.outlook) self.fetchers.register(TYPE_ALLERGY_INDEX)(self._client.allergens.current) self.fetchers.register(TYPE_ASTHMA_FORECAST)(self._client.asthma.extended) self.fetchers.register(TYPE_ASTHMA_INDEX)(self._client.asthma.current) self.fetchers.register(TYPE_DISEASE_FORECAST)(self._client.disease.extended) self.fetchers.register(TYPE_DISEASE_INDEX)(self._client.disease.current)
async def test_async_handle_message(hass): handlers = Registry() # noinspection PyUnusedLocal @handlers.register('error') async def error(*args, **kwargs): raise SmartHomeError(ERR_INVALID_ACTION, '') # noinspection PyUnusedLocal @handlers.register('exception') async def exception(*args, **kwargs): raise ValueError('some handle error') # noinspection PyUnusedLocal @handlers.register('none') async def none(*args, **kwargs): return None with patch('custom_components.yandex_smart_home.smart_home.HANDLERS', handlers): assert await async_handle_message(hass, BASIC_DATA, 'missing', {}) == { 'request_id': REQ_ID, 'payload': { 'error_code': ERR_INTERNAL_ERROR } } assert await async_handle_message(hass, BASIC_DATA, 'error', {}) == { 'request_id': REQ_ID, 'payload': { 'error_code': ERR_INVALID_ACTION } } assert await async_handle_message(hass, BASIC_DATA, 'exception', {}) == { 'request_id': REQ_ID, 'payload': { 'error_code': ERR_INTERNAL_ERROR } } assert await async_handle_message(hass, BASIC_DATA, 'none', {}) == { 'request_id': REQ_ID, }
def manager(): """Return a flow manager.""" handlers = Registry() entries = [] async def async_create_flow(handler_name): handler = handlers.get(handler_name) if handler is None: raise data_entry_flow.UnknownHandler return handler() async def async_add_entry(result): entries.append(result) manager = data_entry_flow.FlowManager( None, async_create_flow, async_add_entry) manager.mock_created_entries = entries manager.mock_reg_handler = handlers.register return manager
def manager(): """Return a flow manager.""" handlers = Registry() entries = [] async def async_create_flow(handler_name, *, source, data): handler = handlers.get(handler_name) if handler is None: raise data_entry_flow.UnknownHandler return handler() async def async_add_entry(result): if (result['type'] == data_entry_flow.RESULT_TYPE_CREATE_ENTRY): entries.append(result) manager = data_entry_flow.FlowManager(None, async_create_flow, async_add_entry) manager.mock_created_entries = entries manager.mock_reg_handler = handlers.register return manager
AlexaSeekController, AlexaSpeaker, AlexaStepSpeaker, AlexaTemperatureSensor, AlexaThermostatController, AlexaTimeHoldController, AlexaToggleController, ) from .const import CONF_DISPLAY_CATEGORIES if TYPE_CHECKING: from .config import AbstractConfig _LOGGER = logging.getLogger(__name__) ENTITY_ADAPTERS: Registry[str, type[AlexaEntity]] = Registry() TRANSLATION_TABLE = dict.fromkeys(map(ord, r"}{\/|\"()[]+~!><*%"), None) class DisplayCategory: """Possible display categories for Discovery response. https://developer.amazon.com/docs/device-apis/alexa-discovery.html#display-categories """ # Describes a combination of devices set to a specific state, when the # state change must occur in a specific order. For example, a "watch # Netflix" scene might require the: 1. TV to be powered on & 2. Input set # to HDMI1. Applies to Scenes ACTIVITY_TRIGGER = "ACTIVITY_TRIGGER"
TooManyConcurrentRequestsException, TooManyRequestsException, ) from pyoverkiz.models import Device, Event, Place from homeassistant.core import HomeAssistant from homeassistant.exceptions import ConfigEntryAuthFailed from homeassistant.helpers import device_registry as dr from homeassistant.helpers.update_coordinator import DataUpdateCoordinator, UpdateFailed from homeassistant.util.decorator import Registry from .const import DOMAIN, LOGGER, UPDATE_INTERVAL EVENT_HANDLERS: Registry[str, Callable[[OverkizDataUpdateCoordinator, Event], Coroutine[Any, Any, None]]] = Registry() class OverkizDataUpdateCoordinator(DataUpdateCoordinator[dict[str, Device]]): """Class to manage fetching data from Overkiz platform.""" def __init__( self, hass: HomeAssistant, logger: logging.Logger, *, name: str, client: OverkizClient, devices: list[Device], places: Place, update_interval: timedelta | None = None, config_entry_id: str,
SIGNAL_LOCATION_UPDATE, SIGNAL_SENSOR_UPDATE, ) from .helpers import ( _decrypt_payload, empty_okay_response, error_response, registration_context, safe_registration, savable_state, webhook_response, ) _LOGGER = logging.getLogger(__name__) WEBHOOK_COMMANDS = Registry() COMBINED_CLASSES = set(BINARY_SENSOR_CLASSES + SENSOR_CLASSES) SENSOR_TYPES = [ATTR_SENSOR_TYPE_BINARY_SENSOR, ATTR_SENSOR_TYPE_SENSOR] WEBHOOK_PAYLOAD_SCHEMA = vol.Schema({ vol.Required(ATTR_WEBHOOK_TYPE): cv.string, vol.Required(ATTR_WEBHOOK_DATA, default={}): vol.Any(dict, list), vol.Optional(ATTR_WEBHOOK_ENCRYPTED, default=False): cv.boolean, vol.Optional(ATTR_WEBHOOK_ENCRYPTED_DATA): cv.string, })
cleanup_name_for_homekit, convert_to_float, format_version, validate_media_player_features, ) _LOGGER = logging.getLogger(__name__) SWITCH_TYPES = { TYPE_FAUCET: "Valve", TYPE_OUTLET: "Outlet", TYPE_SHOWER: "Valve", TYPE_SPRINKLER: "Valve", TYPE_SWITCH: "Switch", TYPE_VALVE: "Valve", } TYPES: Registry[str, type[HomeAccessory]] = Registry() def get_accessory(hass, driver, state, aid, config): # noqa: C901 """Take state and return an accessory object if supported.""" if not aid: _LOGGER.warning( 'The entity "%s" is not supported, since it ' "generates an invalid aid, please change it", state.entity_id, ) return None a_type = None name = config.get(CONF_NAME, state.name) features = state.attributes.get(ATTR_SUPPORTED_FEATURES, 0)
from homeassistant.helpers.event import async_track_state_change_event from homeassistant.helpers.reload import async_setup_reload_service from homeassistant.util.decorator import Registry import homeassistant.util.dt as dt_util from . import DOMAIN, PLATFORMS _LOGGER = logging.getLogger(__name__) FILTER_NAME_RANGE = "range" FILTER_NAME_LOWPASS = "******" FILTER_NAME_OUTLIER = "outlier" FILTER_NAME_THROTTLE = "throttle" FILTER_NAME_TIME_THROTTLE = "time_throttle" FILTER_NAME_TIME_SMA = "time_simple_moving_average" FILTERS = Registry() CONF_FILTERS = "filters" CONF_FILTER_NAME = "filter" CONF_FILTER_WINDOW_SIZE = "window_size" CONF_FILTER_PRECISION = "precision" CONF_FILTER_RADIUS = "radius" CONF_FILTER_TIME_CONSTANT = "time_constant" CONF_FILTER_LOWER_BOUND = "lower_bound" CONF_FILTER_UPPER_BOUND = "upper_bound" CONF_TIME_SMA_TYPE = "type" TIME_SMA_LAST = "last" WINDOW_SIZE_UNIT_NUMBER_EVENTS = 1 WINDOW_SIZE_UNIT_TIME = 2
MaintenanceException, NotAuthenticatedException, TooManyRequestsException, ) from pyoverkiz.models import Device, Event, Place from homeassistant.core import HomeAssistant from homeassistant.helpers import device_registry as dr from homeassistant.helpers.update_coordinator import DataUpdateCoordinator, UpdateFailed from homeassistant.util.decorator import Registry from .const import DOMAIN, UPDATE_INTERVAL _LOGGER = logging.getLogger(__name__) EVENT_HANDLERS = Registry() class OverkizDataUpdateCoordinator(DataUpdateCoordinator[dict[str, Device]]): """Class to manage fetching data from Overkiz platform.""" def __init__( self, hass: HomeAssistant, logger: logging.Logger, *, name: str, client: OverkizClient, devices: list[Device], places: Place, update_interval: timedelta | None = None,
from .const import ( ATTR_DEVICES, ATTR_GATEWAY_ID, DOMAIN, FLAT_PLATFORM_TYPES, MYSENSORS_DISCOVERY, MYSENSORS_ON_UNLOAD, TYPE_TO_PLATFORMS, DevId, GatewayId, SensorType, ValueType, ) _LOGGER = logging.getLogger(__name__) SCHEMAS = Registry() async def on_unload( hass: HomeAssistantType, entry: ConfigEntry | GatewayId, fnct: Callable ) -> None: """Register a callback to be called when entry is unloaded. This function is used by platforms to cleanup after themselves. """ if isinstance(entry, GatewayId): uniqueid = entry else: uniqueid = entry.entry_id key = MYSENSORS_ON_UNLOAD.format(uniqueid) if key not in hass.data[DOMAIN]:
from homeassistant.helpers.reload import async_setup_reload_service from homeassistant.helpers.typing import ConfigType, DiscoveryInfoType from homeassistant.util.decorator import Registry import homeassistant.util.dt as dt_util from . import DOMAIN, PLATFORMS _LOGGER = logging.getLogger(__name__) FILTER_NAME_RANGE = "range" FILTER_NAME_LOWPASS = "******" FILTER_NAME_OUTLIER = "outlier" FILTER_NAME_THROTTLE = "throttle" FILTER_NAME_TIME_THROTTLE = "time_throttle" FILTER_NAME_TIME_SMA = "time_simple_moving_average" FILTERS: Registry[str, type[Filter]] = Registry() CONF_FILTERS = "filters" CONF_FILTER_NAME = "filter" CONF_FILTER_WINDOW_SIZE = "window_size" CONF_FILTER_PRECISION = "precision" CONF_FILTER_RADIUS = "radius" CONF_FILTER_TIME_CONSTANT = "time_constant" CONF_FILTER_LOWER_BOUND = "lower_bound" CONF_FILTER_UPPER_BOUND = "upper_bound" CONF_TIME_SMA_TYPE = "type" TIME_SMA_LAST = "last" WINDOW_SIZE_UNIT_NUMBER_EVENTS = 1 WINDOW_SIZE_UNIT_TIME = 2
import async_timeout import attr from homeassistant.components.http.view import HomeAssistantView from homeassistant.core import CALLBACK_TYPE, HomeAssistant, callback from homeassistant.helpers.event import async_call_later from homeassistant.util.decorator import Registry from .const import ATTR_STREAMS, DOMAIN if TYPE_CHECKING: from av import CodecContext, Packet from . import Stream PROVIDERS: Registry[str, type[StreamOutput]] = Registry() @attr.s(slots=True) class StreamSettings: """Stream settings.""" ll_hls: bool = attr.ib() min_segment_duration: float = attr.ib() part_target_duration: float = attr.ib() hls_advance_part_limit: int = attr.ib() hls_part_timeout: float = attr.ib() @attr.s(slots=True) class Part:
import logging import types from typing import Any import voluptuous as vol from voluptuous.humanize import humanize_error from homeassistant import data_entry_flow, requirements from homeassistant.const import CONF_ID, CONF_NAME, CONF_TYPE from homeassistant.core import HomeAssistant from homeassistant.data_entry_flow import FlowResult from homeassistant.exceptions import HomeAssistantError from homeassistant.util.decorator import Registry MULTI_FACTOR_AUTH_MODULES: Registry[str, type[MultiFactorAuthModule]] = Registry() MULTI_FACTOR_AUTH_MODULE_SCHEMA = vol.Schema( { vol.Required(CONF_TYPE): str, vol.Optional(CONF_NAME): str, # Specify ID if you have two mfa auth module for same type. vol.Optional(CONF_ID): str, }, extra=vol.ALLOW_EXTRA, ) DATA_REQS = "mfa_auth_module_reqs_processed"
from .helpers import ( _decrypt_payload, _decrypt_payload_legacy, empty_okay_response, error_response, registration_context, safe_registration, supports_encryption, webhook_response, ) _LOGGER = logging.getLogger(__name__) DELAY_SAVE = 10 WEBHOOK_COMMANDS = Registry() # type: ignore[var-annotated] COMBINED_CLASSES = set(BINARY_SENSOR_CLASSES + SENSOR_CLASSES) SENSOR_TYPES = [ATTR_SENSOR_TYPE_BINARY_SENSOR, ATTR_SENSOR_TYPE_SENSOR] WEBHOOK_PAYLOAD_SCHEMA = vol.Schema( { vol.Required(ATTR_WEBHOOK_TYPE): cv.string, vol.Required(ATTR_WEBHOOK_DATA, default={}): vol.Any(dict, list), vol.Optional(ATTR_WEBHOOK_ENCRYPTED, default=False): cv.boolean, vol.Optional(ATTR_WEBHOOK_ENCRYPTED_DATA): cv.string, } ) def validate_schema(schema):
"""Pluggable auth modules for Home Assistant.""" import importlib import logging import types from typing import Any, Dict, Optional import voluptuous as vol from voluptuous.humanize import humanize_error from homeassistant import data_entry_flow, requirements from homeassistant.const import CONF_ID, CONF_NAME, CONF_TYPE from homeassistant.core import HomeAssistant from homeassistant.exceptions import HomeAssistantError from homeassistant.util.decorator import Registry MULTI_FACTOR_AUTH_MODULES = Registry() MULTI_FACTOR_AUTH_MODULE_SCHEMA = vol.Schema( { vol.Required(CONF_TYPE): str, vol.Optional(CONF_NAME): str, # Specify ID if you have two mfa auth module for same type. vol.Optional(CONF_ID): str, }, extra=vol.ALLOW_EXTRA, ) DATA_REQS = "mfa_auth_module_reqs_processed" _LOGGER = logging.getLogger(__name__)
ATTR_GATEWAY_ID, DOMAIN, FLAT_PLATFORM_TYPES, MYSENSORS_DISCOVERY, MYSENSORS_ON_UNLOAD, TYPE_TO_PLATFORMS, DevId, GatewayId, SensorType, ValueType, ) _LOGGER = logging.getLogger(__name__) SCHEMAS: Registry[ tuple[str, str], Callable[[BaseAsyncGateway, ChildSensor, ValueType], vol.Schema] ] = Registry() @callback def on_unload(hass: HomeAssistant, gateway_id: GatewayId, fnct: Callable) -> None: """Register a callback to be called when entry is unloaded. This function is used by platforms to cleanup after themselves. """ key = MYSENSORS_ON_UNLOAD.format(gateway_id) if key not in hass.data[DOMAIN]: hass.data[DOMAIN][key] = [] hass.data[DOMAIN][key].append(fnct) @callback
import asyncio from collections import deque import io from typing import Any, List from aiohttp import web import attr from homeassistant.components.http import HomeAssistantView from homeassistant.core import callback from homeassistant.helpers.event import async_call_later from homeassistant.util.decorator import Registry from .const import ATTR_STREAMS, DOMAIN PROVIDERS = Registry() @attr.s class StreamBuffer: """Represent a segment.""" segment: io.BytesIO = attr.ib() output = attr.ib() # type=av.OutputContainer vstream = attr.ib() # type=av.VideoStream astream = attr.ib(default=None) # type=Optional[av.AudioStream] @attr.s class Segment: """Represent a segment."""
"""ONVIF event parsers.""" from homeassistant.util import dt as dt_util from homeassistant.util.decorator import Registry from .models import Event PARSERS = Registry() @PARSERS.register("tns1:VideoSource/MotionAlarm") # pylint: disable=protected-access async def async_parse_motion_alarm(uid: str, msg) -> Event: """Handle parsing event message. Topic: tns1:VideoSource/MotionAlarm """ try: source = msg.Message._value_1.Source.SimpleItem[0].Value return Event( f"{uid}_{msg.Topic._value_1}_{source}", f"{source} Motion Alarm", "binary_sensor", "motion", None, msg.Message._value_1.Data.SimpleItem[0].Value == "true", ) except (AttributeError, KeyError): return None @PARSERS.register("tns1:VideoSource/ImageTooBlurry/AnalyticsService")
AlexaRangeController, AlexaSceneController, AlexaSecurityPanelController, AlexaSeekController, AlexaSpeaker, AlexaStepSpeaker, AlexaTemperatureSensor, AlexaThermostatController, AlexaTimeHoldController, AlexaToggleController, ) from .const import CONF_DESCRIPTION, CONF_DISPLAY_CATEGORIES _LOGGER = logging.getLogger(__name__) ENTITY_ADAPTERS = Registry() TRANSLATION_TABLE = dict.fromkeys(map(ord, r"}{\/|\"()[]+~!><*%"), None) class DisplayCategory: """Possible display categories for Discovery response. https://developer.amazon.com/docs/device-apis/alexa-discovery.html#display-categories """ # Describes a combination of devices set to a specific state, when the # state change must occur in a specific order. For example, a "watch # Netflix" scene might require the: 1. TV to be powered on & 2. Input set # to HDMI1. Applies to Scenes ACTIVITY_TRIGGER = "ACTIVITY_TRIGGER"
API_THERMOSTAT_MODES = { climate.STATE_HEAT: 'HEAT', climate.STATE_COOL: 'COOL', climate.STATE_AUTO: 'AUTO', climate.STATE_ECO: 'ECO', climate.STATE_IDLE: 'OFF', climate.STATE_FAN_ONLY: 'OFF', climate.STATE_DRY: 'OFF', } SMART_HOME_HTTP_ENDPOINT = '/api/alexa/smart_home' CONF_DESCRIPTION = 'description' CONF_DISPLAY_CATEGORIES = 'display_categories' HANDLERS = Registry() ENTITY_ADAPTERS = Registry() class _DisplayCategory(object): """Possible display categories for Discovery response. https://developer.amazon.com/docs/device-apis/alexa-discovery.html#display-categories """ # Describes a combination of devices set to a specific state, when the # state change must occur in a specific order. For example, a "watch # Netflix" scene might require the: 1. TV to be powered on & 2. Input set # to HDMI1. Applies to Scenes ACTIVITY_TRIGGER = "ACTIVITY_TRIGGER"
import logging import uuid import attr import voluptuous as vol from voluptuous.humanize import humanize_error from homeassistant import data_entry_flow, requirements from homeassistant.core import callback from homeassistant.const import CONF_TYPE, CONF_NAME, CONF_ID from homeassistant.util.decorator import Registry from homeassistant.util import dt as dt_util _LOGGER = logging.getLogger(__name__) AUTH_PROVIDERS = Registry() AUTH_PROVIDER_SCHEMA = vol.Schema( { vol.Required(CONF_TYPE): str, vol.Optional(CONF_NAME): str, # Specify ID if you have two auth providers for same type. vol.Optional(CONF_ID): str, }, extra=vol.ALLOW_EXTRA) ACCESS_TOKEN_EXPIRATION = timedelta(minutes=30) DATA_REQS = 'auth_reqs_processed'
from homeassistant.components import (switch, light, cover, media_player, group, fan, scene, script, climate, sensor) from homeassistant.util.unit_system import METRIC_SYSTEM from .const import (COMMAND_COLOR, COMMAND_BRIGHTNESS, COMMAND_ONOFF, COMMAND_ACTIVATESCENE, COMMAND_THERMOSTAT_TEMPERATURE_SETPOINT, COMMAND_THERMOSTAT_TEMPERATURE_SET_RANGE, COMMAND_THERMOSTAT_SET_MODE, TRAIT_ONOFF, TRAIT_BRIGHTNESS, TRAIT_COLOR_TEMP, TRAIT_RGB_COLOR, TRAIT_SCENE, TRAIT_TEMPERATURE_SETTING, TYPE_LIGHT, TYPE_SCENE, TYPE_SWITCH, TYPE_THERMOSTAT, CONF_ALIASES, CONF_ROOM_HINT, CLIMATE_SUPPORTED_MODES, CLIMATE_MODE_HEATCOOL) HANDLERS = Registry() QUERY_HANDLERS = Registry() _LOGGER = logging.getLogger(__name__) # Mapping is [actions schema, primary trait, optional features] # optional is SUPPORT_* = (trait, command) MAPPING_COMPONENT = { group.DOMAIN: [TYPE_SWITCH, TRAIT_ONOFF, None], scene.DOMAIN: [TYPE_SCENE, TRAIT_SCENE, None], script.DOMAIN: [TYPE_SCENE, TRAIT_SCENE, None], switch.DOMAIN: [TYPE_SWITCH, TRAIT_ONOFF, None], fan.DOMAIN: [TYPE_SWITCH, TRAIT_ONOFF, None], light.DOMAIN: [ TYPE_LIGHT, TRAIT_ONOFF, { light.SUPPORT_BRIGHTNESS: TRAIT_BRIGHTNESS, light.SUPPORT_RGB_COLOR: TRAIT_RGB_COLOR,
SOURCE_IMPORT = "import" SOURCE_SSDP = "ssdp" SOURCE_USER = "******" SOURCE_ZEROCONF = "zeroconf" # If a user wants to hide a discovery from the UI they can "Ignore" it. The config_entries/ignore_flow # websocket command creates a config entry with this source and while it exists normal discoveries # with the same unique id are ignored. SOURCE_IGNORE = "ignore" # This is used when a user uses the "Stop Ignoring" button in the UI (the # config_entries/ignore_flow websocket command). It's triggered after the "ignore" config entry has # been removed and unloaded. SOURCE_UNIGNORE = "unignore" HANDLERS = Registry() STORAGE_KEY = "core.config_entries" STORAGE_VERSION = 1 # Deprecated since 0.73 PATH_CONFIG = ".config_entries.json" SAVE_DELAY = 1 # The config entry has been set up successfully ENTRY_STATE_LOADED = "loaded" # There was an error while trying to set up this config entry ENTRY_STATE_SETUP_ERROR = "setup_error" # There was an error while trying to migrate the config entry to a new version ENTRY_STATE_MIGRATION_ERROR = "migration_error"
from homeassistant.util.decorator import Registry from .const import ( ERR_DEVICE_OFFLINE, ERR_PROTOCOL_ERROR, ERR_UNKNOWN_ERROR, EVENT_COMMAND_RECEIVED, EVENT_QUERY_RECEIVED, EVENT_SYNC_RECEIVED, ) from .error import SmartHomeError from .helpers import GoogleEntity, RequestData, async_get_entities EXECUTE_LIMIT = 2 # Wait 2 seconds for execute to finish HANDLERS = Registry() # type: ignore[var-annotated] _LOGGER = logging.getLogger(__name__) async def async_handle_message(hass, config, user_id, message, source): """Handle incoming API messages.""" data = RequestData(config, user_id, source, message["requestId"], message.get("devices")) response = await _process(hass, data, message) if response and "errorCode" in response["payload"]: _LOGGER.error("Error handling message %s: %s", message, response["payload"]) return response
from homeassistant.components.cover import SUPPORT_SET_POSITION from homeassistant.const import (ATTR_CODE, ATTR_SUPPORTED_FEATURES, ATTR_UNIT_OF_MEASUREMENT, CONF_PORT, TEMP_CELSIUS, TEMP_FAHRENHEIT, EVENT_HOMEASSISTANT_START, EVENT_HOMEASSISTANT_STOP) import homeassistant.helpers.config_validation as cv from homeassistant.helpers.entityfilter import FILTER_SCHEMA from homeassistant.util import get_local_ip from homeassistant.util.decorator import Registry from .const import (DOMAIN, HOMEKIT_FILE, CONF_AUTO_START, CONF_ENTITY_CONFIG, CONF_FILTER, DEFAULT_PORT, DEFAULT_AUTO_START, SERVICE_HOMEKIT_START) from .util import (validate_entity_config, show_setup_message) TYPES = Registry() _LOGGER = logging.getLogger(__name__) REQUIREMENTS = ['HAP-python==1.1.8'] CONFIG_SCHEMA = vol.Schema( { DOMAIN: vol.All({ vol.Optional(CONF_PORT, default=DEFAULT_PORT): cv.port, vol.Optional(CONF_AUTO_START, default=DEFAULT_AUTO_START): cv.boolean, vol.Optional(CONF_FILTER, default={}): FILTER_SCHEMA, vol.Optional(CONF_ENTITY_CONFIG, default={}):
"""ONVIF event parsers.""" from __future__ import annotations from collections.abc import Callable, Coroutine import datetime from typing import Any from homeassistant.helpers.entity import EntityCategory from homeassistant.util import dt as dt_util from homeassistant.util.decorator import Registry from .models import Event PARSERS: Registry[str, Callable[[str, Any], Coroutine[Any, Any, Event]]] = Registry() def local_datetime_or_none(value: str) -> datetime.datetime | None: """Convert strings to datetimes, if invalid, return None.""" # To handle cameras that return times like '0000-00-00T00:00:00Z' (e.g. hikvision) try: ret = dt_util.parse_datetime(value) except ValueError: return None if ret is not None: return dt_util.as_local(ret) return None @PARSERS.register("tns1:VideoSource/MotionAlarm") # pylint: disable=protected-access