Compare commits
58 Commits
Author | SHA1 | Date | |
---|---|---|---|
364c81e8b1
|
|||
0d42142a07
|
|||
7d6d72c6ef
|
|||
41228c1304
|
|||
b4f4d06d6c
|
|||
002919483f
|
|||
ef548c2df1
|
|||
1d60a4df32
|
|||
57c27d4e48
|
|||
c06bd894ae
|
|||
1b3cf79f25
|
|||
7cf9c13e38
|
|||
e8c6cd8deb
|
|||
df92fc4df6
|
|||
a936b22bb9
|
|||
9aa918d335
|
|||
c7d6297934
|
|||
ce29e80330
|
|||
10deee4f04
|
|||
6fa762a113
|
|||
7b529895e5
|
|||
bdb278dd28
|
|||
000efa7562
|
|||
b6911a0f59
|
|||
d49563435d
|
|||
1a89d088f6
|
|||
ee6499bec8
|
|||
148f78aecd
|
|||
49f9e99439
|
|||
6254fb5953
|
|||
334b7963e8
|
|||
4466b17df1
|
|||
f96056edda
|
|||
652b4e7dff
|
|||
26bcf136e6
|
|||
9e90998a21
|
|||
30c8307272
|
|||
e6b0db142e
|
|||
b5dd9621d1
|
|||
587ac4d203
|
|||
b459d78446
|
|||
352e4f1ada
|
|||
09d82abdb1
|
|||
8b120ae347
|
|||
da03ea826b
|
|||
66fc0fb906
|
|||
4c81a8a6a5
|
|||
35a511710e
|
|||
4c7bf9a85c
|
|||
754e3d6095
|
|||
8f707c71bb
|
|||
08b5c7b764
|
|||
fd37fe589c
|
|||
36906d6207
|
|||
29dcb654b4
|
|||
ec0aed386a
|
|||
a96bc99271
|
|||
a085e71c86
|
1
.HA_VERSION
Normal file
1
.HA_VERSION
Normal file
@ -0,0 +1 @@
|
||||
2025.4.2
|
20
.gitignore
vendored
20
.gitignore
vendored
@ -3,23 +3,20 @@
|
||||
/.cloud
|
||||
/.google.token
|
||||
/.ssh
|
||||
/.codegpt
|
||||
|
||||
# ignore some directories.
|
||||
/icloud/
|
||||
/www/
|
||||
/www/*
|
||||
/tts/
|
||||
/deps/
|
||||
/hadashboards/
|
||||
/intents/
|
||||
/themes/
|
||||
/custom_components
|
||||
/deps
|
||||
/hacs
|
||||
/image
|
||||
/node-red/
|
||||
/files
|
||||
/appdaemon/*
|
||||
/appdaemon/apps/*
|
||||
/appdaemon/
|
||||
/glances/
|
||||
/downloads/
|
||||
/lightwand/
|
||||
@ -27,7 +24,6 @@
|
||||
# ignore any of these files no matter where they are using double *
|
||||
**.DS_Store
|
||||
**._*
|
||||
**.HA_VERSION
|
||||
**.pyc
|
||||
**.conf
|
||||
**.uuid
|
||||
@ -72,12 +68,4 @@
|
||||
**test.jinja
|
||||
|
||||
# exceptions
|
||||
!/appdaemon/apps/
|
||||
!/appdaemon/apps/apps.yaml
|
||||
!/node-red/projects/
|
||||
!/node-red/projects/NerdFlows/
|
||||
!/node-red/projects/NerdFlows/flows.json
|
||||
!/node-red/projects/NerdFlows/flows_cred.json
|
||||
!/node-red/projects/NerdFlows/package.json
|
||||
!/node-red/projects/NerdFlows/README.md
|
||||
.codegpt
|
||||
!/www/bubble/
|
586
automations.yaml
586
automations.yaml
@ -125,7 +125,6 @@
|
||||
- light.basement_studio_lights
|
||||
- light.tina_lamp_top
|
||||
- light.tina_lamp_side
|
||||
- light.tina_desk_strip
|
||||
- light.stairwell_led_strip
|
||||
data:
|
||||
color_name: red
|
||||
@ -152,7 +151,6 @@
|
||||
- light.master_bedroom_lights
|
||||
- light.tina_lamp_top
|
||||
- light.tina_lamp_side
|
||||
- light.tina_desk_strip
|
||||
data:
|
||||
flash: long
|
||||
- alias: Send TTS notification to the common areas
|
||||
@ -313,102 +311,118 @@
|
||||
- id: '1651787468337'
|
||||
alias: Reboot handling
|
||||
description: ''
|
||||
trigger:
|
||||
- platform: homeassistant
|
||||
event: start
|
||||
triggers:
|
||||
- event: start
|
||||
id: hass_start
|
||||
- platform: homeassistant
|
||||
event: shutdown
|
||||
trigger: homeassistant
|
||||
- event: shutdown
|
||||
id: hass_stop
|
||||
condition: []
|
||||
action:
|
||||
- if:
|
||||
- condition: trigger
|
||||
id: hass_start
|
||||
alias: Startup
|
||||
then:
|
||||
- delay:
|
||||
hours: 0
|
||||
minutes: 1
|
||||
seconds: 0
|
||||
milliseconds: 0
|
||||
- service: automation.turn_on
|
||||
data: {}
|
||||
target:
|
||||
entity_id:
|
||||
- automation.family_has_arrived
|
||||
- automation.family_has_left
|
||||
- automation.scheduled_alarm_rearm
|
||||
- automation.scheduled_alarm_disarm
|
||||
- service: switch.turn_off
|
||||
target:
|
||||
entity_id:
|
||||
- switch.presence_simulation
|
||||
data: {}
|
||||
- if:
|
||||
- condition: and
|
||||
conditions:
|
||||
- condition: state
|
||||
entity_id: input_boolean.holiday_mode
|
||||
state: 'on'
|
||||
alias: Is holiday mode on?
|
||||
trigger: homeassistant
|
||||
conditions: []
|
||||
actions:
|
||||
- alias: Routing
|
||||
choose:
|
||||
- conditions:
|
||||
- condition: trigger
|
||||
id: hass_start
|
||||
alias: Startup
|
||||
sequence:
|
||||
- delay:
|
||||
hours: 0
|
||||
minutes: 1
|
||||
seconds: 0
|
||||
milliseconds: 0
|
||||
- data: {}
|
||||
target:
|
||||
entity_id:
|
||||
- automation.family_has_arrived
|
||||
- automation.family_has_left
|
||||
- automation.scheduled_alarm_rearm
|
||||
- automation.scheduled_alarm_disarm
|
||||
action: automation.turn_on
|
||||
- if:
|
||||
- condition: state
|
||||
entity_id: binary_sensor.early_night_mode
|
||||
state: 'on'
|
||||
alias: Is early night mode on?
|
||||
alias: Test conditions
|
||||
then:
|
||||
- service: switch.turn_on
|
||||
state: 'off'
|
||||
then:
|
||||
- action: input_boolean.turn_off
|
||||
metadata: {}
|
||||
data: {}
|
||||
target:
|
||||
entity_id:
|
||||
- input_boolean.give_me_darkness
|
||||
- input_boolean.night_mode
|
||||
- input_boolean.goodnight
|
||||
alias: If early night mode is off, turn off other night-related modes
|
||||
- target:
|
||||
entity_id:
|
||||
- switch.presence_simulation
|
||||
data: {}
|
||||
action: switch.turn_off
|
||||
- if:
|
||||
- condition: and
|
||||
conditions:
|
||||
- condition: state
|
||||
entity_id: input_boolean.holiday_mode
|
||||
state: 'on'
|
||||
alias: Is holiday mode on?
|
||||
- condition: state
|
||||
entity_id: binary_sensor.early_night_mode
|
||||
state: 'on'
|
||||
alias: Is early night mode on?
|
||||
alias: Test conditions
|
||||
then:
|
||||
- data: {}
|
||||
target:
|
||||
entity_id: switch.animated_scene_{{ states('input_select.holiday_animation')
|
||||
| lower }}
|
||||
alias: Turn on the appropriate animated holiday scene
|
||||
action: switch.turn_on
|
||||
alias: Turn on animated holiday scene if night time and holiday mode is on
|
||||
- data: {}
|
||||
action: script.tony_desktop_refresh
|
||||
- data: {}
|
||||
action: script.tina_desktop_refresh
|
||||
- data: {}
|
||||
action: script.asus_laptop_refresh
|
||||
- data: {}
|
||||
action: script.kallen_desktop_refresh
|
||||
- data: {}
|
||||
action: script.win10vm_refresh
|
||||
- data:
|
||||
topic: house/basement/server/glances
|
||||
payload: restart
|
||||
qos: 0
|
||||
retain: false
|
||||
alias: Restart Glances via MQTT
|
||||
action: mqtt.publish
|
||||
- data: {}
|
||||
alias: Reset all speaker volumes
|
||||
action: script.volume_reset
|
||||
- if:
|
||||
- condition: state
|
||||
entity_id: input_boolean.studio_quiet
|
||||
state: 'off'
|
||||
then:
|
||||
- data:
|
||||
who: basement
|
||||
call_ha_started: 1
|
||||
action: script.status_annc
|
||||
else:
|
||||
- stop: Studio has requested quiet, and Jarvis respects this
|
||||
alias: Announce back online, unless studio has requested quiet
|
||||
- conditions:
|
||||
- condition: trigger
|
||||
id: hass_stop
|
||||
alias: Shutdown
|
||||
sequence:
|
||||
- data:
|
||||
stop_actions: true
|
||||
target:
|
||||
entity_id: switch.animated_scene_{{ states('input_select.holiday_animation')
|
||||
| lower }}
|
||||
alias: Turn on the appropriate animated holiday scene
|
||||
alias: Turn on animated holiday scene if night time and holiday mode is on
|
||||
- service: script.tony_desktop_refresh
|
||||
data: {}
|
||||
- service: script.tina_desktop_refresh
|
||||
data: {}
|
||||
- service: script.asus_laptop_refresh
|
||||
data: {}
|
||||
- service: script.kallen_desktop_refresh
|
||||
data: {}
|
||||
- service: script.win10vm_refresh
|
||||
data: {}
|
||||
- service: mqtt.publish
|
||||
data:
|
||||
topic: house/basement/server/glances
|
||||
payload: restart
|
||||
qos: 0
|
||||
retain: false
|
||||
alias: Restart Glances via MQTT
|
||||
- service: script.volume_reset
|
||||
data: {}
|
||||
alias: Reset all speaker volumes
|
||||
- if:
|
||||
- condition: state
|
||||
entity_id: input_boolean.studio_quiet
|
||||
state: 'off'
|
||||
then:
|
||||
- service: script.status_annc
|
||||
data:
|
||||
who: basement
|
||||
call_ha_started: 1
|
||||
else:
|
||||
- stop: Studio has requested quiet, and Jarvis respects this
|
||||
alias: Announce back online, unless studio has requested quiet
|
||||
- if:
|
||||
- condition: trigger
|
||||
id: hass_stop
|
||||
alias: Shutdown
|
||||
then:
|
||||
- service: automation.turn_off
|
||||
data:
|
||||
stop_actions: true
|
||||
target:
|
||||
entity_id:
|
||||
- automation.family_has_arrived
|
||||
- automation.family_has_left
|
||||
entity_id:
|
||||
- automation.family_has_arrived
|
||||
- automation.family_has_left
|
||||
action: automation.turn_off
|
||||
mode: queued
|
||||
- id: '1654547257475'
|
||||
alias: Battery Monitoring
|
||||
@ -516,127 +530,126 @@
|
||||
- id: '1667341156218'
|
||||
alias: White Noise
|
||||
description: ''
|
||||
trigger:
|
||||
- platform: state
|
||||
entity_id:
|
||||
triggers:
|
||||
- entity_id:
|
||||
- input_boolean.white_noise_emma_bedroom
|
||||
to: 'on'
|
||||
from: 'off'
|
||||
id: emma-on
|
||||
alias: Emma On
|
||||
- platform: state
|
||||
entity_id:
|
||||
trigger: state
|
||||
- entity_id:
|
||||
- input_boolean.white_noise_basement
|
||||
to: 'on'
|
||||
from: 'off'
|
||||
id: basement-on
|
||||
alias: Basement On
|
||||
- platform: state
|
||||
entity_id:
|
||||
trigger: state
|
||||
- entity_id:
|
||||
- input_boolean.white_noise_kallen_bedroom
|
||||
to: 'on'
|
||||
from: 'off'
|
||||
id: kallen-on
|
||||
alias: Kallen On
|
||||
- platform: state
|
||||
entity_id:
|
||||
trigger: state
|
||||
- entity_id:
|
||||
- input_boolean.white_noise_emma_bedroom
|
||||
from: 'on'
|
||||
to: 'off'
|
||||
id: emma-off
|
||||
alias: Emma Off
|
||||
- platform: state
|
||||
entity_id:
|
||||
trigger: state
|
||||
- entity_id:
|
||||
- input_boolean.white_noise_basement
|
||||
from: 'on'
|
||||
to: 'off'
|
||||
id: basement-off
|
||||
alias: Basement Off
|
||||
- platform: state
|
||||
entity_id:
|
||||
trigger: state
|
||||
- entity_id:
|
||||
- input_boolean.white_noise_kallen_bedroom
|
||||
from: 'on'
|
||||
to: 'off'
|
||||
id: kallen-off
|
||||
alias: Kallen Off
|
||||
trigger: state
|
||||
- alias: Emma Timeout
|
||||
platform: state
|
||||
id: emma-timeout
|
||||
entity_id:
|
||||
- media_player.emma_bedroom_google_speaker
|
||||
to: 'off'
|
||||
trigger: state
|
||||
- alias: Basement Timeout
|
||||
platform: state
|
||||
id: basement-timeout
|
||||
entity_id:
|
||||
- media_player.basement_google_speaker
|
||||
to: 'off'
|
||||
trigger: state
|
||||
- alias: Kallen Timeout
|
||||
platform: state
|
||||
id: kallen-timeout
|
||||
entity_id:
|
||||
- media_player.kallen_bedroom_google_speaker
|
||||
to: 'off'
|
||||
condition: []
|
||||
action:
|
||||
trigger: state
|
||||
conditions: []
|
||||
actions:
|
||||
- choose:
|
||||
- conditions:
|
||||
- condition: trigger
|
||||
id: emma-on
|
||||
sequence:
|
||||
- alias: Start river sounds
|
||||
service: google_assistant_sdk.send_text_command
|
||||
data:
|
||||
command: give me river noise on emma bedroom speaker
|
||||
- service: media_player.volume_set
|
||||
data:
|
||||
volume_level: '{{ states(''input_number.emma_bedroom_google_speaker_night_volume'')
|
||||
action: google_assistant_sdk.send_text_command
|
||||
- data:
|
||||
volume_level: '{{ states(''sensor.emma_bedroom_google_speaker_volume'')
|
||||
}}'
|
||||
target:
|
||||
entity_id: media_player.emma_bedroom_google_speaker
|
||||
alias: Set volume
|
||||
action: media_player.volume_set
|
||||
alias: Emma On
|
||||
- conditions:
|
||||
- condition: trigger
|
||||
id: basement-on
|
||||
sequence:
|
||||
- service: google_assistant_sdk.send_text_command
|
||||
data:
|
||||
- data:
|
||||
command: give me thunderstorm sounds on basement studio speaker
|
||||
alias: Start thunderstorm sounds
|
||||
- service: media_player.volume_set
|
||||
data:
|
||||
volume_level: '{{ states(''input_number.basement_google_speaker_night_volume'')
|
||||
}}'
|
||||
action: google_assistant_sdk.send_text_command
|
||||
- data:
|
||||
volume_level: '{{ states(''sensor.basement_google_speaker_volume'') }}'
|
||||
target:
|
||||
entity_id: media_player.basement_google_speaker
|
||||
alias: Set volume
|
||||
action: media_player.volume_set
|
||||
alias: Basement On
|
||||
- conditions:
|
||||
- condition: trigger
|
||||
id: kallen-on
|
||||
sequence:
|
||||
- alias: Start river sounds
|
||||
service: google_assistant_sdk.send_text_command
|
||||
data:
|
||||
command: give me river noise on kallen bedroom speaker
|
||||
- service: media_player.volume_set
|
||||
data:
|
||||
volume_level: '{{ states(''input_number.kallen_bedroom_google_speaker_night_volume'')
|
||||
action: google_assistant_sdk.send_text_command
|
||||
- data:
|
||||
volume_level: '{{ states(''sensor.kallen_bedroom_google_speaker_volume'')
|
||||
}}'
|
||||
target:
|
||||
entity_id: media_player.kallen_bedroom_google_speaker
|
||||
alias: Set volume
|
||||
action: media_player.volume_set
|
||||
alias: Kallen On
|
||||
- conditions:
|
||||
- condition: trigger
|
||||
id: emma-off
|
||||
sequence:
|
||||
- service: media_player.turn_off
|
||||
data: {}
|
||||
- data: {}
|
||||
target:
|
||||
entity_id: media_player.emma_bedroom_google_speaker
|
||||
alias: Turn off speaker
|
||||
action: media_player.turn_off
|
||||
- alias: If Emma is awake, reset volume
|
||||
if:
|
||||
- condition: state
|
||||
@ -648,49 +661,44 @@
|
||||
minutes: 0
|
||||
seconds: 5
|
||||
milliseconds: 0
|
||||
- service: media_player.volume_set
|
||||
data:
|
||||
volume_level: "{% if is_state('input_boolean.give_me_darkness','on') %}\n
|
||||
\ {{ states('input_number.emma_bedroom_google_speaker_night_volume')
|
||||
}}\n{% else %}\n {{ states('input_number.emma_bedroom_google_speaker_day_volume')
|
||||
}}\n{% endif %}\n"
|
||||
- data:
|
||||
volume_level: '{{ states(''sensor.emma_bedroom_google_speaker_volume'')
|
||||
}}'
|
||||
target:
|
||||
entity_id: media_player.emma_bedroom_google_speaker
|
||||
alias: Reset volume
|
||||
action: media_player.volume_set
|
||||
alias: Emma Off
|
||||
- conditions:
|
||||
- condition: trigger
|
||||
id: basement-off
|
||||
sequence:
|
||||
- service: media_player.turn_off
|
||||
data: {}
|
||||
- data: {}
|
||||
target:
|
||||
entity_id: media_player.basement_google_speaker
|
||||
alias: Turn off speaker
|
||||
action: media_player.turn_off
|
||||
- delay:
|
||||
hours: 0
|
||||
minutes: 0
|
||||
seconds: 5
|
||||
milliseconds: 0
|
||||
- service: media_player.volume_set
|
||||
data:
|
||||
volume_level: "{% if is_state('input_boolean.give_me_darkness','on') %}\n
|
||||
{{ states('input_number.basement_google_speaker_night_volume') }}\n{%
|
||||
else %}\n {{ states('input_number.basement_google_speaker_day_volume')
|
||||
}}\n{% endif %}\n"
|
||||
- data:
|
||||
volume_level: '{{ states(''sensor.basement_google_speaker_volume'') }}'
|
||||
target:
|
||||
entity_id: media_player.basement_google_speaker
|
||||
alias: Reset volume
|
||||
action: media_player.volume_set
|
||||
alias: Basement Off
|
||||
- conditions:
|
||||
- condition: trigger
|
||||
id: kallen-off
|
||||
sequence:
|
||||
- service: media_player.turn_off
|
||||
data: {}
|
||||
- data: {}
|
||||
target:
|
||||
entity_id: media_player.kallen_bedroom_google_speaker
|
||||
alias: Turn off speaker
|
||||
action: media_player.turn_off
|
||||
- alias: If Kallen is awake, reset volume
|
||||
if:
|
||||
- condition: and
|
||||
@ -707,15 +715,13 @@
|
||||
minutes: 0
|
||||
seconds: 5
|
||||
milliseconds: 0
|
||||
- service: media_player.volume_set
|
||||
data:
|
||||
volume_level: "{% if is_state('input_boolean.give_me_darkness','on') %}\n
|
||||
\ {{ states('input_number.kallen_bedroom_google_speaker_night_volume')
|
||||
}}\n{% else %}\n {{ states('input_number.kallen_bedroom_google_speaker_day_volume')
|
||||
}}\n{% endif %}\n"
|
||||
- data:
|
||||
volume_level: '{{ states(''sensor.kallen_bedroom_google_speaker_volume'')
|
||||
}}'
|
||||
target:
|
||||
entity_id: media_player.kallen_bedroom_google_speaker
|
||||
alias: Reset volume
|
||||
action: media_player.volume_set
|
||||
alias: Kallen Off
|
||||
- conditions:
|
||||
- condition: trigger
|
||||
@ -735,16 +741,16 @@
|
||||
seconds: 5
|
||||
milliseconds: 0
|
||||
- alias: Start river sounds
|
||||
service: google_assistant_sdk.send_text_command
|
||||
data:
|
||||
command: give me river noise on emma bedroom speaker
|
||||
- service: media_player.volume_set
|
||||
data:
|
||||
volume_level: '{{ states(''input_number.emma_bedroom_google_speaker_night_volume'')
|
||||
action: google_assistant_sdk.send_text_command
|
||||
- data:
|
||||
volume_level: '{{ states(''sensor.emma_bedroom_google_speaker_volume'')
|
||||
}}'
|
||||
target:
|
||||
entity_id: media_player.emma_bedroom_google_speaker
|
||||
alias: Set volume
|
||||
action: media_player.volume_set
|
||||
alias: Emma Timeout
|
||||
- conditions:
|
||||
- condition: trigger
|
||||
@ -764,16 +770,15 @@
|
||||
seconds: 5
|
||||
milliseconds: 0
|
||||
- alias: Start thunderstorm sounds
|
||||
service: google_assistant_sdk.send_text_command
|
||||
data:
|
||||
command: give me thunderstorm sounds on basement studio speaker
|
||||
- service: media_player.volume_set
|
||||
data:
|
||||
volume_level: '{{ states(''input_number.basement_google_speaker_night_volume'')
|
||||
}}'
|
||||
action: google_assistant_sdk.send_text_command
|
||||
- data:
|
||||
volume_level: '{{ states(''sensor.basement_google_speaker_volume'') }}'
|
||||
target:
|
||||
entity_id: media_player.basement_google_speaker
|
||||
alias: Set volume
|
||||
action: media_player.volume_set
|
||||
alias: Basement Timeout
|
||||
- conditions:
|
||||
- condition: trigger
|
||||
@ -793,16 +798,16 @@
|
||||
seconds: 5
|
||||
milliseconds: 0
|
||||
- alias: Start river sounds
|
||||
service: google_assistant_sdk.send_text_command
|
||||
data:
|
||||
command: give me river noise on kallen bedroom speaker
|
||||
- service: media_player.volume_set
|
||||
data:
|
||||
volume_level: '{{ states(''input_number.kallen_bedroom_google_speaker_night_volume'')
|
||||
action: google_assistant_sdk.send_text_command
|
||||
- data:
|
||||
volume_level: '{{ states(''sensor.kallen_bedroom_google_speaker_volume'')
|
||||
}}'
|
||||
target:
|
||||
entity_id: media_player.kallen_bedroom_google_speaker
|
||||
alias: Set volume
|
||||
action: media_player.volume_set
|
||||
alias: Kallen Timeout
|
||||
mode: parallel
|
||||
max: 20
|
||||
@ -1151,10 +1156,23 @@
|
||||
entity_id: switch.adaptive_lighting_master_bedroom
|
||||
action: switch.turn_off
|
||||
brightness_down_short_action:
|
||||
- data: {}
|
||||
target:
|
||||
entity_id: switch.adaptive_lighting_master_bedroom
|
||||
action: switch.turn_off
|
||||
- if:
|
||||
- condition: state
|
||||
entity_id: light.master_bedroom_lights
|
||||
state: 'off'
|
||||
then:
|
||||
- action: input_select.select_option
|
||||
metadata: {}
|
||||
data:
|
||||
option: Nightlight
|
||||
target:
|
||||
entity_id: input_select.master_bedroom_scenes
|
||||
else:
|
||||
- data: {}
|
||||
target:
|
||||
entity_id: switch.adaptive_lighting_master_bedroom
|
||||
action: switch.turn_off
|
||||
alias: Activate nightlight if lights are off, otherwise act normal
|
||||
brightness_down_long_action:
|
||||
- data: {}
|
||||
target:
|
||||
@ -1299,16 +1317,29 @@
|
||||
input:
|
||||
dimmer_device: 40c14ccfe958d21d75888a968bbbf908
|
||||
on_short_action:
|
||||
- service: input_boolean.toggle
|
||||
data: {}
|
||||
target:
|
||||
entity_id: input_boolean.tina_desk_lights
|
||||
- if:
|
||||
- condition: state
|
||||
entity_id: light.tina_desk_lights
|
||||
state: 'off'
|
||||
then:
|
||||
- action: input_select.select_option
|
||||
metadata: {}
|
||||
data:
|
||||
option: Reset
|
||||
target:
|
||||
entity_id: input_select.tina_desk_scenes
|
||||
else:
|
||||
- action: light.turn_off
|
||||
metadata: {}
|
||||
data: {}
|
||||
target:
|
||||
entity_id: light.tina_desk_lights
|
||||
on_long_action:
|
||||
- service: input_select.select_option
|
||||
data:
|
||||
- data:
|
||||
option: Reset
|
||||
target:
|
||||
entity_id: input_select.tina_desk_scenes
|
||||
action: input_select.select_option
|
||||
off_short_action: []
|
||||
off_long_action: []
|
||||
- id: '1693174941627'
|
||||
@ -1574,7 +1605,6 @@
|
||||
- light.living_room_color_3
|
||||
- light.tina_lamp_side
|
||||
- light.tina_lamp_top
|
||||
- light.tina_desk_strip
|
||||
- light.stairwell_led_strip
|
||||
- light.basement_stairwell
|
||||
- light.basement_tall_lamp
|
||||
@ -1590,7 +1620,6 @@
|
||||
- light.living_room_color_3
|
||||
- light.tina_lamp_side
|
||||
- light.tina_lamp_top
|
||||
- light.tina_desk_strip
|
||||
- light.stairwell_led_strip
|
||||
- delay:
|
||||
seconds: 1
|
||||
@ -1611,7 +1640,6 @@
|
||||
entity_id:
|
||||
- light.living_room_lights
|
||||
- light.tina_lamp
|
||||
- light.tina_desk_strip
|
||||
- light.stairwell_led_strip
|
||||
- light.basement_studio_lights
|
||||
data:
|
||||
@ -1623,7 +1651,6 @@
|
||||
entity_id:
|
||||
- light.living_room_lights
|
||||
- light.tina_lamp
|
||||
- light.tina_desk_strip
|
||||
- light.stairwell_led_strip
|
||||
data:
|
||||
color_name: red
|
||||
@ -1695,52 +1722,25 @@
|
||||
alias: Tina Desk Lights Handler
|
||||
description: Handles turning on the desk lights with smart scene selection and also
|
||||
turning them off
|
||||
trigger:
|
||||
- platform: state
|
||||
entity_id: input_boolean.tina_desk_lights
|
||||
from: 'off'
|
||||
to: 'on'
|
||||
id: toggle-on
|
||||
alias: Toggle On
|
||||
- platform: state
|
||||
entity_id: input_boolean.tina_desk_lights
|
||||
from: 'on'
|
||||
to: 'off'
|
||||
id: toggle-off
|
||||
alias: Toggle Off
|
||||
- platform: state
|
||||
entity_id: input_select.tina_desk_scenes
|
||||
triggers:
|
||||
- entity_id: input_select.tina_desk_scenes
|
||||
to: Reset
|
||||
id: reset
|
||||
alias: Reset
|
||||
- platform: state
|
||||
entity_id: light.tina_desk_lights
|
||||
from: 'on'
|
||||
to: 'off'
|
||||
id: lights-off
|
||||
alias: Lights Off
|
||||
- platform: state
|
||||
entity_id: light.tina_desk_lights
|
||||
from: 'off'
|
||||
to: 'on'
|
||||
id: lights-on
|
||||
alias: Lights On
|
||||
- platform: state
|
||||
entity_id: binary_sensor.tina_desktop_on
|
||||
trigger: state
|
||||
- entity_id: binary_sensor.tina_desktop_on
|
||||
from: 'off'
|
||||
to: 'on'
|
||||
id: computer-on
|
||||
alias: Computer On
|
||||
condition: []
|
||||
action:
|
||||
trigger: state
|
||||
conditions: []
|
||||
actions:
|
||||
- alias: Reset
|
||||
if:
|
||||
- alias: Triggered by Toggle On, Reset, or Computer On
|
||||
- alias: Triggered by Reset or Computer On
|
||||
condition: or
|
||||
conditions:
|
||||
- condition: trigger
|
||||
id: toggle-on
|
||||
alias: Toggle On
|
||||
- condition: trigger
|
||||
id: reset
|
||||
alias: Reset
|
||||
@ -1748,52 +1748,12 @@
|
||||
id: computer-on
|
||||
alias: Computer On
|
||||
then:
|
||||
- service: input_select.select_option
|
||||
target:
|
||||
- target:
|
||||
entity_id: input_select.tina_desk_scenes
|
||||
data:
|
||||
option: '{{ states(''sensor.tina_desk_scene'') }}'
|
||||
alias: Reset to appropriate default scene
|
||||
- if:
|
||||
- condition: trigger
|
||||
id: toggle-off
|
||||
then:
|
||||
- service: light.turn_off
|
||||
target:
|
||||
entity_id: light.tina_desk_lights
|
||||
data: {}
|
||||
alias: Toggle Off
|
||||
- if:
|
||||
- condition: trigger
|
||||
id: lights-off
|
||||
then:
|
||||
- if:
|
||||
- condition: state
|
||||
entity_id: input_boolean.tina_desk_lights
|
||||
state: 'on'
|
||||
then:
|
||||
- service: input_boolean.turn_off
|
||||
target:
|
||||
entity_id: input_boolean.tina_desk_lights
|
||||
data: {}
|
||||
alias: Lights Off
|
||||
- if:
|
||||
- condition: trigger
|
||||
id: lights-on
|
||||
then:
|
||||
- if:
|
||||
- condition: state
|
||||
entity_id: input_boolean.tina_desk_lights
|
||||
state: 'off'
|
||||
then:
|
||||
- service: input_boolean.turn_on
|
||||
target:
|
||||
entity_id: input_boolean.tina_desk_lights
|
||||
data: {}
|
||||
- delay:
|
||||
seconds: 2
|
||||
alias: Prevent script from re-triggering when boolean is turned on
|
||||
alias: Lights On
|
||||
action: input_select.select_option
|
||||
mode: single
|
||||
- id: '1696286403914'
|
||||
alias: Basement Lights Handling
|
||||
@ -5090,38 +5050,6 @@
|
||||
alias: Update Notification
|
||||
mode: parallel
|
||||
max: 10
|
||||
- id: '1714595577405'
|
||||
alias: Emma Bedroom Cooling
|
||||
description: ''
|
||||
trigger:
|
||||
- platform: time
|
||||
at: input_datetime.emma_bedroom_cooling
|
||||
alias: At the scheduled cooling time
|
||||
condition:
|
||||
- condition: state
|
||||
entity_id: input_boolean.emma_sleeping
|
||||
state: 'off'
|
||||
alias: If Emma is not already asleep
|
||||
- condition: state
|
||||
entity_id: input_select.scheduled_climate_mode_emma_bedroom
|
||||
state: AC
|
||||
alias: If the AC is scheduled to run
|
||||
action:
|
||||
- service: fan.turn_on
|
||||
metadata: {}
|
||||
data: {}
|
||||
target:
|
||||
entity_id: fan.emma_air_conditioner
|
||||
alias: Turn on Emma's air conditioner
|
||||
- service: script.text_notify
|
||||
data:
|
||||
who: parents
|
||||
title: Emma Climate Schedule
|
||||
message: The air conditioner in Emma's Bedroom has been activated.
|
||||
type: normal
|
||||
tag: emma-climate
|
||||
alias: Send AC notification
|
||||
mode: restart
|
||||
- id: '1716497196985'
|
||||
alias: Emma Bedtime Rescheduler
|
||||
description: Keeps Emma's bedtime up-to-date with reality
|
||||
@ -6094,3 +6022,93 @@
|
||||
entity_id: input_datetime.minnesota_wild_start
|
||||
alias: Minnesota Wild Start
|
||||
mode: restart
|
||||
- id: '1740098474888'
|
||||
alias: Tina Pain Meds Handler
|
||||
description: ''
|
||||
triggers:
|
||||
- at: input_datetime.tina_ibuprofen_notify
|
||||
id: ibuprofen-notify
|
||||
alias: Ibuprofen Notify
|
||||
trigger: time
|
||||
- alias: Tylenol Notify
|
||||
at: input_datetime.tina_tylenol_notify
|
||||
id: tylenol-notify
|
||||
trigger: time
|
||||
- entity_id:
|
||||
- input_boolean.tina_ibuprofen_taken
|
||||
from: 'off'
|
||||
to: 'on'
|
||||
id: ibuprofen-taken
|
||||
alias: Ibuprofen Taken
|
||||
trigger: state
|
||||
- alias: Tylenol Taken
|
||||
entity_id:
|
||||
- input_boolean.tina_tylenol_taken
|
||||
from: 'off'
|
||||
to: 'on'
|
||||
id: tylenol-taken
|
||||
trigger: state
|
||||
conditions: []
|
||||
actions:
|
||||
- choose:
|
||||
- conditions:
|
||||
- condition: and
|
||||
conditions:
|
||||
- condition: trigger
|
||||
id:
|
||||
- ibuprofen-notify
|
||||
- ibuprofen-taken
|
||||
- condition: state
|
||||
entity_id: input_boolean.tina_ibuprofen_active
|
||||
state: 'on'
|
||||
alias: Ibuprofen
|
||||
sequence:
|
||||
- data:
|
||||
reason: '{{ trigger.id }}'
|
||||
alias: Call ibuprofen script
|
||||
action: script.tina_ibuprofen
|
||||
- conditions:
|
||||
- condition: and
|
||||
conditions:
|
||||
- condition: trigger
|
||||
id:
|
||||
- tylenol-notify
|
||||
- tylenol-taken
|
||||
- condition: state
|
||||
entity_id: input_boolean.tina_tylenol_active
|
||||
state: 'on'
|
||||
alias: Tylenol
|
||||
sequence:
|
||||
- data:
|
||||
reason: '{{ trigger.id }}'
|
||||
alias: Call tylenol script
|
||||
action: script.tina_tylenol
|
||||
mode: parallel
|
||||
max: 10
|
||||
- id: '1742799079017'
|
||||
alias: Emma Sleep Handling
|
||||
description: Awareness of when Emma is asleep or wakes up
|
||||
triggers:
|
||||
- trigger: state
|
||||
entity_id:
|
||||
- input_boolean.emma_sleeping
|
||||
from: 'on'
|
||||
to: 'off'
|
||||
id: sleep-off
|
||||
alias: Sleep Off
|
||||
- trigger: state
|
||||
entity_id:
|
||||
- binary_sensor.family_home
|
||||
from: 'on'
|
||||
to: 'off'
|
||||
id: family-left
|
||||
alias: Family Left
|
||||
conditions: []
|
||||
actions:
|
||||
- action: input_boolean.turn_on
|
||||
metadata: {}
|
||||
data: {}
|
||||
target:
|
||||
entity_id: input_boolean.emma_awake
|
||||
alias: Turn on Emma Awake
|
||||
mode: restart
|
||||
|
@ -321,6 +321,9 @@ influxdb:
|
||||
- sensor.dimmest_room
|
||||
- sensor.warmest_room_temperature
|
||||
- sensor.coldest_room_temperature
|
||||
- sensor.national_tornado_warnings
|
||||
- sensor.national_severe_thunderstorm_warnings
|
||||
- binary_sensor.severe_thunderstorm_warning
|
||||
|
||||
logbook:
|
||||
include:
|
||||
@ -498,3 +501,6 @@ prometheus:
|
||||
- sensor.dimmest_room
|
||||
- sensor.warmest_room_temperature
|
||||
- sensor.coldest_room_temperature
|
||||
- sensor.national_tornado_warnings
|
||||
- sensor.national_severe_thunderstorm_warnings
|
||||
- binary_sensor.severe_thunderstorm_warning
|
||||
|
@ -12,21 +12,62 @@
|
||||
{% endif %}
|
||||
{% endmacro %}
|
||||
|
||||
{% macro period_str(team) %}
|
||||
{% if state_attr(team,'league') in ['NFL','NCAAF'] %}
|
||||
quarter
|
||||
{% elif state_attr(team,'league') == 'MLB' %}
|
||||
inning
|
||||
{% else %}
|
||||
period
|
||||
{% endif %}
|
||||
{% endmacro %}
|
||||
|
||||
{% macro sports_clock(team) %}
|
||||
{% macro data() %}
|
||||
{% set period_str = period_str(team) %}
|
||||
{% set game_clock = state_attr(team,'clock') | lower %}
|
||||
{% if state_attr(team,'league') == 'MLB' %}
|
||||
{% set inning_parts = game_clock.split(' ') %}
|
||||
in the {{ inning_parts[0] ~ ' of the ' ~ inning_parts[1] ~ ' ' ~ period_str }}
|
||||
{% else %}
|
||||
{% if ' - ' in game_clock %}
|
||||
{% set clock_time, quarter = game_clock.split(' - ') %}
|
||||
with {{ clock_time ~ ' remaining in the ' ~ quarter ~ ' ' ~ period_str }}
|
||||
{% else %}
|
||||
with {{ game_clock ~ ' remaining in the ' ~ period_str }}
|
||||
{% endif %}
|
||||
{% endif %}
|
||||
{% endmacro %}
|
||||
{{ cleanup(data()) }}
|
||||
{% endmacro %}
|
||||
|
||||
{% macro sports_pregame(team) %}
|
||||
{% macro data() %}
|
||||
{% if state_attr(team,'opponent_name') %}
|
||||
{% set opponent_name = state_attr(team, 'opponent_name') %}
|
||||
{% if opponent_name.endswith(' St') %}
|
||||
{% set opponent_name = opponent_name | replace(' St', ' State') %}
|
||||
{% endif %}
|
||||
{% endif %}
|
||||
{% if is_state(team,'PRE') %}
|
||||
{% set date = state_attr(team,'date') | as_timestamp | timestamp_custom('%m-%d') %}
|
||||
{% if date == now().strftime('%m-%d') %}
|
||||
The {{ state_attr(team,'friendly_name') }} will be playing today against {% if state_attr(team,'league') != 'NCAAF'%}the{% endif %} {{ state_attr(team,'opponent_name') }} at {{ state_attr(team,'venue') }}.
|
||||
The {{ state_attr(team,'friendly_name') }} will be playing today against {% if state_attr(team,'league') != 'NCAAF'%}the{% endif %} {{ opponent_name }} at {{ state_attr(team,'venue') }}.
|
||||
{{ sports_str(team,'start') }} is at {{ state_attr(team,'date') | as_timestamp | timestamp_custom('%I:%M %p') }}.
|
||||
{% endif %}
|
||||
{% endif %}
|
||||
{% endmacro%}
|
||||
{% endmacro %}
|
||||
{{ cleanup(data()) }}
|
||||
{% endmacro %}
|
||||
|
||||
{% macro sports_main(team) %}
|
||||
{% macro data() %}
|
||||
{% if state_attr(team,'opponent_name') %}
|
||||
{% set opponent_name = state_attr(team, 'opponent_name') %}
|
||||
{% if opponent_name.endswith(' St') %}
|
||||
{% set opponent_name = opponent_name | replace(' St', ' State') %}
|
||||
{% endif %}
|
||||
{% endif %}
|
||||
{% if is_state(team,'POST') %}
|
||||
{% set date = state_attr(team,'date') | as_timestamp | timestamp_custom('%m-%d') %}
|
||||
{% set yday = (as_timestamp(now()) - (24*3600)) | timestamp_custom('%m-%d') %}
|
||||
@ -34,11 +75,11 @@
|
||||
{% if state_attr(team,'clock') in ['postponed','Postponed'] %}
|
||||
The {{ state_attr(team,'friendly_name') }} had their game postponed today, and it will be played at a later date.
|
||||
{% elif (state_attr(team,'team_score') | int) == state_attr(team,'opponent_score') | int %}
|
||||
The {{ state_attr(team,'friendly_name') }} tied in their game today against {% if state_attr(team,'league') != 'NCAAF'%}the{% endif %} {{ state_attr(team,'opponent_name') }} by a score of {{ state_attr(team,'team_score') }} to {{ state_attr(team,'opponent_score') }}.
|
||||
The {{ state_attr(team,'friendly_name') }} tied in their game today against {% if state_attr(team,'league') != 'NCAAF'%}the{% endif %} {{ opponent_name }} by a score of {{ state_attr(team,'team_score') }} to {{ state_attr(team,'opponent_score') }}.
|
||||
{% elif state_attr(team,'team_winner') == true %}
|
||||
The {{ state_attr(team,'friendly_name') }} won their game today against {% if state_attr(team,'league') != 'NCAAF'%}the{% endif %} {{ state_attr(team,'opponent_name') }} by a score of {{ state_attr(team,'team_score') }} to {{ state_attr(team,'opponent_score') }}.
|
||||
The {{ state_attr(team,'friendly_name') }} won their game today against {% if state_attr(team,'league') != 'NCAAF'%}the{% endif %} {{ opponent_name }} by a score of {{ state_attr(team,'team_score') }} to {{ state_attr(team,'opponent_score') }}.
|
||||
{% 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 %} {{ state_attr(team,'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 %}
|
||||
{% if state_attr(team,'clock') not in ['postponed','Postponed'] %}
|
||||
This brings their record to {{ state_attr(team,'team_record') | replace("-"," and ") }} on the season.
|
||||
@ -47,11 +88,11 @@
|
||||
{% if state_attr(team,'clock') in ['postponed','Postponed'] %}
|
||||
The {{ state_attr(team,'friendly_name') }} had their game postponed yesterday, and it will be played at a later date.
|
||||
{% elif (state_attr(team,'team_score') | int) == state_attr(team,'opponent_score') | int %}
|
||||
The {{ state_attr(team,'friendly_name') }} tied in their game yesterday against {% if state_attr(team,'league') != 'NCAAF'%}the{% endif %} {{ state_attr(team,'opponent_name') }} by a score of {{ state_attr(team,'team_score') }} to {{ state_attr(team,'opponent_score') }}.
|
||||
The {{ state_attr(team,'friendly_name') }} tied in their game yesterday against {% if state_attr(team,'league') != 'NCAAF'%}the{% endif %} {{ opponent_name }} by a score of {{ state_attr(team,'team_score') }} to {{ state_attr(team,'opponent_score') }}.
|
||||
{% elif state_attr(team,'team_winner') == true %}
|
||||
The {{ state_attr(team,'friendly_name') }} won their game yesterday against {% if state_attr(team,'league') != 'NCAAF'%}the{% endif %} {{ state_attr(team,'opponent_name') }} by a score of {{ state_attr(team,'team_score') }} to {{ state_attr(team,'opponent_score') }}.
|
||||
The {{ state_attr(team,'friendly_name') }} won their game yesterday against {% if state_attr(team,'league') != 'NCAAF'%}the{% endif %} {{ opponent_name }} by a score of {{ state_attr(team,'team_score') }} to {{ state_attr(team,'opponent_score') }}.
|
||||
{% elif state_attr(team,'opponent_winner') == true %}
|
||||
The {{ state_attr(team,'friendly_name') }} lost their game yesterday against {% if state_attr(team,'league') != 'NCAAF'%}the{% endif %} {{ state_attr(team,'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 yesterday against {% if state_attr(team,'league') != 'NCAAF'%}the{% endif %} {{ opponent_name }} by a score of {{ state_attr(team,'opponent_score') }} to {{ state_attr(team,'team_score') }}.
|
||||
{% endif %}
|
||||
{% if state_attr(team,'clock') not in ['postponed','Postponed'] %}
|
||||
This brings their record to {{ state_attr(team,'team_record') | replace("-"," and ") }} on the season.
|
||||
@ -59,11 +100,11 @@
|
||||
{% endif %}
|
||||
{% elif is_state(team,'IN') %}
|
||||
{% if (state_attr(team,'team_score') | int) == (state_attr(team,'opponent_score') | int) %}
|
||||
The {{ state_attr(team,'friendly_name') }} are currently tied in their game against {% if state_attr(team,'league') != 'NCAAF'%}the{% endif %} {{ state_attr(team,'opponent_name') }} with a score of {{ state_attr(team,'team_score') }} to {{ state_attr(team,'opponent_score') }}.
|
||||
The {{ state_attr(team,'friendly_name') }} are currently tied in their game against {% if state_attr(team,'league') != 'NCAAF'%}the{% endif %} {{ opponent_name }} with a score of {{ state_attr(team,'team_score') }} to {{ state_attr(team,'opponent_score') }} {{ sports_clock(team) }}.
|
||||
{% elif (state_attr(team,'team_score') | int) > (state_attr(team,'opponent_score') | int) %}
|
||||
The {{ state_attr(team,'friendly_name') }} are currently winning their game against {% if state_attr(team,'league') != 'NCAAF'%}the{% endif %} {{ state_attr(team,'opponent_name') }} with a score of {{ state_attr(team,'team_score') }} to {{ state_attr(team,'opponent_score') }}.
|
||||
The {{ state_attr(team,'friendly_name') }} are currently winning their game against {% if state_attr(team,'league') != 'NCAAF'%}the{% endif %} {{ opponent_name }} with a score of {{ state_attr(team,'team_score') }} to {{ state_attr(team,'opponent_score') }} {{ sports_clock(team) }}.
|
||||
{% else %}
|
||||
The {{ state_attr(team,'friendly_name') }} are currently losing their game against {% if state_attr(team,'league') != 'NCAAF'%}the{% endif %} {{ state_attr(team,'opponent_name') }} with a score of {{ state_attr(team,'opponent_score') }} to {{ state_attr(team,'team_score') }}.
|
||||
The {{ state_attr(team,'friendly_name') }} are currently losing their game against {% if state_attr(team,'league') != 'NCAAF'%}the{% endif %} {{ opponent_name }} with a score of {{ state_attr(team,'opponent_score') }} to {{ state_attr(team,'team_score') }} {{ sports_clock(team) }}.
|
||||
{% endif %}
|
||||
{% endif %}
|
||||
{% endmacro %}
|
||||
|
@ -473,12 +473,11 @@
|
||||
Collin has Beyond The Bells today after school.
|
||||
{% endif %}
|
||||
{% if is_state('input_boolean.kallen_alternate_pickup','on') %}
|
||||
{{ states('input_text.kallen_pickup') }} will be picking Collin up from school today.
|
||||
{% else %}
|
||||
Pickup today will be at {{ input_datetime_read('input_datetime.kallen_school_day_end') | trim }}.
|
||||
{{ states('input_text.kallen_pickup') }} will be picking Collin up from school today.
|
||||
{% if is_state('input_boolean.kallen_school_early_release','on') %}
|
||||
And It is early release!
|
||||
Today is an early release day!
|
||||
{% endif %}
|
||||
Pickup today will be at {{ input_datetime_read('input_datetime.kallen_school_day_end') | trim }}.
|
||||
{% endif %}
|
||||
{% if states('sensor.windows_open') | int > 0 %}
|
||||
'I detect that there are windows open. Make sure you close them before you leave, or else the security system will not arm. '
|
||||
@ -544,10 +543,11 @@
|
||||
{% endif %}
|
||||
{% if is_state('input_boolean.kallen_alternate_pickup','on') %}
|
||||
{{ states('input_text.kallen_pickup') }} will be picking him up from school today.
|
||||
{% elif is_state('input_boolean.kallen_school_early_release','on') %}
|
||||
The school is on an early release schedule, pickup is at {{ input_datetime_read('input_datetime.kallen_school_day_end') | trim }}.
|
||||
{% else %}
|
||||
His pickup time is {{ input_datetime_read('input_datetime.kallen_school_day_end') | trim }}.
|
||||
{% if is_state('input_boolean.kallen_school_early_release','on') %}
|
||||
The school is on an early release schedule, pickup is at {{ input_datetime_read('input_datetime.kallen_school_day_end') | trim }}.
|
||||
{% else %}
|
||||
His pickup time is {{ input_datetime_read('input_datetime.kallen_school_day_end') | trim }}.
|
||||
{% endif %}
|
||||
{% endif %}
|
||||
{% else %}
|
||||
{{ identKallen }} has school at {{ input_datetime_read('input_datetime.kallen_school_day_start') | trim }} today.
|
||||
|
@ -4,9 +4,9 @@
|
||||
|
||||
{% macro weatherInfo(type,method,time) %}
|
||||
{% set time = time|default('day') %}
|
||||
{% if method == 'text' %}
|
||||
{% if method in ['text','dashboard'] %}
|
||||
{% if type in ['current','full'] %}
|
||||
The current weather is {{ states('weather.iron_nerd_weather_station') | lower }}. It is {{ state_attr('weather.iron_nerd_weather_station','temperature') | round }} degrees outside and feels like {{ states('sensor.stratton_ave_apparent_temperature') | round }} degrees.
|
||||
The current weather is {{ states('weather.iron_nerd_weather_station') | lower }}. It is {{ state_attr('weather.iron_nerd_weather_station','temperature') | round }} degrees outside and feels like {{ states('sensor.home_temperature_feels_like') | round }} degrees.
|
||||
{% endif %}
|
||||
{% if type in ['forecast','full'] %}
|
||||
{% if 14400 <= ct <= 61200 %}
|
||||
@ -19,15 +19,28 @@
|
||||
{% if type in ['alerts','full'] %}
|
||||
{% 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!
|
||||
{% elif states('sensor.weatheralerts_active_alerts') > '0' %}
|
||||
{% if state_attr('binary_sensor.tornado_warning','confirmed' == true) %}
|
||||
A tornado has been confirmed in the area. Please take shelter immediately!
|
||||
{% endif %}
|
||||
{% elif is_state('binary_sensor.severe_thunderstorm_warning','on') %}
|
||||
We are under a severe thunderstorm warning.
|
||||
{% 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!
|
||||
{% endif %}
|
||||
{% 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!
|
||||
{% endif %}
|
||||
{% elif states('sensor.weatheralerts_active_alerts') > '0' and method != 'dashboard' %}
|
||||
Current weather alerts: {{ states('sensor.weather_alert_string') }}.
|
||||
{% endif %}
|
||||
{% if is_state('binary_sensor.lightning_warning','on') %}
|
||||
{% set ltgdist = (states('sensor.blitzortung_lightning_distance') | int) / 1.609 | round %}
|
||||
There is lightning in the area. Nearest strike is {{ ltgdist }} miles away.
|
||||
{% endif %}
|
||||
{% if is_state('binary_sensor.raining','on') %}
|
||||
It is currently raining. Make sure all doors and windows are closed!
|
||||
{% if method != 'dashboard' %}
|
||||
{% if is_state('binary_sensor.lightning_warning','on') %}
|
||||
{% set ltgdist = (states('sensor.blitzortung_lightning_distance') | int) / 1.609 | round %}
|
||||
There is lightning in the area. Nearest strike is {{ ltgdist }} miles away.
|
||||
{% endif %}
|
||||
{% if is_state('binary_sensor.raining','on') %}
|
||||
It is currently raining. Make sure all doors and windows are closed!
|
||||
{% endif %}
|
||||
{% endif %}
|
||||
{% if state_attr('weather.iron_nerd_weather_station','visibility') | int < 3 %}
|
||||
Caution: Current outdoor visibility is {{ state_attr('weather.iron_nerd_weather_station','visibility') }} miles.
|
||||
@ -47,6 +60,17 @@
|
||||
{% endif %}
|
||||
{% 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! "
|
||||
{% if state_attr('binary_sensor.tornado_warning','confirmed' == true) %}
|
||||
"A tornado has been confirmed in the area. Please take shelter immediately! "
|
||||
{% endif %}
|
||||
{% elif is_state('binary_sensor.severe_thunderstorm_warning','on') %}
|
||||
"We are under a severe thunderstorm warning. "
|
||||
{% 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! "
|
||||
{% endif %}
|
||||
{% 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! "
|
||||
{% endif %}
|
||||
{% elif is_state('input_boolean.tornado_watch','on') %}
|
||||
{{ [
|
||||
"There is currently a tornado watch active. Please keep an eye on the sky and your local weather reports. ",
|
||||
@ -101,7 +125,11 @@
|
||||
|
||||
{% macro weatherReport(type,method,time) %}
|
||||
{% macro data() %}
|
||||
{{ weatherInfo(type,method,time) | replace('clear-night','clear') | replace('partlycloudy','partly cloudy') }}
|
||||
{{ weatherInfo(type,method,time) |
|
||||
replace('clear-night','clear') |
|
||||
replace('partlycloudy','partly cloudy') |
|
||||
replace('snowy-rainy','a mix of rain and snow') |
|
||||
replace('lightning-rainy','stormy') }}
|
||||
{% endmacro %}
|
||||
{{ cleanup(data()) }}
|
||||
{% endmacro %}
|
||||
|
@ -11,6 +11,7 @@ report_type:
|
||||
options:
|
||||
- Bug Report
|
||||
- New Idea
|
||||
- Adjustment
|
||||
initial: Bug Report
|
||||
icon: mdi:bug
|
||||
select_testing:
|
||||
|
@ -283,7 +283,6 @@ script:
|
||||
- light.living_room_color_1
|
||||
- light.living_room_color_2
|
||||
- light.living_room_color_3
|
||||
- light.tina_desk_strip
|
||||
- light.tina_lamp_side
|
||||
- light.tina_lamp_top
|
||||
- light.mud_room_overhead
|
||||
@ -320,7 +319,6 @@ script:
|
||||
entity_id:
|
||||
- light.living_room_lights
|
||||
- light.tina_lamp
|
||||
- light.tina_desk_strip
|
||||
- light.basement_studio_lights
|
||||
data:
|
||||
color_name: >
|
||||
|
4
packages/basement_studio.yaml
Normal file
4
packages/basement_studio.yaml
Normal file
@ -0,0 +1,4 @@
|
||||
input_boolean:
|
||||
do_not_enter_basement_studio:
|
||||
name: Do Not Enter - Basement Studio
|
||||
icon: mdi:minus-circle
|
@ -1,20 +1,24 @@
|
||||
template:
|
||||
- binary_sensor:
|
||||
- name: Emma Aircon - Compressor
|
||||
- name: Emma Bedroom Aircon - Compressor
|
||||
unique_id: 21bcbb62-823c-43ff-8c2c-26e940324ee6
|
||||
state: "{{ is_state('fan.emma_air_conditioner','on') and states('sensor.emma_air_conditioner_power') | int > 150 }}"
|
||||
state: "{{ states('sensor.emma_bedroom_aircon_power') | int > 150 }}"
|
||||
availability: "{{ states('climate.emma_bedroom_aircon') not in ['unknown','unavailable'] }}"
|
||||
device_class: running
|
||||
- name: Emma Aircon - Fan
|
||||
- name: Emma Bedroom Aircon - Fan
|
||||
unique_id: 9e3054cf-8f7e-4fef-9da4-5b2f2bc99c9d
|
||||
state: "{{ is_state('fan.emma_air_conditioner','on') and states('sensor.emma_air_conditioner_power') | int > 20 }}"
|
||||
state: "{{ states('sensor.emma_bedroom_aircon_power') | int > 20 }}"
|
||||
availability: "{{ states('climate.emma_bedroom_aircon') not in ['unknown','unavailable'] }}"
|
||||
device_class: running
|
||||
- name: Master Bedroom Aircon - Compressor
|
||||
unique_id: 87051957-1dbc-4d65-b138-e8469728f58f
|
||||
state: "{{ states('climate.master_bedroom_aircon') not in ['off','unknown','unavailable'] and states('sensor.master_bedroom_aircon_power') | int > 150 }}"
|
||||
state: "{{ states('sensor.master_bedroom_aircon_power') | int > 150 }}"
|
||||
availability: "{{ states('climate.master_bedroom_aircon') not in ['unknown','unavailable'] }}"
|
||||
device_class: running
|
||||
- name: Master Bedroom Aircon - Fan
|
||||
unique_id: ae893dd6-129c-4886-a966-a89b958d9f08
|
||||
state: "{{ states('climate.master_bedroom_aircon') not in ['off','unknown','unavailable'] and states('sensor.master_bedroom_aircon_power') | int > 20 }}"
|
||||
state: "{{ states('sensor.master_bedroom_aircon_power') | int > 20 }}"
|
||||
availability: "{{ states('climate.master_bedroom_aircon') not in ['unknown','unavailable'] }}"
|
||||
device_class: running
|
||||
- name: Kallen Fan - Separate Schedule
|
||||
unique_id: 3f243861-6a1f-412f-b9e3-933b54793b08
|
||||
@ -114,9 +118,9 @@ template:
|
||||
availability: "{{ states('climate.master_bedroom_aircon') not in ['unavailable','unknown'] }}"
|
||||
- name: "Master Bedroom Eco Mode"
|
||||
unique_id: edf36e23-adcf-4506-80eb-a14f4ea2fce0
|
||||
state: "{{ is_state_attr('climate.master_bedroom_aircon','preset_mode','eco') }}"
|
||||
state: "{{ is_state_attr('climate.master_bedroom_aircon','eco_mode',true) }}"
|
||||
icon: >-
|
||||
{% if is_state_attr('climate.master_bedroom_aircon','preset_mode','eco') %}
|
||||
{% if is_state_attr('climate.master_bedroom_aircon','eco_mode',true) %}
|
||||
mdi:home-lightning-bolt
|
||||
{% else %}
|
||||
mdi:home-lightning-bolt-outline
|
||||
@ -138,6 +142,36 @@ template:
|
||||
mdi:fan-off
|
||||
{% endif %}
|
||||
availability: "{{ states('climate.master_bedroom_aircon') not in ['unavailable','unknown'] }}"
|
||||
- name: "Emma Bedroom Target Temp"
|
||||
unique_id: b81152a1-d4d9-4e3e-8a78-6039de2884ad
|
||||
state: "{{ state_attr('climate.emma_bedroom_aircon','temperature') | float }}"
|
||||
availability: "{{ states('climate.emma_bedroom_aircon') not in ['unavailable','unknown'] }}"
|
||||
- name: "Emma Bedroom Eco Mode"
|
||||
unique_id: 4b6fc8fc-4152-4d8b-ad8d-80f97fcabe44
|
||||
state: "{{ is_state_attr('climate.emma_bedroom_aircon','eco_mode',true) }}"
|
||||
icon: >-
|
||||
{% if is_state_attr('climate.emma_bedroom_aircon','eco_mode',true) %}
|
||||
mdi:home-lightning-bolt
|
||||
{% else %}
|
||||
mdi:home-lightning-bolt-outline
|
||||
{% endif %}
|
||||
availability: "{{ states('climate.emma_bedroom_aircon') not in ['unavailable','unknown'] }}"
|
||||
- name: "Emma Bedroom Aircon Fan Mode"
|
||||
unique_id: d678eb2e-be5b-4626-913d-fc1e32941ead
|
||||
state: "{{ state_attr('climate.emma_bedroom_aircon','fan_mode') }}"
|
||||
icon: >
|
||||
{% if is_state_attr('climate.emma_bedroom_aircon','fan_mode','Auto') %}
|
||||
mdi:fan-auto
|
||||
{% elif is_state_attr('climate.emma_bedroom_aircon','fan_mode','Low') %}
|
||||
mdi:fan-speed-1
|
||||
{% elif is_state_attr('climate.emma_bedroom_aircon','fan_mode','Medium') %}
|
||||
mdi:fan-speed-2
|
||||
{% elif is_state_attr('climate.emma_bedroom_aircon','fan_mode','High') %}
|
||||
mdi:fan-speed-3
|
||||
{% else %}
|
||||
mdi:fan-off
|
||||
{% endif %}
|
||||
availability: "{{ states('climate.emma_bedroom_aircon') not in ['unavailable','unknown'] }}"
|
||||
- name: Living Room Average Temperature
|
||||
unique_id: c4a901a6-87e2-4257-b60b-2944be8fdf04
|
||||
state: >
|
||||
@ -183,16 +217,17 @@ input_boolean:
|
||||
master_bedroom_climate_protocol:
|
||||
name: Master Bedroom Climate Protocol
|
||||
icon: mdi:lightbulb-night
|
||||
emma_bedroom_climate_protocol:
|
||||
name: Emma Bedroom Climate Protocol
|
||||
icon: mdi:lightbulb-night
|
||||
kallen_bedtime_protocol:
|
||||
name: Kallen Bedtime Protocol
|
||||
icon: mdi:lightbulb-night
|
||||
|
||||
# Turn on when master bedroom air conditioner is installed, turn off in winter when we take it out, for smarter automations
|
||||
# Turn on when air conditioners are installed, turn off in winter when we take them out
|
||||
master_bedroom_aircon_installed:
|
||||
name: Master Bedroom Aircon Installed
|
||||
icon: mdi:tools
|
||||
|
||||
# Same thing, but for Emma's bedroom air conditioner
|
||||
emma_bedroom_aircon_installed:
|
||||
name: Emma Bedroom Aircon Installed
|
||||
icon: mdi:tools
|
||||
@ -201,6 +236,9 @@ input_boolean:
|
||||
master_bedroom_cooling_on:
|
||||
name: Master Bedroom Cooling On
|
||||
icon: mdi:snowflake
|
||||
emma_bedroom_cooling_on:
|
||||
name: Emma Bedroom Cooling On
|
||||
icon: mdi:snowflake
|
||||
|
||||
# Activated if the day will be excessively hot. For use with automations for daytime climate control.
|
||||
hot_day:
|
||||
@ -243,6 +281,7 @@ input_select:
|
||||
name: Scheduled Climate Mode - Emma Bedroom
|
||||
options:
|
||||
- AC
|
||||
- Fan
|
||||
- Heat
|
||||
- White Noise
|
||||
- N/A
|
||||
@ -305,13 +344,55 @@ input_number:
|
||||
step: 1
|
||||
unit_of_measurement: °F
|
||||
icon: mdi:thermometer
|
||||
emma_aircon_threshold:
|
||||
name: Emma Aircon Threshold
|
||||
emma_bedroom_daytime_temp:
|
||||
name: Emma Bedroom Daytime Temp
|
||||
min: 65
|
||||
max: 80
|
||||
step: 1
|
||||
unit_of_measurement: °F
|
||||
icon: mdi:thermometer
|
||||
emma_bedroom_night_temp:
|
||||
name: Emma Bedroom Night Temp
|
||||
min: 65
|
||||
max: 80
|
||||
step: 1
|
||||
unit_of_measurement: °F
|
||||
icon: mdi:thermometer
|
||||
emma_bedroom_bedtime_temp:
|
||||
name: Emma Bedroom Bedtime Temp
|
||||
min: 65
|
||||
max: 80
|
||||
step: 1
|
||||
unit_of_measurement: °F
|
||||
icon: mdi:thermometer
|
||||
emma_bedroom_aircon_run_threshold:
|
||||
name: Emma Bedroom Aircon Run Threshold
|
||||
min: 40
|
||||
max: 80
|
||||
step: 1
|
||||
unit_of_measurement: °F
|
||||
icon: mdi:thermometer
|
||||
emma_bedroom_aircon_mode_threshold:
|
||||
name: Emma Bedroom Aircon Mode Threshold
|
||||
min: 40
|
||||
max: 80
|
||||
step: 1
|
||||
unit_of_measurement: °F
|
||||
icon: mdi:thermometer
|
||||
emma_bedroom_fan_threshold:
|
||||
name: Emma Bedroom Fan Threshold
|
||||
min: 30
|
||||
max: 70
|
||||
step: 1
|
||||
unit_of_measurement: °F
|
||||
icon: mdi:thermometer
|
||||
emma_bedroom_auto_cooling_threshold:
|
||||
name: Emma Bedroom Auto Cooling Threshold
|
||||
min: 70
|
||||
max: 90
|
||||
step: 1
|
||||
unit_of_measurement: °F
|
||||
icon: mdi:thermometer
|
||||
kallen_fan_threshold:
|
||||
name: Kallen Fan Threshold
|
||||
min: 40
|
||||
|
@ -257,6 +257,9 @@ automation:
|
||||
time: >
|
||||
{% from 'time.jinja' import current_time %}
|
||||
{{ current_time('time',24) }}
|
||||
- service: input_boolean.turn_off
|
||||
target:
|
||||
entity_id: input_boolean.emma_awake
|
||||
- conditions:
|
||||
- condition: trigger
|
||||
id: bedtime-timer-finished
|
||||
@ -281,6 +284,9 @@ automation:
|
||||
datetime: >
|
||||
{% from 'time.jinja' import current_time %}
|
||||
{{ current_time('time',24) }}
|
||||
- service: input_boolean.turn_off
|
||||
target:
|
||||
entity_id: input_boolean.emma_awake
|
||||
|
||||
- id: e59f638a-519f-4619-bf7d-b13251b3a374
|
||||
alias: Emma Meds Handler
|
||||
@ -804,16 +810,11 @@ script:
|
||||
datetime: >
|
||||
{% from 'time.jinja' import set_datetime %}
|
||||
{{ set_datetime(0,5) }}
|
||||
- if:
|
||||
- condition: state
|
||||
entity_id: binary_sensor.basement_occupied
|
||||
state: 'on'
|
||||
then:
|
||||
- service: script.speech_engine
|
||||
data:
|
||||
who: basement
|
||||
type: normal
|
||||
message: Emma has awoken, so it is time to make your way upstairs now
|
||||
- service: script.speech_engine
|
||||
data:
|
||||
who: common
|
||||
type: normal
|
||||
message: Emma has awoken, so it is time to make your way upstairs now
|
||||
- service: input_datetime.set_datetime
|
||||
target:
|
||||
entity_id: input_datetime.emma_awake_at
|
||||
@ -898,26 +899,3 @@ script:
|
||||
- service: input_boolean.turn_off
|
||||
target:
|
||||
entity_id: input_boolean.white_noise_emma_bedroom
|
||||
- if:
|
||||
- condition: state
|
||||
entity_id: fan.emma_air_conditioner
|
||||
state: 'on'
|
||||
then:
|
||||
- service: script.turn_on
|
||||
target:
|
||||
entity_id: script.emma_aircon_shutoff
|
||||
|
||||
emma_aircon_shutoff:
|
||||
alias: 'Emma Air Conditioner Shutoff'
|
||||
mode: restart
|
||||
description: 'Attempt to shut off air conditioner after compressor stops running'
|
||||
sequence:
|
||||
- wait_template: "{{ is_state('binary_sensor.emma_aircon_compressor','off') }}"
|
||||
timeout:
|
||||
minutes: 15
|
||||
continue_on_timeout: true
|
||||
- delay:
|
||||
seconds: 5
|
||||
- service: fan.turn_off
|
||||
target:
|
||||
entity_id: fan.emma_air_conditioner
|
@ -1,101 +1,3 @@
|
||||
scrape:
|
||||
- resource: https://www.gasbuddy.com/station/59010
|
||||
sensor:
|
||||
- name: South Side Shell
|
||||
unique_id: b3385058-173c-4446-9f0f-3a45f21715d8
|
||||
select: &selector "#root > div > div.Page-module__content___196kn.Page-module__padded___3hQ0U > div > div > div:nth-child(2) > div.grid__column___nhz7X.grid__desktop10___2T18R > div:nth-child(1) > div.grid__column___nhz7X.grid__desktop8___38Y4U > div:nth-child(3) > div > div.GasPriceCollection-module__collectionContainer___29Ngz > div:nth-child(2) > div:nth-child(1) > span"
|
||||
device_class: monetary
|
||||
value_template: '{{ value | replace("$", "") | float }}'
|
||||
icon: mdi:gas-station
|
||||
- resource: https://www.gasbuddy.com/station/59007
|
||||
sensor:
|
||||
- name: Circle K
|
||||
unique_id: 63d947bc-486a-478e-9fbe-7fb2f38a1e1e
|
||||
select: *selector
|
||||
device_class: monetary
|
||||
value_template: '{{ value | replace("$", "") | float }}'
|
||||
icon: mdi:gas-station
|
||||
- resource: https://www.gasbuddy.com/station/123478
|
||||
sensor:
|
||||
- name: Kroger
|
||||
unique_id: b705d912-8ef4-4e55-9168-d7e152773ba0
|
||||
select: *selector
|
||||
device_class: monetary
|
||||
value_template: '{{ value | replace("$", "") | float }}'
|
||||
icon: mdi:gas-station
|
||||
- resource: https://www.gasbuddy.com/station/59014
|
||||
sensor:
|
||||
- name: Kecks
|
||||
unique_id: 4fa4a7bb-45b1-4d17-ab92-06ebd6a39ebb
|
||||
select: *selector
|
||||
device_class: monetary
|
||||
value_template: '{{ value | replace("$", "") | float }}'
|
||||
icon: mdi:gas-station
|
||||
- resource: https://www.gasbuddy.com/station/59006
|
||||
sensor:
|
||||
- name: The Barn
|
||||
unique_id: 51137245-9c4a-4992-aa7c-19cd38bd614d
|
||||
select: *selector
|
||||
device_class: monetary
|
||||
value_template: '{{ value | replace("$", "") | float }}'
|
||||
icon: mdi:gas-station
|
||||
- resource: https://www.gasbuddy.com/station/59016
|
||||
sensor:
|
||||
- name: The Big Fish
|
||||
unique_id: d5e057d5-3f7b-4c6b-ad0c-5e6ffa10b861
|
||||
select: *selector
|
||||
device_class: monetary
|
||||
value_template: '{{ value | replace("$", "") | float }}'
|
||||
icon: mdi:gas-station
|
||||
- resource: https://www.gasbuddy.com/station/107803
|
||||
sensor:
|
||||
- name: Marathon Cleveland Avenue
|
||||
unique_id: 3ef9c1d0-46b0-4850-8df2-d478c833aa4d
|
||||
select: *selector
|
||||
device_class: monetary
|
||||
value_template: '{{ value | replace("$", "") | float }}'
|
||||
icon: mdi:gas-station
|
||||
- resource: https://www.gasbuddy.com/station/59013
|
||||
sensor:
|
||||
- name: Speedway
|
||||
unique_id: 44484541-1a71-4e36-9e81-486eea3882cc
|
||||
select: *selector
|
||||
device_class: monetary
|
||||
value_template: '{{ value | replace("$", "") | float }}'
|
||||
icon: mdi:gas-station
|
||||
- resource: https://www.gasbuddy.com/station/59009
|
||||
sensor:
|
||||
- name: Meijer
|
||||
unique_id: dc687fd2-ed4d-4fae-a2b8-38ae7a944a68
|
||||
select: *selector
|
||||
device_class: monetary
|
||||
value_template: '{{ value | replace("$", "") | float }}'
|
||||
icon: mdi:gas-station
|
||||
- resource: https://www.gasbuddy.com/station/59012
|
||||
sensor:
|
||||
- name: East Side Shell
|
||||
unique_id: db36f6b4-6f87-48af-a339-1f8e8bbc95e3
|
||||
select: *selector
|
||||
device_class: monetary
|
||||
value_template: '{{ value | replace("$", "") | float }}'
|
||||
icon: mdi:gas-station
|
||||
- resource: https://www.gasbuddy.com/station/59011
|
||||
sensor:
|
||||
- name: Shell Ottawa Avenue
|
||||
unique_id: d9508ad6-4298-4262-bac9-931a3bc510df
|
||||
select: *selector
|
||||
device_class: monetary
|
||||
value_template: '{{ value | replace("$", "") | float }}'
|
||||
icon: mdi:gas-station
|
||||
- resource: https://www.gasbuddy.com/station/71535
|
||||
sensor:
|
||||
- name: Ridis
|
||||
unique_id: 9db2cbc3-39ea-4471-9541-64aa7aa8de71
|
||||
select: *selector
|
||||
device_class: monetary
|
||||
value_template: '{{ value | replace("$", "") | float }}'
|
||||
icon: mdi:gas-station
|
||||
|
||||
sensor:
|
||||
- platform: statistics
|
||||
unique_id: fcf4e80e-8459-4e23-a94f-5f127b628c20
|
||||
|
@ -31,8 +31,7 @@ tts:
|
||||
region_name: 'us-east-1'
|
||||
text_type: ssml
|
||||
voice: Joanna
|
||||
cache: true
|
||||
engine: neural
|
||||
engine: generative
|
||||
|
||||
conversation:
|
||||
|
||||
|
@ -32,9 +32,6 @@ input_boolean:
|
||||
give_me_darkness:
|
||||
name: Give Me Darkness
|
||||
icon: mdi:weather-night
|
||||
tina_desk_lights:
|
||||
name: Tina Desk Lights
|
||||
icon: mdi:desk
|
||||
holiday_mode_hold:
|
||||
name: Holiday Mode Hold
|
||||
icon: mdi:party-popper
|
||||
@ -492,6 +489,7 @@ input_select:
|
||||
- Evening Mode
|
||||
- Night Mode
|
||||
- Bright Mode
|
||||
- Reading Mode
|
||||
- Reset
|
||||
initial: Select
|
||||
icon: mdi:desk
|
||||
@ -656,6 +654,21 @@ template:
|
||||
{% endif %}
|
||||
device_class: problem
|
||||
delay_on: "00:00:10"
|
||||
- name: Light Switch Issue
|
||||
unique_id: 381e8038-ea96-474c-92ec-d1296dc1369e
|
||||
state: >
|
||||
{% set lights = states.light.upstairs_bathroom_lights,
|
||||
states.light.hallway_overhead,
|
||||
states.light.downstairs_bathroom_lights %}
|
||||
{% set issues = lights | selectattr('state','eq','unavailable') | list | count %}
|
||||
{{ issues > 0 }}
|
||||
attributes:
|
||||
issues: >
|
||||
{% set lights = states.light.upstairs_bathroom_lights,
|
||||
states.light.hallway_overhead,
|
||||
states.light.downstairs_bathroom_lights %}
|
||||
{% set ids = lights | selectattr('state','eq','unavailable') | map(attribute='attributes.friendly_name') | list %}
|
||||
{{ ids | join(', ') }}
|
||||
- sensor:
|
||||
- name: "Basement Studio Lights - Brightness Actual"
|
||||
unique_id: dee4dc84-a6a0-4150-903e-5b8bd436d962
|
||||
@ -819,7 +832,6 @@ switch:
|
||||
- light.living_room_color_3
|
||||
- light.tina_lamp_top
|
||||
- light.tina_lamp_side
|
||||
- light.tina_desk_strip
|
||||
colors:
|
||||
- color_type: rgb_color
|
||||
color: [255,0,0]
|
||||
|
@ -198,6 +198,57 @@ input_number:
|
||||
step: 0.05
|
||||
icon: mdi:knob
|
||||
|
||||
template:
|
||||
- sensor:
|
||||
- name: "Basement Echo Dot Volume"
|
||||
state: >
|
||||
{% if is_state('input_boolean.give_me_darkness','on') %}
|
||||
{{ states('input_number.basement_echo_dot_night_volume') }}
|
||||
{% else %}
|
||||
{{ states('input_number.basement_echo_dot_day_volume') }}
|
||||
{% endif %}
|
||||
icon: mdi:volume-high
|
||||
- name: "Basement Google Speaker Volume"
|
||||
state: >
|
||||
{% if is_state('input_boolean.give_me_darkness','on') %}
|
||||
{{ states('input_number.basement_google_speaker_night_volume') }}
|
||||
{% else %}
|
||||
{{ states('input_number.basement_google_speaker_day_volume') }}
|
||||
{% endif %}
|
||||
icon: mdi:volume-high
|
||||
- name: "Living Room Echo Dot Volume"
|
||||
state: >
|
||||
{% if is_state('input_boolean.give_me_darkness','on') %}
|
||||
{{ states('input_number.living_room_echo_dot_night_volume') }}
|
||||
{% else %}
|
||||
{{ states('input_number.living_room_echo_dot_day_volume') }}
|
||||
{% endif %}
|
||||
icon: mdi:volume-high
|
||||
- name: "Master Bedroom Echo Dot Volume"
|
||||
state: >
|
||||
{% if is_state('input_boolean.give_me_darkness','on') or is_state('binary_sensor.people_sleeping','on') %}
|
||||
{{ states('input_number.master_bedroom_echo_dot_night_volume') }}
|
||||
{% else %}
|
||||
{{ states('input_number.master_bedroom_echo_dot_day_volume') }}
|
||||
{% endif %}
|
||||
icon: mdi:volume-high
|
||||
- name: "Kallen Bedroom Google Speaker Volume"
|
||||
state: >
|
||||
{% if is_state('input_boolean.give_me_darkness','on') or is_state('input_boolean.kallen_sleeping','on') %}
|
||||
{{ states('input_number.kallen_bedroom_google_speaker_night_volume') }}
|
||||
{% else %}
|
||||
{{ states('input_number.kallen_bedroom_google_speaker_day_volume') }}
|
||||
{% endif %}
|
||||
icon: mdi:volume-high
|
||||
- name: "Emma Bedroom Google Speaker Volume"
|
||||
state: >
|
||||
{% if is_state('input_boolean.give_me_darkness','on') or is_state('input_boolean.emma_sleeping','on') %}
|
||||
{{ states('input_number.emma_bedroom_google_speaker_night_volume') }}
|
||||
{% else %}
|
||||
{{ states('input_number.emma_bedroom_google_speaker_day_volume') }}
|
||||
{% endif %}
|
||||
icon: mdi:volume-high
|
||||
|
||||
# Amazon Polly Sensors to see last message and location of audible notification
|
||||
mqtt:
|
||||
sensor:
|
||||
@ -325,24 +376,14 @@ script:
|
||||
- condition: template
|
||||
value_template: >
|
||||
{% set current = state_attr('media_player.basement_echo_dot','volume_level') | float %}
|
||||
{% set night = states('input_number.basement_echo_dot_night_volume') | float %}
|
||||
{% set day = states('input_number.basement_echo_dot_day_volume') | float %}
|
||||
{% if is_state('input_boolean.give_me_darkness','on') %}
|
||||
{{ current != night }}
|
||||
{% else %}
|
||||
{{ current != day }}
|
||||
{% endif %}
|
||||
{% set expected = states('sensor.basement_echo_dot_volume') | float %}
|
||||
{{ current != expected }}
|
||||
then:
|
||||
- service: media_player.volume_set
|
||||
target:
|
||||
entity_id: media_player.basement_echo_dot
|
||||
data:
|
||||
volume_level: >
|
||||
{% if is_state('input_boolean.give_me_darkness','on') %}
|
||||
{{ states('input_number.basement_echo_dot_night_volume') }}
|
||||
{% else %}
|
||||
{{ states('input_number.basement_echo_dot_day_volume') }}
|
||||
{% endif %}
|
||||
volume_level: "{{ states('sensor.basement_echo_dot_volume') }}"
|
||||
# Basement Google Speaker
|
||||
- if:
|
||||
- condition: and
|
||||
@ -373,24 +414,14 @@ script:
|
||||
- condition: template
|
||||
value_template: >
|
||||
{% set current = state_attr('media_player.basement_google_speaker','volume_level') | float %}
|
||||
{% set night = states('input_number.basement_google_speaker_night_volume') | float %}
|
||||
{% set day = states('input_number.basement_google_speaker_day_volume') | float %}
|
||||
{% if is_state('input_boolean.give_me_darkness','on') %}
|
||||
{{ current != night }}
|
||||
{% else %}
|
||||
{{ current != day }}
|
||||
{% endif %}
|
||||
{% set expected = states('sensor.basement_google_speaker_volume') | float %}
|
||||
{{ current != expected }}
|
||||
then:
|
||||
- service: media_player.volume_set
|
||||
target:
|
||||
entity_id: media_player.basement_google_speaker
|
||||
data:
|
||||
volume_level: >
|
||||
{% if is_state('input_boolean.give_me_darkness','on') %}
|
||||
{{ states('input_number.basement_google_speaker_night_volume') }}
|
||||
{% else %}
|
||||
{{ states('input_number.basement_google_speaker_day_volume') }}
|
||||
{% endif %}
|
||||
volume_level: "{{ states('sensor.basement_google_speaker_volume') }}"
|
||||
- service: media_player.volume_mute
|
||||
target:
|
||||
entity_id: media_player.basement_google_speaker
|
||||
@ -405,24 +436,14 @@ script:
|
||||
- condition: template
|
||||
value_template: >
|
||||
{% set current = state_attr('media_player.living_room_echo_dot','volume_level') | float %}
|
||||
{% set night = states('input_number.living_room_echo_dot_night_volume') | float %}
|
||||
{% set day = states('input_number.living_room_echo_dot_day_volume') | float %}
|
||||
{% if is_state('input_boolean.give_me_darkness','on') %}
|
||||
{{ current != night }}
|
||||
{% else %}
|
||||
{{ current != day }}
|
||||
{% endif %}
|
||||
{% set expected = states('sensor.living_room_echo_dot_volume') | float %}
|
||||
{{ current != expected }}
|
||||
then:
|
||||
- service: media_player.volume_set
|
||||
target:
|
||||
entity_id: media_player.living_room_echo_dot
|
||||
data:
|
||||
volume_level: >
|
||||
{% if is_state('input_boolean.give_me_darkness','on') %}
|
||||
{{ states('input_number.living_room_echo_dot_night_volume') }}
|
||||
{% else %}
|
||||
{{ states('input_number.living_room_echo_dot_day_volume') }}
|
||||
{% endif %}
|
||||
volume_level: "{{ states('sensor.living_room_echo_dot_volume') }}"
|
||||
# Master Bedroom Echo Dot
|
||||
- if:
|
||||
- condition: state
|
||||
@ -435,24 +456,14 @@ script:
|
||||
- condition: template
|
||||
value_template: >
|
||||
{% set current = state_attr('media_player.master_bedroom_echo_dot','volume_level') | float %}
|
||||
{% set night = states('input_number.master_bedroom_echo_dot_night_volume') | float %}
|
||||
{% set day = states('input_number.master_bedroom_echo_dot_day_volume') | float %}
|
||||
{% if is_state('input_boolean.give_me_darkness','on') %}
|
||||
{{ current != night }}
|
||||
{% else %}
|
||||
{{ current != day }}
|
||||
{% endif %}
|
||||
{% set expected = states('sensor.master_bedroom_echo_dot_volume') | float %}
|
||||
{{ current != expected }}
|
||||
then:
|
||||
- service: media_player.volume_set
|
||||
target:
|
||||
entity_id: media_player.master_bedroom_echo_dot
|
||||
data:
|
||||
volume_level: >
|
||||
{% if is_state('input_boolean.give_me_darkness','on') %}
|
||||
{{ states('input_number.master_bedroom_echo_dot_night_volume') }}
|
||||
{% else %}
|
||||
{{ states('input_number.master_bedroom_echo_dot_day_volume') }}
|
||||
{% endif %}
|
||||
volume_level: "{{ states('sensor.master_bedroom_echo_dot_volume') }}"
|
||||
# Kallen Bedroom Speaker
|
||||
- if:
|
||||
- condition: and
|
||||
@ -483,24 +494,14 @@ script:
|
||||
- condition: template
|
||||
value_template: >
|
||||
{% set current = state_attr('media_player.kallen_bedroom_google_speaker','volume_level') | float %}
|
||||
{% set night = states('input_number.kallen_bedroom_google_speaker_night_volume') | float %}
|
||||
{% set day = states('input_number.kallen_bedroom_google_speaker_day_volume') | float %}
|
||||
{% if is_state('input_boolean.give_me_darkness','on') %}
|
||||
{{ current != night }}
|
||||
{% else %}
|
||||
{{ current != day }}
|
||||
{% endif %}
|
||||
{% set expected = states('sensor.kallen_bedroom_google_speaker_volume') | float %}
|
||||
{{ current != expected }}
|
||||
then:
|
||||
- service: media_player.volume_set
|
||||
target:
|
||||
entity_id: media_player.kallen_bedroom_google_speaker
|
||||
data:
|
||||
volume_level: >
|
||||
{% if is_state('input_boolean.give_me_darkness','on') %}
|
||||
{{ states('input_number.kallen_bedroom_google_speaker_night_volume') }}
|
||||
{% else %}
|
||||
{{ states('input_number.kallen_bedroom_google_speaker_day_volume') }}
|
||||
{% endif %}
|
||||
volume_level: "{{ states('sensor.kallen_bedroom_google_speaker_volume') }}"
|
||||
- service: media_player.volume_mute
|
||||
target:
|
||||
entity_id: media_player.kallen_bedroom_google_speaker
|
||||
@ -536,24 +537,14 @@ script:
|
||||
- condition: template
|
||||
value_template: >
|
||||
{% set current = state_attr('media_player.emma_bedroom_google_speaker','volume_level') | float %}
|
||||
{% set night = states('input_number.emma_bedroom_google_speaker_night_volume') | float %}
|
||||
{% set day = states('input_number.emma_bedroom_google_speaker_day_volume') | float %}
|
||||
{% if is_state('input_boolean.give_me_darkness','on') %}
|
||||
{{ current != night }}
|
||||
{% else %}
|
||||
{{ current != day }}
|
||||
{% endif %}
|
||||
{% set expected = states('sensor.emma_bedroom_google_speaker_volume') | float %}
|
||||
{{ current != expected }}
|
||||
then:
|
||||
- service: media_player.volume_set
|
||||
target:
|
||||
entity_id: media_player.emma_bedroom_google_speaker
|
||||
data:
|
||||
volume_level: >
|
||||
{% if is_state('input_boolean.give_me_darkness','on') %}
|
||||
{{ states('input_number.emma_bedroom_google_speaker_night_volume') }}
|
||||
{% else %}
|
||||
{{ states('input_number.emma_bedroom_google_speaker_day_volume') }}
|
||||
{% endif %}
|
||||
volume_level: "{{ states('sensor.kallen_bedroom_google_speaker_volume') }}"
|
||||
- service: media_player.volume_mute
|
||||
target:
|
||||
entity_id: media_player.emma_bedroom_google_speaker
|
||||
@ -1237,11 +1228,9 @@ script:
|
||||
data:
|
||||
message: >
|
||||
<voice name="{{ voice }}">
|
||||
<amazon:auto-breaths>
|
||||
<prosody rate="fast">
|
||||
{{ message }}
|
||||
</prosody>
|
||||
</amazon:auto-breaths>
|
||||
</voice>
|
||||
target: >
|
||||
{% if who in ['living_room_echo_dot', 'media_player.living_room_echo_dot','living_room'] %}
|
||||
@ -1328,53 +1317,34 @@ script:
|
||||
media_player.basement_google_speaker
|
||||
{% endif %}
|
||||
volume_level: >-
|
||||
{% set numbers_night = [
|
||||
states.input_number.emma_bedroom_google_speaker_night_volume.state,
|
||||
states.input_number.kallen_bedroom_google_speaker_night_volume.state
|
||||
{% set numbers = [
|
||||
states.sensor.emma_bedroom_google_speaker_volume.state,
|
||||
states.sensor.kallen_bedroom_google_speaker_volume.state
|
||||
] %}
|
||||
{% set numbers_day = [
|
||||
states.input_number.emma_bedroom_google_speaker_day_volume.state,
|
||||
states.input_number.kallen_bedroom_google_speaker_day_volume.state
|
||||
] %}
|
||||
{% set kidsgroup_night = numbers_night | list | min | float %}
|
||||
{% set kidsgroup_day = numbers_day | list | max | float %}
|
||||
{% set kidsgroup = numbers | list | min | float %}
|
||||
{% if type in ['critical'] %}
|
||||
1.0
|
||||
{% elif is_state('input_boolean.give_me_darkness','on') %}
|
||||
{% if who in ['Everywhere','everywhere','kids_bedrooms','all_bedrooms'] %}
|
||||
{% if is_state('input_boolean.emma_sleeping','on') and is_state('input_boolean.kallen_sleeping','off') %}
|
||||
{{ states('input_number.kallen_bedroom_google_speaker_night_volume') }}
|
||||
{% elif is_state('input_boolean.kallen_sleeping','on') and is_state('input_boolean.emma_sleeping','off') %}
|
||||
{{ states('input_number.emma_bedroom_google_speaker_night_volume') }}
|
||||
{% else %}
|
||||
{{ kidsgroup_night }}
|
||||
{% endif %}
|
||||
{% elif who in ['kallen_bedroom','media_player.kallen_bedroom_google_speaker'] %}
|
||||
{{ states('input_number.kallen_bedroom_google_speaker_night_volume') }}
|
||||
{% elif who in ['emma_bedroom','media_player.emma_bedroom_google_speaker'] %}
|
||||
{{ states('input_number.emma_bedroom_google_speaker_night_volume') }}
|
||||
{% elif who in ['Basement Google','basement_google'] %}
|
||||
{{ states('input_number.basement_google_speaker_night_volume') }}
|
||||
{% else %}
|
||||
0.3
|
||||
{% endif %}
|
||||
{% else %}
|
||||
{% if who in ['Everywhere','everywhere','kids_bedrooms','all_bedrooms'] %}
|
||||
{% if is_state('input_boolean.emma_sleeping','on') and is_state('input_boolean.kallen_sleeping','off') %}
|
||||
{{ states('input_number.kallen_bedroom_google_speaker_day_volume') }}
|
||||
{{ states('sensor.kallen_bedroom_google_speaker_volume') }}
|
||||
{% elif is_state('input_boolean.kallen_sleeping','on') and is_state('input_boolean.emma_sleeping','off') %}
|
||||
{{ states('input_number.emma_bedroom_google_speaker_day_volume') }}
|
||||
{{ states('sensor.emma_bedroom_google_speaker_volume') }}
|
||||
{% else %}
|
||||
{{ kidsgroup_day }}
|
||||
{{ kidsgroup }}
|
||||
{% endif %}
|
||||
{% elif who in ['kallen_bedroom','media_player.kallen_bedroom_google_speaker'] %}
|
||||
{{ states('input_number.kallen_bedroom_google_speaker_day_volume') }}
|
||||
{{ states('sensor.kallen_bedroom_google_speaker_volume') }}
|
||||
{% elif who in ['emma_bedroom','media_player.emma_bedroom_google_speaker'] %}
|
||||
{{ states('input_number.emma_bedroom_google_speaker_day_volume') }}
|
||||
{{ states('sensor.emma_bedroom_google_speaker_volume') }}
|
||||
{% elif who in ['Basement Google','basement_google'] %}
|
||||
{{ states('input_number.basement_google_speaker_day_volume') }}
|
||||
{{ states('sensor.basement_google_speaker_volume') }}
|
||||
{% else %}
|
||||
0.6
|
||||
{% if is_state('input_boolean.give_me_darkness','on') %}
|
||||
0.3
|
||||
{% else %}
|
||||
0.6
|
||||
{% endif %}
|
||||
{% endif %}
|
||||
{% endif %}
|
||||
- service: tts.amazon_polly_say
|
||||
|
@ -17,8 +17,8 @@ sensor:
|
||||
entity_id: switch.tina_desktop
|
||||
power_sensor_id: sensor.tina_desktop_power
|
||||
- platform: powercalc
|
||||
entity_id: fan.emma_air_conditioner
|
||||
power_sensor_id: sensor.emma_air_conditioner_power
|
||||
entity_id: switch.emma_bedroom_aircon
|
||||
power_sensor_id: sensor.emma_bedroom_aircon_power
|
||||
- platform: powercalc
|
||||
entity_id: switch.master_bedroom_aircon
|
||||
power_sensor_id: sensor.master_bedroom_aircon_power
|
||||
|
@ -124,6 +124,8 @@ template:
|
||||
state: >
|
||||
{% if is_state('binary_sensor.basement_studio_motion','on') %}
|
||||
true
|
||||
{% elif is_state('sensor.xia_desktop_current_username','tm24f') %}
|
||||
false
|
||||
{% elif is_state('binary_sensor.tony_desktop_on','off') and
|
||||
is_state('binary_sensor.kallen_desktop_on','off') %}
|
||||
false
|
||||
@ -405,7 +407,6 @@ automation:
|
||||
# - light.living_room_led_strip
|
||||
# - light.tina_lamp_top
|
||||
# - light.tina_lamp_side
|
||||
# - light.tina_desk_strip
|
||||
# - alias: "Save Current Adaptive State"
|
||||
# service: scene.create
|
||||
# data:
|
||||
@ -425,7 +426,6 @@ automation:
|
||||
# entity_id:
|
||||
# - light.living_room_lights
|
||||
# - light.tina_lamp
|
||||
# - light.tina_desk_strip
|
||||
# - light.living_room_led_strip
|
||||
# data:
|
||||
# color_name: green
|
||||
@ -613,7 +613,6 @@ automation:
|
||||
target:
|
||||
entity_id:
|
||||
- fan.kallen_bedroom_fan
|
||||
- fan.emma_air_conditioner
|
||||
- service: button.press
|
||||
target:
|
||||
entity_id: button.master_bedroom_climate_reset
|
||||
@ -865,9 +864,7 @@ script:
|
||||
- front_porch
|
||||
- living_room
|
||||
- mud_room
|
||||
- service: input_boolean.turn_on
|
||||
target:
|
||||
entity_id: input_boolean.tina_desk_lights
|
||||
- tina_desk
|
||||
- delay:
|
||||
hours: 0
|
||||
minutes: 0
|
||||
@ -925,9 +922,7 @@ script:
|
||||
area_id:
|
||||
- living_room
|
||||
- mud_room
|
||||
- service: input_boolean.turn_on
|
||||
target:
|
||||
entity_id: input_boolean.tina_desk_lights
|
||||
- tina_desk
|
||||
- delay:
|
||||
hours: 0
|
||||
minutes: 0
|
||||
|
@ -418,21 +418,14 @@ script:
|
||||
entity_id: input_datetime.daily_briefing
|
||||
data:
|
||||
time: >
|
||||
{% from 'time.jinja' import time_from_calendar %}
|
||||
{% if is_state('input_boolean.kallen_school_today','on') %}
|
||||
{% if is_state('input_boolean.kallen_alternate_pickup','on') or is_state('input_boolean.kallen_btb','on') %}
|
||||
15:30
|
||||
{% else %}
|
||||
{{ time_from_calendar('calendar.kallen_school_days','end_time','set','subtract',1) }}
|
||||
{% endif %}
|
||||
{% elif is_state('input_boolean.kallen_school_today','off') and is_state('input_boolean.work_today','off') %}
|
||||
15:30
|
||||
{% else %}
|
||||
{% if is_state('input_boolean.kallen_school_today','off') and is_state('input_boolean.work_today','on') %}
|
||||
{% if (state_attr('input_datetime.tina_workday_end','timestamp')) > 61200 %}
|
||||
16:00
|
||||
{% else %}
|
||||
{{ (state_attr('input_datetime.tina_workday_end', 'timestamp') + 3600) | timestamp_custom('%H:%M', false) }}
|
||||
{% endif %}
|
||||
{% else %}
|
||||
15:30
|
||||
{% endif %}
|
||||
- if:
|
||||
- condition: state
|
||||
@ -561,18 +554,7 @@ script:
|
||||
- service: input_datetime.set_datetime
|
||||
entity_id: input_datetime.master_bedroom_wakeup
|
||||
data:
|
||||
time: >
|
||||
{% if is_state('input_boolean.kallen_school_today','on') %}
|
||||
{% if is_state('input_boolean.kallen_alternate_pickup','on') or is_state('input_boolean.kallen_btb','on') %}
|
||||
16:30
|
||||
{% elif is_state('input_boolean.kallen_school_early_release','on') %}
|
||||
12:30
|
||||
{% else %}
|
||||
13:00
|
||||
{% endif %}
|
||||
{% else %}
|
||||
16:30
|
||||
{% endif %}
|
||||
time: "16:30"
|
||||
- delay:
|
||||
milliseconds: 500
|
||||
- service: input_datetime.set_datetime
|
||||
@ -750,11 +732,11 @@ script:
|
||||
{% set low = states('sensor.overnight_lowest_temperature') | int %}
|
||||
{% set bedtime = state_attr('input_datetime.emma_bedtime','timestamp') | int %}
|
||||
{% if is_state('input_boolean.hot_day','on') %}
|
||||
{{ (bedtime - 7200) | timestamp_custom('%H:%M',false) }}
|
||||
{% elif high >= 80 or low >= 60 %}
|
||||
{{ (bedtime - 5400) | timestamp_custom('%H:%M',false) }}
|
||||
{% else %}
|
||||
{% elif high >= 80 or low >= 60 %}
|
||||
{{ (bedtime - 3600) | timestamp_custom('%H:%M',false) }}
|
||||
{% else %}
|
||||
{{ (bedtime - 1800) | timestamp_custom('%H:%M',false) }}
|
||||
{% endif %}
|
||||
- service: input_boolean.turn_on
|
||||
target:
|
||||
@ -773,16 +755,16 @@ script:
|
||||
{% if ct > state_attr('input_datetime.kallen_school_day_start','timestamp') %}
|
||||
{{ (state_attr('input_datetime.tina_workday_start','timestamp') - 1800) | timestamp_custom('%H:%M', false) }}
|
||||
{% elif ct > state_attr('input_datetime.tina_workday_start','timestamp') and ct < state_attr('input_datetime.kallen_school_day_start','timestamp') %}
|
||||
{{ (state_attr('input_datetime.kallen_school_day_start','timestamp') - 3600) | timestamp_custom('%H:%M', false) }}
|
||||
{{ (state_attr('input_datetime.kallen_school_day_start','timestamp') - 3900) | timestamp_custom('%H:%M', false) }}
|
||||
{% elif state_attr('input_datetime.tina_workday_start','timestamp') < (state_attr('input_datetime.kallen_school_day_start','timestamp')) %}
|
||||
{{ (state_attr('input_datetime.tina_workday_start','timestamp') - 1800) | timestamp_custom('%H:%M', false) }}
|
||||
{% else %}
|
||||
{{ (state_attr('input_datetime.kallen_school_day_start','timestamp') - 3600) | timestamp_custom('%H:%M', false) }}
|
||||
{{ (state_attr('input_datetime.kallen_school_day_start','timestamp') - 3900) | timestamp_custom('%H:%M', false) }}
|
||||
{% endif %}
|
||||
{% elif is_state('input_boolean.work_today','on') and is_state('input_boolean.kallen_school_today','off') %}
|
||||
{{ (state_attr('input_datetime.tina_workday_start', 'timestamp') - 1800) | timestamp_custom('%H:%M', false) }}
|
||||
{% elif is_state('input_boolean.kallen_school_today','on') %}
|
||||
{{ (state_attr('input_datetime.kallen_school_day_start','timestamp') - 3600) | timestamp_custom('%H:%M', false) }}
|
||||
{{ (state_attr('input_datetime.kallen_school_day_start','timestamp') - 3900) | timestamp_custom('%H:%M', false) }}
|
||||
{% else %}
|
||||
11:00
|
||||
{% endif %}
|
||||
|
@ -63,25 +63,25 @@ template:
|
||||
- binary_sensor:
|
||||
- name: Tony Desktop On
|
||||
unique_id: 82ce673a-96ad-4af5-a8d1-be9ca9fa9c36
|
||||
state: "{{ states('sensor.tony_desktop_power') | int > 10 }}"
|
||||
state: "{{ states('sensor.tony_desktop_power') | int > 25 }}"
|
||||
device_class: running
|
||||
attributes:
|
||||
power_usage: "{{ states('sensor.tony_desktop_power') | int }}W"
|
||||
- name: Tina Desktop On
|
||||
unique_id: 8484dbd4-2fae-4368-a4bc-d1bdc09e003f
|
||||
state: "{{ states('sensor.tina_desktop_power') | int > 10 }}"
|
||||
state: "{{ states('sensor.tina_desktop_power') | int > 25 }}"
|
||||
device_class: running
|
||||
attributes:
|
||||
power_usage: "{{ states('sensor.tina_desktop_power') | int }}W"
|
||||
- name: Kallen Desktop On
|
||||
unique_id: ccc25d75-4915-449d-9b2e-09ad14ffac29
|
||||
state: "{{ states('sensor.kallen_desktop_power') | int > 10 }}"
|
||||
state: "{{ states('sensor.kallen_desktop_power') | int > 25 }}"
|
||||
device_class: running
|
||||
attributes:
|
||||
power_usage: "{{ states('sensor.kallen_desktop_power') | int }}W"
|
||||
- name: Basement Server On
|
||||
unique_id: e6df7d98-d3ba-4e01-bae2-2ebafc8d78d6
|
||||
state: "{{ states('sensor.basement_server_power') | int > 10 }}"
|
||||
state: "{{ states('sensor.basement_server_power') | int > 25 }}"
|
||||
device_class: running
|
||||
attributes:
|
||||
power_usage: "{{ states('sensor.basement_server_power') | int }}W"
|
||||
|
@ -19,6 +19,18 @@ input_boolean:
|
||||
tina_night_meds_taken:
|
||||
name: Tina Night Meds Taken
|
||||
icon: mdi:medication
|
||||
tina_ibuprofen_active:
|
||||
name: Tina Ibuprofen Active
|
||||
icon: mdi:medication
|
||||
tina_ibuprofen_taken:
|
||||
name: Tina Ibuprofen Taken
|
||||
icon: mdi:medication
|
||||
tina_tylenol_active:
|
||||
name: Tina Tylenol Active
|
||||
icon: mdi:medication
|
||||
tina_tylenol_taken:
|
||||
name: Tina Tylenol Taken
|
||||
icon: mdi:medication
|
||||
tina_awake:
|
||||
name: Tina Awake
|
||||
icon: mdi:eye-check
|
||||
@ -54,6 +66,26 @@ input_datetime:
|
||||
has_date: true
|
||||
has_time: true
|
||||
icon: mdi:medication
|
||||
tina_ibuprofen_taken:
|
||||
name: Tina Ibuprofen Taken
|
||||
has_date: true
|
||||
has_time: true
|
||||
icon: mdi:medication
|
||||
tina_ibuprofen_notify:
|
||||
name: Tina Ibuprofen Notify
|
||||
has_date: true
|
||||
has_time: true
|
||||
icon: mdi:medication
|
||||
tina_tylenol_taken:
|
||||
name: Tina Tylenol Taken
|
||||
has_date: true
|
||||
has_time: true
|
||||
icon: mdi:medication
|
||||
tina_tylenol_notify:
|
||||
name: Tina Tylenol Notify
|
||||
has_date: true
|
||||
has_time: true
|
||||
icon: mdi:medication
|
||||
|
||||
automation:
|
||||
- id: cd9f921f-71c7-4e29-9aee-7421ef19bdd3
|
||||
|
@ -1617,7 +1617,6 @@ script:
|
||||
# snapshot_entities:
|
||||
# - light.tina_lamp_side
|
||||
# - light.tina_lamp_top
|
||||
# - light.tina_desk_strip
|
||||
# - switch.adaptive_lighting_living_room
|
||||
# - switch.adaptive_lighting_tina_lamp
|
||||
# - service: switch.turn_off
|
||||
@ -1631,7 +1630,6 @@ script:
|
||||
# entity_id:
|
||||
# - light.tina_lamp_side
|
||||
# - light.tina_lamp_top
|
||||
# - light.tina_desk_strip
|
||||
# data:
|
||||
# color_name: red
|
||||
# - service: script.living_room_lights_alert
|
||||
|
@ -57,6 +57,7 @@ ## HACS Components
|
||||
- [Powercalc](https://github.com/bramstroker/homeassistant-powercalc)
|
||||
- [Govee LAN Control](https://github.com/wez/govee-lan-hass)
|
||||
- [Discord Game](https://github.com/LordBoos/discord_game)
|
||||
- [Versatile Thermostat](https://github.com/jmcollin78/versatile_thermostat)
|
||||
|
||||
</details>
|
||||
|
||||
@ -67,7 +68,7 @@ ## HACS Lovelace Cards
|
||||
<details>
|
||||
<summary>Click here</summary>
|
||||
|
||||
- [Bubble Card](https://github.com/Clooos/Bubble-Card)
|
||||
- [Bubble Card](https://github.com/Clooos/Bubble-Card) Backbone of the new mobile dashboard
|
||||
- [Config Template Card](https://github.com/iantrich/config-template-card)
|
||||
- [Decluttering Card](https://github.com/custom-cards/decluttering-card)
|
||||
- [Card Tools](https://github.com/thomasloven/lovelace-card-tools) (required for various other cards)
|
||||
@ -86,7 +87,6 @@ ## HACS Lovelace Cards
|
||||
- [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)
|
||||
- [Platinum Weather Card](https://github.com/Makin-Things/platinum-weather-card) (Not currently in use, but VERY nicely done)
|
||||
- [Stack In Card](https://github.com/custom-cards/stack-in-card)
|
||||
- [Paper Buttons Row](https://github.com/jcwillox/lovelace-paper-buttons-row)
|
||||
- [State Switch](https://github.com/thomasloven/lovelace-state-switch)
|
||||
@ -122,6 +122,7 @@ ## HACS Lovelace Cards
|
||||
- [Meteoalarm Card](https://github.com/MrBartusek/MeteoalarmCard)
|
||||
- [Weather Chart Card](https://github.com/mlamberts78/weather-chart-card)
|
||||
- [Comfortable Environment Card](https://github.com/argaar/comfortable-environment-card)
|
||||
- [Versatile Thermostat UI Card](https://github.com/jmcollin78/versatile-thermostat-ui-card)
|
||||
|
||||
</details>
|
||||
|
||||
|
64
scenes.yaml
64
scenes.yaml
@ -1210,14 +1210,23 @@
|
||||
min_mireds: 153
|
||||
max_mireds: 500
|
||||
effect_list:
|
||||
- None
|
||||
- 'off'
|
||||
- candle
|
||||
- fire
|
||||
- prism
|
||||
- sparkle
|
||||
- opal
|
||||
- glisten
|
||||
- underwater
|
||||
- cosmos
|
||||
- sunbeam
|
||||
- enchant
|
||||
- sunrise
|
||||
- sunset
|
||||
supported_color_modes:
|
||||
- color_temp
|
||||
- xy
|
||||
effect: None
|
||||
effect: 'off'
|
||||
color_mode: xy
|
||||
brightness: 179
|
||||
color_temp_kelvin:
|
||||
@ -1244,14 +1253,23 @@
|
||||
min_mireds: 153
|
||||
max_mireds: 500
|
||||
effect_list:
|
||||
- None
|
||||
- 'off'
|
||||
- candle
|
||||
- fire
|
||||
- prism
|
||||
- sparkle
|
||||
- opal
|
||||
- glisten
|
||||
- underwater
|
||||
- cosmos
|
||||
- sunbeam
|
||||
- enchant
|
||||
- sunrise
|
||||
- sunset
|
||||
supported_color_modes:
|
||||
- color_temp
|
||||
- xy
|
||||
effect: None
|
||||
effect: 'off'
|
||||
color_mode: xy
|
||||
brightness: 255
|
||||
color_temp_kelvin:
|
||||
@ -1278,10 +1296,13 @@
|
||||
min_mireds: 153
|
||||
max_mireds: 500
|
||||
effect_list:
|
||||
- None
|
||||
- 'off'
|
||||
- candle
|
||||
- fire
|
||||
- prism
|
||||
- sparkle
|
||||
- opal
|
||||
- glisten
|
||||
supported_color_modes:
|
||||
- color_temp
|
||||
- xy
|
||||
@ -1342,14 +1363,23 @@
|
||||
min_mireds: 153
|
||||
max_mireds: 500
|
||||
effect_list:
|
||||
- None
|
||||
- 'off'
|
||||
- candle
|
||||
- fire
|
||||
- prism
|
||||
- sparkle
|
||||
- opal
|
||||
- glisten
|
||||
- underwater
|
||||
- cosmos
|
||||
- sunbeam
|
||||
- enchant
|
||||
- sunrise
|
||||
- sunset
|
||||
supported_color_modes:
|
||||
- color_temp
|
||||
- xy
|
||||
effect: None
|
||||
effect: 'off'
|
||||
color_mode: xy
|
||||
brightness: 255
|
||||
color_temp_kelvin:
|
||||
@ -1376,14 +1406,23 @@
|
||||
min_mireds: 153
|
||||
max_mireds: 500
|
||||
effect_list:
|
||||
- None
|
||||
- 'off'
|
||||
- candle
|
||||
- fire
|
||||
- prism
|
||||
- sparkle
|
||||
- opal
|
||||
- glisten
|
||||
- underwater
|
||||
- cosmos
|
||||
- sunbeam
|
||||
- enchant
|
||||
- sunrise
|
||||
- sunset
|
||||
supported_color_modes:
|
||||
- color_temp
|
||||
- xy
|
||||
effect: None
|
||||
effect: 'off'
|
||||
color_mode: xy
|
||||
brightness: 255
|
||||
color_temp_kelvin:
|
||||
@ -1441,14 +1480,17 @@
|
||||
min_mireds: 153
|
||||
max_mireds: 500
|
||||
effect_list:
|
||||
- None
|
||||
- 'off'
|
||||
- candle
|
||||
- fire
|
||||
- prism
|
||||
- sparkle
|
||||
- opal
|
||||
- glisten
|
||||
supported_color_modes:
|
||||
- color_temp
|
||||
- xy
|
||||
effect: None
|
||||
effect: 'off'
|
||||
color_mode: xy
|
||||
brightness: 204
|
||||
color_temp_kelvin:
|
||||
|
1284
scripts.yaml
1284
scripts.yaml
File diff suppressed because it is too large
Load Diff
@ -68,7 +68,6 @@
|
||||
states.light.downstairs_bathroom_right,
|
||||
states.light.tina_lamp_top,
|
||||
states.light.tina_lamp_side,
|
||||
states.light.tina_desk_strip,
|
||||
states.light.basement_tall_lamp,
|
||||
states.light.basement_short_lamp,
|
||||
states.light.basement_stairwell,
|
||||
@ -103,7 +102,6 @@
|
||||
states.light.downstairs_bathroom_right,
|
||||
states.light.tina_lamp_top,
|
||||
states.light.tina_lamp_side,
|
||||
states.light.tina_desk_strip
|
||||
] %}
|
||||
{{ lights | selectattr('state','eq','on') | list | count | int }}
|
||||
- name: Second Floor Lights On
|
||||
@ -170,7 +168,7 @@
|
||||
unit_of_measurement: ''
|
||||
state: >-
|
||||
{% set compressors = [
|
||||
states.binary_sensor.emma_aircon_compressor,
|
||||
states.binary_sensor.emma_bedroom_aircon_compressor,
|
||||
states.binary_sensor.master_bedroom_aircon_compressor
|
||||
] %}
|
||||
{{ compressors | selectattr('state','eq','on') | list | count | int }}
|
||||
@ -179,7 +177,7 @@
|
||||
unit_of_measurement: ''
|
||||
state: >-
|
||||
{% set fans = [
|
||||
states.binary_sensor.emma_aircon_fan,
|
||||
states.binary_sensor.emma_bedroom_aircon_fan,
|
||||
states.binary_sensor.master_bedroom_aircon_fan
|
||||
] %}
|
||||
{{ fans | selectattr('state','eq','on') | list | count | int }}
|
||||
@ -198,11 +196,7 @@
|
||||
unit_of_measurement: ''
|
||||
state: >-
|
||||
{% set climate = states.climate | selectattr('state','ne','off') | rejectattr('state','eq','unavailable') | rejectattr('state','eq','unknown') | list | count | int %}
|
||||
{% set fans = [
|
||||
states.fan.emma_air_conditioner
|
||||
] %}
|
||||
{% set fans_on = fans | selectattr('state','eq','on') | list | count | int %}
|
||||
{{ climate + fans_on | int }}
|
||||
{{ climate | int }}
|
||||
- name: Climate Devices Running
|
||||
unique_id: 3c61c756-2934-4294-8085-7d3855b692dd
|
||||
unit_of_measurement: ''
|
||||
|
@ -98,12 +98,7 @@
|
||||
{% endif %}
|
||||
{% if is_state('input_boolean.kallen_alternate_pickup','on') %}
|
||||
Today, you will be picked up from school by {{ states('input_text.kallen_pickup') }}.
|
||||
{% elif is_state('input_boolean.work_today','off') %}
|
||||
Today, you will be picked up from school by your parents.
|
||||
{% else %}
|
||||
Today, you will be picked up from school by your dad.
|
||||
{% endif %}
|
||||
<s>Pickup today will be at {{ input_datetime_read('input_datetime.kallen_school_day_end') }}</s>
|
||||
{% if count_the_days('input_datetime.school_last_day') | int == 0 -%}
|
||||
But today is the last day of School!
|
||||
{%- endif %}
|
||||
|
@ -71,9 +71,13 @@
|
||||
{% else %}
|
||||
"Collin's room will be left alone, as he is spending the night elsewhere tonight. "
|
||||
{% endif %}
|
||||
{% if states('input_select.scheduled_climate_mode_emma_bedroom') != 'N/A' %}
|
||||
{% if is_state('input_select.scheduled_climate_mode_emma_bedroom','AC') and is_state('fan.emma_air_conditioner','off') %}
|
||||
"Emma's air conditioner will be activated at {{ input_datetime_read('input_datetime.emma_bedroom_cooling') }}. "
|
||||
{% 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') %}
|
||||
"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') }}. "
|
||||
{% 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') }}. "
|
||||
{% 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') }}. "
|
||||
{% 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') }}. "
|
||||
{% endif %}
|
||||
|
@ -75,28 +75,39 @@
|
||||
|
||||
<p>
|
||||
{% if (states('sensor.climate_devices_installed') | int) > 0 %}
|
||||
{% if is_state('input_boolean.master_bedroom_aircon_installed','on') %}
|
||||
"the master bedroom temperature is {{ states('sensor.master_bedroom_aircon_indoor_temperature') | int }} degrees. "
|
||||
{% if not is_state('climate.master_bedroom_aircon','off') %}
|
||||
{% if is_state('climate.master_bedroom_aircon','cool') %}
|
||||
"and the master bedroom air conditioner is set for cooling to {{ state_attr('climate.master_bedroom_aircon','temperature') }} degrees. "
|
||||
{% elif is_state('climate.master_bedroom_aircon','fan_only') %}
|
||||
"and the master bedroom air conditioner is in fan only mode. "
|
||||
{% elif is_state('climate.master_bedroom_aircon','dry') %}
|
||||
"and the master bedroom air conditioner is moonlighting as a dehumidifier. "
|
||||
{% elif is_state('climate.master_bedroom_aircon','auto') %}
|
||||
"and the master bedroom air conditioner is making its own decisions. Be afraid, be very afraid. "
|
||||
{% else %}
|
||||
"and the master bedroom air conditioner is currently not speaking to me. Was it something I said? "
|
||||
{% endif %}
|
||||
{% if is_state('input_boolean.master_bedroom_aircon_installed','on') %}
|
||||
"the master bedroom temperature is {{ states('sensor.master_bedroom_temperature') | int }} degrees. "
|
||||
{% if not is_state('climate.master_bedroom_aircon','off') %}
|
||||
{% if is_state('climate.master_bedroom_aircon','cool') %}
|
||||
"and the master bedroom air conditioner is set for cooling to {{ state_attr('climate.master_bedroom_aircon','temperature') }} degrees. "
|
||||
{% elif is_state('climate.master_bedroom_aircon','fan_only') %}
|
||||
"and the master bedroom air conditioner is in fan only mode. "
|
||||
{% elif is_state('climate.master_bedroom_aircon','dry') %}
|
||||
"and the master bedroom air conditioner is moonlighting as a dehumidifier. "
|
||||
{% elif is_state('climate.master_bedroom_aircon','auto') %}
|
||||
"and the master bedroom air conditioner is making its own decisions. Be afraid, be very afraid. "
|
||||
{% else %}
|
||||
"and the master bedroom air conditioner is currently not speaking to me. Was it something I said? "
|
||||
{% endif %}
|
||||
{% elif is_state('input_boolean.master_bedroom_aircon_installed','off') %}
|
||||
"There is no air conditioner or temperature sensor installed in the master bedroom. "
|
||||
{% endif %}
|
||||
{% if is_state('input_boolean.emma_bedroom_aircon_installed','on') and is_state('fan.emma_air_conditioner','on') %}
|
||||
"Emma's air conditioner is {{ states('fan.emma_air_conditioner') }}. "
|
||||
{% endif %}
|
||||
{% endif %}
|
||||
{% endif %}
|
||||
{% if is_state('input_boolean.emma_bedroom_aircon_installed','on') %}
|
||||
"the temperature in Emma's bedroom is {{ states('sensor.emma_bedroom_temperature') | int }} degrees. "
|
||||
{% if not is_state('climate.emma_bedroom_aircon','off') %}
|
||||
{% if is_state('climate.emma_bedroom_aircon','cool') %}
|
||||
"and Emma's bedroom air conditioner is set for cooling to {{ state_attr('climate.emma_bedroom_aircon','temperature') }} degrees. "
|
||||
{% elif is_state('climate.emma_bedroom_aircon','fan_only') %}
|
||||
"and Emma's bedroom air conditioner is in fan only mode. "
|
||||
{% elif is_state('climate.emma_bedroom_aircon','dry') %}
|
||||
"and Emma's bedroom air conditioner is moonlighting as a dehumidifier. "
|
||||
{% elif is_state('climate.emma_bedroom_aircon','auto') %}
|
||||
"and Emma's bedroom air conditioner is making its own decisions. Be afraid, be very afraid. "
|
||||
{% else %}
|
||||
"and Emma's bedroom air conditioner is currently not speaking to me. Was it something I said? "
|
||||
{% endif %}
|
||||
{% endif %}
|
||||
{% endif %}
|
||||
{% endif %}
|
||||
</p>
|
||||
|
||||
<p>
|
||||
@ -117,7 +128,7 @@
|
||||
"Tina has work today. "
|
||||
{% endif %}
|
||||
{% if is_state('input_boolean.kallen_at_school','on') %}
|
||||
"Collin is at school right now. His pickup time will be at {{ input_datetime_read('input_datetime.kallen_school_day_end') }}. "
|
||||
"Collin is at school right now. His school day ends at {{ input_datetime_read('input_datetime.kallen_school_day_end') }}. "
|
||||
{% elif is_state('input_boolean.kallen_school_today','on') %}
|
||||
"Collin has school today. "
|
||||
{% endif %}
|
||||
|
429
www/bubble/bubble-modules.yaml
Normal file
429
www/bubble/bubble-modules.yaml
Normal file
@ -0,0 +1,429 @@
|
||||
# Bubble Modules
|
||||
#
|
||||
# How to use:
|
||||
#
|
||||
# - To edit or add modules (global styles and templates), first copy the
|
||||
# "bubble-modules.yaml" file from "/www/community/Bubble-Card/" (if installed via HACS)
|
||||
# to "/www/bubble/" (you'll need to create this folder).
|
||||
#
|
||||
# Then add these lines in your "configuration.yaml" under "homeassistant:":
|
||||
#
|
||||
# homeassistant:
|
||||
# allowlist_external_dirs:
|
||||
# - /config/www/bubble
|
||||
# # This step is not needed if you already have this line:
|
||||
# - /config/www
|
||||
#
|
||||
# Then save and restart Home Assistant.
|
||||
#
|
||||
# - After making changes, you need to refresh your page to apply the modifications.
|
||||
#
|
||||
# - Styles and templates defined under "default:" are applied globally to all cards by default.
|
||||
#
|
||||
# - See the final example in this file for further details on how to create a module.
|
||||
#
|
||||
# - You can share/find modules here:
|
||||
# github.com/Clooos/Bubble-Card/discussions/categories/share-your-modules
|
||||
|
||||
|
||||
default:
|
||||
name: Default
|
||||
description: Empty and enabled by default. Move your styles/templates here in the <code>bubble-modules.yaml</code> file to apply them to all cards.
|
||||
code: |
|
||||
/* CSS or JS templates (see examples below) */
|
||||
|
||||
|
||||
home-assistant-default:
|
||||
name: Home Assistant default styling
|
||||
version: "v1.1"
|
||||
creator: "Clooos"
|
||||
link: "https://github.com/Clooos/Bubble-Card/discussions/1230"
|
||||
description: This module applies Home Assistant’s default styling to Bubble Card. To set it as the default, move it under <code>default:</code> in the <code>bubble-modules.yaml</code> file.
|
||||
code: |
|
||||
:host {
|
||||
--bubble-button-accent-color: rgba(0,140,255,0.3); /* Edit this color if needed */
|
||||
--bubble-main-background-color: var(--ha-card-background, var(--card-background-color, #fff));
|
||||
--bubble-border-radius: var(--ha-card-border-radius, 12px);
|
||||
--bubble-icon-border-radius: 32px;
|
||||
--bubble-button-border-radius: var(--bubble-border-radius);
|
||||
--bubble-climate-button-background-color: var(--bubble-icon-background-color);
|
||||
--bubble-border: var(--ha-card-border-width, 1px) solid var(--ha-card-border-color, var(--divider-color, #e0e0e0));
|
||||
--bubble-secondary-background-color: transparent;
|
||||
}
|
||||
|
||||
.bubble-container {
|
||||
-webkit-backdrop-filter: var(--ha-card-backdrop-filter, none);
|
||||
backdrop-filter: var(--ha-card-backdrop-filter, none);
|
||||
box-shadow: var(--ha-card-box-shadow, none);
|
||||
box-sizing: border-box;
|
||||
}
|
||||
|
||||
.bubble-icon-container,
|
||||
.large .bubble-icon-container {
|
||||
--mdc-icon-size: 22px;
|
||||
min-width: 36px !important;
|
||||
min-height: 36px !important;
|
||||
}
|
||||
|
||||
.large .bubble-cover-card-container > .bubble-buttons {
|
||||
--bubble-cover-main-background-color: none;
|
||||
}
|
||||
|
||||
.bubble-range-fill {
|
||||
--bubble-accent-color: var(--bubble-button-accent-color);
|
||||
}
|
||||
|
||||
.bubble-sub-button.background-on::before,
|
||||
.bubble-sub-button.background-off::before,
|
||||
.bubble-temperature-container::before,
|
||||
.bubble-icon-container::before {
|
||||
content: "";
|
||||
position: absolute;
|
||||
top: 0;
|
||||
left: 0;
|
||||
width: 100%;
|
||||
height: 100%;
|
||||
opacity: var(--control-number-buttons-background-opacity, .2);
|
||||
border-radius: var(--bubble-border-radius);
|
||||
background: var(--control-number-buttons-background-color, var(--disabled-color));
|
||||
}
|
||||
|
||||
.is-on {
|
||||
--bubble-icon-background-color: var(--view-background,var(--lovelace-background,var(--primary-background-color)));
|
||||
transition: all ease-in 0.3s !important;
|
||||
}
|
||||
|
||||
.bubble-icon-container::before {
|
||||
background: var(--state-inactive-color);
|
||||
border-radius: var(--bubble-icon-border-radius);
|
||||
}
|
||||
|
||||
.bubble-sub-button {
|
||||
border: 0px solid transparent !important;
|
||||
}
|
||||
|
||||
.no-icon-select-arrow {
|
||||
right: 4px !important;
|
||||
}
|
||||
|
||||
.large .bubble-icon-container {
|
||||
margin-left: 9px;
|
||||
}
|
||||
|
||||
.bubble-state {
|
||||
opacity: 1;
|
||||
font-weight: 400;
|
||||
font-size: 12px;
|
||||
letter-spacing: .4px;
|
||||
}
|
||||
|
||||
:not(.bubble-separator) > .bubble-name {
|
||||
font-weight: 500;
|
||||
font-size: 14px;
|
||||
letter-spacing: 0.1px;
|
||||
}
|
||||
|
||||
.bubble-pop-up-background {
|
||||
filter: brightness(0.96); /* Improve pop-up background contrast */
|
||||
--bubble-pop-up-border-radius: calc(var(--ha-card-border-radius, 12px) * 1.4);
|
||||
}
|
||||
|
||||
.bubble-header-container {
|
||||
--bubble-secondary-background-color: var(--background-color-2);
|
||||
}
|
||||
|
||||
ha-select {
|
||||
--bubble-list-item-accent-color: none !important;
|
||||
--mdc-theme-surface: var(--card-background-color);
|
||||
}
|
||||
|
||||
mwc-list-item[selected] {
|
||||
color: inherit !important;
|
||||
--mdc-ripple-press-opacity: 0 !important;
|
||||
}
|
||||
|
||||
mwc-list-item[selected]::before {
|
||||
content: "";
|
||||
position: absolute;
|
||||
top: 0;
|
||||
left: 0;
|
||||
width: 100%;
|
||||
height: 100%;
|
||||
background-color: var(--primary-color);
|
||||
opacity: 0.24;
|
||||
}
|
||||
|
||||
|
||||
icon_container_color:
|
||||
name: "Example: Customize the icon container color"
|
||||
version: "v1.1"
|
||||
creator: "Clooos"
|
||||
link: "https://github.com/Clooos/Bubble-Card/discussions/1231"
|
||||
|
||||
unsupported:
|
||||
- horizontal-buttons-stack
|
||||
- separator
|
||||
|
||||
description: |
|
||||
A list of predefined colors to customize the icon container color.
|
||||
Configure this module via the editor or in YAML, for example:
|
||||
<br><br>
|
||||
<code-block><pre>
|
||||
icon_container_color:
|
||||
color: light-blue
|
||||
</pre></code-block>
|
||||
|
||||
code: |
|
||||
.bubble-icon-container {
|
||||
opacity: 1 !important;
|
||||
background: var(--${this.config.icon_container_color?.color}-color) !important;
|
||||
}
|
||||
|
||||
editor:
|
||||
- name: color
|
||||
label: "Color"
|
||||
selector:
|
||||
ui_color:
|
||||
include_none: true
|
||||
|
||||
|
||||
get_state_attribute:
|
||||
|
||||
# Some informations about your module (this is shown in the editor)
|
||||
name: "Advanced example: Get state/attribute from other entities"
|
||||
version: "v1.1"
|
||||
creator: "Clooos"
|
||||
link: "https://github.com/Clooos/Bubble-Card"
|
||||
|
||||
# Disable this module for unsupported "card_type"
|
||||
unsupported:
|
||||
- horizontal-buttons-stack
|
||||
- separator
|
||||
|
||||
# The description have HTML support like in this example. This model is my favorite.
|
||||
description: |
|
||||
Get state/attribute from other entities and replace the default state/attribute field.
|
||||
<img class="example" src="https://github.com/Clooos/Bubble-Card/blob/main/img/get_state_template_example.png?raw=true" />
|
||||
Configure this module via the editor or in YAML, for example:
|
||||
<br><br>
|
||||
<code-block><pre>
|
||||
get_state_attribute:
|
||||
- entity: weather.home
|
||||
- entity: sensor.weather_station
|
||||
attribute: humidity
|
||||
- entity: sensor.weather_station
|
||||
attribute: temperature
|
||||
</pre></code-block>
|
||||
<br>
|
||||
<b>If it doesn't work, make sure at least one of "Show state" or "Show attribute" is turned on in your card configuration.</b>
|
||||
|
||||
# Code blocks must always start with ${(() => { and end with })()}
|
||||
# Inline codes must always start with ${ and end with }
|
||||
#
|
||||
# This section only supports JavaScript and/or CSS
|
||||
code: |
|
||||
${(() => {
|
||||
// Retrieve the configuration or use an empty array by default
|
||||
const config = this.config.get_state_attribute || [];
|
||||
|
||||
// Format the retrieved value from the entity for each entry
|
||||
const values = config
|
||||
.map(cfg => {
|
||||
const entity = hass.states[cfg.entity];
|
||||
if (entity) {
|
||||
return cfg.attribute
|
||||
? hass.formatEntityAttributeValue(entity, cfg.attribute)
|
||||
: hass.formatEntityState(entity);
|
||||
}
|
||||
return null;
|
||||
})
|
||||
.filter(value => value !== null); // Remove null values
|
||||
|
||||
// Update the DOM element with the class 'bubble-state'
|
||||
// displaying values separated by ' • '
|
||||
card.querySelector('.bubble-state').innerText = values.join(' • ');
|
||||
})()}
|
||||
|
||||
# The editor part can be tricky, but improves modules a lot!
|
||||
#
|
||||
# In this example, it will create your configuration to this variable:
|
||||
# this.config.get_state_attribute
|
||||
#
|
||||
# To understand what you can do here, take a look at the "ha-form" sources here:
|
||||
# https://github.com/home-assistant/frontend/tree/03a415beff6e6f9c87a95287804f6c03c8fef3d5/src/components/ha-form
|
||||
#
|
||||
# And here for the selectors:
|
||||
# https://github.com/home-assistant/frontend/blob/03a415beff6e6f9c87a95287804f6c03c8fef3d5/src/data/selector.ts
|
||||
#
|
||||
# I will try to document that for clarity!
|
||||
editor:
|
||||
- type: expandable
|
||||
title: "Select entities and attributes"
|
||||
icon: "mdi:list-box-outline"
|
||||
schema:
|
||||
- name: '0'
|
||||
type: expandable
|
||||
title: "Entity 1"
|
||||
schema:
|
||||
- name: entity
|
||||
label: "Entity"
|
||||
selector:
|
||||
entity: {}
|
||||
- name: attribute
|
||||
label: "Attribute"
|
||||
selector:
|
||||
attribute: {}
|
||||
- name: '1'
|
||||
type: expandable
|
||||
title: "Entity 2"
|
||||
schema:
|
||||
- name: entity
|
||||
label: "Entity"
|
||||
selector:
|
||||
entity: {}
|
||||
- name: attribute
|
||||
label: "Attribute"
|
||||
selector:
|
||||
attribute: {}
|
||||
- name: '2'
|
||||
type: expandable
|
||||
title: "Entity 3"
|
||||
schema:
|
||||
- name: entity
|
||||
label: "Entity"
|
||||
selector:
|
||||
entity: {}
|
||||
- name: attribute
|
||||
label: "Attribute"
|
||||
selector:
|
||||
attribute: {}
|
||||
- name: '3'
|
||||
type: expandable
|
||||
title: "Entity 4"
|
||||
schema:
|
||||
- name: entity
|
||||
label: "Entity"
|
||||
selector:
|
||||
entity: {}
|
||||
- name: attribute
|
||||
label: "Attribute"
|
||||
selector:
|
||||
attribute: {}
|
||||
|
||||
# Temperature
|
||||
temperature_colouring:
|
||||
name: "Temperature colouring"
|
||||
version: "v1.0"
|
||||
creator: "Timmy"
|
||||
|
||||
unsupported:
|
||||
- horizontal-buttons-stack
|
||||
- media-player
|
||||
|
||||
description: |
|
||||
This module provides dynamic colouring based on temperature sensor values.
|
||||
Colour adjustments are applied to selected sub-buttons and/or state display elements.
|
||||
|
||||
Required entities:
|
||||
- A temperature sensor
|
||||
|
||||
You can configure which elements should receive dynamic colouring:
|
||||
- Sub-buttons (1-6)
|
||||
- State display
|
||||
|
||||
Example YAML configuration:
|
||||
|
||||
temperature_colouring:
|
||||
temperature_sensor: sensor.kitchen_temperature
|
||||
elements:
|
||||
sub_buttons: [1, 3, 5] # Apply to sub-buttons 1, 3, and 5
|
||||
state_display: true # Apply to state display element
|
||||
|
||||
code: |
|
||||
${(() => {
|
||||
const temperature = parseFloat(hass?.states[this.config?.temperature_colouring?.temperature_sensor]?.state || 0);
|
||||
const elements = this.config?.temperature_colouring?.elements || {};
|
||||
|
||||
let color;
|
||||
if (temperature <= 32) {
|
||||
color = 'rgba(0,0,139,0.8)';
|
||||
} else if (temperature <= 41) {
|
||||
color = 'rgba(0,71,171,0.8)';
|
||||
} else if (temperature <= 50) {
|
||||
color = 'rgba(30,144,255,0.8)';
|
||||
} else if (temperature <= 61) {
|
||||
color = 'rgba(100,149,237,0.8)';
|
||||
} else if (temperature <= 68) {
|
||||
color = 'rgba(60,179,113,0.8)';
|
||||
} else if (temperature <= 73) {
|
||||
color = 'rgba(152,251,152,0.8)';
|
||||
} else if (temperature <= 78) {
|
||||
color = 'rgba(255,223,186,0.8)';
|
||||
} else if (temperature <= 80) {
|
||||
color = 'rgba(255,215,0,0.8)';
|
||||
} else if (temperature <= 95) {
|
||||
color = 'rgba(178,34,34,0.8)';
|
||||
} else {
|
||||
color = 'rgba(139,0,0,0.8)';
|
||||
}
|
||||
|
||||
// Apply colour to selected sub-buttons
|
||||
if (elements.sub_buttons) {
|
||||
const subButtons = Array.isArray(elements.sub_buttons) ? elements.sub_buttons : [];
|
||||
subButtons.forEach(num => {
|
||||
if (num >= 1 && num <= 6) {
|
||||
const subButton = card?.querySelector(`.bubble-sub-button-${num} ha-icon`);
|
||||
if (subButton) {
|
||||
subButton.style.color = color;
|
||||
}
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
// Apply colour to state display if enabled
|
||||
if (elements.state_display) {
|
||||
const stateElement = card?.querySelector('.bubble-state.state.display-state');
|
||||
if (stateElement) {
|
||||
stateElement.style.color = color;
|
||||
}
|
||||
}
|
||||
|
||||
return ''; // No CSS needed as we're applying styles directly to elements
|
||||
})()}
|
||||
|
||||
editor:
|
||||
- type: expandable
|
||||
title: "Entity Configuration"
|
||||
icon: "mdi:thermometer"
|
||||
schema:
|
||||
- name: temperature_sensor
|
||||
label: "Temperature Sensor (Required)"
|
||||
selector:
|
||||
entity:
|
||||
device_class: temperature
|
||||
required: true
|
||||
- name: elements
|
||||
type: grid
|
||||
schema:
|
||||
- name: sub_buttons
|
||||
label: "Sub-buttons to Style"
|
||||
selector:
|
||||
select:
|
||||
multiple: true
|
||||
options:
|
||||
- label: "Sub-button 1"
|
||||
value: 1
|
||||
- label: "Sub-button 2"
|
||||
value: 2
|
||||
- label: "Sub-button 3"
|
||||
value: 3
|
||||
- label: "Sub-button 4"
|
||||
value: 4
|
||||
- label: "Sub-button 5"
|
||||
value: 5
|
||||
- label: "Sub-button 6"
|
||||
value: 6
|
||||
- name: state_display
|
||||
label: "State Display"
|
||||
selector:
|
||||
boolean: {}
|
Reference in New Issue
Block a user