mirror of
https://github.com/CCOSTAN/Home-AssistantConfig.git
synced 2025-12-03 19:41:47 +00:00
346 lines
15 KiB
YAML
Executable File
346 lines
15 KiB
YAML
Executable File
######################################################################
|
|
# @CCOSTAN - Follow Me on X
|
|
# For more info visit https://www.vcloudinfo.com/click-here
|
|
# Original Repo : https://github.com/CCOSTAN/Home-AssistantConfig
|
|
# -------------------------------------------------------------------
|
|
# Speech Briefing Macros - TTS prompt helpers for daily briefings
|
|
# Generates macro prompts for weather, reminders, and AI-driven speech routines.
|
|
# -------------------------------------------------------------------
|
|
# Weather, responsibilities, holidays, air quality, and fact prompts parsed by speech_processing/speech_engine.
|
|
######################################################################
|
|
|
|
|
|
>-
|
|
{%- macro dark_outside() -%}
|
|
[Because the sun has set, outside lights have been turned on]
|
|
{%- endmacro -%}
|
|
|
|
{%- macro garbage_day() -%}
|
|
{% set day_of_week = now().strftime('%a') %}
|
|
{% if day_of_week in ['Wed', 'Sun'] %}
|
|
Today is garbage day.
|
|
{% if day_of_week == 'Wed' %}
|
|
Both Recycling and regular Garbage goes out.
|
|
{% endif %}
|
|
{% endif %}
|
|
{%- endmacro -%}
|
|
|
|
{%- macro inside_weather() -%}
|
|
{% set temp = state_attr('climate.downstairs', 'current_temperature') | default('unknown') %}
|
|
{% set humidity = states('sensor.downstairs_thermostat_humidity') %}
|
|
Inside the house, it is {{ temp }} degrees{% if humidity not in ['unknown','unavailable','none'] %} with {{ humidity }} percent humidity{% endif %}. [Only mention humidity if it seems unusually high]
|
|
{%- endmacro -%}
|
|
|
|
{% macro outside_weather() %}
|
|
[Here is the current weather outside]
|
|
{% set aq_description = state_attr('sensor.bear_stone_common_air_quality_index', 'description') | default('') %}
|
|
{% set aq_index = states('sensor.bear_stone_common_air_quality_index') | int(0) %}
|
|
{% if aq_description %}
|
|
Air Quality: {{ aq_description }}
|
|
{% endif %}
|
|
{% if aq_index >= 150 %}
|
|
[Air quality is unhealthy; limit outdoor activity]
|
|
{% endif %}
|
|
{% set pirateweather_metrics = states.sensor
|
|
| selectattr('entity_id','search','pirateweather')
|
|
| rejectattr('state','in',['0','0.0','none','unknown','unavailable'])
|
|
| list %}
|
|
{% for entity in pirateweather_metrics %}
|
|
{% set value = entity.state %}
|
|
{% set unit = entity.attributes.unit_of_measurement | default('') %}
|
|
{% set base_name = entity.attributes.friendly_name | default(entity.entity_id) %}
|
|
{% set friendly_name = ' '.join(base_name.split(' ')[1:]) or base_name %}
|
|
{% set numeric = value | float(0) %}
|
|
{% set include = (
|
|
'Temperature' in friendly_name
|
|
or 'Minutely' in friendly_name
|
|
or 'Precip' in friendly_name
|
|
or ('Wind Speed' in friendly_name and numeric > 15)
|
|
or ('Cloud Coverage' in friendly_name and numeric > 75)
|
|
or ('Humidity' in friendly_name and (numeric < 50 or numeric > 85))
|
|
or ('Nearest Storm Distance' in friendly_name and numeric <= 10)
|
|
) %}
|
|
{% if include and 'UV Index' not in friendly_name %}
|
|
{{ friendly_name }}: {{ value }} {{ unit }}
|
|
{% endif %}
|
|
{%- endfor %}
|
|
|
|
{% set uv_index = states('sensor.pirateweather_uv_index') | float(0) %}
|
|
{% if uv_index >= 6 %}
|
|
UV index is {{ uv_index }}.
|
|
[Give a helpful suggestion based on the current UV index or weather conditions]
|
|
{% endif %}
|
|
|
|
{%- if states('sensor.nws_alerts') | int(0) > 0 -%}
|
|
{%- set alert_description = state_attr('sensor.nws_alerts', 'Alerts') | default('') %}
|
|
[Summarize the included weather alert and give overall details on any storms relevant to the residents of the home. Use the Situation Overview Section to best understand what is going on - Be sure to highlight any impacts to Seminole County or Tallahassee]
|
|
{{ alert_description }}
|
|
[END of Weather Alert]
|
|
{%- endif %}
|
|
{%- endmacro -%}
|
|
|
|
{%- macro lightning() -%}
|
|
There have been {{ states('sensor.blitzortung_lightning_counter') }} lightning strikes detected within {{(states('sensor.blitzortung_lightning_distance') | int(9999)/ 1.69) | round (1, 'floor')}} Miles of our House.
|
|
Nearest Storm Distance : {{states('sensor.pirateweather_nearest_storm_distance')}} Miles.
|
|
{%- endmacro -%}
|
|
|
|
{%- macro fridge() -%}
|
|
The internal temperature of the refrigerator is currently {{ states('sensor.blink_blink1_temperature') }} degrees. The freezer temperature is {{ states('sensor.refrigerator_freezer_temp') }} degrees and the fridge temperature is {{ states('sensor.refrigerator_fridge_temp') }} degrees. {% if is_state('binary_sensor.refrigerator_door_open', 'on') %}The fridge door is currently open.{% endif %}
|
|
{%- endmacro -%}
|
|
|
|
{%- macro light_check() -%}
|
|
{% if states.group.all_lights.state != 'off' -%}
|
|
There are
|
|
{% for state in states.light if state.state == 'on' -%}
|
|
{%- if loop.last -%}
|
|
{{ loop.index }}
|
|
{%- endif -%}
|
|
{%- endfor %}
|
|
lights on right now.
|
|
{% set comma = joiner(', ') %}
|
|
The
|
|
{% for group in states.group|groupby('state') -%}
|
|
{%- for entity in group.list if entity.state == 'on'
|
|
and entity.name.split(' ')[1]|lower == 'lights'
|
|
and entity.name.split(' ')[0]|lower != 'all'
|
|
and entity.name.split(' ')[0]|lower != 'interior'
|
|
-%}
|
|
{{ 'and' if loop.last and not loop.first else comma() }}
|
|
{{ entity.name|replace('Lights','')}}
|
|
{%- endfor -%}
|
|
{%- endfor -%}
|
|
lights are on.
|
|
{%- endif -%}
|
|
{%- endmacro -%}
|
|
|
|
{%- macro window_check() -%}
|
|
{% if states.group.entry_points.state != 'off' -%}
|
|
{% set comma = joiner(', ') %}
|
|
The
|
|
{% for state in states.binary_sensor if state.state == 'on' and state.attributes.device_class == 'opening' -%}
|
|
{%- endfor %}
|
|
{% for group in states.binary_sensor|groupby('state') -%}
|
|
{%- for entity in group.list if entity.state == 'on' and entity.attributes.device_class == 'opening' -%}
|
|
{{ ' and' if loop.last and not loop.first else comma() }}
|
|
{{ entity.attributes.friendly_name }}
|
|
{%- endfor -%}
|
|
{% endfor %}
|
|
need to be closed.
|
|
{%- endif -%}
|
|
{%- endmacro -%}
|
|
|
|
{%- macro lock_check() -%}
|
|
{% if states.group.locks.state !='locked' -%}
|
|
The
|
|
{%- for state in states.lock -%}
|
|
{%- endfor %}
|
|
{% for group in states.lock|groupby('state') -%}
|
|
{%- for entity in group.list if entity.state == 'unlocked' -%}
|
|
{{ ' and' if loop.last and not loop.first }}
|
|
{{ entity.attributes.friendly_name }}
|
|
{%- endfor -%}
|
|
{%- endfor %}
|
|
needs to be locked.
|
|
{%- endif -%}
|
|
{%- endmacro -%}
|
|
|
|
{%- macro garage_check() -%}
|
|
{% if states.group.garage_doors.state !='closed' -%}
|
|
The
|
|
{%- for state in states.cover -%}
|
|
{%- endfor %}
|
|
{% for group in states.cover|groupby('state') -%}
|
|
{%- for entity in group.list if entity.state == 'open' and entity.attributes.device_class == 'garage' -%}
|
|
{{ ' and' if loop.last and not loop.first }}
|
|
{{ entity.attributes.friendly_name }}
|
|
{%- endfor -%}
|
|
{%- endfor %}
|
|
need to be closed.
|
|
{%- endif -%}
|
|
{%- endmacro -%}
|
|
|
|
{%- macro medicine() -%}
|
|
{% if is_state('input_boolean.medicine', 'off') -%}
|
|
It looks like Carlo has not taken his medicine yet. Please make sure Carlo takes his medicine now.
|
|
{% endif -%}
|
|
{%- endmacro -%}
|
|
|
|
{%- macro moon() -%}
|
|
{% if (now().hour == 17) %}
|
|
Current Moon phase: {{ states('sensor.moon') }} [Give a fact and mention today's phase]
|
|
{% endif %}
|
|
{%- endmacro -%}
|
|
|
|
{%- macro uv() -%}
|
|
{# UV details are now included in outside_weather with a threshold gate #}
|
|
{%- endmacro -%}
|
|
|
|
{%- macro holiday() -%}
|
|
{% if states.sensor.holiday.state != '' %}
|
|
Today is {{ states.sensor.holiday.state }}.
|
|
{% endif %}
|
|
{%- endmacro -%}
|
|
|
|
{# YOUTUBE VIDEO ********* https://www.vcloudinfo.com/2019/11/adding-days-until-sensor-to-my-home-assistant-speech-routines.html #}
|
|
{%- macro days_until() -%}
|
|
{%- if states('sensor.mothers_countdown') | int(9999)< 20 -%}
|
|
and don't forget, there is only {{ states.sensor.mothers_countdown.state }} days until Mothers day!
|
|
{%- elif states('sensor.fathers_countdown') | int(9999)< 20 -%}
|
|
and don't forget, there are {{ states.sensor.fathers_countdown.state }} days until Fathers day!
|
|
{%- elif states('sensor.easter_countdown') | int(9999)< 15 -%}
|
|
and don't forget, there are {{ states.sensor.easter_countdown.state }} colorful days until Easter Sunday!
|
|
{%- elif states('sensor.thanksgiving_day_countdown') | int(9999)< 10 and states('sensor.thanksgiving_day_countdown') | int(9999)> 0 -%}
|
|
and don't forget, there are {{ states.sensor.thanksgiving_day_countdown.state }} thankful days until Thanksgiving
|
|
{%- elif states('sensor.thanksgiving_day_countdown') | int(9999)< 1 -%}
|
|
and don't forget, Thanksgiving is tomorrow!
|
|
{%- elif states('sensor.halloween_countdown') | int(9999)< 30 and states('sensor.halloween_countdown') | int(9999)> 0 -%}
|
|
and don't forget, there are {{ states.sensor.halloween_countdown.state }} Spooky days until Halloween!
|
|
{%- elif states('sensor.halloween_countdown') | int(9999)< 1 -%}
|
|
and don't forget, Tomorrow is Halloween!
|
|
{%- elif states('sensor.chanukkah_countdown') | int(9999)< 15 -%}
|
|
and don't forget, there are {{ states.sensor.chanukkah_countdown.state }} days until Chanukkah!
|
|
{%- elif states('sensor.christmas_countdown') | int(9999)< 30 and states('sensor.christmas_countdown') | int(9999)> 0 -%}
|
|
and don't forget, there are {{ states.sensor.christmas_countdown.state }} Merry days until Christmas!
|
|
{%- elif states('sensor.christmas_countdown') | int(9999)< 1 -%}
|
|
and don't forget, Santa Claus is coming tomorrow!
|
|
{% endif %}
|
|
{%- endmacro -%}
|
|
|
|
{% macro fact_of_the_day() %}
|
|
[incorporate into the message a relevant fact about something that happened in the past on this day]
|
|
{% endmacro %}
|
|
|
|
{# friendly duration/location helper #}
|
|
{% macro friendly_location(person_id, place_sensor_id, name) %}
|
|
{% set person = states[person_id] %}
|
|
{% if not person %}
|
|
{{ name }}: Away
|
|
{% else %}
|
|
{% set person_state = states(person_id) %}
|
|
{% set place_state = states(place_sensor_id) if place_sensor_id in states else 'unknown' %}
|
|
{% set location_label = place_state if place_state not in ['unknown','unavailable','','none'] else person_state %}
|
|
{% set location_label = 'Away' if location_label in ['unknown','unavailable','','none'] else location_label %}
|
|
{% set last_changed = as_timestamp(person.last_changed) %}
|
|
{% set seconds = (as_timestamp(now()) - last_changed) | int(0) if last_changed else 0 %}
|
|
{% set hours = (seconds // 3600) | int %}
|
|
{% set minutes = ((seconds % 3600) // 60) | int %}
|
|
{% set duration = (hours ~ ' hours') if hours >= 1 else (minutes ~ ' minutes') %}
|
|
{% if person_state == 'driving' %}
|
|
{% set driving_label = location_label if location_label != 'Away' else '' %}
|
|
{{ name }}: Driving{% if driving_label %} near {{ driving_label }}{% endif %}{% if seconds >= 60 %} for {{ duration }}{% endif %}
|
|
{% else %}
|
|
{{ name }}: {{ location_label }}{% if seconds >= 60 %} for {{ duration }}{% endif %}
|
|
{% endif %}
|
|
{% endif %}
|
|
{% endmacro %}
|
|
|
|
{# a macro that removes all newline characters, empty spaces, and returns formatted text and replaces underscores with spaces #}
|
|
{%- macro cleanup(data) -%}
|
|
{%- for item in data.split("\n") if item | trim != "" -%}
|
|
{{ item | trim | replace("_", " ") }} {% endfor -%}
|
|
{%- endmacro -%}
|
|
|
|
{# ********************************************* #}
|
|
{# ******** Start the Speech routines ******** #}
|
|
{# ********************************************* #}
|
|
|
|
{# a macro to call all macros :) #}
|
|
{%- macro mother_of_all_macros() -%}
|
|
|
|
{# Augmenting the System Prompt for OpenAI #}
|
|
{% set current_date = now() %}
|
|
{% set month = current_date.strftime('%B') %}
|
|
{% set day_of_week = now().strftime('%a') %}
|
|
{% set hour = now().hour %}
|
|
{% set minute = now().minute %}
|
|
{% set day = current_date.strftime('%d') %}
|
|
{% set year = current_date.strftime('%Y') %}
|
|
{% set time = current_date.strftime('%I:%M %p') %}
|
|
[Current date time: {{ month }} {{ day }}, {{ year }} {{ time }}]
|
|
|
|
[Resident: Location:
|
|
- {{ friendly_location('person.carlo', 'sensor.carlo_place', 'Carlo') }}
|
|
- {{ friendly_location('person.stacey', 'sensor.stacey_place', 'Stacey') }}
|
|
- {{ friendly_location('person.justin', 'sensor.justin_place', 'Justin') }}
|
|
- {{ friendly_location('person.paige', 'sensor.paige_place', 'Paige') }}
|
|
{% if range(1, 100) | random <= 25 %}
|
|
Cat Molly: Always home.
|
|
{% endif %}
|
|
]
|
|
[Sensor Data:
|
|
{% if call_no_announcement != 1 %}
|
|
{% if now().strftime('%H')|int(9999)< 12 and now().strftime('%H')|int(9999)> 6 %}
|
|
Good morning. [if there is only one person home, address them specifically]
|
|
{% elif now().strftime('%H')|int(9999)>= 12 and now().strftime('%H')|int(9999)< 17 %}
|
|
Good afternoon. [if there is only one person home, address them specifically]
|
|
{% else %}
|
|
Good evening. [if there is only one person home, address them specifically]
|
|
{% endif %}
|
|
{% endif %}
|
|
|
|
{# Called from Annoucenments #}
|
|
{{ personarriving | default }}
|
|
|
|
{# Called from Nest when thermostats turn on #}
|
|
{{ NestStatus | default }}
|
|
|
|
{% if call_inside_weather == 1 %}
|
|
{{ inside_weather() }}
|
|
{% endif %}
|
|
|
|
{{ outside_weather() }}
|
|
|
|
{% if (states('sensor.blitzortung_lightning_counter')|int(0)) > 0 %}
|
|
{{ lightning() }}
|
|
{% endif %}
|
|
|
|
{% if (states('sensor.blink_blink1_temperature')|int(0) > 55 or states('sensor.refrigerator_freezer_temp')|float > 5 or states('sensor.refrigerator_fridge_temp')|float > 50 or is_state('binary_sensor.refrigerator_door_open', 'on')) and no_fridge != 1 %}
|
|
{{ fridge() }}
|
|
{% endif %}
|
|
|
|
{{ DoorOpened | default }}
|
|
{{ DoorClosed | default }}
|
|
|
|
{{ lock_check() }}
|
|
{# These two lock statements are sent directly from automations. #}
|
|
{{ DoorLocked | default }}
|
|
{{ DoorUnLocked | default }}
|
|
|
|
{% if call_dark_outside == 1 %}
|
|
{{ dark_outside() }}
|
|
{% endif %}
|
|
|
|
{% if call_garage_check == 1 or is_state('sun.sun', 'below_horizon') %}
|
|
{{ garage_check() }}
|
|
{% endif %}
|
|
|
|
{% if (call_window_check == 1 or is_state('sun.sun', 'below_horizon')) or is_state('group.entry_points', 'on') %}
|
|
{{ window_check() }}
|
|
{% endif %}
|
|
|
|
{{ NewDevice | default }}
|
|
|
|
{% if call_light_check == 1 %}
|
|
{{ light_check() }}
|
|
{% endif %}
|
|
|
|
{% if call_garbage_day == 1 %}
|
|
{{ garbage_day() }}
|
|
{% endif %}
|
|
|
|
{% if now().strftime('%H')|int(0) > 21 %}
|
|
{{ medicine() }}
|
|
{% endif %}
|
|
|
|
{% if value1 is not none %}
|
|
{{ value1 | default }}
|
|
{% endif %}
|
|
|
|
{# call a Random fact about the house or inspiration quote #}
|
|
{{ ([moon, holiday, days_until, fact_of_the_day]|random)() }}
|
|
]
|
|
[Previous broadcast for context: "{{ state_attr('sensor.openai_response', 'response') }}" ]
|
|
|
|
{%- endmacro -%}
|
|
{{- cleanup(mother_of_all_macros()) -}}
|