Compare commits
105 Commits
2025.5.0
...
sports-not
| Author | SHA1 | Date | |
|---|---|---|---|
|
28e3b93441
|
|||
|
bdca4c702a
|
|||
|
4b57efcd74
|
|||
|
7255422ca1
|
|||
|
5ae5e5021e
|
|||
|
bd9c7190ed
|
|||
|
f176e3b867
|
|||
|
1b52cc31a8
|
|||
|
8993196366
|
|||
|
210434e4ad
|
|||
|
e37ac9d504
|
|||
|
bf19984b47
|
|||
|
4634b66866
|
|||
|
001dcbe625
|
|||
|
f70be6ceee
|
|||
|
265e129c06
|
|||
|
00bea40b6b
|
|||
|
f94bce3381
|
|||
|
2de7d82e20
|
|||
|
83c3c10a5a
|
|||
|
f7ac1b915b
|
|||
|
1d3398752e
|
|||
|
837ed779c9
|
|||
|
bc3a58875d
|
|||
|
3c018a922b
|
|||
|
10188d553a
|
|||
|
341200deb0
|
|||
|
b930cb28b5
|
|||
|
c31158448c
|
|||
|
9e9c1fcf11
|
|||
|
02e3252e62
|
|||
|
32907081c6
|
|||
|
67931ccfcd
|
|||
|
c5d1b14ac9
|
|||
|
3ed56ff745
|
|||
|
eb9cc4c42d
|
|||
|
df020c92c1
|
|||
|
b97838a13f
|
|||
|
9678ccd2a3
|
|||
|
13ef9c58f8
|
|||
|
1ea19c317c
|
|||
|
a89963f9f0
|
|||
|
993a65529b
|
|||
|
a11bb624db
|
|||
|
131ffcd05f
|
|||
|
4ac9247852
|
|||
|
52d651fcaa
|
|||
|
96244550de
|
|||
|
5f2b840899
|
|||
|
f08d1452f2
|
|||
|
034419f954
|
|||
|
f5953d23e6
|
|||
|
473526390e
|
|||
|
a5a9d081d2
|
|||
|
0f25ce6f6a
|
|||
|
eced9a763e
|
|||
|
5331c0d08a
|
|||
|
c9e4a11604
|
|||
|
d55ad66264
|
|||
|
d56d899588
|
|||
|
6afb3b7cb7
|
|||
|
e2ea214832
|
|||
|
b1543676d5
|
|||
|
bc45d6b7fd
|
|||
|
1a706153a8
|
|||
|
95b2c8cfc5
|
|||
|
61b04c05c6
|
|||
|
41141e94df
|
|||
|
cc9ec0b211
|
|||
|
adf881a106
|
|||
|
6ee298a3d2
|
|||
|
aa6358ce19
|
|||
|
abe62888b2
|
|||
|
0cabab0462
|
|||
|
034cf2f972
|
|||
|
1d246e8018
|
|||
|
5cffb7208f
|
|||
|
a7b1a53754
|
|||
|
de5efd39b4
|
|||
|
0129a56866
|
|||
|
b305f7c880
|
|||
|
6ee4bacf55
|
|||
|
4710700f7e
|
|||
|
895e99657b
|
|||
|
0dc7d0f8e4
|
|||
|
d38cf59812
|
|||
|
a489ecdf14
|
|||
|
8698a46d4f
|
|||
|
7d5aa32834
|
|||
|
37458be1b8
|
|||
|
72421b8716
|
|||
|
8be8f4bb58
|
|||
|
6e619fa647
|
|||
|
9dca18048c
|
|||
|
52bfb8bd49
|
|||
|
43feaa9b06
|
|||
|
0847e7fd10
|
|||
|
425b1fb0cf
|
|||
|
f589cc0e6c
|
|||
|
49a4f4650b
|
|||
|
3a2fc504f3
|
|||
|
f1180cc34b
|
|||
|
b936838376
|
|||
|
2d755be935
|
|||
|
ed0431ae56
|
@@ -1 +1 @@
|
|||||||
2025.5.0
|
2025.12.3
|
||||||
3
.gitignore
vendored
3
.gitignore
vendored
@@ -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/
|
||||||
384
automations.yaml
384
automations.yaml
@@ -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
|
||||||
@@ -3015,18 +3015,21 @@
|
|||||||
- 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 +3040,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 +3084,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 +4646,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 +4695,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 +4706,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 +4721,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 +4743,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 +4765,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 +4793,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 +5589,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 +5650,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 +5670,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 +5751,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 +5758,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 +6196,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
@@ -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
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
42
bubble/Main Button Floors/code.js
Normal file
42
bubble/Main Button Floors/code.js
Normal 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 '';
|
||||||
|
})()}`
|
||||||
22
bubble/Main Button Floors/editor.yaml
Normal file
22
bubble/Main Button Floors/editor.yaml
Normal 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
|
||||||
73
bubble/Main Button Floors/import.yaml
Normal file
73
bubble/Main Button Floors/import.yaml
Normal 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
|
||||||
24
bubble/Main Button Outdoors/code.js
Normal file
24
bubble/Main Button Outdoors/code.js
Normal 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 '';
|
||||||
|
})()}`
|
||||||
10
bubble/Main Button Outdoors/editor.yaml
Normal file
10
bubble/Main Button Outdoors/editor.yaml
Normal 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
|
||||||
43
bubble/Main Button Outdoors/import.yaml
Normal file
43
bubble/Main Button Outdoors/import.yaml
Normal 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
|
||||||
24
bubble/Popup Accent Color Button/code.js
Normal file
24
bubble/Popup Accent Color Button/code.js
Normal 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 '';
|
||||||
|
})()}`
|
||||||
33
bubble/Popup Accent Color Button/import.yaml
Normal file
33
bubble/Popup Accent Color Button/import.yaml
Normal 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: ''
|
||||||
24
bubble/Popup Security Button/code.js
Normal file
24
bubble/Popup Security Button/code.js
Normal 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 '';
|
||||||
|
})()}`
|
||||||
33
bubble/Popup Security Button/import.yaml
Normal file
33
bubble/Popup Security Button/import.yaml
Normal 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: ''
|
||||||
32
bubble/Popup Temperature Button/code.js
Normal file
32
bubble/Popup Temperature Button/code.js
Normal 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 '';
|
||||||
|
})()}`
|
||||||
14
bubble/Popup Temperature Button/editor.yaml
Normal file
14
bubble/Popup Temperature Button/editor.yaml
Normal 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
|
||||||
55
bubble/Popup Temperature Button/import.yaml
Normal file
55
bubble/Popup Temperature Button/import.yaml
Normal 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
|
||||||
92
bubble/Popup Timer Card/code.js
Normal file
92
bubble/Popup Timer Card/code.js
Normal 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");
|
||||||
|
}
|
||||||
|
})()}
|
||||||
101
bubble/Popup Timer Card/import.yaml
Normal file
101
bubble/Popup Timer Card/import.yaml
Normal 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: ''
|
||||||
21
bubble/Rotating Icon/import.yaml
Normal file
21
bubble/Rotating Icon/import.yaml
Normal 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: ''
|
||||||
41
bubble/State Color Button/code.js
Normal file
41
bubble/State Color Button/code.js
Normal 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 '';
|
||||||
|
})()}`
|
||||||
10
bubble/State Color Button/editor.yaml
Normal file
10
bubble/State Color Button/editor.yaml
Normal 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
|
||||||
68
bubble/State Color Button/import.yaml
Normal file
68
bubble/State Color Button/import.yaml
Normal 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
|
||||||
@@ -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
|
||||||
|
|||||||
@@ -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 %}
|
||||||
|
|||||||
@@ -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 #}
|
||||||
|
|||||||
@@ -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()) }}
|
||||||
|
|||||||
@@ -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 %}
|
||||||
{{ [
|
{{ [
|
||||||
|
|||||||
@@ -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
|
||||||
|
|
||||||
|
|||||||
@@ -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') }}"
|
||||||
|
|||||||
@@ -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
@@ -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
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
@@ -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:
|
|
||||||
@@ -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:
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
@@ -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:
|
||||||
|
|||||||
@@ -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.
|
||||||
|
|||||||
@@ -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:
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
40
readme.md
40
readme.md
@@ -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>
|
||||||
|
|||||||
378
scripts.yaml
378
scripts.yaml
@@ -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
|
||||||
|
|||||||
@@ -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(', ') }}
|
||||||
@@ -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 %}
|
||||||
|
|||||||
Reference in New Issue
Block a user