The title already says it all:
Is it possible to define aliases for ToDo items? Identically to how you can set aliases for e.g. entities in the Voice assistants settings:
Here is the reason I ask:
I use Voice PE to deactivate ToDo items using the autmation below. This gives me the flexibility to add new ToDo-items without having to change the automation for the voice-control.
However, it forces me to exactly phrase the command and sometimes I get it wrong (and I need to memorize an increasing number of ToDo-items). Being able to use aliases, would allow me to make things more flexible by setting aliases for different ways of how I usually thing.
Here is the code of the automation (text in german):
alias: automation__voice_set_todo_item_done
description: Set ToDo item to done using voice-command.
triggers:
- trigger: conversation
command:
- aufgabe {todo_item_name} [fertig|abgehakt]
conditions: []
actions:
- set_conversation_response: >-
Du hast die Aufgabe {{ trigger.slots.todo_item_name }} abgeschlossen. Gute
Arbeit und vielen Dank!
- action: todo.update_item
metadata: {}
data:
item: "{{ trigger.slots.todo_item_name }}"
status: completed
target:
entity_id: todo.haushalt
mode: single
These will offer context for LLMs and if you keep them short words should also offer aliases that might patch. If you’re using short phrase for language over LLM - keep these as short words or simple one or two word phrases. If you’re using LLM be VERY descriptive. In my example Im using LLMs so I’m being descriptive.
Yes. By the current definition, Aliases are alternative names used only to refer to an entity, area, or floor… they aren’t available for the items you put on your shopping lists.
Your options are to
Use a custom intent and sentence with a list:
Example Custom Intents and Sentences
language: "en"
intents:
CustomTaskCompleted:
data:
- sentences:
- "{task_map} (task|chore) (completed|finished|done)"
- "(task|chore) (completed|finished) {task_map}"
CustomTaskAdd:
data:
- sentences:
- "(refresh|add) (task|chore) {task_map}"
- "(task|chore) {task_map} (refresh|add)"
lists:
task_map:
values:
- in: "(test|experiment|exam)"
out: This is a Test
- in: "(trash|garbage|refuse)"
out: Take out the Garbage
intent_script:
CustomTaskCompleted:
speech:
text: |
You've completed the task {{ task_map }}.
Good work and thank you!
action:
- variables:
todo_ent: "todo.chores"
- alias: Get NEEDS_ACTION items
action: todo.get_items
metadata: {}
data:
status: needs_action
response_variable: active
target:
entity_id: "{{ todo_ent }}"
- variables:
item: "{{ active[todo_ent]['items'] | selectattr('summary', 'eq', task_map) | first }}"
- choose:
- conditions: "{{item.uid is defined }}"
sequence:
- action: todo.update_item
data:
status: completed
item: "{{ item.uid }}"
target:
entity_id: "{{ todo_ent }}"
default:
- stop: There is no item by that name in {{state_attr(todo_ent, 'friendly_name')}}
CustomTaskAdd:
speech:
text: "Adding chore to the list"
action:
- alias: Get NEEDS_ACTION from Working List
action: todo.get_items
metadata: {}
data:
status: needs_action
response_variable: existing
target:
entity_id: todo.chores
- alias: Get COMPLETED from Working List
action: todo.get_items
metadata: {}
data:
status: completed
response_variable: completed
target:
entity_id: todo.chores
- variables:
existing_chores: >
{{ existing['todo.chores']['items']|map(attribute='summary')|list }}
completed_chores: >
{{ completed['todo.chores']['items']|map(attribute='summary')|list }}
- choose:
- conditions:
- condition: template
value_template: "{{ task_map in existing_chores }}"
sequence:
- stop: "Item already in list"
- conditions:
- condition: template
value_template: "{{ task_map in completed_chores }}"
sequence:
- action: todo.update_item
data:
status: needs_action
item: "{{task_map}}"
target:
entity_id: todo.chores
default:
- action: todo.add_item
metadata: {}
data:
item: "{{ task_map }}"
target:
entity_id: todo.chores
Do basically the same thing as #1 in your Sentence-based automation with templating that retrieves a “generic” value from a mapping of possible phrases to generic values
@NathanCu would be a better source on practicality of the following option… retrieve the values from the task list with todo.get_items then pipe those and the value from your trigger into an LLM to return the closest option.
Practicality. Good word… You’re basically talking about a system that automatically normalizes a list on entry…
I decided to sidestep the whole problem and tie shopping lists to grocy on the back end and let it normalize the lists for me…
(read: big honking overbuilt full on inventory)
Also it takes something of that scale and it’s baggage unless you’re willing to accept failure is an option. Because the storage system has no control and the ai is only operating on what it’s told so you can:
A: manually seed that list (context) by writing a book about all the possible ways to say chocolate milk
OR
B: have the possibilities on a lookup list for the AI and tell it it’s job is to always check before entering and if not then go use tool to add it… (short version the second one requires big honking overbuilt inventory)
Yes I know reply to self is bad form. But I thought it out and it gets worse. You’ll either need to handle the write by task I’d (not sure if that’s available outside custom integration service) orrr. Because how the built-in intent Hanes ToDo and shopping list items (unless it changed in 2025.7 it keys on the subject_ something - basically the item) you have to handle the collision of naming and merges… I’m even harder noping out and handing that to a system.