Compare commits

..

6 Commits

36 changed files with 3987 additions and 8190 deletions

View File

@ -1 +1 @@
2025.6.1 2025.3.3

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

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

View File

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

View File

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

View File

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

View File

@ -32,16 +32,8 @@ frontend:
extra_module_url: extra_module_url:
- /hacsfiles/hass-hue-icons/hass-hue-icons.js - /hacsfiles/hass-hue-icons/hass-hue-icons.js
- /hacsfiles/hass-bha-icons/hass-bha-icons.js - /hacsfiles/hass-bha-icons/hass-bha-icons.js
- /hacsfiles/material-you-utilities/material-you-utilities.min.js
javascript_version: latest javascript_version: latest
panel_custom:
- name: material-you-panel
url_path: material-you-configuration
sidebar_title: Material You Utilities
sidebar_icon: mdi:material-design
module_url: /hacsfiles/material-you-utilities/material-you-utilities.min.js
http: http:
use_x_forwarded_for: true use_x_forwarded_for: true
trusted_proxies: trusted_proxies:
@ -115,8 +107,6 @@ recorder:
- sensor.*gpu_core_load - sensor.*gpu_core_load
- sensor.portainer* - sensor.portainer*
- sensor.mosquitto* - sensor.mosquitto*
- sensor.*_rssi
- sensor.weatherflow_hub*
entities: entities:
- sensor.avg_ping - sensor.avg_ping
- sensor.max_ping - sensor.max_ping
@ -131,8 +121,6 @@ recorder:
- sensor.mariadb_database_size - sensor.mariadb_database_size
- sensor.random_joke - sensor.random_joke
- sensor.bypassed_sensors - sensor.bypassed_sensors
- sensor.home_tempest_signal_strength
- sensor.home_tempest_uptime
include: include:
entities: entities:
- media_player.living_room_tv - media_player.living_room_tv
@ -178,8 +166,6 @@ influxdb:
entity_globs: entity_globs:
- binary_sensor.*tamper* - binary_sensor.*tamper*
- light.*screen* - light.*screen*
- sensor.weatherflow_hub*
- sensor.home_tempest*
entities: entities:
- sensor.last_boot - sensor.last_boot
- sensor.date - sensor.date
@ -192,8 +178,6 @@ influxdb:
- light.all_lights - light.all_lights
- fan.all_fans - fan.all_fans
- sensor.random_joke - sensor.random_joke
- sensor.home_tempest_signal_strength
- sensor.home_tempest_uptime
include: include:
domains: domains:
- sun - sun
@ -363,8 +347,6 @@ prometheus:
exclude_entity_globs: exclude_entity_globs:
- binary_sensor.*tamper* - binary_sensor.*tamper*
- light.*screen* - light.*screen*
- sensor.weatherflow_hub*
- sensor.home_tempest*
exclude_entities: exclude_entities:
- sensor.last_boot - sensor.last_boot
- sensor.date - sensor.date
@ -377,8 +359,6 @@ prometheus:
- light.all_lights - light.all_lights
- fan.all_fans - fan.all_fans
- sensor.random_joke - sensor.random_joke
- sensor.home_tempest_signal_strength
- sensor.home_tempest_uptime
include_domains: include_domains:
- sun - sun
- light - light

View File

