Compare commits

...

56 Commits

Author SHA1 Message Date
6ddac9a56f Try to fix weird changing of climate modes 2025-10-30 18:13:46 -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
32907081c6 Add input numbers for AC auto mode switching 2025-09-02 02:40:36 -04:00
67931ccfcd Update school lunch menu 2025-09-02 02:40:09 -04:00
c5d1b14ac9 Add reminder count to AI prompt for med reminders 2025-09-02 02:39:34 -04:00
3ed56ff745 Fix some nighttime lighting weirdness on the second floor 2025-08-26 02:07:05 -04:00
eb9cc4c42d Update sensor light blueprint 2025-08-26 02:06:27 -04:00
df020c92c1 Update .HA_VERSION 2025-08-26 02:01:46 -04:00
b97838a13f Fix formatting in custom weather package templates 2025-08-16 18:20:28 -04:00
9678ccd2a3 Attempting to figure out the cause of #251 2025-08-16 18:20:07 -04:00
13ef9c58f8 Fix indentation on clothing forecast template 2025-08-16 18:18:05 -04:00
1ea19c317c Update .HA_VERSION 2025-08-16 17:25:37 -04:00
a89963f9f0 Update .HA_VERSION 2025-08-11 19:14:44 -04:00
993a65529b Update .HA_VERSION 2025-07-30 21:30:36 -04:00
a11bb624db Remove obsolete template sensors for min/avg/max pings 2025-07-30 03:21:10 -04:00
131ffcd05f Stop new ping sensors from flooding the database 2025-07-30 03:20:51 -04:00
4ac9247852 Add specific SPC risk sensors for dashboard purposes 2025-07-27 06:32:27 -04:00
52d651fcaa Fix not being a tornado possible sensor like there was supposed to be 2025-07-27 06:32:04 -04:00
96244550de Update .HA_VERSION 2025-07-27 06:31:31 -04:00
5f2b840899 Add styling to icons in state color button module 2025-07-17 22:37:16 -04:00
f08d1452f2 Update .HA_VERSION 2025-07-16 22:29:01 -04:00
034419f954 Turn off wife's night meds when she gets to work #243 2025-07-13 21:43:36 -04:00
f5953d23e6 Remove Main Button State Red as no longer used 2025-07-13 21:42:01 -04:00
473526390e Updated readme 2025-07-09 17:01:02 -04:00
a5a9d081d2 Early stages of a rotating icon module 2025-07-08 06:52:34 -04:00
0f25ce6f6a State Color Button module 2025-07-08 03:56:47 -04:00
eced9a763e Update .gitignore 2025-07-07 22:25:16 -04:00
5331c0d08a Popup timer bubble card module 2025-07-07 21:57:54 -04:00
c9e4a11604 Fix VSCode throwing a fit about no backticks 2025-07-07 21:32:42 -04:00
d55ad66264 Restructure bubble card modules folder 2025-07-07 20:57:47 -04:00
d56d899588 More bubble card modules 2025-07-07 18:23:26 -04:00
6afb3b7cb7 Main button state red now applies styles directly to DOM elements 2025-07-07 17:31:56 -04:00
e2ea214832 New modules I wrote for bubble cards 2025-07-07 05:06:06 -04:00
b1543676d5 Experimenting with trend sensor for local average gas price trends 2025-07-07 05:05:49 -04:00
bc45d6b7fd Update .HA_VERSION 2025-07-07 05:05:11 -04:00
1a706153a8 Fix handling of MLB rain delays, close #252 2025-06-26 17:27:26 -04:00
95b2c8cfc5 Update .HA_VERSION 2025-06-26 17:27:02 -04:00
61b04c05c6 Update time macros 2025-06-15 18:13:55 -04:00
41141e94df Add entity to denote ongoing server maintenance 2025-06-15 17:44:07 -04:00
cc9ec0b211 Update .HA_VERSION 2025-06-15 17:43:46 -04:00
adf881a106 Adjust scheduling to help K's room when it's hot upstairs 2025-06-13 20:09:52 -04:00
6ee298a3d2 Update .HA_VERSION 2025-06-13 20:09:35 -04:00
40 changed files with 1547 additions and 405 deletions

View File

@@ -1 +1 @@
2025.5.3
2025.10.3

3
.gitignore vendored
View File

@@ -20,6 +20,8 @@
/glances/
/downloads/
/lightwand/
/bubble/Scratchpad/
/custom_icons
# ignore any of these files no matter where they are using double *
**.DS_Store
@@ -66,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: false
- 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: false
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'
@@ -5587,53 +5589,59 @@
- id: '1722386174249'
alias: Tina Meds Cleanup
description: Handles the setting/clearing of medication configs for Tina
trigger:
- platform: state
entity_id:
triggers:
- entity_id:
- input_boolean.tina_morning_meds_reminder
from: 'on'
to: 'off'
id: morning-reminders-off
alias: Morning reminders off
trigger: state
- alias: Night reminders off
platform: state
entity_id:
- input_boolean.tina_night_meds_reminder
from: 'on'
to: 'off'
id: night-reminders-off
- platform: event
event_type: ios.notification_action_fired
trigger: state
- event_type: ios.notification_action_fired
event_data:
actionName: TINA_MORNING_MEDS_TAKEN
id: morning-taken
alias: Morning taken
trigger: event
- alias: Night taken
platform: event
event_type: ios.notification_action_fired
event_data:
actionName: TINA_NIGHT_MEDS_TAKEN
id: night-taken
trigger: event
- alias: Morning skipped
platform: event
event_type: ios.notification_action_fired
event_data:
actionName: TINA_MORNING_MEDS_SKIPPED
id: morning-skipped
trigger: event
- alias: Night skipped
platform: event
event_type: ios.notification_action_fired
event_data:
actionName: TINA_NIGHT_MEDS_SKIPPED
id: night-skipped
- platform: state
entity_id:
trigger: event
- entity_id:
- person.christina_stork
from: home
id: left
alias: Left
condition: []
action:
trigger: state
- trigger: state
entity_id:
- person.christina_stork
to: Bob Evans
id: at-work
alias: At Work
conditions: []
actions:
- alias: Routing
choose:
- conditions:
@@ -5642,19 +5650,19 @@
- morning-reminders-off
alias: Morning Reminders Off
sequence:
- service: counter.reset
metadata: {}
- metadata: {}
data: {}
target:
entity_id: counter.tina_morning_meds_reminder_count
alias: Reset morning reminder count
- service: script.text_notify
data:
action: counter.reset
- data:
type: alert
who: tina
message: clear_notification
tag: tina-morning-meds
alias: Clear morning notification
action: script.text_notify
- conditions:
- condition: trigger
id:
@@ -5662,66 +5670,66 @@
alias: Night reminders off
sequence:
- alias: Reset night reminder count
service: counter.reset
metadata: {}
data: {}
target:
entity_id: counter.tina_night_meds_reminder_count
- service: script.text_notify
data:
action: counter.reset
- data:
type: alert
who: tina
message: clear_notification
tag: tina-night-meds
alias: Clear night notification
action: script.text_notify
- conditions:
- condition: trigger
id:
- morning-taken
alias: Morning taken
sequence:
- service: input_boolean.turn_on
metadata: {}
- metadata: {}
data: {}
target:
entity_id: input_boolean.tina_morning_meds_taken
alias: Turn on morning meds taken
action: input_boolean.turn_on
- conditions:
- condition: trigger
id:
- night-taken
alias: Night taken
sequence:
- service: input_boolean.turn_on
metadata: {}
- metadata: {}
data: {}
target:
entity_id: input_boolean.tina_night_meds_taken
alias: Turn on night meds taken
action: input_boolean.turn_on
- conditions:
- condition: trigger
id:
- morning-skipped
alias: Morning skipped
sequence:
- service: input_boolean.turn_off
metadata: {}
- metadata: {}
data: {}
target:
entity_id: input_boolean.tina_morning_meds_reminder
alias: Deactivate morning reminders
action: input_boolean.turn_off
- conditions:
- condition: trigger
id:
- night-skipped
alias: Night skipped
sequence:
- service: input_boolean.turn_off
metadata: {}
- metadata: {}
data: {}
target:
entity_id: input_boolean.tina_night_meds_reminder
alias: Deactivate night reminders
action: input_boolean.turn_off
- conditions:
- condition: trigger
id:
@@ -5743,7 +5751,6 @@
alias: Night meds reminder active
then:
- alias: Send critical TTS notification
service: script.text_notify
metadata: {}
data:
type: critical
@@ -5751,6 +5758,19 @@
title: HEY DUMBASS
message: YOU FORGOT TO TAKE YOUR MEDS!!!!!
tag: tina-left-meds
action: script.text_notify
- conditions:
- condition: trigger
id:
- at-work
alias: At Work
sequence:
- action: input_boolean.turn_off
metadata: {}
data: {}
target:
entity_id: input_boolean.tina_night_meds_taken
alias: Turn off Night Meds Taken
mode: queued
max: 10
- id: '1722387020007'

View File

@@ -1,6 +1,6 @@
blueprint:
name: Sensor Light
description: "# \U0001F4A1 Sensor Light\n**Version: 8.1**\n\nYour lighting experience,
description: "# \U0001F4A1 Sensor Light\n**Version: 8.3**\n\nYour lighting experience,
your way - take control and customize it to perfection! \U0001F4A1✨\n\n**If you
like my blueprints, and would like to show your support or just say thank you?**
[Click Here](https://www.paypal.com/donate/?hosted_button_id=WAZS3QSDTPGA8) \U0001F642\n\n<details>
@@ -27,17 +27,19 @@ blueprint:
Light Sensing Options:**\n - Set up an Ambient Light Sensor for activation
in low-light conditions, customizable with specified LUX values.\n\n - **Time-Based
Options:**\n - Specify precise start and end times along with weekday selections
to define when the automation should run.\n\n - **Device Tracker Options:**\n
\ - Utilize \"Device Tracker\" to activate automation when home or within specified
zones, preventing unnecessary activations. This feature is particularly useful
to prevent unnecessary lighting activations when pets trigger sensors while no
one is home.\n\n - **Night Lights Mode:**\n - Enable \"Night Lights\" for
softer illumination during night time activities, automatically enabled based
on conditions.\n - Opt to use \"Night Glow\". This feature activates a low-level
light when no trigger is detected, creating a subtle ambient glow perfect for
nighttime use.\n\n - **HA Restart Safeguards:**\n - Benefit from built-in
safeguards for Home Assistant restarts.\n\n - **Blueprint Add-On Integration:**\n
\ - Sensor Light Add-On - Enhances media control automation. [Click Here](https://community.home-assistant.io/t/591824)
to define when the automation can run.\n\n - **State Control Option:**\n -
Allows the automation to run when the entity is in its selected activation state
(ON or OFF).\n\n - **Device Tracker Options:**\n - Utilize \"Device Tracker\"
to activate automation when home or within specified zones, preventing unnecessary
activations. This feature is particularly useful to prevent unnecessary lighting
activations when pets trigger sensors while no one is home.\n\n - **Night Lights
Mode:**\n - Enable \"Night Lights\" for softer illumination during night time
activities, automatically enabled based on conditions.\n - Opt to use \"Night
Glow\". This feature activates a low-level light when no trigger is detected,
creating a subtle ambient glow perfect for nighttime use.\n\n - **HA Restart
Safeguards:**\n - Benefit from built-in safeguards for Home Assistant restarts.\n\n
\ - **Blueprint Add-On Integration:**\n - Sensor Light Add-On - Enhances media
control automation. [Click Here](https://community.home-assistant.io/t/591824)
to learn more.\n - Bathroom Humidity Exhaust Fan - Keeps the lights ON when
showering. [Click Here](https://community.home-assistant.io/t/509992) to learn
more.\n</details>\n\nNeed help?\n- The Settings & Best Practice Guidelines: [Click
@@ -75,6 +77,7 @@ blueprint:
- binary_sensor
- schedule
multiple: true
reorder: false
lights_settings:
name: Lights *
icon: mdi:lightbulb-outline
@@ -118,6 +121,7 @@ blueprint:
- domain:
- input_boolean
multiple: false
reorder: false
end_scenes:
name: Scenes - Scripts To Turn OFF
description: 'If you have selected a scene or a script to be turned ON above
@@ -134,6 +138,7 @@ blueprint:
- domain:
- scene
- script
reorder: false
time_delay:
name: Time Delay
description: 'The time delay determines how long the lights, switches, scenes,
@@ -171,8 +176,8 @@ blueprint:
value: use_brightness
- label: Use Transition
value: use_transition
custom_value: false
sort: false
custom_value: false
light_brightness:
name: Brightness
description: 'The brightness setting for the lights when they are turned
@@ -237,9 +242,9 @@ blueprint:
value: use_rgbww_colour
- label: Disable Colour Control
value: disable_colour_control
custom_value: false
sort: false
multiple: false
sort: false
custom_value: false
light_colour_temperature:
name: Colour Temperature
description: 'The colour temperature setting for the lights when they are
@@ -357,9 +362,9 @@ blueprint:
value: enable_time_controled_brightness_inv
- label: 13 - Time Controlled - Colour Temp + Brightness
value: enable_time_controled_colour_brightness
custom_value: false
sort: false
multiple: false
sort: false
custom_value: false
dynamic_lighting_lux_sensor:
name: Dynamic Lighting - Ambient Light Sensor
description: '**Used in options 1, 2, 8 or 9** - Enter the specific ambient
@@ -375,6 +380,7 @@ blueprint:
device_class:
- illuminance
multiple: false
reorder: false
dynamic_lighting_max_lux:
name: Dynamic Lighting - Max Lux Value
description: '**Used in options 1, 2, 8 or 9** - Specify the maximum lux
@@ -459,6 +465,7 @@ blueprint:
- domain:
- input_boolean
multiple: false
reorder: false
dynamic_lighting_max_colour_temp:
name: Dynamic Lighting - Max Colour Temperature
description: '**Used in options 3, 6, 7, 8, 9, 10 or 13** - Specify the
@@ -679,9 +686,9 @@ blueprint:
value: enable_state_control
- label: Disable State Control Option
value: disable_state_control
custom_value: false
sort: false
multiple: false
sort: false
custom_value: false
dynamic_lighting_state_control_activation_state:
name: Dynamic Lighting - State Control Activation State
description: 'Select the state the entity must be in to activate dynamic
@@ -698,9 +705,9 @@ blueprint:
value: 'on'
- label: OFF State
value: 'off'
custom_value: false
sort: false
multiple: false
sort: false
custom_value: false
dynamic_lighting_state_control_entity:
name: Dynamic Lighting - State Control Entity
description: 'If the state control option above is enabled, select the entity
@@ -734,8 +741,8 @@ blueprint:
- label: 3 - Enable the Bypass - Keep the Lights Current State
value: bypass_enabled_stop
multiple: true
custom_value: false
sort: false
custom_value: false
motion_bypass_lights_on:
name: Bypass Switch - Turn the Lights ON
description: 'Select the switches that will turn your lights ON, bypass
@@ -748,6 +755,7 @@ blueprint:
selector:
entity:
multiple: true
reorder: false
motion_bypass_lights_off:
name: Bypass Switch - Turn the Lights OFF
description: 'Select the switches that will turn your lights OFF, bypass
@@ -760,6 +768,7 @@ blueprint:
selector:
entity:
multiple: true
reorder: false
motion_bypass_lights_stop:
name: Bypass Switch - Keep the Lights Current State
description: 'Select the switches that will keep your lights current state,
@@ -772,6 +781,7 @@ blueprint:
selector:
entity:
multiple: true
reorder: false
bypass_time_delay:
name: Bypass - Time Delay
description: "This is only used in two specific bypass scenarios when your
@@ -807,8 +817,8 @@ blueprint:
State
value: bypass_auto_off_enabled_stop
multiple: true
custom_value: false
sort: false
custom_value: false
bypass_auto_off_delay:
name: Bypass Auto OFF - Time Delay
description: 'Set the bypass auto OFF time delay. The time delay starts
@@ -848,9 +858,9 @@ blueprint:
value: sun_enabled
- label: Disable the sun option
value: sun_disabled
custom_value: false
sort: false
multiple: false
sort: false
custom_value: false
sun_elevation:
name: Sun Elevation Falling
description: 'The sun elevation falling refers to the angle between the
@@ -906,9 +916,9 @@ blueprint:
value: ambient_enabled
- label: Disable the ambient options
value: ambient_disabled
custom_value: false
sort: false
multiple: false
sort: false
custom_value: false
ambient_light_sensor:
name: Ambient Light Sensor
description: 'Select the ambient sensor to be used.
@@ -923,6 +933,7 @@ blueprint:
device_class:
- illuminance
multiple: false
reorder: false
ambient_light_options:
name: Ambient Light Sensor - Site Conditions
description: 'In some cases when your lights turn ON, your ambient light
@@ -942,9 +953,9 @@ blueprint:
value: ambient_light_option_enabled
- label: NO - My Ambient Light Sensor is not affected by the Lights
value: ambient_light_option_disabled
custom_value: false
sort: false
multiple: false
sort: false
custom_value: false
ambient_light_value:
name: Ambient Light - Low Lux Value
description: 'Set the Ambient Light Low Lux Value. The light will turn ON
@@ -1001,9 +1012,9 @@ blueprint:
value: time_enabled
- label: Disable the time options
value: time_disabled
custom_value: false
sort: false
multiple: false
sort: false
custom_value: false
after_time:
name: Start Time
description: 'Set the start time.
@@ -1054,8 +1065,57 @@ blueprint:
value: sat
- label: Sunday
value: sun
custom_value: false
sort: false
custom_value: false
state_control_settings:
name: State Control
icon: mdi:toggle-switch-outline
collapsed: true
input:
include_state_control:
name: Use The State Control Option (Optional)
description: 'This option is used to add a condition that only allows the
automation to run when the entity is in its selected activation state
below.
'
default: state_control_disabled
selector:
select:
options:
- label: Enable State Control Option
value: state_control_enabled
- label: Disable State Control Option
value: state_control_disabled
multiple: false
sort: false
custom_value: false
state_control_activation_state:
name: Activation State
description: 'Select the state (ON or OFF) the entity must be in so the
automation can run.
'
default: 'off'
selector:
select:
options:
- label: ON State
value: 'on'
- label: OFF State
value: 'off'
multiple: false
sort: false
custom_value: false
state_control_entity:
name: Control Entity
description: 'If State Control is enabled, select the entity that will allow
the automation to run based on the activation state selected above.
'
default: []
selector:
entity: {}
device_tracker_settings:
name: Device Tracker
icon: mdi:account-multiple-check-outline
@@ -1083,9 +1143,9 @@ blueprint:
value: zone_people_enabled
- label: Disable the device tracker options
value: device_tracker_disabled
custom_value: false
sort: false
multiple: false
sort: false
custom_value: false
zone:
name: Device Tracker - Zone
description: 'Choose the zone that will track your devices and/or people
@@ -1099,6 +1159,7 @@ blueprint:
- domain:
- zone
multiple: false
reorder: false
people:
name: Device Tracker - People
description: 'Select the people you would like to track in the zone selected
@@ -1112,6 +1173,7 @@ blueprint:
filter:
- domain:
- person
reorder: false
night_lights_trigger_settings:
name: Night Lights Settings
icon: mdi:weather-night
@@ -1137,9 +1199,9 @@ blueprint:
value: night_lights_enabled
- label: Disable the night lights options
value: night_lights_disabled
custom_value: false
sort: false
multiple: false
sort: false
custom_value: false
night_lights_conditions:
name: Night Lights Conditions (Required For Night Lights)
description: 'Select any night light condition from the options provided
@@ -1161,8 +1223,8 @@ blueprint:
value: time_enabled
- label: Enable sun elevation option
value: sun_enabled
custom_value: false
sort: false
custom_value: false
night_lights_entity_state:
name: Night Lights - Entity State
description: 'Select an entity that will trigger the activation of night
@@ -1179,6 +1241,7 @@ blueprint:
selector:
entity:
multiple: true
reorder: false
night_lights_after_time:
name: Night Lights - Start Time
description: 'Set the start time.
@@ -1270,6 +1333,7 @@ blueprint:
- domain:
- input_boolean
multiple: false
reorder: false
night_time_delay:
name: Night Lights - Time Delay
description: 'The time delay determines how long the night lights will remain
@@ -1315,8 +1379,8 @@ blueprint:
value: if_lights_are_on_adjust_when_crossing_over
- label: Yes - Manage OFF script when crossing over
value: manage_scripts_crossing_over
custom_value: false
sort: false
custom_value: false
night_light_brightness:
name: Night Lights - Brightness
description: 'The brightness setting of the lights when they are turned
@@ -1379,9 +1443,9 @@ blueprint:
value: use_rgbww_colour
- label: Disable Colour Control
value: disable_colour_control
custom_value: false
sort: false
multiple: false
sort: false
custom_value: false
night_light_colour_temperature:
name: Night Lights - Colour Temperature
description: 'The colour temperature setting for the lights when they are
@@ -1460,9 +1524,9 @@ blueprint:
value: night_glow_enabled
- label: Disable night glow
value: night_glow_disabled
custom_value: false
sort: false
multiple: false
sort: false
custom_value: false
night_glow_lights:
name: Night Glow - Lights
description: 'The lights, switches, scenes, and scripts to be used for a
@@ -1501,8 +1565,8 @@ blueprint:
value: use_brightness
- label: Use transition
value: use_transition
custom_value: false
sort: false
custom_value: false
night_glow_light_brightness:
name: Night Glow - Brightness
description: 'The brightness setting of the lights when they are turned
@@ -1565,9 +1629,9 @@ blueprint:
value: use_rgbww_colour
- label: Disable Colour Control
value: disable_colour_control
custom_value: false
sort: false
multiple: false
sort: false
custom_value: false
night_glow_light_colour_temperature:
name: Night Glow - Colour Temperature
description: 'The colour temperature setting for the lights when they are
@@ -1683,6 +1747,9 @@ variables:
after_time: !input after_time
before_time: !input before_time
weekday_options: !input weekday_options
include_state_control: !input include_state_control
state_control_activation_state: !input state_control_activation_state
state_control_entity: !input state_control_entity
include_device_tracker: !input include_device_tracker
zone: !input zone
people: !input people
@@ -1963,8 +2030,16 @@ triggers:
id: t16
entity_id: !input dynamic_lighting_state_control_entity
from: !input dynamic_lighting_state_control_activation_state
- trigger: homeassistant
- trigger: state
id: t17
entity_id: !input state_control_entity
to: !input state_control_activation_state
- trigger: state
id: t18
entity_id: !input state_control_entity
from: !input state_control_activation_state
- trigger: homeassistant
id: t19
event: start
condition:
- condition: or
@@ -2288,6 +2363,40 @@ condition:
conditions:
- condition: trigger
id: t17
- condition: state
entity_id: !input motion_trigger
state: 'on'
match: any
- condition: template
value_template: '{{ include_state_control == ''state_control_enabled'' }}'
- condition: and
conditions:
- condition: trigger
id: t18
- condition: template
value_template: '{{ include_state_control == ''state_control_enabled'' }}'
- condition: or
conditions:
- '{{ (expand(light_switch.entity_id) | selectattr(''state'', ''=='', ''on'')
| list | count > 0) }}'
- '{{ (include_night_lights == ''night_lights_enabled'') and (expand(night_lights.entity_id)
| selectattr(''state'', ''=='', ''on'') | list | count > 0) }}'
- '{{ (include_night_lights == ''night_lights_enabled'') and (include_night_glow
== ''night_glow_enabled'') and (expand(night_glow_lights.entity_id) | selectattr(''state'',
''=='', ''on'') | list | count > 0) }}'
- condition: template
value_template: "{% if boolean_scenes_scripts != [] %}\n {{ is_state(boolean_scenes_scripts,
'on') }}\n{% endif %}"
- condition: template
value_template: "{% if night_boolean_scenes_scripts != [] %}\n {{ is_state(night_boolean_scenes_scripts,
'on') }}\n{% endif %}"
- condition: template
value_template: "{% if dynamic_lighting_boolean != [] %}\n {{ is_state(dynamic_lighting_boolean,
'on') }}\n{% endif %}"
- condition: and
conditions:
- condition: trigger
id: t19
- condition: or
conditions:
- '{{ (expand(light_switch.entity_id) | selectattr(''state'', ''=='', ''on'')
@@ -2306,7 +2415,7 @@ condition:
- condition: and
conditions:
- condition: trigger
id: t17
id: t19
- condition: state
entity_id: !input motion_trigger
match: any
@@ -2314,7 +2423,7 @@ condition:
- condition: and
conditions:
- condition: trigger
id: t17
id: t19
- '{{ (''bypass_auto_off_enabled_on'' in include_bypass_auto_off) or (''bypass_auto_off_enabled_off''
in include_bypass_auto_off) or (''bypass_auto_off_enabled_stop'' in include_bypass_auto_off)
}}'
@@ -2407,7 +2516,7 @@ condition:
- t8_on
- t8_off
- t8_stop
- t17
- t19
- condition: or
conditions:
- '{{ include_sun == ''sun_disabled'' }}'
@@ -2502,6 +2611,26 @@ condition:
- t8_off
- t8_stop
- t11
- condition: or
conditions:
- condition: template
value_template: '{{ include_state_control == ''state_control_disabled'' }}'
- condition: and
conditions:
- condition: template
value_template: '{{ include_state_control == ''state_control_enabled'' }}'
- condition: state
entity_id: !input state_control_entity
state: !input state_control_activation_state
- condition: trigger
id:
- t7_on
- t7_off
- t7_stop
- t8_on
- t8_off
- t8_stop
- t18
- condition: or
conditions:
- '{{ include_device_tracker == ''device_tracker_disabled'' }}'
@@ -3318,6 +3447,15 @@ action:
- condition: time
after: !input before_time
before: !input after_time
- condition: and
conditions:
- condition: template
value_template: '{{ include_state_control == ''state_control_enabled''
}}'
- condition: template
value_template: '{% set opposite = ''off'' if state_control_activation_state
== ''on'' else ''on'' %} {{ is_state(state_control_entity, opposite)
}}'
sequence:
- alias: Wait the number of minutes set in the by-pass time delay
delay:
@@ -3591,13 +3729,14 @@ action:
entity_id: '{{ crossover_night_lights_light_on }}'
data: '{{ night_light_data }}'
- choose:
- alias: Sun, ambient & time above setting to turn off
- alias: Sun, ambient, time & state control above setting to turn off
conditions:
- condition: trigger
id:
- t9
- t10
- t11
- t18
sequence:
- choose:
- alias: If transition is selected
@@ -3834,7 +3973,7 @@ action:
- alias: Safe Guard when HA restarts
conditions:
- condition: trigger
id: t17
id: t19
sequence:
- choose:
- alias: Check all by-pass are off and check conditions if enabled
@@ -5310,6 +5449,15 @@ action:
after: !input before_time
before: !input after_time
- '{{ include_time == ''time_enabled'' }}'
- condition: and
conditions:
- condition: template
value_template: '{{ include_state_control == ''state_control_enabled''
}}'
- condition: template
value_template: '{% set opposite = ''off'' if state_control_activation_state
== ''on'' else ''on'' %} {{ is_state(state_control_entity, opposite)
}}'
sequence:
- alias: Wait the number of minutes set in the by-pass time delay
delay:
@@ -5663,13 +5811,14 @@ action:
data:
entity_id: !input dynamic_lighting_boolean
- choose:
- alias: Sun, ambient & time above setting to turn off
- alias: Sun, ambient, time & state control above setting to turn off
conditions:
- condition: trigger
id:
- t9
- t10
- t11
- t18
sequence:
- choose:
- alias: If transition is selected
@@ -5905,7 +6054,7 @@ action:
- alias: Safe Guard when HA restarts
conditions:
- condition: trigger
id: t17
id: t19
sequence:
- choose:
- alias: Check all by-pass are off and check conditions if enabled
@@ -6286,7 +6435,11 @@ action:
delay:
minutes: !input dynamic_lighting_heartbeat
- alias: If dynamic lighting brightness is in the dead zone
conditions: '{{ in_dead_zone }}'
conditions:
- condition: template
value_template: '{{ in_dead_zone }}'
- condition: template
value_template: '{{ repeat.index != 1 }}'
sequence:
- alias: Dynamic lighting heartbeat
delay:
@@ -6426,7 +6579,11 @@ action:
delay:
minutes: !input dynamic_lighting_heartbeat
- alias: If dynamic lighting brightness is in the dead zone
conditions: '{{ in_dead_zone }}'
conditions:
- condition: template
value_template: '{{ in_dead_zone }}'
- condition: template
value_template: '{{ repeat.index != 1 }}'
sequence:
- alias: Dynamic lighting heartbeat
delay:
@@ -7492,7 +7649,11 @@ action:
delay:
minutes: !input dynamic_lighting_heartbeat
- alias: If dynamic lighting brightness is in the dead zone
conditions: '{{ in_dead_zone }}'
conditions:
- condition: template
value_template: '{{ in_dead_zone }}'
- condition: template
value_template: '{{ repeat.index != 1 }}'
sequence:
- alias: Dynamic lighting heartbeat
delay:
@@ -7853,7 +8014,11 @@ action:
delay:
minutes: !input dynamic_lighting_heartbeat
- alias: If dynamic lighting brightness is in the dead zone
conditions: '{{ in_dead_zone }}'
conditions:
- condition: template
value_template: '{{ in_dead_zone }}'
- condition: template
value_template: '{{ repeat.index != 1 }}'
sequence:
- alias: Dynamic lighting heartbeat
delay:

View File

@@ -0,0 +1,42 @@
`${(() => {
const occupancy = hass?.states[this.config?.main_button_floors?.occupancy_entity]?.state || '';
const hot = hass?.states[this.config?.main_button_floors?.hot_entity]?.state || '';
const cold = hass?.states[this.config?.main_button_floors?.cold_entity]?.state || '';
let bg_color = 'var(--bubble-main-background-color)';
let occupied_color = 'var(--accent-color)';
let hot_color = 'var(--error-color)';
let cold_color = 'var(--purple-color)';
// Main button background
const mainButton = card?.querySelector('.bubble-button-background');
if (mainButton) {
mainButton.style.opacity = '1';
mainButton.style.backgroundColor = occupancy === 'on' ? occupied_color : bg_color;
mainButton.style.transition = 'background-color 1s';
}
// Sub button 1
const subButton1 = card?.querySelector('.bubble-sub-button-1');
if (subButton1) {
if (hot === 'on') {
subButton1.style.backgroundColor = hot_color;
} else if (cold === 'on') {
subButton1.style.backgroundColor = cold_color;
} else if (occupancy === 'on') {
subButton1.style.backgroundColor = occupied_color;
} else {
subButton1.style.backgroundColor = bg_color;
}
}
// Unavailable state
if (mainButton && occupancy === 'unavailable') {
mainButton.classList.add('is-unavailable');
} else if (mainButton) {
mainButton.classList.remove('is-unavailable');
}
// No CSS string needed
return '';
})()}`

View File

@@ -0,0 +1,22 @@
- type: expandable
title: Entity Configuration
icon: mdi:format-list-bulleted
schema:
- name: occupancy_entity
label: Occupancy Entity
selector:
entity:
device_class: occupancy
required: false
- name: hot_entity
label: Hot Entity
selector:
entity:
device_class: heat
required: false
- name: cold_entity
label: Cold Entity
selector:
entity:
device_class: cold
required: false

View File

@@ -0,0 +1,73 @@
main_button_floors:
name: Main Button Floors
version: '1.1'
creator: Tony Stork
supported:
- button
description: Module to provide theming for the main indoor floor buttons
code: |
${(() => {
const occupancy = hass?.states[this.config?.main_button_floors?.occupancy_entity]?.state || '';
const hot = hass?.states[this.config?.main_button_floors?.hot_entity]?.state || '';
const cold = hass?.states[this.config?.main_button_floors?.cold_entity]?.state || '';
let bg_color = 'var(--bubble-main-background-color)';
let occupied_color = 'var(--accent-color)';
let hot_color = 'var(--error-color)';
let cold_color = 'var(--purple-color)';
// Main button background
const mainButton = card?.querySelector('.bubble-button-background');
if (mainButton) {
mainButton.style.opacity = '1';
mainButton.style.backgroundColor = occupancy === 'on' ? occupied_color : bg_color;
mainButton.style.transition = 'background-color 1s';
}
// Sub button 1
const subButton1 = card?.querySelector('.bubble-sub-button-1');
if (subButton1) {
if (hot === 'on') {
subButton1.style.backgroundColor = hot_color;
} else if (cold === 'on') {
subButton1.style.backgroundColor = cold_color;
} else if (occupancy === 'on') {
subButton1.style.backgroundColor = occupied_color;
} else {
subButton1.style.backgroundColor = bg_color;
}
}
// Unavailable state
if (mainButton && occupancy === 'unavailable') {
mainButton.classList.add('is-unavailable');
} else if (mainButton) {
mainButton.classList.remove('is-unavailable');
}
// No CSS string needed
return '';
})()}
editor:
- type: expandable
title: Entity Configuration
icon: mdi:format-list-bulleted
schema:
- name: occupancy_entity
label: Occupancy Entity
selector:
entity:
device_class: occupancy
required: false
- name: hot_entity
label: Hot Entity
selector:
entity:
device_class: heat
required: false
- name: cold_entity
label: Cold Entity
selector:
entity:
device_class: cold
required: false

View File

@@ -0,0 +1,24 @@
`${(() => {
const occupancy = hass?.states[this.config?.main_button_outdoors?.occupancy_entity]?.state || '';
let bg_color = 'var(--bubble-main-background-color)';
let occupied_color = 'var(--accent-color)';
// Main button background
const mainButton = card?.querySelector('.bubble-button-background');
if (mainButton) {
mainButton.style.opacity = '1';
mainButton.style.backgroundColor = occupancy === 'on' ? occupied_color : bg_color;
mainButton.style.transition = 'background-color 1s';
}
// Unavailable state
if (mainButton && occupancy === 'unavailable') {
mainButton.classList.add('is-unavailable');
} else if (mainButton) {
mainButton.classList.remove('is-unavailable');
}
// No CSS string needed
return '';
})()}`

View File

@@ -0,0 +1,10 @@
- type: expandable
title: Entity Configuration
icon: mdi:format-list-bulleted
schema:
- name: occupancy_entity
label: Occupancy Entity
selector:
entity:
device_class: occupancy
required: false

View File

@@ -0,0 +1,43 @@
main_button_outdoors:
name: Main Button Outdoors
version: '1.1'
creator: Tony Stork
supported:
- button
description: Module to provide theming for outdoor floor buttons
code: |
${(() => {
const occupancy = hass?.states[this.config?.main_button_outdoors?.occupancy_entity]?.state || '';
let bg_color = 'var(--bubble-main-background-color)';
let occupied_color = 'var(--accent-color)';
// Main button background
const mainButton = card?.querySelector('.bubble-button-background');
if (mainButton) {
mainButton.style.opacity = '1';
mainButton.style.backgroundColor = occupancy === 'on' ? occupied_color : bg_color;
mainButton.style.transition = 'background-color 1s';
}
// Unavailable state
if (mainButton && occupancy === 'unavailable') {
mainButton.classList.add('is-unavailable');
} else if (mainButton) {
mainButton.classList.remove('is-unavailable');
}
// No CSS string needed
return '';
})()}
editor:
- type: expandable
title: Entity Configuration
icon: mdi:format-list-bulleted
schema:
- name: occupancy_entity
label: Occupancy Entity
selector:
entity:
device_class: occupancy
required: false

View File

@@ -0,0 +1,24 @@
`${(() => {
const state = hass?.states[this.config?.entity]?.state || '';
let bg_color = 'var(--background-color-2)';
let accent_color = 'var(--accent-color)';
// Main button background
const mainButton = card?.querySelector('.bubble-button-background');
if (mainButton) {
mainButton.style.opacity = '1';
mainButton.style.backgroundColor = state === 'on' ? accent_color : bg_color;
mainButton.style.transition = 'background-color 1s';
}
// Unavailable state
if (mainButton && state === 'unavailable') {
mainButton.classList.add('is-unavailable');
} else if (mainButton) {
mainButton.classList.remove('is-unavailable');
}
// No CSS string needed
return '';
})()}`

View File

@@ -0,0 +1,33 @@
popup_accent_color_button:
name: Popup Accent Color Button
version: '1.0'
creator: Tony Stork
supported:
- button
description: Will turn the button to accent color variable if config entity is on, otherwise default style applies
code: |-
${(() => {
const state = hass?.states[this.config?.entity]?.state || '';
let bg_color = 'var(--background-color-2)';
let accent_color = 'var(--accent-color)';
// Main button background
const mainButton = card?.querySelector('.bubble-button-background');
if (mainButton) {
mainButton.style.opacity = '1';
mainButton.style.backgroundColor = state === 'on' ? accent_color : bg_color;
mainButton.style.transition = 'background-color 1s';
}
// Unavailable state
if (mainButton && state === 'unavailable') {
mainButton.classList.add('is-unavailable');
} else if (mainButton) {
mainButton.classList.remove('is-unavailable');
}
// No CSS string needed
return '';
})()}
editor: ''

View File

@@ -0,0 +1,24 @@
`${(() => {
const state = hass?.states[this.config?.entity]?.state || '';
let bg_color = 'var(--background-color-2)';
let red_color = 'var(--error-color)';
// Main button background
const mainButton = card?.querySelector('.bubble-button-background');
if (mainButton) {
mainButton.style.opacity = '1';
mainButton.style.backgroundColor = state === 'on' ? red_color : bg_color;
mainButton.style.transition = 'background-color 1s';
}
// Unavailable state
if (mainButton && state === 'unavailable') {
mainButton.classList.add('is-unavailable');
} else if (mainButton) {
mainButton.classList.remove('is-unavailable');
}
// No CSS string needed
return '';
})()}`

View File

@@ -0,0 +1,33 @@
popup_security_button:
name: Popup Security Button
version: '1.0'
creator: Tony Stork
supported:
- button
description: Will turn the button red if there is a security fault, otherwise default style applies
code: |-
${(() => {
const state = hass?.states[this.config?.entity]?.state || '';
let bg_color = 'var(--background-color-2)';
let red_color = 'var(--error-color)';
// Main button background
const mainButton = card?.querySelector('.bubble-button-background');
if (mainButton) {
mainButton.style.opacity = '1';
mainButton.style.backgroundColor = state === 'on' ? red_color : bg_color;
mainButton.style.transition = 'background-color 1s';
}
// Unavailable state
if (mainButton && state === 'unavailable') {
mainButton.classList.add('is-unavailable');
} else if (mainButton) {
mainButton.classList.remove('is-unavailable');
}
// No CSS string needed
return '';
})()}
editor: ''

View File

@@ -0,0 +1,32 @@
`${(() => {
const hot = hass?.states[this.config?.popup_temperature_button?.hot_entity]?.state || '';
const cold = hass?.states[this.config?.popup_temperature_button?.cold_entity]?.state || '';
let bg_color = 'var(--background-color-2)';
let hot_color = 'var(--error-color)';
let cold_color = 'var(--cyan-color)';
// Main button background
const mainButton = card?.querySelector('.bubble-button-background');
if (mainButton) {
mainButton.style.opacity = '1';
if (hot === 'on') {
mainButton.style.backgroundColor = hot_color;
} else if (cold === 'on') {
mainButton.style.backgroundColor = cold_color;
} else {
mainButton.style.backgroundColor = bg_color;
}
mainButton.style.transition = 'background-color 1s';
}
// Unavailable state
if (mainButton && state === 'unavailable') {
mainButton.classList.add('is-unavailable');
} else if (mainButton) {
mainButton.classList.remove('is-unavailable');
}
// No CSS string needed
return '';
})()}`

View File

@@ -0,0 +1,14 @@
- type: expandable
title: Entity Configuration
icon: mdi:format-list-bulleted
schema:
- name: hot_entity
label: Hot Entity
selector:
entity:
device_class: heat
- name: cold_entity
label: Cold Entity
selector:
entity:
device_class: cold

View File

@@ -0,0 +1,55 @@
popup_temperature_button:
name: Popup Temperature Button
version: '1.0'
creator: Tony Stork
supported:
- button
description: Will turn the button red if the room is too hot, cyan if too cold, otherwise default style applies
code: |-
${(() => {
const hot = hass?.states[this.config?.popup_temperature_button?.hot_entity]?.state || '';
const cold = hass?.states[this.config?.popup_temperature_button?.cold_entity]?.state || '';
let bg_color = 'var(--background-color-2)';
let hot_color = 'var(--error-color)';
let cold_color = 'var(--cyan-color)';
// Main button background
const mainButton = card?.querySelector('.bubble-button-background');
if (mainButton) {
mainButton.style.opacity = '1';
if (hot === 'on') {
mainButton.style.backgroundColor = hot_color;
} else if (cold === 'on') {
mainButton.style.backgroundColor = cold_color;
} else {
mainButton.style.backgroundColor = bg_color;
}
mainButton.style.transition = 'background-color 1s';
}
// Unavailable state
if (mainButton && state === 'unavailable') {
mainButton.classList.add('is-unavailable');
} else if (mainButton) {
mainButton.classList.remove('is-unavailable');
}
// No CSS string needed
return '';
})()}
editor:
- type: expandable
title: Entity Configuration
icon: mdi:format-list-bulleted
schema:
- name: hot_entity
label: Hot Entity
selector:
entity:
device_class: heat
- name: cold_entity
label: Cold Entity
selector:
entity:
device_class: cold

View File

@@ -0,0 +1,92 @@
:host{
--circle-color: var(--bubble-accent-color, var(--accent-color));
--percentage: ${(() => {
card.timerEntity = hass.states[entity];
const now = new Date();
const endTime = new Date(card.timerEntity.attributes.finishes_at);
const runningTime = Math.round((endTime - now) / 1000);
const maxtime = Math.round(new Date("1970-01-01 " + card.timerEntity.attributes.duration + " UTC") / 1000);
const remainingTime = Math.round(new Date("1970-01-01 " + card.timerEntity.attributes.remaining + " UTC") / 1000);
var percentage = 0;
if (isNaN(runningTime)) {
percentage = 100 - Math.round( 100.0 * remainingTime / maxtime);
} else {
percentage = 100 - Math.round( 100.0 * runningTime / maxtime);
}
if (isNaN(percentage)) {
return "0%";
} else {
return "" + percentage +"%";
}
})()};
}
.bubble-icon-container {
background: radial-gradient(
var(--card-background-color) 60%,
transparent 0%
), conic-gradient(
var(--circle-color) var(--percentage) 0%,
var(--card-background-color) 0% 100%
) !important;
}
.bubble-icon-container:after {
content: "" !important;
height: 100% !important;
width: 100% !important;
position: absolute !important;
border-radius: 50% !important;
background: (var(--bubble-button-icon-background-color), 0.1) !important;
}
${(() => {
function UpdateState(){
try {
let now = new Date();
let endTime = new Date(card.timerEntity.attributes.finishes_at);
let runningTime = Math.round((endTime - now)/1000);
let hours = Math.floor(runningTime / 3600);
let minutes = Math.floor((runningTime - (hours * 3600)) / 60);
let remainingSeconds = runningTime % 60;
card.querySelector('.bubble-state').innerText =
(hours > 0 ? (hours + ":") : "") +
("0" + minutes).slice(-2) + ":" +
("0" + remainingSeconds).slice(-2);
} catch (error) {
card.querySelector('.bubble-state').innerText = card.timerEntity.attributes.duration;
}
};
if (card.timer == null && card.timerEntity.state === 'active') {
card.timer = setInterval(()=>{UpdateState()}, 500);
}else if (card.timerEntity.state != 'active'){
clearInterval(card.timer);
card.timer = null;
if (card.timerEntity.state !='paused') {
card.querySelector('.bubble-state').innerText = card.timerEntity.attributes.duration;
} else if(card.timerEntity.state==='paused') {
card.querySelector('.bubble-state').innerText = card.timerEntity.attributes.remaining;
}
}
})()}
${(() => {
subButtonIcon[0].setAttribute("icon",card.timerEntity.state != 'active' ?'mdi:play' : 'mdi:replay');
})()}
${(() => {
if (card.timerEntity.state != 'active') {
card.querySelector('.bubble-sub-button-2').classList.add("hidden");
}
})()}
${(() => {
if (card.timerEntity.state === 'idle') {
card.querySelector('.bubble-sub-button-3').classList.add("hidden");
}
})()}
${(() => {
if (card.timerEntity.state === 'idle') {
card.querySelector('.bubble-sub-button-4').classList.add("hidden");
}
})()}

View File

@@ -0,0 +1,101 @@
popup_timer_card:
name: Popup Timer Card
version: '1.0'
creator: Tony Stork
supported:
- button
description: Will turn the button red if the entity state is on, otherwise default style applies
code: |-
:host{
--circle-color: var(--bubble-accent-color, var(--accent-color));
--percentage: ${(() => {
card.timerEntity = hass.states[entity];
const now = new Date();
const endTime = new Date(card.timerEntity.attributes.finishes_at);
const runningTime = Math.round((endTime - now) / 1000);
const maxtime = Math.round(new Date("1970-01-01 " + card.timerEntity.attributes.duration + " UTC") / 1000);
const remainingTime = Math.round(new Date("1970-01-01 " + card.timerEntity.attributes.remaining + " UTC") / 1000);
var percentage = 0;
if (isNaN(runningTime)) {
percentage = 100 - Math.round( 100.0 * remainingTime / maxtime);
} else {
percentage = 100 - Math.round( 100.0 * runningTime / maxtime);
}
if (isNaN(percentage)) {
return "0%";
} else {
return "" + percentage +"%";
}
})()};
}
.bubble-icon-container {
background: radial-gradient(
var(--card-background-color) 60%,
transparent 0%
), conic-gradient(
var(--circle-color) var(--percentage) 0%,
var(--card-background-color) 0% 100%
) !important;
}
.bubble-icon-container:after {
content: "" !important;
height: 100% !important;
width: 100% !important;
position: absolute !important;
border-radius: 50% !important;
background: (var(--bubble-button-icon-background-color), 0.1) !important;
}
${(() => {
function UpdateState(){
try {
let now = new Date();
let endTime = new Date(card.timerEntity.attributes.finishes_at);
let runningTime = Math.round((endTime - now)/1000);
let hours = Math.floor(runningTime / 3600);
let minutes = Math.floor((runningTime - (hours * 3600)) / 60);
let remainingSeconds = runningTime % 60;
card.querySelector('.bubble-state').innerText =
(hours > 0 ? (hours + ":") : "") +
("0" + minutes).slice(-2) + ":" +
("0" + remainingSeconds).slice(-2);
} catch (error) {
card.querySelector('.bubble-state').innerText = card.timerEntity.attributes.duration;
}
};
if (card.timer == null && card.timerEntity.state === 'active') {
card.timer = setInterval(()=>{UpdateState()}, 500);
}else if (card.timerEntity.state != 'active'){
clearInterval(card.timer);
card.timer = null;
if (card.timerEntity.state !='paused') {
card.querySelector('.bubble-state').innerText = card.timerEntity.attributes.duration;
} else if(card.timerEntity.state==='paused') {
card.querySelector('.bubble-state').innerText = card.timerEntity.attributes.remaining;
}
}
})()}
${(() => {
subButtonIcon[0].setAttribute("icon",card.timerEntity.state != 'active' ?'mdi:play' : 'mdi:replay');
})()}
${(() => {
if (card.timerEntity.state != 'active') {
card.querySelector('.bubble-sub-button-2').classList.add("hidden");
}
})()}
${(() => {
if (card.timerEntity.state === 'idle') {
card.querySelector('.bubble-sub-button-3').classList.add("hidden");
}
})()}
${(() => {
if (card.timerEntity.state === 'idle') {
card.querySelector('.bubble-sub-button-4').classList.add("hidden");
}
})()}
editor: ''

View File

