Compare commits

..

12 Commits

7 changed files with 236 additions and 123 deletions

View File

@ -1 +1 @@
2025.3.4
2025.4.2

View File

@ -311,102 +311,118 @@
- id: '1651787468337'
alias: Reboot handling
description: ''
trigger:
- platform: homeassistant
event: start
triggers:
- event: start
id: hass_start
- platform: homeassistant
event: shutdown
trigger: homeassistant
- event: shutdown
id: hass_stop
condition: []
action:
- if:
- condition: trigger
id: hass_start
alias: Startup
then:
- delay:
hours: 0
minutes: 1
seconds: 0
milliseconds: 0
- service: automation.turn_on
data: {}
target:
entity_id:
- automation.family_has_arrived
- automation.family_has_left
- automation.scheduled_alarm_rearm
- automation.scheduled_alarm_disarm
- service: switch.turn_off
target:
entity_id:
- switch.presence_simulation
data: {}
- if:
- condition: and
conditions:
- condition: state
entity_id: input_boolean.holiday_mode
state: 'on'
alias: Is holiday mode on?
trigger: homeassistant
conditions: []
actions:
- alias: Routing
choose:
- conditions:
- condition: trigger
id: hass_start
alias: Startup
sequence:
- delay:
hours: 0
minutes: 1
seconds: 0
milliseconds: 0
- data: {}
target:
entity_id:
- automation.family_has_arrived
- automation.family_has_left
- automation.scheduled_alarm_rearm
- automation.scheduled_alarm_disarm
action: automation.turn_on
- if:
- condition: state
entity_id: binary_sensor.early_night_mode
state: 'on'
alias: Is early night mode on?
alias: Test conditions
then:
- service: switch.turn_on
state: 'off'
then:
- action: input_boolean.turn_off
metadata: {}
data: {}
target:
entity_id:
- input_boolean.give_me_darkness
- input_boolean.night_mode
- input_boolean.goodnight
alias: If early night mode is off, turn off other night-related modes
- target:
entity_id:
- switch.presence_simulation
data: {}
action: switch.turn_off
- if:
- condition: and
conditions:
- condition: state
entity_id: input_boolean.holiday_mode
state: 'on'
alias: Is holiday mode on?
- condition: state
entity_id: binary_sensor.early_night_mode
state: 'on'
alias: Is early night mode on?
alias: Test conditions
then:
- data: {}
target:
entity_id: switch.animated_scene_{{ states('input_select.holiday_animation')
| lower }}
alias: Turn on the appropriate animated holiday scene
action: switch.turn_on
alias: Turn on animated holiday scene if night time and holiday mode is on
- data: {}
action: script.tony_desktop_refresh
- data: {}
action: script.tina_desktop_refresh
- data: {}
action: script.asus_laptop_refresh
- data: {}
action: script.kallen_desktop_refresh
- data: {}
action: script.win10vm_refresh
- data:
topic: house/basement/server/glances
payload: restart
qos: 0
retain: false
alias: Restart Glances via MQTT
action: mqtt.publish
- data: {}
alias: Reset all speaker volumes
action: script.volume_reset
- if:
- condition: state
entity_id: input_boolean.studio_quiet
state: 'off'
then:
- data:
who: basement
call_ha_started: 1
action: script.status_annc
else:
- stop: Studio has requested quiet, and Jarvis respects this
alias: Announce back online, unless studio has requested quiet
- conditions:
- condition: trigger
id: hass_stop
alias: Shutdown
sequence:
- data:
stop_actions: true
target:
entity_id: switch.animated_scene_{{ states('input_select.holiday_animation')
| lower }}
alias: Turn on the appropriate animated holiday scene
alias: Turn on animated holiday scene if night time and holiday mode is on
- service: script.tony_desktop_refresh
data: {}
- service: script.tina_desktop_refresh
data: {}
- service: script.asus_laptop_refresh
data: {}
- service: script.kallen_desktop_refresh
data: {}
- service: script.win10vm_refresh
data: {}
- service: mqtt.publish
data:
topic: house/basement/server/glances
payload: restart
qos: 0
retain: false
alias: Restart Glances via MQTT
- service: script.volume_reset
data: {}
alias: Reset all speaker volumes
- if:
- condition: state
entity_id: input_boolean.studio_quiet
state: 'off'
then:
- service: script.status_annc
data:
who: basement
call_ha_started: 1
else:
- stop: Studio has requested quiet, and Jarvis respects this
alias: Announce back online, unless studio has requested quiet
- if:
- condition: trigger
id: hass_stop
alias: Shutdown
then:
- service: automation.turn_off
data:
stop_actions: true
target:
entity_id:
- automation.family_has_arrived
- automation.family_has_left
entity_id:
- automation.family_has_arrived
- automation.family_has_left
action: automation.turn_off
mode: queued
- id: '1654547257475'
alias: Battery Monitoring

