-
-
Save allenporter/e70d9eb090c7dbdd593cf526e07b4abe to your computer and use it in GitHub Desktop.
--- | |
blueprint: | |
name: Conversation agent Agenda Notification | |
description: | |
Conversation agent generates a notification based on the upcoming calendar | |
agenda, location, and weather information. | |
domain: automation | |
input: | |
notify_time: | |
name: Notification time | |
description: Time the automation is triggered to send the notification. | |
selector: | |
time: {} | |
default: 07:00:00 | |
notify_service: | |
name: Notify service name | |
description: | |
The name of the notify service where the notification should be | |
sent. | |
selector: | |
text: {} | |
default: notify.notify | |
notify_target: | |
name: Notify target | |
description: The target of the notify service. | |
selector: | |
text: {} | |
default: | |
calendar_entity: | |
name: Calendar | |
description: The calendar entity to use for finding upcoming calendar events. | |
selector: | |
entity: | |
multiple: false | |
filter: | |
- domain: | |
- calendar | |
calendar_duration: | |
name: Calendar Event duration | |
description: How many hours ahead to look for upcoming calendar events. | |
selector: | |
duration: | |
default: | |
hours: 18 | |
weather_entity: | |
name: Weather Entity | |
description: The weather entity to use for upcoming weather forecast. | |
selector: | |
entity: | |
multiple: false | |
filter: | |
- domain: | |
- weather | |
zone_entity: | |
name: Home Zone Entity | |
description: | |
The zone entity to use to determine approximate location for understanding | |
typical weather. | |
selector: | |
entity: | |
multiple: false | |
filter: | |
- domain: | |
- zone | |
conversation_agent: | |
name: Conversation Agent | |
selector: | |
conversation_agent: | |
prompt: | |
name: Conversation Agent Prompt | |
selector: | |
text: | |
multiline: true | |
type: text | |
default: |- | |
Please generate text for a notification that will be sent to the users | |
smartphone with helpful information. | |
You are a helpful personal agent that generates text for the user: | |
- Your answers are helpful, friendly, warm, insightful. | |
- Your answers are not technical, and do not include Home Assistant internal details such as entities in responses. | |
- Your messages help the user prepare for their day, for example: | |
- Making note of unusual weather for the location and time of year (but not mundane details like "0% chance of precipitation") | |
- How much time remaining until their first meeting | |
- Anything that may be special or unique, such as celebrating a birthday | |
trigger: | |
platform: time | |
at: !input notify_time | |
action: | |
- variables: | |
weather_entity: !input weather_entity | |
calendar_entity: !input calendar_entity | |
zone_entity: !input zone_entity | |
calendar_duration: !input calendar_duration | |
prompt: !input prompt | |
- alias: Fetch Weather Forecast | |
service: weather.get_forecasts | |
data: | |
type: hourly | |
target: | |
entity_id: | |
- "{{ weather_entity }}" | |
response_variable: daily_forecast | |
- variables: | |
forecast_entity: "{{ daily_forecast[weather_entity] }}" | |
forecast: "{{ forecast_entity.forecast[0] }}" | |
- alias: Fetch Calendar Agenda | |
service: calendar.get_events | |
data: | |
duration: !input calendar_duration | |
target: | |
entity_id: !input calendar_entity | |
response_variable: events_response | |
- alias: "Conversation Agent Notification Text" | |
service: conversation.process | |
data: | |
text: |- | |
Time: {{ now().strftime("%A %B %d %H:%M %p") }} | |
{%- if weather_entity is defined %} | |
{%- set temperature_unit = state_attr(weather_entity, 'temperature_unit') -%} | |
Forecast: {{ forecast.condition }} ({{ forecast.temperature }}{{ temperature_unit }}, {{ forecast.precipitation }}% precipitation) | |
{%- endif %} | |
Calendar "{{ state_attr(calendar_entity, 'friendly_name') }}" events for the next {{ calendar_duration.hours }}: | |
{%- set agenda = (events_response | items | first)[1] %} | |
{%- if agenda.events %} | |
{%- for event in agenda.events %} | |
- Summary: {{ event.summary }} | |
Start-End: {% if event.start is defined %}{{ event.start }} to {{ event.end }}{% else %}All Day{% endif %} | |
{%- if event.description is defined %} | |
Description: {{ event.description }} | |
{% endif -%} | |
{%- if event.location is defined %} | |
Location: {{ event.location }} | |
{% endif -%} | |
{%- endfor %} | |
{%- else %} | |
- No upcoming events. | |
{%- endif %} | |
{{ prompt }} | |
agent_id: !input conversation_agent | |
response_variable: agent | |
- alias: "Send notification" | |
service: !input notify_service | |
data: | |
target: !input notify_target | |
title: "{{ now().strftime('%A') }} Agenda" | |
message: "{{ agent.response.speech.plain.speech }}" |
I tried different calendars and weather entities but everytime I execute the automation it stops, showing the following error: Error rendering data template: UndefinedError: None has no element 0 Any idea how I could solve this?
Give another try. I may have had a stale version here without the weather updates.
I tried different calendars and weather entities but everytime I execute the automation it stops, showing the following error: Error rendering data template: UndefinedError: None has no element 0 Any idea how I could solve this?
Give another try. I may have had a stale version here without the weather updates.
Perfect, thank you very much! works like a charm now
Thank you for reviewing the weather entity issue - much appreciated! Would it be possible to have an option for multiple calenders?
Thank you for reviewing the weather entity issue - much appreciated! Would it be possible to have an option for multiple calenders?
I added some features like multiple calendars:
https://gist.github.com/allenporter/e70d9eb090c7dbdd593cf526e07b4abe?permalink_comment_id=4796049#gistcomment-4796049
This is perfect, thank you for sharing!
Hello @Progaros thanks for shaing your multi-calandar and and todo-list blueprint. I'm using your version but had a question: is there a way to avoivd messages like this?
* Your "Anto's list" tasks for the day include [list specific tasks here].
* Your "General to-do" tasks for the day are [list specific tasks here].
* Your "Work to-do" tasks for the day are [list specific tasks here].
I'm not sure if its because I don't have anything on the to-do list. Maybe its and if-then
could be added so that it does not read to the to-do list if its empty?
thanks
really cool blueprint! i added multiple calendars, tasks, output language & user name:
blueprint: name: Daily Conversation Agent Agenda Notification description: | Conversation agent generates a personalized notification based on the upcoming calendar agenda, tasks, birthday reminders, location, and weather information in your language. domain: automation input: language: name: Language description: Language of Assistant Response selector: language: default: "en" user: name: User description: User who is being addressed selector: entity: multiple: false filter: domain: - person notify_time: name: Notification time description: Time the automation is triggered to send the notification. selector: time: {} default: 07:00:00 notify_service: name: Notify service name description: The name of the notify service where the notification should be sent. selector: text: {} default: notify.notify notify_target: name: Notify target description: The target of the notify service. selector: text: {} default: task_entities: name: Tasks description: The tasks entities to use for finding upcoming todos. selector: entity: multiple: true filter: domain: - todo calendar_entities: name: Calendar description: The calendar entities to use for finding upcoming calendar events. selector: entity: multiple: true filter: domain: - calendar calendar_duration: name: Calendar Event duration description: How many hours ahead to look for upcoming calendar events. selector: duration: default: hours: 18 birthday_calendar: name: Birthday Calendar description: The calendar entity to use for finding upcoming birthdays. selector: entity: multiple: false filter: domain: - calendar birthday_duration: name: Birthday Reminder duration description: How many days ahead to look for upcoming birthdays. selector: duration: enable_day: true default: days: 7 weather_entity: name: Weather Entity description: The weather entity to use for upcoming weather forecast. selector: entity: multiple: false filter: domain: - weather zone_entity: name: Home Zone Entity description: The zone entity to use to determine approximate location for understanding typical weather. selector: entity: multiple: false filter: domain: - zone conversation_agent: name: Conversation Agent selector: conversation_agent: user_prompt_task: name: Conversation Agent Task selector: text: multiline: true type: text default: |- Please generate a short text (~100 words, no newlines) for a notification for an android smartphone with helpful information. trigger: platform: time at: !input notify_time action: - variables: language: !input language user: !input user weather_entity: !input weather_entity task_entities: !input task_entities calendar_entities: !input calendar_entities zone_entity: !input zone_entity calendar_duration: !input calendar_duration birthday_calendar: !input birthday_calendar birthday_duration: !input birthday_duration user_prompt_task: !input user_prompt_task - alias: Fetch Tasks service: todo.get_items data: status: - needs_action target: entity_id: !input task_entities response_variable: tasks_responses - alias: Fetch Calendar Agenda service: calendar.get_events data: duration: !input calendar_duration target: entity_id: !input calendar_entities response_variable: events_responses - alias: Fetch Birthday Calendar service: calendar.get_events data: duration: !input birthday_duration target: entity_id: !input birthday_calendar response_variable: birthday_responses - alias: Get Weather Forecast service: weather.get_forecasts data: type: daily target: entity_id: !input weather_entity response_variable: weekly_weather_forecast - alias: "Prepare Prompt" variables: prompt: |- # You are a helpful personal agent that generates notifications for the user: - You should respond in the RFC 5646 language: "{{language}}" - Your answers are helpful, friendly, warm, insightful. - Your answers are not technical, and do not include Home Assistant internal details such as entities in responses. - Your messages help the user prepare for their day, for example: - Making note of unusual weather for the location and time of year (but not mundane details like "0% chance of precipitation"). - Do not tell the user his location or the current time. - How much time remaining until their first meeting - Anything that may be special or unique, such as celebrating a birthday (but not that there are no birthdays) # Information to include in the notification: Name of User: {{ state_attr(user, "friendly_name") }} Time: {{ now().time().isoformat('minutes') }} {%- if zone_entity is defined %} Latitude: {{ state_attr(zone_entity, 'latitude') | round(1) }} Longitude: {{ state_attr(zone_entity, 'longitude') | round(1) }} {% endif %} {%- if weather_entity is defined %} {%- set temperature_unit = state_attr(weather_entity, 'temperature_unit') -%} {%- set todays_forecast = weekly_weather_forecast[weather_entity]['forecast'][0] %} Weather: {{ todays_forecast.condition }} ({{ todays_forecast.temperature }}{{ temperature_unit }}, {{ todays_forecast.precipitation }}% precipitation) {%- endif %} # Tasks Lists: {%- for task_entity in task_entities %} Upcoming tasks for today on list "{{ state_attr(task_entity, 'friendly_name') }}": {%- set tasks = tasks_responses[task_entities[loop.index0]] %} {%- for task in tasks['items'] %} {%- if 'due' in task and now().date() == as_datetime(task.due, "2222-11-11").date() %} - {{task['summary']}} {%- endif %} {%- endfor %} {%- endfor %} # Calendar Events: {%- for calendar_entity in calendar_entities %} Calendar "{{ state_attr(calendar_entity, 'friendly_name') }}" events for the next {{ calendar_duration.hours }} hours: {%- set agenda = events_responses[calendar_entities[loop.index0]] %} {%- if "events" in agenda and agenda.events %} {%- for event in agenda.events %} - Summary: {{ event.summary }} Start-End: {% if event.start is defined %}{{ event.start }} to {{ event.end }}{% else %}All Day{% endif %} {%- if event.descripton is defined %} Descripton: {{ event.descripton }} {% endif -%} {%- if event.location is defined %} Location: {{ event.location }} {% endif -%} {%- endfor %} {%- else %} - No upcoming events. {%- endif %} {%- endfor %} # Upcoming birthdays: {%- set birthdays = birthday_responses[birthday_calendar] %} {%- if "events" in birthdays and birthdays.events %} {%- for event in birthdays.events %} - Birthday Reminder: {{ event.summary }} on {{ event.start }} {%- endfor %} {%- else %} - No upcoming birthdays. {%- endif %} # Task: {{ user_prompt_task }} - alias: "Conversation Agent Notification Text" service: conversation.process data: text: "{{ prompt }}" agent_id: !input conversation_agent response_variable: agent - alias: "Send notification" service: !input notify_service data: target: !input notify_target title: "{{ now().strftime('%A') }} Agenda" message: "{{ agent.response.speech.plain.speech }}"updated for HA 2024.4 - thanks @chlaa
added tasks
Should be improved here @Anto79-ops :)
Let me know if works for you, otherwise I'll use your if-then
solution
thanks! I ended up using this for the task generation. This defines those with no due date, and with a due date, and no task and for each task list:
# Tasks Lists:
{%- for task_entity in task_entities %}
Upcoming tasks for today on list "{{ state_attr(task_entity, 'friendly_name') }}":
{%- for task in tasks_responses[task_entity]['items'] | selectattr('due', 'defined') | selectattr('due', 'eq', now().date() | string) | map(attribute='summary') | list or ['No Tasks'] %}
- {{ task }}
{%- endfor %}
Upcoming tasks with no due date:
{%- for task in tasks_responses[task_entity]['items'] | selectattr('due', 'undefined') | map(attribute='summary') | list or ['No Tasks'] %}
- {{ task }}
{%- endfor %}
{%- endfor %}
and added this to the prompt
Do not mention tasks if No Tasks are listed.
I tried different calendars and weather entities but everytime I execute the automation it stops, showing the following error: Error rendering data template: UndefinedError: None has no element 0
Any idea how I could solve this?