@@ -0,0 +1,21 @@
rotating_icon:
name: Rotating Icon
version: '0.1'
creator: Tony Stork
supported:
- button
- climate
- media-player
- pop-up
- separator
- horizontal-buttons-stack
description: Simple, make the icon rotate when the config entity is on
code: |-
.bubble-icon {
animation: ${state === 'on' ? 'slow-rotate 2s linear infinite' : ''};
}
@keyframes slow-rotate {
0% { transform: rotate(0deg); }
100% { transform: rotate(360deg); }
}
editor: ''

View File

@@ -0,0 +1,41 @@
`${(() => {
let state;
if (this.config?.state_color_button?.alt_entity) {
state = hass?.states[this.config?.state_color_button?.alt_entity]?.state || '';
} else {
state = hass?.states[this.config?.entity]?.state || '';
}
let bg_color = 'var(--bubble-main-background-color)';
// Use the configured color or default to accent color
let on_color = this.config?.state_color_button?.color
? `var(--${this.config.state_color_button.color})`
: 'var(--accent-color)';
// Main button background
const mainButton = card?.querySelector('.bubble-button-background');
if (mainButton) {
mainButton.style.opacity = '1';
mainButton.style.backgroundColor = state === 'on' ? on_color : bg_color;
mainButton.style.transition = 'background-color 1s';
}
// Icon color
const icon = card?.querySelector('.bubble-icon');
if (icon) {
icon.style.color = state === 'on' ? on_color : 'var(--bubble-main-icon-color)';
icon.style.transition = 'color 1s';
}
// Unavailable state
if (mainButton && state === 'unavailable') {
mainButton.style.opacity = '0.5';
mainButton.classList.add('is-unavailable');
} else if (mainButton) {
mainButton.classList.remove('is-unavailable');
}
// No CSS string needed
return '';
})()}`

View File

@@ -0,0 +1,10 @@
- name: color
label: Color (CSS Variable)
selector:
text: {}
required: false
- name: alt_entity
label: Entity (Optional, overrides main config)
selector:
entity: {}
required: false

View File

@@ -0,0 +1,68 @@
state_color_button:
name: State Color Button
version: 1.1.3
creator: Tony Stork
supported:
- button
description: |-
Module for status buttons that turn a color based on the state of the config entity. Will default to the accent color in your theme. Use the name of a CSS variable. You can also specify an alternate entity to get state from, this will override the main card config.
<br><br>
Example:
<br><br>
<code-block><pre>
color: error-color
alt_entity: sensor.your_face
</pre></code-block>
code: |-
${(() => {
let state;
if (this.config?.state_color_button?.alt_entity) {
state = hass?.states[this.config?.state_color_button?.alt_entity]?.state || '';
} else {
state = hass?.states[this.config?.entity]?.state || '';
}
let bg_color = 'var(--bubble-main-background-color)';
// Use the configured color or default to accent color
let on_color = this.config?.state_color_button?.color
? `var(--${this.config.state_color_button.color})`
: 'var(--accent-color)';
// Main button background
const mainButton = card?.querySelector('.bubble-button-background');
if (mainButton) {
mainButton.style.opacity = '1';
mainButton.style.backgroundColor = state === 'on' ? on_color : bg_color;
mainButton.style.transition = 'background-color 1s';
}
// Icon color
const icon = card?.querySelector('.bubble-icon');
if (icon) {
icon.style.color = state === 'on' ? on_color : 'var(--bubble-main-icon-color)';
icon.style.transition = 'color 1s';
}
// Unavailable state
if (mainButton && state === 'unavailable') {
mainButton.style.opacity = '0.5';
mainButton.classList.add('is-unavailable');
} else if (mainButton) {
mainButton.classList.remove('is-unavailable');
}
// No CSS string needed
return '';
})()}
editor:
- name: color
label: Color (CSS Variable)
selector:
text: {}
required: false
- name: alt_entity
label: Entity (Optional, overrides main config)
selector:
entity: {}
required: false

View File

@@ -117,6 +117,7 @@ recorder:
- sensor.mosquitto*
- sensor.*_rssi
- sensor.weatherflow_hub*
- sensor.internet_round_trip*
entities:
- sensor.avg_ping
- sensor.max_ping
@@ -299,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
@@ -483,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

