Skip to content

Commit 66fb5f4

Browse files
Simplify firing of trigger actions (home-assistant#152772)
Co-authored-by: Erik Montnemery <[email protected]>
1 parent 42a9d5d commit 66fb5f4

File tree

5 files changed

+246
-117
lines changed

5 files changed

+246
-117
lines changed

homeassistant/components/zwave_js/device_trigger.py

Lines changed: 23 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22

33
from __future__ import annotations
44

5+
import asyncio
56
from typing import Any
67

78
import voluptuous as vol
@@ -20,7 +21,7 @@
2021
CONF_PLATFORM,
2122
CONF_TYPE,
2223
)
23-
from homeassistant.core import CALLBACK_TYPE, HomeAssistant
24+
from homeassistant.core import CALLBACK_TYPE, Context, HomeAssistant, callback
2425
from homeassistant.exceptions import HomeAssistantError
2526
from homeassistant.helpers import (
2627
config_validation as cv,
@@ -454,8 +455,28 @@ async def async_attach_trigger(
454455
zwave_js_config = await validate_value_updated_trigger_config(
455456
hass, zwave_js_config
456457
)
458+
459+
@callback
460+
def run_action(
461+
extra_trigger_payload: dict[str, Any],
462+
description: str,
463+
context: Context | None = None,
464+
) -> asyncio.Task[Any]:
465+
"""Run action with trigger variables."""
466+
467+
payload = {
468+
"trigger": {
469+
**trigger_info["trigger_data"],
470+
CONF_PLATFORM: VALUE_UPDATED_PLATFORM_TYPE,
471+
"description": description,
472+
**extra_trigger_payload,
473+
}
474+
}
475+
476+
return hass.async_create_task(action(payload, context))
477+
457478
return await attach_value_updated_trigger(
458-
hass, zwave_js_config[CONF_OPTIONS], action, trigger_info
479+
hass, zwave_js_config[CONF_OPTIONS], run_action
459480
)
460481

461482
raise HomeAssistantError(f"Unhandled trigger type {trigger_type}")

homeassistant/components/zwave_js/triggers/event.py

Lines changed: 12 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -17,19 +17,12 @@
1717
ATTR_DEVICE_ID,
1818
ATTR_ENTITY_ID,
1919
CONF_OPTIONS,
20-
CONF_PLATFORM,
2120
)
22-
from homeassistant.core import CALLBACK_TYPE, HassJob, HomeAssistant, callback
21+
from homeassistant.core import CALLBACK_TYPE, HomeAssistant, callback
2322
from homeassistant.helpers import config_validation as cv, device_registry as dr
2423
from homeassistant.helpers.automation import move_top_level_schema_fields_to_options
2524
from homeassistant.helpers.dispatcher import async_dispatcher_connect
26-
from homeassistant.helpers.trigger import (
27-
Trigger,
28-
TriggerActionType,
29-
TriggerConfig,
30-
TriggerData,
31-
TriggerInfo,
32-
)
25+
from homeassistant.helpers.trigger import Trigger, TriggerActionRunner, TriggerConfig
3326
from homeassistant.helpers.typing import ConfigType
3427

3528
from ..const import (
@@ -127,17 +120,13 @@ def validate_event_data(obj: dict) -> dict:
127120
class EventTrigger(Trigger):
128121
"""Z-Wave JS event trigger."""
129122

130-
_hass: HomeAssistant
131123
_options: dict[str, Any]
132124

133125
_event_source: str
134126
_event_name: str
135127
_event_data_filter: dict
136-
_job: HassJob
137-
_trigger_data: TriggerData
138128
_unsubs: list[Callable]
139-
140-
_platform_type = PLATFORM_TYPE
129+
_action_runner: TriggerActionRunner
141130

142131
@classmethod
143132
async def async_validate_complete_config(
@@ -176,14 +165,12 @@ async def async_validate_config(
176165

177166
def __init__(self, hass: HomeAssistant, config: TriggerConfig) -> None:
178167
"""Initialize trigger."""
179-
self._hass = hass
168+
super().__init__(hass, config)
180169
assert config.options is not None
181170
self._options = config.options
182171

183-
async def async_attach(
184-
self,
185-
action: TriggerActionType,
186-
trigger_info: TriggerInfo,
172+
async def async_attach_runner(
173+
self, run_action: TriggerActionRunner
187174
) -> CALLBACK_TYPE:
188175
"""Attach a trigger."""
189176
dev_reg = dr.async_get(self._hass)
@@ -198,8 +185,7 @@ async def async_attach(
198185
self._event_source = options[ATTR_EVENT_SOURCE]
199186
self._event_name = options[ATTR_EVENT]
200187
self._event_data_filter = options.get(ATTR_EVENT_DATA, {})
201-
self._job = HassJob(action)
202-
self._trigger_data = trigger_info["trigger_data"]
188+
self._action_runner = run_action
203189
self._unsubs: list[Callable] = []
204190

205191
self._create_zwave_listeners()
@@ -225,9 +211,7 @@ def _async_on_event(
225211
if event_data[key] != val:
226212
return
227213

228-
payload = {
229-
**self._trigger_data,
230-
CONF_PLATFORM: self._platform_type,
214+
payload: dict[str, Any] = {
231215
ATTR_EVENT_SOURCE: self._event_source,
232216
ATTR_EVENT: self._event_name,
233217
ATTR_EVENT_DATA: event_data,
@@ -237,21 +221,17 @@ def _async_on_event(
237221
f"Z-Wave JS '{self._event_source}' event '{self._event_name}' was emitted"
238222
)
239223

224+
description = primary_desc
240225
if device:
241226
device_name = device.name_by_user or device.name
242227
payload[ATTR_DEVICE_ID] = device.id
243228
home_and_node_id = get_home_and_node_id_from_device_entry(device)
244229
assert home_and_node_id
245230
payload[ATTR_NODE_ID] = home_and_node_id[1]
246-
payload["description"] = f"{primary_desc} on {device_name}"
247-
else:
248-
payload["description"] = primary_desc
249-
250-
payload["description"] = (
251-
f"{payload['description']} with event data: {event_data}"
252-
)
231+
description = f"{primary_desc} on {device_name}"
253232

254-
self._hass.async_run_hass_job(self._job, {"trigger": payload})
233+
description = f"{description} with event data: {event_data}"
234+
self._action_runner(payload, description)
255235

256236
@callback
257237
def _async_remove(self) -> None:

homeassistant/components/zwave_js/triggers/value_updated.py

Lines changed: 10 additions & 37 deletions
Original file line numberDiff line numberDiff line change
@@ -11,23 +11,12 @@
1111
from zwave_js_server.model.driver import Driver
1212
from zwave_js_server.model.value import Value, get_value_id_str
1313

14-
from homeassistant.const import (
15-
ATTR_DEVICE_ID,
16-
ATTR_ENTITY_ID,
17-
CONF_OPTIONS,
18-
CONF_PLATFORM,
19-
MATCH_ALL,
20-
)
21-
from homeassistant.core import CALLBACK_TYPE, HassJob, HomeAssistant, callback
14+
from homeassistant.const import ATTR_DEVICE_ID, ATTR_ENTITY_ID, CONF_OPTIONS, MATCH_ALL
15+
from homeassistant.core import CALLBACK_TYPE, HomeAssistant, callback
2216
from homeassistant.helpers import config_validation as cv, device_registry as dr
2317
from homeassistant.helpers.automation import move_top_level_schema_fields_to_options
2418
from homeassistant.helpers.dispatcher import async_dispatcher_connect
25-
from homeassistant.helpers.trigger import (
26-
Trigger,
27-
TriggerActionType,
28-
TriggerConfig,
29-
TriggerInfo,
30-
)
19+
from homeassistant.helpers.trigger import Trigger, TriggerActionRunner, TriggerConfig
3120
from homeassistant.helpers.typing import ConfigType
3221

3322
from ..config_validation import VALUE_SCHEMA
@@ -100,12 +89,7 @@ async def async_validate_trigger_config(
10089

10190

10291
async def async_attach_trigger(
103-
hass: HomeAssistant,
104-
options: ConfigType,
105-
action: TriggerActionType,
106-
trigger_info: TriggerInfo,
107-
*,
108-
platform_type: str = PLATFORM_TYPE,
92+
hass: HomeAssistant, options: ConfigType, run_action: TriggerActionRunner
10993
) -> CALLBACK_TYPE:
11094
"""Listen for state changes based on configuration."""
11195
dev_reg = dr.async_get(hass)
@@ -121,9 +105,6 @@ async def async_attach_trigger(
121105
endpoint = options.get(ATTR_ENDPOINT)
122106
property_key = options.get(ATTR_PROPERTY_KEY)
123107
unsubs: list[Callable] = []
124-
job = HassJob(action)
125-
126-
trigger_data = trigger_info["trigger_data"]
127108

128109
@callback
129110
def async_on_value_updated(
@@ -152,10 +133,8 @@ def async_on_value_updated(
152133
return
153134

154135
device_name = device.name_by_user or device.name
155-
136+
description = f"Z-Wave value {value.value_id} updated on {device_name}"
156137
payload = {
157-
**trigger_data,
158-
CONF_PLATFORM: platform_type,
159138
ATTR_DEVICE_ID: device.id,
160139
ATTR_NODE_ID: value.node.node_id,
161140
ATTR_COMMAND_CLASS: value.command_class,
@@ -169,10 +148,9 @@ def async_on_value_updated(
169148
ATTR_PREVIOUS_VALUE_RAW: prev_value_raw,
170149
ATTR_CURRENT_VALUE: curr_value,
171150
ATTR_CURRENT_VALUE_RAW: curr_value_raw,
172-
"description": f"Z-Wave value {value.value_id} updated on {device_name}",
173151
}
174152

175-
hass.async_run_hass_job(job, {"trigger": payload})
153+
run_action(payload, description)
176154

177155
@callback
178156
def async_remove() -> None:
@@ -223,7 +201,6 @@ def _create_zwave_listeners() -> None:
223201
class ValueUpdatedTrigger(Trigger):
224202
"""Z-Wave JS value updated trigger."""
225203

226-
_hass: HomeAssistant
227204
_options: dict[str, Any]
228205

229206
@classmethod
@@ -245,16 +222,12 @@ async def async_validate_config(
245222

246223
def __init__(self, hass: HomeAssistant, config: TriggerConfig) -> None:
247224
"""Initialize trigger."""
248-
self._hass = hass
225+
super().__init__(hass, config)
249226
assert config.options is not None
250227
self._options = config.options
251228

252-
async def async_attach(
253-
self,
254-
action: TriggerActionType,
255-
trigger_info: TriggerInfo,
229+
async def async_attach_runner(
230+
self, run_action: TriggerActionRunner
256231
) -> CALLBACK_TYPE:
257232
"""Attach a trigger."""
258-
return await async_attach_trigger(
259-
self._hass, self._options, action, trigger_info
260-
)
233+
return await async_attach_trigger(self._hass, self._options, run_action)

0 commit comments

Comments
 (0)