Compare commits

...

12 Commits

Author SHA1 Message Date
github-actions[bot]
4a1989e080 Update HA version badge to 2025.5.3 2025-05-28 21:28:11 +00:00
Carlo Costanzo
da13093f1b Some minor AI Prompt revisions 2025-05-28 17:27:43 -04:00
github-actions[bot]
92ab5e1b0a Update HA version badge to 2025.5.3 2025-05-28 21:08:40 +00:00
Carlo Costanzo
6f5090b5e4 Add climate filter change tracking and notifications - AC filter changing. #273 (#1512) 2025-05-28 17:08:23 -04:00
github-actions[bot]
1c57ffa991 Update HA version badge to 2025.5.3 2025-05-28 20:42:10 +00:00
Carlo Costanzo
ec8ada20e2 Remove deprecated groups for home modes, triggers, and weather 2025-05-28 16:41:27 -04:00
github-actions[bot]
fbd7fe53db Update HA version badge to 2025.5.3 2025-05-28 18:58:10 +00:00
Carlo Costanzo
c188e11582 Merge pull request #1511 from CCOSTAN/Speedtest-Alerts
Add .git-credentials to .gitignore
2025-05-28 14:57:52 -04:00
Carlo Costanzo
0541e70e90 Add .git-credentials to .gitignore 2025-05-28 14:49:13 -04:00
github-actions[bot]
48c2bd036a Update HA version badge to 2025.5.3 2025-05-28 18:47:32 +00:00
Carlo Costanzo
a8e116e9b9 Merge pull request #1510 from CCOSTAN/Speedtest-Alerts
Add automation to notify Carlo of slow internet speeds and restoration
2025-05-28 14:47:12 -04:00
Carlo Costanzo
8eeeaf4c5f Add automation to notify Carlo of slow internet speeds and restoration 2025-05-28 14:33:11 -04:00
8 changed files with 153 additions and 50 deletions

1
.gitignore vendored
View File

@@ -16,6 +16,7 @@
core.*
core
.uuid
.git-credentials
# Home Assistant specific
*.DISABLED

View File

@@ -1,9 +0,0 @@
home_modes:
entities:
- input_boolean.guest_mode
- input_boolean.school_mode
- input_boolean.alert_mode
- input_boolean.speech_notifications
- input_boolean.text_notifications

View File

@@ -1,13 +0,0 @@
Triggers:
entities:
- input_boolean.responsibilities
- input_boolean.home_stats
- input_boolean.flash
- input_boolean.guard_dog
- input_boolean.sleepy_dog
- input_boolean.good_morning
- input_boolean.good_night
- input_boolean.meal_time
- input_boolean.tv_time
- input_boolean.work

View File

@@ -1,18 +0,0 @@
Weather:
entities:
- climate.downstairs
# - sensor.downstairs_thermostat_humidity
- climate.upstairs
# - sensor.upstairs_thermostat_humidity
- sensor.pirateweather_cloud_coverage
- sensor.pirateweather_minutely_summary
# - sensor.pirateweather_nearest_storm_distance
- sensor.pirateweather_precip_intensity
# - sensor.pirateweather_daily_max_precip_intensity
- sensor.pirateweather_wind_speed
- sensor.pirateweather_humidity
- sensor.pirateweather_temperature
- sensor.pirateweather_uv_index
- sensor.moon
# - sensor.launch_window
- sensor.next_launch

View File

