def test_key_dependency(): """Test key_dependency validator.""" schema = vol.Schema(cv.key_dependency('beer', 'soda')) for value in ({'beer': None}): with pytest.raises(vol.MultipleInvalid): schema(value) for value in ({'beer': None, 'soda': None}, {'soda': None}, {}): schema(value)
def test_key_dependency(): """Test key_dependency validator.""" schema = vol.Schema(cv.key_dependency("beer", "soda")) options = {"beer": None} for value in options: with pytest.raises(vol.MultipleInvalid): schema(value) options = ({"beer": None, "soda": None}, {"soda": None}, {}) for value in options: schema(value)
def test_key_dependency(): """Test key_dependency validator.""" schema = vol.Schema(cv.key_dependency('beer', 'soda')) for value in ( {'beer': None} ): with pytest.raises(vol.MultipleInvalid): schema(value) for value in ( {'beer': None, 'soda': None}, {'soda': None}, {} ): schema(value)
CONF_FROM = "from" CONF_TO = "to" CONF_STATE = "state" CONF_FOR = "for" TRIGGER_SCHEMA = vol.All( vol.Schema({ vol.Required(CONF_PLATFORM): 'state', vol.Required(CONF_ENTITY_ID): cv.entity_ids, # These are str on purpose. Want to catch YAML conversions CONF_FROM: str, CONF_TO: str, CONF_STATE: str, CONF_FOR: vol.All(cv.time_period, cv.positive_timedelta), }), vol.Any(cv.key_dependency(CONF_FOR, CONF_TO), cv.key_dependency(CONF_FOR, CONF_STATE))) def trigger(hass, config, action): """Listen for state changes based on configuration.""" entity_id = config.get(CONF_ENTITY_ID) from_state = config.get(CONF_FROM, MATCH_ALL) to_state = config.get(CONF_TO) or config.get(CONF_STATE) or MATCH_ALL time_delta = config.get(CONF_FOR) remove_state_for_cancel = None remove_state_for_listener = None def state_automation_listener(entity, from_s, to_s): """Listen for state changes and calls action.""" nonlocal remove_state_for_cancel, remove_state_for_listener
TRIGGER_SCHEMA = vol.All( vol.Schema({ vol.Required(CONF_PLATFORM): 'state', vol.Required(CONF_ENTITY_ID): cv.entity_ids, # These are str on purpose. Want to catch YAML conversions vol.Optional(CONF_FROM): str, vol.Optional(CONF_TO): str, vol.Optional(CONF_FOR): vol.All(cv.time_period, cv.positive_timedelta), }), cv.key_dependency(CONF_FOR, CONF_TO)) async def async_trigger(hass, config, action, automation_info): """Listen for state changes based on configuration.""" entity_id = config.get(CONF_ENTITY_ID) from_state = config.get(CONF_FROM, MATCH_ALL) to_state = config.get(CONF_TO, MATCH_ALL) time_delta = config.get(CONF_FOR) match_all = (from_state == MATCH_ALL and to_state == MATCH_ALL) unsub_track_same = {} @callback def state_automation_listener(entity, from_s, to_s): """Listen for state changes and calls action.""" @callback
from homeassistant.helpers.event import ( async_track_state_change, async_track_same_state) import homeassistant.helpers.config_validation as cv CONF_ENTITY_ID = 'entity_id' CONF_FROM = 'from' CONF_TO = 'to' TRIGGER_SCHEMA = vol.All(vol.Schema({ vol.Required(CONF_PLATFORM): 'state', vol.Required(CONF_ENTITY_ID): cv.entity_ids, # These are str on purpose. Want to catch YAML conversions vol.Optional(CONF_FROM): str, vol.Optional(CONF_TO): str, vol.Optional(CONF_FOR): vol.All(cv.time_period, cv.positive_timedelta), }), cv.key_dependency(CONF_FOR, CONF_TO)) async def async_trigger(hass, config, action): """Listen for state changes based on configuration.""" entity_id = config.get(CONF_ENTITY_ID) from_state = config.get(CONF_FROM, MATCH_ALL) to_state = config.get(CONF_TO, MATCH_ALL) time_delta = config.get(CONF_FOR) match_all = (from_state == MATCH_ALL and to_state == MATCH_ALL) unsub_track_same = {} @callback def state_automation_listener(entity, from_s, to_s): """Listen for state changes and calls action.""" @callback
CONF_STATE = "state" CONF_FOR = "for" TRIGGER_SCHEMA = vol.All( vol.Schema( { vol.Required(CONF_PLATFORM): "state", vol.Required(CONF_ENTITY_ID): cv.entity_ids, # These are str on purpose. Want to catch YAML conversions CONF_FROM: str, CONF_TO: str, CONF_STATE: str, CONF_FOR: vol.All(cv.time_period, cv.positive_timedelta), } ), vol.Any(cv.key_dependency(CONF_FOR, CONF_TO), cv.key_dependency(CONF_FOR, CONF_STATE)), ) def trigger(hass, config, action): """Listen for state changes based on configuration.""" entity_id = config.get(CONF_ENTITY_ID) from_state = config.get(CONF_FROM, MATCH_ALL) to_state = config.get(CONF_TO) or config.get(CONF_STATE) or MATCH_ALL time_delta = config.get(CONF_FOR) remove_state_for_cancel = None remove_state_for_listener = None def state_automation_listener(entity, from_s, to_s): """Listen for state changes and calls action.""" nonlocal remove_state_for_cancel, remove_state_for_listener
PLATFORM_SCHEMA = vol.All( PLATFORM_SCHEMA.extend({ vol.Optional(CONF_NAME, default=DEFAULT_NAME): cv.string, vol.Exclusive(CONF_API_KEY, 'source'): cv.string, vol.Optional(CONF_QUERY): cv.string, vol.Optional(CONF_SCAN_INTERVAL, default=DEFAULT_SCAN_INTERVAL): vol.All(cv.time_period, vol.Range(min=MIN_SCAN_INTERVAL)), vol.Exclusive(CONF_ENTITY_ID, 'source'): cv.entity_id, }), cv.has_at_least_one_key(CONF_API_KEY, CONF_ENTITY_ID), cv.key_dependency(CONF_API_KEY, CONF_QUERY), ) _WU_API_URL = 'http://api.wunderground.com/api/'\ '{api_key}/{features}/q/{query}.json' _20_MIN = dt.timedelta(minutes=20) _40_MIN = dt.timedelta(minutes=40) async def _async_get_wu_data(hass, session, api_key, features, query): try: with async_timeout.timeout(9, loop=hass.loop): resp = await session.get( _WU_API_URL.format(api_key=api_key, features='/'.join(features),
"""Handle a render template webhook.""" resp = {} for key, item in data.items(): try: tpl = template.Template(item[ATTR_TEMPLATE], hass) resp[key] = tpl.async_render(item.get(ATTR_TEMPLATE_VARIABLES)) except template.TemplateError as ex: resp[key] = {"error": str(ex)} return webhook_response(resp, registration=config_entry.data) @WEBHOOK_COMMANDS.register("update_location") @validate_schema( vol.Schema( cv.key_dependency(ATTR_GPS, ATTR_GPS_ACCURACY), { vol.Optional(ATTR_LOCATION_NAME): cv.string, vol.Optional(ATTR_GPS): cv.gps, vol.Optional(ATTR_GPS_ACCURACY): cv.positive_int, vol.Optional(ATTR_BATTERY): cv.positive_int, vol.Optional(ATTR_SPEED): cv.positive_int, vol.Optional(ATTR_ALTITUDE): vol.Coerce(float), vol.Optional(ATTR_COURSE): cv.positive_int, vol.Optional(ATTR_VERTICAL_ACCURACY): cv.positive_int, }, ) ) async def webhook_update_location(hass, config_entry, data): """Handle an update location webhook.""" hass.helpers.dispatcher.async_dispatcher_send(