Compare commits

...

16 Commits

Author SHA1 Message Date
b48380d152 Starting to dig into Speech Engine...annnnnd holy shit 2025-03-22 17:58:59 -04:00
d649d0fa5c More variable scripts 2025-03-22 17:58:58 -04:00
abd30f7ff2 Figuring out a way to still use notify groups for this rewrite 2025-03-22 17:58:56 -04:00
c32c751e97 "get_room_lights" script 2025-03-22 17:58:55 -04:00
177c4a9a51 Start adding routing to speech engine. Not functional yet. 2025-03-22 17:58:54 -04:00
ec8e22513c "get room services" script 2025-03-22 17:58:52 -04:00
49f9e99439 Add warnings for considerable destructive t-storm, confirmed tornado 2025-03-19 17:11:34 -04:00
6254fb5953 Track new weather alert sensors for long-term stats 2025-03-18 01:38:17 -04:00
334b7963e8 Add ability to show when tornado production is possible 2025-03-18 01:37:52 -04:00
4466b17df1 Update .HA_VERSION 2025-03-17 16:12:03 -04:00
f96056edda Use correct sensor for master bedroom temperature in welcome home brief 2025-03-16 04:16:44 -04:00
652b4e7dff Additional editing added for weather briefing 2025-03-16 04:16:16 -04:00
26bcf136e6 Update med scripts to use AI-generated snark 2025-03-14 02:14:46 -04:00
9e90998a21 Update Kallen morning meds script, he can now mark morning meds himself 2025-03-14 00:59:22 -04:00
30c8307272 Improve aircon fan/compressor template sensors 2025-03-14 00:19:26 -04:00
e6b0db142e Update .HA_VERSION 2025-03-14 00:18:59 -04:00
8 changed files with 577 additions and 224 deletions

View File

@ -1 +1 @@
2025.3.1 2025.3.3

View File

@ -321,6 +321,9 @@ influxdb:
- sensor.dimmest_room - sensor.dimmest_room
- sensor.warmest_room_temperature - sensor.warmest_room_temperature
- sensor.coldest_room_temperature - sensor.coldest_room_temperature
- sensor.national_tornado_warnings
- sensor.national_severe_thunderstorm_warnings
- binary_sensor.severe_thunderstorm_warning
logbook: logbook:
include: include:
@ -498,3 +501,6 @@ prometheus:
- sensor.dimmest_room - sensor.dimmest_room
- sensor.warmest_room_temperature - sensor.warmest_room_temperature
- sensor.coldest_room_temperature - sensor.coldest_room_temperature
- sensor.national_tornado_warnings
- sensor.national_severe_thunderstorm_warnings
- binary_sensor.severe_thunderstorm_warning

View File

