Compare commits

...

106 Commits

Author SHA1 Message Date
a33f9f66ae Beginning of rewrite for custom meds 2025-12-16 19:34:00 -05:00
28e3b93441 Updated readme 2025-12-16 19:23:28 -05:00
bdca4c702a Remove battery notes from config as it's all UI-based now 2025-12-15 21:19:08 -05:00
4b57efcd74 Add extra_module_url for card-mod 2025-12-15 19:32:30 -05:00
7255422ca1 Fix E's white noise not turning on at bedtime
#256
2025-12-15 19:32:29 -05:00
5ae5e5021e Integrate E's bedroom heater with existing automations and scheduling
#256
2025-12-13 20:16:31 -05:00
bd9c7190ed Update weather templates to current syntax 2025-12-13 18:25:58 -05:00
f176e3b867 Update .HA_VERSION 2025-12-13 18:13:02 -05:00
1b52cc31a8 Update .HA_VERSION 2025-12-09 20:16:17 -05:00
8993196366 Add college hockey teams to sports tracking #255 2025-12-09 20:16:00 -05:00
210434e4ad Prevent trying to report team record when it is not provided 2025-12-09 20:15:39 -05:00
e37ac9d504 Re-enable K's night meds tracker 2025-12-09 20:13:57 -05:00
bf19984b47 Fix recliner mode not marking basement as occupied 2025-11-28 00:47:23 -05:00
4634b66866 Change deprecated Powercalc config 2025-11-26 20:27:16 -05:00
001dcbe625 Update .HA_VERSION 2025-11-26 20:26:34 -05:00
f70be6ceee Update .HA_VERSION 2025-11-10 22:38:58 -05:00
265e129c06 Try to fix weird changing of climate modes in E's bedroom 2025-10-30 18:14:02 -04:00
00bea40b6b Update .HA_VERSION 2025-10-30 18:13:22 -04:00
f94bce3381 Update .HA_VERSION 2025-10-18 00:21:58 -04:00
2de7d82e20 Sensors to indicate health of media server items 2025-10-03 19:29:28 -04:00
83c3c10a5a Add structured output to AI med notification prompts 2025-10-03 19:29:07 -04:00
f7ac1b915b Update .HA_VERSION 2025-10-03 19:28:27 -04:00
1d3398752e Fix deprecated Google AI calls 2025-10-03 02:59:00 -04:00
837ed779c9 Add reminder booleans for other med trackers 2025-10-02 19:10:00 -04:00
bc3a58875d Fix typo in lighting_fx 2025-10-02 18:24:17 -04:00
3c018a922b Remove old gas sensors from configs 2025-10-02 18:24:05 -04:00
10188d553a Update .HA_VERSION and .gitignore 2025-10-02 18:20:39 -04:00
341200deb0 Disable K night meds as currently unneeded 2025-09-23 18:34:58 -04:00
b930cb28b5 Update .HA_VERSION 2025-09-23 18:34:24 -04:00
c31158448c Update .gitignore 2025-09-16 02:10:39 -04:00
9e9c1fcf11 Update .HA_VERSION 2025-09-16 02:09:23 -04:00
02e3252e62 Update .HA_VERSION 2025-09-11 04:36:21 -04:00
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
aa6358ce19 Merge branch 'sunset-rework' into dev 2025-05-29 17:32:50 -04:00
abe62888b2 Add outdoor lux threshold and triggered boolean for sunset lights
home_automation/HA-NerdFlows#32
2025-05-27 21:26:24 -04:00
0cabab0462 Adjustments to Recliner Mode 2025-05-26 00:01:21 -04:00
034cf2f972 Adaptive lighting should reset after tornado warnings #229 2025-05-25 19:22:25 -04:00
1d246e8018 Use locally calculated SLP in template weather provider 2025-05-24 20:17:12 -04:00
5cffb7208f Add rain intensity awareness to weather briefings
#247
2025-05-23 20:57:04 -04:00
a7b1a53754 Fix storm warning code I apparently wrote in my sleep... 2025-05-23 20:56:40 -04:00
de5efd39b4 Update .HA_VERSION 2025-05-23 20:56:02 -04:00
0129a56866 Comment out total rain sensors template 2025-05-23 04:35:35 -04:00
b305f7c880 Rewrite rain detection sensor 2025-05-23 04:34:26 -04:00
6ee4bacf55 Notifications for school status changes (delay/cancel)
#245
2025-05-23 03:57:44 -04:00
4710700f7e Fix adaptive lighting reset in basement studio goodnight script 2025-05-22 19:06:41 -04:00
895e99657b The new way of doing weather forecasts in Home Assistant is fucking trash 2025-05-21 22:15:52 -04:00
0dc7d0f8e4 Fix Weather.com attributes in template weather stations 2025-05-21 20:45:59 -04:00
d38cf59812 Make sure the correct teams are inhibited for MLB if playing each other 2025-05-21 20:41:35 -04:00
a489ecdf14 Update .HA_VERSION 2025-05-20 18:35:56 -04:00
8698a46d4f Exclude Tempest data from long-term stats, found another solution 2025-05-16 19:59:57 -04:00
7d5aa32834 Use Tempest rainfall sensor to trigger window warning 2025-05-15 18:19:03 -04:00
37458be1b8 Unfuck my recorder config... 2025-05-15 17:48:09 -04:00
72421b8716 Switch from Weather.com to Weatherflow for weather sensors 2025-05-15 06:26:41 -04:00
8be8f4bb58 Narrow down to just using the Tempest lighting strikes over past hour 2025-05-15 05:38:24 -04:00
6e619fa647 Input number for front porch lux threshold 2025-05-15 04:08:04 -04:00
9dca18048c Incorporate Weatherflow forecasts into main weather templates 2025-05-15 02:30:03 -04:00
52bfb8bd49 Handle lightning monitoring as more of a group effort 2025-05-15 01:14:19 -04:00
43feaa9b06 Lightning warning now uses local Tempest sensor by default 2025-05-15 00:05:10 -04:00
0847e7fd10 Add dewpoint and apparent temperature templates to INWS weather template 2025-05-15 00:04:49 -04:00
425b1fb0cf Add local Tempest Weather data to INWS weather template 2025-05-15 00:04:23 -04:00
f589cc0e6c Remove automations and blueprint for Chromecasting to TVs 2025-05-15 00:03:16 -04:00
49a4f4650b Update sensor light blueprint 2025-05-15 00:02:51 -04:00
3a2fc504f3 Update Twanne's lighting blueprints 2025-05-15 00:02:28 -04:00
f1180cc34b Track Weatherflow Tempest data in databases 2025-05-14 20:08:52 -04:00
b936838376 Updated readme 2025-05-14 01:28:00 -04:00
2d755be935 Shower Mode Auto Off automation 2025-05-13 23:57:42 -04:00
ed0431ae56 Update .HA_VERSION 2025-05-13 23:57:17 -04:00
51 changed files with 8599 additions and 3828 deletions

View File

@@ -1 +1 @@
2025.5.0 2025.12.3

3
.gitignore vendored
View File

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

View File

