Compare commits

...

41 Commits

Author SHA1 Message Date
ce29e80330 Try to fix Tina Desk Switch weirdness 2025-04-02 15:53:12 -04:00
10deee4f04 Always play Emma wakeup announcement, and play it in common areas 2025-03-29 01:15:20 -04:00
6fa762a113 Adjust scheduling for ridiculously OP air conditioner 2025-03-29 01:10:58 -04:00
7b529895e5 Whole fuckload of changes for Emma's new air conditioner 2025-03-28 21:56:58 -04:00
bdb278dd28 Adjust TTS briefings for K riding the bus
#219
2025-03-24 18:38:55 -04:00
000efa7562 Adjust status macros for K riding the bus
#219
2025-03-24 18:38:54 -04:00
b6911a0f59 Rework scheduling for K riding the bus
#219
2025-03-24 18:38:53 -04:00
d49563435d Raise threshold to show computers on, ignore idle power spikes
This caused my computer to briefly register as on, and thus my Awake switch was turned on and prevented Emma's door alert from playing in the bedroom
2025-03-24 18:38:38 -04:00
1a89d088f6 Automations to deal with Emma Awake toggle 2025-03-24 03:00:13 -04:00
ee6499bec8 Add option for Adjustment request in reporting system 2025-03-22 20:50:01 -04:00
148f78aecd Update .HA_VERSION 2025-03-22 07:20:42 -04:00
49f9e99439 Add warnings for considerable destructive t-storm, confirmed tornado 2025-03-19 17:11:34 -04:00
6254fb5953 Track new weather alert sensors for long-term stats 2025-03-18 01:38:17 -04:00
334b7963e8 Add ability to show when tornado production is possible 2025-03-18 01:37:52 -04:00
4466b17df1 Update .HA_VERSION 2025-03-17 16:12:03 -04:00
f96056edda Use correct sensor for master bedroom temperature in welcome home brief 2025-03-16 04:16:44 -04:00
652b4e7dff Additional editing added for weather briefing 2025-03-16 04:16:16 -04:00
26bcf136e6 Update med scripts to use AI-generated snark 2025-03-14 02:14:46 -04:00
9e90998a21 Update Kallen morning meds script, he can now mark morning meds himself 2025-03-14 00:59:22 -04:00
30c8307272 Improve aircon fan/compressor template sensors 2025-03-14 00:19:26 -04:00
e6b0db142e Update .HA_VERSION 2025-03-14 00:18:59 -04:00
b5dd9621d1 Don't turn basement heat on if it was off 2025-03-11 02:07:15 -04:00
587ac4d203 Update .HA_VERSION 2025-03-08 15:24:32 -05:00
b459d78446 Add new dashboard format to weather report macro 2025-03-05 17:26:55 -05:00
352e4f1ada Update weather report jinja template 2025-03-05 17:08:30 -05:00
09d82abdb1 Monthly update 2025-03-05 16:25:21 -05:00
8b120ae347 Tweak temperature scales for bubble cards slightly 2025-03-04 02:17:56 -05:00
da03ea826b Add temperature coloring module for bubble cards 2025-03-04 02:09:27 -05:00
66fc0fb906 Default bubble modules file 2025-03-04 01:38:14 -05:00
4c81a8a6a5 Updated gitignore 2025-03-04 01:32:15 -05:00
35a511710e Add "do not enter" input boolean tm24fan8/Home-Assistant-Configs#218 2025-03-01 20:49:06 -05:00
4c7bf9a85c Include .HA_VERSION file 2025-02-28 00:46:44 -05:00
754e3d6095 Don't consider K's computer as occupying the basement if I am upstairs 2025-02-28 00:30:26 -05:00
8f707c71bb Make it easier to activate nightlight in master bedroom 2025-02-27 00:50:53 -05:00
08b5c7b764 Remove old scrape-based gas sensors 2025-02-26 03:37:22 -05:00
fd37fe589c Push security disarm 5 minutes earlier for K's school mornings
Close #215
2025-02-26 02:27:18 -05:00
36906d6207 Updated readme 2025-02-26 01:17:33 -05:00
29dcb654b4 Copy ibuprofen and tylenol trackers for Tina 2025-02-21 22:19:37 -05:00
ec0aed386a Begin simplification of wife's desk lighting 2025-02-18 15:40:35 -05:00
a96bc99271 Basement presence now checks if I'm using wife's PC upstairs
#188
2025-02-15 16:03:59 -05:00
a085e71c86 Remove wife's desk strip as it broke 2025-02-11 02:41:43 -05:00
26 changed files with 1659 additions and 753 deletions

1
.HA_VERSION Normal file
View File

@ -0,0 +1 @@
2025.3.4

20
.gitignore vendored
View File

@ -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/

View File

@ -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
@ -1151,10 +1149,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 +1310,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 +1598,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 +1613,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 +1633,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 +1644,6 @@
entity_id:
- light.living_room_lights
- light.tina_lamp
- light.tina_desk_strip
- light.stairwell_led_strip
data:
color_name: red
@ -1695,52 +1715,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 +1741,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 +5043,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 +6015,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

View File

@ -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

View File

@ -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.

View File

@ -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 %}

View File

@ -11,6 +11,7 @@ report_type:
options:
- Bug Report
- New Idea
- Adjustment
initial: Bug Report
icon: mdi:bug
select_testing:

View File

@ -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: >

View File

@ -0,0 +1,4 @@
input_boolean:
do_not_enter_basement_studio:
name: Do Not Enter - Basement Studio
icon: mdi:minus-circle

View File

@ -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
@ -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','preset_mode','eco') }}"
icon: >-
{% if is_state_attr('climate.emma_bedroom_aircon','preset_mode','eco') %}
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

View File

@ -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

View File

@ -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

View File

@ -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
@ -819,7 +816,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]

View File

@ -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

View File

@ -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

View File

@ -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 %}

View File

@ -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"

View File

@ -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

View File

@ -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

View File

@ -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>

File diff suppressed because it is too large Load Diff

View File

@ -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: ''

View File

@ -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 %}

View File

@ -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 %}

View File

@ -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 %}

View 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 Assistants 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: {}