View File

@ -12,21 +12,62 @@
{% endif %}
{% endmacro %}
{% macro period_str(team) %}
{% if state_attr(team,'league') in ['NFL','NCAAF'] %}
quarter
{% elif state_attr(team,'league') == 'MLB' %}
inning
{% else %}
period
{% endif %}
{% endmacro %}
{% macro sports_clock(team) %}
{% macro data() %}
{% set period_str = period_str(team) %}
{% set game_clock = state_attr(team,'clock') | lower %}
{% if state_attr(team,'league') == 'MLB' %}
{% set inning_parts = game_clock.split(' ') %}
in the {{ inning_parts[0] ~ ' of the ' ~ inning_parts[1] ~ ' ' ~ period_str }}
{% else %}
{% if ' - ' in game_clock %}
{% set clock_time, quarter = game_clock.split(' - ') %}
with {{ clock_time ~ ' remaining in the ' ~ quarter ~ ' ' ~ period_str }}
{% else %}
with {{ game_clock ~ ' remaining in the ' ~ period_str }}
{% endif %}
{% endif %}
{% endmacro %}
{{ cleanup(data()) }}
{% endmacro %}
{% macro sports_pregame(team) %}
{% macro data() %}
{% if state_attr(team,'opponent_name') %}
{% set opponent_name = state_attr(team, 'opponent_name') %}
{% if opponent_name.endswith(' St') %}
{% set opponent_name = opponent_name | replace(' St', ' State') %}
{% endif %}
{% endif %}
{% if is_state(team,'PRE') %}
{% set date = state_attr(team,'date') | as_timestamp | timestamp_custom('%m-%d') %}
{% if date == now().strftime('%m-%d') %}
The {{ state_attr(team,'friendly_name') }} will be playing today against {% if state_attr(team,'league') != 'NCAAF'%}the{% endif %} {{ state_attr(team,'opponent_name') }} at {{ state_attr(team,'venue') }}.
The {{ state_attr(team,'friendly_name') }} will be playing today against {% if state_attr(team,'league') != 'NCAAF'%}the{% endif %} {{ opponent_name }} at {{ state_attr(team,'venue') }}.
{{ sports_str(team,'start') }} is at {{ state_attr(team,'date') | as_timestamp | timestamp_custom('%I:%M %p') }}.
{% endif %}
{% endif %}
{% endmacro%}
{% endmacro %}
{{ cleanup(data()) }}
{% endmacro %}
{% macro sports_main(team) %}
{% macro data() %}
{% if state_attr(team,'opponent_name') %}
{% set opponent_name = state_attr(team, 'opponent_name') %}
{% if opponent_name.endswith(' St') %}
{% set opponent_name = opponent_name | replace(' St', ' State') %}
{% endif %}
{% endif %}
{% if is_state(team,'POST') %}
{% set date = state_attr(team,'date') | as_timestamp | timestamp_custom('%m-%d') %}
{% set yday = (as_timestamp(now()) - (24*3600)) | timestamp_custom('%m-%d') %}
@ -34,11 +75,11 @@
{% if state_attr(team,'clock') in ['postponed','Postponed'] %}
The {{ state_attr(team,'friendly_name') }} had their game postponed today, and it will be played at a later date.
{% elif (state_attr(team,'team_score') | int) == state_attr(team,'opponent_score') | int %}
The {{ state_attr(team,'friendly_name') }} tied in their game today against {% if state_attr(team,'league') != 'NCAAF'%}the{% endif %} {{ state_attr(team,'opponent_name') }} by a score of {{ state_attr(team,'team_score') }} to {{ state_attr(team,'opponent_score') }}.
The {{ state_attr(team,'friendly_name') }} tied in their game today against {% if state_attr(team,'league') != 'NCAAF'%}the{% endif %} {{ opponent_name }} by a score of {{ state_attr(team,'team_score') }} to {{ state_attr(team,'opponent_score') }}.
{% elif state_attr(team,'team_winner') == true %}
The {{ state_attr(team,'friendly_name') }} won their game today against {% if state_attr(team,'league') != 'NCAAF'%}the{% endif %} {{ state_attr(team,'opponent_name') }} by a score of {{ state_attr(team,'team_score') }} to {{ state_attr(team,'opponent_score') }}.
The {{ state_attr(team,'friendly_name') }} won their game today against {% if state_attr(team,'league') != 'NCAAF'%}the{% endif %} {{ opponent_name }} by a score of {{ state_attr(team,'team_score') }} to {{ state_attr(team,'opponent_score') }}.
{% elif state_attr(team,'opponent_winner') == true %}
The {{ state_attr(team,'friendly_name') }} lost their game today against {% if state_attr(team,'league') != 'NCAAF'%}the{% endif %} {{ state_attr(team,'opponent_name') }} by a score of {{ state_attr(team,'opponent_score') }} to {{ state_attr(team,'team_score') }}.
The {{ state_attr(team,'friendly_name') }} lost their game today against {% if state_attr(team,'league') != 'NCAAF'%}the{% endif %} {{ opponent_name }} by a score of {{ state_attr(team,'opponent_score') }} to {{ state_attr(team,'team_score') }}.
{% endif %}
{% if state_attr(team,'clock') not in ['postponed','Postponed'] %}
This brings their record to {{ state_attr(team,'team_record') | replace("-"," and ") }} on the season.
@ -47,11 +88,11 @@
{% if state_attr(team,'clock') in ['postponed','Postponed'] %}
The {{ state_attr(team,'friendly_name') }} had their game postponed yesterday, and it will be played at a later date.
{% elif (state_attr(team,'team_score') | int) == state_attr(team,'opponent_score') | int %}
The {{ state_attr(team,'friendly_name') }} tied in their game yesterday against {% if state_attr(team,'league') != 'NCAAF'%}the{% endif %} {{ state_attr(team,'opponent_name') }} by a score of {{ state_attr(team,'team_score') }} to {{ state_attr(team,'opponent_score') }}.
The {{ state_attr(team,'friendly_name') }} tied in their game yesterday against {% if state_attr(team,'league') != 'NCAAF'%}the{% endif %} {{ opponent_name }} by a score of {{ state_attr(team,'team_score') }} to {{ state_attr(team,'opponent_score') }}.
{% elif state_attr(team,'team_winner') == true %}
The {{ state_attr(team,'friendly_name') }} won their game yesterday against {% if state_attr(team,'league') != 'NCAAF'%}the{% endif %} {{ state_attr(team,'opponent_name') }} by a score of {{ state_attr(team,'team_score') }} to {{ state_attr(team,'opponent_score') }}.
The {{ state_attr(team,'friendly_name') }} won their game yesterday against {% if state_attr(team,'league') != 'NCAAF'%}the{% endif %} {{ opponent_name }} by a score of {{ state_attr(team,'team_score') }} to {{ state_attr(team,'opponent_score') }}.
{% elif state_attr(team,'opponent_winner') == true %}
The {{ state_attr(team,'friendly_name') }} lost their game yesterday against {% if state_attr(team,'league') != 'NCAAF'%}the{% endif %} {{ state_attr(team,'opponent_name') }} by a score of {{ state_attr(team,'opponent_score') }} to {{ state_attr(team,'team_score') }}.
The {{ state_attr(team,'friendly_name') }} lost their game yesterday against {% if state_attr(team,'league') != 'NCAAF'%}the{% endif %} {{ opponent_name }} by a score of {{ state_attr(team,'opponent_score') }} to {{ state_attr(team,'team_score') }}.
{% endif %}
{% if state_attr(team,'clock') not in ['postponed','Postponed'] %}
This brings their record to {{ state_attr(team,'team_record') | replace("-"," and ") }} on the season.
@ -59,11 +100,11 @@
{% endif %}
{% elif is_state(team,'IN') %}
{% if (state_attr(team,'team_score') | int) == (state_attr(team,'opponent_score') | int) %}
The {{ state_attr(team,'friendly_name') }} are currently tied in their game against {% if state_attr(team,'league') != 'NCAAF'%}the{% endif %} {{ state_attr(team,'opponent_name') }} with a score of {{ state_attr(team,'team_score') }} to {{ state_attr(team,'opponent_score') }}.
The {{ state_attr(team,'friendly_name') }} are currently tied in their game against {% if state_attr(team,'league') != 'NCAAF'%}the{% endif %} {{ opponent_name }} with a score of {{ state_attr(team,'team_score') }} to {{ state_attr(team,'opponent_score') }} {{ sports_clock(team) }}.
{% elif (state_attr(team,'team_score') | int) > (state_attr(team,'opponent_score') | int) %}
The {{ state_attr(team,'friendly_name') }} are currently winning their game against {% if state_attr(team,'league') != 'NCAAF'%}the{% endif %} {{ state_attr(team,'opponent_name') }} with a score of {{ state_attr(team,'team_score') }} to {{ state_attr(team,'opponent_score') }}.
The {{ state_attr(team,'friendly_name') }} are currently winning their game against {% if state_attr(team,'league') != 'NCAAF'%}the{% endif %} {{ opponent_name }} with a score of {{ state_attr(team,'team_score') }} to {{ state_attr(team,'opponent_score') }} {{ sports_clock(team) }}.
{% else %}
The {{ state_attr(team,'friendly_name') }} are currently losing their game against {% if state_attr(team,'league') != 'NCAAF'%}the{% endif %} {{ state_attr(team,'opponent_name') }} with a score of {{ state_attr(team,'opponent_score') }} to {{ state_attr(team,'team_score') }}.
The {{ state_attr(team,'friendly_name') }} are currently losing their game against {% if state_attr(team,'league') != 'NCAAF'%}the{% endif %} {{ opponent_name }} with a score of {{ state_attr(team,'opponent_score') }} to {{ state_attr(team,'team_score') }} {{ sports_clock(team) }}.
{% endif %}
{% endif %}
{% endmacro %}