@ -19,6 +19,17 @@
{% if type in ['alerts','full'] %} {% if type in ['alerts','full'] %}
{% if is_state('input_boolean.tornado_alarm','on') %} {% if is_state('input_boolean.tornado_alarm','on') %}
We are under a tornado warning. If you are not already in shelter, you should be. Get on it! We are under a tornado warning. If you are not already in shelter, you should be. Get on it!
{% if state_attr('binary_sensor.tornado_warning','confirmed' == true) %}
A tornado has been confirmed in the area. Please take shelter immediately!
{% endif %}
{% elif is_state('binary_sensor.severe_thunderstorm_warning','on') %}
We are under a severe thunderstorm warning.
{% if state_attr('binary_sensor.severe_thunderstorm_warning','tornado_possible' == true) %}
The incoming storm has the potential to produce a tornado, so please pay attention and prepare to take shelter!
{% endif %}
{% if state_attr('binary_sensor.severe_thunderstorm_warning','considerable_destructive' == true) %}
This storm has the potential to cause considerable damage. Please take shelter and stay safe!
{% endif %}
{% elif states('sensor.weatheralerts_active_alerts') > '0' and method != 'dashboard' %} {% elif states('sensor.weatheralerts_active_alerts') > '0' and method != 'dashboard' %}
Current weather alerts: {{ states('sensor.weather_alert_string') }}. Current weather alerts: {{ states('sensor.weather_alert_string') }}.
{% endif %} {% endif %}
@ -49,6 +60,17 @@
{% endif %} {% endif %}
{% if is_state('input_boolean.tornado_alarm','on') %} {% if is_state('input_boolean.tornado_alarm','on') %}
"We are under a tornado warning. If you are not already in shelter, you should be. Get on it! " "We are under a tornado warning. If you are not already in shelter, you should be. Get on it! "
{% if state_attr('binary_sensor.tornado_warning','confirmed' == true) %}
"A tornado has been confirmed in the area. Please take shelter immediately! "
{% endif %}
{% elif is_state('binary_sensor.severe_thunderstorm_warning','on') %}
"We are under a severe thunderstorm warning. "
{% if state_attr('binary_sensor.severe_thunderstorm_warning','tornado_possible' == true) %}
"The incoming storm has the potential to produce a tornado, so please pay attention and prepare to take shelter! "
{% endif %}
{% if state_attr('binary_sensor.severe_thunderstorm_warning','considerable_destructive' == true) %}
"This storm has the potential to cause considerable damage. Please take shelter and stay safe! "
{% endif %}
{% elif is_state('input_boolean.tornado_watch','on') %} {% elif is_state('input_boolean.tornado_watch','on') %}
{{ [ {{ [
"There is currently a tornado watch active. Please keep an eye on the sky and your local weather reports. ", "There is currently a tornado watch active. Please keep an eye on the sky and your local weather reports. ",
@ -106,7 +128,8 @@
{{ weatherInfo(type,method,time) | {{ weatherInfo(type,method,time) |
replace('clear-night','clear') | replace('clear-night','clear') |
replace('partlycloudy','partly cloudy') | replace('partlycloudy','partly cloudy') |
replace('snowy-rainy','a mix of rain and snow') }} replace('snowy-rainy','a mix of rain and snow') |
replace('lightning-rainy','stormy') }}
{% endmacro %} {% endmacro %}
{{ cleanup(data()) }} {{ cleanup(data()) }}
{% endmacro %} {% endmacro %}

View File

@ -2,19 +2,23 @@ template:
- binary_sensor: - binary_sensor:
- name: Emma Aircon - Compressor - name: Emma Aircon - Compressor
unique_id: 21bcbb62-823c-43ff-8c2c-26e940324ee6 unique_id: 21bcbb62-823c-43ff-8c2c-26e940324ee6
state: "{{ is_state('fan.emma_air_conditioner','on') and states('sensor.emma_air_conditioner_power') | int > 150 }}" state: "{{ states('sensor.emma_air_conditioner_power') | int > 150 }}"
availability: "{{ states('fan.emma_air_conditioner') not in ['unknown','unavailable'] }}"
device_class: running device_class: running
- name: Emma Aircon - Fan - name: Emma Aircon - Fan
unique_id: 9e3054cf-8f7e-4fef-9da4-5b2f2bc99c9d unique_id: 9e3054cf-8f7e-4fef-9da4-5b2f2bc99c9d
state: "{{ is_state('fan.emma_air_conditioner','on') and states('sensor.emma_air_conditioner_power') | int > 20 }}" state: "{{ states('sensor.emma_air_conditioner_power') | int > 20 }}"
availability: "{{ states('fan.emma_air_conditioner') not in ['unknown','unavailable'] }}"
device_class: running device_class: running
- name: Master Bedroom Aircon - Compressor - name: Master Bedroom Aircon - Compressor
unique_id: 87051957-1dbc-4d65-b138-e8469728f58f unique_id: 87051957-1dbc-4d65-b138-e8469728f58f
state: "{{ states('climate.master_bedroom_aircon') not in ['off','unknown','unavailable'] and states('sensor.master_bedroom_aircon_power') | int > 150 }}" state: "{{ states('sensor.master_bedroom_aircon_power') | int > 150 }}"
availability: "{{ states('climate.master_bedroom_aircon') not in ['unknown','unavailable'] }}"
device_class: running device_class: running
- name: Master Bedroom Aircon - Fan - name: Master Bedroom Aircon - Fan
unique_id: ae893dd6-129c-4886-a966-a89b958d9f08 unique_id: ae893dd6-129c-4886-a966-a89b958d9f08
state: "{{ states('climate.master_bedroom_aircon') not in ['off','unknown','unavailable'] and states('sensor.master_bedroom_aircon_power') | int > 20 }}" state: "{{ states('sensor.master_bedroom_aircon_power') | int > 20 }}"
availability: "{{ states('climate.master_bedroom_aircon') not in ['unknown','unavailable'] }}"
device_class: running device_class: running
- name: Kallen Fan - Separate Schedule - name: Kallen Fan - Separate Schedule
unique_id: 3f243861-6a1f-412f-b9e3-933b54793b08 unique_id: 3f243861-6a1f-412f-b9e3-933b54793b08

View File

@ -980,7 +980,33 @@ script:
- critical - critical
variables: variables:
voice: "{{ states('input_select.jarvis_voice') }}" voice: "{{ states('input_select.jarvis_voice') }}"
groupname: >-
{% if who == 'kids_bedrooms' %}
kids_bedroom_speakers
{% elif who == 'all_bedrooms' %}
all_bedroom_speakers
{% elif who == 'basement' and is_state('input_boolean.studio_quiet','on') %}
alexa_no_basement
{% else %}
{{ who }}
{% endif %}
sequence: sequence:
- service: script.get_room_speakers
data:
room: "{{ who }}"
response_variable: "get_room_speakers"
- choose:
- conditions: "{{ who in ['everywhere','Everywhere'] }}"
sequence:
- service: script.get_all_speakers
response_variable: "get_all_speakers"
- conditions: "{{ get_room_speakers.jarvis_tts == 'group' }}"
sequence:
- service: script.get_group_speakers
data:
group: "{{ who }}"
response_variable: "get_group_speakers"
# Need to figure out whether to do this part here, or in alexa/jarvis voice scripts, or both
- service: mqtt.publish - service: mqtt.publish
data: data:
topic: 'house/polly/lastmsg' topic: 'house/polly/lastmsg'
@ -1024,44 +1050,13 @@ script:
- service: >- - service: >-
{% if voice == 'nabu' %} {% if voice == 'nabu' %}
script.nabu_voice script.nabu_voice
{% elif who in ['living_room_echo_dot', 'media_player.living_room_echo_dot','living_room','Living Room Echo Dot','Living Room'] %} {% elif get_room_services.jarvis_tts in ['group','alexa'] %}
script.alexa_voice
{% elif who in ['kallen_bedroom','Kallen Bedroom'] %}
{% if is_state('input_boolean.kallen_sleeping','on') and type not in ['critical','Critical'] %}
script.alexa_voice script.alexa_voice
{% else %} {% else %}
script.jarvis_voice script.jarvis_voice
{% endif %} {% endif %}
{% elif who in ['emma_bedroom','Emma Bedroom'] %}
{% if is_state('input_boolean.emma_sleeping','on') and type not in ['critical','Critical'] %}
script.alexa_voice
{% else %}
script.jarvis_voice
{% endif %}
{% elif who in ['master_bedroom','master_bedroom_echo_dot','media_player.master_bedroom_echo_dot','Master Bedroom Echo Dot','Master Bedroom'] %}
script.alexa_voice
{% elif who in ['kids_bedrooms','Kids Bedrooms'] %}
script.jarvis_voice
{% elif who in ['all_bedrooms','All Bedrooms'] %}
script.alexa_voice
{% elif who in ['Basement','basement','basement_echo_dot','media_player.basement_echo_dot','Basement Echo Dot'] %}
script.alexa_voice
{% elif who in ['Basement Google','basement_google'] %}
{% if is_state('input_boolean.studio_quiet','on') %}
script.alexa_voice
{% else %}
script.jarvis_voice
{% endif %}
{% elif who in ['Common Areas','common','common_areas'] %}
script.alexa_voice
{% elif who in ['alexa_everywhere','Alexa Everywhere'] %}
script.alexa_voice
{% elif who in ['Everywhere','everywhere'] %}
script.alexa_voice
{% else %}
script.alexa_voice
{% endif %}
data: data:
# Work on where this redirect logic should go
who: > who: >
{% if who in ['living_room_echo_dot', 'media_player.living_room_echo_dot','living_room','Living Room Echo Dot','Living Room'] %} {% if who in ['living_room_echo_dot', 'media_player.living_room_echo_dot','living_room','Living Room Echo Dot','Living Room'] %}
living_room living_room
@ -1138,7 +1133,7 @@ script:
type: '{{ type }}' type: '{{ type }}'
- if: - if:
- condition: template - condition: template
value_template: "{{ who in ['Everywhere','everywhere','all_bedrooms','All Bedrooms','kids_bedrooms','Kids Bedrooms'] }}" value_template: "{{ get_room_speakers.jarvis_tts == 'group' and get_group_speakers.google is defined }}"
then: then:
- service: script.jarvis_voice - service: script.jarvis_voice
data: data:

126
packages/variables.yaml Normal file
View File

@ -0,0 +1,126 @@
script:
get_room_speakers:
alias: Get Room Speakers
sequence:
- variables:
room_services: >-
{% if room in areas() %}
{% set alexa_speaker = states.media_player |
selectattr('entity_id', 'in', area_entities(room)) |
rejectattr('attributes.last_called', 'undefined') |
selectattr('entity_id', 'search', 'echo_dot') |
map(attribute='entity_id') |
list | first %}
{% set google_speaker = states.media_player |
selectattr('entity_id', 'in', area_entities(room)) |
rejectattr('attributes.device_class', 'undefined') |
selectattr('attributes.device_class', 'search', '(speaker)') |
selectattr('entity_id', 'search', 'google') |
map(attribute='entity_id') |
list | first %}
{% set tts = "alexa" if alexa_speaker is defined else "google" %}
{% else %}
{% set tts = "group" %}
{% endif %}
{"area":"{{room}}","alexa_speaker":"{{alexa_speaker|default({}) }}","jarvis_tts":"{{tts|default("google") }}","google_speaker":"{{google_speaker|default({}) }}"}
- stop: "Services acquired"
response_variable: "get_room_speakers"
get_group_speakers:
alias: Get Group Speakers
sequence:
- variables:
get_group_speakers: >-
{% set speakers = expand('group.' + group) | map(attribute='entity_id') | list | join(',') %}
{% set alexa_speakers = expand('group.' + group) |
rejectattr('attributes.last_called', 'undefined') |
selectattr('entity_id', 'search', 'echo_dot') |
map(attribute='entity_id') |
list | join(',') %}
{% set google_speakers = expand('group.' + group) |
rejectattr('attributes.device_class', 'undefined') |
selectattr('attributes.device_class', 'search', '(speaker)') |
selectattr('entity_id', 'search', 'google') |
map(attribute='entity_id') |
list | join(',') %}
{"alexa":"{{alexa_speakers|default({})}}","google":"{{google_speakers|default({})}}"}
- stop: "Speakers acquired"
response_variable: "get_group_speakers"
get_echo_dots:
alias: Get Echo Dots
sequence:
- variables:
get_echo_dots: >-
{% if group is defined %}
{% set speakers = expand('group.' + group) %}
{% else %}
{% set speakers = states.media_player %}
{% endif %}
{% set echo_dots = speakers |
rejectattr('attributes.last_called', 'undefined') |
selectattr('entity_id', 'search', 'echo_dot') |
map(attribute='entity_id') |
list | join(',') %}
{"speakers":"{{echo_dots}}"}
- stop: "Echo Dots acquired"
response_variable: "get_echo_dots"
get_google_speakers:
alias: Get Google Speakers
sequnce:
- variables:
get_google_speakers: >-
{% if group is defined %}
{% set speakers = expand('group.' + group) %}
{% else %}
{% set speakers = states.media_player %}
{% endif %}
{% set google_speaker = speakers |
rejectattr('attributes.device_class', 'undefined') |
selectattr('attributes.device_class', 'search', '(speaker)') |
selectattr('entity_id', 'search', 'google') |
map(attribute='entity_id') |
list | join(',') %}
{"speakers":"{{google_speaker}}"}
- stop: "Google speakers acquired"
response_variable: "get_google_speakers"
get_all_speakers:
alias: Get All Speakers
sequence:
- variables: >-
get_speakers:
{% set alexa_speaker = states.media_player |
rejectattr('attributes.last_called', 'undefined') |
selectattr('entity_id', 'search', 'echo_dot') |
map(attribute='entity_id')
%}
{% set google_speaker = states.media_player |
rejectattr('attributes.device_class', 'undefined') |
selectattr('attributes.device_class', 'search', '(speaker)') |
selectattr('entity_id', 'search', 'google') |
map(attribute='entity_id')
%}
{% set alexa_list = alexa_speaker | list | join(',') %}
{% set google_list = google_speaker | list | join(',') %}
{% set all_speakers = alexa_list + ',' + google_list %}
{"all_speakers":"{{all_speakers}}"}
get_room_lights:
alias: Get Room Lights
sequence:
- variables:
area: >
{{ room }}
entities: >
{% set lights = states.light |
selectattr('entity_id', 'in', area_entities(area)) |
map(attribute='entity_id') |
list | join(',') %}
{"lights":"{{lights}}"}
- stop: "Lights acquired"
response_variable: "entities"

View File

@ -1663,6 +1663,32 @@ tony_morning_meds:
tag: tony-morning-meds tag: tony-morning-meds
alias: Clear previous morning notification alias: Clear previous morning notification
action: script.text_notify action: script.text_notify
- alias: Send notifications, using AI if internet is connected
if:
- condition: state
entity_id: binary_sensor.internet
state: 'on'
then:
- alias: Generate reminder, be snarky if it's been several times
if:
- condition: numeric_state
entity_id: counter.tony_morning_meds_reminder_count
above: 2
then:
- action: google_generative_ai_conversation.generate_content
metadata: {}
data:
prompt: Remind Tony to take his morning meds. Use a maximum of two lines.
Be snarky, because at this point he's been reminded multiple times.
response_variable: response
alias: Generate snarky reminder
else:
- action: google_generative_ai_conversation.generate_content
metadata: {}
data:
prompt: Remind Tony to take his morning meds. Use a maximum of two lines.
response_variable: response
alias: Generate reminder
- delay: - delay:
hours: 0 hours: 0
minutes: 0 minutes: 0
@ -1675,7 +1701,7 @@ tony_morning_meds:
who: tony who: tony
type: alert type: alert
title: Morning Meds title: Morning Meds
message: You need to take your morning meds message: '{{ response.text }}'
tag: tony-morning-meds tag: tony-morning-meds
actions: actions:
- action: TONY_MORNING_MEDS_TAKEN - action: TONY_MORNING_MEDS_TAKEN
@ -1685,7 +1711,7 @@ tony_morning_meds:
action: script.text_notify action: script.text_notify
- alias: Send TTS if reminders > 2 and Tony is home - alias: Send TTS if reminders > 2 and Tony is home
if: if:
- alias: If reminders > 2 and Tony is home - alias: When reminders > 2 and Tony is home
condition: and condition: and
conditions: conditions:
- condition: numeric_state - condition: numeric_state
@ -1700,10 +1726,50 @@ tony_morning_meds:
- data: - data:
who: common_areas who: common_areas
type: alert type: alert
message: Tony, you need to take your morning meds. This is reminder number message: '{{ response.text }}'
{{ states('counter.tony_morning_meds_reminder_count') }} for today.
alias: Send TTS notification alias: Send TTS notification
action: script.speech_engine action: script.speech_engine
else:
- delay:
hours: 0
minutes: 0
seconds: 5
milliseconds: 0
- alias: Send morning notifications via text, and TTS if needed
parallel:
- alias: Send text notification
data:
who: tony
type: alert
title: Morning Meds
tag: tony-morning-meds
actions:
- action: TONY_MORNING_MEDS_TAKEN
title: Taken
- action: TONY_MORNING_MEDS_SKIPPED
title: Skip
message: You need to take your morning meds
action: script.text_notify
- alias: Send TTS if reminders > 2 and Tony is home
if:
- alias: When reminders > 2 and Tony is home
condition: and
conditions:
- condition: numeric_state
entity_id: counter.tony_morning_meds_reminder_count
above: 2
alias: When reminder count > 2
- condition: state
entity_id: person.tony_stork
state: home
alias: If Tony is home
then:
- alias: Send TTS notification
data:
who: common_areas
type: alert
message: Tony, you need to take your morning meds
action: script.speech_engine
tony_night_meds: tony_night_meds:
alias: Tony Night Meds alias: Tony Night Meds
icon: mdi:medication icon: mdi:medication
@ -1904,6 +1970,32 @@ tony_afternoon_meds:
tag: tony-afternoon-meds tag: tony-afternoon-meds
alias: Clear previous afternoon notification alias: Clear previous afternoon notification
action: script.text_notify action: script.text_notify
- alias: Send notifications, using AI if internet is connected
if:
- condition: state
entity_id: binary_sensor.internet
state: 'on'
then:
- alias: Generate reminder, be snarky if it's been several times
if:
- condition: numeric_state
entity_id: counter.tony_afternoon_meds_reminder_count
above: 2
then:
- action: google_generative_ai_conversation.generate_content
metadata: {}
data:
prompt: Remind Tony to take his afternoon meds. Use a maximum of two lines.
Be snarky, because at this point he's been reminded multiple times.
response_variable: response
alias: Generate snarky reminder
else:
- action: google_generative_ai_conversation.generate_content
metadata: {}
data:
prompt: Remind Tony to take his afternoon meds. Use a maximum of two lines.
response_variable: response
alias: Generate reminder
- delay: - delay:
hours: 0 hours: 0
minutes: 0 minutes: 0
@ -1916,7 +2008,7 @@ tony_afternoon_meds:
who: tony who: tony
type: alert type: alert
title: Afternoon Meds title: Afternoon Meds
message: You need to take your afternoon meds message: '{{ response.text }}'
tag: tony-afternoon-meds tag: tony-afternoon-meds
actions: actions:
- action: TONY_AFTERNOON_MEDS_TAKEN - action: TONY_AFTERNOON_MEDS_TAKEN
@ -1941,10 +2033,50 @@ tony_afternoon_meds:
- data: - data:
who: common_areas who: common_areas
type: alert type: alert
message: Tony, you need to take your afternoon meds. This is reminder number message: '{{ response.text }}'
{{ states('counter.tony_afternoon_meds_reminder_count') }} for today.
alias: Send TTS notification alias: Send TTS notification
action: script.speech_engine action: script.speech_engine
else:
- delay:
hours: 0
minutes: 0
seconds: 5
milliseconds: 0
- alias: Send afternoon notifications via text, and TTS if needed
parallel:
- alias: Send text notification
data:
who: tony
type: alert
title: Afternoon Meds
tag: tony-afternoon-meds
actions:
- action: TONY_AFTERNOON_MEDS_TAKEN
title: Taken
- action: TONY_AFTERNOON_MEDS_SKIPPED
title: Skip
message: You need to take your afternoon meds
action: script.text_notify
- alias: Send TTS if reminders > 2 and Tony is home
if:
- alias: When reminders > 2 and Tony is home
condition: and
conditions:
- condition: numeric_state
entity_id: counter.tony_afternoon_meds_reminder_count
above: 2
alias: When reminder count > 2
- condition: state
entity_id: person.tony_stork
state: home
alias: If Tony is home
then:
- alias: Send TTS notification
data:
who: common_areas
type: alert
message: Tony, you need to take your afternoon meds
action: script.speech_engine
tony_ibuprofen: tony_ibuprofen:
alias: Tony Ibuprofen alias: Tony Ibuprofen
sequence: sequence:
@ -2308,56 +2440,37 @@ tony_tylenol:
kallen_morning_meds: kallen_morning_meds:
alias: Kallen Morning Meds alias: Kallen Morning Meds
sequence: sequence:
- service: counter.increment - metadata: {}
metadata: {}
data: {} data: {}
target: target:
entity_id: counter.kallen_morning_meds_reminder_count entity_id: counter.kallen_morning_meds_reminder_count
alias: Increment morning reminder counter alias: Increment morning reminder counter
- alias: Clear previous morning notifications action: counter.increment
parallel: - alias: Clear previous text notifications
- service: script.text_notify
data: data:
type: alert type: alert
who: parents who: all
message: clear_notification message: clear_notification
tag: kallen-morning-meds-parents tag: kallen-morning-meds
alias: Clear for parents action: script.text_notify
- service: script.text_notify
data:
type: alert
who: kallen
message: clear_notification
tag: kallen-morning-meds-self
alias: Clear for Kallen
- delay: - delay:
hours: 0 hours: 0
minutes: 0 minutes: 0
seconds: 5 seconds: 5
milliseconds: 0 milliseconds: 0
- alias: Send text notifications - alias: Send text notification
parallel:
- alias: Send to parents
service: script.text_notify
data: data:
who: parents who: all
type: alert type: alert
title: Morning Meds title: Morning Meds
message: Kallen needs to take his morning meds message: Kallen needs to take his morning meds
tag: kallen-morning-meds-parents tag: kallen-morning-meds
actions: actions:
- action: KALLEN_MORNING_MEDS_TAKEN - action: KALLEN_MORNING_MEDS_TAKEN
title: Taken title: Taken
- action: KALLEN_MORNING_MEDS_SKIPPED - action: KALLEN_MORNING_MEDS_SKIPPED
title: Skip title: Skip
- service: script.text_notify action: script.text_notify
data:
who: kallen
type: alert
title: Morning Meds
message: You need to take your morning meds. Go to mom or dad to confirm.
tag: kallen-morning-meds-self
alias: Send to Kallen
icon: mdi:medication icon: mdi:medication
mode: restart mode: restart
kallen_night_meds: kallen_night_meds:
@ -2929,75 +3042,163 @@ tina_morning_meds:
icon: mdi:medication icon: mdi:medication
mode: restart mode: restart
sequence: sequence:
- service: counter.increment - metadata: {}
metadata: {}
data: {} data: {}
target: target:
entity_id: counter.tina_morning_meds_reminder_count entity_id: counter.tina_morning_meds_reminder_count
alias: Increment morning reminder counter alias: Increment morning reminder counter
- service: script.text_notify action: counter.increment
data: - data:
type: alert type: alert
who: tina who: tina
message: clear_notification message: clear_notification
tag: tina-morning-meds tag: tina-morning-meds
alias: Clear previous morning notification alias: Clear previous morning notification
action: script.text_notify
- alias: Send notifications, using AI if internet is connected
if:
- condition: state
entity_id: binary_sensor.internet
state: 'on'
then:
- if:
- condition: numeric_state
entity_id: counter.tina_morning_meds_reminder_count
above: 2
then:
- action: google_generative_ai_conversation.generate_content
metadata: {}
data:
prompt: Remind Tina to take her morning meds. Use a maximum of two lines.
Be snarky, because at this point she's been reminded multiple times.
response_variable: response
alias: Generate snarky reminder
else:
- action: google_generative_ai_conversation.generate_content
metadata: {}
data:
prompt: Remind Tina to take her morning meds. Use a maximum of two lines.
response_variable: response
alias: Generate reminder
alias: Generate reminder, be snarky if it's been several times
- delay: - delay:
hours: 0 hours: 0
minutes: 0 minutes: 0
seconds: 5 seconds: 5
milliseconds: 0 milliseconds: 0
- alias: Send text notification - alias: Send text notification
service: script.text_notify
data: data:
who: tina who: tina
type: alert type: alert
title: Morning Meds title: Morning Meds
message: You need to take your morning meds message: '{{ response.text }}'
tag: tina-morning-meds tag: tina-morning-meds
actions: actions:
- action: TINA_MORNING_MEDS_TAKEN - action: TINA_MORNING_MEDS_TAKEN
title: Taken title: Taken
- action: TINA_MORNING_MEDS_SKIPPED - action: TINA_MORNING_MEDS_SKIPPED
title: Skip title: Skip
description: '' action: script.text_notify
tina_night_meds: else:
alias: Tina Night Meds - delay:
icon: mdi:medication hours: 0
mode: restart minutes: 0
sequence: seconds: 5
- service: counter.increment milliseconds: 0
metadata: {} - alias: Send text notification
data: {} data:
target: who: tina
entity_id: counter.tina_night_meds_reminder_count type: alert
alias: Increment night reminder counter title: Morning Meds
- service: script.text_notify tag: tina-morning-meds
data: actions:
type: alert - action: TINA_MORNING_MEDS_TAKEN
who: tina title: Taken
message: clear_notification - action: TINA_MORNING_MEDS_SKIPPED
tag: tina-night-meds title: Skip
alias: Clear previous night notification message: You need to take your morning meds
action: script.text_notify
tina_night_meds:
alias: Tina Night Meds
icon: mdi:medication
mode: restart
sequence:
- metadata: {}
data: {}
target:
entity_id: counter.tina_night_meds_reminder_count
alias: Increment night reminder counter
action: counter.increment
- data:
type: alert
who: tina
message: clear_notification
tag: tina-night-meds
alias: Clear previous night notification
action: script.text_notify
- alias: Send notifications, using AI if internet is connected
if:
- condition: state
entity_id: binary_sensor.internet
state: 'on'
then:
- if:
- condition: numeric_state
entity_id: counter.tina_night_meds_reminder_count
above: 2
then:
- action: google_generative_ai_conversation.generate_content
metadata: {}
data:
prompt: Remind Tina to take her night meds. Use a maximum of two lines.
Be snarky, because at this point she's been reminded multiple times.
response_variable: response
alias: Generate snarky reminder
else:
- action: google_generative_ai_conversation.generate_content
metadata: {}
data:
prompt: Remind Tina to take her night meds. Use a maximum of two lines.
response_variable: response
alias: Generate reminder
alias: Generate reminder, be snarky if it's been several times
- delay: - delay:
hours: 0 hours: 0
minutes: 0 minutes: 0
seconds: 5 seconds: 5
milliseconds: 0 milliseconds: 0
- alias: Send text notification - alias: Send text notification
service: script.text_notify
data: data:
who: tina who: tina
type: alert type: alert
title: Night Meds title: Night Meds
message: You need to take your night meds message: '{{ response.text }}'
tag: tina-night-meds tag: tina-night-meds
actions: actions:
- action: TINA_NIGHT_MEDS_TAKEN - action: TINA_NIGHT_MEDS_TAKEN
title: Taken title: Taken
- action: TINA_NIGHT_MEDS_SKIPPED - action: TINA_NIGHT_MEDS_SKIPPED
title: Skip title: Skip
description: '' action: script.text_notify
else:
- delay:
hours: 0
minutes: 0
seconds: 5
milliseconds: 0
- alias: Send text notification
data:
who: tina
type: alert
title: Night Meds
tag: tina-night-meds
actions:
- action: TINA_NIGHT_MEDS_TAKEN
title: Taken
- action: TINA_NIGHT_MEDS_SKIPPED
title: Skip
message: You need to take your night meds
action: script.text_notify
tina_ibuprofen: tina_ibuprofen:
sequence: sequence:
- alias: Turn off boolean if this is a notification - alias: Turn off boolean if this is a notification

View File

@ -76,7 +76,7 @@
<p> <p>
{% if (states('sensor.climate_devices_installed') | int) > 0 %} {% if (states('sensor.climate_devices_installed') | int) > 0 %}
{% if is_state('input_boolean.master_bedroom_aircon_installed','on') %} {% if is_state('input_boolean.master_bedroom_aircon_installed','on') %}
"the master bedroom temperature is {{ states('sensor.master_bedroom_aircon_indoor_temperature') | int }} degrees. " "the master bedroom temperature is {{ states('sensor.master_bedroom_temperature') | int }} degrees. "
{% if not is_state('climate.master_bedroom_aircon','off') %} {% if not is_state('climate.master_bedroom_aircon','off') %}
{% if is_state('climate.master_bedroom_aircon','cool') %} {% if is_state('climate.master_bedroom_aircon','cool') %}
"and the master bedroom air conditioner is set for cooling to {{ state_attr('climate.master_bedroom_aircon','temperature') }} degrees. " "and the master bedroom air conditioner is set for cooling to {{ state_attr('climate.master_bedroom_aircon','temperature') }} degrees. "
@ -90,8 +90,6 @@
"and the master bedroom air conditioner is currently not speaking to me. Was it something I said? " "and the master bedroom air conditioner is currently not speaking to me. Was it something I said? "
{% endif %} {% endif %}
{% endif %} {% endif %}
{% elif is_state('input_boolean.master_bedroom_aircon_installed','off') %}
"There is no air conditioner or temperature sensor installed in the master bedroom. "
{% endif %} {% endif %}
{% if is_state('input_boolean.emma_bedroom_aircon_installed','on') and is_state('fan.emma_air_conditioner','on') %} {% if is_state('input_boolean.emma_bedroom_aircon_installed','on') and is_state('fan.emma_air_conditioner','on') %}
"Emma's air conditioner is {{ states('fan.emma_air_conditioner') }}. " "Emma's air conditioner is {{ states('fan.emma_air_conditioner') }}. "