@ -79,7 +79,7 @@
45: 'quarter to {hour}', 45: 'quarter to {hour}',
59: 'a minute to {hour}', 59: 'a minute to {hour}',
'past_hour': '{minute} past {hour}', 'past_hour': '{minute} past {hour}',
'to_hour': '{minute} to {hour}', 'to_hour': '{minute} to {hour}',
}, },
'time_of_day':{ 'time_of_day':{
'midnight': 'midnight', 'midnight': 'midnight',
@ -157,7 +157,7 @@
'November', 'November',
'December', 'December',
] ]
}, },
'nl':{ 'nl':{
'_language': 'Nederlands', '_language': 'Nederlands',
'and': 'en', 'and': 'en',
@ -203,8 +203,6 @@
'today': 'vandaag', 'today': 'vandaag',
'tomorrow': 'morgen', 'tomorrow': 'morgen',
'yesterday': 'gisteren', 'yesterday': 'gisteren',
'next': 'volgende',
'last': 'afgelopen',
}, },
'days':[ 'days':[
"maandag", "maandag",
@ -228,30 +226,12 @@
'oktober', 'oktober',
'november', 'november',
'december', 'december',
], ]
'time_of_hour':{
0: '{hour} uur',
1: '1 over {hour}',
15: 'kwart over {hour}',
30: 'half {hour}',
45: 'kwart voor {hour}',
59: '1 voor {hour}',
'past_hour': '{minute} over {hour}',
'to_hour': '{minute} voor {hour}',
'to_half_hour': '{minute} voor half {hour}',
'past_half_hour': '{minute} over half {hour}',
'half_hour': 'half {hour}',
'use_twelve': true,
},
'time_of_day':{
'midnight': 'middernacht',
'noon': 'middag',
},
}, },
'sv':{ 'sv':{
'_language': 'Svenska', '_language': 'Svenska',
'and': 'och', 'and': 'och',
'in': 'om', 'in': 'i',
'ago': 'sedan', 'ago': 'sedan',
'now': 'nu', 'now': 'nu',
'lose': 'förlora', 'lose': 'förlora',
@ -293,7 +273,6 @@
'today': 'idag', 'today': 'idag',
'tomorrow': 'imorgon', 'tomorrow': 'imorgon',
'yesterday': 'igår', 'yesterday': 'igår',
'next': 'nästa',
}, },
'days':[ 'days':[
"måndag", "måndag",
@ -323,7 +302,7 @@
'_language': 'Deutsch', '_language': 'Deutsch',
'and': 'und', 'and': 'und',
'in': 'in', 'in': 'in',
'ago': 'vor %s', 'ago': 'vor',
'now': 'jetzt', 'now': 'jetzt',
'lose': 'Du verlierst', 'lose': 'Du verlierst',
'gain': 'Du gewinnst', 'gain': 'Du gewinnst',
@ -384,7 +363,7 @@
'Juli', 'Juli',
'August', 'August',
'September', 'September',
'Oktober', 'October',
'November', 'November',
'Dezember', 'Dezember',
] ]
@ -644,8 +623,6 @@
'today': "aujourd'hui", 'today': "aujourd'hui",
'tomorrow': 'demain', 'tomorrow': 'demain',
'yesterday': 'hier', 'yesterday': 'hier',
'next': 'prochain',
'last': 'dernier',
}, },
'days':[ 'days':[
"lundi", "lundi",
@ -716,8 +693,6 @@
'today': 'hoy', 'today': 'hoy',
'tomorrow': 'mañana', 'tomorrow': 'mañana',
'yesterday': 'ayer', 'yesterday': 'ayer',
'next': 'el próximo',
'last': 'el pasado',
}, },
'days':[ 'days':[
'lunes', 'lunes',
@ -736,26 +711,12 @@
'mayo', 'mayo',
'junio', 'junio',
'julio', 'julio',
'agosto', 'agosto'
'septiembre', 'septiembre',
'octubre', 'octubre',
'noviembre', 'noviembre',
'diciembre' 'diciembre'
], ]
'time_of_hour':{
0: '{hour} en punto',
1: '{hour} y un minuto',
15: '{hour} y quarto',
30: '{hour} y media',
45: '{hour} menos quarto',
59: '{hour} menos uno',
'past_hour': '{hour} y {minute}',
'to_hour': '{hour} menos {minute}',
},
'time_of_day':{
'midnight': 'medianoche',
'noon': 'mediodía',
},
}, },
'it':{ 'it':{
'_language': 'Italiano', '_language': 'Italiano',
@ -825,21 +786,7 @@
'ottobre', 'ottobre',
'novembre', 'novembre',
'dicembre', 'dicembre',
], ]
'time_of_hour':{
0: '{hour}',
1: '{hour} e un minuto',
15: '{hour} ed un quarto',
30: '{hour} e mezzo',
45: '15 minuti alle {hour}',
59: 'un minuto alle {hour}',
'past_hour': '{hour} e {minute}',
'to_hour': '{hour} meno {minute}',
},
'time_of_day':{
'midnight': 'mezzanotte',
'noon': 'mezzogiorno',
}
}, },
'pt':{ 'pt':{
'_language': 'Português', '_language': 'Português',
@ -918,9 +865,9 @@
'and': 'i', 'and': 'i',
'in': 'u', 'in': 'u',
'ago': 'prije', 'ago': 'prije',
'now': 'sada', 'now': 'sad',
'lose': 'gubiš', 'lose': 'gubiš',
'gain': 'dobivaš', 'gain': 'dobijaš',
'time':{ 'time':{
'format': '24-hr', 'format': '24-hr',
'year': [ 'year': [
@ -958,8 +905,8 @@
'today': 'danas', 'today': 'danas',
'tomorrow': 'sutra', 'tomorrow': 'sutra',
'yesterday': 'jučer', 'yesterday': 'jučer',
'next': 'sljedeći', 'next': 'slijedeći',
'last': 'protekli', 'last': 'prošli',
}, },
'days':[ 'days':[
"Ponedjeljak", "Ponedjeljak",
@ -1055,436 +1002,12 @@
'Październik', 'Październik',
'Listopad', 'Listopad',
'Grudzień', 'Grudzień',
], ]
'time_of_hour': {
0: '{hour}',
1: 'minuta po {hour}',
15: 'kwadrans po {hour}',
30: 'pół godziny po {hour}',
45: 'za kwadrans {hour}',
59: 'za minutę {hour}',
'past_hour': '{minute} po {hour}',
'to_hour': '{minute} do {hour}'
},
'time_of_day': {
'midnight': 'północ',
'noon': 'południe'
}
},
'ru':{
'_language': 'Русский',
'and': 'и',
'in': 'в',
'ago': 'назад',
'now': 'сейчас',
'lose': 'уменьшение',
'gain': 'увеличение',
'time':{
'format': '24-hr',
'year': [
'г',
'год',
'лет',
],
'week': [
'нед',
'неделя',
'недель',
],
'day': [
'д',
'день',
'дней',
],
'hour': [
'ч',
'час',
'часов',
],
'minute': [
'мин',
'минута',
'минут',
],
'second': [
'сек',
'секунда',
'секунд',
],
},
'delta':{
'today': 'сегодня',
'tomorrow': 'завтра',
'yesterday': 'вчера',
'next': 'следующий',
'last': 'последний',
},
'days':[
"Понедельник",
"Вторник",
"Среда",
"Четверг",
"Пятница",
"Суббота",
"Воскресенье",
],
'months':[
'Январь',
'Февраль',
'Март',
'Апрель',
'Май',
'Июнь',
'Июль',
'Август',
'Сентябрь',
'Октябрь',
'Ноябрь',
'Декабрь',
],
'time_of_hour':{
0: '{hour} часов ровно',
1: '{hour} и 1 минута',
15: '{hour} с четвертью',
30: '{hour} с половиной',
45: 'без четверти {hour}',
59: 'без минуты {hour}',
'past_hour': '{hour} и {minute} минут',
'to_hour': 'без {minute} минут {hour}',
},
'time_of_day':{
'midnight': 'полночь',
'noon': 'полдень',
},
},
'uk':{
'_language': 'Українська',
'and': 'і',
'in': 'в',
'ago': 'тому',
'now': 'зараз',
'lose': 'зменшення',
'gain': 'збільшення',
'time':{
'format': '24-hr',
'year': [
'р',
'рік',
'роки',
],
'week': [
'тиж',
'тиждень',
'тижні',
],
'day': [
'д',
'день',
'дні',
],
'hour': [
'год',
'година',
'години',
],
'minute': [
'хв',
'хвилина',
'хвилини',
],
'second': [
'сек',
'секунда',
'секунди',
],
},
'delta':{
'today': 'сьогодні',
'tomorrow': 'завтра',
'yesterday': 'вчора',
'next': 'наступний',
'last': 'останній',
},
'days':[
"Понеділок",
"Вівторок",
"Середа",
"Четвер",
"П'ятниця",
"Субота",
"Неділя",
],
'months':[
'Січень',
'Лютий',
'Березень',
'Квітень',
'Травень',
'Червень',
'Липень',
'Серпень',
'Вересень',
'Жовтень',
'Листопад',
'Грудень',
],
'time_of_hour':{
0: '{hour} годин',
1: '{hour} годин(а) одна хвилина',
15: 'чверть на {hour}',
30: 'пів на {hour}',
45: 'за чверть {hour}',
59: 'за хвилину {hour}',
'past_hour': '{hour} та {minute} хвилин',
'to_hour': 'за {minute} хвилин {hour}',
},
'time_of_day':{
'midnight': 'опівночі',
'noon': 'опівдні',
},
},
'zh-Hans':{
'_language': '简体中文',
'and': '',
'in': '',
'ago': '之前',
'now': '现在',
'lose': '失去',
'gain': '获得',
'time':{
'format': '24-hr',
'year': [
'年',
'年',
'年',
],
'week': [
'周',
'星期',
'星期',
],
'day': [
'天',
'天',
'天',
],
'hour': [
'时',
'小时',
'小时',
],
'minute': [
'分',
'分钟',
'分钟',
],
'second': [
'秒',
'秒',
'秒',
],
},
'delta':{
'today': '今天',
'tomorrow': '明天',
'yesterday': '昨天',
'next': '下一个',
'last': '上一个',
},
'days':[
"星期一",
"星期二",
"星期三",
"星期四",
"星期五",
"星期六",
"星期日",
],
'months':[
'一月',
'二月',
'三月',
'四月',
'五月',
'六月',
'七月',
'八月',
'九月',
'十月',
'十一月',
'十二月',
],
'time_of_day':{
'midnight': '午夜',
'noon': '正午',
},
},
'ko':{
'_language':'Korean',
'and':'',
'in':'후',
'ago':'전',
'now':'지금',
'lose':'감소',
'gain':'증가',
'time':{
'format':'24-hr',
'year':[
'년',
'년',
'년',
],
'week':[
'주',
'주',
'주',
],
'day':[
'일',
'일',
'일',
],
'hour':[
'시',
'시간',
'시간',
],
'minute':[
'분',
'분',
'분',
],
'second':[
'초',
'초',
'초',
],
},
'delta':{
'today':'오늘',
'tomorrow':'내일',
'yesterday':'어제',
'next':'다음',
'last':'지난',
},
'days':[
'월요일',
'화요일',
'수요일',
'목요일',
'금요일',
'토요일',
'일요일',
],
'months':[
'1월',
'2월',
'3월',
'4월',
'5월',
'6월',
'7월',
'8월',
'9월',
'10월',
'11월',
'12월',
],
'time_of_day':{
'midnight':'자정',
'noon':'정오',
},
},
'cs': {
'_language': 'Čeština',
'and': 'a',
'in': 'za',
'ago': 'před %s',
'now': 'nyní',
'lose': 'ztratit',
'gain': 'získat',
'time': {
'format': '12-hodin',
'year': [
'rok',
'rok',
'roky'
],
'week': [
'týd',
'týden',
'týdny'
],
'day': [
'd',
'den',
'dny'
],
'hour': [
'hod',
'hodina',
'hodiny'
],
'minute': [
'min',
'minuta',
'minuty'
],
'second': [
'sek',
'sekunda',
'sekundy'
]
},
'delta': {
'today': 'dnes',
'tomorrow': 'zítra',
'yesterday': 'včera',
'next': 'příští',
'last': 'poslední'
},
'days': [
'Pondělí',
'Úterý',
'Středa',
'Čtvrtek',
'Pátek',
'Sobota',
'Neděle'
],
'months': [
'Leden',
'Únor',
'Březen',
'Duben',
'Květen',
'Červen',
'Červenec',
'Srpen',
'Září',
'Říjen',
'Listopad',
'Prosinec'
],
'time_of_hour': {
0: '{hour} hodin',
1: 'minuta po {hour}',
15: 'čtvrt na {hour}',
30: 'půl {hour}',
45: 'tři čtvrtě na {hour}',
59: 'minuta do {hour}',
'past_hour': '{minute} po {hour}',
'to_hour': '{minute} do {hour}'
},
'time_of_day': {
'midnight': 'půlnoc',
'noon': 'poledne'
}
} }
} %} } %}
{# DO NOT MODIFY BELOW THIS LINE #} {# DO NOT MODIFY BELOW THIS LINE #}
{% set valid_entity_id_pattern = '^(?!.+__)(?!_)[\\da-z_]+(?<!_)\\.(?!_)[\\da-z_]+(?<!_)$' %}
{% set _bad_value = '?' %} {% set _bad_value = '?' %}
{% set _durations = { {% set _durations = {
'year': 31536000, 'year': 31536000,
@ -1568,10 +1091,10 @@
{%- endmacro -%} {%- endmacro -%}
{%- macro _check_for_duration_sensor(input) %} {%- macro _check_for_duration_sensor(input) %}
{%- if input is string and input | regex_search(valid_entity_id_pattern) and input.startswith('sensor') and states[input] is not none and states[input].attributes.device_class is defined and states[input].attributes.unit_of_measurement is defined -%} {%- if input is string and input | regex_search('^(?!.+__)(?!_)[\da-z_]+(?<!_)\.(?!_)[\da-z_]+(?<!_)$') and input.startswith('sensor') and states[input] is not none and states[input].attributes.device_class is defined and states[input].attributes.unit_of_measurement is defined -%}
{%- set obj = states[input] -%} {%- set obj = states[input] -%}
{%- set multiplier = _duration_sensor.get(obj.attributes.unit_of_measurement) -%} {%- set divisor = _duration_sensor.get(obj.attributes.unit_of_measurement) -%}
{{- (obj.state | float * multiplier) | string | as_timedelta -}} {{- (obj.state | float / divisor) | string | as_timedelta -}}
{%- else %} {%- else %}
{{- '' -}} {{- '' -}}
{%- endif -%} {%- endif -%}
@ -1593,7 +1116,7 @@
{#- assume time as string or entity_id -#} {#- assume time as string or entity_id -#}
{%- elif input is string and input not in ['', 'None'] -%} {%- elif input is string and input not in ['', 'None'] -%}
{#- if entity_id -#} {#- if entity_id -#}
{%- if input | regex_search(valid_entity_id_pattern) -%} {%- if input | regex_search('^(?!.+__)(?!_)[\da-z_]+(?<!_)\.(?!_)[\da-z_]+(?<!_)$') -%}
{%- if attribute is not none and attribute is string -%} {%- if attribute is not none and attribute is string -%}
{{- _to_datetime(state_attr(input, attribute), None) -}} {{- _to_datetime(state_attr(input, attribute), None) -}}
{%- elif input.startswith('input_datetime') and is_state_attr(input, 'has_date', False) -%} {%- elif input.startswith('input_datetime') and is_state_attr(input, 'has_date', False) -%}
@ -1678,7 +1201,7 @@
{%- set index = values.index(values | first | default) %} {%- set index = values.index(values | first | default) %}
{%- for item in values[index:] %} {%- for item in values[index:] %}
{%- set duration = _durations.get(item, 1) %} {%- set duration = _durations.get(item, 1) %}
{%- set period = _periods.get(item, 0) %} {%- set period = _periods.get(item, 1) %}
{%- set value = ((seconds // duration) % (period if period else duration)) | int %} {%- set value = ((seconds // duration) % (period if period else duration)) | int %}
{%- if value > 0 or raw %} {%- if value > 0 or raw %}
{%- if ns.ret | length == 0 %} {%- if ns.ret | length == 0 %}
@ -1729,8 +1252,8 @@
{%- endmacro %} {%- endmacro %}
{%- macro _time_between(func, input1, attr1, utc1, input2, attr2, utc2) -%} {%- macro _time_between(func, input1, attr1, utc1, input2, attr2, utc2) -%}
{%- set t1 = _to_datetime(input1, attr1, utc1) | as_datetime | as_local -%} {%- set t1 = _to_datetime(input1, attr1, utc1) | as_datetime -%}
{%- set t2 = _to_datetime(input2, attr2, utc2) | as_datetime | as_local -%} {%- set t2 = _to_datetime(input2, attr2, utc2) | as_datetime -%}
{%- if t1 is not none and t2 is not none -%} {%- if t1 is not none and t2 is not none -%}
{{- func(t1, t2) -}} {{- func(t1, t2) -}}
{%- else -%} {%- else -%}
@ -1797,19 +1320,16 @@
{%- if uptime %} {%- if uptime %}
{%- set value = _delta_seconds(now(), uptime) | int %} {%- set value = _delta_seconds(now(), uptime) | int %}
{%- set seconds = value | abs %} {%- set seconds = value | abs %}
{%- set current = value == 0 %} {%- set future = value / seconds > 0 %}
{%- set future = not current and value / seconds > 0 %}
{%- set items = _just_time(seconds, language, values, biggest, short=short, floor=floor) %} {%- set items = _just_time(seconds, language, values, biggest, short=short, floor=floor) %}
{%- if current %} {%- if future %}
{{- items }}
{%- elif future %}
{{- translate('in', language=language) }} {{ items }} {{- translate('in', language=language) }} {{ items }}
{%- else %} {%- else %}
{%- set t = translate('ago', language=language) %} {%- set t = translate('ago', language=language) %}
{%- if '%s' in t %} {%- if '%s' in t %}
{{- t % items }} {{ t % items }}
{%- else %} {%- else %}
{{- items }} {{ t }} {{- items }} {{ translate('ago', language=language) }}
{%- endif %} {%- endif %}
{%- endif %} {%- endif %}
{%- else %} {%- else %}
@ -1891,16 +1411,6 @@
{{- _next_weekday(weekday, -7) }} {{- _next_weekday(weekday, -7) }}
{%- endmacro %} {%- endmacro %}
{%- macro nearest_day(weekday) %}
{%- set today_timestamp = as_timestamp(today_at())|int %}
{%- set this_weekday_timestamp = as_timestamp(this_weekday(weekday))|int %}
{%- if today_timestamp < this_weekday_timestamp %}
{{- _next_weekday(weekday, 0) }}
{%- else %}
{{- _next_weekday(weekday, 7) }}
{%- endif %}
{%- endmacro %}
{%- macro days_in_month(month=None) %} {%- macro days_in_month(month=None) %}
{%- set today = today_at() %} {%- set today = today_at() %}
{%- set input = month if month is not none else today.month %} {%- set input = month if month is not none else today.month %}
@ -2017,36 +1527,30 @@
{%- endif -%} {%- endif -%}
{%- endmacro -%} {%- endmacro -%}
{%- macro month(month=None, language=None, short=False) %} {%- macro month(month=None, language=None) %}
{%- if month is datetime %} {%- if month is datetime %}
{%- set idx = month.month - 1 %} {%- set idx = month.month - 1 %}
{%- elif month is integer and month > 0 %} {%- elif month is integer and month > 0 %}
{%- set idx = (month - 1) % 12 %} {%- set idx = (month - 1) % 12 %}
{%- elif month | regex_match(valid_entity_id_pattern) %}
{%- set idx = (states(month) | as_datetime | as_local).month - 1 %}
{%- else %} {%- else %}
{%- set idx = now().month - 1 %} {%- set idx = now().month - 1 %}
{%- endif %} {%- endif %}
{%- set ret = translate('months', index=idx, language=language) %} {{- translate('months', index=idx, language=language) }}
{{- ret[:3] if short else ret }}
{%- endmacro %} {%- endmacro %}
{%- macro weekday(weekday=None, language=None, short=False) %} {%- macro weekday(weekday=None, language=None) %}
{%- if weekday is datetime %} {%- if weekday is datetime %}
{%- set idx = weekday.weekday() %} {%- set idx = weekday.weekday() %}
{%- elif weekday is integer and weekday > 0 %} {%- elif weekday is integer and weekday > 0 %}
{%- set idx = (weekday - 1) % 7 %} {%- set idx = (weekday - 1) % 7 %}
{%- elif weekday | regex_match(valid_entity_id_pattern) %}
{%- set idx = (states(weekday) | as_datetime | as_local).weekday() %}
{%- else %} {%- else %}
{%- set idx = now().weekday() %} {%- set idx = now().weekday() %}
{%- endif %} {%- endif %}
{%- set ret = translate('days', index=idx, language=language) %} {{- translate('days', index=idx, language=language) }}
{{- ret[:3] if short else ret }}
{%- endmacro %} {%- endmacro %}
{%- macro count_the_days(input, attr, utc=False) %} {%- macro count_the_days(input, attr, utc=False) %}
{%- set input = _to_datetime(input, attr, utc) | as_datetime | as_local %} {%- set input = _to_datetime(input, attr, utc) | as_datetime %}
{%- set midnight = today_at() %} {%- set midnight = today_at() %}
{{- (input - midnight).days }} {{- (input - midnight).days }}
{%- endmacro %} {%- endmacro %}
@ -2057,7 +1561,7 @@
{%- set ns = namespace(days=[]) %} {%- set ns = namespace(days=[]) %}
{%- for i in range(-7, 14) %} {%- for i in range(-7, 14) %}
{%- set prefix = translate('delta', 'last', language=language) ~ ' ' if i < -1 else translate('delta', 'next', language=language) ~ ' ' if i > 6 else '' %} {%- set prefix = translate('delta', 'last', language=language) ~ ' ' if i < -1 else translate('delta', 'next', language=language) ~ ' ' if i > 6 else '' %}
{%- set ns.days = ns.days + [ (i | string, prefix ~ _days.get(i, weekday(midnight.weekday() + (i % 7) + 1, language))) ] %} {%- set ns.days = ns.days + [ (i | string, prefix ~ _days.get(i, weekday(midnight.weekday() + i + 1, language))) ] %}
{%- endfor %} {%- endfor %}
{%- set collection = dict.from_keys(ns.days) %} {%- set collection = dict.from_keys(ns.days) %}
{%- set days = count_the_days(input, attr, utc) %} {%- set days = count_the_days(input, attr, utc) %}
@ -2073,7 +1577,7 @@
{%- if '%s' in t %} {%- if '%s' in t %}
{{- t % ret }} {{- t % ret }}
{%- else %} {%- else %}
{{- ret }} {{ t }} {{- ret }} {{ translate('ago', language=language) }}
{%- endif %} {%- endif %}
{%- endif %} {%- endif %}
{%- endif %} {%- endif %}
@ -2082,20 +1586,16 @@
{%- macro hour(hour, language=None) %} {%- macro hour(hour, language=None) %}
{%- if hour is datetime %} {%- if hour is datetime %}
{%- set hour = hour.hour %} {%- set hour = hour.hour %}
{%- elif hour | regex_match(valid_entity_id_pattern) %}
{%- set hour = (states(hour) | as_datetime | as_local).hour %}
{%- endif %} {%- endif %}
{%- set _12 = not (hour % 12) %} {%- set _12 = not (hour % 12) %}
{%- set _24 = not (hour % 24) %} {%- set _24 = not (hour % 24) %}
{%- set use_twelve = translate('time_of_day', 'use_twelve', language=language, fallback=false) %} {%- set _12hr = translate('time','format') == '12-hr' %}
{%- set _12hr = translate('time','format', language=language) == '12-hr' %} {%- if _12 and _24 and _12hr %}
{%- if _12 and _24 and _12hr and not use_twelve %}
{{- translate('time_of_day', 'midnight', language=language) }} {{- translate('time_of_day', 'midnight', language=language) }}
{%- elif _12 and _12hr and not use_twelve %} {%- elif _12 and _12hr %}
{{- translate('time_of_day', 'noon', language=language) }} {{- translate('time_of_day', 'noon', language=language) }}
{%- else %} {%- else %}
{%- set ret = hour % 12 if _12hr else hour %} {{- hour % 12 if _12hr else hour }}
{{- 12 if ret == 0 and use_twelve else ret }}
{%- endif %} {%- endif %}
{%- endmacro %} {%- endmacro %}
@ -2117,22 +1617,7 @@
{%- set hour_phrase = hour(this_hour, language=language) %} {%- set hour_phrase = hour(this_hour, language=language) %}
{%- set minute_phrase = _phrase('minute', 60 * this_minute, language, True, True) if this_minute % 5 else this_minute | string %} {%- set minute_phrase = _phrase('minute', 60 * this_minute, language, True, True) if this_minute % 5 else this_minute | string %}
{%- endif %} {%- endif %}
{%- set this_config = translate('time_of_hour', language=language) %} {%- if this_minute in [0, 1, 15, 30, 45, 59] %}
{%- if (16 <= this_minute <= 29 and 'to_half_hour' in this_config) or (31 <= this_minute <= 44 and 'past_half_hour' in this_config) or (this_minute == 30 and 'half_hour' in this_config) %}
{%- set hour_phrase = hour(this_hour + 1, language=language) %}
{%- if 16 <= this_minute <= 29 %}
{%- set minute_calc = 30 - this_minute %}
{%- set fmat = translate('time_of_hour', 'to_half_hour', language=language) %}
{%- set minute_phrase = _phrase('minute', 60 * minute_calc, language, True, True) if this_minute % 5 else minute_calc | string %}
{%- elif 31 <= this_minute <= 44 %}
{%- set minute_calc = this_minute - 30 %}
{%- set fmat = translate('time_of_hour', 'past_half_hour', language=language) %}
{%- set minute_phrase = _phrase('minute', 60 * minute_calc, language, True, True) if this_minute % 5 else minute_calc | string %}
{%- else %}
{%- set minute_calc = None %}
{%- set fmat = translate('time_of_hour', 'half_hour', language=language) %}
{%- endif %}
{%- elif this_minute in [0, 1, 15, 30, 45, 59] %}
{%- if hour_phrase in ['noon', 'midnight'] and this_minute == 0 %} {%- if hour_phrase in ['noon', 'midnight'] and this_minute == 0 %}
{%- set fmat = '{hour}' %} {%- set fmat = '{hour}' %}
{%- else %} {%- else %}

View File

@ -1,358 +1,234 @@
{# {#
set phrases to be used in the relative_time_period macro set phrases to be used in the relative_time_period macro
one list item per language, each time fraction contains a list with the short and several long forms of time units one list item per language, each time fraction contains a list with the singular, plural and abbriviated phrase
combine contains the text to combine the last time fraction, and error the text to display on wrong date input combine contains the text to combine the last time fraction, and error the text to display on wrong date input
Plural forms for languages: https://www.gnu.org/software/gettext/manual/gettext.html#Plural-forms
asian: ja, vi, ko
english: en, de, nl, sv, da, no, nb, nn, fo, es, pt, it, bg, el, fi, et, he, eo, hu, tr, ca
french: pt_BR, fr
latvian: lv
irish: ga
romanian: ro
lithuanian: lv
russian: ru, uk, be, sr, hr
slovak: cs, sk
polish: pl
slovenian: sl
arabic: ar
#} #}
{%- set _time_period_phrases = [ {%- set _time_period_phrases = [
{ {
'language': 'en', 'language': 'en',
'plural_form': 'english',
'phrases': { 'phrases': {
'year': ['yr', 'year', 'years'], 'year': ['year', 'years', 'yr'],
'month': ['mth', 'month', 'months'], 'month': ['month', 'months', 'mth'],
'week': ['wk', 'week', 'weeks'], 'week': ['week', 'weeks', 'wk'],
'day': ['day', 'day', 'days'], 'day': ['day', 'days', 'day'],
'hour': ['hr', 'hour', 'hours'], 'hour': ['hour', 'hours', 'hr'],
'minute': ['min', 'minute', 'minutes'], 'minute': ['minute', 'minutes', 'min'],
'second': ['sec', 'second', 'seconds'], 'second': ['second', 'seconds', 'sec'],
'millisecond': ['ms', 'millisecond', 'milliseconds'], 'millisecond': ['millisecond', 'milliseconds', 'ms'],
'combine': 'and', 'combine': 'and',
'error': 'Invalid date', 'error': 'Invalid date',
} }
}, },
{ {
'language': 'pl', 'language': 'pl',
'plural_form': 'polish',
'phrases': { 'phrases': {
'year': ['r', 'rok', 'lata', 'lat'], 'year': ['rok', 'lat', 'r'],
'month': ['msc', 'miesiąc', 'miesiące', 'miesięcy'], 'month': ['miesiąc', 'miesięcy', 'msc'],
'week': ['tyg', 'tydzień', 'tygodnie', 'tygodni'], 'week': ['tydzień', 'tygodni', 'tyg'],
'day': ['dzień', 'dzień', 'dni', 'dni'], 'day': ['dzień', 'dni', 'dzień'],
'hour': ['godz', 'godzina', 'godziny', 'godzin'], 'hour': ['godzina', 'godzin', 'godz'],
'minute': ['min', 'minuta', 'minuty', 'minut'], 'minute': ['minuta', 'minut', 'min'],
'second': ['sek', 'sekunda', 'sekundy', 'sekund'], 'second': ['sekunda', 'sekund', 'sek'],
'millisecond': ['ms', 'milisekunda', 'milisekundy', 'milisekund'], 'millisecond': ['milisekunda', 'milisekund', 'ms'],
'combine': 'i', 'combine': 'i',
'error': 'Niepoprawna data', 'error': 'Niepoprawna data',
} }
}, },
{ {
'language': 'fr', 'language': 'fr',
'plural_form': 'french',
'phrases': { 'phrases': {
'year': ['an', 'année', 'années'], 'year': ['année', 'années', 'an'],
'month': ['mois', 'mois', 'mois'], 'month': ['mois', 'mois', 'mois'],
'week': ['sem', 'semaine', 'semaines'], 'week': ['semaine', 'semaines', 'sem'],
'day': ['j', 'jour', 'jours'], 'day': ['jour', 'jours', 'j'],
'hour': ['h', 'heure', 'heures'], 'hour': ['heure', 'heures', 'h'],
'minute': ['min', 'minute', 'minutes'], 'minute': ['minute', 'minutes', 'min'],
'second': ['sec', 'seconde', 'secondes'], 'second': ['seconde', 'secondes', 'sec'],
'millisecond': ['ms', 'milliseconde', 'millisecondes'], 'millisecond': ['milliseconde', 'millisecondes', 'ms'],
'combine': 'et', 'combine': 'et',
'error': 'Date non valide', 'error': 'Date non valide',
} }
}, },
{ {
'language': 'it', 'language': 'it',
'plural_form': 'english',
'phrases': { 'phrases': {
'year': ['aa', 'anno', 'anni'], 'year': ['anno', 'anni', 'aa'],
'month': ['mm', 'mese', 'mesi'], 'month': ['mese', 'mesi', 'mm'],
'week': ['set', 'settimana', 'settimane'], 'week': ['settimana', 'settimane', 'set'],
'day': ['gg', 'giorno', 'giorni'], 'day': ['giorno', 'giorni', 'gg'],
'hour': ['h', 'ora', 'ore'], 'hour': ['ora', 'ore', 'h'],
'minute': ['min', 'minuto', 'minuti'], 'minute': ['minuto', 'minuti', 'min'],
'second': ['sec', 'secondo', 'secondi'], 'second': ['secondo', 'secondi', 'sec'],
'millisecond': ['ms', 'millisecondo', 'millisecondi'], 'millisecond': ['millisecondo', 'millisecondi', 'ms'],
'combine': 'e', 'combine': 'e',
'error': 'Data non valida', 'error': 'Data non valida',
} }
}, },
{ {
'language': 'nb', 'language': 'nb',
'plural_form': 'english',
'phrases': { 'phrases': {
'year': ['år', 'år', 'år'], 'year': ['år', 'år', 'år'],
'month': ['mnd', 'måned', 'måneder'], 'month': ['måned', 'måneder', 'mnd'],
'week': ['u', 'uke', 'uker'], 'week': ['uke', 'uker', 'u'],
'day': ['d', 'dag', 'dager'], 'day': ['dag', 'dager', 'd'],
'hour': ['t', 'time', 'timer'], 'hour': ['time', 'timer', 't'],
'minute': ['min', 'minutt', 'minutter'], 'minute': ['minutt', 'minutter', 'min'],
'second': ['sek', 'sekund', 'sekunder'], 'second': ['sekund', 'sekunder', 'sek'],
'millisecond': ['ms', 'millisekund', 'millisekunder'], 'millisecond': ['millisekund', 'millisekunder', 'ms'],
'combine': 'og', 'combine': 'og',
'error': 'Ugyldig dato', 'error': 'Ugyldig dato',
} }
}, },
{ {
'language': 'nl', 'language': 'nl',
'plural_form': 'english',
'phrases': { 'phrases': {
'year': ['jr', 'jaar', 'jaar'], 'year': ['jaar', 'jaar', 'jr'],
'month': ['mnd', 'maand', 'maanden'], 'month': ['maand', 'maanden', 'mnd'],
'week': ['wk', 'week', 'weken'], 'week': ['week', 'weken', 'wk'],
'day': ['dg', 'dag', 'dagen'], 'day': ['dag', 'dagen', 'dg'],
'hour': ['u', 'uur', 'uur'], 'hour': ['uur', 'uur', 'u'],
'minute': ['min', 'minuut', 'minuten'], 'minute': ['minuut', 'minuten', 'min'],
'second': ['sec', 'seconde', 'seconden'], 'second': ['seconde', 'seconden', 'sec'],
'millisecond': ['ms', 'milliseconde', 'milliseconden'], 'millisecond': ['milliseconde', 'milliseconden', 'ms'],
'combine': 'en', 'combine': 'en',
'error': 'Ongeldige datum', 'error': 'Ongeldige datum',
} }
}, },
{ {
'language': 'nn', 'language': 'nn',
'plural_form': 'english',
'phrases': { 'phrases': {
'year': ['år', 'år', 'år'], 'year': ['år', 'år', 'år'],
'month': ['mnd', 'månad', 'månader'], 'month': ['månad', 'månader', 'mnd'],
'week': ['v', 'veke', 'veker'], 'week': ['veke', 'veker', 'v'],
'day': ['d', 'dag', 'dagar'], 'day': ['dag', 'dagar', 'd'],
'hour': ['t', 'time', 'timar'], 'hour': ['time', 'timar', 't'],
'minute': ['min', 'minutt', 'minutt'], 'minute': ['minutt', 'minutt', 'min'],
'second': ['sek', 'sekund', 'sekund'], 'second': ['sekund', 'sekund', 'sek'],
'millisecond': ['ms', 'millisekund', 'millisekund'], 'millisecond': ['millisekund', 'millisekund', 'ms'],
'combine': 'og', 'combine': 'og',
'error': 'Ugyldig dato', 'error': 'Ugyldig dato',
} }
}, },
{ {
'language': 'de', 'language': 'de',
'plural_form': 'english',
'phrases': { 'phrases': {
'year': ['J.', 'Jahr', 'Jahre'], 'year': ['Jahr', 'Jahre', 'J.'],
'month': ['M.', 'Monat', 'Monate'], 'month': ['Monat', 'Monate', 'M.'],
'week': ['Wo.', 'Woche', 'Wochen'], 'week': ['Woche', 'Wochen', 'Wo.'],
'day': ['Tg.', 'Tag', 'Tage'], 'day': ['Tag', 'Tage', 'Tg.'],
'hour': ['Std.', 'Stunde', 'Stunden'], 'hour': ['Stunde', 'Stunden', 'Std.'],
'minute': ['Min.', 'Minute', 'Minuten'], 'minute': ['Minute', 'Minuten', 'Min.'],
'second': ['Sek.', 'Sekunde', 'Sekunden'], 'second': ['Sekunde', 'Sekunden', 'Sek.'],
'millisecond': ['ms', 'Millisekunde', 'Millisekunden'], 'millisecond': ['Millisekunde', 'Millisekunden', 'ms'],
'combine': 'und', 'combine': 'und',
'error': 'Falsches Datum', 'error': 'Falsches Datum',
} }
}, },
{ {
'language': 'pt', 'language': 'pt',
'plural_form': 'english',
'phrases': { 'phrases': {
'year': ['aa', 'ano', 'anos'], 'year': ['ano', 'anos', 'aa'],
'month': ['mm', 'mês', 'meses'], 'month': ['mês', 'meses', 'mm'],
'week': ['sem', 'semana', 'semanas'], 'week': ['semana', 'semanas', 'sem'],
'day': ['d', 'dia', 'dias'], 'day': ['dia', 'dias', 'd'],
'hour': ['h', 'hora', 'horas'], 'hour': ['hora', 'horas', 'h'],
'minute': ['min', 'minuto', 'minutos'], 'minute': ['minuto', 'minutos', 'min'],
'second': ['seg', 'segundo', 'segundos'], 'second': ['segundo', 'segundos', 'seg'],
'millisecond': ['ms', 'millissegundo', 'millissegundos'], 'millisecond': ['millissegundo', 'millissegundos', 'ms'],
'combine': 'e', 'combine': 'e',
'error': 'Data Inválida', 'error': 'Data Inválida',
} }
}, },
{ {
'language': 'dk', 'language': 'dk',
'plural_form': 'english',
'phrases': { 'phrases': {
'year': ['år', 'år', 'år'], 'year': ['år', 'år', 'år'],
'month': ['mnd', 'måned', 'måneder'], 'month': ['måned', 'måneder', 'mnd'],
'week': ['uge', 'uge', 'uger'], 'week': ['uge', 'uger', 'uge'],
'day': ['dag', 'dag', 'dage'], 'day': ['dag', 'dage', 'dag'],
'hour': ['t.', 'time', 'timer'], 'hour': ['time', 'timer', 't.'],
'minute': ['min.', 'minut', 'minuter'], 'minute': ['minut', 'minuter', 'min.'],
'second': ['sek.', 'sekund', 'sekunder'], 'second': ['sekund', 'sekunder', 'sek.'],
'millisecond': ['ms.', 'millisekund', 'millisekunder'], 'millisecond': ['millisekund', 'millisekunder', 'ms.'],
'combine': 'og', 'combine': 'og',
'error': 'Ugyldig dato', 'error': 'Ugyldig dato',
} }
}, },
{ {
'language': 'sv', 'language': 'sv',
'plural_form': 'english',
'phrases': { 'phrases': {
'year': ['år', 'år', 'år'], 'year': ['år', 'år', 'år'],
'month': ['mån', 'månad', 'månader'], 'month': ['månad', 'månader', 'mån'],
'week': ['v', 'vecka', 'veckor'], 'week': ['vecka', 'veckor', 'v'],
'day': ['dag', 'dag', 'dagar'], 'day': ['dag', 'dagar', 'dag'],
'hour': ['tim', 'timme', 'timmar'], 'hour': ['timme', 'timmar', 'tim'],
'minute': ['min', 'minut', 'minuter'], 'minute': ['minut', 'minuter', 'min'],
'second': ['sek', 'sekund', 'sekunder'], 'second': ['sekund', 'sekunder', 'sek'],
'millisecond': ['ms', 'millisekund', 'millisekunder'], 'millisecond': ['millisekund', 'millisekunder', 'ms'],
'combine': 'och', 'combine': 'och',
'error': 'Ogiltigt datum', 'error': 'Ogiltigt datum',
} }
}, },
{ {
'language': 'cs', 'language': 'cs',
'plural_form': 'slovak',
'phrases': { 'phrases': {
'year': ['rok', 'rok', 'roky', 'let'], 'year': ['rok', 'roky', 'rok'],
'month': ['měs', 'měsíc', 'měsíce', 'měsíců'], 'month': ['měsíc', 'měsíce', 'měs'],
'week': ['týd', 'týden', 'týdny', 'týd'], 'week': ['týden', 'týdny', 'týd'],
'day': ['d', 'den', 'dny', 'd'], 'day': ['den', 'dny', 'd'],
'hour': ['hod', 'hodina', 'hodiny', 'hodin'], 'hour': ['hodina', 'hodiny', 'hod'],
'minute': ['min', 'minuta', 'minuty', 'minut'], 'minute': ['minuta', 'minuty', 'min'],
'second': ['sek', 'sekunda', 'sekundy', 'sekund'], 'second': ['sekunda', 'sekundy', 'sek'],
'millisecond': ['ms', 'millisekunda', 'millisekundy', 'millisekund'], 'millisecond': ['millisekunda', 'millisekundy', 'ms'],
'combine': 'a', 'combine': 'a',
'error': 'špatné datum' 'error': 'špatný datum'
} }
}, },
{ {
'language': 'fi', 'language': 'fi',
'plural_form': 'english',
'phrases': { 'phrases': {
'year': ['v', 'vuosi', 'vuotta'], 'year': ['vuosi', 'vuotta', 'v'],
'month': ['kk', 'kuukausi', 'kuukautta'], 'month': ['kuukausi', 'kuukautta', 'kk'],
'week': ['vk', 'viikko', 'viikkoa'], 'week': ['viikko', 'viikkoa', 'vk'],
'day': ['pv', 'päivä', 'päivää'], 'day': ['päivä', 'päivää', 'pv'],
'hour': ['t', 'tunti', 'tuntia'], 'hour': ['tunti', 'tuntia', 't'],
'minute': ['min', 'minuutti', 'minuuttia'], 'minute': ['minuutti', 'minuuttia', 'min'],
'second': ['s', 'sekunti', 'sekuntia'], 'second': ['sekunti', 'sekuntia', 's'],
'millisecond': ['ms', 'millisekunti', 'millisekuntia'], 'millisecond': ['millisekunti', 'millisekuntia', 'ms'],
'combine': 'ja', 'combine': 'ja',
'error': 'Väärä päivämäärä', 'error': 'Väärä päivämäärä',
} }
}, },
{ {
'language': 'ru', 'language': 'ru',
'plural_form': 'russian',
'phrases': { 'phrases': {
'year': ['г', 'год', 'года', 'лет'], 'year': ['год', 'года', 'г'],
'month': ['м', 'месяц', 'месяца', 'месяцев'], 'month': ['месяц', 'месяцы', 'м'],
'week': ['н', 'неделя', 'недели', 'недель'], 'week': ['неделя', 'недели', 'н'],
'day': ['д', 'день', 'дня', 'дней'], 'day': ['день', 'дни', 'д'],
'hour': ['ч', 'час', 'часа', 'часов'], 'hour': ['час', 'часы', 'ч'],
'minute': ['м', 'минута', 'минуты', 'минут'], 'minute': ['минута', 'минут', 'м'],
'second': ['с', 'секунда', 'секунды', 'секунд'], 'second': ['секунд', 'секунды', 'с'],
'millisecond': ['мс', 'миллисекунда', 'миллисекунды', 'миллисекунд'], 'millisecond': ['милисекунд', 'милисекунды', 'мс'],
'combine': 'и', 'combine': 'и',
'error': 'Неверная дата', 'error': 'Неверная дата',
} }
}, },
{ {
'language': 'uk', 'language': 'uk',
'plural_form': 'russian',
'phrases': { 'phrases': {
'year': ['р', 'рік', 'роки', 'років'], 'year': ['рік', 'років', 'р'],
'month': ['м', 'місяць', 'місяці', 'місяців'], 'month': ['місяць', 'місяців', 'м'],
'week': ['тижд', 'тиждень', 'тижні', 'тижнів'], 'week': ['тиждень', 'тижнів', 'тижд'],
'day': ['дн', 'день', 'дні', 'днів'], 'day': ['день', 'днів', 'дн'],
'hour': ['год', 'година', 'години', 'годин'], 'hour': ['годину', 'годин', 'год'],
'minute': ['хв', 'хвилина', 'хвилини', 'хвилин'], 'minute': ['хвилину', 'хвилин', 'хв'],
'second': ['сек', 'секунда', 'секунди', 'секунд'], 'second': ['секунду', 'секунд', 'сек'],
'millisecond': ['мсек', 'мілісекунда', 'мілісекунди', 'мілісекунд'], 'millisecond': ['мілісекунду', 'мілісекунд', 'мсек'],
'combine': 'та', 'combine': 'та',
'error': 'Недійсна дата', 'error': 'Недійсна дата',
} }
}, },
{
'language': 'bg',
'plural_form': 'english',
'phrases': {
'year': ['г', 'година', 'години'],
'month': ['м', 'месец', 'месеца'],
'week': ['седм', 'седмица', 'седмици'],
'day': ['д', 'ден', 'дни'],
'hour': ['ч', 'час', 'часа'],
'minute': ['м', 'минута', 'минути'],
'second': ['с', 'секунда', 'секунди'],
'millisecond': ['мс', 'милисекунда', 'милисекунди'],
'combine': 'и',
'error': 'Невалидна дата',
}
},
{
'language': 'vi',
'plural_form': 'asian',
'phrases': {
'year': ['y', 'năm'],
'month': ['m', 'tháng'],
'week': ['w', 'tuần'],
'day': ['d', 'ngày'],
'hour': ['h', 'giờ'],
'minute': ['m', 'phút', 'phút'],
'second': ['s', 'giây'],
'millisecond': ['ms', 'mili giây'],
'combine': 'và',
'error': 'Ngày không hợp lệ',
}
},
{
'language': 'es',
'plural_form': 'english',
'phrases': {
'year': ['a', 'año', 'años'],
'month': ['m', 'mes', 'meses'],
'week': ['sem', 'semana', 'semanas'],
'day': ['d', 'día', 'días'],
'hour': ['h', 'hora', 'horas'],
'minute': ['min', 'minuto', 'minutos'],
'second': ['s', 'segundo', 'segundos'],
'millisecond': ['ms', 'milisegundo', 'milisegundos'],
'combine': 'y',
'error': 'Fecha inválida',
}
},
{
'language': 'he',
'plural_form': 'english',
'phrases': {
'year': ['שנה', 'שנה', 'שנים'],
'month': ['חודש', 'חודש', 'חודשים'],
'week': ['שבוע', 'שבוע', 'שבועות'],
'day': ['יום', 'יום', 'ימים'],
'hour': ['שעה', 'שעה', 'שעות'],
'minute': ['דקה', 'דקה', 'דקות'],
'second': ['שניה', 'שניה', 'שניות'],
'millisecond': ['מילי', 'מילישניה', 'מילישניות'],
'combine': 'ו',
'error': 'תאריך לא חוקי',
}
},
{
'language': 'hu',
'plural_form': 'english',
'phrases': {
'year': ['é', 'év', 'év'],
'month': ['hó', 'hónap', 'hónap'],
'week': ['hét', 'hét', 'hét'],
'day': ['n', 'nap', 'nap'],
'hour': ['ó', 'óra', 'óra'],
'minute': ['p', 'perc', 'perc'],
'second': ['mp', 'másodperc', 'másodperc'],
'millisecond': ['ms', 'ezredmásodperc', 'ezredmásodperc'],
'combine': 'és',
'error': 'Érvénytelen dátum',
}
},
{
'language': 'tr',
'plural_form': 'english',
'phrases': {
'year': ['yıl', 'yıl', 'yıl'],
'month': ['ay', 'ay', 'ay'],
'week': ['hf', 'hafta', 'hafta'],
'day': ['gün', 'gün', 'gün'],
'hour': ['sa', 'saat', 'saat'],
'minute': ['dk', 'dakika', 'dakika'],
'second': ['sn', 'saniye', 'saniye'],
'millisecond': ['ms', 'milisaniye', 'milisaniye'],
'combine': 've',
'error': 'Geçersiz tarih',
}
},
] -%} ] -%}
{# macro to convert the abbreviated input for the not_use and always_show lists to the full time part names #} {# macro to convert the abbreviated input for the not_use and always_show lists to the full time part names #}
@ -379,14 +255,12 @@
{%- set date = date if date is datetime else date | as_datetime('invalid') -%} {%- set date = date if date is datetime else date | as_datetime('invalid') -%}
{%- set compare_date = compare_date if compare_date is datetime else compare_date | as_datetime('invalid') -%} {%- set compare_date = compare_date if compare_date is datetime else compare_date | as_datetime('invalid') -%}
{%- set time = time | bool(true) -%} {%- set time = time | bool(true) -%}
{%- set parts = [parts | int(1), always_show | count] | max -%} {%- set parts = [parts | int(1), always_show | count] | max -%}
{# create namespace to store debug data #}
{%- set debug = namespace(debug="") -%}
{# 1: check if date input is correct #} {# 1: check if date input is correct #}
{%- if date is datetime and compare_date is datetime -%} {%- if date is datetime and compare_date is datetime -%}
{# convert date input to local or date only #} {# convert date input to local or date only #}
{%- set date = date | as_local if time else (date | as_local).date() -%} {%- set date = date | as_local if time else (date | as_local).date() -%}
{%- set compare_date = compare_date | as_local if time else (compare_date | as_local).date() -%} {%- set compare_date = compare_date | as_local if time else (compare_date | as_local).date() -%}
{# determine highest and lowest date #} {# determine highest and lowest date #}
{%- set date_max = [compare_date, date] | max -%} {%- set date_max = [compare_date, date] | max -%}
{%- set date_min = [compare_date, date] | min -%} {%- set date_min = [compare_date, date] | min -%}
@ -408,7 +282,7 @@
{%- if not not_use in [['millisecond'], []] -%} {%- if not not_use in [['millisecond'], []] -%}
{%- set not_use = _abbr_to_full(not_use) | from_json -%} {%- set not_use = _abbr_to_full(not_use) | from_json -%}
{%- endif -%} {%- endif -%}
{%- set not_use = not_use + ['hour', 'minute', 'second', 'millisecond' ] if not time else not_use -%} {%- set not_use = not_use + ['hour', 'minute', 'second', 'millisecond' ] if not time else not_use -%}
{%- if always_show in [['all'], 'all'] -%} {%- if always_show in [['all'], 'all'] -%}
{%- set always_show = dur.keys() | list -%} {%- set always_show = dur.keys() | list -%}
{%- elif always_show != [] -%} {%- elif always_show != [] -%}
@ -422,7 +296,7 @@
{%- if do_use and ms < dur[do_use|last] -%} {%- if do_use and ms < dur[do_use|last] -%}
{{- {do_use | last: (ms / dur[do_use|last]) | round(0, round_mode)} | to_json -}} {{- {do_use | last: (ms / dur[do_use|last]) | round(0, round_mode)} | to_json -}}
{%- else -%} {%- else -%}
{# check if it is needed to determine years #} {# check if it is needed to determine years #}
{%- if ms >= dur.day * 365 -%} {%- if ms >= dur.day * 365 -%}
{#- set numer of years, and set highest date using this number of years #} {#- set numer of years, and set highest date using this number of years #}
{%- set yrs = date_max.year - date_min.year - (1 if date_max.replace(year=date_min.year) < date_min else 0) -%} {%- set yrs = date_max.year - date_min.year - (1 if date_max.replace(year=date_min.year) < date_min else 0) -%}
@ -431,7 +305,7 @@
{%- set ms_yrs = ms -%} {%- set ms_yrs = ms -%}
{%- endif -%} {%- endif -%}
{%- set yrs = yrs | default(0) -%} {%- set yrs = yrs | default(0) -%}
{# check if it is needed to determine months #} {# check if it is needed to determine months #}
{%- set check_mth = {%- set check_mth =
ms >= dur.day * 28 ms >= dur.day * 28
and 'month' in do_use and 'month' in do_use
@ -480,7 +354,7 @@
{%- set first = keys | select('in', always_show | default([], true) + [first]) | first -%} {%- set first = keys | select('in', always_show | default([], true) + [first]) | first -%}
{%- set to_use = keys[keys.index(first):] -%} {%- set to_use = keys[keys.index(first):] -%}
{%- set to_output = to_use[:parts] -%} {%- set to_output = to_use[:parts] -%}
{%- set last = dur.items() | selectattr('0', 'in', to_output) | map(attribute='0') | list | last | default('millisecond') -%} {%- set last = to_output | last |default('millisecond') -%}
{# 3: check if there is anything left to use #} {# 3: check if there is anything left to use #}
{%- if to_use -%} {%- if to_use -%}
{%- set to_output = to_use[:parts] -%} {%- set to_output = to_use[:parts] -%}
@ -491,10 +365,9 @@
{%- set to_reject = to_use | reject('in', to_output) | reject('in', always_show) | list -%} {%- set to_reject = to_use | reject('in', to_output) | reject('in', always_show) | list -%}
{%- set not_use = not_use + to_output[as_check*-1:] + to_reject -%} {%- set not_use = not_use + to_output[as_check*-1:] + to_reject -%}
{%- set to_output = to_output | reject('in', not_use) | list + always_show -%} {%- set to_output = to_output | reject('in', not_use) | list + always_show -%}
{%- set to_output = keys | select('in', to_output) | list + ['extra']-%} {%- set to_output = keys | select('in', to_output) | list -%}
{%- set output = time_split(date, parts, compare_date, not_use, always_show, time, round_mode) | from_json -%} {%- set output = time_split(date, parts, compare_date, not_use, always_show, time, round_mode) | from_json -%}
{%- endif -%} {%- endif -%}
{# apply round if needed #} {# apply round if needed #}
{%- if round_mode in ['common', 'ceil'] and last != 'millisecond' -%} {%- if round_mode in ['common', 'ceil'] and last != 'millisecond' -%}
{# determine first and last item with data #} {# determine first and last item with data #}
@ -503,59 +376,22 @@
{%- set remain_part = remain / dur[last] -%} {%- set remain_part = remain / dur[last] -%}
{%- set to_round = 1 if remain_part >= 0.5 and round_mode == 'common' else remain_part | round(0, round_mode) -%} {%- set to_round = 1 if remain_part >= 0.5 and round_mode == 'common' else remain_part | round(0, round_mode) -%}
{%- set sec_to_add = ((dur[last] + (dur.day if last in ['year', 'month'] else 1) - remain) | round(0, 'ceil') * to_round) / 1000 -%} {%- set sec_to_add = ((dur[last] + (dur.day if last in ['year', 'month'] else 1) - remain) | round(0, 'ceil') * to_round) / 1000 -%}
{%- set round_mode = 'floor' -%}
{%- set date_max = [compare_date, date] | max + timedelta(seconds=sec_to_add) -%} {%- set date_max = [compare_date, date] | max + timedelta(seconds=sec_to_add) -%}
{%- set date_min = [compare_date, date] | min -%} {%- set date_min = [compare_date, date] | min -%}
{%- set output = time_split(date_max, parts, date_min, not_use, always_show, time, 'floor') | from_json -%} {%- set output = time_split(date_max, parts, date_min, not_use, always_show, time, round_mode) | from_json -%}
{%- set output = dict(output.items() | selectattr('0', 'in', do_use)) -%}
{%- set keys = output.keys() | list -%}
{%- set with_value = output.items() | rejectattr('1', 'eq', 0) | map(attribute='0') | list -%}
{%- set first = with_value | first | default('millisecond') -%}
{%- set first = keys | select('in', always_show | default([], true) + [first]) | first -%}
{%- set to_use = keys[keys.index(first):] -%}
{%- set to_output = to_use[:parts] -%}
{%- endif -%} {%- endif -%}
{# output result #} {# output result #}
{%- set zero_values = output.items() | selectattr('1', 'eq', 0) | map(attribute='0') | list -%} {%- set zero_values = output.items() | selectattr('1', 'eq', 0) | map(attribute='0') | list -%}
{%- set reject_list = zero_values | reject('in', always_show) | list -%} {%- set reject_list = zero_values | reject('in', always_show) | list -%}
{{- dict(output.items() | selectattr('0', 'in', to_output) | rejectattr('0', 'in', reject_list), **dict(debug=debug.debug) if debug.debug else dict()) | default({always_return: 0}, true) | to_json-}} {{- dict(output.items() | selectattr('0', 'in', to_output) | rejectattr('0', 'in', reject_list)) | default({always_return: 0}, true) | to_json -}}
{%- else -%} {{- dict(error='No time parts left to output') -}} {%- else -%} {{- dict(error='No time parts left to output') | to_json -}}
{%- endif -%} {# 3 #} {%- endif -%} {# 3 #}
{%- endif -%} {# 2 #} {%- endif -%} {# 2 #}
{%- else -%} {{- dict(error='Invalid date input')-}} {%- else -%} {{- dict(error='Invalid date input') | to_json -}}
{%- endif -%} {# 1 #} {%- endif -%} {# 1 #}
{%- endmacro -%} {%- endmacro -%}
{# macro for determining the time unit variant depending on the language #}
{%- macro plural(number=0, rule='english') -%}
{%- set mod100 = number % 100 -%}
{%- set mod10 = number % 10 -%}
{%- set form = 1 -%}
{%- if rule == 'english' -%}
{%- set form = 1 if number == 1 else 2 -%}
{%- elif rule == 'french' -%}
{%- set form = 1 if number <= 1 else 2 -%}
{%- elif rule == 'latvian' -%}
{%- set form = 1 if (mod10 == 1 and mod100 != 11) else 2 if number != 0 else 3 -%}
{%- elif rule == 'irish' -%}
{%- set form = 1 if number == 1 else 2 if number == 2 else 3 -%}
{%- elif rule == 'romanian' -%}
{%- set form = 1 if number == 1 else 2 if (number == 0 or (mod100 > 0 and mod100 < 20 )) else 3 -%}
{%- elif rule == 'lithuanian' -%}
{%- set form = 1 if (mod10 == 1 and mod100 != 11) else 2 if (mod10 >= 2 and (mod100 < 10 or mod100 >= 20)) else 3 -%}
{%- elif rule == 'russian' -%}
{%- set form = 1 if (mod10 == 1 and mod100 != 11) else 2 if (mod10 >= 2 and mod10 <= 4 and (mod100 < 10 or mod100 >= 20)) else 3 -%}
{%- elif rule == 'slovak' -%}
{%- set form = 1 if number == 1 else 2 if (number >= 2 and number <= 4) else 3 -%}
{%- elif rule == 'polish' -%}
{%- set form = 1 if number == 1 else 2 if (mod10 >= 2 and mod10 <= 4 and (mod100 < 10 or mod100 >= 20)) else 3 -%}
{%- elif rule == 'slovenian' -%}
{%- set form = 1 if mod100 == 1 else 2 if mod100 == 2 else 3 if (mod100 == 3 or mod100 == 4) else 4 -%}
{%- elif rule == 'arabic' -%}
{%- set form = 1 if number == 0 else 2 if number == 1 else 3 if number == 2 else 4 if (mod100 >= 3 and mod100 <= 10) else 5 if mod100 >= 11 else 6 -%}
{%- endif -%}
{{- form -}}
{%- endmacro -%}
{# macro to output a timedelta in a readable format #} {# macro to output a timedelta in a readable format #}
{%- macro relative_time_plus(date, parts=1, abbr=false, language='en', compare_date=now(), not_use=['millisecond'], always_show=[], time=true, round_mode='floor') -%} {%- macro relative_time_plus(date, parts=1, abbr=false, language='en', compare_date=now(), not_use=['millisecond'], always_show=[], time=true, round_mode='floor') -%}
{#- select correct phrases bases on language input #} {#- select correct phrases bases on language input #}
@ -563,7 +399,6 @@
{%- set languages = phrases | map(attribute='language') | list -%} {%- set languages = phrases | map(attribute='language') | list -%}
{%- set language = iif(language in languages, language, 'en') -%} {%- set language = iif(language in languages, language, 'en') -%}
{%- set phr = phrases | selectattr('language', 'eq', language) | map(attribute='phrases') | list | first -%} {%- set phr = phrases | selectattr('language', 'eq', language) | map(attribute='phrases') | list | first -%}
{%- set plural_form = phrases | selectattr('language', 'eq', language) | map(attribute='plural_form') | list | first -%}
{%- set abbr = abbr | bool(false) -%} {%- set abbr = abbr | bool(false) -%}
{# split timedelta #} {# split timedelta #}
{%- set time_parts = time_split(date, parts, compare_date, not_use, always_show, time, round_mode) | from_json -%} {%- set time_parts = time_split(date, parts, compare_date, not_use, always_show, time, round_mode) | from_json -%}
@ -574,9 +409,9 @@
{# convert to phrases #} {# convert to phrases #}
{%- set ns = namespace(phrases=[]) -%} {%- set ns = namespace(phrases=[]) -%}
{%- for i in time_parts.keys() -%} {%- for i in time_parts.keys() -%}
{%- set plural_variant = plural(time_parts[i], plural_form) | int -%} {%- set phr_abbr = phr[i][2] -%}
{%- set phr_form = phr[i][0] if abbr else phr[i][plural_variant] -%} {%- set phr_verb = phr[i][1] if time_parts[i] != 1 else phr[i][0] -%}
{%- set phrase = '{} {}'.format(time_parts[i], phr_form) -%} {%- set phrase = '{} {}'.format(time_parts[i], phr_abbr if abbr else phr_verb) -%}
{%- set ns.phrases = ns.phrases + [phrase] -%} {%- set ns.phrases = ns.phrases + [phrase] -%}
{%- endfor -%} {%- endfor -%}
{#- join phrases in a string, using phr.combine for the last item #} {#- join phrases in a string, using phr.combine for the last item #}

View File

@ -12,64 +12,21 @@
{% endif %} {% endif %}
{% endmacro %} {% 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(' - ') %}
{% if quarter == 'ot' %}
with {{ clock_time ~ ' remaining in overtime' }}
{% else %}
with {{ clock_time ~ ' remaining in the ' ~ quarter ~ ' ' ~ period_str }}
{% endif %}
{% endif %}
{% endif %}
{% endmacro %}
{{ cleanup(data()) }}
{% endmacro %}
{% macro sports_pregame(team) %} {% macro sports_pregame(team) %}
{% macro data() %} {% 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') %} {% if is_state(team,'PRE') %}
{% set date = state_attr(team,'date') | as_timestamp | timestamp_custom('%m-%d') %} {% set date = state_attr(team,'date') | as_timestamp | timestamp_custom('%m-%d') %}
{% if date == now().strftime('%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 %} {{ 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 %} {{ state_attr(team,'opponent_name') }} at {{ state_attr(team,'venue') }}.
{{ sports_str(team,'start') }} is at {{ state_attr(team,'date') | as_timestamp | timestamp_custom('%I:%M %p') }}. {{ sports_str(team,'start') }} is at {{ state_attr(team,'date') | as_timestamp | timestamp_custom('%I:%M %p') }}.
{% endif %} {% endif %}
{% endif %} {% endif %}
{% endmacro %} {% endmacro%}
{{ cleanup(data()) }} {{ cleanup(data()) }}
{% endmacro %} {% endmacro %}
{% macro sports_main(team) %} {% macro sports_main(team) %}
{% macro data() %} {% 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') %} {% if is_state(team,'POST') %}
{% set date = state_attr(team,'date') | as_timestamp | timestamp_custom('%m-%d') %} {% set date = state_attr(team,'date') | as_timestamp | timestamp_custom('%m-%d') %}
{% set yday = (as_timestamp(now()) - (24*3600)) | timestamp_custom('%m-%d') %} {% set yday = (as_timestamp(now()) - (24*3600)) | timestamp_custom('%m-%d') %}
@ -77,11 +34,11 @@
{% if state_attr(team,'clock') in ['postponed','Postponed'] %} {% 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. 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 %} {% 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 %} {{ 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 %} {{ state_attr(team,'opponent_name') }} by a score of {{ state_attr(team,'team_score') }} to {{ state_attr(team,'opponent_score') }}.
{% elif state_attr(team,'team_winner') == true %} {% 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 %} {{ 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 %} {{ state_attr(team,'opponent_name') }} by a score of {{ state_attr(team,'team_score') }} to {{ state_attr(team,'opponent_score') }}.
{% elif state_attr(team,'opponent_winner') == true %} {% elif state_attr(team,'opponent_winner') == true %}
The {{ state_attr(team,'friendly_name') }} lost their game today against {% if state_attr(team,'league') != 'NCAAF'%}the{% endif %} {{ opponent_name }} by a score of {{ state_attr(team,'opponent_score') }} to {{ state_attr(team,'team_score') }}. The {{ state_attr(team,'friendly_name') }} lost their game today against {% if state_attr(team,'league') != 'NCAAF'%}the{% endif %} {{ state_attr(team,'opponent_name') }} by a score of {{ state_attr(team,'opponent_score') }} to {{ state_attr(team,'team_score') }}.
{% endif %} {% endif %}
{% if state_attr(team,'clock') not in ['postponed','Postponed'] %} {% if state_attr(team,'clock') not in ['postponed','Postponed'] %}
This brings their record to {{ state_attr(team,'team_record') | replace("-"," and ") }} on the season. This brings their record to {{ state_attr(team,'team_record') | replace("-"," and ") }} on the season.
@ -90,11 +47,11 @@
{% if state_attr(team,'clock') in ['postponed','Postponed'] %} {% 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. 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 %} {% 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 %} {{ 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 %} {{ state_attr(team,'opponent_name') }} by a score of {{ state_attr(team,'team_score') }} to {{ state_attr(team,'opponent_score') }}.
{% elif state_attr(team,'team_winner') == true %} {% 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 %} {{ 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 %} {{ state_attr(team,'opponent_name') }} by a score of {{ state_attr(team,'team_score') }} to {{ state_attr(team,'opponent_score') }}.
{% elif state_attr(team,'opponent_winner') == true %} {% 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 %} {{ 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 %} {{ state_attr(team,'opponent_name') }} by a score of {{ state_attr(team,'opponent_score') }} to {{ state_attr(team,'team_score') }}.
{% endif %} {% endif %}
{% if state_attr(team,'clock') not in ['postponed','Postponed'] %} {% if state_attr(team,'clock') not in ['postponed','Postponed'] %}
This brings their record to {{ state_attr(team,'team_record') | replace("-"," and ") }} on the season. This brings their record to {{ state_attr(team,'team_record') | replace("-"," and ") }} on the season.
@ -102,11 +59,11 @@
{% endif %} {% endif %}
{% elif is_state(team,'IN') %} {% elif is_state(team,'IN') %}
{% if (state_attr(team,'team_score') | int) == (state_attr(team,'opponent_score') | int) %} {% 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 %} {{ opponent_name }} with a score of {{ state_attr(team,'team_score') }} to {{ state_attr(team,'opponent_score') }} {{ sports_clock(team) }}. 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') }}.
{% elif (state_attr(team,'team_score') | int) > (state_attr(team,'opponent_score') | int) %} {% 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 %} {{ opponent_name }} with a score of {{ state_attr(team,'team_score') }} to {{ state_attr(team,'opponent_score') }} {{ sports_clock(team) }}. 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') }}.
{% else %} {% else %}
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) }}. 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') }}.
{% endif %} {% endif %}
{% endif %} {% endif %}
{% endmacro %} {% endmacro %}

View File

@ -473,11 +473,12 @@
Collin has Beyond The Bells today after school. Collin has Beyond The Bells today after school.
{% endif %} {% endif %}
{% if is_state('input_boolean.kallen_alternate_pickup','on') %} {% if is_state('input_boolean.kallen_alternate_pickup','on') %}
{{ states('input_text.kallen_pickup') }} will be picking Collin up from school today. {{ states('input_text.kallen_pickup') }} will be picking Collin up from school today.
{% if is_state('input_boolean.kallen_school_early_release','on') %} {% else %}
Today is an early release day!
{% endif %}
Pickup today will be at {{ input_datetime_read('input_datetime.kallen_school_day_end') | trim }}. Pickup today will be at {{ input_datetime_read('input_datetime.kallen_school_day_end') | trim }}.
{% if is_state('input_boolean.kallen_school_early_release','on') %}
And It is early release!
{% endif %}
{% endif %} {% endif %}
{% if states('sensor.windows_open') | int > 0 %} {% 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. ' 'I detect that there are windows open. Make sure you close them before you leave, or else the security system will not arm. '
@ -543,11 +544,10 @@
{% endif %} {% endif %}
{% if is_state('input_boolean.kallen_alternate_pickup','on') %} {% if is_state('input_boolean.kallen_alternate_pickup','on') %}
{{ states('input_text.kallen_pickup') }} will be picking him up from school today. {{ states('input_text.kallen_pickup') }} will be picking him up from school today.
{% if is_state('input_boolean.kallen_school_early_release','on') %} {% 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 }}. The school is on an early release schedule, pickup is at {{ input_datetime_read('input_datetime.kallen_school_day_end') | trim }}.
{% else %} {% else %}
His pickup time is {{ input_datetime_read('input_datetime.kallen_school_day_end') | trim }}. His pickup time is {{ input_datetime_read('input_datetime.kallen_school_day_end') | trim }}.
{% endif %}
{% endif %} {% endif %}
{% else %} {% else %}
{{ identKallen }} has school at {{ input_datetime_read('input_datetime.kallen_school_day_start') | trim }} today. {{ identKallen }} has school at {{ input_datetime_read('input_datetime.kallen_school_day_start') | trim }} today.

View File

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

View File

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

View File

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

View File

@ -1,14 +1,14 @@
template: template:
- binary_sensor: - binary_sensor:
- name: Emma Bedroom Aircon - Compressor - name: Emma Aircon - Compressor
unique_id: 21bcbb62-823c-43ff-8c2c-26e940324ee6 unique_id: 21bcbb62-823c-43ff-8c2c-26e940324ee6
state: "{{ states('sensor.emma_bedroom_aircon_power') | int > 150 }}" state: "{{ states('sensor.emma_air_conditioner_power') | int > 150 }}"
availability: "{{ states('climate.emma_bedroom_aircon') not in ['unknown','unavailable'] }}" availability: "{{ states('fan.emma_air_conditioner') not in ['unknown','unavailable'] }}"
device_class: running device_class: running
- name: Emma Bedroom Aircon - Fan - name: Emma Aircon - Fan
unique_id: 9e3054cf-8f7e-4fef-9da4-5b2f2bc99c9d unique_id: 9e3054cf-8f7e-4fef-9da4-5b2f2bc99c9d
state: "{{ states('sensor.emma_bedroom_aircon_power') | int > 20 }}" state: "{{ states('sensor.emma_air_conditioner_power') | int > 20 }}"
availability: "{{ states('climate.emma_bedroom_aircon') not in ['unknown','unavailable'] }}" availability: "{{ states('fan.emma_air_conditioner') not in ['unknown','unavailable'] }}"
device_class: running device_class: running
- name: Master Bedroom Aircon - Compressor - name: Master Bedroom Aircon - Compressor
unique_id: 87051957-1dbc-4d65-b138-e8469728f58f unique_id: 87051957-1dbc-4d65-b138-e8469728f58f
@ -116,6 +116,16 @@ template:
unique_id: 2ce31844-b115-42b8-8213-feccf24e236c unique_id: 2ce31844-b115-42b8-8213-feccf24e236c
state: "{{ state_attr('climate.master_bedroom_aircon','temperature') | float }}" state: "{{ state_attr('climate.master_bedroom_aircon','temperature') | float }}"
availability: "{{ states('climate.master_bedroom_aircon') not in ['unavailable','unknown'] }}" 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') }}"
icon: >-
{% if is_state_attr('climate.master_bedroom_aircon','preset_mode','eco') %}
mdi:home-lightning-bolt
{% else %}
mdi:home-lightning-bolt-outline
{% endif %}
availability: "{{ states('climate.master_bedroom_aircon') not in ['unavailable','unknown'] }}"
- name: "Master Bedroom Aircon Fan Mode" - name: "Master Bedroom Aircon Fan Mode"
unique_id: c0e4f9ba-0c6c-4673-9a75-13f253f2f2e8 unique_id: c0e4f9ba-0c6c-4673-9a75-13f253f2f2e8
state: "{{ state_attr('climate.master_bedroom_aircon','fan_mode') }}" state: "{{ state_attr('climate.master_bedroom_aircon','fan_mode') }}"
@ -132,26 +142,6 @@ template:
mdi:fan-off mdi:fan-off
{% endif %} {% endif %}
availability: "{{ states('climate.master_bedroom_aircon') not in ['unavailable','unknown'] }}" 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 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 - name: Living Room Average Temperature
unique_id: c4a901a6-87e2-4257-b60b-2944be8fdf04 unique_id: c4a901a6-87e2-4257-b60b-2944be8fdf04
state: > state: >
@ -197,17 +187,16 @@ input_boolean:
master_bedroom_climate_protocol: master_bedroom_climate_protocol:
name: Master Bedroom Climate Protocol name: Master Bedroom Climate Protocol
icon: mdi:lightbulb-night icon: mdi:lightbulb-night
emma_bedroom_climate_protocol:
name: Emma Bedroom Climate Protocol
icon: mdi:lightbulb-night
kallen_bedtime_protocol: kallen_bedtime_protocol:
name: Kallen Bedtime Protocol name: Kallen Bedtime Protocol
icon: mdi:lightbulb-night icon: mdi:lightbulb-night
# Turn on when air conditioners are installed, turn off in winter when we take them out # Turn on when master bedroom air conditioner is installed, turn off in winter when we take it out, for smarter automations
master_bedroom_aircon_installed: master_bedroom_aircon_installed:
name: Master Bedroom Aircon Installed name: Master Bedroom Aircon Installed
icon: mdi:tools icon: mdi:tools
# Same thing, but for Emma's bedroom air conditioner
emma_bedroom_aircon_installed: emma_bedroom_aircon_installed:
name: Emma Bedroom Aircon Installed name: Emma Bedroom Aircon Installed
icon: mdi:tools icon: mdi:tools
@ -216,9 +205,6 @@ input_boolean:
master_bedroom_cooling_on: master_bedroom_cooling_on:
name: Master Bedroom Cooling On name: Master Bedroom Cooling On
icon: mdi:snowflake 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. # Activated if the day will be excessively hot. For use with automations for daytime climate control.
hot_day: hot_day:
@ -261,7 +247,6 @@ input_select:
name: Scheduled Climate Mode - Emma Bedroom name: Scheduled Climate Mode - Emma Bedroom
options: options:
- AC - AC
- Fan
- Heat - Heat
- White Noise - White Noise
- N/A - N/A
@ -324,55 +309,13 @@ input_number:
step: 1 step: 1
unit_of_measurement: °F unit_of_measurement: °F
icon: mdi:thermometer icon: mdi:thermometer
emma_bedroom_daytime_temp: emma_aircon_threshold:
name: Emma Bedroom Daytime Temp name: Emma Aircon Threshold
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 min: 40
max: 80 max: 80
step: 1 step: 1
unit_of_measurement: °F unit_of_measurement: °F
icon: mdi:thermometer 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: kallen_fan_threshold:
name: Kallen Fan Threshold name: Kallen Fan Threshold
min: 40 min: 40

View File

@ -3,7 +3,6 @@ weather:
name: "Iron Nerd Weather Station" name: "Iron Nerd Weather Station"
condition_template: > condition_template: >
{% set stations = [ {% set stations = [
states.weather.home_tempest_forecast_home,
states.weather.home, states.weather.home,
states.weather.kdfi_daynight, states.weather.kdfi_daynight,
states.weather.iron_nerd_studios, states.weather.iron_nerd_studios,
@ -13,7 +12,6 @@ weather:
{{ states(result) }} {{ states(result) }}
temperature_template: > temperature_template: >
{% set temps = [ {% set temps = [
states.sensor.home_tempest_temperature,
states.sensor.home_temperature, states.sensor.home_temperature,
states.sensor.kdfi_temperature, states.sensor.kdfi_temperature,
states.sensor.pirateweather_temperature, states.sensor.pirateweather_temperature,
@ -22,28 +20,8 @@ weather:
{% set sensor = temps | selectattr('state','ne','unavailable') | selectattr('state','ne','unknown') | map(attribute='entity_id') | list | first %} {% set sensor = temps | selectattr('state','ne','unavailable') | selectattr('state','ne','unknown') | map(attribute='entity_id') | list | first %}
{{ states(sensor) | float }} {{ states(sensor) | float }}
temperature_unit: °F temperature_unit: °F
dew_point_template: >
{% set dewpoints = [
states.sensor.home_tempest_dew_point,
states.sensor.home_dew_point,
states.sensor.kdfi_dew_point,
states.sensor.pirateweather_dew_point,
states.sensor.openweathermap_dew_point
] %}
{% set sensor = dewpoints | selectattr('state','ne','unavailable') | selectattr('state','ne','unknown') | map(attribute='entity_id') | list | first %}
{{ states(sensor) | float }}
apparent_temperature_template: >
{% set apparent_temps = [
states.sensor.home_tempest_feels_like,
states.sensor.home_temperature_feels_like,
states.sensor.pirateweather_apparent_temperature,
states.sensor.stratton_ave_apparent_temperature
] %}
{% set sensor = apparent_temps | selectattr('state','ne','unavailable') | selectattr('state','ne','unknown') | map(attribute='entity_id') | list | first %}
{{ states(sensor) | float }}
humidity_template: > humidity_template: >
{% set humidity = [ {% set humidity = [
states.sensor.home_tempest_humidity,
states.sensor.home_relative_humidity, states.sensor.home_relative_humidity,
states.sensor.kdfi_relative_humidity, states.sensor.kdfi_relative_humidity,
states.sensor.pirateweather_humidity, states.sensor.pirateweather_humidity,
@ -62,14 +40,12 @@ weather:
{{ forecasts | selectattr('forecast','defined') | map(attribute='forecast') | list | first }} {{ forecasts | selectattr('forecast','defined') | map(attribute='forecast') | list | first }}
forecast_hourly_template: > forecast_hourly_template: >
{% set forecasts = [ {% set forecasts = [
states.sensor.weather_com_hourly_weather_forecast.attributes, states.sensor.weather_com_hourly_weather_forecast,
states.sensor.pirateweather_hourly_weather_forecast.attributes states.sensor.pirateweather_hourly_weather_forecast.attributes
] %} ] %}
{{ forecasts | selectattr('forecast','defined') | map(attribute='forecast') | list | first }} {{ forecasts | selectattr('forecast','defined') | map(attribute='forecast') | list | first }}
pressure_template: > pressure_template: >
{% set pressures = [ {% set pressures = [
states.sensor.home_tempest_local_slp,
states.sensor.home_tempest_cloud_sensors_sea_level_pressure,
states.sensor.home_pressure, states.sensor.home_pressure,
states.sensor.kdfi_barometric_pressure states.sensor.kdfi_barometric_pressure
] %} ] %}
@ -116,7 +92,6 @@ weather:
name: "Iron Nerd Weather Station - Hourly" name: "Iron Nerd Weather Station - Hourly"
condition_template: > condition_template: >
{% set stations = [ {% set stations = [
states.weather.home_tempest_forecast_home,
states.weather.home, states.weather.home,
states.weather.tomorrow_io_stratton_ave_hourly, states.weather.tomorrow_io_stratton_ave_hourly,
states.weather.iron_nerd_studios, states.weather.iron_nerd_studios,
@ -127,7 +102,6 @@ weather:
{{ states(result) }} {{ states(result) }}
temperature_template: > temperature_template: >
{% set temps = [ {% set temps = [
states.sensor.home_tempest_temperature,
states.sensor.home_temperature, states.sensor.home_temperature,
states.sensor.kdfi_temperature, states.sensor.kdfi_temperature,
states.sensor.pirateweather_temperature, states.sensor.pirateweather_temperature,
@ -136,28 +110,8 @@ weather:
{% set sensor = temps | selectattr('state','ne','unavailable') | selectattr('state','ne','unknown') | map(attribute='entity_id') | list | first %} {% set sensor = temps | selectattr('state','ne','unavailable') | selectattr('state','ne','unknown') | map(attribute='entity_id') | list | first %}
{{ states(sensor) | float }} {{ states(sensor) | float }}
temperature_unit: °F temperature_unit: °F
dew_point_template: >
{% set dewpoints = [
states.sensor.home_tempest_dew_point,
states.sensor.home_dew_point,
states.sensor.kdfi_dew_point,
states.sensor.pirateweather_dew_point,
states.sensor.openweathermap_dew_point
] %}
{% set sensor = dewpoints | selectattr('state','ne','unavailable') | selectattr('state','ne','unknown') | map(attribute='entity_id') | list | first %}
{{ states(sensor) | float }}
apparent_temperature_template: >
{% set apparent_temps = [
states.sensor.home_tempest_feels_like,
states.sensor.home_temperature_feels_like,
states.sensor.pirateweather_apparent_temperature,
states.sensor.stratton_ave_apparent_temperature
] %}
{% set sensor = apparent_temps | selectattr('state','ne','unavailable') | selectattr('state','ne','unknown') | map(attribute='entity_id') | list | first %}
{{ states(sensor) | float }}
humidity_template: > humidity_template: >
{% set humidity = [ {% set humidity = [
states.sensor.home_tempest_humidity,
states.sensor.home_relative_humidity, states.sensor.home_relative_humidity,
states.sensor.kdfi_relative_humidity, states.sensor.kdfi_relative_humidity,
states.sensor.pirateweather_humidity, states.sensor.pirateweather_humidity,
@ -167,15 +121,13 @@ weather:
{{ states(result) | float }} {{ states(result) | float }}
forecast_hourly_template: > forecast_hourly_template: >
{% set forecasts = [ {% set forecasts = [
states.sensor.weather_com_hourly_weather_forecast.attributes, states.sensor.weather_com_hourly_weather_forecast,
states.weather.tomorrow_io_stratton_ave_hourly.attributes, states.weather.tomorrow_io_stratton_ave_hourly.attributes,
states.sensor.pirateweather_hourly_weather_forecast.attributes states.sensor.pirateweather_hourly_weather_forecast.attributes
] %} ] %}
{{ forecasts | selectattr('forecast','defined') | map(attribute='forecast') | list | first }} {{ forecasts | selectattr('forecast','defined') | map(attribute='forecast') | list | first }}
pressure_template: > pressure_template: >
{% set pressures = [ {% set pressures = [
states.sensor.home_tempest_local_slp,
states.sensor.home_tempest_cloud_sensors_sea_level_pressure,
states.sensor.home_pressure, states.sensor.home_pressure,
states.sensor.kdfi_barometric_pressure states.sensor.kdfi_barometric_pressure
] %} ] %}
@ -370,60 +322,6 @@ sensor:
# days: 7 # days: 7
template: template:
- trigger:
- platform: time_pattern
minutes: /15
- platform: state
entity_id: weather.home_tempest_forecast_home
- platform: homeassistant
event: start
action:
- service: weather.get_forecasts
data:
type: daily
target:
entity_id: weather.home_tempest_forecast_home
response_variable: daily
- variables:
today: "{{ daily['weather.home_tempest_forecast_home'].forecast[0] }}"
sensor:
- name: Weatherflow Daily Weather Forecast
unique_id: 2c70c4ee-7f7f-42b4-ad40-90ce2b6c6d77
state: "{{ now().isoformat() }}"
attributes:
forecast: "{{ daily['weather.home_tempest_forecast_home'].forecast }}"
- name: Weatherflow High
unique_id: 296b4361-459a-48e7-9793-c003b88fcdef
state: "{{ today.temperature }}"
unit_of_measurement: °F
- name: Weatherflow Low
unique_id: 61c344be-33d3-4e1d-8d0d-277c2b850c0d
state: "{{ today.templow }}"
unit_of_measurement: °F
- name: Weatherflow Rain Chance Today
unique_id: ab0327ff-f20f-4d16-aeb5-78682b3e2397
state: "{{ today.precipitation_probability }}"
unit_of_measurement: "%"
- trigger:
- platform: time_pattern
minutes: /15
- platform: state
entity_id: weather.home_tempest_forecast_home
- platform: homeassistant
event: start
action:
- service: weather.get_forecasts
data:
type: hourly
target:
entity_id: weather.home_tempest_forecast_home
response_variable: hourly
sensor:
- name: Weatherflow Hourly Weather Forecast
unique_id: aa0b368c-ea23-4514-a697-e122353eb76d
state: "{{ now().isoformat() }}"
attributes:
forecast: "{{ hourly['weather.home_tempest_forecast_home'].forecast }}"
- trigger: - trigger:
- platform: time_pattern - platform: time_pattern
minutes: /15 minutes: /15
@ -770,10 +668,10 @@ template:
{% endif %} {% endif %}
- name: "Lightning Warning" - name: "Lightning Warning"
unique_id: edaddfc4-f7f0-4d75-aada-a2c588afe029 unique_id: edaddfc4-f7f0-4d75-aada-a2c588afe029
state: "{{ states('sensor.home_tempest_cloud_sensors_lightning_strikes_last_hour') | int > 0 }}" state: "{{ states('sensor.blitzortung_lightning_counter') | int > 0 }}"
device_class: safety device_class: safety
attributes: attributes:
current_strikes: "{{ states('sensor.home_tempest_cloud_sensors_lightning_strikes_last_hour') | int }}" current_strikes: "{{ states('sensor.blitzortung_lightning_counter') | int }}"
icon: "{{ 'mdi:flash-alert' if states('sensor.blitzortung_lightning_counter') | int > 0 else 'mdi:flash-outline'}}" icon: "{{ 'mdi:flash-alert' if states('sensor.blitzortung_lightning_counter') | int > 0 else 'mdi:flash-outline'}}"
- name: "Audible Weather Alerts Allowed" - name: "Audible Weather Alerts Allowed"
unique_id: 03851823-32d5-44c1-af42-256fcd922069 unique_id: 03851823-32d5-44c1-af42-256fcd922069
@ -803,57 +701,52 @@ template:
- name: Raining - name: Raining
unique_id: 232b43a4-4598-4315-ab76-42348c11e6ff unique_id: 232b43a4-4598-4315-ab76-42348c11e6ff
state: > state: >
{{ states('sensor.home_tempest_precipitation_intensity') | float > 0 or {{ states('sensor.total_rain_sensors') | int > 1 }}
states('sensor.home_tempest_precipitation_type') in ['rain','hail','rain_hail'] or icon: "{{ 'mdi:weather-rainy' if states('sensor.total_rain_sensors') | int > 1 else 'mdi:weather-cloudy' }}"
states('sensor.home_tempest_cloud_sensors_precipitation_description') in ['rain','heavy_rain'] or
is_state('binary_sensor.home_tempest_cloud_binary_sensors_is_raining','on') }}
icon: "{{ 'mdi:weather-rainy' if this.state == 'on' else 'mdi:weather-cloudy' }}"
- sensor: - sensor:
# - name: Total Rain Sensors - name: Total Rain Sensors
# unique_id: b7c2e709-8f5c-4263-aa1d-fa8280afcddb unique_id: b7c2e709-8f5c-4263-aa1d-fa8280afcddb
# unit_of_measurement: 'sensors' unit_of_measurement: 'sensors'
# state: > state: >
# {% set sensors = [ {% set sensors = [
# states.sensor.home_tempest_precipitation_type, states.sensor.pirateweather_precip,
# states.sensor.pirateweather_precip, states.sensor.openweathermap_precipitation_kind,
# states.sensor.openweathermap_precipitation_kind, states.sensor.tomorrow_io_stratton_ave_precipitation_type
# states.sensor.tomorrow_io_stratton_ave_precipitation_type ] %}
# ] %} {% set numeric_sensors = [
# {% set numeric_sensors = [ states.sensor.stratton_ave_precipitation
# states.sensor.home_tempest_precipitation_intensity, ] %}
# states.sensor.stratton_ave_precipitation {% set c1 = sensors | selectattr('state','eq','rain') | list | count %}
# ] %} {% set c2 = numeric_sensors | map(attribute='state') | map('float') | select('gt',0) | list | count %}
# {% set c1 = sensors | selectattr('state','eq','rain') | list | count %} {{ (c1 + c2) | int }}
# {% set c2 = numeric_sensors | map(attribute='state') | map('float') | select('gt',0) | list | count %}
# {{ (c1 + c2) | int }}
- name: Current Forecast - name: Current Forecast
unique_id: c0faea33-2ac3-40f1-8558-584c3f5d6b16 unique_id: c0faea33-2ac3-40f1-8558-584c3f5d6b16
icon: mdi:weather-sunny icon: mdi:weather-sunny
state: >- state: >-
{% set forecast = state_attr('sensor.weatherflow_daily_weather_forecast','forecast')[0] %} {% set forecast = state_attr('sensor.weather_com_daily_weather_forecast','forecast')[0] %}
{{ forecast.condition }} {{ forecast.condition }}
attributes: attributes:
high_temp: >- high_temp: >-
{% set forecast = state_attr('sensor.weatherflow_daily_weather_forecast','forecast')[0] %} {% set forecast = state_attr('sensor.weather_com_daily_weather_forecast','forecast')[0] %}
{{ forecast.temperature }} {{ forecast.temperature }}
overnight_low: >- overnight_low: >-
{% set forecast = state_attr('sensor.weatherflow_daily_weather_forecast','forecast')[0] %} {% set forecast = state_attr('sensor.weather_com_daily_weather_forecast','forecast')[0] %}
{{ forecast.templow }} {{ forecast.templow }}
wind_bearing: >- wind_bearing: >-
{% set forecast = state_attr('sensor.weatherflow_daily_weather_forecast','forecast')[0] %} {% set forecast = state_attr('sensor.weather_com_daily_weather_forecast','forecast')[0] %}
{{ forecast.wind_bearing }} {{ forecast.wind_bearing }}
wind_speed: >- wind_speed: >-
{% set forecast = state_attr('sensor.weatherflow_daily_weather_forecast','forecast')[0] %} {% set forecast = state_attr('sensor.weather_com_daily_weather_forecast','forecast')[0] %}
{{ forecast.wind_speed }} {{ forecast.wind_speed }}
precipitation: >- precipitation: >-
{% if state_attr('weather.iron_nerd_weather_station','precipitation') %} {% if state_attr('weather.iron_nerd_weather_station','precipitation') %}
{% set forecast = state_attr('weather.iron_nerd_weather_station','forecast')[0] %} {% set forecast = state_attr('weather.iron_nerd_weather_station','forecast')[0] %}
{% else %} {% else %}
{% set forecast = state_attr('sensor.weatherflow_daily_weather_forecast','forecast')[0] %} {% set forecast = state_attr('sensor.weather_com_daily_weather_forecast','forecast')[0] %}
{% endif %} {% endif %}
{{ forecast.precipitation }} {{ forecast.precipitation }}
friendly: >- friendly: >-
{% set forecast = state_attr('sensor.weatherflow_daily_weather_forecast','forecast')[0] %} {% set forecast = state_attr('sensor.weather_com_daily_weather_forecast','forecast')[0] %}
{{ forecast.condition | replace("partlycloudy","partly cloudy") }} {{ forecast.condition | replace("partlycloudy","partly cloudy") }}
- name: Current Forecast Detail - name: Current Forecast Detail
unique_id: e5ae9864-70b5-402c-9d2f-c4d6a10085df unique_id: e5ae9864-70b5-402c-9d2f-c4d6a10085df
@ -968,23 +861,23 @@ template:
unique_id: a8ae26b0-ed26-4568-bb2b-f7c72707b009 unique_id: a8ae26b0-ed26-4568-bb2b-f7c72707b009
icon: mdi:weather-sunny icon: mdi:weather-sunny
state: >- state: >-
{% set forecast = state_attr('sensor.weatherflow_daily_weather_forecast','forecast')[1] %} {% set forecast = state_attr('sensor.weather_com_daily_weather_forecast','forecast')[1] %}
{{ forecast.condition }} {{ forecast.condition }}
attributes: attributes:
high_temp: >- high_temp: >-
{% set forecast = state_attr('sensor.weatherflow_daily_weather_forecast','forecast')[1] %} {% set forecast = state_attr('sensor.weather_com_daily_weather_forecast','forecast')[1] %}
{{ forecast.temperature }} {{ forecast.temperature }}
overnight_low: >- overnight_low: >-
{% set forecast = state_attr('sensor.weatherflow_daily_weather_forecast','forecast')[1] %} {% set forecast = state_attr('sensor.weather_com_daily_weather_forecast','forecast')[1] %}
{{ forecast.templow }} {{ forecast.templow }}
wind_bearing: >- wind_bearing: >-
{% set forecast = state_attr('sensor.weatherflow_daily_weather_forecast','forecast')[1] %} {% set forecast = state_attr('sensor.weather_com_daily_weather_forecast','forecast')[1] %}
{{ forecast.wind_bearing }} {{ forecast.wind_bearing }}
wind_speed: >- wind_speed: >-
{% set forecast = state_attr('sensor.weatherflow_daily_weather_forecast','forecast')[1] %} {% set forecast = state_attr('sensor.weather_com_daily_weather_forecast','forecast')[1] %}
{{ forecast.wind_speed }} {{ forecast.wind_speed }}
precipitation: >- precipitation: >-
{% set forecast = state_attr('sensor.weatherflow_daily_weather_forecast','forecast')[1] %} {% set forecast = state_attr('sensor.weather_com_daily_weather_forecast','forecast')[1] %}
{{ forecast.precipitation }} {{ forecast.precipitation }}
- name: Tomorrow Forecast Detail - name: Tomorrow Forecast Detail
unique_id: 21374ed0-80d1-49ba-817d-3e93eb3865e4 unique_id: 21374ed0-80d1-49ba-817d-3e93eb3865e4
@ -1289,7 +1182,7 @@ template:
unit_of_measurement: '°F' unit_of_measurement: '°F'
device_class: temperature device_class: temperature
state: >- state: >-
{% set forecast = state_attr('sensor.weatherflow_daily_weather_forecast','forecast')[0] %} {% set forecast = state_attr('sensor.weather_com_daily_weather_forecast','forecast')[0] %}
{% if is_number(forecast.temperature) %} {% if is_number(forecast.temperature) %}
{{ forecast.temperature }} {{ forecast.temperature }}
{% else %} {% else %}
@ -1300,14 +1193,14 @@ template:
unit_of_measurement: '°F' unit_of_measurement: '°F'
device_class: temperature device_class: temperature
state: >- state: >-
{% set forecast = state_attr('sensor.weatherflow_daily_weather_forecast','forecast')[2] %} {% set forecast = state_attr('sensor.weather_com_daily_weather_forecast','forecast')[2] %}
{{ forecast.temperature }} {{ forecast.temperature }}
- name: "Tonight's Low Temp" - name: "Tonight's Low Temp"
unique_id: 8ddc55b6-4728-4897-a32f-90be970f744b unique_id: 8ddc55b6-4728-4897-a32f-90be970f744b
unit_of_measurement: '°F' unit_of_measurement: '°F'
device_class: temperature device_class: temperature
state: >- state: >-
{% set forecast = state_attr('sensor.weatherflow_daily_weather_forecast','forecast')[0] %} {% set forecast = state_attr('sensor.weather_com_daily_weather_forecast','forecast')[0] %}
{{ forecast.templow }} {{ forecast.templow }}
- name: "Clothing Forecast" - name: "Clothing Forecast"
unique_id: 8ed2684b-d0ad-402c-bc3c-340cb9b2437a unique_id: 8ed2684b-d0ad-402c-bc3c-340cb9b2437a
@ -1568,8 +1461,8 @@ template:
unit_of_measurement: '°F' unit_of_measurement: '°F'
state: > state: >
{% set ns = namespace(temps=[]) %} {% set ns = namespace(temps=[]) %}
{% set x = state_attr('sensor.weatherflow_hourly_weather_forecast','forecast') | count %} {% set x = state_attr('sensor.weather_com_hourly_weather_forecast','forecast') | count %}
{% set pd = state_attr('sensor.weatherflow_hourly_weather_forecast','forecast') %} {% set pd = state_attr('sensor.weather_com_hourly_weather_forecast','forecast') %}
{% for i in range(0,x) %} {% for i in range(0,x) %}
{% set hr = as_timestamp(as_local(as_datetime(pd[i].datetime))) | timestamp_custom('%H') | int %} {% set hr = as_timestamp(as_local(as_datetime(pd[i].datetime))) | timestamp_custom('%H') | int %}
{% if hr in range(21,24) or hr in range(0,8) %} {% if hr in range(21,24) or hr in range(0,8) %}

View File

@ -1,11 +0,0 @@
template:
- trigger:
- trigger: event
event_type: bubble_card_update_modules
sensor:
- name: "Bubble Card Modules"
state: "saved"
icon: "mdi:puzzle"
attributes:
modules: "{{ trigger.event.data.modules }}"
last_updated: "{{ trigger.event.data.last_updated }}"

View File

@ -257,9 +257,6 @@ automation:
time: > time: >
{% from 'time.jinja' import current_time %} {% from 'time.jinja' import current_time %}
{{ current_time('time',24) }} {{ current_time('time',24) }}
- service: input_boolean.turn_off
target:
entity_id: input_boolean.emma_awake
- conditions: - conditions:
- condition: trigger - condition: trigger
id: bedtime-timer-finished id: bedtime-timer-finished
@ -284,9 +281,6 @@ automation:
datetime: > datetime: >
{% from 'time.jinja' import current_time %} {% from 'time.jinja' import current_time %}
{{ current_time('time',24) }} {{ current_time('time',24) }}
- service: input_boolean.turn_off
target:
entity_id: input_boolean.emma_awake
- id: e59f638a-519f-4619-bf7d-b13251b3a374 - id: e59f638a-519f-4619-bf7d-b13251b3a374
alias: Emma Meds Handler alias: Emma Meds Handler
@ -810,11 +804,16 @@ script:
datetime: > datetime: >
{% from 'time.jinja' import set_datetime %} {% from 'time.jinja' import set_datetime %}
{{ set_datetime(0,5) }} {{ set_datetime(0,5) }}
- service: script.speech_engine - if:
data: - condition: state
who: common entity_id: binary_sensor.basement_occupied
type: normal state: 'on'
message: Emma has awoken, so it is time to make your way upstairs now 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: input_datetime.set_datetime - service: input_datetime.set_datetime
target: target:
entity_id: input_datetime.emma_awake_at entity_id: input_datetime.emma_awake_at
@ -899,3 +898,26 @@ script:
- service: input_boolean.turn_off - service: input_boolean.turn_off
target: target:
entity_id: input_boolean.white_noise_emma_bedroom entity_id: input_boolean.white_noise_emma_bedroom
- 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

@ -31,7 +31,8 @@ tts:
region_name: 'us-east-1' region_name: 'us-east-1'
text_type: ssml text_type: ssml
voice: Joanna voice: Joanna
engine: generative cache: true
engine: neural
conversation: conversation:

View File

@ -44,9 +44,6 @@ input_boolean:
adaptive_lighting_adjustments: adaptive_lighting_adjustments:
name: Adaptive Lighting Adjustments name: Adaptive Lighting Adjustments
icon: mdi:knob icon: mdi:knob
sunset_lights_triggered:
name: Sunset Lights Triggered
icon: mdi:weather-sunset
input_number: input_number:
upstairs_bathroom_motion_off_delay: upstairs_bathroom_motion_off_delay:
@ -210,21 +207,6 @@ input_number:
step: 5 step: 5
unit_of_measurement: lx unit_of_measurement: lx
icon: mdi:sun-wireless icon: mdi:sun-wireless
front_porch_lux_threshold:
name: Front Porch Lux Threshold
min: 0
max: 2000
step: 5
mode: box
unit_of_measurement: lx
icon: mdi:sun-wireless
sunset_lights_outdoor_lux_threshold:
name: Sunset Lights Outdoor Lux Threshold
min: 0
max: 10000
step: 100
unit_of_measurement: lx
icon: mdi:sun-wireless
# Settings for adaptive adjustments # Settings for adaptive adjustments
daytime_colortemp_front_porch: daytime_colortemp_front_porch:
@ -507,7 +489,6 @@ input_select:
- Evening Mode - Evening Mode
- Night Mode - Night Mode
- Bright Mode - Bright Mode
- Reading Mode
- Reset - Reset
initial: Select initial: Select
icon: mdi:desk icon: mdi:desk
@ -672,25 +653,6 @@ template:
{% endif %} {% endif %}
device_class: problem device_class: problem
delay_on: "00:00:10" 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,
states.light.living_room_lights,
states.light.front_porch_light %}
{% 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,
states.light.living_room_lights,
states.light.front_porch_light %}
{% set ids = lights | selectattr('state','eq','unavailable') | map(attribute='attributes.friendly_name') | list %}
{{ ids | join(', ') }}
- sensor: - sensor:
- name: "Basement Studio Lights - Brightness Actual" - name: "Basement Studio Lights - Brightness Actual"
unique_id: dee4dc84-a6a0-4150-903e-5b8bd436d962 unique_id: dee4dc84-a6a0-4150-903e-5b8bd436d962

View File

@ -198,57 +198,6 @@ input_number:
step: 0.05 step: 0.05
icon: mdi:knob 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 # Amazon Polly Sensors to see last message and location of audible notification
mqtt: mqtt:
sensor: sensor:
@ -376,14 +325,24 @@ script:
- condition: template - condition: template
value_template: > value_template: >
{% set current = state_attr('media_player.basement_echo_dot','volume_level') | float %} {% set current = state_attr('media_player.basement_echo_dot','volume_level') | float %}
{% set expected = states('sensor.basement_echo_dot_volume') | float %} {% set night = states('input_number.basement_echo_dot_night_volume') | float %}
{{ current != expected }} {% 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 %}
then: then:
- service: media_player.volume_set - service: media_player.volume_set
target: target:
entity_id: media_player.basement_echo_dot entity_id: media_player.basement_echo_dot
data: data:
volume_level: "{{ states('sensor.basement_echo_dot_volume') }}" 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 %}
# Basement Google Speaker # Basement Google Speaker
- if: - if:
- condition: and - condition: and
@ -414,14 +373,24 @@ script:
- condition: template - condition: template
value_template: > value_template: >
{% set current = state_attr('media_player.basement_google_speaker','volume_level') | float %} {% set current = state_attr('media_player.basement_google_speaker','volume_level') | float %}
{% set expected = states('sensor.basement_google_speaker_volume') | float %} {% set night = states('input_number.basement_google_speaker_night_volume') | float %}
{{ current != expected }} {% 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 %}
then: then:
- service: media_player.volume_set - service: media_player.volume_set
target: target:
entity_id: media_player.basement_google_speaker entity_id: media_player.basement_google_speaker
data: data:
volume_level: "{{ states('sensor.basement_google_speaker_volume') }}" 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 %}
- service: media_player.volume_mute - service: media_player.volume_mute
target: target:
entity_id: media_player.basement_google_speaker entity_id: media_player.basement_google_speaker
@ -436,14 +405,24 @@ script:
- condition: template - condition: template
value_template: > value_template: >
{% set current = state_attr('media_player.living_room_echo_dot','volume_level') | float %} {% set current = state_attr('media_player.living_room_echo_dot','volume_level') | float %}
{% set expected = states('sensor.living_room_echo_dot_volume') | float %} {% set night = states('input_number.living_room_echo_dot_night_volume') | float %}
{{ current != expected }} {% 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 %}
then: then:
- service: media_player.volume_set - service: media_player.volume_set
target: target:
entity_id: media_player.living_room_echo_dot entity_id: media_player.living_room_echo_dot
data: data:
volume_level: "{{ states('sensor.living_room_echo_dot_volume') }}" 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 %}
# Master Bedroom Echo Dot # Master Bedroom Echo Dot
- if: - if:
- condition: state - condition: state
@ -456,14 +435,24 @@ script:
- condition: template - condition: template
value_template: > value_template: >
{% set current = state_attr('media_player.master_bedroom_echo_dot','volume_level') | float %} {% set current = state_attr('media_player.master_bedroom_echo_dot','volume_level') | float %}
{% set expected = states('sensor.master_bedroom_echo_dot_volume') | float %} {% set night = states('input_number.master_bedroom_echo_dot_night_volume') | float %}
{{ current != expected }} {% 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 %}
then: then:
- service: media_player.volume_set - service: media_player.volume_set
target: target:
entity_id: media_player.master_bedroom_echo_dot entity_id: media_player.master_bedroom_echo_dot
data: data:
volume_level: "{{ states('sensor.master_bedroom_echo_dot_volume') }}" 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 %}
# Kallen Bedroom Speaker # Kallen Bedroom Speaker
- if: - if:
- condition: and - condition: and
@ -494,14 +483,24 @@ script:
- condition: template - condition: template
value_template: > value_template: >
{% set current = state_attr('media_player.kallen_bedroom_google_speaker','volume_level') | float %} {% set current = state_attr('media_player.kallen_bedroom_google_speaker','volume_level') | float %}
{% set expected = states('sensor.kallen_bedroom_google_speaker_volume') | float %} {% set night = states('input_number.kallen_bedroom_google_speaker_night_volume') | float %}
{{ current != expected }} {% 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 %}
then: then:
- service: media_player.volume_set - service: media_player.volume_set
target: target:
entity_id: media_player.kallen_bedroom_google_speaker entity_id: media_player.kallen_bedroom_google_speaker
data: data:
volume_level: "{{ states('sensor.kallen_bedroom_google_speaker_volume') }}" 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 %}
- service: media_player.volume_mute - service: media_player.volume_mute
target: target:
entity_id: media_player.kallen_bedroom_google_speaker entity_id: media_player.kallen_bedroom_google_speaker
@ -537,14 +536,24 @@ script:
- condition: template - condition: template
value_template: > value_template: >
{% set current = state_attr('media_player.emma_bedroom_google_speaker','volume_level') | float %} {% set current = state_attr('media_player.emma_bedroom_google_speaker','volume_level') | float %}
{% set expected = states('sensor.emma_bedroom_google_speaker_volume') | float %} {% set night = states('input_number.emma_bedroom_google_speaker_night_volume') | float %}
{{ current != expected }} {% 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 %}
then: then:
- service: media_player.volume_set - service: media_player.volume_set
target: target:
entity_id: media_player.emma_bedroom_google_speaker entity_id: media_player.emma_bedroom_google_speaker
data: data:
volume_level: "{{ states('sensor.kallen_bedroom_google_speaker_volume') }}" 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 %}
- service: media_player.volume_mute - service: media_player.volume_mute
target: target:
entity_id: media_player.emma_bedroom_google_speaker entity_id: media_player.emma_bedroom_google_speaker
@ -971,7 +980,33 @@ script:
- critical - critical
variables: variables:
voice: "{{ states('input_select.jarvis_voice') }}" voice: "{{ states('input_select.jarvis_voice') }}"
groupname: >-
{% if who == 'kids_bedrooms' %}
kids_bedroom_speakers
{% elif who == 'all_bedrooms' %}
all_bedroom_speakers
{% elif who == 'basement' and is_state('input_boolean.studio_quiet','on') %}
alexa_no_basement
{% else %}
{{ who }}
{% endif %}
sequence: sequence:
- service: script.get_room_speakers
data:
room: "{{ who }}"
response_variable: "get_room_speakers"
- choose:
- conditions: "{{ who in ['everywhere','Everywhere'] }}"
sequence:
- service: script.get_all_speakers
response_variable: "get_all_speakers"
- conditions: "{{ get_room_speakers.jarvis_tts == 'group' }}"
sequence:
- service: script.get_group_speakers
data:
group: "{{ who }}"
response_variable: "get_group_speakers"
# Need to figure out whether to do this part here, or in alexa/jarvis voice scripts, or both
- service: mqtt.publish - service: mqtt.publish
data: data:
topic: 'house/polly/lastmsg' topic: 'house/polly/lastmsg'
@ -1015,44 +1050,13 @@ script:
- service: >- - service: >-
{% if voice == 'nabu' %} {% if voice == 'nabu' %}
script.nabu_voice script.nabu_voice
{% elif who in ['living_room_echo_dot', 'media_player.living_room_echo_dot','living_room','Living Room Echo Dot','Living Room'] %} {% elif get_room_services.jarvis_tts in ['group','alexa'] %}
script.alexa_voice
{% elif who in ['kallen_bedroom','Kallen Bedroom'] %}
{% if is_state('input_boolean.kallen_sleeping','on') and type not in ['critical','Critical'] %}
script.alexa_voice
{% else %}
script.jarvis_voice
{% endif %}
{% elif who in ['emma_bedroom','Emma Bedroom'] %}
{% if is_state('input_boolean.emma_sleeping','on') and type not in ['critical','Critical'] %}
script.alexa_voice
{% else %}
script.jarvis_voice
{% endif %}
{% elif who in ['master_bedroom','master_bedroom_echo_dot','media_player.master_bedroom_echo_dot','Master Bedroom Echo Dot','Master Bedroom'] %}
script.alexa_voice
{% elif who in ['kids_bedrooms','Kids Bedrooms'] %}
script.jarvis_voice
{% elif who in ['all_bedrooms','All Bedrooms'] %}
script.alexa_voice
{% elif who in ['Basement','basement','basement_echo_dot','media_player.basement_echo_dot','Basement Echo Dot'] %}
script.alexa_voice
{% elif who in ['Basement Google','basement_google'] %}
{% if is_state('input_boolean.studio_quiet','on') %}
script.alexa_voice
{% else %}
script.jarvis_voice
{% endif %}
{% elif who in ['Common Areas','common','common_areas'] %}
script.alexa_voice
{% elif who in ['alexa_everywhere','Alexa Everywhere'] %}
script.alexa_voice
{% elif who in ['Everywhere','everywhere'] %}
script.alexa_voice script.alexa_voice
{% else %} {% else %}
script.alexa_voice script.jarvis_voice
{% endif %} {% endif %}
data: data:
# Work on where this redirect logic should go
who: > who: >
{% if who in ['living_room_echo_dot', 'media_player.living_room_echo_dot','living_room','Living Room Echo Dot','Living Room'] %} {% if who in ['living_room_echo_dot', 'media_player.living_room_echo_dot','living_room','Living Room Echo Dot','Living Room'] %}
living_room living_room
@ -1129,7 +1133,7 @@ script:
type: '{{ type }}' type: '{{ type }}'
- if: - if:
- condition: template - condition: template
value_template: "{{ who in ['Everywhere','everywhere','all_bedrooms','All Bedrooms','kids_bedrooms','Kids Bedrooms'] }}" value_template: "{{ get_room_speakers.jarvis_tts == 'group' and get_group_speakers.google is defined }}"
then: then:
- service: script.jarvis_voice - service: script.jarvis_voice
data: data:
@ -1228,9 +1232,11 @@ script:
data: data:
message: > message: >
<voice name="{{ voice }}"> <voice name="{{ voice }}">
<amazon:auto-breaths>
<prosody rate="fast"> <prosody rate="fast">
{{ message }} {{ message }}
</prosody> </prosody>
</amazon:auto-breaths>
</voice> </voice>
target: > target: >
{% if who in ['living_room_echo_dot', 'media_player.living_room_echo_dot','living_room'] %} {% if who in ['living_room_echo_dot', 'media_player.living_room_echo_dot','living_room'] %}
@ -1317,34 +1323,53 @@ script:
media_player.basement_google_speaker media_player.basement_google_speaker
{% endif %} {% endif %}
volume_level: >- volume_level: >-
{% set numbers = [ {% set numbers_night = [
states.sensor.emma_bedroom_google_speaker_volume.state, states.input_number.emma_bedroom_google_speaker_night_volume.state,
states.sensor.kallen_bedroom_google_speaker_volume.state states.input_number.kallen_bedroom_google_speaker_night_volume.state
] %} ] %}
{% set kidsgroup = numbers | list | min | float %} {% 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 %}
{% if type in ['critical'] %} {% if type in ['critical'] %}
1.0 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 %} {% else %}
{% if who in ['Everywhere','everywhere','kids_bedrooms','all_bedrooms'] %} {% 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') %} {% if is_state('input_boolean.emma_sleeping','on') and is_state('input_boolean.kallen_sleeping','off') %}
{{ states('sensor.kallen_bedroom_google_speaker_volume') }} {{ states('input_number.kallen_bedroom_google_speaker_day_volume') }}
{% elif is_state('input_boolean.kallen_sleeping','on') and is_state('input_boolean.emma_sleeping','off') %} {% elif is_state('input_boolean.kallen_sleeping','on') and is_state('input_boolean.emma_sleeping','off') %}
{{ states('sensor.emma_bedroom_google_speaker_volume') }} {{ states('input_number.emma_bedroom_google_speaker_day_volume') }}
{% else %} {% else %}
{{ kidsgroup }} {{ kidsgroup_day }}
{% endif %} {% endif %}
{% elif who in ['kallen_bedroom','media_player.kallen_bedroom_google_speaker'] %} {% elif who in ['kallen_bedroom','media_player.kallen_bedroom_google_speaker'] %}
{{ states('sensor.kallen_bedroom_google_speaker_volume') }} {{ states('input_number.kallen_bedroom_google_speaker_day_volume') }}
{% elif who in ['emma_bedroom','media_player.emma_bedroom_google_speaker'] %} {% elif who in ['emma_bedroom','media_player.emma_bedroom_google_speaker'] %}
{{ states('sensor.emma_bedroom_google_speaker_volume') }} {{ states('input_number.emma_bedroom_google_speaker_day_volume') }}
{% elif who in ['Basement Google','basement_google'] %} {% elif who in ['Basement Google','basement_google'] %}
{{ states('sensor.basement_google_speaker_volume') }} {{ states('input_number.basement_google_speaker_day_volume') }}
{% else %} {% else %}
{% if is_state('input_boolean.give_me_darkness','on') %} 0.6
0.3
{% else %}
0.6
{% endif %}
{% endif %} {% endif %}
{% endif %} {% endif %}
- service: tts.amazon_polly_say - service: tts.amazon_polly_say

View File

@ -17,8 +17,8 @@ sensor:
entity_id: switch.tina_desktop entity_id: switch.tina_desktop
power_sensor_id: sensor.tina_desktop_power power_sensor_id: sensor.tina_desktop_power
- platform: powercalc - platform: powercalc
entity_id: switch.emma_bedroom_aircon entity_id: fan.emma_air_conditioner
power_sensor_id: sensor.emma_bedroom_aircon_power power_sensor_id: sensor.emma_air_conditioner_power
- platform: powercalc - platform: powercalc
entity_id: switch.master_bedroom_aircon entity_id: switch.master_bedroom_aircon
power_sensor_id: sensor.master_bedroom_aircon_power power_sensor_id: sensor.master_bedroom_aircon_power

View File

@ -613,6 +613,7 @@ automation:
target: target:
entity_id: entity_id:
- fan.kallen_bedroom_fan - fan.kallen_bedroom_fan
- fan.emma_air_conditioner
- service: button.press - service: button.press
target: target:
entity_id: button.master_bedroom_climate_reset entity_id: button.master_bedroom_climate_reset

View File

@ -418,14 +418,21 @@ script:
entity_id: input_datetime.daily_briefing entity_id: input_datetime.daily_briefing
data: data:
time: > time: >
{% if is_state('input_boolean.kallen_school_today','off') and is_state('input_boolean.work_today','on') %} {% 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 (state_attr('input_datetime.tina_workday_end','timestamp')) > 61200 %} {% if (state_attr('input_datetime.tina_workday_end','timestamp')) > 61200 %}
16:00 16:00
{% else %} {% else %}
{{ (state_attr('input_datetime.tina_workday_end', 'timestamp') + 3600) | timestamp_custom('%H:%M', false) }} {{ (state_attr('input_datetime.tina_workday_end', 'timestamp') + 3600) | timestamp_custom('%H:%M', false) }}
{% endif %} {% endif %}
{% else %}
15:30
{% endif %} {% endif %}
- if: - if:
- condition: state - condition: state
@ -554,7 +561,18 @@ script:
- service: input_datetime.set_datetime - service: input_datetime.set_datetime
entity_id: input_datetime.master_bedroom_wakeup entity_id: input_datetime.master_bedroom_wakeup
data: data:
time: "16:30" 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 %}
- delay: - delay:
milliseconds: 500 milliseconds: 500
- service: input_datetime.set_datetime - service: input_datetime.set_datetime
@ -600,17 +618,22 @@ script:
data: data:
time: > time: >
{% set low = states('sensor.overnight_lowest_temperature') | int %} {% set low = states('sensor.overnight_lowest_temperature') | int %}
{% set high = states('sensor.todays_high_temp') | int %}
{% set kallen_bedtime = state_attr('input_datetime.kallen_bedtime','timestamp') | int %} {% set kallen_bedtime = state_attr('input_datetime.kallen_bedtime','timestamp') | int %}
{% set kallen_fantime = state_attr('input_datetime.kallen_fan','timestamp') | int %} {% set cutoff = 81000 %}
{% set bedroom_hot = is_state('binary_sensor.kallen_bedroom_hot','on') %} {% if is_state('input_boolean.hot_day','on') and is_state('binary_sensor.kallen_school_tomorrow','on') %}
{% set cutoff = 81000 %} {# Cutoff time is 22:30 #} {{ (kallen_bedtime - 3600) | timestamp_custom('%H:%M',false) }}
{% if is_state('input_boolean.hot_day','on') or bedroom_hot == true %} {% elif is_state('input_boolean.hot_day','on') and is_state('binary_sensor.kallen_school_tomorrow','off') %}
{{ (kallen_fantime - 3600) | timestamp_custom('%H:%M',false) }}
{% elif low >= 56 or high >= 75 %}
{{ (kallen_bedtime - 1800) | timestamp_custom('%H:%M',false) }}
{% else %}
{{ kallen_bedtime | timestamp_custom('%H:%M',false) }} {{ kallen_bedtime | timestamp_custom('%H:%M',false) }}
{% elif 56 <= low <= 60 %}
22:30
{% elif low > 60 %}
{% if kallen_bedtime < cutoff %}
{{ kallen_bedtime | timestamp_custom('%H:%M',false) }}
{% else %}
21:30
{% endif %}
{% else %}
00:00
{% endif %} {% endif %}
- service: input_datetime.set_datetime - service: input_datetime.set_datetime
entity_id: input_datetime.master_bedroom_fan entity_id: input_datetime.master_bedroom_fan
@ -619,11 +642,11 @@ script:
{% set low = states('sensor.overnight_lowest_temperature') | int %} {% set low = states('sensor.overnight_lowest_temperature') | int %}
{% set high = states('sensor.todays_high_temp') | int %} {% set high = states('sensor.todays_high_temp') | int %}
{% if low > 60 or is_state('input_boolean.hot_day','on') %} {% if low > 60 or is_state('input_boolean.hot_day','on') %}
01:00 00:00
{% elif 50 <= low <= 60 %} {% elif 50 <= low <= 60 %}
02:00 01:00
{% elif low >= states('input_number.master_bedroom_fan_threshold') | int and high > 60 %} {% elif low >= states('input_number.master_bedroom_fan_threshold') | int and high > 60 %}
03:00 02:00
{% else %} {% else %}
06:00 06:00
{% endif %} {% endif %}
@ -709,16 +732,11 @@ script:
entity_id: input_select.scheduled_climate_mode_emma_bedroom entity_id: input_select.scheduled_climate_mode_emma_bedroom
data: data:
option: > option: >
{% set low = states('sensor.overnight_lowest_temperature') | int %} {% if is_state('input_boolean.emma_bedroom_aircon_installed','on') %}
{% set run_threshold = states('input_number.emma_bedroom_aircon_run_threshold') | int %} {% if (states('sensor.overnight_lowest_temperature') | int) >= (states('input_number.emma_aircon_threshold') | int) %}
{% set mode_threshold = states('input_number.emma_bedroom_aircon_mode_threshold') | int %}
{% if is_state('input_boolean.emma_bedroom_aircon_installed','off') %}
White Noise
{% elif low >= run_threshold %}
{% if low >= mode_threshold %}
AC AC
{% else %} {% else %}
Fan White Noise
{% endif %} {% endif %}
{% else %} {% else %}
White Noise White Noise
@ -732,11 +750,11 @@ script:
{% set low = states('sensor.overnight_lowest_temperature') | int %} {% set low = states('sensor.overnight_lowest_temperature') | int %}
{% set bedtime = state_attr('input_datetime.emma_bedtime','timestamp') | int %} {% set bedtime = state_attr('input_datetime.emma_bedtime','timestamp') | int %}
{% if is_state('input_boolean.hot_day','on') %} {% if is_state('input_boolean.hot_day','on') %}
{{ (bedtime - 5400) | timestamp_custom('%H:%M',false) }} {{ (bedtime - 7200) | timestamp_custom('%H:%M',false) }}
{% elif high >= 80 or low >= 60 %} {% elif high >= 80 or low >= 60 %}
{{ (bedtime - 3600) | timestamp_custom('%H:%M',false) }} {{ (bedtime - 5400) | timestamp_custom('%H:%M',false) }}
{% else %} {% else %}
{{ (bedtime - 1800) | timestamp_custom('%H:%M',false) }} {{ (bedtime - 3600) | timestamp_custom('%H:%M',false) }}
{% endif %} {% endif %}
- service: input_boolean.turn_on - service: input_boolean.turn_on
target: target:

View File

@ -106,7 +106,7 @@ template:
unique_id: 2987ae95-f55d-4994-b9dd-018278d2f5ad unique_id: 2987ae95-f55d-4994-b9dd-018278d2f5ad
state: > state: >
{% from 'sports.jinja' import sports_inhibit %} {% from 'sports.jinja' import sports_inhibit %}
{{ sports_inhibit('sensor.minnesota_twins') }} {{ state_attr('sensor.minnesota_twins','opponent_abbr') in ['CLE','LAD'] or sports_inhibit('sensor.minnesota_twins') }}
- name: Minnesota Twins Event Today - name: Minnesota Twins Event Today
unique_id: 30055cb3-d259-4cef-90e1-7dea0a5cb439 unique_id: 30055cb3-d259-4cef-90e1-7dea0a5cb439
state: > state: >
@ -116,7 +116,7 @@ template:
unique_id: b0980d47-d762-4f23-97b1-9e88da729d8f unique_id: b0980d47-d762-4f23-97b1-9e88da729d8f
state: > state: >
{% from 'sports.jinja' import sports_inhibit %} {% from 'sports.jinja' import sports_inhibit %}
{{ state_attr('sensor.cleveland_guardians','opponent_abbr') in ['MIN','LAD'] or sports_inhibit('sensor.cleveland_guardians') }} {{ sports_inhibit('sensor.cleveland_guardians') }}
- name: Cleveland Guardians Event Today - name: Cleveland Guardians Event Today
unique_id: 985a7b2c-9ebd-4a2e-8ee2-2ab5359310e0 unique_id: 985a7b2c-9ebd-4a2e-8ee2-2ab5359310e0
state: > state: >
@ -126,7 +126,7 @@ template:
unique_id: 2c6aae6e-eff6-46e5-bee9-311f9bbc0c0e unique_id: 2c6aae6e-eff6-46e5-bee9-311f9bbc0c0e
state: > state: >
{% from 'sports.jinja' import sports_inhibit %} {% from 'sports.jinja' import sports_inhibit %}
{{ state_attr('sensor.los_angeles_dodgers','opponent_abbr') in ['MIN'] or sports_inhibit('sensor.los_angeles_dodgers') }} {{ state_attr('sensor.los_angeles_dodgers','opponent_abbr') in ['CLE'] or sports_inhibit('sensor.los_angeles_dodgers') }}
- name: Los Angeles Dodgers Event Today - name: Los Angeles Dodgers Event Today
unique_id: 7c2bd060-ea2c-4b81-8af7-3e6b9b3c639d unique_id: 7c2bd060-ea2c-4b81-8af7-3e6b9b3c639d
state: > state: >

View File

@ -1,8 +1,3 @@
input_boolean:
server_maintenance:
name: Server Maintenance
icon: mdi:wrench-clock
input_select: input_select:
log_level: log_level:
name: Log Level name: Log Level
@ -68,25 +63,25 @@ template:
- binary_sensor: - binary_sensor:
- name: Tony Desktop On - name: Tony Desktop On
unique_id: 82ce673a-96ad-4af5-a8d1-be9ca9fa9c36 unique_id: 82ce673a-96ad-4af5-a8d1-be9ca9fa9c36
state: "{{ states('sensor.tony_desktop_power') | int > 25 }}" state: "{{ states('sensor.tony_desktop_power') | int > 10 }}"
device_class: running device_class: running
attributes: attributes:
power_usage: "{{ states('sensor.tony_desktop_power') | int }}W" power_usage: "{{ states('sensor.tony_desktop_power') | int }}W"
- name: Tina Desktop On - name: Tina Desktop On
unique_id: 8484dbd4-2fae-4368-a4bc-d1bdc09e003f unique_id: 8484dbd4-2fae-4368-a4bc-d1bdc09e003f
state: "{{ states('sensor.tina_desktop_power') | int > 25 }}" state: "{{ states('sensor.tina_desktop_power') | int > 10 }}"
device_class: running device_class: running
attributes: attributes:
power_usage: "{{ states('sensor.tina_desktop_power') | int }}W" power_usage: "{{ states('sensor.tina_desktop_power') | int }}W"
- name: Kallen Desktop On - name: Kallen Desktop On
unique_id: ccc25d75-4915-449d-9b2e-09ad14ffac29 unique_id: ccc25d75-4915-449d-9b2e-09ad14ffac29
state: "{{ states('sensor.kallen_desktop_power') | int > 25 }}" state: "{{ states('sensor.kallen_desktop_power') | int > 10 }}"
device_class: running device_class: running
attributes: attributes:
power_usage: "{{ states('sensor.kallen_desktop_power') | int }}W" power_usage: "{{ states('sensor.kallen_desktop_power') | int }}W"
- name: Basement Server On - name: Basement Server On
unique_id: e6df7d98-d3ba-4e01-bae2-2ebafc8d78d6 unique_id: e6df7d98-d3ba-4e01-bae2-2ebafc8d78d6
state: "{{ states('sensor.basement_server_power') | int > 25 }}" state: "{{ states('sensor.basement_server_power') | int > 10 }}"
device_class: running device_class: running
attributes: attributes:
power_usage: "{{ states('sensor.basement_server_power') | int }}W" power_usage: "{{ states('sensor.basement_server_power') | int }}W"

126
packages/variables.yaml Normal file
View File

@ -0,0 +1,126 @@
script:
get_room_speakers:
alias: Get Room Speakers
sequence:
- variables:
room_services: >-
{% if room in areas() %}
{% set alexa_speaker = states.media_player |
selectattr('entity_id', 'in', area_entities(room)) |
rejectattr('attributes.last_called', 'undefined') |
selectattr('entity_id', 'search', 'echo_dot') |
map(attribute='entity_id') |
list | first %}
{% set google_speaker = states.media_player |
selectattr('entity_id', 'in', area_entities(room)) |
rejectattr('attributes.device_class', 'undefined') |
selectattr('attributes.device_class', 'search', '(speaker)') |
selectattr('entity_id', 'search', 'google') |
map(attribute='entity_id') |
list | first %}
{% set tts = "alexa" if alexa_speaker is defined else "google" %}
{% else %}
{% set tts = "group" %}
{% endif %}
{"area":"{{room}}","alexa_speaker":"{{alexa_speaker|default({}) }}","jarvis_tts":"{{tts|default("google") }}","google_speaker":"{{google_speaker|default({}) }}"}
- stop: "Services acquired"
response_variable: "get_room_speakers"
get_group_speakers:
alias: Get Group Speakers
sequence:
- variables:
get_group_speakers: >-
{% set speakers = expand('group.' + group) | map(attribute='entity_id') | list | join(',') %}
{% set alexa_speakers = expand('group.' + group) |
rejectattr('attributes.last_called', 'undefined') |
selectattr('entity_id', 'search', 'echo_dot') |
map(attribute='entity_id') |
list | join(',') %}
{% set google_speakers = expand('group.' + group) |
rejectattr('attributes.device_class', 'undefined') |
selectattr('attributes.device_class', 'search', '(speaker)') |
selectattr('entity_id', 'search', 'google') |
map(attribute='entity_id') |
list | join(',') %}
{"alexa":"{{alexa_speakers|default({})}}","google":"{{google_speakers|default({})}}"}
- stop: "Speakers acquired"
response_variable: "get_group_speakers"
get_echo_dots:
alias: Get Echo Dots
sequence:
- variables:
get_echo_dots: >-
{% if group is defined %}
{% set speakers = expand('group.' + group) %}
{% else %}
{% set speakers = states.media_player %}
{% endif %}
{% set echo_dots = speakers |
rejectattr('attributes.last_called', 'undefined') |
selectattr('entity_id', 'search', 'echo_dot') |
map(attribute='entity_id') |
list | join(',') %}
{"speakers":"{{echo_dots}}"}
- stop: "Echo Dots acquired"
response_variable: "get_echo_dots"
get_google_speakers:
alias: Get Google Speakers
sequnce:
- variables:
get_google_speakers: >-
{% if group is defined %}
{% set speakers = expand('group.' + group) %}
{% else %}
{% set speakers = states.media_player %}
{% endif %}
{% set google_speaker = speakers |
rejectattr('attributes.device_class', 'undefined') |
selectattr('attributes.device_class', 'search', '(speaker)') |
selectattr('entity_id', 'search', 'google') |
map(attribute='entity_id') |
list | join(',') %}
{"speakers":"{{google_speaker}}"}
- stop: "Google speakers acquired"
response_variable: "get_google_speakers"
get_all_speakers:
alias: Get All Speakers
sequence:
- variables: >-
get_speakers:
{% set alexa_speaker = states.media_player |
rejectattr('attributes.last_called', 'undefined') |
selectattr('entity_id', 'search', 'echo_dot') |
map(attribute='entity_id')
%}
{% set google_speaker = states.media_player |
rejectattr('attributes.device_class', 'undefined') |
selectattr('attributes.device_class', 'search', '(speaker)') |
selectattr('entity_id', 'search', 'google') |
map(attribute='entity_id')
%}
{% set alexa_list = alexa_speaker | list | join(',') %}
{% set google_list = google_speaker | list | join(',') %}
{% set all_speakers = alexa_list + ',' + google_list %}
{"all_speakers":"{{all_speakers}}"}
get_room_lights:
alias: Get Room Lights
sequence:
- variables:
area: >
{{ room }}
entities: >
{% set lights = states.light |
selectattr('entity_id', 'in', area_entities(area)) |
map(attribute='entity_id') |
list | join(',') %}
{"lights":"{{lights}}"}
- stop: "Lights acquired"
response_variable: "entities"

View File

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

View File

@ -1210,23 +1210,14 @@
min_mireds: 153 min_mireds: 153
max_mireds: 500 max_mireds: 500
effect_list: effect_list:
- 'off' - None
- candle - candle
- fire - fire
- prism - prism
- sparkle
- opal
- glisten
- underwater
- cosmos
- sunbeam
- enchant
- sunrise
- sunset
supported_color_modes: supported_color_modes:
- color_temp - color_temp
- xy - xy
effect: 'off' effect: None
color_mode: xy color_mode: xy
brightness: 179 brightness: 179
color_temp_kelvin: color_temp_kelvin:
@ -1253,23 +1244,14 @@
min_mireds: 153 min_mireds: 153
max_mireds: 500 max_mireds: 500
effect_list: effect_list:
- 'off' - None
- candle - candle
- fire - fire
- prism - prism
- sparkle
- opal
- glisten
- underwater
- cosmos
- sunbeam
- enchant
- sunrise
- sunset
supported_color_modes: supported_color_modes:
- color_temp - color_temp
- xy - xy
effect: 'off' effect: None
color_mode: xy color_mode: xy
brightness: 255 brightness: 255
color_temp_kelvin: color_temp_kelvin:
@ -1296,13 +1278,10 @@
min_mireds: 153 min_mireds: 153
max_mireds: 500 max_mireds: 500
effect_list: effect_list:
- 'off' - None
- candle - candle
- fire - fire
- prism - prism
- sparkle
- opal
- glisten
supported_color_modes: supported_color_modes:
- color_temp - color_temp
- xy - xy
@ -1363,23 +1342,14 @@
min_mireds: 153 min_mireds: 153
max_mireds: 500 max_mireds: 500
effect_list: effect_list:
- 'off' - None
- candle - candle
- fire - fire
- prism - prism
- sparkle
- opal
- glisten
- underwater
- cosmos
- sunbeam
- enchant
- sunrise
- sunset
supported_color_modes: supported_color_modes:
- color_temp - color_temp
- xy - xy
effect: 'off' effect: None
color_mode: xy color_mode: xy
brightness: 255 brightness: 255
color_temp_kelvin: color_temp_kelvin:
@ -1406,23 +1376,14 @@
min_mireds: 153 min_mireds: 153
max_mireds: 500 max_mireds: 500
effect_list: effect_list:
- 'off' - None
- candle - candle
- fire - fire
- prism - prism
- sparkle
- opal
- glisten
- underwater
- cosmos
- sunbeam
- enchant
- sunrise
- sunset
supported_color_modes: supported_color_modes:
- color_temp - color_temp
- xy - xy
effect: 'off' effect: None
color_mode: xy color_mode: xy
brightness: 255 brightness: 255
color_temp_kelvin: color_temp_kelvin:
@ -1480,17 +1441,14 @@
min_mireds: 153 min_mireds: 153
max_mireds: 500 max_mireds: 500
effect_list: effect_list:
- 'off' - None
- candle - candle
- fire - fire
- prism - prism
- sparkle
- opal
- glisten
supported_color_modes: supported_color_modes:
- color_temp - color_temp
- xy - xy
effect: 'off' effect: None
color_mode: xy color_mode: xy
brightness: 204 brightness: 204
color_temp_kelvin: color_temp_kelvin:

View File

@ -854,12 +854,6 @@ adaptive_on_first_floor:
adaptive_on_second_floor: adaptive_on_second_floor:
alias: Adaptive on Second Floor alias: Adaptive on Second Floor
sequence: sequence:
- action: switch.turn_on
metadata: {}
data: {}
target:
entity_id: switch.adaptive_lighting_stairwell
alias: Turn on adaptive lighting in stairwell
- if: - if:
- condition: state - condition: state
entity_id: light.hallway_overhead entity_id: light.hallway_overhead
@ -1447,42 +1441,16 @@ evening_on_second_floor:
goodnight_in_basement: goodnight_in_basement:
alias: Goodnight in Basement alias: Goodnight in Basement
sequence: sequence:
- target: - service: light.turn_off
target:
area_id: area_id:
- basement_studio - basement_studio
- furnace_room - furnace_room
data: {} data: {}
action: light.turn_off - service: fan.turn_off
alias: Turn lights off target:
- target:
entity_id: fan.basement_fan entity_id: fan.basement_fan
data: {} data: {}
action: fan.turn_off
alias: Turn fan off
- delay:
hours: 0
minutes: 0
seconds: 3
milliseconds: 0
- action: switch.turn_off
metadata: {}
data: {}
target:
entity_id: switch.adaptive_lighting_sleep_mode_basement_studio
alias: Turn off sleep mode
- action: switch.turn_on
metadata: {}
data: {}
target:
entity_id: switch.adaptive_lighting_basement_studio
alias: Turn on adaptive lighting
- action: input_text.set_value
metadata: {}
data:
value: Adaptive
target:
entity_id: input_text.basement_studio_selected_scene
alias: Reset selected scene text
goodnight_on_first_floor: goodnight_on_first_floor:
alias: Goodnight on First Floor alias: Goodnight on First Floor
sequence: sequence:
@ -1576,14 +1544,14 @@ day_mode_in_tina_desk:
alias: Day Mode in Tina Desk alias: Day Mode in Tina Desk
sequence: sequence:
- parallel: - parallel:
- target: - service: light.turn_on
target:
entity_id: light.tina_lamp_top entity_id: light.tina_lamp_top
data: {} data: {}
action: light.turn_on - service: light.turn_off
- target: target:
entity_id: light.tina_lamp_side entity_id: light.tina_lamp_side
data: {} data: {}
action: light.turn_off
- wait_template: '{{ is_state(''light.tina_lamp_side'',''off'') }}' - wait_template: '{{ is_state(''light.tina_lamp_side'',''off'') }}'
timeout: timeout:
seconds: 15 seconds: 15
@ -1593,57 +1561,52 @@ day_mode_in_tina_desk:
- condition: state - condition: state
entity_id: switch.adaptive_lighting_tina_lamp entity_id: switch.adaptive_lighting_tina_lamp
state: 'off' state: 'off'
alias: If adaptive lighting is off alias: If switch is off
then: then:
- alias: Turn on adaptive lighting - service: switch.turn_on
data: {} data: {}
target: target:
entity_id: entity_id: switch.adaptive_lighting_tina_lamp
- switch.adaptive_lighting_tina_lamp alias: Turn on the switch
- switch.adaptive_lighting_adapt_brightness_tina_lamp
- switch.adaptive_lighting_adapt_color_tina_lamp
action: switch.turn_on
else: else:
- alias: Apply adaptive lighting - alias: Apply adaptive lighting
service: adaptive_lighting.apply
data: data:
entity_id: switch.adaptive_lighting_tina_lamp entity_id: switch.adaptive_lighting_tina_lamp
adapt_brightness: true adapt_brightness: true
adapt_color: true adapt_color: true
action: adaptive_lighting.apply
mode: restart mode: restart
icon: mdi:palette icon: mdi:palette
evening_mode_in_tina_desk: evening_mode_in_tina_desk:
alias: Evening Mode in Tina Desk alias: Evening Mode in Tina Desk
sequence: sequence:
- alias: Turn on lamp - alias: Turn on lamp
service: light.turn_on
data: {} data: {}
target: target:
entity_id: entity_id:
- light.tina_lamp_top - light.tina_lamp_top
- light.tina_lamp_side - light.tina_lamp_side
action: light.turn_on
- alias: Apply adaptive lighting to lamp - alias: Apply adaptive lighting to lamp
if: if:
- condition: state - condition: state
entity_id: switch.adaptive_lighting_tina_lamp entity_id: switch.adaptive_lighting_tina_lamp
state: 'off' state: 'off'
alias: If adaptive lighting is off alias: If switch is off
then: then:
- alias: Turn on adaptive lighting - service: switch.turn_on
data: {} data: {}
target: target:
entity_id: entity_id: switch.adaptive_lighting_tina_lamp
- switch.adaptive_lighting_tina_lamp alias: Turn on the switch
- switch.adaptive_lighting_adapt_brightness_tina_lamp
- switch.adaptive_lighting_adapt_color_tina_lamp
action: switch.turn_on
else: else:
- alias: Apply adaptive lighting - service: adaptive_lighting.apply
data: data:
entity_id: switch.adaptive_lighting_tina_lamp entity_id: switch.adaptive_lighting_tina_lamp
adapt_brightness: true adapt_brightness: true
adapt_color: true adapt_color: true
action: adaptive_lighting.apply turn_on_lights: true
alias: Apply adaptive lighting
mode: restart mode: restart
icon: mdi:palette icon: mdi:palette
night_mode_in_tina_desk: night_mode_in_tina_desk:
@ -2513,26 +2476,25 @@ kallen_morning_meds:
kallen_night_meds: kallen_night_meds:
alias: Kallen Night Meds alias: Kallen Night Meds
sequence: sequence:
- alias: Increment night reminder counter - service: counter.increment
metadata: {} metadata: {}
data: {} data: {}
action: counter.increment alias: Increment night reminder counter
target: - service: script.text_notify
entity_id: counter.kallen_night_meds_reminder_count data:
- data:
type: alert type: alert
who: all who: all
message: clear_notification message: clear_notification
tag: kallen-night-meds tag: kallen-night-meds
alias: Clear previous night notification alias: Clear previous night notification
action: script.text_notify
- delay: - delay:
hours: 0 hours: 0
minutes: 0 minutes: 0
seconds: 5 seconds: 5
milliseconds: 0 milliseconds: 0
- parallel: - parallel:
- data: - service: script.text_notify
data:
who: "{% if states('person.christina_stork') in ['Bob Evans','BobEvans'] %}\n who: "{% if states('person.christina_stork') in ['Bob Evans','BobEvans'] %}\n
\ tony\n{% else %}\n parents\n{% endif %}\n" \ tony\n{% else %}\n parents\n{% endif %}\n"
type: alert type: alert
@ -2545,8 +2507,8 @@ kallen_night_meds:
- action: KALLEN_NIGHT_MEDS_SKIPPED - action: KALLEN_NIGHT_MEDS_SKIPPED
title: Skip title: Skip
alias: Send to parents alias: Send to parents
action: script.text_notify
- alias: Send to Kallen - alias: Send to Kallen
service: script.text_notify
data: data:
who: kallen who: kallen
type: alert type: alert
@ -2558,7 +2520,6 @@ kallen_night_meds:
title: Taken title: Taken
- action: KALLEN_NIGHT_MEDS_SKIPPED - action: KALLEN_NIGHT_MEDS_SKIPPED
title: Skip title: Skip
action: script.text_notify
alias: Send text notifications alias: Send text notifications
icon: mdi:medication icon: mdi:medication
mode: restart mode: restart
@ -3011,33 +2972,69 @@ emma_sleep:
option: Adaptive option: Adaptive
alias: Set lights to adaptive alias: Set lights to adaptive
action: input_select.select_option action: input_select.select_option
- if: - alias: Select climate mode
- alias: White Noise choose:
condition: and - conditions:
conditions: - alias: AC
- condition: state condition: and
entity_id: input_select.scheduled_climate_mode_emma_bedroom conditions:
state: White Noise - condition: state
alias: Scheduled mode is White Noise entity_id: input_select.scheduled_climate_mode_emma_bedroom
- condition: state state: AC
entity_id: input_boolean.white_noise_emma_bedroom alias: Scheduled mode is AC
state: 'off' - condition: state
alias: White Noise is not already on entity_id: fan.emma_air_conditioner
then: state: 'off'
- target: alias: Air conditioner is not already on
entity_id: input_boolean.white_noise_emma_bedroom sequence:
data: {} - target:
alias: Turn on white noise entity_id: fan.emma_air_conditioner
action: input_boolean.turn_on data: {}
alias: Turn on air conditioner
action: fan.turn_on
- 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
action: script.text_notify
- conditions:
- alias: White Noise
condition: and
conditions:
- condition: state
entity_id: input_select.scheduled_climate_mode_emma_bedroom
state: White Noise
alias: Scheduled mode is White Noise
- condition: state
entity_id: input_boolean.white_noise_emma_bedroom
state: 'off'
alias: White Noise is not already on
sequence:
- target:
entity_id: input_boolean.white_noise_emma_bedroom
data: {}
alias: Turn on white noise
action: input_boolean.turn_on
- data:
who: parents
title: Emma Climate Schedule
message: White noise has been activated in Emma's Bedroom.
type: normal
tag: emma-climate
alias: Send white noise notification
action: script.text_notify
default:
- data: - data:
who: parents who: parents
title: Emma Climate Schedule title: Emma Climate Schedule
message: White noise has been activated in Emma's Bedroom. message: No option selected for Emma's climate mode. No devices will be activated.
type: normal type: normal
tag: emma-climate tag: emma-climate
alias: Send white noise notification alias: Send notification that no climate mode is selected
action: script.text_notify action: script.text_notify
alias: Select climate mode
icon: mdi:lightbulb-night icon: mdi:lightbulb-night
mode: restart mode: restart
tina_morning_meds: tina_morning_meds:
@ -3564,41 +3561,3 @@ tina_tylenol:
icon: mdi:medication icon: mdi:medication
max: 10 max: 10
description: '' description: ''
reading_mode_in_tina_desk:
sequence:
- action: switch.turn_off
metadata: {}
data: {}
target:
entity_id: switch.adaptive_lighting_adapt_brightness_tina_lamp
alias: Turn off adaptive brightness, leave adaptive color on
- alias: Turn on lamp
action: light.turn_on
metadata: {}
data:
brightness_pct: 100
target:
entity_id: light.tina_desk_lights
- alias: Apply adaptive lighting to lamp
if:
- condition: state
entity_id: switch.adaptive_lighting_tina_lamp
state: 'off'
alias: If switch is off
then:
- data: {}
target:
entity_id: switch.adaptive_lighting_tina_lamp
alias: Turn on the switch
action: switch.turn_on
else:
- alias: Apply adaptive lighting
data:
entity_id: switch.adaptive_lighting_tina_lamp
adapt_color: true
turn_on_lights: true
adapt_brightness: false
action: adaptive_lighting.apply
alias: Reading Mode in Tina Desk
description: ''
icon: mdi:palette

View File

@ -168,7 +168,7 @@
unit_of_measurement: '' unit_of_measurement: ''
state: >- state: >-
{% set compressors = [ {% set compressors = [
states.binary_sensor.emma_bedroom_aircon_compressor, states.binary_sensor.emma_aircon_compressor,
states.binary_sensor.master_bedroom_aircon_compressor states.binary_sensor.master_bedroom_aircon_compressor
] %} ] %}
{{ compressors | selectattr('state','eq','on') | list | count | int }} {{ compressors | selectattr('state','eq','on') | list | count | int }}
@ -177,7 +177,7 @@
unit_of_measurement: '' unit_of_measurement: ''
state: >- state: >-
{% set fans = [ {% set fans = [
states.binary_sensor.emma_bedroom_aircon_fan, states.binary_sensor.emma_aircon_fan,
states.binary_sensor.master_bedroom_aircon_fan states.binary_sensor.master_bedroom_aircon_fan
] %} ] %}
{{ fans | selectattr('state','eq','on') | list | count | int }} {{ fans | selectattr('state','eq','on') | list | count | int }}
@ -196,7 +196,11 @@
unit_of_measurement: '' unit_of_measurement: ''
state: >- state: >-
{% set climate = states.climate | selectattr('state','ne','off') | rejectattr('state','eq','unavailable') | rejectattr('state','eq','unknown') | list | count | int %} {% set climate = states.climate | selectattr('state','ne','off') | rejectattr('state','eq','unavailable') | rejectattr('state','eq','unknown') | list | count | int %}
{{ climate | int }} {% set fans = [
states.fan.emma_air_conditioner
] %}
{% set fans_on = fans | selectattr('state','eq','on') | list | count | int %}
{{ climate + fans_on | int }}
- name: Climate Devices Running - name: Climate Devices Running
unique_id: 3c61c756-2934-4294-8085-7d3855b692dd unique_id: 3c61c756-2934-4294-8085-7d3855b692dd
unit_of_measurement: '' unit_of_measurement: ''

View File

@ -98,7 +98,12 @@
{% endif %} {% endif %}
{% if is_state('input_boolean.kallen_alternate_pickup','on') %} {% if is_state('input_boolean.kallen_alternate_pickup','on') %}
Today, you will be picked up from school by {{ states('input_text.kallen_pickup') }}. 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 %} {% 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 -%} {% if count_the_days('input_datetime.school_last_day') | int == 0 -%}
But today is the last day of School! But today is the last day of School!
{%- endif %} {%- endif %}

View File

@ -71,13 +71,9 @@
{% else %} {% else %}
"Collin's room will be left alone, as he is spending the night elsewhere tonight. " "Collin's room will be left alone, as he is spending the night elsewhere tonight. "
{% endif %} {% endif %}
{% if states('input_select.scheduled_climate_mode_emma_bedroom_aircon') != 'N/A' %} {% if states('input_select.scheduled_climate_mode_emma_bedroom') != 'N/A' %}
{% if is_state('input_select.scheduled_climate_mode_emma_bedroom_aircon','AC') and is_state('input_boolean.hot_day','on') %} {% if is_state('input_select.scheduled_climate_mode_emma_bedroom','AC') and is_state('fan.emma_air_conditioner','off') %}
"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') }}. " "Emma's air conditioner will be activated 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') %} {% elif is_state('input_select.scheduled_climate_mode_emma_bedroom','White Noise') and is_state('input_boolean.white_noise_emma_bedroom','off') %}
"Emma's white noise generator will activate at {{ input_datetime_read('input_datetime.emma_bedtime') }}. " "Emma's white noise generator will activate at {{ input_datetime_read('input_datetime.emma_bedtime') }}. "
{% endif %} {% endif %}

View File

@ -91,21 +91,8 @@
{% endif %} {% endif %}
{% endif %} {% endif %}
{% endif %} {% endif %}
{% if is_state('input_boolean.emma_bedroom_aircon_installed','on') %} {% if is_state('input_boolean.emma_bedroom_aircon_installed','on') and is_state('fan.emma_air_conditioner','on') %}
"the temperature in Emma's bedroom is {{ states('sensor.emma_bedroom_temperature') | int }} degrees. " "Emma's air conditioner is {{ states('fan.emma_air_conditioner') }}. "
{% 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 %}
{% endif %} {% endif %}
</p> </p>
@ -128,7 +115,7 @@
"Tina has work today. " "Tina has work today. "
{% endif %} {% endif %}
{% if is_state('input_boolean.kallen_at_school','on') %} {% if is_state('input_boolean.kallen_at_school','on') %}
"Collin is at school right now. His school day ends at {{ input_datetime_read('input_datetime.kallen_school_day_end') }}. " "Collin is at school right now. His pickup time will be at {{ input_datetime_read('input_datetime.kallen_school_day_end') }}. "
{% elif is_state('input_boolean.kallen_school_today','on') %} {% elif is_state('input_boolean.kallen_school_today','on') %}
"Collin has school today. " "Collin has school today. "
{% endif %} {% endif %}