Add websocket trigger/condition commands (#39109)
This commit is contained in:
parent
d5193e64de
commit
2a1fe9d29a
10 changed files with 204 additions and 61 deletions
|
@ -40,6 +40,8 @@ def async_register_commands(hass, async_reg):
|
|||
async_reg(hass, handle_manifest_list)
|
||||
async_reg(hass, handle_manifest_get)
|
||||
async_reg(hass, handle_entity_source)
|
||||
async_reg(hass, handle_subscribe_trigger)
|
||||
async_reg(hass, handle_test_condition)
|
||||
|
||||
|
||||
def pong_message(iden):
|
||||
|
@ -315,3 +317,69 @@ def handle_entity_source(hass, connection, msg):
|
|||
sources[entity_id] = source
|
||||
|
||||
connection.send_result(msg["id"], sources)
|
||||
|
||||
|
||||
@callback
|
||||
@decorators.websocket_command(
|
||||
{
|
||||
vol.Required("type"): "subscribe_trigger",
|
||||
vol.Required("trigger"): cv.TRIGGER_SCHEMA,
|
||||
vol.Optional("variables"): dict,
|
||||
}
|
||||
)
|
||||
@decorators.require_admin
|
||||
@decorators.async_response
|
||||
async def handle_subscribe_trigger(hass, connection, msg):
|
||||
"""Handle subscribe trigger command."""
|
||||
# Circular dep
|
||||
# pylint: disable=import-outside-toplevel
|
||||
from homeassistant.helpers import trigger
|
||||
|
||||
trigger_config = await trigger.async_validate_trigger_config(hass, msg["trigger"])
|
||||
|
||||
@callback
|
||||
def forward_triggers(variables, context=None):
|
||||
"""Forward events to websocket."""
|
||||
connection.send_message(
|
||||
messages.event_message(
|
||||
msg["id"], {"variables": variables, "context": context}
|
||||
)
|
||||
)
|
||||
|
||||
connection.subscriptions[msg["id"]] = (
|
||||
await trigger.async_initialize_triggers(
|
||||
hass,
|
||||
trigger_config,
|
||||
forward_triggers,
|
||||
const.DOMAIN,
|
||||
const.DOMAIN,
|
||||
connection.logger.log,
|
||||
variables=msg.get("variables"),
|
||||
)
|
||||
) or (
|
||||
# Some triggers won't return an unsub function. Since the caller expects
|
||||
# a subscription, we're going to fake one.
|
||||
lambda: None
|
||||
)
|
||||
connection.send_result(msg["id"])
|
||||
|
||||
|
||||
@decorators.websocket_command(
|
||||
{
|
||||
vol.Required("type"): "test_condition",
|
||||
vol.Required("condition"): cv.CONDITION_SCHEMA,
|
||||
vol.Optional("variables"): dict,
|
||||
}
|
||||
)
|
||||
@decorators.require_admin
|
||||
@decorators.async_response
|
||||
async def handle_test_condition(hass, connection, msg):
|
||||
"""Handle test condition command."""
|
||||
# Circular dep
|
||||
# pylint: disable=import-outside-toplevel
|
||||
from homeassistant.helpers import condition
|
||||
|
||||
check_condition = await condition.async_from_config(hass, msg["condition"])
|
||||
connection.send_result(
|
||||
msg["id"], {"result": check_condition(hass, msg.get("variables"))}
|
||||
)
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue