Compare commits

...

25 Commits

Author SHA1 Message Date
f176e3b867 Update .HA_VERSION 2025-12-13 18:13:02 -05:00
1b52cc31a8 Update .HA_VERSION 2025-12-09 20:16:17 -05:00
8993196366 Add college hockey teams to sports tracking #255 2025-12-09 20:16:00 -05:00
210434e4ad Prevent trying to report team record when it is not provided 2025-12-09 20:15:39 -05:00
e37ac9d504 Re-enable K's night meds tracker 2025-12-09 20:13:57 -05:00
bf19984b47 Fix recliner mode not marking basement as occupied 2025-11-28 00:47:23 -05:00
4634b66866 Change deprecated Powercalc config 2025-11-26 20:27:16 -05:00
001dcbe625 Update .HA_VERSION 2025-11-26 20:26:34 -05:00
f70be6ceee Update .HA_VERSION 2025-11-10 22:38:58 -05:00
265e129c06 Try to fix weird changing of climate modes in E's bedroom 2025-10-30 18:14:02 -04:00
00bea40b6b Update .HA_VERSION 2025-10-30 18:13:22 -04:00
f94bce3381 Update .HA_VERSION 2025-10-18 00:21:58 -04:00
2de7d82e20 Sensors to indicate health of media server items 2025-10-03 19:29:28 -04:00
83c3c10a5a Add structured output to AI med notification prompts 2025-10-03 19:29:07 -04:00
f7ac1b915b Update .HA_VERSION 2025-10-03 19:28:27 -04:00
1d3398752e Fix deprecated Google AI calls 2025-10-03 02:59:00 -04:00
837ed779c9 Add reminder booleans for other med trackers 2025-10-02 19:10:00 -04:00
bc3a58875d Fix typo in lighting_fx 2025-10-02 18:24:17 -04:00
3c018a922b Remove old gas sensors from configs 2025-10-02 18:24:05 -04:00
10188d553a Update .HA_VERSION and .gitignore 2025-10-02 18:20:39 -04:00
341200deb0 Disable K night meds as currently unneeded 2025-09-23 18:34:58 -04:00
b930cb28b5 Update .HA_VERSION 2025-09-23 18:34:24 -04:00
c31158448c Update .gitignore 2025-09-16 02:10:39 -04:00
9e9c1fcf11 Update .HA_VERSION 2025-09-16 02:09:23 -04:00
02e3252e62 Update .HA_VERSION 2025-09-11 04:36:21 -04:00
13 changed files with 268 additions and 146 deletions

View File

@@ -1 +1 @@
2025.8.3
2025.12.3

2
.gitignore vendored
View File

@@ -21,6 +21,7 @@
/downloads/
/lightwand/
/bubble/Scratchpad/
/custom_icons
# ignore any of these files no matter where they are using double *
**.DS_Store
@@ -67,6 +68,7 @@
**jsconfig*
.markdownlint.json
**test.jinja
**.ha_run.lock
# exceptions
!/www/bubble/

View File