View File

@ -31,8 +31,7 @@ tts:
region_name: 'us-east-1'
text_type: ssml
voice: Joanna
cache: true
engine: neural
engine: generative
conversation:

View File

@ -489,6 +489,7 @@ input_select:
- Evening Mode
- Night Mode
- Bright Mode
- Reading Mode
- Reset
initial: Select
icon: mdi:desk
@ -653,6 +654,21 @@ template:
{% endif %}
device_class: problem
delay_on: "00:00:10"
- name: Light Switch Issue
unique_id: 381e8038-ea96-474c-92ec-d1296dc1369e
state: >
{% set lights = states.light.upstairs_bathroom_lights,
states.light.hallway_overhead,
states.light.downstairs_bathroom_lights %}
{% set issues = lights | selectattr('state','eq','unavailable') | list | count %}
{{ issues > 0 }}
attributes:
issues: >
{% set lights = states.light.upstairs_bathroom_lights,
states.light.hallway_overhead,
states.light.downstairs_bathroom_lights %}
{% set ids = lights | selectattr('state','eq','unavailable') | map(attribute='attributes.friendly_name') | list %}
{{ ids | join(', ') }}
- sensor:
- name: "Basement Studio Lights - Brightness Actual"
unique_id: dee4dc84-a6a0-4150-903e-5b8bd436d962