@@ -825,7 +825,21 @@
'ottobre',
'novembre',
'dicembre',
]
],
'time_of_hour':{
0: '{hour}',
1: '{hour} e un minuto',
15: '{hour} ed un quarto',
30: '{hour} e mezzo',
45: '15 minuti alle {hour}',
59: 'un minuto alle {hour}',
'past_hour': '{hour} e {minute}',
'to_hour': '{hour} meno {minute}',
},
'time_of_day':{
'midnight': 'mezzanotte',
'noon': 'mezzogiorno',
}
},
'pt':{
'_language': 'Português',
@@ -1041,7 +1055,21 @@
'Październik',
'Listopad',
'Grudzień',
]
],
'time_of_hour': {
0: '{hour}',
1: 'minuta po {hour}',
15: 'kwadrans po {hour}',
30: 'pół godziny po {hour}',
45: 'za kwadrans {hour}',
59: 'za minutę {hour}',
'past_hour': '{minute} po {hour}',
'to_hour': '{minute} do {hour}'
},
'time_of_day': {
'midnight': 'północ',
'noon': 'południe'
}
},
'ru':{
'_language': 'Русский',
@@ -1779,9 +1807,9 @@
{%- else %}
{%- set t = translate('ago', language=language) %}
{%- if '%s' in t %}
{{ t % items }}
{{- t % items }}
{%- else %}
{{- items }} {{ translate('ago', language=language) }}
{{- items }} {{ t }}
{%- endif %}
{%- endif %}
{%- else %}
@@ -2045,7 +2073,7 @@
{%- if '%s' in t %}
{{- t % ret }}
{%- else %}
{{- ret }} {{ translate('ago', language=language) }}
{{- ret }} {{ t }}
{%- endif %}
{%- endif %}
{%- endif %}

View File

@@ -236,7 +236,7 @@
'hour': ['ч', 'час', 'часа', 'часов'],
'minute': ['м', 'минута', 'минуты', 'минут'],
'second': ['с', 'секунда', 'секунды', 'секунд'],
'millisecond': ['мс', 'милисекунда', 'милисекунды', 'милисекунд'],
'millisecond': ['мс', 'миллисекунда', 'миллисекунды', 'миллисекунд'],
'combine': 'и',
'error': 'Неверная дата',
}
@@ -337,6 +337,22 @@
'error': 'Érvénytelen dátum',
}
},
{
'language': 'tr',
'plural_form': 'english',
'phrases': {
'year': ['yıl', 'yıl', 'yıl'],
'month': ['ay', 'ay', 'ay'],
'week': ['hf', 'hafta', 'hafta'],
'day': ['gün', 'gün', 'gün'],
'hour': ['sa', 'saat', 'saat'],
'minute': ['dk', 'dakika', 'dakika'],
'second': ['sn', 'saniye', 'saniye'],
'millisecond': ['ms', 'milisaniye', 'milisaniye'],
'combine': 've',
'error': 'Geçersiz tarih',
}
},
] -%}
{# macro to convert the abbreviated input for the not_use and always_show lists to the full time part names #}

View File

@@ -27,8 +27,15 @@
{% 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 }}
{% if 'rain delay' in game_clock %}
{# Handle cases like "Rain Delay, Top 1st" #}
{% set status, inning = game_clock.split(',', 1) %}
{% set inning_parts = inning.split(' ') %}
in a {{ status | trim }} in the {{ inning_parts[1] ~ ' of the ' ~ inning_parts[2] }} {{ period_str }}
{% else %}
{% set inning_parts = game_clock.split(' ') %}
in the {{ inning_parts[0] ~ ' of the ' ~ inning_parts[1] ~ ' ' ~ period_str }}
{% endif %}
{% else %}
{% if ' - ' in game_clock %}
{% set clock_time, quarter = game_clock.split(' - ') %}

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

@@ -239,6 +239,9 @@ script:
server_maintenance_annc:
alias: Server Maintenance Announcement
sequence:
- service: input_boolean.turn_on
target:
entity_id: input_boolean.server_maintenance
- service: script.status_annc
data:
who: "{{ who|default('everywhere') }}"
@@ -248,6 +251,9 @@ script:
server_maintenance_done_annc:
alias: Server Maintenance Done Announcement
sequence:
- service: input_boolean.turn_off
target:
entity_id: input_boolean.server_maintenance
- service: script.status_annc
data:
who: "{{ who|default('everywhere') }}"

View File

@@ -324,6 +324,13 @@ input_number:
step: 1
unit_of_measurement: °F
icon: mdi:thermometer
master_bedroom_mode_switch_threshold:
name: Master Bedroom Mode Switch Threshold
min: 60
max: 80
step: 1
unit_of_measurement: °F
icon: mdi:thermometer
emma_bedroom_daytime_temp:
name: Emma Bedroom Daytime Temp
min: 65
@@ -373,6 +380,13 @@ input_number:
step: 1
unit_of_measurement: °F
icon: mdi:thermometer
emma_bedroom_mode_switch_threshold:
name: Emma Bedroom Mode Switch Threshold
min: 60
max: 80
step: 1
unit_of_measurement: °F
icon: mdi:thermometer
kallen_fan_threshold:
name: Kallen Fan Threshold
min: 40

View File

@@ -808,6 +808,11 @@ template:
states('sensor.home_tempest_cloud_sensors_precipitation_description') in ['rain','heavy_rain'] or
is_state('binary_sensor.home_tempest_cloud_binary_sensors_is_raining','on') }}
icon: "{{ 'mdi:weather-rainy' if this.state == 'on' else 'mdi:weather-cloudy' }}"
- name: Tornado Possible
unique_id: 541fed1d-2086-47ee-be1b-3f1ea4199e1f
state: "{{ state_attr('binary_sensor.severe_thunderstorm_warning','tornado_possible') }}"
device_class: safety
icon: "{{ 'mdi:weather-tornado' if this.state == 'on' else 'mdi:close' }}"
- sensor:
# - name: Total Rain Sensors
# unique_id: b7c2e709-8f5c-4263-aa1d-fa8280afcddb
@@ -860,30 +865,30 @@ template:
icon: mdi:weather-sunny
state: >-
{% from 'formatting.jinja' import cleanup %}
{%- macro getReport() -%}
{% macro getReport() %}
{{ [
'Today in Defiance ',
'Later Today ',
'For the rest of the day '
] | random }}
expect a high of {{ states('sensor.todays_high_temp') }}
{%- if states('sensor.current_forecast') == 'sunny' and is_state('binary_sensor.night','off')%}
{% if states('sensor.current_forecast') == 'sunny' and is_state('binary_sensor.night','off')%}
{{ [
'and sunny. ',
'with sun. ',
'with sunny conditions prevailing. '
] | random }}
{%- elif states('sensor.current_forecast') == 'sunny' and is_state('binary_sensor.night','on') %}
{% elif states('sensor.current_forecast') == 'sunny' and is_state('binary_sensor.night','on') %}
{{ [
'and clear. ',
'with clear skies. '
] | random }}
{%- elif states('sensor.current_forecast') == 'clear-night' %}
{% elif states('sensor.current_forecast') == 'clear-night' %}
{{ [
'and clear. ',
'with clear skies. '
] | random }}
{%- elif states('sensor.current_forecast') == 'rainy' %}
{% elif states('sensor.current_forecast') == 'rainy' %}
{{ [
'with rain. ',
'with showers. ',
@@ -895,7 +900,7 @@ template:
] | random }}
near {{ state_attr('sensor.current_forecast','precipitation') }} inches
{{ 'possible. ' }}
{%- elif states('sensor.current_forecast') == 'snowy' %}
{% elif states('sensor.current_forecast') == 'snowy' %}
{{ [
'with snow. ',
'with snow showers. '
@@ -906,19 +911,19 @@ template:
] | random }}
near {{ state_attr('sensor.current_forecast','precipitation') }} inches
{{ 'possible. ' }}
{%- elif states('sensor.current_forecast') == 'snowy-rainy' %}
{% elif states('sensor.current_forecast') == 'snowy-rainy' %}
{{ [
'with mix preciptation possible. ',
'with snow and rain showers. '
] | random }}
Total accumulation near {{ state_attr('sensor.current_forecast','precipitation') }} inches
{{ 'possible. ' }}
{%- elif states('sensor.current_forecast') == 'windy' %}
{% elif states('sensor.current_forecast') == 'windy' %}
{{ [
'and windy. ',
'with lots of wind. '
] | random }}
{%- elif states('sensor.current_forecast') == 'fog' %}
{% elif states('sensor.current_forecast') == 'fog' %}
{{ [
'and foggy. ',
'with some fog. '
@@ -934,7 +939,7 @@ template:
'with partly cloudy skies. ',
'with scattered clouds '
] | random }}
{%- elif states('sensor.current_forecast') == 'hail' %}
{% elif states('sensor.current_forecast') == 'hail' %}
{{ [
'with severe thunderstorms possible. ',
'with hail possible. '
@@ -945,7 +950,7 @@ template:
] | random }}
near {{ state_attr('sensor.current_forecast','precipitation') }} inches
{{ 'possible. ' }}
{%- elif states('sensor.current_forecast') == 'lightning' %}
{% elif states('sensor.current_forecast') == 'lightning' %}
{{ [
'with thunderstorms possible. ',
'with the potential of thunderstorms. '
@@ -956,14 +961,14 @@ template:
] | random }}
near {{ state_attr('sensor.current_forecast','precipitation') }} inches
{{ 'possible. ' }}
{% endif -%}
{% endif %}
{{ [
'Later tonight expect a low of ',
'Overnight expect a low of '
] | random }}
{{ states('sensor.overnight_lowest_temperature') }} degrees.
{%- endmacro -%}
{{- cleanup(getReport()) -}}
{% endmacro %}
{{ cleanup(getReport()) }}
- name: Tomorrows Forecast
unique_id: a8ae26b0-ed26-4568-bb2b-f7c72707b009
icon: mdi:weather-sunny
@@ -991,20 +996,20 @@ template:
icon: mdi:weather-sunny
state: >-
{% from 'formatting.jinja' import cleanup %}
{%- macro getReport() -%}
{% macro getReport() %}
{{ [
'Tomorrow in Defiance ',
'For the next day ',
'Tomorrow '
] | random }}
expect a high of {{ state_attr('sensor.tomorrow_forecast','high_temp') }} degrees.
{%- if states('sensor.tomorrow_forecast') == 'sunny' %}
{% if states('sensor.tomorrow_forecast') == 'sunny' %}
{{ [
'and sunny. ',
'with sun. ',
'with sunny conditions prevailing. '
] | random }}
{%- elif states('sensor.tomorrow_forecast') == 'rainy' %}
{% elif states('sensor.tomorrow_forecast') == 'rainy' %}
{{ [
'with rain. ',
'with showers. ',
@@ -1016,7 +1021,7 @@ template:
] | random }}
near {{ state_attr('sensor.tomorrow_forecast','precipitation') }} inches
{{ 'possible. ' }}
{%- elif states('sensor.tomorrow_forecast') == 'snowy' %}
{% elif states('sensor.tomorrow_forecast') == 'snowy' %}
{{ [
'with snow. ',
'with snow showers. '
@@ -1027,19 +1032,19 @@ template:
] | random }}
near {{ state_attr('sensor.tomorrow_forecast','precipitation') }} inches
{{ 'possible. ' }}
{%- elif states('sensor.tomorrow_forecast') == 'snowy-rainy' %}
{% elif states('sensor.tomorrow_forecast') == 'snowy-rainy' %}
{{ [
'with mix preciptation possible. ',
'with snow and rain showers. '
] | random }}
Total accumulation near {{ state_attr('sensor.tomorrow_forecast','precipitation') }} inches
{{ 'possible. ' }}
{%- elif states('sensor.tomorrow_forecast') == 'windy' %}
{% elif states('sensor.tomorrow_forecast') == 'windy' %}
{{ [
'and windy. ',
'with lots of wind. '
] | random }}
{%- elif states('sensor.current_forecast') == 'fog' %}
{% elif states('sensor.current_forecast') == 'fog' %}
{{ [
'and foggy. ',
'with some fog. '
@@ -1055,7 +1060,7 @@ template:
'with partly cloudy skies. ',
'with scattered clouds '
] | random }}
{%- elif states('sensor.tomorrow_forecast') == 'hail' %}
{% elif states('sensor.tomorrow_forecast') == 'hail' %}
{{ [
'with severe thunderstorms possible. ',
'with hail possible. '
@@ -1066,7 +1071,7 @@ template:
] | random }}
near {{ state_attr('sensor.current_forecast','precipitation') }} inches
{{ 'possible. ' }}
{%- elif states('sensor.current_forecast') == 'lightning' %}
{% elif states('sensor.current_forecast') == 'lightning' %}
{{ [
'with thunderstorms possible. ',
'with the potential of thunderstorms. '
@@ -1077,19 +1082,19 @@ template:
] | random }}
near {{ state_attr('sensor.current_forecast','precipitation') }} inches
{{ 'possible. ' }}
{% endif -%}
{% endif %}
{{ [
' Tomorrow night expect a low of '
] | random }}
{{ state_attr('sensor.tomorrow_forecast','overnight_low') }} degrees.
{%- endmacro -%}
{{- cleanup(getReport()) -}}
{% endmacro %}
{{ cleanup(getReport()) }}
- name: Current Conditions
unique_id: 70db7e57-08db-48b2-919b-03b5face37b9
icon: mdi:weather-sunny
state: >-
{% from 'formatting.jinja' import cleanup %}
{%- macro getReport() -%}
{% macro getReport() %}
The Weather in Defiance
{{ [
' is ',
@@ -1127,14 +1132,14 @@ template:
{% else %}
and {{ states.weather.iron_nerd_weather_station.state }}
{% endif %}
{%- endmacro -%}
{{- cleanup(getReport()) -}}
{% endmacro %}
{{ cleanup(getReport()) }}
- name: Current Conditions Detail
unique_id: 2b3687d1-bdd5-4551-8c0a-05b1ff617543
icon: mdi:weather-sunny
state: >-
{% from 'formatting.jinja' import cleanup %}
{%- macro getReport() -%}
{% macro getReport() %}
The Weather in Defiance
{{ [
' is ',
@@ -1172,29 +1177,29 @@ template:
{% else %}
and {{ states.weather.iron_nerd_weather_station.state }}.
{% endif %}
{%- if is_state('binary_sensor.early_night_mode','off')%}
{% if is_state('binary_sensor.early_night_mode','off')%}
{{ [
'Later Today ',
'For the rest of the day '
] | random }}
expect a high of {{ states('sensor.todays_high_temp') }}
{%- if states('sensor.current_forecast') == 'sunny' and is_state('binary_sensor.night','off')%}
{% if states('sensor.current_forecast') == 'sunny' and is_state('binary_sensor.night','off')%}
{{ [
'and sunny. ',
'with sun. ',
'with sunny conditions prevailing. '
] | random }}
{%- elif states('sensor.current_forecast') == 'sunny' and is_state('binary_sensor.night','on') %}
{% elif states('sensor.current_forecast') == 'sunny' and is_state('binary_sensor.night','on') %}
{{ [
'and clear. ',
'with clear skies. '
] | random }}
{%- elif states('sensor.current_forecast') == 'clear-night' %}
{% elif states('sensor.current_forecast') == 'clear-night' %}
{{ [
'and clear. ',
'with clear skies. '
] | random }}
{%- elif states('sensor.current_forecast') == 'rainy' %}
{% elif states('sensor.current_forecast') == 'rainy' %}
{{ [
'with rain. ',
'with showers. ',
@@ -1205,7 +1210,7 @@ template:
'Total Rainfall amounts '
] | random }}
near {{ state_attr('sensor.current_forecast','precipitation') }} inches {{ 'possible. ' }}
{%- elif states('sensor.current_forecast') == 'snowy' %}
{% elif states('sensor.current_forecast') == 'snowy' %}
{{ [
'with snow. ',
'with snow showers. '
@@ -1216,18 +1221,18 @@ template:
] | random }}
near {{ state_attr('sensor.current_forecast','precipitation') }} inches
{{ 'possible. ' }}
{%- elif states('sensor.current_forecast') == 'snowy-rainy' %}
{% elif states('sensor.current_forecast') == 'snowy-rainy' %}
{{ [
'with mix preciptation possible. ',
'with snow and rain showers. '
] | random }}
Total accumulation near {{ state_attr('sensor.current_forecast','precipitation') }} inches {{ 'possible. ' }}
{%- elif states('sensor.current_forecast') == 'windy' %}
{% elif states('sensor.current_forecast') == 'windy' %}
{{ [
'and windy. ',
'with lots of wind. '
] | random }}
{%- elif states('sensor.current_forecast') == 'fog' %}
{% elif states('sensor.current_forecast') == 'fog' %}
{{ [
'and foggy. ',
'with some fog. '
@@ -1243,7 +1248,7 @@ template:
'with partly cloudy skies. ',
'with scattered clouds. '
] | random }}
{%- elif states('sensor.current_forecast') == 'hail' %}
{% elif states('sensor.current_forecast') == 'hail' %}
{{ [
'with severe thunderstorms possible. ',
'with hail possible. '
@@ -1254,7 +1259,7 @@ template:
] | random }}
near {{ state_attr('sensor.current_forecast','precipitation') }} inches
{{ 'possible. ' }}
{%- elif states('sensor.current_forecast') == 'lightning' %}
{% elif states('sensor.current_forecast') == 'lightning' %}
{{ [
'with thunderstorms possible. ',
'with the potential of thunderstorms. '
@@ -1265,21 +1270,21 @@ template:
] | random }}
near {{ state_attr('sensor.current_forecast','precipitation') }} inches
{{ 'possible. ' }}
{% endif -%}
{% endif %}
{{ [
'Later tonight expect a low of ',
'Overnight expect a low of '
] | random }}
{{ states('sensor.overnight_lowest_temperature') }} degrees.
{%- else -%}
{% else %}
{{ [
'Tonight expect a low of ',
'Overnight expect a low of '
] | random }}
{{ states('sensor.overnight_lowest_temperature') }} degrees.
{% endif %}
{%- endmacro -%}
{{- cleanup(getReport()) -}}
{% endmacro %}
{{ cleanup(getReport()) }}
- name: 'Outside Pressure'
unique_id: ac2944bb-e9d7-40a3-9707-ef477fd5f309
state: '{{ state_attr(''weather.iron_nerd_weather_station'',''pressure'') }}'
@@ -1312,44 +1317,48 @@ template:
- name: "Clothing Forecast"
unique_id: 8ed2684b-d0ad-402c-bc3c-340cb9b2437a
state: >-
{% if is_state('binary_sensor.overnight', 'off') %}
{% set temp = states('sensor.todays_high_temp')|int %}
{% if is_state('binary_sensor.overnight', 'off') %}
{% set temp = states('sensor.todays_high_temp')|int %}
{% else %}
{% set temp = state_attr('weather.iron_nerd_weather_station','temperature')|round %}
{% endif %}
{% if states('sensor.todays_high_temp')|int > 63 %}
{% if states('sensor.todays_high_temp')|int < 80 %}
Nice
{% elif states('sensor.todays_high_temp')|int > 90 %}
Hot
{% else %}
{% set temp = state_attr('weather.iron_nerd_weather_station','temperature')|round %}
Toasty
{% endif %}
{%- if states('sensor.todays_high_temp')|int > 63 %}
{%- if states('sensor.todays_high_temp')|int < 80 %}
Nice
{% elif states('sensor.todays_high_temp')|int > 90 %}
Hot
{% else %}
Toasty
{%- endif %}
{% elif states('sensor.todays_high_temp')|int < 64 %}
{%- if states('sensor.todays_high_temp')|int < 32 %}
Freezing
{% elif states('sensor.todays_high_temp')|int > 48 %}
Chilly
{% else %}
Cold
{%- endif %}
{% elif states('sensor.todays_high_temp')|int < 64 %}
{% if states('sensor.todays_high_temp')|int < 32 %}
Freezing
{% elif states('sensor.todays_high_temp')|int > 48 %}
Chilly
{% else %}
Unknown
{%- endif %}
Cold
{% endif %}
{% else %}
Unknown
{% endif %}
- name: "Clothing Forecast Detail"
unique_id: 13065f50-5eef-4afd-830e-2a2c87f47496
state: >-
{% from 'formatting.jinja' import cleanup %}
{%- macro getReport() -%}
{% macro getReport() %}
{% set clothing = states('sensor.clothing_forecast') %}
{% set forecast = states('sensor.current_forecast') %}
{% set weather = states('weather.iron_nerd_weather_station') %}
{% set apparent = state_attr('weather.iron_nerd_weather_station','apparent_temperature') %}
{% if is_state('binary_sensor.morning','on') %}
Based on the forecasted high temperature,
{% if is_state('sensor.clothing_forecast', 'Freezing') %}
{% if clothing == "Freezing" %}
You're gonna freeze your balls off out there. so I suggest wearing long pants and a heavy coat.
{% elif is_state('sensor.clothing_forecast','Cold') %}
{% elif clothing == "Cold" %}
It's gonna be cold as balls today. so I suggest wearing long pants and a light jacket.
{% elif is_state('sensor.clothing_forecast', 'Chilly') %}
{% elif clothing == "Chilly" %}
It's gonna be on the chilly side today. so I suggest wearing at least long pants.
{% elif is_state('sensor.clothing_forecast', 'Nice') %}
{% elif clothing == "Nice" %}
It is going to be
{{ [ 'pretty nice outside. ',
'a good day to be outside. ',
@@ -1357,7 +1366,7 @@ template:
'downright tolerable outside. ',
] | random }}
So I suggest wearing shorts.
{% elif is_state('sensor.clothing_forecast', 'Toasty') and is_state('sensor.current_forecast', 'sunny') %}
{% elif clothing == "Toasty" and forecast == "sunny" %}
It is going to be
{{ [ 'on the warm side ',
' rather warm outside ',
@@ -1369,7 +1378,7 @@ template:
'preparing to bake under the sun.',
'getting ready to be cooked alive.',
] | random }}
{% elif is_state('sensor.clothing_forecast', 'Hot') and is_state('sensor.current_forecast', 'sunny') %}
{% elif clothing == "Hot" and forecast == "sunny" %}
It is going to be
{{ [ 'so hot you will sweat your balls off',
'hotter than the sun ',
@@ -1380,7 +1389,7 @@ template:
'preparing to bake under the sun.',
'getting ready to be cooked alive.',
] | random }}
{% elif is_state('sensor.clothing_forecast', 'Toasty') %}
{% elif clothing == "Toasty" %}
It is going to be
{{ [ 'on the warm side ',
' rather warm outside ',
@@ -1388,7 +1397,7 @@ template:
' a little warm ',
] | random }}
today. So I suggest wearing shorts.
{% elif is_state('sensor.clothing_forecast', 'Hot') %}
{% elif clothing == "Hot" %}
It is going to be
{{ [ 'so hot you will sweat your balls off',
'hotter than the sun ',
@@ -1397,7 +1406,7 @@ template:
] | random }}
today. So I suggest wearing shorts.
{% else %}
It is going to be {{ states('sensor.clothing_forecast') }} today so I suggest wearing shorts.
It is going to be {{ clothing }} today so I suggest wearing shorts.
{% endif %}
{% if is_state('input_boolean.hot_day','on') %}
Warning, today will be a very sweaty day, so please remember to stay hydrated!
@@ -1407,14 +1416,14 @@ template:
{% endif %}
{% else %}
Based on the current temperature,
{% if is_state('sensor.clothing_forecast', 'Freezing') %}
{% if clothing == "Freezing" %}
You're gonna freeze your balls off out there. so I suggest wearing long pants and a heavy coat if you are going out.
{% elif is_state('sensor.clothing_forecast','Cold') %}
{% elif clothing == "Cold" %}
It is cold as balls outside. so I suggest wearing long pants and a light jacket.
{% elif is_state('sensor.clothing_forecast', 'Chilly') %}
{% elif clothing == "Chilly" %}
It is chilly right now. so I suggest wearing at least long pants
if you are going to venture outside.
{% elif is_state('sensor.clothing_forecast', 'Nice') %}
{% elif clothing == "Nice" %}
It is
{{ [ 'pretty nice outside. ',
'a good day to be outside. ',
@@ -1422,7 +1431,7 @@ template:
'downright tolerable outside. ',
] | random }}
So I suggest wearing shorts.
{% elif is_state('sensor.clothing_forecast', 'Toasty') and is_state('weather.iron_nerd_weather_station','sunny') %}
{% elif clothing == "Toasty" and weather == "sunny" %}
It is
{{ [ 'on the warm side ',
' rather warm ',
@@ -1434,7 +1443,7 @@ template:
'preparing to bake under the sun.',
'getting ready to be cooked alive.',
] | random }}
{% elif is_state('sensor.clothing_forecast', 'Hot') and is_state('weather.iron_nerd_weather_station','sunny') %}
{% elif clothing == "Hot" and weather == "sunny" %}
It is
{{ [ 'so hot you will sweat your balls off',
'hotter than the sun ',
@@ -1445,7 +1454,7 @@ template:
'preparing to bake under the sun.',
'getting ready to be cooked alive.',
] | random }}
{% elif is_state('sensor.clothing_forecast', 'Toasty') %}
{% elif clothing == "Toasty" %}
It is
{{ [ 'on the warm side ',
' rather warm ',
@@ -1453,7 +1462,7 @@ template:
' a little warm ',
] | random }}
outside. So I suggest wearing shorts.
{% elif is_state('sensor.clothing_forecast', 'Hot') %}
{% elif clothing == "Hot" %}
It is
{{ [ 'so hot you will sweat your balls off',
'hotter than the sun ',
@@ -1462,13 +1471,13 @@ template:
] | random }}
outside. So I suggest wearing shorts.
{% else %}
It is {{ states('sensor.clothing_forecast') }} right now so I suggest wearing shorts.
It is {{ clothing }} right now so I suggest wearing shorts.
{% endif %}
{% if is_state('binary_sensor.heat_index_threshold','on') %}
Warning, the heat index is {{ states('sensor.stratton_ave_apparent_temperature') | float | round }} degrees right now, which is very high. So please make sure to stay hydrated!
Warning, the heat index is {{ apparent | int }} degrees right now, which is very high. So please make sure to stay hydrated!
{% endif %}
{% if is_state('binary_sensor.wind_chill_threshold','on') %}
Warning, it currently feels like {{ states('sensor.stratton_ave_apparent_temperature') | float | round }} degrees outside, so please make sure all exposed skin is covered to avoid frostbite!
Warning, it currently feels like {{ apparent | int }} degrees outside, so please make sure all exposed skin is covered to avoid frostbite!
{% endif %}
{% endif %}
{% if states('sensor.thermal_comfort_simmerindex') in ['extremely_warm','danger_of_heatstroke','extreme_danger_of_heatstroke','circulatory_collapse_imminent'] %}
@@ -1488,8 +1497,8 @@ template:
{% elif is_state('sensor.thermal_comfort_frostrisk','probable') %}
"The possibility of frost exists currently. Be prepared. "
{% endif %}
{%- endmacro -%}
{{- cleanup(getReport()) -}}
{% endmacro %}
{{ cleanup(getReport()) }}
# current_inside_humidity:
# - name: "Current Inside Humidity"
@@ -1508,7 +1517,7 @@ template:
unique_id: 66b5f020-0b5e-48ed-92a2-740d2d708b30
state: >
{% from 'formatting.jinja' import cleanup %}
{%- macro getReport() -%}
{% macro getReport() %}
{% set alerts = [
states('sensor.weatheralerts_alert_1_most_recent_active_alert'),
states('sensor.weatheralerts_alert_2_most_recent_active_alert'),
@@ -1527,8 +1536,8 @@ template:
{% else %}
'None'
{% endif %}
{%- endmacro -%}
{{- cleanup(getReport()) -}}
{% endmacro %}
{{ cleanup(getReport()) }}
attributes:
active_alerts: "{{ states('sensor.weatheralerts_active_alerts') }}"
icon: >
@@ -1541,7 +1550,7 @@ template:
unique_id: e2f51da4-2271-4719-8edf-a28f76ac1e3f
state: >
{% from 'formatting.jinja' import cleanup %}
{%- macro getReport() -%}
{% macro getReport() %}
{% set alerts = [
states('sensor.weatheralerts_alert_1_most_recent_active_alert'),
states('sensor.weatheralerts_alert_2_most_recent_active_alert'),
@@ -1553,8 +1562,8 @@ template:
{% set flood = alerts | reject ('eq','unavailable') | select('eq','Flood Warning') | list | count | int %}
{% set flood1 = 1 if (flood > 0) else 0 %}
{{ (main + flood1) | int }}
{%- endmacro -%}
{{- cleanup(getReport()) -}}
{% endmacro %}
{{ cleanup(getReport()) }}
icon: >
{% if (states('sensor.weatheralerts_active_alerts') | int ) > 0 %}
mdi:alert
@@ -1582,6 +1591,28 @@ template:
{{ ns.temps | min | int }}
icon: mdi:thermometer
- name: SPC Wind Risk Day 1
unique_id: e415f5bd-7c44-4067-9c5d-4905ce13be26
state: "{{ state_attr('sensor.spc_outlook_day_1','wind_probability') }}"
attributes:
wind_fill: "{{ state_attr('sensor.spc_outlook_day_1','wind_fill') }}"
wind_stroke: "{{ state_attr('sensor.spc_outlook_day_1','wind_stroke') }}"
icon: mdi:weather-windy
- name: SPC Tornado Risk Day 1
unique_id: bac1b6d9-d4bf-4434-9260-8765dcc81074
state: "{{ state_attr('sensor.spc_outlook_day_1','torn_probability') }}"
attributes:
torn_fill: "{{ state_attr('sensor.spc_outlook_day_1','torn_fill') }}"
torn_stroke: "{{ state_attr('sensor.spc_outlook_day_1','torn_stroke') }}"
icon: mdi:weather-tornado
- name: SPC Hail Risk Day 1
unique_id: a6969cf3-dc48-4e45-85f5-1565137ddf09
state: "{{ state_attr('sensor.spc_outlook_day_1','hail_probability') }}"
attributes:
hail_fill: "{{ state_attr('sensor.spc_outlook_day_1','hail_fill') }}"
hail_stroke: "{{ state_attr('sensor.spc_outlook_day_1','hail_stroke') }}"
icon: mdi:weather-hail
input_boolean:
freeze_warning:
name: Freeze Warning

View File

@@ -13,3 +13,10 @@ sensor:
state_characteristic: mean
max_age:
hours: 24
binary_sensor:
- platform: trend
sensors:
local_average_gas_trend:
entity_id: sensor.local_average_gas_price
friendly_name: Local Average Gas Trend
unique_id: 3405a536-1e02-412f-916b-1a62c9cb8a2e

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

@@ -602,25 +602,15 @@ script:
{% set low = states('sensor.overnight_lowest_temperature') | int %}
{% set high = states('sensor.todays_high_temp') | int %}
{% set kallen_bedtime = state_attr('input_datetime.kallen_bedtime','timestamp') | int %}
{% set kallen_fantime = state_attr('input_datetime.kallen_fan','timestamp') | int %}
{% set bedroom_hot = is_state('binary_sensor.kallen_bedroom_hot','on') %}
{% set cutoff = 81000 %} {# Cutoff time is 22:30 #}
{% if is_state('binary_sensor.kallen_school_tomorrow','on') %}
{% if is_state('input_boolean.hot_day','on') %}
{{ (kallen_bedtime - 3600) | timestamp_custom('%H:%M',false) }}
{% elif low >= 56 or high >= 75 %}
{{ (kallen_bedtime - 1800) | timestamp_custom('%H:%M',false) }}
{% else %}
{{ kallen_bedtime | timestamp_custom('%H:%M',false) }}
{% endif %}
{% elif low > 60 or high > 74 %}
{% if kallen_bedtime < cutoff %}
{{ kallen_bedtime | timestamp_custom('%H:%M',false) }}
{% else %}
22:00
{% endif %}
{% elif 56 <= low <= 60 %}
22:30
{% if is_state('input_boolean.hot_day','on') or bedroom_hot == true %}
{{ (kallen_fantime - 3600) | timestamp_custom('%H:%M',false) }}
{% elif low >= 56 or high >= 75 %}
{{ (kallen_bedtime - 1800) | timestamp_custom('%H:%M',false) }}
{% else %}
00:00
{{ kallen_bedtime | timestamp_custom('%H:%M',false) }}
{% endif %}
- service: input_datetime.set_datetime
entity_id: input_datetime.master_bedroom_fan

View File

@@ -190,51 +190,51 @@ template:
{% set dow = now().strftime('%A') %}
{% if week == 'First Menu' %}
{% if dow == 'Monday' %}
Popcorn chicken, mashed potatoes, corn, apples, corn bread, and milk.
Chicken tenders, au gratin potatoes, corn, mixed fruit, cornbread, and milk.
{% elif dow == 'Tuesday' %}
Beef taco or taco salad, refried beans, spanish rice, peaches, and milk.
Beef or chicken, taco or salad, refried beans, rice, apple, and milk.
{% elif dow == 'Wednesday' %}
Pulled pork, steamed broccoli, tomatoes, mixed fruit, and milk.
Hot dog, french fries, celery, peaches, and milk.
{% elif dow == 'Thursday' %}
Beef Stroganoff, green beans, carrots, fresh fruit, bread, and milk.
Mac and cheese, Cheez-Its, side salad, tomatoes, pears, and milk.
{% elif dow == 'Friday' %}
Optionally, Papa Johns Pizza. Otherwise, hamburger, spinach salad, oven potatoes, applesauce, and milk.
Corndog, steamed broccoli, carrots, applesauce, and milk.
{% endif %}
{% elif week == 'Second Menu' %}
{% if dow == 'Monday' %}
Pizza, spinach salad, tomatoes, fruit, and milk.
Popcorn chicken, mashed potatoes, corn, grapes, cornbread, and milk.
{% elif dow == 'Tuesday' %}
Lasagna, garlic bread, steamed cauliflower, celery, apple crisp, and milk.
BBQ pork, baked beans, cucumbers, mixed fruit, and milk.
{% elif dow == 'Wednesday' %}
Chicken patty, oven potatoes, broccoli, pears, and milk.
Bosco sticks, french fries, tomatoes, banana, and milk.
{% elif dow == 'Thursday' %}
Turkey and noodles, mashed potatoes, green beans, peaches, breadstick, and milk.
{% elif down == 'Friday' %}
Optionally, Papa Johns Pizza. Otherwise, hot dog with chili sauce, carrots, baked beans, mixed fruit, and milk.
Teriyaki beef and broccoli ramen, stir fry, egg roll, strawberry cup, and milk.
{% elif dow == 'Friday' %}
Hamburger, fries, carrots, applesauce, and milk.
{% endif %}
{% elif week == 'Third Menu' %}
{% if dow == 'Monday' %}
Popcorn chicken, au gratin potatoes, corn, mixed fruit, corn bread, milk.
Nachoes, carrots, apple, and milk.
{% elif dow == 'Tuesday' %}
Beef taco or taco salad, refried beans, spanish rice, peaches, and milk.
Chicken patty, au gratin potatoes, cauliflower, peaches, and milk.
{% elif dow == 'Wednesday' %}
Hamburger, oven potatoes, celery, applesauce, and milk.
Pizza Crunchers, side salad, steamed broccoli, mixed fruit, and milk.
{% elif dow == 'Thursday' %}
Mac and cheese, steamed broccoli, tomatoes, pears, bread, and milk.
Chicken teriyaki bowl, black beans, corn, apple crisp, egg roll, and milk.
{% elif dow == 'Friday' %}
Optionally, Papa Johns Pizza. Otherwise, sloppy joe, carrots, spinach salad, fruit, and milk.
Hot dog, french fries, cherry tomatoes, strawberry cups, and milk.
{% endif %}
{% elif week == 'Fourth Menu' %}
{% if dow == 'Monday' %}
Toasted cheese, tomato soup, mixed vegetables, fresh fruit, treat, and milk.
French toast or egg omelet, sausage, tomatoes, hash browns, oranges, and milk.
{% elif dow == 'Tuesday' %}
Omelet or french toast, sausage, hash browns, tomatoes, orange, and milk.
Orange chicken with vegetable rice, egg roll, fortune cookie, apple crisp, and milk.
{% elif dow == 'Wednesday' %}
Bosco sticks with pizza sauce, carrots, oven potatoes, peach crisp, and milk.
Hamburger, fries, steamed carrots, banana, and milk.
{% elif dow == 'Thursday' %}
Spaghetti, broccoli, green beans, fresh fruit, breadstick, and milk.
Chicken and noodles, mashed potatoes, green beans, peach cups, breadstick, and milk.
{% elif dow == 'Friday' %}
Optionally, Papa Johns Pizza. Otherwise, hot dog, baked beans, cauliflower, applesauce, and milk.
Mozzarella sticks, marinara, side salad, broccoli, mixed fruit, and milk.
{% endif %}
{% else %}
No menu for the current day.

View File

@@ -1,3 +1,8 @@
input_boolean:
server_maintenance:
name: Server Maintenance
icon: mdi:wrench-clock
input_select:
log_level:
name: Log Level
@@ -97,22 +102,6 @@ template:
- name: Asus Laptop Idle
unique_id: 7d8eb80a-0a2e-48a9-84b3-33175304dd95
state: "{{ states('sensor.asus_laptop_system_idle_time') | int > 1800 }}"
- sensor:
- name: "Min Ping"
unique_id: ddcb9f6f-7c94-41fe-9453-2a2205b078e0
state: "{{ state_attr('binary_sensor.internet','round_trip_time_min') }}"
availability: "{{ is_state('binary_sensor.internet','on') }}"
unit_of_measurement: "ms"
- name: "Avg Ping"
unique_id: 79a13c64-7508-48de-8b44-2a23c59917c8
state: "{{ state_attr('binary_sensor.internet','round_trip_time_avg') }}"
availability: "{{ is_state('binary_sensor.internet','on') }}"
unit_of_measurement: "ms"
- name: "Max Ping"
unique_id: c9c71ab6-c7fa-4425-a4ed-768d60e93781
state: "{{ state_attr('binary_sensor.internet','round_trip_time_max') }}"
availability: "{{ is_state('binary_sensor.internet','on') }}"
unit_of_measurement: "ms"
# - platform: influxdb
# host: 192.168.1.26

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

@@ -57,6 +57,7 @@ ## HACS Components
- [GasBuddy](https://github.com/firstof9/ha-gasbuddy)
- [Union Pacific Big Boy Tracker](https://github.com/jheizer/up_4014_tracker)
- [WeatherFlow Forecast](https://github.com/briis/weatherflow_forecast)
- [NWS SPC Outlook](https://github.com/sedward5/nws_spc_outlook)
</details>
@@ -111,6 +112,7 @@ ## HACS Lovelace Cards
- [Weather Chart Card](https://github.com/mlamberts78/weather-chart-card)
- [Comfortable Environment Card](https://github.com/argaar/comfortable-environment-card)
- [Versatile Thermostat UI Card](https://github.com/jmcollin78/versatile-thermostat-ui-card)
- [Gauge Card Pro](https://github.com/benjamin-dcs/gauge-card-pro)
</details>

View File

@@ -1304,13 +1304,28 @@ evening_on_second_floor:
option: "{% if is_state('binary_sensor.upstairs_bathroom_occupied','on')
%}\n Adaptive\n{% else %}\n Single Nightlight\n{% endif %}\n"
action: input_select.select_option
- target:
area_id:
- kallen_bedroom
- emma_bedroom
data: {}
alias: Turn off kids' bedroom lights
action: light.turn_off
- if:
- condition: state
entity_id: input_boolean.emma_sleeping
state: 'off'
then:
- action: light.turn_off
metadata: {}
data: {}
target:
area_id: emma_bedroom
alias: If Emma's bedroom is not in use, turn off her bedroom light
- alias: If Kallen's bedroom is not in use, turn off his bedroom light
if:
- condition: state
entity_id: input_boolean.kallen_sleeping
state: 'off'
then:
- action: light.turn_off
metadata: {}
data: {}
target:
area_id: kallen_bedroom
- alias: Turn off Master Bedroom Lights
if:
- condition: state
@@ -1491,32 +1506,32 @@ goodnight_on_first_floor:
entity_id: input_boolean.guest_mode
state: 'on'
then:
- service: light.turn_off
target:
- target:
area_id:
- downstairs_bathroom
- tina_desk
entity_id: light.living_room_lights
data: {}
- service: input_select.select_option
target:
action: light.turn_off
- target:
entity_id: input_select.mud_room_scenes
data:
option: Nightlight
action: input_select.select_option
else:
- service: light.turn_off
target:
- target:
area_id:
- downstairs_bathroom
- mud_room
- tina_desk
entity_id: light.living_room_lights
data: {}
action: light.turn_off
alias: Determine lights based on guest mode
goodnight_on_second_floor:
alias: Goodnight on Second Floor
sequence:
- service: light.turn_off
target:
- target:
area_id:
- emma_bedroom
- kallen_bedroom
@@ -1524,21 +1539,24 @@ goodnight_on_second_floor:
- master_bedroom_closet
- upstairs_hallway
data: {}
- if:
action: light.turn_off
- alias: If Kallen is gone overnight, turn off upstairs bathroom lights
if:
- condition: state
entity_id: input_boolean.kallen_overnight
state: 'on'
then:
- service: light.turn_off
target:
- target:
area_id: upstairs_bathroom
data: {}
action: light.turn_off
else:
- service: input_select.select_option
target:
- target:
entity_id: input_select.upstairs_bathroom_scenes
data:
option: Single Nightlight
action: input_select.select_option
alias: Set upstairs bathroom lights to single nightlight
morning_scene:
alias: Morning Scene
sequence:
@@ -1700,6 +1718,9 @@ tony_morning_meds:
tag: tony-morning-meds
alias: Clear previous morning notification
action: script.text_notify
- variables:
remindCount: '{{ states(''counter.tony_morning_meds_reminder_count'') }}'
alias: Set variable for reminder count
- alias: Send notifications, using AI if internet is connected
if:
- condition: state
@@ -1712,20 +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 multiple 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
@@ -1738,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
@@ -1760,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:
@@ -2007,6 +2046,9 @@ tony_afternoon_meds:
tag: tony-afternoon-meds
alias: Clear previous afternoon notification
action: script.text_notify
- variables:
remindCount: '{{ states(''counter.tony_afternoon_meds_reminder_count'') }}'
alias: Set variable for reminder count
- alias: Send notifications, using AI if internet is connected
if:
- condition: state
@@ -2019,20 +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 multiple 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
@@ -2045,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
@@ -2067,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:
@@ -2980,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
@@ -3058,32 +3118,53 @@ tina_morning_meds:
tag: tina-morning-meds
alias: Clear previous morning notification
action: script.text_notify
- variables:
remindCount: '{{ states(''counter.tina_morning_meds_reminder_count'') }}'
alias: Set variable for reminder count
- alias: Send notifications, using AI if internet is connected
if:
- condition: state
entity_id: binary_sensor.internet
state: 'on'
then:
- if:
- alias: Generate reminder, be snarky if it's been several times
if:
- condition: numeric_state
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 multiple 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
alias: Generate reminder, be snarky if it's been several times
- delay:
hours: 0
minutes: 0
@@ -3094,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
@@ -3139,32 +3220,52 @@ tina_night_meds:
tag: tina-night-meds
alias: Clear previous night notification
action: script.text_notify
- variables:
remindCount: '{{ states(''counter.tina_night_meds_reminder_count'') }}'
alias: Set variable for reminder count
- alias: Send notifications, using AI if internet is connected
if:
- condition: state
entity_id: binary_sensor.internet
state: 'on'
then:
- if:
- alias: Generate reminder, be snarky if it's been several times
if:
- condition: numeric_state
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 multiple 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
alias: Generate reminder, be snarky if it's been several times
- delay:
hours: 0
minutes: 0
@@ -3175,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(', ') }}