@@ -0,0 +1,68 @@
input_datetime:
downstairs_last_filter_change:
name: Last Filter Change
has_date: true
has_time: true
upstairs_last_filter_change:
name: Last Filter Change
has_date: true
has_time: true
sensor:
- platform: history_stats
name: Upstairs AC Runtime Since Last Filter Change
entity_id: climate.upstairs
state: 'cooling'
type: time
start: "{{ states('input_datetime.upstairs_last_filter_change') }}"
end: "{{ now() }}"
- platform: history_stats
name: Downstairs AC Runtime Since Last Filter Change
entity_id: climate.downstairs
state: 'cooling'
type: time
start: "{{ states('input_datetime.downstairs_last_filter_change') }}"
end: "{{ now() }}"
script:
reset_filter_change_date:
alias: Reset Downstairs Filter Change Date
sequence:
- service: input_datetime.set_datetime
data:
entity_id: input_datetime.downstairs_last_filter_change
datetime: "{{ now().strftime('%Y-%m-%d %H:%M:%S') }}"
automation:
- alias: Notify Downstairs Filter Change Due
description: "Notify when AC runtime exceeds threshold since last filter change"
trigger:
- platform: numeric_state
entity_id: sensor.downstairs_ac_runtime_since_last_filter_change
above: 800
action:
- service: script.notify_engine
data:
title: "Home Maintenance Reminder"
value1: "It's time to change your Downstairs AC filter."
value2: "Runtime has exceeded 800 hours. Last changed {{ ((now() - states.input_datetime.downstairs_last_filter_change.last_changed).total_seconds() / 86400) | round(0) }} days ago."
who: "Carlo"
group: "maintenance"
level: "active"
- alias: Notify Upstairs Filter Change Due
description: "Notify when AC runtime exceeds threshold since last filter change"
trigger:
- platform: numeric_state
entity_id: sensor.upstairs_ac_runtime_since_last_filter_change
above: 450
action:
- service: script.notify_engine
data:
title: "Home Maintenance Reminder"
value1: "It's time to change your Upstairs AC filter."
value2: "Runtime has exceeded 450 hours. Last changed {{ ((now() - states.input_datetime.upstairs_last_filter_change.last_changed).total_seconds() / 86400) | round(0) }} days ago."
who: "Carlo"
group: "maintenance"

View File

@@ -0,0 +1,72 @@
# Automation to notify Carlo if internet speeds fall below 400 Mbps
# For more info or questions, visit https://www.vcloudinfo.com/click-here
automation:
- alias: "Notify Carlo if Internet Speed is Slow"
id: notify-carlo-slow-internet-speed
description: "Sends a notification to Carlo's phone if download or upload speed falls below 400 Mbps."
trigger:
- platform: numeric_state
entity_id: sensor.speedtest_download
below: 400
- platform: numeric_state
entity_id: sensor.speedtest_upload
below: 300
condition:
- condition: state
entity_id: group.bed
state: 'off'
- condition: template # Checks to make sure the system hasn't been restarted in the past 10 minutes
value_template: >-
{% set uptime = states('sensor.ha_uptime') | as_datetime %}
{% set now = now() %}
{{ (now - uptime).total_seconds() / 60 >= 10 }}
action:
- service: script.notify_engine
data:
title: "⚠️ Internet Speed Alert"
value1: >-
Download: {{ states('sensor.speedtest_download') }} Mbps,
Upload: {{ states('sensor.speedtest_upload') }} Mbps.
value2: "One or both speeds are below 400 Mbps."
who: "parents"
group: "information"
level: "active"
mode: single
- alias: "Notify Carlo if Internet Speed is Restored"
id: notify-carlo-internet-speed-restored
description: "Sends a notification to Carlo's phone when download and upload speeds are back above 400/300 Mbps."
trigger:
- platform: numeric_state
entity_id: sensor.speedtest_download
above: 400
- platform: numeric_state
entity_id: sensor.speedtest_upload
above: 300
condition:
- condition: numeric_state
entity_id: sensor.speedtest_download
above: 400
- condition: numeric_state
entity_id: sensor.speedtest_upload
above: 300
- condition: template # Checks to make sure the system hasn't been restarted in the past 10 minutes
value_template: >-
{% set uptime = states('sensor.ha_uptime') | as_datetime %}
{% set now = now() %}
{{ (now - uptime).total_seconds() / 60 >= 10 }}
action:
- service: script.notify_engine
data:
title: "✅ Internet Speed Restored"
value1: >-
Download: {{ states('sensor.speedtest_download') }} Mbps,
Upload: {{ states('sensor.speedtest_upload') }} Mbps.
value2: "Internet speeds are back to normal."
who: "parents"
group: "information"
level: "active"
mode: single