View File

@ -1237,11 +1237,9 @@ script:
data:
message: >
<voice name="{{ voice }}">
<amazon:auto-breaths>
<prosody rate="fast">
{{ message }}
</prosody>
</amazon:auto-breaths>
</voice>
target: >
{% if who in ['living_room_echo_dot', 'media_player.living_room_echo_dot','living_room'] %}

View File

@ -1544,14 +1544,14 @@ day_mode_in_tina_desk:
alias: Day Mode in Tina Desk
sequence:
- parallel:
- service: light.turn_on
target:
- target:
entity_id: light.tina_lamp_top
data: {}
- service: light.turn_off
target:
action: light.turn_on
- target:
entity_id: light.tina_lamp_side
data: {}
action: light.turn_off
- wait_template: '{{ is_state(''light.tina_lamp_side'',''off'') }}'
timeout:
seconds: 15
@ -1561,52 +1561,57 @@ day_mode_in_tina_desk:
- condition: state
entity_id: switch.adaptive_lighting_tina_lamp
state: 'off'
alias: If switch is off
alias: If adaptive lighting is off
then:
- service: switch.turn_on
- alias: Turn on adaptive lighting
data: {}
target:
entity_id: switch.adaptive_lighting_tina_lamp
alias: Turn on the switch
entity_id:
- switch.adaptive_lighting_tina_lamp
- switch.adaptive_lighting_adapt_brightness_tina_lamp
- switch.adaptive_lighting_adapt_color_tina_lamp
action: switch.turn_on
else:
- alias: Apply adaptive lighting
service: adaptive_lighting.apply
data:
entity_id: switch.adaptive_lighting_tina_lamp
adapt_brightness: true
adapt_color: true
action: adaptive_lighting.apply
mode: restart
icon: mdi:palette
evening_mode_in_tina_desk:
alias: Evening Mode in Tina Desk
sequence:
- alias: Turn on lamp
service: light.turn_on
data: {}
target:
entity_id:
- light.tina_lamp_top
- light.tina_lamp_side
action: light.turn_on
- alias: Apply adaptive lighting to lamp
if:
- condition: state
entity_id: switch.adaptive_lighting_tina_lamp
state: 'off'
alias: If switch is off
alias: If adaptive lighting is off
then:
- service: switch.turn_on
- alias: Turn on adaptive lighting
data: {}
target:
entity_id: switch.adaptive_lighting_tina_lamp
alias: Turn on the switch
entity_id:
- switch.adaptive_lighting_tina_lamp
- switch.adaptive_lighting_adapt_brightness_tina_lamp
- switch.adaptive_lighting_adapt_color_tina_lamp
action: switch.turn_on
else:
- service: adaptive_lighting.apply
- alias: Apply adaptive lighting
data:
entity_id: switch.adaptive_lighting_tina_lamp
adapt_brightness: true
adapt_color: true
turn_on_lights: true
alias: Apply adaptive lighting
action: adaptive_lighting.apply
mode: restart
icon: mdi:palette
night_mode_in_tina_desk:
@ -3525,3 +3530,41 @@ tina_tylenol:
icon: mdi:medication
max: 10
description: ''
reading_mode_in_tina_desk:
sequence:
- action: switch.turn_off
metadata: {}
data: {}
target:
entity_id: switch.adaptive_lighting_adapt_brightness_tina_lamp
alias: Turn off adaptive brightness, leave adaptive color on
- alias: Turn on lamp
action: light.turn_on
metadata: {}
data:
brightness_pct: 100
target:
entity_id: light.tina_desk_lights
- alias: Apply adaptive lighting to lamp
if:
- condition: state
entity_id: switch.adaptive_lighting_tina_lamp
state: 'off'
alias: If switch is off
then:
- data: {}
target:
entity_id: switch.adaptive_lighting_tina_lamp
alias: Turn on the switch
action: switch.turn_on
else:
- alias: Apply adaptive lighting
data:
entity_id: switch.adaptive_lighting_tina_lamp
adapt_color: true
turn_on_lights: true
adapt_brightness: false
action: adaptive_lighting.apply
alias: Reading Mode in Tina Desk
description: ''
icon: mdi:palette