Read the celebration payload from trigger.event.data

HA event triggers expose the payload as trigger.event.data, not
trigger.payload; fix the blueprint, its tests, and the README
examples, with a regression guard.
This commit is contained in:
2026-09-19 14:54:03 -04:00
parent e508c80465
commit ca93176768
3 changed files with 31 additions and 14 deletions
+2 -2
View File
@@ -60,7 +60,7 @@ triggers:
event_type: nestquest_child_day_complete
conditions:
- condition: template
value_template: "{{ trigger.payload.child_name == 'Declan' }}"
value_template: "{{ trigger.event.data.child_name == 'Declan' }}"
actions:
- action: notify.mobile_app_declans_phone
data:
@@ -134,7 +134,7 @@ day-rollover time.
# afternoon_reminder: afternoon_time 15:00, same notify target
# end_of_day_report: report_time 20:00, send_even_when_clear false, same target
# day_complete_celebration: input_text.nestquest_last_celebrated,
# celebration_message "Legendary! {{ trigger.payload.child_name }} cleared every quest today!"
# celebration_message "Legendary! {{ trigger.event.data.child_name }} cleared every quest today!"
#
# Every blueprint has its own send/celebrate toggle input; turn an
# automation off entirely from HA's automation menu.
@@ -34,9 +34,9 @@ blueprint:
name: Celebration message
description: >-
The message sent when a child clears every quest today. May
use the event payload: trigger.payload.child_name,
trigger.payload.quests_due and trigger.payload.quests_completed.
default: "Legendary! {{ trigger.payload.child_name }} cleared every quest today!"
use the event payload: trigger.event.data.child_name,
trigger.event.data.quests_due and trigger.event.data.quests_completed.
default: "Legendary! {{ trigger.event.data.child_name }} cleared every quest today!"
selector:
text: {}
celebrate:
@@ -80,7 +80,7 @@ conditions:
# reads as '' and celebrates.
- condition: template
value_template: >-
{{ (trigger.payload.child_id ~ ':' ~ now().strftime('%Y-%m-%d'))
{{ (trigger.event.data.child_id ~ ':' ~ now().strftime('%Y-%m-%d'))
not in ((states(last_celebrated_helper) or '')
.split(',')
| select('ne', '')
@@ -106,4 +106,4 @@ actions:
{%- set ns.entries = ns.entries + [entry] -%}
{%- endif -%}
{%- endfor -%}
{{ (ns.entries + [trigger.payload.child_id ~ ':' ~ today]) | join(',') }}
{{ (ns.entries + [trigger.event.data.child_id ~ ':' ~ today]) | join(',') }}
+24 -7
View File
@@ -65,14 +65,17 @@ def stamp_value_template(bp: dict) -> str:
def trigger_payload(child_id: int, child_name: str) -> dict:
"""A nestquest_child_day_complete trigger payload fixture."""
"""A nestquest_child_day_complete trigger fixture: HA exposes an
event trigger's payload as trigger.event.data."""
return {
"payload": {
"child_id": child_id,
"child_name": child_name,
"quests_due": 3,
"quests_completed": 3,
"occurred_at": "2026-09-19T15:00:00+00:00",
"event": {
"data": {
"child_id": child_id,
"child_name": child_name,
"quests_due": 3,
"quests_completed": 3,
"occurred_at": "2026-09-19T15:00:00+00:00",
}
}
}
@@ -294,3 +297,17 @@ def test_every_blueprint_event_reference_is_real() -> None:
assert celebration()["triggers"][0]["event_type"] == (
"nestquest_child_day_complete"
)
def test_celebration_uses_the_event_trigger_data_path() -> None:
"""HA exposes an event trigger's payload as trigger.event.data —
never trigger.payload (Codex review regression)."""
bp = celebration()
for value in iter_strings(bp):
assert "trigger.payload" not in value, value
default_message = bp["blueprint"]["input"]["celebration_message"][
"default"
]
assert "trigger.event.data.child_name" in default_message
for condition in celebration_conditions(bp):
assert "trigger.payload" not in condition["value_template"]