@@ -4646,39 +4646,41 @@
- id: '1710611198911'
alias: Kallen Meds Handler
description: Handles the scheduling of medication reminders for Kallen
trigger:
- platform: time_pattern
minutes: /30
triggers:
- minutes: /30
id: trigger30
alias: Every 30 minutes
- platform: time
at: input_datetime.kallen_morning_meds_notify
trigger: time_pattern
- at: input_datetime.kallen_morning_meds_notify
id: morning-notify
alias: Morning Notify
- platform: time
at: input_datetime.kallen_night_meds_notify
trigger: time
- at: input_datetime.kallen_night_meds_notify
id: night-notify
alias: Night Notify
- platform: state
entity_id:
trigger: time
enabled: true
- entity_id:
- input_boolean.kallen_morning_meds_taken
to: 'on'
id: boolean-morning
alias: Morning Taken
from: 'off'
- platform: state
entity_id:
trigger: state
- entity_id:
- input_boolean.kallen_night_meds_taken
id: boolean-night
alias: Night Taken
from: 'off'
to: 'on'
condition:
trigger: state
enabled: true
conditions:
- condition: state
entity_id: input_boolean.kallen_overnight
state: 'off'
alias: Kallen is not staying the night elsewhere
action:
actions:
- alias: Routing
choose:
- conditions:
@@ -4693,10 +4695,10 @@
state: 'on'
alias: Morning meds reminder needed
then:
- service: script.kallen_morning_meds
metadata: {}
- metadata: {}
data: {}
alias: Run morning meds notification script
action: script.kallen_morning_meds
- alias: Check night reminder switch
if:
- condition: state
@@ -4704,10 +4706,10 @@
state: 'on'
alias: Night meds reminder needed
then:
- service: script.kallen_night_meds
metadata: {}
- metadata: {}
data: {}
alias: Run night meds notification script
action: script.kallen_night_meds
alias: Every 30 minutes
- conditions:
- condition: and
@@ -4719,16 +4721,16 @@
state: 'off'
alias: Morning Notify
sequence:
- service: input_boolean.turn_on
metadata: {}
- metadata: {}
data: {}
target:
entity_id: input_boolean.kallen_morning_meds_reminder
alias: Activate morning reminders
- service: script.kallen_morning_meds
metadata: {}
action: input_boolean.turn_on
- metadata: {}
data: {}
alias: Run morning meds notification script
action: script.kallen_morning_meds
- conditions:
- condition: and
conditions:
@@ -4741,22 +4743,21 @@
alias: Night Notify
sequence:
- alias: Activate night reminders
service: input_boolean.turn_on
metadata: {}
data: {}
target:
entity_id: input_boolean.kallen_night_meds_reminder
- service: script.kallen_night_meds
metadata: {}
action: input_boolean.turn_on
- metadata: {}
data: {}
alias: Run night meds notification script
action: script.kallen_night_meds
- conditions:
- condition: trigger
id: boolean-morning
alias: Morning Taken
sequence:
- service: input_datetime.set_datetime
target:
- target:
entity_id: input_datetime.kallen_morning_meds_taken
data:
datetime: '{% from ''time.jinja'' import set_datetime %} {{ set_datetime(0)
@@ -4764,27 +4765,27 @@
'
alias: Set time morning meds were taken
- service: input_boolean.turn_off
metadata: {}
action: input_datetime.set_datetime
- metadata: {}
data: {}
target:
entity_id: input_boolean.kallen_morning_meds_reminder
alias: Deactivate morning reminders
- service: script.text_notify
metadata: {}
action: input_boolean.turn_off
- metadata: {}
data:
type: alert
who: kallen
message: clear_notification
tag: kallen-left-meds
alias: Clear kallen-left-meds notification tag
action: script.text_notify
- conditions:
- condition: trigger
id: boolean-night
alias: Night Taken
sequence:
- service: input_datetime.set_datetime
target:
- target:
entity_id: input_datetime.kallen_night_meds_taken
data:
datetime: '{% from ''time.jinja'' import set_datetime %} {{ set_datetime(0)
@@ -4792,20 +4793,21 @@
'
alias: Set time night meds were taken
action: input_datetime.set_datetime
- alias: Deactivate night reminders
service: input_boolean.turn_off
metadata: {}
data: {}
target:
entity_id: input_boolean.kallen_night_meds_reminder
- service: script.text_notify
metadata: {}
action: input_boolean.turn_off
- metadata: {}
data:
type: alert
who: kallen
message: clear_notification
tag: kallen-left-meds
alias: Clear kallen-left-meds notification tag
action: script.text_notify
mode: parallel
max: 12
- id: '1711657679853'

View File

@@ -300,18 +300,6 @@ influxdb:
- binary_sensor.people_present
- weather.iron_nerd_weather_station
- weather.ashland_weather_station
- sensor.circle_k
- sensor.kroger
- sensor.kecks
- sensor.the_barn
- sensor.the_big_fish
- sensor.speedway
- sensor.meijer
- sensor.ridis
- sensor.marathon_cleveland_avenue
- sensor.south_side_shell
- sensor.east_side_shell
- sensor.shell_ottawa_avenue
- sensor.current_lights_on
- binary_sensor.early_night_mode
- input_boolean.give_me_darkness
@@ -484,18 +472,6 @@ prometheus:
- binary_sensor.people_present
- weather.iron_nerd_weather_station
- weather.ashland_weather_station
- sensor.circle_k
- sensor.kroger
- sensor.kecks
- sensor.the_barn
- sensor.the_big_fish
- sensor.speedway
- sensor.meijer
- sensor.ridis
- sensor.marathon_cleveland_avenue
- sensor.south_side_shell
- sensor.east_side_shell
- sensor.shell_ottawa_avenue
- sensor.current_lights_on
- binary_sensor.early_night_mode
- input_boolean.give_me_darkness