@@ -69,15 +69,6 @@
seconds: 0 seconds: 0
milliseconds: 0 milliseconds: 0
mode: single mode: single
- id: '1640916845901'
alias: Cast to Chromecast
description: ''
use_blueprint:
path: kind3r/cast-and-re-cast-a-lovelace-view-to-a-google-hub.yaml
input:
dashboard: lovelace
player: media_player.living_room_tv
view: chromecast
- id: '1640989510134' - id: '1640989510134'
alias: New Years alias: New Years
description: Flash lights for New Years description: Flash lights for New Years
@@ -281,15 +272,6 @@
- service: icloud3.restart - service: icloud3.restart
data: {} data: {}
mode: single mode: single
- id: '1645738561470'
alias: Cast to Basement TV
description: ''
use_blueprint:
path: kind3r/cast-and-re-cast-a-lovelace-view-to-a-google-hub.yaml
input:
dashboard: lovelace
player: media_player.basement_tv_chromecast
view: chromecast
- id: '1651785688186' - id: '1651785688186'
alias: Watchman Audit on Startup alias: Watchman Audit on Startup
description: Runs the Watchman Audit script after Home Assistant has successfully description: Runs the Watchman Audit script after Home Assistant has successfully
@@ -1887,54 +1869,70 @@
to: 'on' to: 'on'
id: recliner-on id: recliner-on
trigger: state trigger: state
alias: Recliner Mode On
- entity_id: input_boolean.recliner_mode - entity_id: input_boolean.recliner_mode
from: 'on' from: 'on'
to: 'off' to: 'off'
id: recliner-off id: recliner-off
trigger: state trigger: state
alias: Recliner Mode Off
conditions: [] conditions: []
actions: actions:
- choose: - alias: Routing
choose:
- conditions: - conditions:
- condition: trigger - condition: trigger
id: recliner-on id: recliner-on
alias: Recliner Mode On
sequence: sequence:
- target: - target:
entity_id: input_select.basement_studio_scenes entity_id: input_select.basement_studio_scenes
data: data:
option: Stairwell option: Stairwell
action: input_select.select_option action: input_select.select_option
alias: Set scene to Stairwell
- target: - target:
entity_id: entity_id:
- input_boolean.white_noise_basement - input_boolean.white_noise_basement
- input_boolean.studio_quiet - input_boolean.studio_quiet
data: {} data: {}
action: input_boolean.turn_on action: input_boolean.turn_on
- if: alias: Turn on white noise and Studio Quiet
- alias: Turn off TV
if:
- condition: template - condition: template
value_template: "{% if is_state('media_player.basement_tv','playing') %}\n value_template: "{% if is_state('media_player.basement_tv','playing') %}\n
\ false\n{% elif is_state('media_player.basement_tv','paused') or is_state('media_player.basement_tv','idle') \ false\n{% elif is_state('media_player.basement_tv','paused') or is_state('media_player.basement_tv','idle')
%}\n {{ state_attr('media_player.basement_tv','app_name') in ['TV','Android %}\n {{ state_attr('media_player.basement_tv','app_name') in ['TV','Android
TV Launcher'] }}\n{% else %}\n false\n{% endif %}\n" TV Launcher'] }}\n{% else %}\n false\n{% endif %}\n"
alias: If nothing is playing
then: then:
- target: - target:
entity_id: media_player.basement_tv entity_id: media_player.basement_tv
data: {} data: {}
action: media_player.turn_off action: media_player.turn_off
- if: alias: Turn off TV
- condition: not enabled: false
- alias: Turn off computer monitors
if:
- alias: If I'm not watching something
condition: not
conditions: conditions:
- condition: state - condition: state
entity_id: media_player.tony_asus entity_id: media_player.tony_asus
state: playing state: playing
alias: PC playing video or music
then: then:
- target: - target:
entity_id: script.tony_desktop_displays_off entity_id: script.tony_desktop_displays_off
data: {} data: {}
action: script.turn_on action: script.turn_on
alias: Turn off computer monitors
enabled: false
- conditions: - conditions:
- condition: trigger - condition: trigger
id: recliner-off id: recliner-off
alias: Recliner Mode Off
sequence: sequence:
- data: {} - data: {}
target: target:
@@ -2064,10 +2062,12 @@
- script.tony_desktop_displays_on - script.tony_desktop_displays_on
data: {} data: {}
action: script.turn_on action: script.turn_on
enabled: false
- target: - target:
entity_id: media_player.basement_tv entity_id: media_player.basement_tv
data: {} data: {}
action: media_player.turn_on action: media_player.turn_on
enabled: false
mode: restart mode: restart
- id: '1696286540644' - id: '1696286540644'
alias: Basement Lights Adaptive Resync alias: Basement Lights Adaptive Resync
@@ -2967,66 +2967,119 @@
- id: '1696539209438' - id: '1696539209438'
alias: Tony Custom Meds Handler alias: Tony Custom Meds Handler
description: '' description: ''
trigger: triggers:
- platform: time - minutes: /30
at: input_datetime.tony_custom_meds_notify_p1 id: trigger30
alias: Every 30 minutes
trigger: time_pattern
- at: input_datetime.tony_custom_meds_notify_p1
alias: Notify 1 alias: Notify 1
id: p1-notify id: p1-notify
- platform: state trigger: time
entity_id: - alias: Notify 2
at: input_datetime.tony_custom_meds_notify_p2
id: p2-notify
trigger: time
- entity_id:
- input_boolean.tony_custom_meds_taken_p1 - input_boolean.tony_custom_meds_taken_p1
from: 'off' from: 'off'
to: 'on' to: 'on'
id: p1-taken id: p1-taken
alias: Taken 1 alias: Taken 1
condition: [] trigger: state
action: - alias: Taken 2
- variables: entity_id:
trigger: '{{ trigger.id }}' - input_datetime.tony_custom_meds_taken_p2
num: '{{ trigger[:2] }}' from: 'off'
reason: '{{ trigger.split(''-'')[1] }}' to: 'on'
- if: id: p2-taken
- condition: template trigger: state
value_template: '{% set active = ''input_boolean.tony_custom_meds_tracker_'' conditions:
+ num %} - condition: or
conditions:
{{ is_state(active,''on'') }}' - condition: state
alias: Check tracker entity_id: input_boolean.tony_custom_meds_tracker_p1
state: 'on'
- condition: state
entity_id: input_boolean.tony_custom_meds_tracker_p2
state: 'on'
alias: Any custom med trackers are on
actions:
- alias: Routing
if:
- condition: trigger
id:
- trigger30
then: then:
- if: - variables:
- condition: template trigger: '{{ trigger.id }}'
value_template: '{{ reason == ''notify'' }}' num: all
alias: Is this a notification reason: notify
alias: Override variables to indicate this is an interval notify request
- alias: For each reminder entity
repeat:
for_each: '{{ states.input_boolean | selectattr(''entity_id'',''in'',label_entities(''Tony
Custom Meds'')) | selectattr(''entity_id'',''search'',''reminder'') | map(attribute=''entity_id'')
| list }}'
sequence:
- alias: Run custom meds script if tracker is active
if:
- alias: Check tracker
condition: template
value_template: '{{ is_state(repeat.item,''on'') }}'
then:
- data:
num: '{{ num }}'
reason: '{{ reason }}'
alias: Run custom meds script
action: script.tony_custom_meds
else:
- variables:
trigger: '{{ trigger.id }}'
num: '{{ trigger[:2] }}'
reason: '{{ trigger.split(''-'')[1] }}'
- alias: Run custom meds script if tracker is active
if:
- alias: Check tracker
condition: template
value_template: '{{ is_state(repeat.item,''on'') }}'
then: then:
- service: input_boolean.turn_off - if:
data: {} - condition: template
target: value_template: '{{ reason == ''notify'' }}'
entity_id: '{{ ''input_boolean.tony_custom_meds_taken_'' + num }}' alias: Is this a notification
alias: Turn off "taken" boolean then:
alias: Turn off "taken" boolean if this is a notification - data: {}
- service: script.tony_custom_meds target:
data: entity_id: '{{ ''input_boolean.tony_custom_meds_taken_'' + num }}'
num: '{{ num }}' alias: Turn off "taken" boolean
reason: '{{ reason }}' action: input_boolean.turn_off
alias: Run custom meds script alias: Turn off "taken" boolean if this is a notification
alias: Run custom meds script if tracker is active - data:
num: '{{ num }}'
reason: '{{ reason }}'
alias: Run custom meds script
action: script.tony_custom_meds
mode: parallel mode: parallel
max: 10 max: 10
- id: '1696556688808' - id: '1696556688808'
alias: Rain Window Warning alias: Rain Window Warning
description: Warn when it starts raining and a window is open description: Warn when it starts raining and a window is open
trigger: triggers:
- platform: state - alias: Rain starts
entity_id: binary_sensor.raining entity_id:
from: 'off' - sensor.home_tempest_precipitation_type
to: 'on' from: none
alias: Rain starts not_to:
condition: - unavailable
- unknown
trigger: state
conditions:
- condition: state - condition: state
entity_id: binary_sensor.windows entity_id: binary_sensor.windows
state: 'on' state: 'on'
alias: Windows are open alias: Windows are open
action: actions:
- variables: - variables:
porch: "{% set windows = states('sensor.windows_open') | int %} {% set front porch: "{% set windows = states('sensor.windows_open') | int %} {% set front
= states('sensor.front_windows_open') | int %} {% if windows == front %}\n = states('sensor.front_windows_open') | int %} {% if windows == front %}\n
@@ -3037,36 +3090,36 @@
house. Please close them!\n{% endif %}\n" house. Please close them!\n{% endif %}\n"
alias: Define variables alias: Define variables
- parallel: - parallel:
- service: script.text_notify - data:
data:
type: alert type: alert
who: all who: all
title: WINDOWS ARE OPEN! title: WINDOWS ARE OPEN!
message: '{{ message }}' message: '{{ message }}'
tag: rain-window-warning tag: rain-window-warning
alias: Send text notification alias: Send text notification
- service: script.speech_engine action: script.text_notify
data: - data:
who: everywhere who: everywhere
type: weather type: weather
message: '{{ message }}' message: '{{ message }}'
alias: TTS notification alias: TTS notification
- service: script.living_room_lights_alert action: script.speech_engine
data: - data:
type: blue type: blue
duration: 10 duration: 10
alias: Light alert in living room alias: Light alert in living room
action: script.living_room_lights_alert
- if: - if:
- condition: state - condition: state
entity_id: binary_sensor.basement_occupied entity_id: binary_sensor.basement_occupied
state: 'on' state: 'on'
alias: Basement is occupied alias: Basement is occupied
then: then:
- service: script.basement_lights_alert - data:
data:
type: blue type: blue
duration: 10 duration: 10
alias: Light alert in basement alias: Light alert in basement
action: script.basement_lights_alert
alias: Light alert in basement, if occupied alias: Light alert in basement, if occupied
alias: Send the various alerts alias: Send the various alerts
- wait_template: '{{ is_state(''binary_sensor.windows'',''off'') or is_state(''binary_sensor.raining'',''off'') - wait_template: '{{ is_state(''binary_sensor.windows'',''off'') or is_state(''binary_sensor.raining'',''off'')
@@ -3081,46 +3134,46 @@
}}' }}'
alias: Windows closed and still raining alias: Windows closed and still raining
sequence: sequence:
- service: script.text_notify - data:
data:
type: alert type: alert
who: all who: all
message: clear_notification message: clear_notification
tag: rain-window-warning tag: rain-window-warning
alias: Clear text notification alias: Clear text notification
- service: script.speech_engine action: script.text_notify
data: - data:
who: common who: common
type: weather type: weather
message: Windows are now closed. Thank you, and enjoy your dry house. message: Windows are now closed. Thank you, and enjoy your dry house.
alias: TTS notification alias: TTS notification
action: script.speech_engine
- conditions: - conditions:
- condition: template - condition: template
value_template: '{{ is_state(''binary_sensor.raining'',''off'') }}' value_template: '{{ is_state(''binary_sensor.raining'',''off'') }}'
alias: Stopped raining alias: Stopped raining
sequence: sequence:
- service: script.text_notify - data:
data:
type: alert type: alert
who: all who: all
message: clear_notification message: clear_notification
tag: rain-window-warning tag: rain-window-warning
alias: Clear text notification alias: Clear text notification
- service: script.speech_engine action: script.text_notify
data: - data:
who: common who: common
type: weather type: weather
message: Nevermind, it has stopped raining. Feel free to do whatever you'd message: Nevermind, it has stopped raining. Feel free to do whatever you'd
like with the windows. like with the windows.
alias: TTS notification alias: TTS notification
action: script.speech_engine
default: default:
- service: script.speech_engine - data:
data:
who: common who: common
type: weather type: weather
message: Well, I guess no one cares if the house floods. Suit yourself, but message: Well, I guess no one cares if the house floods. Suit yourself, but
do not say I didn't warn you. do not say I didn't warn you.
alias: TTS notification alias: TTS notification
action: script.speech_engine
alias: After wait completed alias: After wait completed
mode: single mode: single
- id: '1696884613752' - id: '1696884613752'
@@ -4643,39 +4696,41 @@
- id: '1710611198911' - id: '1710611198911'
alias: Kallen Meds Handler alias: Kallen Meds Handler
description: Handles the scheduling of medication reminders for Kallen description: Handles the scheduling of medication reminders for Kallen
trigger: triggers:
- platform: time_pattern - minutes: /30
minutes: /30
id: trigger30 id: trigger30
alias: Every 30 minutes alias: Every 30 minutes
- platform: time trigger: time_pattern
at: input_datetime.kallen_morning_meds_notify - at: input_datetime.kallen_morning_meds_notify
id: morning-notify id: morning-notify
alias: Morning Notify alias: Morning Notify
- platform: time trigger: time
at: input_datetime.kallen_night_meds_notify - at: input_datetime.kallen_night_meds_notify
id: night-notify id: night-notify
alias: Night Notify alias: Night Notify
- platform: state trigger: time
entity_id: enabled: true
- entity_id:
- input_boolean.kallen_morning_meds_taken - input_boolean.kallen_morning_meds_taken
to: 'on' to: 'on'
id: boolean-morning id: boolean-morning
alias: Morning Taken alias: Morning Taken
from: 'off' from: 'off'
- platform: state trigger: state
entity_id: - entity_id:
- input_boolean.kallen_night_meds_taken - input_boolean.kallen_night_meds_taken
id: boolean-night id: boolean-night
alias: Night Taken alias: Night Taken
from: 'off' from: 'off'
to: 'on' to: 'on'
condition: trigger: state
enabled: true
conditions:
- condition: state - condition: state
entity_id: input_boolean.kallen_overnight entity_id: input_boolean.kallen_overnight
state: 'off' state: 'off'
alias: Kallen is not staying the night elsewhere alias: Kallen is not staying the night elsewhere
action: actions:
- alias: Routing - alias: Routing
choose: choose:
- conditions: - conditions:
@@ -4690,10 +4745,10 @@
state: 'on' state: 'on'
alias: Morning meds reminder needed alias: Morning meds reminder needed
then: then:
- service: script.kallen_morning_meds - metadata: {}
metadata: {}
data: {} data: {}
alias: Run morning meds notification script alias: Run morning meds notification script
action: script.kallen_morning_meds
- alias: Check night reminder switch - alias: Check night reminder switch
if: if:
- condition: state - condition: state
@@ -4701,10 +4756,10 @@
state: 'on' state: 'on'
alias: Night meds reminder needed alias: Night meds reminder needed
then: then:
- service: script.kallen_night_meds - metadata: {}
metadata: {}
data: {} data: {}
alias: Run night meds notification script alias: Run night meds notification script
action: script.kallen_night_meds
alias: Every 30 minutes alias: Every 30 minutes
- conditions: - conditions:
- condition: and - condition: and
@@ -4716,16 +4771,16 @@
state: 'off' state: 'off'
alias: Morning Notify alias: Morning Notify
sequence: sequence:
- service: input_boolean.turn_on - metadata: {}
metadata: {}
data: {} data: {}
target: target:
entity_id: input_boolean.kallen_morning_meds_reminder entity_id: input_boolean.kallen_morning_meds_reminder
alias: Activate morning reminders alias: Activate morning reminders
- service: script.kallen_morning_meds action: input_boolean.turn_on
metadata: {} - metadata: {}
data: {} data: {}
alias: Run morning meds notification script alias: Run morning meds notification script
action: script.kallen_morning_meds
- conditions: - conditions:
- condition: and - condition: and
conditions: conditions:
@@ -4738,22 +4793,21 @@
alias: Night Notify alias: Night Notify
sequence: sequence:
- alias: Activate night reminders - alias: Activate night reminders
service: input_boolean.turn_on
metadata: {} metadata: {}
data: {} data: {}
target: target:
entity_id: input_boolean.kallen_night_meds_reminder entity_id: input_boolean.kallen_night_meds_reminder
- service: script.kallen_night_meds action: input_boolean.turn_on
metadata: {} - metadata: {}
data: {} data: {}
alias: Run night meds notification script alias: Run night meds notification script
action: script.kallen_night_meds
- conditions: - conditions:
- condition: trigger - condition: trigger
id: boolean-morning id: boolean-morning
alias: Morning Taken alias: Morning Taken
sequence: sequence:
- service: input_datetime.set_datetime - target:
target:
entity_id: input_datetime.kallen_morning_meds_taken entity_id: input_datetime.kallen_morning_meds_taken
data: data:
datetime: '{% from ''time.jinja'' import set_datetime %} {{ set_datetime(0) datetime: '{% from ''time.jinja'' import set_datetime %} {{ set_datetime(0)
@@ -4761,27 +4815,27 @@
' '
alias: Set time morning meds were taken alias: Set time morning meds were taken
- service: input_boolean.turn_off action: input_datetime.set_datetime
metadata: {} - metadata: {}
data: {} data: {}
target: target:
entity_id: input_boolean.kallen_morning_meds_reminder entity_id: input_boolean.kallen_morning_meds_reminder
alias: Deactivate morning reminders alias: Deactivate morning reminders
- service: script.text_notify action: input_boolean.turn_off
metadata: {} - metadata: {}
data: data:
type: alert type: alert
who: kallen who: kallen
message: clear_notification message: clear_notification
tag: kallen-left-meds tag: kallen-left-meds
alias: Clear kallen-left-meds notification tag alias: Clear kallen-left-meds notification tag
action: script.text_notify
- conditions: - conditions:
- condition: trigger - condition: trigger
id: boolean-night id: boolean-night
alias: Night Taken alias: Night Taken
sequence: sequence:
- service: input_datetime.set_datetime - target:
target:
entity_id: input_datetime.kallen_night_meds_taken entity_id: input_datetime.kallen_night_meds_taken
data: data:
datetime: '{% from ''time.jinja'' import set_datetime %} {{ set_datetime(0) datetime: '{% from ''time.jinja'' import set_datetime %} {{ set_datetime(0)
@@ -4789,20 +4843,21 @@
' '
alias: Set time night meds were taken alias: Set time night meds were taken
action: input_datetime.set_datetime
- alias: Deactivate night reminders - alias: Deactivate night reminders
service: input_boolean.turn_off
metadata: {} metadata: {}
data: {} data: {}
target: target:
entity_id: input_boolean.kallen_night_meds_reminder entity_id: input_boolean.kallen_night_meds_reminder
- service: script.text_notify action: input_boolean.turn_off
metadata: {} - metadata: {}
data: data:
type: alert type: alert
who: kallen who: kallen
message: clear_notification message: clear_notification
tag: kallen-left-meds tag: kallen-left-meds
alias: Clear kallen-left-meds notification tag alias: Clear kallen-left-meds notification tag
action: script.text_notify
mode: parallel mode: parallel
max: 12 max: 12
- id: '1711657679853' - id: '1711657679853'
@@ -5584,53 +5639,59 @@
- id: '1722386174249' - id: '1722386174249'
alias: Tina Meds Cleanup alias: Tina Meds Cleanup
description: Handles the setting/clearing of medication configs for Tina description: Handles the setting/clearing of medication configs for Tina
trigger: triggers:
- platform: state - entity_id:
entity_id:
- input_boolean.tina_morning_meds_reminder - input_boolean.tina_morning_meds_reminder
from: 'on' from: 'on'
to: 'off' to: 'off'
id: morning-reminders-off id: morning-reminders-off
alias: Morning reminders off alias: Morning reminders off
trigger: state
- alias: Night reminders off - alias: Night reminders off
platform: state
entity_id: entity_id:
- input_boolean.tina_night_meds_reminder - input_boolean.tina_night_meds_reminder
from: 'on' from: 'on'
to: 'off' to: 'off'
id: night-reminders-off id: night-reminders-off
- platform: event trigger: state
event_type: ios.notification_action_fired - event_type: ios.notification_action_fired
event_data: event_data:
actionName: TINA_MORNING_MEDS_TAKEN actionName: TINA_MORNING_MEDS_TAKEN
id: morning-taken id: morning-taken
alias: Morning taken alias: Morning taken
trigger: event
- alias: Night taken - alias: Night taken
platform: event
event_type: ios.notification_action_fired event_type: ios.notification_action_fired
event_data: event_data:
actionName: TINA_NIGHT_MEDS_TAKEN actionName: TINA_NIGHT_MEDS_TAKEN
id: night-taken id: night-taken
trigger: event
- alias: Morning skipped - alias: Morning skipped
platform: event
event_type: ios.notification_action_fired event_type: ios.notification_action_fired
event_data: event_data:
actionName: TINA_MORNING_MEDS_SKIPPED actionName: TINA_MORNING_MEDS_SKIPPED
id: morning-skipped id: morning-skipped
trigger: event
- alias: Night skipped - alias: Night skipped
platform: event
event_type: ios.notification_action_fired event_type: ios.notification_action_fired
event_data: event_data:
actionName: TINA_NIGHT_MEDS_SKIPPED actionName: TINA_NIGHT_MEDS_SKIPPED
id: night-skipped id: night-skipped
- platform: state trigger: event
entity_id: - entity_id:
- person.christina_stork - person.christina_stork
from: home from: home
id: left id: left
alias: Left alias: Left
condition: [] trigger: state
action: - trigger: state
entity_id:
- person.christina_stork
to: Bob Evans
id: at-work
alias: At Work
conditions: []
actions:
- alias: Routing - alias: Routing
choose: choose:
- conditions: - conditions:
@@ -5639,19 +5700,19 @@
- morning-reminders-off - morning-reminders-off
alias: Morning Reminders Off alias: Morning Reminders Off
sequence: sequence:
- service: counter.reset - metadata: {}
metadata: {}
data: {} data: {}
target: target:
entity_id: counter.tina_morning_meds_reminder_count entity_id: counter.tina_morning_meds_reminder_count
alias: Reset morning reminder count alias: Reset morning reminder count
- service: script.text_notify action: counter.reset
data: - data:
type: alert type: alert
who: tina who: tina
message: clear_notification message: clear_notification
tag: tina-morning-meds tag: tina-morning-meds
alias: Clear morning notification alias: Clear morning notification
action: script.text_notify
- conditions: - conditions:
- condition: trigger - condition: trigger
id: id:
@@ -5659,66 +5720,66 @@
alias: Night reminders off alias: Night reminders off
sequence: sequence:
- alias: Reset night reminder count - alias: Reset night reminder count
service: counter.reset
metadata: {} metadata: {}
data: {} data: {}
target: target:
entity_id: counter.tina_night_meds_reminder_count entity_id: counter.tina_night_meds_reminder_count
- service: script.text_notify action: counter.reset
data: - data:
type: alert type: alert
who: tina who: tina
message: clear_notification message: clear_notification
tag: tina-night-meds tag: tina-night-meds
alias: Clear night notification alias: Clear night notification
action: script.text_notify
- conditions: - conditions:
- condition: trigger - condition: trigger
id: id:
- morning-taken - morning-taken
alias: Morning taken alias: Morning taken
sequence: sequence:
- service: input_boolean.turn_on - metadata: {}
metadata: {}
data: {} data: {}
target: target:
entity_id: input_boolean.tina_morning_meds_taken entity_id: input_boolean.tina_morning_meds_taken
alias: Turn on morning meds taken alias: Turn on morning meds taken
action: input_boolean.turn_on
- conditions: - conditions:
- condition: trigger - condition: trigger
id: id:
- night-taken - night-taken
alias: Night taken alias: Night taken
sequence: sequence:
- service: input_boolean.turn_on - metadata: {}
metadata: {}
data: {} data: {}
target: target:
entity_id: input_boolean.tina_night_meds_taken entity_id: input_boolean.tina_night_meds_taken
alias: Turn on night meds taken alias: Turn on night meds taken
action: input_boolean.turn_on
- conditions: - conditions:
- condition: trigger - condition: trigger
id: id:
- morning-skipped - morning-skipped
alias: Morning skipped alias: Morning skipped
sequence: sequence:
- service: input_boolean.turn_off - metadata: {}
metadata: {}
data: {} data: {}
target: target:
entity_id: input_boolean.tina_morning_meds_reminder entity_id: input_boolean.tina_morning_meds_reminder
alias: Deactivate morning reminders alias: Deactivate morning reminders
action: input_boolean.turn_off
- conditions: - conditions:
- condition: trigger - condition: trigger
id: id:
- night-skipped - night-skipped
alias: Night skipped alias: Night skipped
sequence: sequence:
- service: input_boolean.turn_off - metadata: {}
metadata: {}
data: {} data: {}
target: target:
entity_id: input_boolean.tina_night_meds_reminder entity_id: input_boolean.tina_night_meds_reminder
alias: Deactivate night reminders alias: Deactivate night reminders
action: input_boolean.turn_off
- conditions: - conditions:
- condition: trigger - condition: trigger
id: id:
@@ -5740,7 +5801,6 @@
alias: Night meds reminder active alias: Night meds reminder active
then: then:
- alias: Send critical TTS notification - alias: Send critical TTS notification
service: script.text_notify
metadata: {} metadata: {}
data: data:
type: critical type: critical
@@ -5748,6 +5808,19 @@
title: HEY DUMBASS title: HEY DUMBASS
message: YOU FORGOT TO TAKE YOUR MEDS!!!!! message: YOU FORGOT TO TAKE YOUR MEDS!!!!!
tag: tina-left-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 mode: queued
max: 10 max: 10
- id: '1722387020007' - id: '1722387020007'
@@ -6173,3 +6246,140 @@
- input_boolean.tina_night_meds_taken - input_boolean.tina_night_meds_taken
alias: Reset Tina meds taken switches alias: Reset Tina meds taken switches
mode: restart mode: restart
- id: '1747130058536'
alias: Shower Mode Auto Off
description: Kallen keeps leaving shower mode on, so I'm fixing that
triggers:
- trigger: state
entity_id:
- input_boolean.shower_mode
from: 'off'
to: 'on'
id: shower-on
alias: Shower Mode On
- trigger: event
event_type: timer.finished
event_data:
entity_id: timer.shower_mode_auto_off
id: timer-finished
alias: Timer Finished
conditions: []
actions:
- choose:
- conditions:
- condition: trigger
id:
- shower-on
alias: Shower On
sequence:
- alias: Start timer
action: timer.start
metadata: {}
data: {}
target:
entity_id: timer.shower_mode_auto_off
- conditions:
- condition: trigger
id:
- timer-finished
alias: Timer Finished
sequence:
- alias: Turn off shower mode
action: input_boolean.turn_off
metadata: {}
data: {}
target:
entity_id: input_boolean.shower_mode
alias: Routing
mode: restart
- id: '1747986913670'
alias: School Status Notifications
description: Sends alert notifications to all phones when school is placed under
a two hour delay or cancelled for the day
triggers:
- trigger: state
entity_id:
- input_boolean.two_hour_delay
from: 'off'
to: 'on'
id: delay
alias: Two Hour Delay
- trigger: state
entity_id:
- input_boolean.school_cancelled
from: 'off'
to: 'on'
id: cancel
alias: Cancelled
conditions: []
actions:
- choose:
- conditions:
- condition: trigger
id:
- delay
alias: Two Hour Delay
sequence:
- alias: Send Notification
action: script.text_notify
metadata: {}
data:
type: alert
title: School Alert
message: Defiance City Schools is under a two hour delay!
tag: two-hour-delay
who: all
- conditions:
- condition: trigger
id:
- cancel
alias: Cancelled
sequence:
- action: script.text_notify
metadata: {}
data:
type: alert
who: all
message: clear_notification
tag: two-hour-delay
alias: Clear previous delay notification
- delay:
hours: 0
minutes: 0
seconds: 2
milliseconds: 0
- alias: Send Notification
action: script.text_notify
metadata: {}
data:
type: alert
title: School Alert
message: Defiance City Schools has closed for today!
tag: school-cancelled
who: all
alias: Routing
mode: restart
- id: '1765674032722'
alias: Emma Bedroom Heater
description: Turns Emma's bedroom heater on at the scheduled time
triggers:
- trigger: time
at: input_datetime.emma_bedroom_climate
alias: Emma Bedroom Climate
conditions:
- condition: state
entity_id: input_select.scheduled_climate_mode_emma_bedroom
state:
- Heat
- condition: state
entity_id: input_boolean.emma_bedroom_heater_installed
state:
- 'on'
actions:
- action: climate.set_hvac_mode
metadata: {}
target:
entity_id: climate.emma_bedroom_vtherm
data:
hvac_mode: heat
mode: restart

File diff suppressed because it is too large Load Diff

View File

@@ -1,7 +1,7 @@
blueprint: blueprint:
name: Smart Lux Dimmer name: Smart Lux Dimmer
author: AntonH author: AntonH
description: 'Version 4.1 description: 'Version 4.3
Switch or dim lights based on the value of a light sensor. Switch or dim lights based on the value of a light sensor.
@@ -24,10 +24,11 @@ blueprint:
value? value?
selector: selector:
entity: entity:
domain: filter:
- sensor - domain:
device_class: - sensor
- illuminance device_class:
- illuminance
multiple: false multiple: false
target_light: target_light:
name: Target lights name: Target lights
@@ -81,8 +82,8 @@ blueprint:
min: 0.0 min: 0.0
max: 100.0 max: 100.0
step: 1.0 step: 1.0
mode: slider
unit_of_measurement: '%' unit_of_measurement: '%'
mode: slider
light_value_2: light_value_2:
name: Brightness at minimum light level name: Brightness at minimum light level
description: Brightness of the light at minimum ambient light. description: Brightness of the light at minimum ambient light.
@@ -92,8 +93,8 @@ blueprint:
min: 0.0 min: 0.0
max: 100.0 max: 100.0
step: 1.0 step: 1.0
mode: slider
unit_of_measurement: '%' unit_of_measurement: '%'
mode: slider
transition_time: transition_time:
name: Transition time name: Transition time
description: 'The time it takes for the light to transition from the set value description: 'The time it takes for the light to transition from the set value
@@ -124,9 +125,9 @@ blueprint:
value: include_color value: include_color
- label: Set temperature - label: Set temperature
value: include_temp value: include_temp
multiple: false
sort: false
custom_value: false custom_value: false
sort: false
multiple: false
light_color: light_color:
name: Light color name: Light color
description: Color of the light when between minimum and maximum ambient light description: Color of the light when between minimum and maximum ambient light
@@ -161,8 +162,8 @@ blueprint:
min: 0.0 min: 0.0
max: 100.0 max: 100.0
step: 1.0 step: 1.0
mode: slider
unit_of_measurement: '%' unit_of_measurement: '%'
mode: slider
light_brightness_under_min: light_brightness_under_min:
name: Brightness when ambient light value under min. name: Brightness when ambient light value under min.
description: Brightness of the light when the ambient light is lower than the description: Brightness of the light when the ambient light is lower than the
@@ -173,8 +174,8 @@ blueprint:
min: 0.0 min: 0.0
max: 100.0 max: 100.0
step: 1.0 step: 1.0
mode: slider
unit_of_measurement: '%' unit_of_measurement: '%'
mode: slider
include_color_or_temp_over_under: include_color_or_temp_over_under:
name: Include color or temperature values when outside range name: Include color or temperature values when outside range
description: 'Set a color or temperature value for the light when over maximum description: 'Set a color or temperature value for the light when over maximum
@@ -193,9 +194,9 @@ blueprint:
value: include_color_outside_range value: include_color_outside_range
- label: Set temperature when outside range - label: Set temperature when outside range
value: include_temp_outside_range value: include_temp_outside_range
multiple: false
sort: false
custom_value: false custom_value: false
sort: false
multiple: false
light_color_over_max: light_color_over_max:
name: Color when ambient light value over max. name: Color when ambient light value over max.
description: Color of the light when the ambient light is higher than the set description: Color of the light when the ambient light is higher than the set
@@ -236,18 +237,25 @@ variables:
include_brightness_over_under: !input include_brightness_over_under include_brightness_over_under: !input include_brightness_over_under
include_color_or_temp_over_under: !input include_color_or_temp_over_under include_color_or_temp_over_under: !input include_color_or_temp_over_under
light_sensor: !input light_sensor_entity light_sensor: !input light_sensor_entity
maxB: !input max_brightness_value max_brightness_value: !input max_brightness_value
minB: !input min_brightness_value min_brightness_value: !input min_brightness_value
light1: !input light_value_1 maxB: '{{ max_brightness_value * 2.55 }}'
light2: !input light_value_2 minB: '{{ min_brightness_value * 2.55 }}'
light_value_1: !input light_value_1
light_value_2: !input light_value_2
light1: '{{ light_value_1 * 2.55 }}'
light2: '{{ light_value_2 * 2.55 }}'
slope: '{{ ( light1 - light2 ) / ( maxB - minB ) }}' slope: '{{ ( light1 - light2 ) / ( maxB - minB ) }}'
constant: '{{ light1 - ( slope * maxB ) }}' constant: '{{ light1 - ( slope * maxB ) }}'
trigger: light_brightness_over_max: !input light_brightness_over_max
platform: state light_brightness_under_min: !input light_brightness_under_min
brightness_over_max_pct: '{{ light_brightness_over_max * 2.55 }}'
brightness_under_min_pct: '{{ light_brightness_under_min * 2.55 }}'
triggers:
trigger: state
entity_id: !input light_sensor_entity entity_id: !input light_sensor_entity
condition: conditions: !input run_conditions
- condition: !input run_conditions actions:
action:
- choose: - choose:
- conditions: - conditions:
- condition: template - condition: template
@@ -258,20 +266,20 @@ action:
- condition: template - condition: template
value_template: '{{ include_color_or_temp == "include_no_color_temp" }}' value_template: '{{ include_color_or_temp == "include_no_color_temp" }}'
sequence: sequence:
- service: light.turn_on - action: light.turn_on
data: data:
transition: !input transition_time transition: !input transition_time
brightness_pct: '{{ (( slope * states(light_sensor)|int ) + constant)|round brightness: '{{ (( slope * states(light_sensor)|int ) + constant)|round
}}' }}'
target: !input target_light target: !input target_light
- conditions: - conditions:
- condition: template - condition: template
value_template: '{{ include_color_or_temp == "include_color" }}' value_template: '{{ include_color_or_temp == "include_color" }}'
sequence: sequence:
- service: light.turn_on - action: light.turn_on
data: data:
transition: !input transition_time transition: !input transition_time
brightness_pct: '{{ (( slope * states(light_sensor)|int ) + constant)|round brightness: '{{ (( slope * states(light_sensor)|int ) + constant)|round
}}' }}'
rgb_color: !input light_color rgb_color: !input light_color
target: !input target_light target: !input target_light
@@ -279,10 +287,10 @@ action:
- condition: template - condition: template
value_template: '{{ include_color_or_temp == "include_temp" }}' value_template: '{{ include_color_or_temp == "include_temp" }}'
sequence: sequence:
- service: light.turn_on - action: light.turn_on
data: data:
transition: !input transition_time transition: !input transition_time
brightness_pct: '{{ (( slope * states(light_sensor)|int ) + constant)|round brightness: '{{ (( slope * states(light_sensor)|int ) + constant)|round
}}' }}'
color_temp: !input light_temp color_temp: !input light_temp
target: !input target_light target: !input target_light
@@ -302,20 +310,20 @@ action:
entity_id: !input light_sensor_entity entity_id: !input light_sensor_entity
above: !input max_brightness_value above: !input max_brightness_value
sequence: sequence:
- service: light.turn_on - action: light.turn_on
data: data:
transition: !input transition_time transition: !input transition_time
brightness_pct: !input light_brightness_over_max brightness: '{{ brightness_over_max_pct }}'
target: !input target_light target: !input target_light
- conditions: - conditions:
- condition: numeric_state - condition: numeric_state
entity_id: !input light_sensor_entity entity_id: !input light_sensor_entity
below: !input min_brightness_value below: !input min_brightness_value
sequence: sequence:
- service: light.turn_on - action: light.turn_on
data: data:
transition: !input transition_time transition: !input transition_time
brightness_pct: !input light_brightness_under_min brightness: '{{ brightness_under_min_pct }}'
target: !input target_light target: !input target_light
- conditions: - conditions:
- condition: numeric_state - condition: numeric_state
@@ -323,10 +331,10 @@ action:
below: !input max_brightness_value below: !input max_brightness_value
above: !input min_brightness_value above: !input min_brightness_value
sequence: sequence:
- service: light.turn_on - action: light.turn_on
data: data:
transition: !input transition_time transition: !input transition_time
brightness_pct: '{{ (( slope * states(light_sensor)|int ) + constant)|round brightness: '{{ (( slope * states(light_sensor)|int ) + constant)|round
}}' }}'
target: !input target_light target: !input target_light
- conditions: - conditions:
@@ -340,10 +348,10 @@ action:
entity_id: !input light_sensor_entity entity_id: !input light_sensor_entity
above: !input max_brightness_value above: !input max_brightness_value
sequence: sequence:
- service: light.turn_on - action: light.turn_on
data: data:
transition: !input transition_time transition: !input transition_time
brightness_pct: !input light_brightness_over_max brightness: '{{ brightness_over_max_pct }}'
rgb_color: !input light_color_over_max rgb_color: !input light_color_over_max
target: !input target_light target: !input target_light
- conditions: - conditions:
@@ -351,10 +359,10 @@ action:
entity_id: !input light_sensor_entity entity_id: !input light_sensor_entity
below: !input min_brightness_value below: !input min_brightness_value
sequence: sequence:
- service: light.turn_on - action: light.turn_on
data: data:
transition: !input transition_time transition: !input transition_time
brightness_pct: !input light_brightness_under_min brightness: '{{ brightness_under_min_pct }}'
rgb_color: !input light_color_under_min rgb_color: !input light_color_under_min
target: !input target_light target: !input target_light
- conditions: - conditions:
@@ -363,10 +371,10 @@ action:
below: !input max_brightness_value below: !input max_brightness_value
above: !input min_brightness_value above: !input min_brightness_value
sequence: sequence:
- service: light.turn_on - action: light.turn_on
data: data:
transition: !input transition_time transition: !input transition_time
brightness_pct: '{{ (( slope * states(light_sensor)|int ) + constant)|round brightness: '{{ (( slope * states(light_sensor)|int ) + constant)|round
}}' }}'
rgb_color: !input light_color rgb_color: !input light_color
target: !input target_light target: !input target_light
@@ -381,10 +389,10 @@ action:
entity_id: !input light_sensor_entity entity_id: !input light_sensor_entity
above: !input max_brightness_value above: !input max_brightness_value
sequence: sequence:
- service: light.turn_on - action: light.turn_on
data: data:
transition: !input transition_time transition: !input transition_time
brightness_pct: !input light_brightness_over_max brightness: '{{ brightness_over_max_pct }}'
color_temp: !input light_temp_over_max color_temp: !input light_temp_over_max
target: !input target_light target: !input target_light
- conditions: - conditions:
@@ -392,10 +400,10 @@ action:
entity_id: !input light_sensor_entity entity_id: !input light_sensor_entity
below: !input min_brightness_value below: !input min_brightness_value
sequence: sequence:
- service: light.turn_on - action: light.turn_on
data: data:
transition: !input transition_time transition: !input transition_time
brightness_pct: !input light_brightness_under_min brightness: '{{ brightness_under_min_pct }}'
color_temp: !input light_temp_under_min color_temp: !input light_temp_under_min
target: !input target_light target: !input target_light
- conditions: - conditions:
@@ -404,10 +412,10 @@ action:
below: !input max_brightness_value below: !input max_brightness_value
above: !input min_brightness_value above: !input min_brightness_value
sequence: sequence:
- service: light.turn_on - action: light.turn_on
data: data:
transition: !input transition_time transition: !input transition_time
brightness_pct: '{{ (( slope * states(light_sensor)|int ) + constant)|round brightness: '{{ (( slope * states(light_sensor)|int ) + constant)|round
}}' }}'
color_temp: !input light_temp color_temp: !input light_temp
target: !input target_light target: !input target_light

View File

@@ -31,12 +31,15 @@ blueprint:
text: {} text: {}
light_sensor_entity: light_sensor_entity:
name: Light Sensor name: Light Sensor
description: Which light sensor do you want to use to measure the ambient light
value?
selector: selector:
entity: entity:
domain: filter:
- sensor - domain:
device_class: - sensor
- illuminance device_class:
- illuminance
multiple: false multiple: false
max_brightness_value: max_brightness_value:
name: Maximum ambient light value name: Maximum ambient light value
@@ -94,15 +97,17 @@ variables:
light_sensor: !input light_sensor_entity light_sensor: !input light_sensor_entity
maxB: !input max_brightness_value maxB: !input max_brightness_value
minB: !input min_brightness_value minB: !input min_brightness_value
light1: !input light_value_1 light_value_1: !input light_value_1
light2: !input light_value_2 light_value_2: !input light_value_2
light1: '{{ light_value_1 * 2.55 }}'
light2: '{{ light_value_2 * 2.55 }}'
slope: '{{ ( light1 - light2 ) / ( maxB - minB ) }}' slope: '{{ ( light1 - light2 ) / ( maxB - minB ) }}'
constant: '{{ light1 - ( slope * maxB ) }}' constant: '{{ light1 - ( slope * maxB ) }}'
days: !input schedule_days days: !input schedule_days
trigger: triggers:
platform: state trigger: state
entity_id: !input light_sensor_entity entity_id: !input light_sensor_entity
condition: conditions:
- condition: numeric_state - condition: numeric_state
entity_id: !input light_sensor_entity entity_id: !input light_sensor_entity
above: !input min_brightness_value above: !input min_brightness_value
@@ -111,9 +116,9 @@ condition:
before: !input schedule_stop before: !input schedule_stop
- condition: template - condition: template
value_template: '{{ now().strftime(''%a'') | lower in days }}' value_template: '{{ now().strftime(''%a'') | lower in days }}'
action: actions:
- service: light.turn_on - action: light.turn_on
data: data:
brightness_pct: "{% if states(light_sensor)|int > maxB %}\n 0\n{% else %}\n {{ brightness: "{% if states(light_sensor)|int > maxB %}\n 0\n{% else %}\n {{ ((
(( slope * states(light_sensor)|int ) + constant)|round }}\n{% endif %}\n" slope * states(light_sensor)|int ) + constant)|round }}\n{% endif %}\n"
target: !input target_light target: !input target_light

View File

@@ -1,7 +1,7 @@
blueprint: blueprint:
name: The Everything Light name: The Everything Light
author: AntonH author: AntonH
description: "**Version 2.5**\nThe Everything Light: select any trigger and turn description: "**Version 2.10**\nThe Everything Light: select any trigger and turn
on your light in multiple ways:\n - just turn the light on in it's default state\n on your light in multiple ways:\n - just turn the light on in it's default state\n
\ - turn it on with a set brightness, color and/or temperature value\n - turn \ - turn it on with a set brightness, color and/or temperature value\n - turn
it on dynamically with a brightness value that changes according to an ambient it on dynamically with a brightness value that changes according to an ambient
@@ -55,13 +55,13 @@ blueprint:
Toggle the light. Toggle the light.
- **FIXED MODE: ** - **FIXED MODE:**
The light will turn on at a set brightness percentage, optionally color or The light will turn on at a set brightness percentage, optionally color or
temperature can be set. temperature can be set.
- **DYNAMIC MODE** - **DYNAMIC MODE:**
The light will be assigned a brightness value based on the value of a ambient The light will be assigned a brightness value based on the value of a ambient
light sensor, optionally color or temperature can be set. light sensor, optionally color or temperature can be set.
@@ -74,15 +74,15 @@ blueprint:
options: options:
- label: DEFAULT MODE - label: DEFAULT MODE
value: default value: default
- label: TOGGLE - label: TOGGLE MODE
value: toggle value: toggle
- label: FIXED MODE - label: FIXED MODE
value: fixed value: fixed
- label: DYNAMIC MODE - label: DYNAMIC MODE
value: dynamic value: dynamic
multiple: false
sort: false
custom_value: false custom_value: false
sort: false
multiple: false
transition_time: transition_time:
name: Transition time (FIXED & DYNAMIC MODE) name: Transition time (FIXED & DYNAMIC MODE)
description: "The time it takes for the light to transition to the assigned description: "The time it takes for the light to transition to the assigned
@@ -110,9 +110,9 @@ blueprint:
value: include_color value: include_color
- label: Set temperature - label: Set temperature
value: include_temperature value: include_temperature
multiple: false
sort: false
custom_value: false custom_value: false
sort: false
multiple: false
light_color: light_color:
name: Light color (FIXED & DYNAMIC MODE) name: Light color (FIXED & DYNAMIC MODE)
description: Color of the light when between minimum and maximum ambient light description: Color of the light when between minimum and maximum ambient light
@@ -125,22 +125,28 @@ blueprint:
color_rgb: {} color_rgb: {}
light_temperature: light_temperature:
name: Light temperature (FIXED & DYNAMIC MODE) name: Light temperature (FIXED & DYNAMIC MODE)
description: Temperature of the light when between minimum and maximum ambient description: 'Temperature of the light when between minimum and maximum ambient
light values. light values.
(not all lights will support all values, please consult your lights spec sheet.)
'
default: 2000 default: 2000
selector: selector:
color_temp: {} color_temp:
unit: kelvin
min: 1500
max: 6500
brightness: brightness:
name: Brightness (FIXED BRIGHTNESS MODE) name: Brightness (FIXED BRIGHTNESS MODE)
description: Set the brightness value the light needs to turn on at description: Set the brightness value the light needs to turn on at
default: 0 default: 100
selector: selector:
number: number:
min: 0.0 min: 0.0
max: 100.0 max: 100.0
step: 1.0 step: 1.0
mode: slider mode: slider
unit_of_measurement: '%'
light_sensor_entity: light_sensor_entity:
name: Light Sensor (DYNAMIC MODE) name: Light Sensor (DYNAMIC MODE)
description: Which light sensor do you want to use to measure the ambient light description: Which light sensor do you want to use to measure the ambient light
@@ -188,7 +194,6 @@ blueprint:
max: 100.0 max: 100.0
step: 1.0 step: 1.0
mode: slider mode: slider
unit_of_measurement: '%'
light_value_2: light_value_2:
name: Brightness at minimum light level (DYNAMIC MODE) name: Brightness at minimum light level (DYNAMIC MODE)
description: Brightness of the light at minimum ambient light. description: Brightness of the light at minimum ambient light.
@@ -199,7 +204,6 @@ blueprint:
max: 100.0 max: 100.0
step: 1.0 step: 1.0
mode: slider mode: slider
unit_of_measurement: '%'
light_brightness_over_max: light_brightness_over_max:
name: Brightness when ambient light value over max (DYNAMIC MODE) name: Brightness when ambient light value over max (DYNAMIC MODE)
description: Brightness of the light when the ambient light is higher than the description: Brightness of the light when the ambient light is higher than the
@@ -211,19 +215,17 @@ blueprint:
max: 100.0 max: 100.0
step: 1.0 step: 1.0
mode: slider mode: slider
unit_of_measurement: '%'
light_brightness_under_min: light_brightness_under_min:
name: Brightness when ambient light value under min (DYNAMIC MODE) name: Brightness when ambient light value under min (DYNAMIC MODE)
description: Brightness of the light when the ambient light is lower than the description: Brightness of the light when the ambient light is lower than the
set minimum value. set minimum value.
default: 100 default: 255
selector: selector:
number: number:
min: 0.0 min: 0.0
max: 100.0 max: 100.0
step: 1.0 step: 1.0
mode: slider mode: slider
unit_of_measurement: '%'
include_color_or_temp_over_under: include_color_or_temp_over_under:
name: Include color or temperature values when outside range (DYNAMIC MODE) name: Include color or temperature values when outside range (DYNAMIC MODE)
description: 'Set a color or temperature value for the light when over maximum description: 'Set a color or temperature value for the light when over maximum
@@ -242,9 +244,9 @@ blueprint:
value: include_color_outside_range value: include_color_outside_range
- label: Set temperature when outside range - label: Set temperature when outside range
value: include_temp_outside_range value: include_temp_outside_range
multiple: false
sort: false
custom_value: false custom_value: false
sort: false
multiple: false
light_color_over_max: light_color_over_max:
name: Color when ambient light value over max (DYNAMIC MODE) name: Color when ambient light value over max (DYNAMIC MODE)
description: Color of the light when the ambient light is higher than the set description: Color of the light when the ambient light is higher than the set
@@ -267,18 +269,32 @@ blueprint:
color_rgb: {} color_rgb: {}
light_temp_over_max: light_temp_over_max:
name: Temperature when ambient light value over max (DYNAMIC MODE) name: Temperature when ambient light value over max (DYNAMIC MODE)
description: Temperature of the light when the ambient light is higher than description: 'Temperature of the light when the ambient light is higher than
the set maximum value. the set maximum value.
(not all lights will support all values, please consult your lights spec sheet.)
'
default: 2000 default: 2000
selector: selector:
color_temp: {} color_temp:
unit: kelvin
min: 1500
max: 6500
light_temp_under_min: light_temp_under_min:
name: Temperature when ambient light value under min (DYNAMIC MODE) name: Temperature when ambient light value under min (DYNAMIC MODE)
description: Temperature of the light when the ambient light is lower than the description: 'Temperature of the light when the ambient light is lower than
set minimum value. the set minimum value.
(not all lights will support all values, please consult your lights spec sheet.)
'
default: 2000 default: 2000
selector: selector:
color_temp: {} color_temp:
unit: kelvin
min: 1500
max: 6500
include_turn_off: include_turn_off:
name: Include light turn off function name: Include light turn off function
description: 'Select if the light needs to turn back off again and how you want description: 'Select if the light needs to turn back off again and how you want
@@ -307,8 +323,8 @@ blueprint:
value: trigger value: trigger
- label: Staircase function - label: Staircase function
value: staircase value: staircase
sort: false
custom_value: false custom_value: false
sort: false
turn_off_triggers: turn_off_triggers:
name: Turn off triggers name: Turn off triggers
description: Triggers that turn the light off description: Triggers that turn the light off
@@ -343,71 +359,75 @@ variables:
include_color_or_temp: !input include_color_or_temp include_color_or_temp: !input include_color_or_temp
light_color: !input light_color light_color: !input light_color
light_temperature: !input light_temperature light_temperature: !input light_temperature
light_brightness: !input brightness brightness: !input brightness
light_brightness: '{{ brightness * 2.55 }}'
light_sensor: !input light_sensor_entity light_sensor: !input light_sensor_entity
maxB: !input max_brightness_value maxB: !input max_brightness_value
minB: !input min_brightness_value minB: !input min_brightness_value
light1: !input light_value_1 light_value_1: !input light_value_1
light2: !input light_value_2 light_value_2: !input light_value_2
light1: '{{ light_value_1 * 2.55 }}'
light2: '{{ light_value_2 * 2.55 }}'
slope: '{{ ( light1 - light2 ) / ( maxB - minB ) }}' slope: '{{ ( light1 - light2 ) / ( maxB - minB ) }}'
constant: '{{ light1 - ( slope * maxB ) }}' constant: '{{ light1 - ( slope * maxB ) }}'
dynamic_brightness_pct: "{% if mode == \"dynamic\" %}\n {{ (( slope * states(light_sensor)|int dynamic_brightness: "{% if mode == \"dynamic\" %}\n {{ (( slope * states(light_sensor)|int
) + constant)|round }}\n{% else %}\n 0\n{% endif %}\n" ) + constant)|round }}\n{% else %}\n 0\n{% endif %}\n"
include_color_or_temp_over_under: !input include_color_or_temp_over_under include_color_or_temp_over_under: !input include_color_or_temp_over_under
light_brightness_over_max: !input light_brightness_over_max light_brightness_over_max: !input light_brightness_over_max
brightness_over_max_pct: '{{ light_brightness_over_max * 2.55 }}'
light_color_over_max: !input light_color_over_max light_color_over_max: !input light_color_over_max
light_temp_over_max: !input light_temp_over_max light_temp_over_max: !input light_temp_over_max
light_brightness_under_min: !input light_brightness_under_min light_brightness_under_min: !input light_brightness_under_min
brightness_under_min_pct: '{{ light_brightness_under_min * 2.55 }}'
light_color_under_min: !input light_color_under_min light_color_under_min: !input light_color_under_min
light_temp_under_min: !input light_temp_under_min light_temp_under_min: !input light_temp_under_min
include_turn_off: !input include_turn_off include_turn_off: !input include_turn_off
trigger: !input triggers trigger: !input triggers
condition: conditions: !input run_conditions
- condition: !input run_conditions actions:
action:
- choose: - choose:
- conditions: '{{ mode == "toggle" }}' - conditions: '{{ mode == "toggle" }}'
sequence: sequence:
- service: homeassistant.toggle - action: homeassistant.toggle
target: !input target_light target: !input target_light
- conditions: '{{ mode == "default" }}' - conditions: '{{ mode == "default" }}'
sequence: sequence:
- service: homeassistant.turn_on - action: homeassistant.turn_on
target: !input target_light target: !input target_light
- conditions: '{{ mode == "fixed" }}' - conditions: '{{ mode == "fixed" }}'
sequence: sequence:
- service: light.turn_on - action: light.turn_on
data: "{% if include_color_or_temp == \"include_color\" %}\n {{ { \"transition\": data: "{% if include_color_or_temp == \"include_color\" %}\n {{ { \"transition\":
transition_time, \"brightness_pct\": light_brightness, \"rgb_color\": light_color transition_time, \"brightness\": light_brightness, \"rgb_color\": light_color
} }}\n{% elif include_color_or_temp == \"include_temperature\" %}\n {{ { } }}\n{% elif include_color_or_temp == \"include_temperature\" %}\n {{ {
\"transition\": transition_time, \"brightness_pct\": light_brightness, \"color_temp\": \"transition\": transition_time, \"brightness\": light_brightness, \"color_temp\":
light_temperature } }}\n{% else %}\n {{ { \"transition\": transition_time, light_temperature } }}\n{% else %}\n {{ { \"transition\": transition_time,
\"brightness_pct\": light_brightness } }}\n{% endif %}\n" \"brightness\": light_brightness } }}\n{% endif %}\n"
target: !input target_light target: !input target_light
- conditions: '{{ mode == "dynamic" }}' - conditions: '{{ mode == "dynamic" }}'
sequence: sequence:
- service: light.turn_on - action: light.turn_on
data: "{% if states(light_sensor)|int > maxB %}\n {% if include_color_or_temp_over_under data: "{% if states(light_sensor)|int > maxB %}\n {% if include_color_or_temp_over_under
== \"include_color_outside_range\" %}\n {{ { \"transition\": transition_time, == \"include_color_outside_range\" %}\n {{ { \"transition\": transition_time,
\"brightness_pct\": light_brightness_over_max, \"rgb_color\": light_color_over_max \"brightness\": brightness_over_max_pct, \"rgb_color\": light_color_over_max
} }}\n {% elif include_color_or_temp_over_under == \"include_temp_outside_range\" } }}\n {% elif include_color_or_temp_over_under == \"include_temp_outside_range\"
%}\n {{ { \"transition\": transition_time, \"brightness_pct\": light_brightness_over_max, %}\n {{ { \"transition\": transition_time, \"brightness\": brightness_over_max_pct,
\"color_temp\": light_temp_over_max } }}\n {% else %}\n {{ { \"transition\": \"color_temp\": light_temp_over_max } }}\n {% else %}\n {{ { \"transition\":
transition_time, \"brightness_pct\": light_brightness_over_max } }}\n {% transition_time, \"brightness\": brightness_over_max_pct } }}\n {% endif
endif %}\n{% elif states(light_sensor)|int < minB %}\n {% if include_color_or_temp_over_under %}\n{% elif states(light_sensor)|int < minB %}\n {% if include_color_or_temp_over_under
== \"include_color_outside_range\" %}\n {{ { \"transition\": transition_time, == \"include_color_outside_range\" %}\n {{ { \"transition\": transition_time,
\"brightness_pct\": light_brightness_under_min, \"rgb_color\": light_color_under_min \"brightness\": brightness_under_min_pct, \"rgb_color\": light_color_under_min
} }}\n {% elif include_color_or_temp_over_under == \"include_temp_outside_range\" } }}\n {% elif include_color_or_temp_over_under == \"include_temp_outside_range\"
%}\n {{ { \"transition\": transition_time, \"brightness_pct\": light_brightness_under_min, %}\n {{ { \"transition\": transition_time, \"brightness\": brightness_under_min_pct,
\"color_temp\": light_temp_under_min } }}\n {% else %}\n {{ { \"transition\": \"color_temp\": light_temp_under_min } }}\n {% else %}\n {{ { \"transition\":
transition_time, \"brightness_pct\": light_brightness_under_min } }}\n {% transition_time, \"brightness\": brightness_under_min_pct } }}\n {% endif
endif %}\n{% else %}\n {% if include_color_or_temp == \"include_color\" %}\n %}\n{% else %}\n {% if include_color_or_temp == \"include_color\" %}\n {{
\ {{ { \"transition\": transition_time, \"brightness_pct\": light_brightness, { \"transition\": transition_time, \"brightness\": light_brightness, \"rgb_color\":
\"rgb_color\": light_color } }}\n {% elif include_color_or_temp == \"include_temperature\" light_color } }}\n {% elif include_color_or_temp == \"include_temperature\"
%}\n {{ { \"transition\": transition_time, \"brightness_pct\": dynamic_brightness_pct, %}\n {{ { \"transition\": transition_time, \"brightness\": dynamic_brightness,
\"color_temp\": light_temperature } }}\n {% else %}\n {{ { \"transition\": \"color_temp\": light_temperature } }}\n {% else %}\n {{ { \"transition\":
transition_time, \"brightness_pct\": dynamic_brightness_pct } }}\n {% endif transition_time, \"brightness\": dynamic_brightness } }}\n {% endif %}\n{%
%}\n{% endif %}\n" endif %}\n"
target: !input target_light target: !input target_light
- if: !input turn_off_conditions - if: !input turn_off_conditions
then: then:
@@ -420,11 +440,11 @@ action:
timeout: !input staircase_duration timeout: !input staircase_duration
else: else:
- delay: !input staircase_duration - delay: !input staircase_duration
- service: homeassistant.turn_off - action: homeassistant.turn_off
target: !input target_light target: !input target_light
- conditions: '{{ "trigger" in include_turn_off and not "staircase" in include_turn_off - conditions: '{{ "trigger" in include_turn_off and not "staircase" in include_turn_off
}}' }}'
sequence: sequence:
- wait_for_trigger: !input turn_off_triggers - wait_for_trigger: !input turn_off_triggers
- service: homeassistant.turn_off - action: homeassistant.turn_off
target: !input target_light target: !input target_light

View File

@@ -10,6 +10,7 @@ blueprint:
selector: selector:
entity: entity:
integration: cast integration: cast
multiple: false
view: view:
name: Lovelace view path name: Lovelace view path
description: Path of the view to cast. A path has to be defined in your Lovelace description: Path of the view to cast. A path has to be defined in your Lovelace
@@ -21,11 +22,11 @@ blueprint:
source_url: https://community.home-assistant.io/t/cast-and-re-cast-a-lovelace-view-to-a-google-hub/259631 source_url: https://community.home-assistant.io/t/cast-and-re-cast-a-lovelace-view-to-a-google-hub/259631
trigger: trigger:
- platform: state - platform: state
entity_id: !input 'player' entity_id: !input player
to: 'off' to: 'off'
for: 00:00:20 for: 00:00:20
- platform: state - platform: state
entity_id: !input 'player' entity_id: !input player
to: paused to: paused
for: 00:00:20 for: 00:00:20
- platform: time_pattern - platform: time_pattern
@@ -38,38 +39,38 @@ action:
- condition: or - condition: or
conditions: conditions:
- condition: state - condition: state
entity_id: !input 'player' entity_id: !input player
state: 'off' state: 'off'
- condition: state - condition: state
entity_id: !input 'player' entity_id: !input player
state: paused state: paused
for: 00:00:20 for: 00:00:20
sequence: sequence:
- service: media_player.volume_mute - service: media_player.volume_mute
data: data:
is_volume_muted: true is_volume_muted: true
entity_id: !input 'player' entity_id: !input player
- service: media_player.turn_off - service: media_player.turn_off
data: data:
entity_id: !input 'player' entity_id: !input player
- delay: - delay:
seconds: 2 seconds: 2
- service: media_player.turn_on - service: media_player.turn_on
data: data:
entity_id: !input 'player' entity_id: !input player
- service: cast.show_lovelace_view - service: cast.show_lovelace_view
data: data:
view_path: !input 'view' view_path: !input view
dashboard_path: !input 'dashboard' dashboard_path: !input dashboard
entity_id: !input 'player' entity_id: !input player
- service: cast.show_lovelace_view - service: cast.show_lovelace_view
data: data:
view_path: !input 'view' view_path: !input view
dashboard_path: !input 'dashboard' dashboard_path: !input dashboard
entity_id: !input 'player' entity_id: !input player
- delay: - delay:
seconds: 10 seconds: 10
- service: media_player.volume_mute - service: media_player.volume_mute
data: data:
is_volume_muted: false is_volume_muted: false
entity_id: !input 'player' entity_id: !input player

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

@@ -33,6 +33,7 @@ frontend:
- /hacsfiles/hass-hue-icons/hass-hue-icons.js - /hacsfiles/hass-hue-icons/hass-hue-icons.js
- /hacsfiles/hass-bha-icons/hass-bha-icons.js - /hacsfiles/hass-bha-icons/hass-bha-icons.js
- /hacsfiles/material-you-utilities/material-you-utilities.min.js - /hacsfiles/material-you-utilities/material-you-utilities.min.js
- /hacsfiles/lovelace-card-mod/card-mod.js?v4.1.0
javascript_version: latest javascript_version: latest
panel_custom: panel_custom:
@@ -116,6 +117,8 @@ recorder:
- sensor.portainer* - sensor.portainer*
- sensor.mosquitto* - sensor.mosquitto*
- sensor.*_rssi - sensor.*_rssi
- sensor.weatherflow_hub*
- sensor.internet_round_trip*
entities: entities:
- sensor.avg_ping - sensor.avg_ping
- sensor.max_ping - sensor.max_ping
@@ -130,6 +133,8 @@ recorder:
- sensor.mariadb_database_size - sensor.mariadb_database_size
- sensor.random_joke - sensor.random_joke
- sensor.bypassed_sensors - sensor.bypassed_sensors
- sensor.home_tempest_signal_strength
- sensor.home_tempest_uptime
include: include:
entities: entities:
- media_player.living_room_tv - media_player.living_room_tv
@@ -175,6 +180,8 @@ influxdb:
entity_globs: entity_globs:
- binary_sensor.*tamper* - binary_sensor.*tamper*
- light.*screen* - light.*screen*
- sensor.weatherflow_hub*
- sensor.home_tempest*
entities: entities:
- sensor.last_boot - sensor.last_boot
- sensor.date - sensor.date
@@ -187,6 +194,8 @@ influxdb:
- light.all_lights - light.all_lights
- fan.all_fans - fan.all_fans
- sensor.random_joke - sensor.random_joke
- sensor.home_tempest_signal_strength
- sensor.home_tempest_uptime
include: include:
domains: domains:
- sun - sun
@@ -292,18 +301,6 @@ influxdb:
- binary_sensor.people_present - binary_sensor.people_present
- weather.iron_nerd_weather_station - weather.iron_nerd_weather_station
- weather.ashland_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 - sensor.current_lights_on
- binary_sensor.early_night_mode - binary_sensor.early_night_mode
- input_boolean.give_me_darkness - input_boolean.give_me_darkness
@@ -356,6 +353,8 @@ prometheus:
exclude_entity_globs: exclude_entity_globs:
- binary_sensor.*tamper* - binary_sensor.*tamper*
- light.*screen* - light.*screen*
- sensor.weatherflow_hub*
- sensor.home_tempest*
exclude_entities: exclude_entities:
- sensor.last_boot - sensor.last_boot
- sensor.date - sensor.date
@@ -368,6 +367,8 @@ prometheus:
- light.all_lights - light.all_lights
- fan.all_fans - fan.all_fans
- sensor.random_joke - sensor.random_joke
- sensor.home_tempest_signal_strength
- sensor.home_tempest_uptime
include_domains: include_domains:
- sun - sun
- light - light
@@ -472,18 +473,6 @@ prometheus:
- binary_sensor.people_present - binary_sensor.people_present
- weather.iron_nerd_weather_station - weather.iron_nerd_weather_station
- weather.ashland_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 - sensor.current_lights_on
- binary_sensor.early_night_mode - binary_sensor.early_night_mode
- input_boolean.give_me_darkness - input_boolean.give_me_darkness

View File

@@ -825,7 +825,21 @@
'ottobre', 'ottobre',
'novembre', 'novembre',
'dicembre', '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':{ 'pt':{
'_language': 'Português', '_language': 'Português',
@@ -1041,7 +1055,21 @@
'Październik', 'Październik',
'Listopad', 'Listopad',
'Grudzień', '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':{ 'ru':{
'_language': 'Русский', '_language': 'Русский',
@@ -1779,9 +1807,9 @@
{%- else %} {%- else %}
{%- set t = translate('ago', language=language) %} {%- set t = translate('ago', language=language) %}
{%- if '%s' in t %} {%- if '%s' in t %}
{{ t % items }} {{- t % items }}
{%- else %} {%- else %}
{{- items }} {{ translate('ago', language=language) }} {{- items }} {{ t }}
{%- endif %} {%- endif %}
{%- endif %} {%- endif %}
{%- else %} {%- else %}
@@ -2045,7 +2073,7 @@
{%- if '%s' in t %} {%- if '%s' in t %}
{{- t % ret }} {{- t % ret }}
{%- else %} {%- else %}
{{- ret }} {{ translate('ago', language=language) }} {{- ret }} {{ t }}
{%- endif %} {%- endif %}
{%- endif %} {%- endif %}
{%- endif %} {%- endif %}

View File

@@ -236,7 +236,7 @@
'hour': ['ч', 'час', 'часа', 'часов'], 'hour': ['ч', 'час', 'часа', 'часов'],
'minute': ['м', 'минута', 'минуты', 'минут'], 'minute': ['м', 'минута', 'минуты', 'минут'],
'second': ['с', 'секунда', 'секунды', 'секунд'], 'second': ['с', 'секунда', 'секунды', 'секунд'],
'millisecond': ['мс', 'милисекунда', 'милисекунды', 'милисекунд'], 'millisecond': ['мс', 'миллисекунда', 'миллисекунды', 'миллисекунд'],
'combine': 'и', 'combine': 'и',
'error': 'Неверная дата', 'error': 'Неверная дата',
} }
@@ -337,6 +337,22 @@
'error': 'Érvénytelen dátum', '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 #} {# 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 period_str = period_str(team) %}
{% set game_clock = state_attr(team,'clock') | lower %} {% set game_clock = state_attr(team,'clock') | lower %}
{% if state_attr(team,'league') == 'MLB' %} {% if state_attr(team,'league') == 'MLB' %}
{% set inning_parts = game_clock.split(' ') %} {% if 'rain delay' in game_clock %}
in the {{ inning_parts[0] ~ ' of the ' ~ inning_parts[1] ~ ' ' ~ period_str }} {# 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 %} {% else %}
{% if ' - ' in game_clock %} {% if ' - ' in game_clock %}
{% set clock_time, quarter = game_clock.split(' - ') %} {% set clock_time, quarter = game_clock.split(' - ') %}
@@ -83,8 +90,8 @@
{% elif state_attr(team,'opponent_winner') == true %} {% elif state_attr(team,'opponent_winner') == true %}
The {{ state_attr(team,'friendly_name') }} lost their game today against {% if state_attr(team,'league') != 'NCAAF'%}the{% endif %} {{ opponent_name }} by a score of {{ state_attr(team,'opponent_score') }} to {{ state_attr(team,'team_score') }}. The {{ state_attr(team,'friendly_name') }} lost their game today against {% if state_attr(team,'league') != 'NCAAF'%}the{% endif %} {{ opponent_name }} by a score of {{ state_attr(team,'opponent_score') }} to {{ state_attr(team,'team_score') }}.
{% endif %} {% endif %}
{% if state_attr(team,'clock') not in ['postponed','Postponed'] %} {% if state_attr(team,'clock') not in ['postponed','Postponed'] and state_attr(team,'team_record') != None %}
This brings their record to {{ state_attr(team,'team_record') | replace("-"," and ") }} on the season. This brings their record to {{ state_attr(team,'team_record') | replace("-"," and ") }} on the season.
{% endif %} {% endif %}
{% elif yday == date %} {% elif yday == date %}
{% if state_attr(team,'clock') in ['postponed','Postponed'] %} {% if state_attr(team,'clock') in ['postponed','Postponed'] %}
@@ -164,6 +171,15 @@
{% if is_state('binary_sensor.minnesota_wild_inhibit','off') %} {% if is_state('binary_sensor.minnesota_wild_inhibit','off') %}
{{ sports_pregame('sensor.minnesota_wild') }} {{ sports_pregame('sensor.minnesota_wild') }}
{% endif %} {% endif %}
{% if is_state('binary_sensor.michigan_wolverines_hockey','off') %}
{{ sports_pregame('sensor.michigan_wolverines_hockey') }}
{% endif %}
{% if is_state('binary_sensor.minnesota_golden_gophers_hockey','off') %}
{{ sports_pregame('sensor.minnesota_golden_gophers_hockey') }}
{% endif %}
{% if is_state('binary_sensor.minnesota_state_mavericks_hockey','off') %}
{{ sports_pregame('sensor.minnesota_state_mavericks_hockey') }}
{% endif %}
{% elif time == 'main' %} {% elif time == 'main' %}
{% if is_state('binary_sensor.michigan_wolverines_inhibit','off') %} {% if is_state('binary_sensor.michigan_wolverines_inhibit','off') %}
{{ sports_main('sensor.michigan_wolverines') }} {{ sports_main('sensor.michigan_wolverines') }}
@@ -192,6 +208,15 @@
{% if is_state('binary_sensor.minnesota_wild_inhibit','off') %} {% if is_state('binary_sensor.minnesota_wild_inhibit','off') %}
{{ sports_main('sensor.minnesota_wild') }} {{ sports_main('sensor.minnesota_wild') }}
{% endif %} {% endif %}
{% if is_state('binary_sensor.michigan_wolverines_hockey','off') %}
{{ sports_main('sensor.michigan_wolverines_hockey') }}
{% endif %}
{% if is_state('binary_sensor.minnesota_golden_gophers_hockey','off') %}
{{ sports_main('sensor.minnesota_golden_gophers_hockey') }}
{% endif %}
{% if is_state('binary_sensor.minnesota_state_mavericks_hockey','off') %}
{{ sports_main('sensor.minnesota_state_mavericks_hockey') }}
{% endif %}
{% endif %} {% endif %}
{% endmacro %} {% endmacro %}
{{ cleanup(data()) }} {{ cleanup(data()) }}

View File

@@ -19,15 +19,15 @@
{% if type in ['alerts','full'] %} {% if type in ['alerts','full'] %}
{% if is_state('input_boolean.tornado_alarm','on') %} {% if is_state('input_boolean.tornado_alarm','on') %}
We are under a tornado warning. If you are not already in shelter, you should be. Get on it! We are under a tornado warning. If you are not already in shelter, you should be. Get on it!
{% if state_attr('binary_sensor.tornado_warning','confirmed' == true) %} {% if state_attr('binary_sensor.tornado_warning','confirmed') == true %}
A tornado has been confirmed in the area. Please take shelter immediately! A tornado has been confirmed in the area. Please take shelter immediately!
{% endif %} {% endif %}
{% elif is_state('binary_sensor.severe_thunderstorm_warning','on') %} {% elif is_state('binary_sensor.severe_thunderstorm_warning','on') %}
We are under a severe thunderstorm warning. We are under a severe thunderstorm warning.
{% if state_attr('binary_sensor.severe_thunderstorm_warning','tornado_possible' == true) %} {% if state_attr('binary_sensor.severe_thunderstorm_warning','tornado_possible') == true %}
The incoming storm has the potential to produce a tornado, so please pay attention and prepare to take shelter! The incoming storm has the potential to produce a tornado, so please pay attention and prepare to take shelter!
{% endif %} {% endif %}
{% if state_attr('binary_sensor.severe_thunderstorm_warning','considerable_destructive' == true) %} {% if state_attr('binary_sensor.severe_thunderstorm_warning','considerable_destructive') == true %}
This storm has the potential to cause considerable damage. Please take shelter and stay safe! This storm has the potential to cause considerable damage. Please take shelter and stay safe!
{% endif %} {% endif %}
{% elif states('sensor.weatheralerts_active_alerts') > '0' and method != 'dashboard' %} {% elif states('sensor.weatheralerts_active_alerts') > '0' and method != 'dashboard' %}
@@ -39,7 +39,22 @@
There is lightning in the area. Nearest strike is {{ ltgdist }} miles away. There is lightning in the area. Nearest strike is {{ ltgdist }} miles away.
{% endif %} {% endif %}
{% if is_state('binary_sensor.raining','on') %} {% if is_state('binary_sensor.raining','on') %}
It is currently raining. Make sure all doors and windows are closed! {% if states('sensor.home_tempest_cloud_sensors_precipitation_intensity') not in ['unavailable','unknown','no_rain'] %}
{% set intensity = states('sensor.home_tempest_cloud_sensors_precipitation_intensity') %}
{% if intensity == 'very_light' %}
There is currently a very light drizzle falling.
{% elif intensity == 'light' %}
There is currently light rain falling. Front porch windows should be okay, but other windows should be closed.
{% elif intensity == 'moderate' %}
It is raining pretty good outside, you should probably make sure all windows are closed.
{% elif intensity in ['heavy','very_heavy'] %}
There is heavy rain falling, please make sure all doors and windows are closed at this time.
{% elif intensity == 'extreme' %}
It is raining extremely hard outside. Make sure all doors and windows are closed, and I recommend staying inside until it calms down. Perhaps check for roof leaks as well.
{% endif %}
{% else %}
It is currently raining. Make sure all doors and windows are closed!
{% endif %}
{% endif %} {% endif %}
{% endif %} {% endif %}
{% if state_attr('weather.iron_nerd_weather_station','visibility') | int < 3 %} {% if state_attr('weather.iron_nerd_weather_station','visibility') | int < 3 %}
@@ -60,15 +75,15 @@
{% endif %} {% endif %}
{% if is_state('input_boolean.tornado_alarm','on') %} {% if is_state('input_boolean.tornado_alarm','on') %}
"We are under a tornado warning. If you are not already in shelter, you should be. Get on it! " "We are under a tornado warning. If you are not already in shelter, you should be. Get on it! "
{% if state_attr('binary_sensor.tornado_warning','confirmed' == true) %} {% if state_attr('binary_sensor.tornado_warning','confirmed') == true %}
"A tornado has been confirmed in the area. Please take shelter immediately! " "A tornado has been confirmed in the area. Please take shelter immediately! "
{% endif %} {% endif %}
{% elif is_state('binary_sensor.severe_thunderstorm_warning','on') %} {% elif is_state('binary_sensor.severe_thunderstorm_warning','on') %}
"We are under a severe thunderstorm warning. " "We are under a severe thunderstorm warning. "
{% if state_attr('binary_sensor.severe_thunderstorm_warning','tornado_possible' == true) %} {% if state_attr('binary_sensor.severe_thunderstorm_warning','tornado_possible') == true %}
"The incoming storm has the potential to produce a tornado, so please pay attention and prepare to take shelter! " "The incoming storm has the potential to produce a tornado, so please pay attention and prepare to take shelter! "
{% endif %} {% endif %}
{% if state_attr('binary_sensor.severe_thunderstorm_warning','considerable_destructive' == true) %} {% if state_attr('binary_sensor.severe_thunderstorm_warning','considerable_destructive') == true %}
"This storm has the potential to cause considerable damage. Please take shelter and stay safe! " "This storm has the potential to cause considerable damage. Please take shelter and stay safe! "
{% endif %} {% endif %}
{% elif is_state('input_boolean.tornado_watch','on') %} {% elif is_state('input_boolean.tornado_watch','on') %}
@@ -90,12 +105,49 @@
"The nearest lightning strike is {{ ltgdist }} miles away. " "The nearest lightning strike is {{ ltgdist }} miles away. "
{% endif %} {% endif %}
{% if is_state('binary_sensor.raining','on') %} {% if is_state('binary_sensor.raining','on') %}
{{ [ {% if states('sensor.home_tempest_cloud_sensors_precipitation_intensity') not in ['unavailable','unknown','no_rain'] %}
"I have looked outside and determined that it is raining. ", {% set intensity = states('sensor.home_tempest_cloud_sensors_precipitation_intensity') %}
"If you look outside the window, you will notice, it wainin. ", {% if intensity == 'very_light' %}
"It wainin sideways! ", {{ [
"There appears to be excessive moisture currently falling from the sky. Plan accordingly. ", "There is currently a very light drizzle falling. ",
] | random }} "It is drizzling outside, but it is not too bad. ",
"The sky is spitting on us. That's not very nice, but a mild inconvenience at most. "
] | random }}
{% elif intensity == 'light' %}
{{ [
"There is currently light rain falling. ",
"It is raining lightly outside, but it is not too bad. ",
"It kinda wainin outside, but just a little. "
] | random }}
"Front porch windows should be okay, but other windows should be closed. "
{% elif intensity == 'moderate' %}
{{ [
"It is raining pretty good outside, you should probably make sure all windows are closed. ",
"It is raining at a decent rate outside, please make sure all windows are closed. "
"If you look outside, you will see that it wainin. "
] | random }}
{% elif intensity in ['heavy','very_heavy'] %}
{{ [
"There is heavy rain falling, please make sure all doors and windows are closed at this time. ",
"It is raining heavily outside, please make sure all doors and windows are closed. ",
"It wainin sideways! Please make sure all doors and windows are closed. "
] | random }}
{% elif intensity == 'extreme' %}
{{ [
"It is raining extremely hard outside. ",
"There is a torrential downpour outside. ",
"Holy crap, I have never seen it rain this hard before. "
] | random }}
"Make sure all doors and windows are closed, and I recommend staying inside until it calms down. Perhaps check for roof leaks as well. "
{% endif %}
{% else %}
{{ [
"I have looked outside and determined that it is raining. ",
"If you look outside the window, you will notice, it wainin. ",
"It wainin sideways! ",
"There appears to be excessive moisture currently falling from the sky. Plan accordingly. ",
] | random }}
{% endif %}
{% endif %} {% endif %}
{% if (state_attr('weather.iron_nerd_weather_station','visibility') | int ) < 3 %} {% if (state_attr('weather.iron_nerd_weather_station','visibility') | int ) < 3 %}
{{ [ {{ [

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: sensor.local_minimum_gas_price:
device_class: monetary device_class: monetary

View File

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

View File

@@ -324,6 +324,13 @@ input_number:
step: 1 step: 1
unit_of_measurement: °F unit_of_measurement: °F
icon: mdi:thermometer 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: emma_bedroom_daytime_temp:
name: Emma Bedroom Daytime Temp name: Emma Bedroom Daytime Temp
min: 65 min: 65
@@ -345,6 +352,20 @@ input_number:
step: 1 step: 1
unit_of_measurement: °F unit_of_measurement: °F
icon: mdi:thermometer icon: mdi:thermometer
emma_bedroom_heater_run_threshold:
name: Emma Bedroom Heater Run Threshold
min: 40
max: 80
step: 1
unit_of_measurement: °F
icon: mdi:thermometer
emma_bedroom_heater_shutoff_threshold:
name: Emma Bedroom Heater Shutoff Threshold
min: 40
max: 80
step: 1
unit_of_measurement: °F
icon: mdi:thermometer
emma_bedroom_aircon_run_threshold: emma_bedroom_aircon_run_threshold:
name: Emma Bedroom Aircon Run Threshold name: Emma Bedroom Aircon Run Threshold
min: 40 min: 40
@@ -373,6 +394,13 @@ input_number:
step: 1 step: 1
unit_of_measurement: °F unit_of_measurement: °F
icon: mdi:thermometer 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: kallen_fan_threshold:
name: Kallen Fan Threshold name: Kallen Fan Threshold
min: 40 min: 40

File diff suppressed because it is too large Load Diff

View File

@@ -48,8 +48,8 @@ input_datetime:
has_date: false has_date: false
has_time: true has_time: true
icon: mdi:fan-auto icon: mdi:fan-auto
emma_bedroom_cooling: emma_bedroom_climate:
name: Emma Bedroom Cooling name: Emma Bedroom Climate
has_date: false has_date: false
has_time: true has_time: true
icon: mdi:fan-auto icon: mdi:fan-auto
@@ -899,3 +899,6 @@ script:
- service: input_boolean.turn_off - service: input_boolean.turn_off
target: target:
entity_id: input_boolean.white_noise_emma_bedroom entity_id: input_boolean.white_noise_emma_bedroom
- service: climate.turn_off
target:
entity_id: climate.emma_bedroom_vtherm

View File

@@ -13,3 +13,10 @@ sensor:
state_characteristic: mean state_characteristic: mean
max_age: max_age:
hours: 24 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

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

View File

@@ -44,6 +44,9 @@ input_boolean:
adaptive_lighting_adjustments: adaptive_lighting_adjustments:
name: Adaptive Lighting Adjustments name: Adaptive Lighting Adjustments
icon: mdi:knob icon: mdi:knob
sunset_lights_triggered:
name: Sunset Lights Triggered
icon: mdi:weather-sunset
input_number: input_number:
upstairs_bathroom_motion_off_delay: upstairs_bathroom_motion_off_delay:
@@ -207,6 +210,21 @@ input_number:
step: 5 step: 5
unit_of_measurement: lx unit_of_measurement: lx
icon: mdi:sun-wireless icon: mdi:sun-wireless
front_porch_lux_threshold:
name: Front Porch Lux Threshold
min: 0
max: 2000
step: 5
mode: box
unit_of_measurement: lx
icon: mdi:sun-wireless
sunset_lights_outdoor_lux_threshold:
name: Sunset Lights Outdoor Lux Threshold
min: 0
max: 10000
step: 100
unit_of_measurement: lx
icon: mdi:sun-wireless
# Settings for adaptive adjustments # Settings for adaptive adjustments
daytime_colortemp_front_porch: daytime_colortemp_front_porch:

View File

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

View File

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

View File

@@ -602,25 +602,15 @@ script:
{% set low = states('sensor.overnight_lowest_temperature') | int %} {% set low = states('sensor.overnight_lowest_temperature') | int %}
{% set high = states('sensor.todays_high_temp') | int %} {% set high = states('sensor.todays_high_temp') | int %}
{% set kallen_bedtime = state_attr('input_datetime.kallen_bedtime','timestamp') | 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 #} {% 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') or bedroom_hot == true %}
{% if is_state('input_boolean.hot_day','on') %} {{ (kallen_fantime - 3600) | timestamp_custom('%H:%M',false) }}
{{ (kallen_bedtime - 3600) | timestamp_custom('%H:%M',false) }} {% elif low >= 56 or high >= 75 %}
{% elif low >= 56 or high >= 75 %} {{ (kallen_bedtime - 1800) | timestamp_custom('%H:%M',false) }}
{{ (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
{% else %} {% else %}
00:00 {{ kallen_bedtime | timestamp_custom('%H:%M',false) }}
{% endif %} {% endif %}
- service: input_datetime.set_datetime - service: input_datetime.set_datetime
entity_id: input_datetime.master_bedroom_fan entity_id: input_datetime.master_bedroom_fan
@@ -720,33 +710,51 @@ script:
data: data:
option: > option: >
{% set low = states('sensor.overnight_lowest_temperature') | int %} {% set low = states('sensor.overnight_lowest_temperature') | int %}
{% set run_threshold = states('input_number.emma_bedroom_aircon_run_threshold') | int %} {% set aircon_run_threshold = states('input_number.emma_bedroom_aircon_run_threshold') | int %}
{% set mode_threshold = states('input_number.emma_bedroom_aircon_mode_threshold') | int %} {% set aircon_mode_threshold = states('input_number.emma_bedroom_aircon_mode_threshold') | int %}
{% if is_state('input_boolean.emma_bedroom_aircon_installed','off') %} {% set heater_run_threshold = states('input_number.emma_bedroom_heater_run_threshold') | int %}
{% if is_state('input_boolean.emma_bedroom_aircon_installed','off') and is_state('input_boolean.emma_bedroom_heater_installed','off') %}
White Noise White Noise
{% elif low >= run_threshold %} {% elif low >= aircon_run_threshold and is_state('input_boolean.emma_bedroom_aircon_installed','on') %}
{% if low >= mode_threshold %} {% if low >= aircon_mode_threshold %}
AC AC
{% else %} {% else %}
Fan Fan
{% endif %} {% endif %}
{% elif low < heater_run_threshold and is_state('input_boolean.emma_bedroom_heater_installed','on') %}
Heat
{% else %} {% else %}
White Noise White Noise
{% endif %} {% endif %}
- delay:
milliseconds: 500
- service: input_datetime.set_datetime - service: input_datetime.set_datetime
target: target:
entity_id: input_datetime.emma_bedroom_cooling entity_id: input_datetime.emma_bedroom_climate
data: data:
time: > time: >
{% set high = states('sensor.todays_high_temp') | int %} {% set high = states('sensor.todays_high_temp') | int %}
{% set low = states('sensor.overnight_lowest_temperature') | int %} {% set low = states('sensor.overnight_lowest_temperature') | int %}
{% set bedtime = state_attr('input_datetime.emma_bedtime','timestamp') | int %} {% set bedtime = state_attr('input_datetime.emma_bedtime','timestamp') | int %}
{% if is_state('input_boolean.hot_day','on') %} {% set schedmode = states('input_select.scheduled_climate_mode_emma_bedroom') %}
{{ (bedtime - 5400) | timestamp_custom('%H:%M',false) }} {% if schedmode in ['AC','Fan'] and is_state('input_boolean.emma_bedroom_aircon_installed','on') %}
{% elif high >= 80 or low >= 60 %} {% if is_state('input_boolean.hot_day','on') %}
{{ (bedtime - 3600) | timestamp_custom('%H:%M',false) }} {{ (bedtime - 5400) | timestamp_custom('%H:%M',false) }}
{% elif high >= 80 or low >= 60 %}
{{ (bedtime - 3600) | timestamp_custom('%H:%M',false) }}
{% else %}
{{ (bedtime - 1800) | timestamp_custom('%H:%M',false) }}
{% endif %}
{% elif schedmode == 'Heat' and is_state('input_boolean.emma_bedroom_heater_installed','on') %}
{% if low <= 20 %}
{{ (bedtime - 5400) | timestamp_custom('%H:%M',false) }}
{% elif low <= 32 %}
{{ (bedtime - 3600) | timestamp_custom('%H:%M',false) }}
{% else %}
{{ (bedtime - 1800) | timestamp_custom('%H:%M',false) }}
{% endif %}
{% else %} {% else %}
{{ (bedtime - 1800) | timestamp_custom('%H:%M',false) }} {{ bedtime | timestamp_custom('%H:%M',false) }}
{% endif %} {% endif %}
- service: input_boolean.turn_on - service: input_boolean.turn_on
target: target:

View File

@@ -190,51 +190,51 @@ template:
{% set dow = now().strftime('%A') %} {% set dow = now().strftime('%A') %}
{% if week == 'First Menu' %} {% if week == 'First Menu' %}
{% if dow == 'Monday' %} {% 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' %} {% 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' %} {% elif dow == 'Wednesday' %}
Pulled pork, steamed broccoli, tomatoes, mixed fruit, and milk. Hot dog, french fries, celery, peaches, and milk.
{% elif dow == 'Thursday' %} {% 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' %} {% elif dow == 'Friday' %}
Optionally, Papa Johns Pizza. Otherwise, hamburger, spinach salad, oven potatoes, applesauce, and milk. Corndog, steamed broccoli, carrots, applesauce, and milk.
{% endif %} {% endif %}
{% elif week == 'Second Menu' %} {% elif week == 'Second Menu' %}
{% if dow == 'Monday' %} {% if dow == 'Monday' %}
Pizza, spinach salad, tomatoes, fruit, and milk. Popcorn chicken, mashed potatoes, corn, grapes, cornbread, and milk.
{% elif dow == 'Tuesday' %} {% 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' %} {% elif dow == 'Wednesday' %}
Chicken patty, oven potatoes, broccoli, pears, and milk. Bosco sticks, french fries, tomatoes, banana, and milk.
{% elif dow == 'Thursday' %} {% elif dow == 'Thursday' %}
Turkey and noodles, mashed potatoes, green beans, peaches, breadstick, and milk. Teriyaki beef and broccoli ramen, stir fry, egg roll, strawberry cup, and milk.
{% elif down == 'Friday' %} {% elif dow == 'Friday' %}
Optionally, Papa Johns Pizza. Otherwise, hot dog with chili sauce, carrots, baked beans, mixed fruit, and milk. Hamburger, fries, carrots, applesauce, and milk.
{% endif %} {% endif %}
{% elif week == 'Third Menu' %} {% elif week == 'Third Menu' %}
{% if dow == 'Monday' %} {% if dow == 'Monday' %}
Popcorn chicken, au gratin potatoes, corn, mixed fruit, corn bread, milk. Nachoes, carrots, apple, and milk.
{% elif dow == 'Tuesday' %} {% 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' %} {% elif dow == 'Wednesday' %}
Hamburger, oven potatoes, celery, applesauce, and milk. Pizza Crunchers, side salad, steamed broccoli, mixed fruit, and milk.
{% elif dow == 'Thursday' %} {% 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' %} {% 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 %} {% endif %}
{% elif week == 'Fourth Menu' %} {% elif week == 'Fourth Menu' %}
{% if dow == 'Monday' %} {% 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' %} {% 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' %} {% 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' %} {% 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' %} {% 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 %} {% endif %}
{% else %} {% else %}
No menu for the current day. No menu for the current day.

View File

@@ -106,7 +106,7 @@ template:
unique_id: 2987ae95-f55d-4994-b9dd-018278d2f5ad unique_id: 2987ae95-f55d-4994-b9dd-018278d2f5ad
state: > state: >
{% from 'sports.jinja' import sports_inhibit %} {% from 'sports.jinja' import sports_inhibit %}
{{ state_attr('sensor.minnesota_twins','opponent_abbr') in ['CLE','LAD'] or sports_inhibit('sensor.minnesota_twins') }} {{ sports_inhibit('sensor.minnesota_twins') }}
- name: Minnesota Twins Event Today - name: Minnesota Twins Event Today
unique_id: 30055cb3-d259-4cef-90e1-7dea0a5cb439 unique_id: 30055cb3-d259-4cef-90e1-7dea0a5cb439
state: > state: >
@@ -116,7 +116,7 @@ template:
unique_id: b0980d47-d762-4f23-97b1-9e88da729d8f unique_id: b0980d47-d762-4f23-97b1-9e88da729d8f
state: > state: >
{% from 'sports.jinja' import sports_inhibit %} {% from 'sports.jinja' import sports_inhibit %}
{{ sports_inhibit('sensor.cleveland_guardians') }} {{ state_attr('sensor.cleveland_guardians','opponent_abbr') in ['MIN','LAD'] or sports_inhibit('sensor.cleveland_guardians') }}
- name: Cleveland Guardians Event Today - name: Cleveland Guardians Event Today
unique_id: 985a7b2c-9ebd-4a2e-8ee2-2ab5359310e0 unique_id: 985a7b2c-9ebd-4a2e-8ee2-2ab5359310e0
state: > state: >
@@ -126,7 +126,7 @@ template:
unique_id: 2c6aae6e-eff6-46e5-bee9-311f9bbc0c0e unique_id: 2c6aae6e-eff6-46e5-bee9-311f9bbc0c0e
state: > state: >
{% from 'sports.jinja' import sports_inhibit %} {% from 'sports.jinja' import sports_inhibit %}
{{ state_attr('sensor.los_angeles_dodgers','opponent_abbr') in ['CLE'] or sports_inhibit('sensor.los_angeles_dodgers') }} {{ state_attr('sensor.los_angeles_dodgers','opponent_abbr') in ['MIN'] or sports_inhibit('sensor.los_angeles_dodgers') }}
- name: Los Angeles Dodgers Event Today - name: Los Angeles Dodgers Event Today
unique_id: 7c2bd060-ea2c-4b81-8af7-3e6b9b3c639d unique_id: 7c2bd060-ea2c-4b81-8af7-3e6b9b3c639d
state: > state: >
@@ -142,6 +142,36 @@ template:
state: > state: >
{% from 'sports.jinja' import sports_today %} {% from 'sports.jinja' import sports_today %}
{{ sports_today('sensor.minnesota_wild') }} {{ sports_today('sensor.minnesota_wild') }}
- name: Michigan Wolverines Hockey Inhibit
unique_id: 8ecd46d5-64c2-49f5-bc8d-d88593273d92
state: >
{% from 'sports.jinja' import sports_inhibit %}
{{ sports_inhibit('sensor.michigan_wolverines_hockey') }}
- name: Michigan Wolverines Hockey Event Today
unique_id: 551fdae5-e18c-4117-b3ba-df864068b13d
state: >
{% from 'sports.jinja' import sports_today %}
{{ sports_today('sensor.michigan_wolverines_hockey') }}
- name: Minnesota Golden Gophers Hockey Inhibit
unique_id: 87653f3a-203c-4dbf-87e8-70bcacf6eb22
state: >
{% from 'sports.jinja' import sports_inhibit %}
{{ sports_inhibit('sensor.minnesota_golden_gophers_hockey') }}
- name: Minnesota Golden Gophers Hockey Event Today
unique_id: 1f4ff7eb-cbc9-4c81-a5c9-6523b5fb52ff
state: >
{% from 'sports.jinja' import sports_today %}
{{ sports_today('sensor.minnesota_golden_gophers_hockey') }}
- name: Minnesota State Mavericks Hockey Inhibit
unique_id: bd15870d-bccb-4c52-9690-473c31bb4090
state: >
{% from 'sports.jinja' import sports_inhibit %}
{{ sports_inhibit('sensor.minnesota_state_mavericks_hockey') }}
- name: Minnesota State Mavericks Hockey Event Today
unique_id: e403be15-3ff2-47b1-8398-70f8ccb65026
state: >
{% from 'sports.jinja' import sports_today %}
{{ sports_today('sensor.minnesota_state_mavericks_hockey') }}
intent_script: intent_script:
SportsScore: SportsScore:

View File

@@ -1,3 +1,8 @@
input_boolean:
server_maintenance:
name: Server Maintenance
icon: mdi:wrench-clock
input_select: input_select:
log_level: log_level:
name: Log Level name: Log Level
@@ -97,22 +102,6 @@ template:
- name: Asus Laptop Idle - name: Asus Laptop Idle
unique_id: 7d8eb80a-0a2e-48a9-84b3-33175304dd95 unique_id: 7d8eb80a-0a2e-48a9-84b3-33175304dd95
state: "{{ states('sensor.asus_laptop_system_idle_time') | int > 1800 }}" 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 # - platform: influxdb
# host: 192.168.1.26 # host: 192.168.1.26

View File

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

View File

@@ -2,11 +2,9 @@ # Tony's Home Assistant Configs
Just a place to track my work on my personal Home Assistant configuration, and learn as I go. Maybe also TRY to keep myself a little bit more organized ;) Just a place to track my work on my personal Home Assistant configuration, and learn as I go. Maybe also TRY to keep myself a little bit more organized ;)
## New location for Node-RED flows ## Node-RED flows
I have recently started using the Node-RED Projects feature, which makes version control for my flows a LOT easier than it was before. My Node-RED flows can be found at [HA-NerdFlows](https://gitea.nerdhomeinc.com/home_automation/HA-NerdFlows). Additionally, code used in function nodes in my Node-RED flows can be found at [HA-NerdFlows-Functions](https://gitea.nerdhomeinc.com/home_automation/HA-NerdFlows-Functions).
With this change, the Node-RED flows are now in their own repo. They can be found at [HA-NerdFlows](https://github.com/tm24fan8/HA-NerdFlows).
## Attributions ## Attributions
@@ -34,7 +32,6 @@ ## HACS Components
- [Node-RED Companion](https://github.com/zachowj/hass-node-red) - [Node-RED Companion](https://github.com/zachowj/hass-node-red)
- [Holidays](https://github.com/bruxy70/Holidays) - [Holidays](https://github.com/bruxy70/Holidays)
- [Twitch Helix](https://github.com/Radioh/ha_twitch_helix) - [Twitch Helix](https://github.com/Radioh/ha_twitch_helix)
- [Local Tuya](https://github.com/rospogrigio/localtuya)
- [Pirate Weather](https://github.com/alexander0042/pirate-weather-ha) - [Pirate Weather](https://github.com/alexander0042/pirate-weather-ha)
- [Holidays](https://github.com/bruxy70/Holidays) - [Holidays](https://github.com/bruxy70/Holidays)
- [Thermal Comfort](https://github.com/dolezsa/thermal_comfort) - [Thermal Comfort](https://github.com/dolezsa/thermal_comfort)
@@ -42,7 +39,7 @@ ## HACS Components
- [HASS.Agent Media Player](https://github.com/LAB02-Research/HASS.Agent-MediaPlayer) - [HASS.Agent Media Player](https://github.com/LAB02-Research/HASS.Agent-MediaPlayer)
- [Music Assistant](https://github.com/music-assistant/hass-music-assistant) - [Music Assistant](https://github.com/music-assistant/hass-music-assistant)
- [Blitzortung Lightning Detector](https://github.com/mrk-its/homeassistant-blitzortung) - [Blitzortung Lightning Detector](https://github.com/mrk-its/homeassistant-blitzortung)
- [Midea Air Conditioning](https://github.com/mill1000/midea-ac-py) - [Midea Air Conditioning](https://github.com/wuwentao/midea_ac_lan)
- [WeatherAPI](https://github.com/iprak/weatherapi) - [WeatherAPI](https://github.com/iprak/weatherapi)
- [Browser Mod](https://github.com/thomasloven/hass-browser_mod) - [Browser Mod](https://github.com/thomasloven/hass-browser_mod)
- [Watchman](https://github.com/dummylabs/thewatchman) - [Watchman](https://github.com/dummylabs/thewatchman)
@@ -50,7 +47,6 @@ ## HACS Components
- [PyScript](https://github.com/custom-components/pyscript) - [PyScript](https://github.com/custom-components/pyscript)
- [Hass Animated Scenes](https://github.com/chazzu/hass-animated-scenes) - [Hass Animated Scenes](https://github.com/chazzu/hass-animated-scenes)
- [Jokes](https://github.com/LaggAt/ha-jokes) - [Jokes](https://github.com/LaggAt/ha-jokes)
- [Google Photos](https://github.com/Daanoz/ha-google-photos)
- [Uptime Kuma](https://github.com/meichthys/uptime_kuma) - [Uptime Kuma](https://github.com/meichthys/uptime_kuma)
- [Jellyfin](https://github.com/koying/jellyfin_ha) - [Jellyfin](https://github.com/koying/jellyfin_ha)
- [Sonoff LAN](https://github.com/AlexxIT/SonoffLAN) - [Sonoff LAN](https://github.com/AlexxIT/SonoffLAN)
@@ -58,6 +54,10 @@ ## HACS Components
- [Govee LAN Control](https://github.com/wez/govee-lan-hass) - [Govee LAN Control](https://github.com/wez/govee-lan-hass)
- [Discord Game](https://github.com/LordBoos/discord_game) - [Discord Game](https://github.com/LordBoos/discord_game)
- [Versatile Thermostat](https://github.com/jmcollin78/versatile_thermostat) - [Versatile Thermostat](https://github.com/jmcollin78/versatile_thermostat)
- [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> </details>
@@ -70,22 +70,19 @@ ## HACS Lovelace Cards
- [Bubble Card](https://github.com/Clooos/Bubble-Card) Backbone of the new mobile dashboard - [Bubble Card](https://github.com/Clooos/Bubble-Card) Backbone of the new mobile dashboard
- [Config Template Card](https://github.com/iantrich/config-template-card) - [Config Template Card](https://github.com/iantrich/config-template-card)
- [Decluttering Card](https://github.com/custom-cards/decluttering-card) - [Streamline Card](https://github.com/brunosabot/streamline-card)
- [Card Tools](https://github.com/thomasloven/lovelace-card-tools) (required for various other cards)
- [Layout Card](https://github.com/thomasloven/lovelace-layout-card) - [Layout Card](https://github.com/thomasloven/lovelace-layout-card)
- [Scheduler Card](https://github.com/nielsfaber/scheduler-card) (required for Scheduler component) - [Scheduler Card](https://github.com/nielsfaber/scheduler-card) (required for Scheduler component)
- [Horizon Card](https://github.com/rejuvenate/lovelace-horizon-card) - [Horizon Card](https://github.com/rejuvenate/lovelace-horizon-card)
- [Lovelace Home Feed Card](https://github.com/gadgetchnnel/lovelace-home-feed-card) - [Lovelace Home Feed Card](https://github.com/gadgetchnnel/lovelace-home-feed-card)
- [Mini Graph Card](https://github.com/kalkih/mini-graph-card) - [Mini Graph Card](https://github.com/kalkih/mini-graph-card)
- [Battery State Card](https://github.com/maxwroc/battery-state-card) - [Battery State Card](https://github.com/maxwroc/battery-state-card)
- [Compass Card](https://github.com/tomvanswam/compass-card)
- [Flipdown Timer Card](https://github.com/pmongloid/flipdown-timer-card) - [Flipdown Timer Card](https://github.com/pmongloid/flipdown-timer-card)
- [Atomic Calendar Revive](https://github.com/totaldebug/atomic-calendar-revive) - [Atomic Calendar Revive](https://github.com/totaldebug/atomic-calendar-revive)
- [Plotly Graph Card](https://github.com/dbuezas/lovelace-plotly-graph-card) - [Plotly Graph Card](https://github.com/dbuezas/lovelace-plotly-graph-card)
- [Mushroom](https://github.com/piitaya/lovelace-mushroom) - [Mushroom](https://github.com/piitaya/lovelace-mushroom)
- [Apexcharts Card](https://github.com/RomRider/apexcharts-card) - [Apexcharts Card](https://github.com/RomRider/apexcharts-card)
- [Auto Entities Card](https://github.com/thomasloven/lovelace-auto-entities) - [Auto Entities Card](https://github.com/thomasloven/lovelace-auto-entities)
- [Slider Button Card](https://github.com/custom-cards/slider-button-card)
- [Weather Radar Card](https://github.com/Makin-Things/weather-radar-card) - [Weather Radar Card](https://github.com/Makin-Things/weather-radar-card)
- [Stack In Card](https://github.com/custom-cards/stack-in-card) - [Stack In Card](https://github.com/custom-cards/stack-in-card)
- [Paper Buttons Row](https://github.com/jcwillox/lovelace-paper-buttons-row) - [Paper Buttons Row](https://github.com/jcwillox/lovelace-paper-buttons-row)
@@ -93,36 +90,30 @@ ## HACS Lovelace Cards
- [Multiple Entity Row](https://github.com/benct/lovelace-multiple-entity-row) - [Multiple Entity Row](https://github.com/benct/lovelace-multiple-entity-row)
- [Weather Card](https://github.com/bramkragten/weather-card) - [Weather Card](https://github.com/bramkragten/weather-card)
- [Template Entity Row](https://github.com/thomasloven/lovelace-template-entity-row) - [Template Entity Row](https://github.com/thomasloven/lovelace-template-entity-row)
- [Canvas Gauge Card](https://github.com/custom-cards/canvas-gauge-card)
- [Datetime Card](https://github.com/a-p-z/datetime-card)
- [Waze Travel Time](https://github.com/r-renato/ha-card-waze-travel-time) - [Waze Travel Time](https://github.com/r-renato/ha-card-waze-travel-time)
- [Fold Entity Row](https://github.com/thomasloven/lovelace-fold-entity-row) - [Fold Entity Row](https://github.com/thomasloven/lovelace-fold-entity-row)
- [Slider Entity Row](https://github.com/thomasloven/lovelace-slider-entity-row)
- [Room Card](https://github.com/marcokreeft87/room-card) - [Room Card](https://github.com/marcokreeft87/room-card)
- [Simple Thermostat Card](https://github.com/nervetattoo/simple-thermostat) - [Simple Thermostat Card](https://github.com/nervetattoo/simple-thermostat)
- [Clock Weather Card](https://github.com/pkissling/clock-weather-card) - [Clock Weather Card](https://github.com/pkissling/clock-weather-card)
- [Tabbed Card](https://github.com/kinghat/tabbed-card) - [Tabbed Card](https://github.com/kinghat/tabbed-card)
- [HA Team Tracker Card](https://github.com/vasqued2/ha-teamtracker-card) - [HA Team Tracker Card](https://github.com/vasqued2/ha-teamtracker-card)
- [Banner Card](https://github.com/nervetattoo/banner-card) - [Banner Card](https://github.com/nervetattoo/banner-card)
- [Lovelace Lock Card](https://github.com/CyrisXD/love-lock-card)
- [Card Templater](https://github.com/gadgetchnnel/lovelace-card-templater) - [Card Templater](https://github.com/gadgetchnnel/lovelace-card-templater)
- [Energy Overview Card](https://github.com/Sese-Schneider/ha-energy-overview-card)
- [Button Card](https://github.com/custom-cards/button-card) - [Button Card](https://github.com/custom-cards/button-card)
- [Number Box Card](https://github.com/htmltiger/numberbox-card) - [Number Box Card](https://github.com/htmltiger/numberbox-card)
- [Restriction Card](https://github.com/iantrich/restriction-card) - [Restriction Card](https://github.com/iantrich/restriction-card)
- [Timer Bar Card](https://github.com/rianadon/timer-bar-card) - [Timer Bar Card](https://github.com/rianadon/timer-bar-card)
- [Minimalistic Area Card](https://github.com/junalmeida/homeassistant-minimalistic-area-card)
- [Sankey Chart Card](https://github.com/MindFreeze/ha-sankey-chart) - [Sankey Chart Card](https://github.com/MindFreeze/ha-sankey-chart)
- [Hourly Weather Card](https://github.com/decompil3d/lovelace-hourly-weather) - [Hourly Weather Card](https://github.com/decompil3d/lovelace-hourly-weather)
- [Formula One Card](https://github.com/marcokreeft87/formulaone-card) - [Formula One Card](https://github.com/marcokreeft87/formulaone-card)
- [UV Index Card](https://github.com/t1gr0u/uv-index-card) - [UV Index Card](https://github.com/t1gr0u/uv-index-card)
- [Github Flexi Card](https://github.com/maxwroc/github-flexi-card)
- [Windrose Card](https://github.com/aukedejong/lovelace-windrose-card) - [Windrose Card](https://github.com/aukedejong/lovelace-windrose-card)
- [Swipe Card](https://github.com/bramkragten/swipe-card)
- [Meteoalarm Card](https://github.com/MrBartusek/MeteoalarmCard) - [Meteoalarm Card](https://github.com/MrBartusek/MeteoalarmCard)
- [Weather Chart Card](https://github.com/mlamberts78/weather-chart-card) - [Weather Chart Card](https://github.com/mlamberts78/weather-chart-card)
- [Comfortable Environment Card](https://github.com/argaar/comfortable-environment-card) - [Comfortable Environment Card](https://github.com/argaar/comfortable-environment-card)
- [Versatile Thermostat UI Card](https://github.com/jmcollin78/versatile-thermostat-ui-card) - [Versatile Thermostat UI Card](https://github.com/jmcollin78/versatile-thermostat-ui-card)
- [Gauge Card Pro](https://github.com/benjamin-dcs/gauge-card-pro)
- [AdGuard Card](https://github.com/homeassistant-extras/adguard-card)
</details> </details>
@@ -135,6 +126,16 @@ ## AppDaemon Apps
</details> </details>
## Custom Jinja2 Templates/Macros
<details>
<summary>Click here</summary>
- [Easy Time](https://github.com/Petro31/easy-time-jinja)
- [Relative Time](https://github.com/TheFes/relative-time-plus)
</details>
## Themes/Icons ## Themes/Icons
<details> <details>
@@ -146,5 +147,6 @@ ## Themes/Icons
- [BHA Icon Pack](https://github.com/hulkhaugen/hass-bha-icons) - [BHA Icon Pack](https://github.com/hulkhaugen/hass-bha-icons)
- [Custom Icons Library](https://github.com/Mariusthvdb/custom-icons) - [Custom Icons Library](https://github.com/Mariusthvdb/custom-icons)
- [FontAwesome](https://github.com/thomasloven/hass-fontawesome) - [FontAwesome](https://github.com/thomasloven/hass-fontawesome)
- [Material Symbols](https://github.com/beecho01/material-symbols)
</details> </details>

View File

@@ -854,6 +854,12 @@ adaptive_on_first_floor:
adaptive_on_second_floor: adaptive_on_second_floor:
alias: Adaptive on Second Floor alias: Adaptive on Second Floor
sequence: sequence:
- action: switch.turn_on
metadata: {}
data: {}
target:
entity_id: switch.adaptive_lighting_stairwell
alias: Turn on adaptive lighting in stairwell
- if: - if:
- condition: state - condition: state
entity_id: light.hallway_overhead entity_id: light.hallway_overhead
@@ -1298,13 +1304,28 @@ evening_on_second_floor:
option: "{% if is_state('binary_sensor.upstairs_bathroom_occupied','on') option: "{% if is_state('binary_sensor.upstairs_bathroom_occupied','on')
%}\n Adaptive\n{% else %}\n Single Nightlight\n{% endif %}\n" %}\n Adaptive\n{% else %}\n Single Nightlight\n{% endif %}\n"
action: input_select.select_option action: input_select.select_option
- target: - if:
area_id: - condition: state
- kallen_bedroom entity_id: input_boolean.emma_sleeping
- emma_bedroom state: 'off'
data: {} then:
alias: Turn off kids' bedroom lights - action: light.turn_off
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 - alias: Turn off Master Bedroom Lights
if: if:
- condition: state - condition: state
@@ -1441,16 +1462,42 @@ evening_on_second_floor:
goodnight_in_basement: goodnight_in_basement:
alias: Goodnight in Basement alias: Goodnight in Basement
sequence: sequence:
- service: light.turn_off - target:
target:
area_id: area_id:
- basement_studio - basement_studio
- furnace_room - furnace_room
data: {} data: {}
- service: fan.turn_off action: light.turn_off
target: alias: Turn lights off
- target:
entity_id: fan.basement_fan entity_id: fan.basement_fan
data: {} data: {}
action: fan.turn_off
alias: Turn fan off
- delay:
hours: 0
minutes: 0
seconds: 3
milliseconds: 0
- action: switch.turn_off
metadata: {}
data: {}
target:
entity_id: switch.adaptive_lighting_sleep_mode_basement_studio
alias: Turn off sleep mode
- action: switch.turn_on
metadata: {}
data: {}
target:
entity_id: switch.adaptive_lighting_basement_studio
alias: Turn on adaptive lighting
- action: input_text.set_value
metadata: {}
data:
value: Adaptive
target:
entity_id: input_text.basement_studio_selected_scene
alias: Reset selected scene text
goodnight_on_first_floor: goodnight_on_first_floor:
alias: Goodnight on First Floor alias: Goodnight on First Floor
sequence: sequence:
@@ -1459,32 +1506,32 @@ goodnight_on_first_floor:
entity_id: input_boolean.guest_mode entity_id: input_boolean.guest_mode
state: 'on' state: 'on'
then: then:
- service: light.turn_off - target:
target:
area_id: area_id:
- downstairs_bathroom - downstairs_bathroom
- tina_desk - tina_desk
entity_id: light.living_room_lights entity_id: light.living_room_lights
data: {} data: {}
- service: input_select.select_option action: light.turn_off
target: - target:
entity_id: input_select.mud_room_scenes entity_id: input_select.mud_room_scenes
data: data:
option: Nightlight option: Nightlight
action: input_select.select_option
else: else:
- service: light.turn_off - target:
target:
area_id: area_id:
- downstairs_bathroom - downstairs_bathroom
- mud_room - mud_room
- tina_desk - tina_desk
entity_id: light.living_room_lights entity_id: light.living_room_lights
data: {} data: {}
action: light.turn_off
alias: Determine lights based on guest mode
goodnight_on_second_floor: goodnight_on_second_floor:
alias: Goodnight on Second Floor alias: Goodnight on Second Floor
sequence: sequence:
- service: light.turn_off - target:
target:
area_id: area_id:
- emma_bedroom - emma_bedroom
- kallen_bedroom - kallen_bedroom
@@ -1492,21 +1539,24 @@ goodnight_on_second_floor:
- master_bedroom_closet - master_bedroom_closet
- upstairs_hallway - upstairs_hallway
data: {} data: {}
- if: action: light.turn_off
- alias: If Kallen is gone overnight, turn off upstairs bathroom lights
if:
- condition: state - condition: state
entity_id: input_boolean.kallen_overnight entity_id: input_boolean.kallen_overnight
state: 'on' state: 'on'
then: then:
- service: light.turn_off - target:
target:
area_id: upstairs_bathroom area_id: upstairs_bathroom
data: {} data: {}
action: light.turn_off
else: else:
- service: input_select.select_option - target:
target:
entity_id: input_select.upstairs_bathroom_scenes entity_id: input_select.upstairs_bathroom_scenes
data: data:
option: Single Nightlight option: Single Nightlight
action: input_select.select_option
alias: Set upstairs bathroom lights to single nightlight
morning_scene: morning_scene:
alias: Morning Scene alias: Morning Scene
sequence: sequence:
@@ -1668,6 +1718,9 @@ tony_morning_meds:
tag: tony-morning-meds tag: tony-morning-meds
alias: Clear previous morning notification alias: Clear previous morning notification
action: script.text_notify action: script.text_notify
- variables:
remindCount: '{{ states(''counter.tony_morning_meds_reminder_count'') }}'
alias: Set variable for reminder count
- alias: Send notifications, using AI if internet is connected - alias: Send notifications, using AI if internet is connected
if: if:
- condition: state - condition: state
@@ -1680,20 +1733,38 @@ tony_morning_meds:
entity_id: counter.tony_morning_meds_reminder_count entity_id: counter.tony_morning_meds_reminder_count
above: 2 above: 2
then: then:
- action: google_generative_ai_conversation.generate_content - alias: Generate snarky reminder
action: ai_task.generate_data
metadata: {} metadata: {}
data: 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
Be snarky, because at this point he's been reminded multiple times. 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 response_variable: response
alias: Generate snarky reminder
else: else:
- action: google_generative_ai_conversation.generate_content - alias: Generate reminder
action: ai_task.generate_data
metadata: {} metadata: {}
data: 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 response_variable: response
alias: Generate reminder
- delay: - delay:
hours: 0 hours: 0
minutes: 0 minutes: 0
@@ -1706,7 +1777,7 @@ tony_morning_meds:
who: tony who: tony
type: alert type: alert
title: Morning Meds title: Morning Meds
message: '{{ response.text }}' message: '{{ response.data.notification_text }}'
tag: tony-morning-meds tag: tony-morning-meds
actions: actions:
- action: TONY_MORNING_MEDS_TAKEN - action: TONY_MORNING_MEDS_TAKEN
@@ -1728,11 +1799,11 @@ tony_morning_meds:
state: home state: home
alias: If Tony is home alias: If Tony is home
then: then:
- data: - alias: Send TTS notification
data:
who: common_areas who: common_areas
type: alert type: alert
message: '{{ response.text }}' message: '{{ response.data.notification_text }}'
alias: Send TTS notification
action: script.speech_engine action: script.speech_engine
else: else:
- delay: - delay:
@@ -1975,6 +2046,9 @@ tony_afternoon_meds:
tag: tony-afternoon-meds tag: tony-afternoon-meds
alias: Clear previous afternoon notification alias: Clear previous afternoon notification
action: script.text_notify action: script.text_notify
- variables:
remindCount: '{{ states(''counter.tony_afternoon_meds_reminder_count'') }}'
alias: Set variable for reminder count
- alias: Send notifications, using AI if internet is connected - alias: Send notifications, using AI if internet is connected
if: if:
- condition: state - condition: state
@@ -1987,20 +2061,38 @@ tony_afternoon_meds:
entity_id: counter.tony_afternoon_meds_reminder_count entity_id: counter.tony_afternoon_meds_reminder_count
above: 2 above: 2
then: then:
- action: google_generative_ai_conversation.generate_content - alias: Generate snarky reminder
action: ai_task.generate_data
metadata: {} metadata: {}
data: 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
Be snarky, because at this point he's been reminded multiple times. 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 response_variable: response
alias: Generate snarky reminder
else: else:
- action: google_generative_ai_conversation.generate_content - alias: Generate reminder
action: ai_task.generate_data
metadata: {} metadata: {}
data: 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 response_variable: response
alias: Generate reminder
- delay: - delay:
hours: 0 hours: 0
minutes: 0 minutes: 0
@@ -2013,7 +2105,7 @@ tony_afternoon_meds:
who: tony who: tony
type: alert type: alert
title: Afternoon Meds title: Afternoon Meds
message: '{{ response.text }}' message: '{{ response.data.notification_text }}'
tag: tony-afternoon-meds tag: tony-afternoon-meds
actions: actions:
- action: TONY_AFTERNOON_MEDS_TAKEN - action: TONY_AFTERNOON_MEDS_TAKEN
@@ -2035,11 +2127,11 @@ tony_afternoon_meds:
state: home state: home
alias: If Tony is home alias: If Tony is home
then: then:
- data: - alias: Send TTS notification
data:
who: common_areas who: common_areas
type: alert type: alert
message: '{{ response.text }}' message: '{{ response.data.notification_text }}'
alias: Send TTS notification
action: script.speech_engine action: script.speech_engine
else: else:
- delay: - delay:
@@ -2499,27 +2591,28 @@ kallen_night_meds:
minutes: 0 minutes: 0
seconds: 5 seconds: 5
milliseconds: 0 milliseconds: 0
- parallel: - alias: Send text notifications
- data: parallel:
- alias: Send to parents
data:
who: "{% if states('person.christina_stork') in ['Bob Evans','BobEvans'] %}\n who: "{% if states('person.christina_stork') in ['Bob Evans','BobEvans'] %}\n
\ tony\n{% else %}\n parents\n{% endif %}\n" \ tony\n{% else %}\n parents\n{% endif %}\n"
type: alert type: alert
title: Night Meds title: Night Meds
message: Kallen needs to take his night meds (melatonin) message: Kallen needs to take his night meds
tag: kallen-night-meds tag: kallen-night-meds
actions: actions:
- action: KALLEN_NIGHT_MEDS_TAKEN - action: KALLEN_NIGHT_MEDS_TAKEN
title: Taken title: Taken
- action: KALLEN_NIGHT_MEDS_SKIPPED - action: KALLEN_NIGHT_MEDS_SKIPPED
title: Skip title: Skip
alias: Send to parents
action: script.text_notify action: script.text_notify
- alias: Send to Kallen - alias: Send to Kallen
data: data:
who: kallen who: kallen
type: alert type: alert
title: Night Meds title: Night Meds
message: You need to take your night meds (melatonin) message: You need to take your night meds
tag: kallen-night-meds tag: kallen-night-meds
actions: actions:
- action: KALLEN_NIGHT_MEDS_TAKEN - action: KALLEN_NIGHT_MEDS_TAKEN
@@ -2527,7 +2620,6 @@ kallen_night_meds:
- action: KALLEN_NIGHT_MEDS_SKIPPED - action: KALLEN_NIGHT_MEDS_SKIPPED
title: Skip title: Skip
action: script.text_notify action: script.text_notify
alias: Send text notifications
icon: mdi:medication icon: mdi:medication
mode: restart mode: restart
reset_annc_switches: reset_annc_switches:
@@ -2948,14 +3040,14 @@ rabbit_hutch_cleaning:
emma_sleep: emma_sleep:
alias: Emma Sleep alias: Emma Sleep
sequence: sequence:
- if: - alias: Run scheduling if it hasn't already been run
if:
- condition: time - condition: time
after: 04:00:00 after: 09:00:00
before: '17:00:00' before: '17:00:00'
then: then:
- data: {} - data: {}
action: script.emma_bedroom_scheduling_evening action: script.emma_bedroom_scheduling_evening
alias: Run scheduling if it hasn't already been run
- target: - target:
entity_id: entity_id:
- script.emma_ibuprofen - script.emma_ibuprofen
@@ -2979,33 +3071,74 @@ emma_sleep:
option: Adaptive option: Adaptive
alias: Set lights to adaptive alias: Set lights to adaptive
action: input_select.select_option action: input_select.select_option
- if: - alias: Set climate mode if not already set
- alias: White Noise choose:
condition: and - conditions:
conditions: - alias: White Noise
- condition: state condition: and
entity_id: input_select.scheduled_climate_mode_emma_bedroom conditions:
state: White Noise - condition: state
alias: Scheduled mode is White Noise entity_id: input_select.scheduled_climate_mode_emma_bedroom
- condition: state state: White Noise
entity_id: input_boolean.white_noise_emma_bedroom alias: Scheduled mode is White Noise
state: 'off' - condition: state
alias: White Noise is not already on entity_id: input_boolean.white_noise_emma_bedroom
then: state: 'off'
- target: alias: White Noise is not already on
entity_id: input_boolean.white_noise_emma_bedroom sequence:
data: {} - target:
alias: Turn on white noise entity_id: input_boolean.white_noise_emma_bedroom
action: input_boolean.turn_on data: {}
- data: alias: Turn on white noise
who: parents action: input_boolean.turn_on
title: Emma Climate Schedule - data:
message: White noise has been activated in Emma's Bedroom. who: parents
type: normal title: Emma Climate Schedule
tag: emma-climate message: White noise has been activated in Emma's Bedroom.
alias: Send white noise notification type: normal
action: script.text_notify tag: emma-climate
alias: Select climate mode alias: Send white noise notification
action: script.text_notify
- conditions:
- alias: Heat
condition: and
conditions:
- condition: state
entity_id: input_select.scheduled_climate_mode_emma_bedroom
state:
- Heat
alias: Heat
sequence:
- if:
- alias: Heat is not already on
condition: state
entity_id: climate.emma_bedroom_vtherm
state:
- 'off'
then:
- alias: Send heater notification
data:
who: parents
title: Emma Climate Schedule
message: The space heater has been activated in Emma's Bedroom.
type: normal
tag: emma-climate
action: script.text_notify
alias: If heat was not already on, send notification that it has been turned
on
- action: climate.set_hvac_mode
metadata: {}
target:
entity_id: climate.emma_bedroom_vtherm
data:
hvac_mode: heat
alias: Turn on heater
- action: input_boolean.turn_on
metadata: {}
target:
entity_id: input_boolean.white_noise_emma_bedroom
data: {}
alias: Turn on white noise
icon: mdi:lightbulb-night icon: mdi:lightbulb-night
mode: restart mode: restart
tina_morning_meds: tina_morning_meds:
@@ -3026,32 +3159,53 @@ tina_morning_meds:
tag: tina-morning-meds tag: tina-morning-meds
alias: Clear previous morning notification alias: Clear previous morning notification
action: script.text_notify 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 - alias: Send notifications, using AI if internet is connected
if: if:
- condition: state - condition: state
entity_id: binary_sensor.internet entity_id: binary_sensor.internet
state: 'on' state: 'on'
then: then:
- if: - alias: Generate reminder, be snarky if it's been several times
if:
- condition: numeric_state - condition: numeric_state
entity_id: counter.tina_morning_meds_reminder_count entity_id: counter.tina_morning_meds_reminder_count
above: 2 above: 2
then: then:
- action: google_generative_ai_conversation.generate_content - alias: Generate snarky reminder
action: ai_task.generate_data
metadata: {} metadata: {}
data: 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
Be snarky, because at this point she's been reminded multiple times. 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 response_variable: response
alias: Generate snarky reminder
else: else:
- action: google_generative_ai_conversation.generate_content - alias: Generate reminder
action: ai_task.generate_data
metadata: {} metadata: {}
data: 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 response_variable: response
alias: Generate reminder
alias: Generate reminder, be snarky if it's been several times
- delay: - delay:
hours: 0 hours: 0
minutes: 0 minutes: 0
@@ -3062,7 +3216,7 @@ tina_morning_meds:
who: tina who: tina
type: alert type: alert
title: Morning Meds title: Morning Meds
message: '{{ response.text }}' message: '{{ response.data.notification_text }}'
tag: tina-morning-meds tag: tina-morning-meds
actions: actions:
- action: TINA_MORNING_MEDS_TAKEN - action: TINA_MORNING_MEDS_TAKEN
@@ -3107,32 +3261,52 @@ tina_night_meds:
tag: tina-night-meds tag: tina-night-meds
alias: Clear previous night notification alias: Clear previous night notification
action: script.text_notify 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 - alias: Send notifications, using AI if internet is connected
if: if:
- condition: state - condition: state
entity_id: binary_sensor.internet entity_id: binary_sensor.internet
state: 'on' state: 'on'
then: then:
- if: - alias: Generate reminder, be snarky if it's been several times
if:
- condition: numeric_state - condition: numeric_state
entity_id: counter.tina_night_meds_reminder_count entity_id: counter.tina_night_meds_reminder_count
above: 2 above: 2
then: then:
- action: google_generative_ai_conversation.generate_content - alias: Generate snarky reminder
action: ai_task.generate_data
metadata: {} metadata: {}
data: 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.
Be snarky, because at this point she's been reminded multiple times. 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 response_variable: response
alias: Generate snarky reminder
else: else:
- action: google_generative_ai_conversation.generate_content - alias: Generate reminder
action: ai_task.generate_data
metadata: {} metadata: {}
data: 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 response_variable: response
alias: Generate reminder
alias: Generate reminder, be snarky if it's been several times
- delay: - delay:
hours: 0 hours: 0
minutes: 0 minutes: 0
@@ -3143,7 +3317,7 @@ tina_night_meds:
who: tina who: tina
type: alert type: alert
title: Night Meds title: Night Meds
message: '{{ response.text }}' message: '{{ response.data.notification_text }}'
tag: tina-night-meds tag: tina-night-meds
actions: actions:
- action: TINA_NIGHT_MEDS_TAKEN - action: TINA_NIGHT_MEDS_TAKEN

View File

@@ -464,3 +464,51 @@
map(attribute='attributes.friendly_name') | map(attribute='attributes.friendly_name') |
list %} list %}
{{ uptimekuma | join(', ') }} {{ 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(', ') }}

View File

@@ -73,11 +73,11 @@
{% endif %} {% endif %}
{% if states('input_select.scheduled_climate_mode_emma_bedroom_aircon') != 'N/A' %} {% if states('input_select.scheduled_climate_mode_emma_bedroom_aircon') != 'N/A' %}
{% if is_state('input_select.scheduled_climate_mode_emma_bedroom_aircon','AC') and is_state('input_boolean.hot_day','on') %} {% if is_state('input_select.scheduled_climate_mode_emma_bedroom_aircon','AC') and is_state('input_boolean.hot_day','on') %}
"Today was a hot day, so Emma's bedroom air conditioner will start cooling a bit earlier tonight at {{ input_datetime_read('input_datetime.emma_bedroom_cooling') }}. " "Today was a hot day, so Emma's bedroom air conditioner will start cooling a bit earlier tonight at {{ input_datetime_read('input_datetime.emma_bedroom_climate') }}. "
{% elif is_state('input_select.scheduled_climate_mode_emma_bedroom_aircon','AC') %} {% elif is_state('input_select.scheduled_climate_mode_emma_bedroom_aircon','AC') %}
"Emma's bedroom air conditioner will start cooling at {{ input_datetime_read('input_datetime.emma_bedroom_cooling') }}. " "Emma's bedroom air conditioner will start cooling at {{ input_datetime_read('input_datetime.emma_bedroom_climate') }}. "
{% elif is_state('input_select.scheduled_climate_mode_emma_bedroom_aircon','Fan') %} {% elif is_state('input_select.scheduled_climate_mode_emma_bedroom_aircon','Fan') %}
"Emma's bedroom air conditioner will activate fan only mode at {{ input_datetime_read('input_datetime.emma_bedroom_cooling') }}. " "Emma's bedroom air conditioner will activate fan only mode at {{ input_datetime_read('input_datetime.emma_bedroom_climate') }}. "
{% elif is_state('input_select.scheduled_climate_mode_emma_bedroom','White Noise') and is_state('input_boolean.white_noise_emma_bedroom','off') %} {% elif is_state('input_select.scheduled_climate_mode_emma_bedroom','White Noise') and is_state('input_boolean.white_noise_emma_bedroom','off') %}
"Emma's white noise generator will activate at {{ input_datetime_read('input_datetime.emma_bedtime') }}. " "Emma's white noise generator will activate at {{ input_datetime_read('input_datetime.emma_bedtime') }}. "
{% endif %} {% endif %}