View File

@@ -240,7 +240,7 @@
Current date time: {{ month }} {{ day }}, {{ year }} {{ time }}
Residents: Location
- Carlo (Dad): {{ states('person.carlo') }} at
- Carlo: {{ states('person.carlo') }} at
{%- if states('sensor.carlo_place') != 'unknown' %}
{{ states('sensor.carlo_place') }}
{% else -%}
@@ -249,7 +249,7 @@
{%- if states('person.carlo') != 'home' %}
(Direction of travel: {{ state_attr('sensor.carlo_place', 'direction_of_travel') }})
{% endif -%}
- Stacey (Mom): {{ states('person.stacey') }} at
- Stacey: {{ states('person.stacey') }} at
{%- if states('sensor.stacey_place') != 'unknown' %}
{{ states('sensor.stacey_place') }}
{% else -%}
@@ -258,7 +258,7 @@
{%- if states('person.stacey') != 'home' %}
(Direction of travel: {{ state_attr('sensor.stacey_place', 'direction_of_travel') }})
{% endif -%}
- Justin (Son): {{ states('person.justin') }} at
- Justin: {{ states('person.justin') }} at
{%- if states('sensor.justin_place') != 'unknown' %}
{{ states('sensor.justin_place') }}
{% else -%}
@@ -267,7 +267,7 @@
{%- if states('person.justin') != 'home' %}
(Direction of travel: {{ state_attr('sensor.justin_place', 'direction_of_travel') }})
{% endif -%}
- Paige (Daughter): {{ states('person.paige') }} at
- Paige: {{ states('person.paige') }} at
{%- if states('sensor.paige_place') != 'unknown' %}
{{ states('sensor.paige_place') }}
{% else -%}
@@ -276,9 +276,11 @@
{%- if states('person.paige') != 'home' %}
(Direction of travel: {{ state_attr('sensor.paige_place', 'direction_of_travel') }})
{% endif -%}
{% if range(1, 100) | random <= 25 %}
and our cat Molly: Always home.
{% endif %}
Previous broadcast: "{{ state_attr('sensor.openai_response', 'response') }}"
[Mention where each person is and approximately how long they have been there, using conversational and friendly language or if they are not at home or just arrived. Avoid repeating information from the previous broadcast if it was within the hour]
[For each person, mention their location. For those not at home, briefly state where they are and approximately how long they have been there, using relative time e.g., about 30 minutes, around 2 hours, not exact timestamps. If the same location update has already been broadcasted, do not repeat it.]
New Information:
{% if call_no_announcement != 1 %}

View File

@@ -1,13 +1,13 @@
<svg width="61.5" height="20" viewBox="0 0 615 200" xmlns="http://www.w3.org/2000/svg" role="img" aria-label="2025.5.3">
<title>2025.5.3</title>
<linearGradient id="OdOtw" x2="0" y2="100%">
<linearGradient id="LVgDG" x2="0" y2="100%">
<stop offset="0" stop-opacity=".1" stop-color="#EEE"/>
<stop offset="1" stop-opacity=".1"/>
</linearGradient>
<mask id="ZMpqU"><rect width="615" height="200" rx="30" fill="#FFF"/></mask>
<g mask="url(#ZMpqU)">
<mask id="tSijn"><rect width="615" height="200" rx="30" fill="#FFF"/></mask>
<g mask="url(#tSijn)">
<rect width="615" height="200" fill="#08C" x="0"/>
<rect width="615" height="200" fill="url(#OdOtw)"/>
<rect width="615" height="200" fill="url(#LVgDG)"/>
</g>
<g aria-hidden="true" fill="#fff" text-anchor="start" font-family="Verdana,DejaVu Sans,sans-serif" font-size="110">
<text x="65" y="148" textLength="500" fill="#000" opacity="0.25">2025.5.3</text>

Before

Width:  |  Height:  |  Size: 811 B

After

Width:  |  Height:  |  Size: 811 B