View File

@@ -90,8 +90,8 @@
{% 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 %} {{ 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.
{% if state_attr(team,'clock') not in ['postponed','Postponed'] and state_attr(team,'team_record') != None %}
This brings their record to {{ state_attr(team,'team_record') | replace("-"," and ") }} on the season.
{% endif %}
{% elif yday == date %}
{% if state_attr(team,'clock') in ['postponed','Postponed'] %}
@@ -171,6 +171,15 @@
{% if is_state('binary_sensor.minnesota_wild_inhibit','off') %}
{{ sports_pregame('sensor.minnesota_wild') }}
{% endif %}
{% if is_state('binary_sensor.michigan_wolverines_hockey','off') %}
{{ sports_pregame('sensor.michigan_wolverines_hockey') }}
{% endif %}
{% if is_state('binary_sensor.minnesota_golden_gophers_hockey','off') %}
{{ sports_pregame('sensor.minnesota_golden_gophers_hockey') }}
{% endif %}
{% if is_state('binary_sensor.minnesota_state_mavericks_hockey','off') %}
{{ sports_pregame('sensor.minnesota_state_mavericks_hockey') }}
{% endif %}
{% elif time == 'main' %}
{% if is_state('binary_sensor.michigan_wolverines_inhibit','off') %}
{{ sports_main('sensor.michigan_wolverines') }}
@@ -199,6 +208,15 @@
{% if is_state('binary_sensor.minnesota_wild_inhibit','off') %}
{{ sports_main('sensor.minnesota_wild') }}
{% endif %}
{% if is_state('binary_sensor.michigan_wolverines_hockey','off') %}
{{ sports_main('sensor.michigan_wolverines_hockey') }}
{% endif %}
{% if is_state('binary_sensor.minnesota_golden_gophers_hockey','off') %}
{{ sports_main('sensor.minnesota_golden_gophers_hockey') }}
{% endif %}
{% if is_state('binary_sensor.minnesota_state_mavericks_hockey','off') %}
{{ sports_main('sensor.minnesota_state_mavericks_hockey') }}
{% endif %}
{% endif %}
{% endmacro %}
{{ cleanup(data()) }}

View File

@@ -1,39 +1,3 @@
sensor.ridis:
device_class: monetary
sensor.kecks:
device_class: monetary
sensor.circle_k:
device_class: monetary
sensor.the_big_fish:
device_class: monetary
sensor.meijer:
device_class: monetary
sensor.south_side_shell:
device_class: monetary
sensor.kroger:
device_class: monetary
sensor.marathon_cleveland_avenue:
device_class: monetary
sensor.speedway:
device_class: monetary
sensor.shell_ottawa_avenue:
device_class: monetary
sensor.the_barn:
device_class: monetary
sensor.east_side_shell:
device_class: monetary
sensor.local_minimum_gas_price:
device_class: monetary

View File

@@ -38,12 +38,13 @@ conversation:
alexa:
powercalc:
force_update_frequency: 00:01:00
discovery:
enabled: true
energy_update_interval: 60
power_sensor_naming: "{} Power Sensor"
power_sensor_friendly_naming: "{} Power Sensor"
energy_sensor_naming: "{} Energy Sensor"
energy_sensor_friendly_naming: "{} Energy Sensor"
enable_autodiscovery: true
create_energy_sensors: true
create_utility_meters: true
create_domain_groups:

View File

@@ -268,7 +268,7 @@ script:
- light.living_room_overhead
- service: input_text.set_value
target:
entity_id: input_text.living_room_studio_selected_scene
entity_id: input_text.living_room_selected_scene
data:
value: Alert
# Define variable for restoration of the current scene if the backup is not needed

View File

@@ -124,6 +124,8 @@ template:
state: >
{% if is_state('binary_sensor.basement_studio_motion','on') %}
true
{% elif is_state('input_boolean.recliner_mode','on') %}
true
{% elif is_state('sensor.xia_desktop_current_username','tm24f') %}
false
{% elif is_state('binary_sensor.tony_desktop_on','off') and

View File

@@ -142,6 +142,36 @@ template:
state: >
{% from 'sports.jinja' import sports_today %}
{{ sports_today('sensor.minnesota_wild') }}
- name: Michigan Wolverines Hockey Inhibit
unique_id: 8ecd46d5-64c2-49f5-bc8d-d88593273d92
state: >
{% from 'sports.jinja' import sports_inhibit %}
{{ sports_inhibit('sensor.michigan_wolverines_hockey') }}
- name: Michigan Wolverines Hockey Event Today
unique_id: 551fdae5-e18c-4117-b3ba-df864068b13d
state: >
{% from 'sports.jinja' import sports_today %}
{{ sports_today('sensor.michigan_wolverines_hockey') }}
- name: Minnesota Golden Gophers Hockey Inhibit
unique_id: 87653f3a-203c-4dbf-87e8-70bcacf6eb22
state: >
{% from 'sports.jinja' import sports_inhibit %}
{{ sports_inhibit('sensor.minnesota_golden_gophers_hockey') }}
- name: Minnesota Golden Gophers Hockey Event Today
unique_id: 1f4ff7eb-cbc9-4c81-a5c9-6523b5fb52ff
state: >
{% from 'sports.jinja' import sports_today %}
{{ sports_today('sensor.minnesota_golden_gophers_hockey') }}
- name: Minnesota State Mavericks Hockey Inhibit
unique_id: bd15870d-bccb-4c52-9690-473c31bb4090
state: >
{% from 'sports.jinja' import sports_inhibit %}
{{ sports_inhibit('sensor.minnesota_state_mavericks_hockey') }}
- name: Minnesota State Mavericks Hockey Event Today
unique_id: e403be15-3ff2-47b1-8398-70f8ccb65026
state: >
{% from 'sports.jinja' import sports_today %}
{{ sports_today('sensor.minnesota_state_mavericks_hockey') }}
intent_script:
SportsScore:

View File

@@ -25,24 +25,36 @@ input_boolean:
tony_ibuprofen_active:
name: Tony Ibuprofen Active
icon: mdi:medication
tony_ibuprofen_reminder:
name: Tony Ibuprofen Reminder
icon: mdi:medication
tony_ibuprofen_taken:
name: Tony Ibuprofen Taken
icon: mdi:medication
tony_tylenol_active:
name: Tony Tylenol Active
icon: mdi:medication
tony_tylenol_reminder:
name: Tony Tylenol Reminder
icon: mdi:medication
tony_tylenol_taken:
name: Tony Tylenol Taken
icon: mdi:medication
tony_custom_meds_tracker_p1:
name: Tony Custom Meds Tracker P1
icon: mdi:medication
tony_custom_meds_reminder_p1:
name: Tony Custom Meds Reminder P1
icon: mdi:medication
tony_custom_meds_taken_p1:
name: Tony Custom Meds Taken P1
icon: mdi:medication
tony_custom_meds_tracker_p2:
name: Tony Custom Meds Tracker P2
icon: mdi:medication
tony_custom_meds_reminder_p2:
name: Tony Custom Meds Reminder P2
icon: mdi:medication
tony_custom_meds_taken_p2:
name: Tony Custom Meds Taken P2
icon: mdi:medication

View File

@@ -1733,21 +1733,38 @@ tony_morning_meds:
entity_id: counter.tony_morning_meds_reminder_count
above: 2
then:
- action: google_generative_ai_conversation.generate_content
- alias: Generate snarky reminder
action: ai_task.generate_data
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 {{ remindCount }}
times.
instructions: Remind Tony to take his morning meds. Use a maximum of two
lines. Be snarky, because at this point this is reminder number {{ remindCount
}}.
task_name: Tony Morning Medication Reminder Snarky
entity_id: ai_task.google_ai_task
structure:
notification_text:
description: The text to send in the notification to Tony's phone
required: true
selector:
text:
response_variable: response
alias: Generate snarky reminder
else:
- action: google_generative_ai_conversation.generate_content
- alias: Generate reminder
action: ai_task.generate_data
metadata: {}
data:
prompt: Remind Tony to take his morning meds. Use a maximum of two lines.
instructions: Remind Tony to take his morning meds. Use a maximum of two
lines.
task_name: Tony Morning Medication Reminder
entity_id: ai_task.google_ai_task
structure:
notification_text:
description: The text to send in the notification to Tony's phone
required: true
selector:
text:
response_variable: response
alias: Generate reminder
- delay:
hours: 0
minutes: 0
@@ -1760,7 +1777,7 @@ tony_morning_meds:
who: tony
type: alert
title: Morning Meds
message: '{{ response.text }}'
message: '{{ response.data.notification_text }}'
tag: tony-morning-meds
actions:
- action: TONY_MORNING_MEDS_TAKEN
@@ -1782,11 +1799,11 @@ tony_morning_meds:
state: home
alias: If Tony is home
then:
- data:
- alias: Send TTS notification
data:
who: common_areas
type: alert
message: '{{ response.text }}'
alias: Send TTS notification
message: '{{ response.data.notification_text }}'
action: script.speech_engine
else:
- delay:
@@ -2044,21 +2061,38 @@ tony_afternoon_meds:
entity_id: counter.tony_afternoon_meds_reminder_count
above: 2
then:
- action: google_generative_ai_conversation.generate_content
- alias: Generate snarky reminder
action: ai_task.generate_data
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 {{ remindCount }}
times.
instructions: Remind Tony to take his afternoon meds. Use a maximum of two
lines. Be snarky, because at this point this is reminder number {{ remindCount
}}.
task_name: Tony Afternoon Medication Reminder Snarky
entity_id: ai_task.google_ai_task
structure:
notification_text:
description: The text to send in the notification to Tony's phone
required: true
selector:
text:
response_variable: response
alias: Generate snarky reminder
else:
- action: google_generative_ai_conversation.generate_content
- alias: Generate reminder
action: ai_task.generate_data
metadata: {}
data:
prompt: Remind Tony to take his afternoon meds. Use a maximum of two lines.
instructions: Remind Tony to take his afternoon meds. Use a maximum of two
lines.
task_name: Tony Afternoon Medication Reminder
entity_id: ai_task.google_ai_task
structure:
notification_text:
description: The text to send in the notification to Tony's phone
required: true
selector:
text:
response_variable: response
alias: Generate reminder
- delay:
hours: 0
minutes: 0
@@ -2071,7 +2105,7 @@ tony_afternoon_meds:
who: tony
type: alert
title: Afternoon Meds
message: '{{ response.text }}'
message: '{{ response.data.notification_text }}'
tag: tony-afternoon-meds
actions:
- action: TONY_AFTERNOON_MEDS_TAKEN
@@ -2093,11 +2127,11 @@ tony_afternoon_meds:
state: home
alias: If Tony is home
then:
- data:
- alias: Send TTS notification
data:
who: common_areas
type: alert
message: '{{ response.text }}'
alias: Send TTS notification
message: '{{ response.data.notification_text }}'
action: script.speech_engine
else:
- delay:
@@ -3006,14 +3040,14 @@ rabbit_hutch_cleaning:
emma_sleep:
alias: Emma Sleep
sequence:
- if:
- alias: Run scheduling if it hasn't already been run
if:
- condition: time
after: 04:00:00
after: 09:00:00
before: '17:00:00'
then:
- data: {}
action: script.emma_bedroom_scheduling_evening
alias: Run scheduling if it hasn't already been run
- target:
entity_id:
- script.emma_ibuprofen
@@ -3099,21 +3133,38 @@ tina_morning_meds:
entity_id: counter.tina_morning_meds_reminder_count
above: 2
then:
- action: google_generative_ai_conversation.generate_content
- alias: Generate snarky reminder
action: ai_task.generate_data
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 {{ remindCount }}
times.
instructions: Remind Tina to take her morning meds. Use a maximum of two
lines. Be snarky, because at this point this is reminder number {{ remindCount
}}.
task_name: Tina Morning Medication Reminder Snarky
entity_id: ai_task.google_ai_task
structure:
notification_text:
description: The text to send in the notification to Tina's phone
required: true
selector:
text:
response_variable: response
alias: Generate snarky reminder
else:
- action: google_generative_ai_conversation.generate_content
- alias: Generate reminder
action: ai_task.generate_data
metadata: {}
data:
prompt: Remind Tina to take her morning meds. Use a maximum of two lines.
instructions: Remind Tina to take her morning meds. Use a maximum of two
lines.
task_name: Tina Morning Medication Reminder
entity_id: ai_task.google_ai_task
structure:
notification_text:
description: The text to send in the notification to Tina's phone
required: true
selector:
text:
response_variable: response
alias: Generate reminder
- delay:
hours: 0
minutes: 0
@@ -3124,7 +3175,7 @@ tina_morning_meds:
who: tina
type: alert
title: Morning Meds
message: '{{ response.text }}'
message: '{{ response.data.notification_text }}'
tag: tina-morning-meds
actions:
- action: TINA_MORNING_MEDS_TAKEN
@@ -3184,21 +3235,37 @@ tina_night_meds:
entity_id: counter.tina_night_meds_reminder_count
above: 2
then:
- action: google_generative_ai_conversation.generate_content
- alias: Generate snarky reminder
action: ai_task.generate_data
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 {{ remindCount }}
times.
instructions: Remind Tina to take her night meds. Use a maximum of two lines.
Be snarky, because at this point this is reminder number {{ remindCount
}}.
task_name: Tina Night Medication Reminder Snarky
entity_id: ai_task.google_ai_task
structure:
notification_text:
description: The text to send in the notification to Tina's phone
required: true
selector:
text:
response_variable: response
alias: Generate snarky reminder
else:
- action: google_generative_ai_conversation.generate_content
- alias: Generate reminder
action: ai_task.generate_data
metadata: {}
data:
prompt: Remind Tina to take her night meds. Use a maximum of two lines.
instructions: Remind Tina to take her night meds. Use a maximum of two lines.
task_name: Tina Night Medication Reminder
entity_id: ai_task.google_ai_task
structure:
notification_text:
description: The text to send in the notification to Tina's phone
required: true
selector:
text:
response_variable: response
alias: Generate reminder
- delay:
hours: 0
minutes: 0
@@ -3209,7 +3276,7 @@ tina_night_meds:
who: tina
type: alert
title: Night Meds
message: '{{ response.text }}'
message: '{{ response.data.notification_text }}'
tag: tina-night-meds
actions:
- action: TINA_NIGHT_MEDS_TAKEN

View File

@@ -464,3 +464,51 @@
map(attribute='attributes.friendly_name') |
list %}
{{ uptimekuma | join(', ') }}
- name: Media Server Viewer Health
unique_id: 51154ade-255e-4dcd-9b89-66910fcc1331
unit_of_measurement: '%'
icon: mdi:movie
state: >
{% set total = states.binary_sensor |
selectattr('entity_id','in',label_entities('media_server')) |
selectattr('entity_id','in',label_entities('viewer')) |
list | count | int %}
{% set up = states.binary_sensor |
selectattr('entity_id','in',label_entities('media_server')) |
selectattr('entity_id','in',label_entities('viewer')) |
selectattr('state','eq','on') |
list | count | int %}
{{ ((up / total) * 100) | round(0) }}
attributes:
services_down: >
{% set down = states.binary_sensor |
selectattr('entity_id','in',label_entities('media_server')) |
selectattr('entity_id','in',label_entities('viewer')) |
selectattr('state','eq','off') |
map(attribute='attributes.friendly_name') |
list %}
{{ down | join(', ') }}
- name: Media Server Downloaders Health
unique_id: f27867fe-700f-45bc-9e6b-8b1ee74cb724
unit_of_measurement: '%'
icon: mdi:tray-arrow-down
state: >
{% set total = states.binary_sensor |
selectattr('entity_id','in',label_entities('media_server')) |
selectattr('entity_id','in',label_entities('downloader')) |
list | count | int %}
{% set up = states.binary_sensor |
selectattr('entity_id','in',label_entities('media_server')) |
selectattr('entity_id','in',label_entities('downloader')) |
selectattr('state','eq','on') |
list | count | int %}
{{ ((up / total) * 100) | round(0) }}
attributes:
services_down: >
{% set down = states.binary_sensor |
selectattr('entity_id','in',label_entities('media_server')) |
selectattr('entity_id','in',label_entities('downloader')) |
selectattr('state','eq','off') |
map(attribute='attributes.friendly_name') |
list %}
{{ down | join(', ') }}