Compare commits
41 Commits
Author | SHA1 | Date | |
---|---|---|---|
1a706153a8
|
|||
95b2c8cfc5
|
|||
61b04c05c6
|
|||
41141e94df
|
|||
cc9ec0b211
|
|||
adf881a106
|
|||
6ee298a3d2
|
|||
aa6358ce19
|
|||
abe62888b2
|
|||
0cabab0462
|
|||
034cf2f972
|
|||
1d246e8018
|
|||
5cffb7208f
|
|||
a7b1a53754
|
|||
de5efd39b4
|
|||
0129a56866
|
|||
b305f7c880
|
|||
6ee4bacf55
|
|||
4710700f7e
|
|||
895e99657b
|
|||
0dc7d0f8e4
|
|||
d38cf59812
|
|||
a489ecdf14
|
|||
8698a46d4f
|
|||
7d5aa32834
|
|||
37458be1b8
|
|||
72421b8716
|
|||
8be8f4bb58
|
|||
6e619fa647
|
|||
9dca18048c
|
|||
52bfb8bd49
|
|||
43feaa9b06
|
|||
0847e7fd10
|
|||
425b1fb0cf
|
|||
f589cc0e6c
|
|||
49a4f4650b
|
|||
3a2fc504f3
|
|||
f1180cc34b
|
|||
b936838376
|
|||
2d755be935
|
|||
ed0431ae56
|
@ -1 +1 @@
|
||||
2025.5.0
|
||||
2025.6.2
|
212
automations.yaml
212
automations.yaml
@ -69,15 +69,6 @@
|
||||
seconds: 0
|
||||
milliseconds: 0
|
||||
mode: single
|
||||
- id: '1640916845901'
|
||||
alias: Cast to Chromecast
|
||||
description: ''
|
||||
use_blueprint:
|
||||
path: kind3r/cast-and-re-cast-a-lovelace-view-to-a-google-hub.yaml
|
||||
input:
|
||||
dashboard: lovelace
|
||||
player: media_player.living_room_tv
|
||||
view: chromecast
|
||||
- id: '1640989510134'
|
||||
alias: New Years
|
||||
description: Flash lights for New Years
|
||||
@ -281,15 +272,6 @@
|
||||
- service: icloud3.restart
|
||||
data: {}
|
||||
mode: single
|
||||
- id: '1645738561470'
|
||||
alias: Cast to Basement TV
|
||||
description: ''
|
||||
use_blueprint:
|
||||
path: kind3r/cast-and-re-cast-a-lovelace-view-to-a-google-hub.yaml
|
||||
input:
|
||||
dashboard: lovelace
|
||||
player: media_player.basement_tv_chromecast
|
||||
view: chromecast
|
||||
- id: '1651785688186'
|
||||
alias: Watchman Audit on Startup
|
||||
description: Runs the Watchman Audit script after Home Assistant has successfully
|
||||
@ -1887,54 +1869,70 @@
|
||||
to: 'on'
|
||||
id: recliner-on
|
||||
trigger: state
|
||||
alias: Recliner Mode On
|
||||
- entity_id: input_boolean.recliner_mode
|
||||
from: 'on'
|
||||
to: 'off'
|
||||
id: recliner-off
|
||||
trigger: state
|
||||
alias: Recliner Mode Off
|
||||
conditions: []
|
||||
actions:
|
||||
- choose:
|
||||
- alias: Routing
|
||||
choose:
|
||||
- conditions:
|
||||
- condition: trigger
|
||||
id: recliner-on
|
||||
alias: Recliner Mode On
|
||||
sequence:
|
||||
- target:
|
||||
entity_id: input_select.basement_studio_scenes
|
||||
data:
|
||||
option: Stairwell
|
||||
action: input_select.select_option
|
||||
alias: Set scene to Stairwell
|
||||
- target:
|
||||
entity_id:
|
||||
- input_boolean.white_noise_basement
|
||||
- input_boolean.studio_quiet
|
||||
data: {}
|
||||
action: input_boolean.turn_on
|
||||
- if:
|
||||
alias: Turn on white noise and Studio Quiet
|
||||
- alias: Turn off TV
|
||||
if:
|
||||
- condition: template
|
||||
value_template: "{% if is_state('media_player.basement_tv','playing') %}\n
|
||||
\ false\n{% elif is_state('media_player.basement_tv','paused') or is_state('media_player.basement_tv','idle')
|
||||
%}\n {{ state_attr('media_player.basement_tv','app_name') in ['TV','Android
|
||||
TV Launcher'] }}\n{% else %}\n false\n{% endif %}\n"
|
||||
alias: If nothing is playing
|
||||
then:
|
||||
- target:
|
||||
entity_id: media_player.basement_tv
|
||||
data: {}
|
||||
action: media_player.turn_off
|
||||
- if:
|
||||
- condition: not
|
||||
alias: Turn off TV
|
||||
enabled: false
|
||||
- alias: Turn off computer monitors
|
||||
if:
|
||||
- alias: If I'm not watching something
|
||||
condition: not
|
||||
conditions:
|
||||
- condition: state
|
||||
entity_id: media_player.tony_asus
|
||||
state: playing
|
||||
alias: PC playing video or music
|
||||
then:
|
||||
- target:
|
||||
entity_id: script.tony_desktop_displays_off
|
||||
data: {}
|
||||
action: script.turn_on
|
||||
alias: Turn off computer monitors
|
||||
enabled: false
|
||||
- conditions:
|
||||
- condition: trigger
|
||||
id: recliner-off
|
||||
alias: Recliner Mode Off
|
||||
sequence:
|
||||
- data: {}
|
||||
target:
|
||||
@ -2064,10 +2062,12 @@
|
||||
- script.tony_desktop_displays_on
|
||||
data: {}
|
||||
action: script.turn_on
|
||||
enabled: false
|
||||
- target:
|
||||
entity_id: media_player.basement_tv
|
||||
data: {}
|
||||
action: media_player.turn_on
|
||||
enabled: false
|
||||
mode: restart
|
||||
- id: '1696286540644'
|
||||
alias: Basement Lights Adaptive Resync
|
||||
@ -3015,18 +3015,21 @@
|
||||
- id: '1696556688808'
|
||||
alias: Rain Window Warning
|
||||
description: Warn when it starts raining and a window is open
|
||||
trigger:
|
||||
- platform: state
|
||||
entity_id: binary_sensor.raining
|
||||
from: 'off'
|
||||
to: 'on'
|
||||
alias: Rain starts
|
||||
condition:
|
||||
triggers:
|
||||
- alias: Rain starts
|
||||
entity_id:
|
||||
- sensor.home_tempest_precipitation_type
|
||||
from: none
|
||||
not_to:
|
||||
- unavailable
|
||||
- unknown
|
||||
trigger: state
|
||||
conditions:
|
||||
- condition: state
|
||||
entity_id: binary_sensor.windows
|
||||
state: 'on'
|
||||
alias: Windows are open
|
||||
action:
|
||||
actions:
|
||||
- variables:
|
||||
porch: "{% set windows = states('sensor.windows_open') | int %} {% set front
|
||||
= states('sensor.front_windows_open') | int %} {% if windows == front %}\n
|
||||
@ -3037,36 +3040,36 @@
|
||||
house. Please close them!\n{% endif %}\n"
|
||||
alias: Define variables
|
||||
- parallel:
|
||||
- service: script.text_notify
|
||||
data:
|
||||
- data:
|
||||
type: alert
|
||||
who: all
|
||||
title: WINDOWS ARE OPEN!
|
||||
message: '{{ message }}'
|
||||
tag: rain-window-warning
|
||||
alias: Send text notification
|
||||
- service: script.speech_engine
|
||||
data:
|
||||
action: script.text_notify
|
||||
- data:
|
||||
who: everywhere
|
||||
type: weather
|
||||
message: '{{ message }}'
|
||||
alias: TTS notification
|
||||
- service: script.living_room_lights_alert
|
||||
data:
|
||||
action: script.speech_engine
|
||||
- data:
|
||||
type: blue
|
||||
duration: 10
|
||||
alias: Light alert in living room
|
||||
action: script.living_room_lights_alert
|
||||
- if:
|
||||
- condition: state
|
||||
entity_id: binary_sensor.basement_occupied
|
||||
state: 'on'
|
||||
alias: Basement is occupied
|
||||
then:
|
||||
- service: script.basement_lights_alert
|
||||
data:
|
||||
- data:
|
||||
type: blue
|
||||
duration: 10
|
||||
alias: Light alert in basement
|
||||
action: script.basement_lights_alert
|
||||
alias: Light alert in basement, if occupied
|
||||
alias: Send the various alerts
|
||||
- wait_template: '{{ is_state(''binary_sensor.windows'',''off'') or is_state(''binary_sensor.raining'',''off'')
|
||||
@ -3081,46 +3084,46 @@
|
||||
}}'
|
||||
alias: Windows closed and still raining
|
||||
sequence:
|
||||
- service: script.text_notify
|
||||
data:
|
||||
- data:
|
||||
type: alert
|
||||
who: all
|
||||
message: clear_notification
|
||||
tag: rain-window-warning
|
||||
alias: Clear text notification
|
||||
- service: script.speech_engine
|
||||
data:
|
||||
action: script.text_notify
|
||||
- data:
|
||||
who: common
|
||||
type: weather
|
||||
message: Windows are now closed. Thank you, and enjoy your dry house.
|
||||
alias: TTS notification
|
||||
action: script.speech_engine
|
||||
- conditions:
|
||||
- condition: template
|
||||
value_template: '{{ is_state(''binary_sensor.raining'',''off'') }}'
|
||||
alias: Stopped raining
|
||||
sequence:
|
||||
- service: script.text_notify
|
||||
data:
|
||||
- data:
|
||||
type: alert
|
||||
who: all
|
||||
message: clear_notification
|
||||
tag: rain-window-warning
|
||||
alias: Clear text notification
|
||||
- service: script.speech_engine
|
||||
data:
|
||||
action: script.text_notify
|
||||
- data:
|
||||
who: common
|
||||
type: weather
|
||||
message: Nevermind, it has stopped raining. Feel free to do whatever you'd
|
||||
like with the windows.
|
||||
alias: TTS notification
|
||||
action: script.speech_engine
|
||||
default:
|
||||
- service: script.speech_engine
|
||||
data:
|
||||
- data:
|
||||
who: common
|
||||
type: weather
|
||||
message: Well, I guess no one cares if the house floods. Suit yourself, but
|
||||
do not say I didn't warn you.
|
||||
alias: TTS notification
|
||||
action: script.speech_engine
|
||||
alias: After wait completed
|
||||
mode: single
|
||||
- id: '1696884613752'
|
||||
@ -6173,3 +6176,116 @@
|
||||
- input_boolean.tina_night_meds_taken
|
||||
alias: Reset Tina meds taken switches
|
||||
mode: restart
|
||||
- id: '1747130058536'
|
||||
alias: Shower Mode Auto Off
|
||||
description: Kallen keeps leaving shower mode on, so I'm fixing that
|
||||
triggers:
|
||||
- trigger: state
|
||||
entity_id:
|
||||
- input_boolean.shower_mode
|
||||
from: 'off'
|
||||
to: 'on'
|
||||
id: shower-on
|
||||
alias: Shower Mode On
|
||||
- trigger: event
|
||||
event_type: timer.finished
|
||||
event_data:
|
||||
entity_id: timer.shower_mode_auto_off
|
||||
id: timer-finished
|
||||
alias: Timer Finished
|
||||
conditions: []
|
||||
actions:
|
||||
- choose:
|
||||
- conditions:
|
||||
- condition: trigger
|
||||
id:
|
||||
- shower-on
|
||||
alias: Shower On
|
||||
sequence:
|
||||
- alias: Start timer
|
||||
action: timer.start
|
||||
metadata: {}
|
||||
data: {}
|
||||
target:
|
||||
entity_id: timer.shower_mode_auto_off
|
||||
- conditions:
|
||||
- condition: trigger
|
||||
id:
|
||||
- timer-finished
|
||||
alias: Timer Finished
|
||||
sequence:
|
||||
- alias: Turn off shower mode
|
||||
action: input_boolean.turn_off
|
||||
metadata: {}
|
||||
data: {}
|
||||
target:
|
||||
entity_id: input_boolean.shower_mode
|
||||
alias: Routing
|
||||
mode: restart
|
||||
- id: '1747986913670'
|
||||
alias: School Status Notifications
|
||||
description: Sends alert notifications to all phones when school is placed under
|
||||
a two hour delay or cancelled for the day
|
||||
triggers:
|
||||
- trigger: state
|
||||
entity_id:
|
||||
- input_boolean.two_hour_delay
|
||||
from: 'off'
|
||||
to: 'on'
|
||||
id: delay
|
||||
alias: Two Hour Delay
|
||||
- trigger: state
|
||||
entity_id:
|
||||
- input_boolean.school_cancelled
|
||||
from: 'off'
|
||||
to: 'on'
|
||||
id: cancel
|
||||
alias: Cancelled
|
||||
conditions: []
|
||||
actions:
|
||||
- choose:
|
||||
- conditions:
|
||||
- condition: trigger
|
||||
id:
|
||||
- delay
|
||||
alias: Two Hour Delay
|
||||
sequence:
|
||||
- alias: Send Notification
|
||||
action: script.text_notify
|
||||
metadata: {}
|
||||
data:
|
||||
type: alert
|
||||
title: School Alert
|
||||
message: Defiance City Schools is under a two hour delay!
|
||||
tag: two-hour-delay
|
||||
who: all
|
||||
- conditions:
|
||||
- condition: trigger
|
||||
id:
|
||||
- cancel
|
||||
alias: Cancelled
|
||||
sequence:
|
||||
- action: script.text_notify
|
||||
metadata: {}
|
||||
data:
|
||||
type: alert
|
||||
who: all
|
||||
message: clear_notification
|
||||
tag: two-hour-delay
|
||||
alias: Clear previous delay notification
|
||||
- delay:
|
||||
hours: 0
|
||||
minutes: 0
|
||||
seconds: 2
|
||||
milliseconds: 0
|
||||
- alias: Send Notification
|
||||
action: script.text_notify
|
||||
metadata: {}
|
||||
data:
|
||||
type: alert
|
||||
title: School Alert
|
||||
message: Defiance City Schools has closed for today!
|
||||
tag: school-cancelled
|
||||
who: all
|
||||
alias: Routing
|
||||
mode: restart
|
||||
|
File diff suppressed because it is too large
Load Diff
@ -1,7 +1,7 @@
|
||||
blueprint:
|
||||
name: Smart Lux Dimmer
|
||||
author: AntonH
|
||||
description: 'Version 4.1
|
||||
description: 'Version 4.3
|
||||
|
||||
Switch or dim lights based on the value of a light sensor.
|
||||
|
||||
@ -24,7 +24,8 @@ blueprint:
|
||||
value?
|
||||
selector:
|
||||
entity:
|
||||
domain:
|
||||
filter:
|
||||
- domain:
|
||||
- sensor
|
||||
device_class:
|
||||
- illuminance
|
||||
@ -81,8 +82,8 @@ blueprint:
|
||||
min: 0.0
|
||||
max: 100.0
|
||||
step: 1.0
|
||||
mode: slider
|
||||
unit_of_measurement: '%'
|
||||
mode: slider
|
||||
light_value_2:
|
||||
name: Brightness at minimum light level
|
||||
description: Brightness of the light at minimum ambient light.
|
||||
@ -92,8 +93,8 @@ blueprint:
|
||||
min: 0.0
|
||||
max: 100.0
|
||||
step: 1.0
|
||||
mode: slider
|
||||
unit_of_measurement: '%'
|
||||
mode: slider
|
||||
transition_time:
|
||||
name: Transition time
|
||||
description: 'The time it takes for the light to transition from the set value
|
||||
@ -124,9 +125,9 @@ blueprint:
|
||||
value: include_color
|
||||
- label: Set temperature
|
||||
value: include_temp
|
||||
multiple: false
|
||||
sort: false
|
||||
custom_value: false
|
||||
sort: false
|
||||
multiple: false
|
||||
light_color:
|
||||
name: Light color
|
||||
description: Color of the light when between minimum and maximum ambient light
|
||||
@ -161,8 +162,8 @@ blueprint:
|
||||
min: 0.0
|
||||
max: 100.0
|
||||
step: 1.0
|
||||
mode: slider
|
||||
unit_of_measurement: '%'
|
||||
mode: slider
|
||||
light_brightness_under_min:
|
||||
name: Brightness when ambient light value under min.
|
||||
description: Brightness of the light when the ambient light is lower than the
|
||||
@ -173,8 +174,8 @@ blueprint:
|
||||
min: 0.0
|
||||
max: 100.0
|
||||
step: 1.0
|
||||
mode: slider
|
||||
unit_of_measurement: '%'
|
||||
mode: slider
|
||||
include_color_or_temp_over_under:
|
||||
name: Include color or temperature values when outside range
|
||||
description: 'Set a color or temperature value for the light when over maximum
|
||||
@ -193,9 +194,9 @@ blueprint:
|
||||
value: include_color_outside_range
|
||||
- label: Set temperature when outside range
|
||||
value: include_temp_outside_range
|
||||
multiple: false
|
||||
sort: false
|
||||
custom_value: false
|
||||
sort: false
|
||||
multiple: false
|
||||
light_color_over_max:
|
||||
name: Color when ambient light value over max.
|
||||
description: Color of the light when the ambient light is higher than the set
|
||||
@ -236,18 +237,25 @@ variables:
|
||||
include_brightness_over_under: !input include_brightness_over_under
|
||||
include_color_or_temp_over_under: !input include_color_or_temp_over_under
|
||||
light_sensor: !input light_sensor_entity
|
||||
maxB: !input max_brightness_value
|
||||
minB: !input min_brightness_value
|
||||
light1: !input light_value_1
|
||||
light2: !input light_value_2
|
||||
max_brightness_value: !input max_brightness_value
|
||||
min_brightness_value: !input min_brightness_value
|
||||
maxB: '{{ max_brightness_value * 2.55 }}'
|
||||
minB: '{{ min_brightness_value * 2.55 }}'
|
||||
light_value_1: !input light_value_1
|
||||
light_value_2: !input light_value_2
|
||||
light1: '{{ light_value_1 * 2.55 }}'
|
||||
light2: '{{ light_value_2 * 2.55 }}'
|
||||
slope: '{{ ( light1 - light2 ) / ( maxB - minB ) }}'
|
||||
constant: '{{ light1 - ( slope * maxB ) }}'
|
||||
trigger:
|
||||
platform: state
|
||||
light_brightness_over_max: !input light_brightness_over_max
|
||||
light_brightness_under_min: !input light_brightness_under_min
|
||||
brightness_over_max_pct: '{{ light_brightness_over_max * 2.55 }}'
|
||||
brightness_under_min_pct: '{{ light_brightness_under_min * 2.55 }}'
|
||||
triggers:
|
||||
trigger: state
|
||||
entity_id: !input light_sensor_entity
|
||||
condition:
|
||||
- condition: !input run_conditions
|
||||
action:
|
||||
conditions: !input run_conditions
|
||||
actions:
|
||||
- choose:
|
||||
- conditions:
|
||||
- condition: template
|
||||
@ -258,20 +266,20 @@ action:
|
||||
- condition: template
|
||||
value_template: '{{ include_color_or_temp == "include_no_color_temp" }}'
|
||||
sequence:
|
||||
- service: light.turn_on
|
||||
- action: light.turn_on
|
||||
data:
|
||||
transition: !input transition_time
|
||||
brightness_pct: '{{ (( slope * states(light_sensor)|int ) + constant)|round
|
||||
brightness: '{{ (( slope * states(light_sensor)|int ) + constant)|round
|
||||
}}'
|
||||
target: !input target_light
|
||||
- conditions:
|
||||
- condition: template
|
||||
value_template: '{{ include_color_or_temp == "include_color" }}'
|
||||
sequence:
|
||||
- service: light.turn_on
|
||||
- action: light.turn_on
|
||||
data:
|
||||
transition: !input transition_time
|
||||
brightness_pct: '{{ (( slope * states(light_sensor)|int ) + constant)|round
|
||||
brightness: '{{ (( slope * states(light_sensor)|int ) + constant)|round
|
||||
}}'
|
||||
rgb_color: !input light_color
|
||||
target: !input target_light
|
||||
@ -279,10 +287,10 @@ action:
|
||||
- condition: template
|
||||
value_template: '{{ include_color_or_temp == "include_temp" }}'
|
||||
sequence:
|
||||
- service: light.turn_on
|
||||
- action: light.turn_on
|
||||
data:
|
||||
transition: !input transition_time
|
||||
brightness_pct: '{{ (( slope * states(light_sensor)|int ) + constant)|round
|
||||
brightness: '{{ (( slope * states(light_sensor)|int ) + constant)|round
|
||||
}}'
|
||||
color_temp: !input light_temp
|
||||
target: !input target_light
|
||||
@ -302,20 +310,20 @@ action:
|
||||
entity_id: !input light_sensor_entity
|
||||
above: !input max_brightness_value
|
||||
sequence:
|
||||
- service: light.turn_on
|
||||
- action: light.turn_on
|
||||
data:
|
||||
transition: !input transition_time
|
||||
brightness_pct: !input light_brightness_over_max
|
||||
brightness: '{{ brightness_over_max_pct }}'
|
||||
target: !input target_light
|
||||
- conditions:
|
||||
- condition: numeric_state
|
||||
entity_id: !input light_sensor_entity
|
||||
below: !input min_brightness_value
|
||||
sequence:
|
||||
- service: light.turn_on
|
||||
- action: light.turn_on
|
||||
data:
|
||||
transition: !input transition_time
|
||||
brightness_pct: !input light_brightness_under_min
|
||||
brightness: '{{ brightness_under_min_pct }}'
|
||||
target: !input target_light
|
||||
- conditions:
|
||||
- condition: numeric_state
|
||||
@ -323,10 +331,10 @@ action:
|
||||
below: !input max_brightness_value
|
||||
above: !input min_brightness_value
|
||||
sequence:
|
||||
- service: light.turn_on
|
||||
- action: light.turn_on
|
||||
data:
|
||||
transition: !input transition_time
|
||||
brightness_pct: '{{ (( slope * states(light_sensor)|int ) + constant)|round
|
||||
brightness: '{{ (( slope * states(light_sensor)|int ) + constant)|round
|
||||
}}'
|
||||
target: !input target_light
|
||||
- conditions:
|
||||
@ -340,10 +348,10 @@ action:
|
||||
entity_id: !input light_sensor_entity
|
||||
above: !input max_brightness_value
|
||||
sequence:
|
||||
- service: light.turn_on
|
||||
- action: light.turn_on
|
||||
data:
|
||||
transition: !input transition_time
|
||||
brightness_pct: !input light_brightness_over_max
|
||||
brightness: '{{ brightness_over_max_pct }}'
|
||||
rgb_color: !input light_color_over_max
|
||||
target: !input target_light
|
||||
- conditions:
|
||||
@ -351,10 +359,10 @@ action:
|
||||
entity_id: !input light_sensor_entity
|
||||
below: !input min_brightness_value
|
||||
sequence:
|
||||
- service: light.turn_on
|
||||
- action: light.turn_on
|
||||
data:
|
||||
transition: !input transition_time
|
||||
brightness_pct: !input light_brightness_under_min
|
||||
brightness: '{{ brightness_under_min_pct }}'
|
||||
rgb_color: !input light_color_under_min
|
||||
target: !input target_light
|
||||
- conditions:
|
||||
@ -363,10 +371,10 @@ action:
|
||||
below: !input max_brightness_value
|
||||
above: !input min_brightness_value
|
||||
sequence:
|
||||
- service: light.turn_on
|
||||
- action: light.turn_on
|
||||
data:
|
||||
transition: !input transition_time
|
||||
brightness_pct: '{{ (( slope * states(light_sensor)|int ) + constant)|round
|
||||
brightness: '{{ (( slope * states(light_sensor)|int ) + constant)|round
|
||||
}}'
|
||||
rgb_color: !input light_color
|
||||
target: !input target_light
|
||||
@ -381,10 +389,10 @@ action:
|
||||
entity_id: !input light_sensor_entity
|
||||
above: !input max_brightness_value
|
||||
sequence:
|
||||
- service: light.turn_on
|
||||
- action: light.turn_on
|
||||
data:
|
||||
transition: !input transition_time
|
||||
brightness_pct: !input light_brightness_over_max
|
||||
brightness: '{{ brightness_over_max_pct }}'
|
||||
color_temp: !input light_temp_over_max
|
||||
target: !input target_light
|
||||
- conditions:
|
||||
@ -392,10 +400,10 @@ action:
|
||||
entity_id: !input light_sensor_entity
|
||||
below: !input min_brightness_value
|
||||
sequence:
|
||||
- service: light.turn_on
|
||||
- action: light.turn_on
|
||||
data:
|
||||
transition: !input transition_time
|
||||
brightness_pct: !input light_brightness_under_min
|
||||
brightness: '{{ brightness_under_min_pct }}'
|
||||
color_temp: !input light_temp_under_min
|
||||
target: !input target_light
|
||||
- conditions:
|
||||
@ -404,10 +412,10 @@ action:
|
||||
below: !input max_brightness_value
|
||||
above: !input min_brightness_value
|
||||
sequence:
|
||||
- service: light.turn_on
|
||||
- action: light.turn_on
|
||||
data:
|
||||
transition: !input transition_time
|
||||
brightness_pct: '{{ (( slope * states(light_sensor)|int ) + constant)|round
|
||||
brightness: '{{ (( slope * states(light_sensor)|int ) + constant)|round
|
||||
}}'
|
||||
color_temp: !input light_temp
|
||||
target: !input target_light
|
||||
|
@ -31,9 +31,12 @@ blueprint:
|
||||
text: {}
|
||||
light_sensor_entity:
|
||||
name: Light Sensor
|
||||
description: Which light sensor do you want to use to measure the ambient light
|
||||
value?
|
||||
selector:
|
||||
entity:
|
||||
domain:
|
||||
filter:
|
||||
- domain:
|
||||
- sensor
|
||||
device_class:
|
||||
- illuminance
|
||||
@ -94,15 +97,17 @@ variables:
|
||||
light_sensor: !input light_sensor_entity
|
||||
maxB: !input max_brightness_value
|
||||
minB: !input min_brightness_value
|
||||
light1: !input light_value_1
|
||||
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 ) }}'
|
||||
constant: '{{ light1 - ( slope * maxB ) }}'
|
||||
days: !input schedule_days
|
||||
trigger:
|
||||
platform: state
|
||||
triggers:
|
||||
trigger: state
|
||||
entity_id: !input light_sensor_entity
|
||||
condition:
|
||||
conditions:
|
||||
- condition: numeric_state
|
||||
entity_id: !input light_sensor_entity
|
||||
above: !input min_brightness_value
|
||||
@ -111,9 +116,9 @@ condition:
|
||||
before: !input schedule_stop
|
||||
- condition: template
|
||||
value_template: '{{ now().strftime(''%a'') | lower in days }}'
|
||||
action:
|
||||
- service: light.turn_on
|
||||
actions:
|
||||
- action: light.turn_on
|
||||
data:
|
||||
brightness_pct: "{% if states(light_sensor)|int > maxB %}\n 0\n{% else %}\n {{
|
||||
(( slope * states(light_sensor)|int ) + constant)|round }}\n{% endif %}\n"
|
||||
brightness: "{% if states(light_sensor)|int > maxB %}\n 0\n{% else %}\n {{ ((
|
||||
slope * states(light_sensor)|int ) + constant)|round }}\n{% endif %}\n"
|
||||
target: !input target_light
|
||||
|
@ -1,7 +1,7 @@
|
||||
blueprint:
|
||||
name: The Everything Light
|
||||
author: AntonH
|
||||
description: "**Version 2.5**\nThe Everything Light: select any trigger and turn
|
||||
description: "**Version 2.10**\nThe Everything Light: select any trigger and turn
|
||||
on your light in multiple ways:\n - just turn the light on in it's default state\n
|
||||
\ - 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
|
||||
@ -61,7 +61,7 @@ blueprint:
|
||||
temperature can be set.
|
||||
|
||||
|
||||
- **DYNAMIC MODE**
|
||||
- **DYNAMIC MODE:**
|
||||
|
||||
The light will be assigned a brightness value based on the value of a ambient
|
||||
light sensor, optionally color or temperature can be set.
|
||||
@ -74,15 +74,15 @@ blueprint:
|
||||
options:
|
||||
- label: DEFAULT MODE
|
||||
value: default
|
||||
- label: TOGGLE
|
||||
- label: TOGGLE MODE
|
||||
value: toggle
|
||||
- label: FIXED MODE
|
||||
value: fixed
|
||||
- label: DYNAMIC MODE
|
||||
value: dynamic
|
||||
multiple: false
|
||||
sort: false
|
||||
custom_value: false
|
||||
sort: false
|
||||
multiple: false
|
||||
transition_time:
|
||||
name: Transition time (FIXED & DYNAMIC MODE)
|
||||
description: "The time it takes for the light to transition to the assigned
|
||||
@ -110,9 +110,9 @@ blueprint:
|
||||
value: include_color
|
||||
- label: Set temperature
|
||||
value: include_temperature
|
||||
multiple: false
|
||||
sort: false
|
||||
custom_value: false
|
||||
sort: false
|
||||
multiple: false
|
||||
light_color:
|
||||
name: Light color (FIXED & DYNAMIC MODE)
|
||||
description: Color of the light when between minimum and maximum ambient light
|
||||
@ -125,22 +125,28 @@ blueprint:
|
||||
color_rgb: {}
|
||||
light_temperature:
|
||||
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.
|
||||
|
||||
(not all lights will support all values, please consult your lights spec sheet.)
|
||||
|
||||
'
|
||||
default: 2000
|
||||
selector:
|
||||
color_temp: {}
|
||||
color_temp:
|
||||
unit: kelvin
|
||||
min: 1500
|
||||
max: 6500
|
||||
brightness:
|
||||
name: Brightness (FIXED BRIGHTNESS MODE)
|
||||
description: Set the brightness value the light needs to turn on at
|
||||
default: 0
|
||||
default: 100
|
||||
selector:
|
||||
number:
|
||||
min: 0.0
|
||||
max: 100.0
|
||||
step: 1.0
|
||||
mode: slider
|
||||
unit_of_measurement: '%'
|
||||
light_sensor_entity:
|
||||
name: Light Sensor (DYNAMIC MODE)
|
||||
description: Which light sensor do you want to use to measure the ambient light
|
||||
@ -188,7 +194,6 @@ blueprint:
|
||||
max: 100.0
|
||||
step: 1.0
|
||||
mode: slider
|
||||
unit_of_measurement: '%'
|
||||
light_value_2:
|
||||
name: Brightness at minimum light level (DYNAMIC MODE)
|
||||
description: Brightness of the light at minimum ambient light.
|
||||
@ -199,7 +204,6 @@ blueprint:
|
||||
max: 100.0
|
||||
step: 1.0
|
||||
mode: slider
|
||||
unit_of_measurement: '%'
|
||||
light_brightness_over_max:
|
||||
name: Brightness when ambient light value over max (DYNAMIC MODE)
|
||||
description: Brightness of the light when the ambient light is higher than the
|
||||
@ -211,19 +215,17 @@ blueprint:
|
||||
max: 100.0
|
||||
step: 1.0
|
||||
mode: slider
|
||||
unit_of_measurement: '%'
|
||||
light_brightness_under_min:
|
||||
name: Brightness when ambient light value under min (DYNAMIC MODE)
|
||||
description: Brightness of the light when the ambient light is lower than the
|
||||
set minimum value.
|
||||
default: 100
|
||||
default: 255
|
||||
selector:
|
||||
number:
|
||||
min: 0.0
|
||||
max: 100.0
|
||||
step: 1.0
|
||||
mode: slider
|
||||
unit_of_measurement: '%'
|
||||
include_color_or_temp_over_under:
|
||||
name: Include color or temperature values when outside range (DYNAMIC MODE)
|
||||
description: 'Set a color or temperature value for the light when over maximum
|
||||
@ -242,9 +244,9 @@ blueprint:
|
||||
value: include_color_outside_range
|
||||
- label: Set temperature when outside range
|
||||
value: include_temp_outside_range
|
||||
multiple: false
|
||||
sort: false
|
||||
custom_value: false
|
||||
sort: false
|
||||
multiple: false
|
||||
light_color_over_max:
|
||||
name: Color when ambient light value over max (DYNAMIC MODE)
|
||||
description: Color of the light when the ambient light is higher than the set
|
||||
@ -267,18 +269,32 @@ blueprint:
|
||||
color_rgb: {}
|
||||
light_temp_over_max:
|
||||
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.
|
||||
|
||||
(not all lights will support all values, please consult your lights spec sheet.)
|
||||
|
||||
'
|
||||
default: 2000
|
||||
selector:
|
||||
color_temp: {}
|
||||
color_temp:
|
||||
unit: kelvin
|
||||
min: 1500
|
||||
max: 6500
|
||||
light_temp_under_min:
|
||||
name: Temperature when ambient light value under min (DYNAMIC MODE)
|
||||
description: Temperature of the light when the ambient light is lower than the
|
||||
set minimum value.
|
||||
description: 'Temperature of the light when the ambient light is lower than
|
||||
the set minimum value.
|
||||
|
||||
(not all lights will support all values, please consult your lights spec sheet.)
|
||||
|
||||
'
|
||||
default: 2000
|
||||
selector:
|
||||
color_temp: {}
|
||||
color_temp:
|
||||
unit: kelvin
|
||||
min: 1500
|
||||
max: 6500
|
||||
include_turn_off:
|
||||
name: Include light turn off function
|
||||
description: 'Select if the light needs to turn back off again and how you want
|
||||
@ -307,8 +323,8 @@ blueprint:
|
||||
value: trigger
|
||||
- label: Staircase function
|
||||
value: staircase
|
||||
sort: false
|
||||
custom_value: false
|
||||
sort: false
|
||||
turn_off_triggers:
|
||||
name: Turn off triggers
|
||||
description: Triggers that turn the light off
|
||||
@ -343,71 +359,75 @@ variables:
|
||||
include_color_or_temp: !input include_color_or_temp
|
||||
light_color: !input light_color
|
||||
light_temperature: !input light_temperature
|
||||
light_brightness: !input brightness
|
||||
brightness: !input brightness
|
||||
light_brightness: '{{ brightness * 2.55 }}'
|
||||
light_sensor: !input light_sensor_entity
|
||||
maxB: !input max_brightness_value
|
||||
minB: !input min_brightness_value
|
||||
light1: !input light_value_1
|
||||
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 ) }}'
|
||||
constant: '{{ light1 - ( slope * maxB ) }}'
|
||||
dynamic_brightness_pct: "{% if mode == \"dynamic\" %}\n {{ (( slope * states(light_sensor)|int
|
||||
dynamic_brightness: "{% if mode == \"dynamic\" %}\n {{ (( slope * states(light_sensor)|int
|
||||
) + constant)|round }}\n{% else %}\n 0\n{% endif %}\n"
|
||||
include_color_or_temp_over_under: !input include_color_or_temp_over_under
|
||||
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_temp_over_max: !input light_temp_over_max
|
||||
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_temp_under_min: !input light_temp_under_min
|
||||
include_turn_off: !input include_turn_off
|
||||
trigger: !input triggers
|
||||
condition:
|
||||
- condition: !input run_conditions
|
||||
action:
|
||||
conditions: !input run_conditions
|
||||
actions:
|
||||
- choose:
|
||||
- conditions: '{{ mode == "toggle" }}'
|
||||
sequence:
|
||||
- service: homeassistant.toggle
|
||||
- action: homeassistant.toggle
|
||||
target: !input target_light
|
||||
- conditions: '{{ mode == "default" }}'
|
||||
sequence:
|
||||
- service: homeassistant.turn_on
|
||||
- action: homeassistant.turn_on
|
||||
target: !input target_light
|
||||
- conditions: '{{ mode == "fixed" }}'
|
||||
sequence:
|
||||
- service: light.turn_on
|
||||
- action: light.turn_on
|
||||
data: "{% if include_color_or_temp == \"include_color\" %}\n {{ { \"transition\":
|
||||
transition_time, \"brightness_pct\": light_brightness, \"rgb_color\": light_color
|
||||
transition_time, \"brightness\": light_brightness, \"rgb_color\": light_color
|
||||
} }}\n{% elif include_color_or_temp == \"include_temperature\" %}\n {{ {
|
||||
\"transition\": transition_time, \"brightness_pct\": light_brightness, \"color_temp\":
|
||||
\"transition\": transition_time, \"brightness\": light_brightness, \"color_temp\":
|
||||
light_temperature } }}\n{% else %}\n {{ { \"transition\": transition_time,
|
||||
\"brightness_pct\": light_brightness } }}\n{% endif %}\n"
|
||||
\"brightness\": light_brightness } }}\n{% endif %}\n"
|
||||
target: !input target_light
|
||||
- conditions: '{{ mode == "dynamic" }}'
|
||||
sequence:
|
||||
- service: light.turn_on
|
||||
- action: light.turn_on
|
||||
data: "{% if states(light_sensor)|int > maxB %}\n {% if include_color_or_temp_over_under
|
||||
== \"include_color_outside_range\" %}\n {{ { \"transition\": transition_time,
|
||||
\"brightness_pct\": light_brightness_over_max, \"rgb_color\": light_color_over_max
|
||||
\"brightness\": brightness_over_max_pct, \"rgb_color\": light_color_over_max
|
||||
} }}\n {% elif include_color_or_temp_over_under == \"include_temp_outside_range\"
|
||||
%}\n {{ { \"transition\": transition_time, \"brightness_pct\": light_brightness_over_max,
|
||||
%}\n {{ { \"transition\": transition_time, \"brightness\": brightness_over_max_pct,
|
||||
\"color_temp\": light_temp_over_max } }}\n {% else %}\n {{ { \"transition\":
|
||||
transition_time, \"brightness_pct\": light_brightness_over_max } }}\n {%
|
||||
endif %}\n{% elif states(light_sensor)|int < minB %}\n {% if include_color_or_temp_over_under
|
||||
transition_time, \"brightness\": brightness_over_max_pct } }}\n {% endif
|
||||
%}\n{% elif states(light_sensor)|int < minB %}\n {% if include_color_or_temp_over_under
|
||||
== \"include_color_outside_range\" %}\n {{ { \"transition\": transition_time,
|
||||
\"brightness_pct\": light_brightness_under_min, \"rgb_color\": light_color_under_min
|
||||
\"brightness\": brightness_under_min_pct, \"rgb_color\": light_color_under_min
|
||||
} }}\n {% elif include_color_or_temp_over_under == \"include_temp_outside_range\"
|
||||
%}\n {{ { \"transition\": transition_time, \"brightness_pct\": light_brightness_under_min,
|
||||
%}\n {{ { \"transition\": transition_time, \"brightness\": brightness_under_min_pct,
|
||||
\"color_temp\": light_temp_under_min } }}\n {% else %}\n {{ { \"transition\":
|
||||
transition_time, \"brightness_pct\": light_brightness_under_min } }}\n {%
|
||||
endif %}\n{% else %}\n {% if include_color_or_temp == \"include_color\" %}\n
|
||||
\ {{ { \"transition\": transition_time, \"brightness_pct\": light_brightness,
|
||||
\"rgb_color\": light_color } }}\n {% elif include_color_or_temp == \"include_temperature\"
|
||||
%}\n {{ { \"transition\": transition_time, \"brightness_pct\": dynamic_brightness_pct,
|
||||
transition_time, \"brightness\": brightness_under_min_pct } }}\n {% endif
|
||||
%}\n{% else %}\n {% if include_color_or_temp == \"include_color\" %}\n {{
|
||||
{ \"transition\": transition_time, \"brightness\": light_brightness, \"rgb_color\":
|
||||
light_color } }}\n {% elif include_color_or_temp == \"include_temperature\"
|
||||
%}\n {{ { \"transition\": transition_time, \"brightness\": dynamic_brightness,
|
||||
\"color_temp\": light_temperature } }}\n {% else %}\n {{ { \"transition\":
|
||||
transition_time, \"brightness_pct\": dynamic_brightness_pct } }}\n {% endif
|
||||
%}\n{% endif %}\n"
|
||||
transition_time, \"brightness\": dynamic_brightness } }}\n {% endif %}\n{%
|
||||
endif %}\n"
|
||||
target: !input target_light
|
||||
- if: !input turn_off_conditions
|
||||
then:
|
||||
@ -420,11 +440,11 @@ action:
|
||||
timeout: !input staircase_duration
|
||||
else:
|
||||
- delay: !input staircase_duration
|
||||
- service: homeassistant.turn_off
|
||||
- action: homeassistant.turn_off
|
||||
target: !input target_light
|
||||
- conditions: '{{ "trigger" in include_turn_off and not "staircase" in include_turn_off
|
||||
}}'
|
||||
sequence:
|
||||
- wait_for_trigger: !input turn_off_triggers
|
||||
- service: homeassistant.turn_off
|
||||
- action: homeassistant.turn_off
|
||||
target: !input target_light
|
||||
|
@ -10,6 +10,7 @@ blueprint:
|
||||
selector:
|
||||
entity:
|
||||
integration: cast
|
||||
multiple: false
|
||||
view:
|
||||
name: Lovelace view path
|
||||
description: Path of the view to cast. A path has to be defined in your Lovelace
|
||||
@ -21,11 +22,11 @@ blueprint:
|
||||
source_url: https://community.home-assistant.io/t/cast-and-re-cast-a-lovelace-view-to-a-google-hub/259631
|
||||
trigger:
|
||||
- platform: state
|
||||
entity_id: !input 'player'
|
||||
entity_id: !input player
|
||||
to: 'off'
|
||||
for: 00:00:20
|
||||
- platform: state
|
||||
entity_id: !input 'player'
|
||||
entity_id: !input player
|
||||
to: paused
|
||||
for: 00:00:20
|
||||
- platform: time_pattern
|
||||
@ -38,38 +39,38 @@ action:
|
||||
- condition: or
|
||||
conditions:
|
||||
- condition: state
|
||||
entity_id: !input 'player'
|
||||
entity_id: !input player
|
||||
state: 'off'
|
||||
- condition: state
|
||||
entity_id: !input 'player'
|
||||
entity_id: !input player
|
||||
state: paused
|
||||
for: 00:00:20
|
||||
sequence:
|
||||
- service: media_player.volume_mute
|
||||
data:
|
||||
is_volume_muted: true
|
||||
entity_id: !input 'player'
|
||||
entity_id: !input player
|
||||
- service: media_player.turn_off
|
||||
data:
|
||||
entity_id: !input 'player'
|
||||
entity_id: !input player
|
||||
- delay:
|
||||
seconds: 2
|
||||
- service: media_player.turn_on
|
||||
data:
|
||||
entity_id: !input 'player'
|
||||
entity_id: !input player
|
||||
- service: cast.show_lovelace_view
|
||||
data:
|
||||
view_path: !input 'view'
|
||||
dashboard_path: !input 'dashboard'
|
||||
entity_id: !input 'player'
|
||||
view_path: !input view
|
||||
dashboard_path: !input dashboard
|
||||
entity_id: !input player
|
||||
- service: cast.show_lovelace_view
|
||||
data:
|
||||
view_path: !input 'view'
|
||||
dashboard_path: !input 'dashboard'
|
||||
entity_id: !input 'player'
|
||||
view_path: !input view
|
||||
dashboard_path: !input dashboard
|
||||
entity_id: !input player
|
||||
- delay:
|
||||
seconds: 10
|
||||
- service: media_player.volume_mute
|
||||
data:
|
||||
is_volume_muted: false
|
||||
entity_id: !input 'player'
|
||||
entity_id: !input player
|
||||
|
@ -116,6 +116,7 @@ recorder:
|
||||
- sensor.portainer*
|
||||
- sensor.mosquitto*
|
||||
- sensor.*_rssi
|
||||
- sensor.weatherflow_hub*
|
||||
entities:
|
||||
- sensor.avg_ping
|
||||
- sensor.max_ping
|
||||
@ -130,6 +131,8 @@ recorder:
|
||||
- sensor.mariadb_database_size
|
||||
- sensor.random_joke
|
||||
- sensor.bypassed_sensors
|
||||
- sensor.home_tempest_signal_strength
|
||||
- sensor.home_tempest_uptime
|
||||
include:
|
||||
entities:
|
||||
- media_player.living_room_tv
|
||||
@ -175,6 +178,8 @@ influxdb:
|
||||
entity_globs:
|
||||
- binary_sensor.*tamper*
|
||||
- light.*screen*
|
||||
- sensor.weatherflow_hub*
|
||||
- sensor.home_tempest*
|
||||
entities:
|
||||
- sensor.last_boot
|
||||
- sensor.date
|
||||
@ -187,6 +192,8 @@ influxdb:
|
||||
- light.all_lights
|
||||
- fan.all_fans
|
||||
- sensor.random_joke
|
||||
- sensor.home_tempest_signal_strength
|
||||
- sensor.home_tempest_uptime
|
||||
include:
|
||||
domains:
|
||||
- sun
|
||||
@ -356,6 +363,8 @@ prometheus:
|
||||
exclude_entity_globs:
|
||||
- binary_sensor.*tamper*
|
||||
- light.*screen*
|
||||
- sensor.weatherflow_hub*
|
||||
- sensor.home_tempest*
|
||||
exclude_entities:
|
||||
- sensor.last_boot
|
||||
- sensor.date
|
||||
@ -368,6 +377,8 @@ prometheus:
|
||||
- light.all_lights
|
||||
- fan.all_fans
|
||||
- sensor.random_joke
|
||||
- sensor.home_tempest_signal_strength
|
||||
- sensor.home_tempest_uptime
|
||||
include_domains:
|
||||
- sun
|
||||
- light
|
||||
|
@ -825,7 +825,21 @@
|
||||
'ottobre',
|
||||
'novembre',
|
||||
'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':{
|
||||
'_language': 'Português',
|
||||
@ -1041,7 +1055,21 @@
|
||||
'Październik',
|
||||
'Listopad',
|
||||
'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': 'Русский',
|
||||
@ -1779,9 +1807,9 @@
|
||||
{%- else %}
|
||||
{%- set t = translate('ago', language=language) %}
|
||||
{%- if '%s' in t %}
|
||||
{{ t % items }}
|
||||
{{- t % items }}
|
||||
{%- else %}
|
||||
{{- items }} {{ translate('ago', language=language) }}
|
||||
{{- items }} {{ t }}
|
||||
{%- endif %}
|
||||
{%- endif %}
|
||||
{%- else %}
|
||||
@ -2045,7 +2073,7 @@
|
||||
{%- if '%s' in t %}
|
||||
{{- t % ret }}
|
||||
{%- else %}
|
||||
{{- ret }} {{ translate('ago', language=language) }}
|
||||
{{- ret }} {{ t }}
|
||||
{%- endif %}
|
||||
{%- endif %}
|
||||
{%- endif %}
|
||||
|
@ -236,7 +236,7 @@
|
||||
'hour': ['ч', 'час', 'часа', 'часов'],
|
||||
'minute': ['м', 'минута', 'минуты', 'минут'],
|
||||
'second': ['с', 'секунда', 'секунды', 'секунд'],
|
||||
'millisecond': ['мс', 'милисекунда', 'милисекунды', 'милисекунд'],
|
||||
'millisecond': ['мс', 'миллисекунда', 'миллисекунды', 'миллисекунд'],
|
||||
'combine': 'и',
|
||||
'error': 'Неверная дата',
|
||||
}
|
||||
@ -337,6 +337,22 @@
|
||||
'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 #}
|
||||
|
@ -27,8 +27,15 @@
|
||||
{% set period_str = period_str(team) %}
|
||||
{% set game_clock = state_attr(team,'clock') | lower %}
|
||||
{% if state_attr(team,'league') == 'MLB' %}
|
||||
{% if 'rain delay' in game_clock %}
|
||||
{# Handle cases like "Rain Delay, Top 1st" #}
|
||||
{% set status, inning = game_clock.split(',', 1) %}
|
||||
{% set inning_parts = inning.split(' ') %}
|
||||
in a {{ status | trim }} in the {{ inning_parts[1] ~ ' of the ' ~ inning_parts[2] }} {{ period_str }}
|
||||
{% else %}
|
||||
{% set inning_parts = game_clock.split(' ') %}
|
||||
in the {{ inning_parts[0] ~ ' of the ' ~ inning_parts[1] ~ ' ' ~ period_str }}
|
||||
{% endif %}
|
||||
{% else %}
|
||||
{% if ' - ' in game_clock %}
|
||||
{% set clock_time, quarter = game_clock.split(' - ') %}
|
||||
|
@ -19,15 +19,15 @@
|
||||
{% if type in ['alerts','full'] %}
|
||||
{% if is_state('input_boolean.tornado_alarm','on') %}
|
||||
We are under a tornado warning. If you are not already in shelter, you should be. Get on it!
|
||||
{% 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!
|
||||
{% endif %}
|
||||
{% elif is_state('binary_sensor.severe_thunderstorm_warning','on') %}
|
||||
We are under a severe thunderstorm warning.
|
||||
{% if state_attr('binary_sensor.severe_thunderstorm_warning','tornado_possible' == true) %}
|
||||
{% if state_attr('binary_sensor.severe_thunderstorm_warning','tornado_possible') == true %}
|
||||
The incoming storm has the potential to produce a tornado, so please pay attention and prepare to take shelter!
|
||||
{% endif %}
|
||||
{% if state_attr('binary_sensor.severe_thunderstorm_warning','considerable_destructive' == true) %}
|
||||
{% if state_attr('binary_sensor.severe_thunderstorm_warning','considerable_destructive') == true %}
|
||||
This storm has the potential to cause considerable damage. Please take shelter and stay safe!
|
||||
{% endif %}
|
||||
{% elif states('sensor.weatheralerts_active_alerts') > '0' and method != 'dashboard' %}
|
||||
@ -39,9 +39,24 @@
|
||||
There is lightning in the area. Nearest strike is {{ ltgdist }} miles away.
|
||||
{% endif %}
|
||||
{% 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') %}
|
||||
{% 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 %}
|
||||
{% if state_attr('weather.iron_nerd_weather_station','visibility') | int < 3 %}
|
||||
Caution: Current outdoor visibility is {{ state_attr('weather.iron_nerd_weather_station','visibility') }} miles.
|
||||
{% endif %}
|
||||
@ -60,15 +75,15 @@
|
||||
{% endif %}
|
||||
{% if is_state('input_boolean.tornado_alarm','on') %}
|
||||
"We are under a tornado warning. If you are not already in shelter, you should be. Get on it! "
|
||||
{% if state_attr('binary_sensor.tornado_warning','confirmed' == true) %}
|
||||
{% if state_attr('binary_sensor.tornado_warning','confirmed') == true %}
|
||||
"A tornado has been confirmed in the area. Please take shelter immediately! "
|
||||
{% endif %}
|
||||
{% elif is_state('binary_sensor.severe_thunderstorm_warning','on') %}
|
||||
"We are under a severe thunderstorm warning. "
|
||||
{% if state_attr('binary_sensor.severe_thunderstorm_warning','tornado_possible' == true) %}
|
||||
{% if state_attr('binary_sensor.severe_thunderstorm_warning','tornado_possible') == true %}
|
||||
"The incoming storm has the potential to produce a tornado, so please pay attention and prepare to take shelter! "
|
||||
{% endif %}
|
||||
{% if state_attr('binary_sensor.severe_thunderstorm_warning','considerable_destructive' == true) %}
|
||||
{% if state_attr('binary_sensor.severe_thunderstorm_warning','considerable_destructive') == true %}
|
||||
"This storm has the potential to cause considerable damage. Please take shelter and stay safe! "
|
||||
{% endif %}
|
||||
{% elif is_state('input_boolean.tornado_watch','on') %}
|
||||
@ -90,6 +105,42 @@
|
||||
"The nearest lightning strike is {{ ltgdist }} miles away. "
|
||||
{% endif %}
|
||||
{% 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') %}
|
||||
{% if intensity == 'very_light' %}
|
||||
{{ [
|
||||
"There is currently a very light drizzle falling. ",
|
||||
"It is drizzling outside, but it is not too bad. ",
|
||||
"The sky is spitting on us. That's not very nice, but a mild inconvenience at most. "
|
||||
] | random }}
|
||||
{% elif intensity == 'light' %}
|
||||
{{ [
|
||||
"There is currently light rain falling. ",
|
||||
"It is raining lightly outside, but it is not too bad. ",
|
||||
"It kinda wainin outside, but just a little. "
|
||||
] | random }}
|
||||
"Front porch windows should be okay, but other windows should be closed. "
|
||||
{% elif intensity == 'moderate' %}
|
||||
{{ [
|
||||
"It is raining pretty good outside, you should probably make sure all windows are closed. ",
|
||||
"It is raining at a decent rate outside, please make sure all windows are closed. "
|
||||
"If you look outside, you will see that it wainin. "
|
||||
] | random }}
|
||||
{% elif intensity in ['heavy','very_heavy'] %}
|
||||
{{ [
|
||||
"There is heavy rain falling, please make sure all doors and windows are closed at this time. ",
|
||||
"It is raining heavily outside, please make sure all doors and windows are closed. ",
|
||||
"It wainin sideways! Please make sure all doors and windows are closed. "
|
||||
] | random }}
|
||||
{% elif intensity == 'extreme' %}
|
||||
{{ [
|
||||
"It is raining extremely hard outside. ",
|
||||
"There is a torrential downpour outside. ",
|
||||
"Holy crap, I have never seen it rain this hard before. "
|
||||
] | random }}
|
||||
"Make sure all doors and windows are closed, and I recommend staying inside until it calms down. Perhaps check for roof leaks as well. "
|
||||
{% endif %}
|
||||
{% else %}
|
||||
{{ [
|
||||
"I have looked outside and determined that it is raining. ",
|
||||
"If you look outside the window, you will notice, it wainin. ",
|
||||
@ -97,6 +148,7 @@
|
||||
"There appears to be excessive moisture currently falling from the sky. Plan accordingly. ",
|
||||
] | random }}
|
||||
{% endif %}
|
||||
{% endif %}
|
||||
{% if (state_attr('weather.iron_nerd_weather_station','visibility') | int ) < 3 %}
|
||||
{{ [
|
||||
"It is foggy outside, please exercise caution when driving. ",
|
||||
|
@ -239,6 +239,9 @@ script:
|
||||
server_maintenance_annc:
|
||||
alias: Server Maintenance Announcement
|
||||
sequence:
|
||||
- service: input_boolean.turn_on
|
||||
target:
|
||||
entity_id: input_boolean.server_maintenance
|
||||
- service: script.status_annc
|
||||
data:
|
||||
who: "{{ who|default('everywhere') }}"
|
||||
@ -248,6 +251,9 @@ script:
|
||||
server_maintenance_done_annc:
|
||||
alias: Server Maintenance Done Announcement
|
||||
sequence:
|
||||
- service: input_boolean.turn_off
|
||||
target:
|
||||
entity_id: input_boolean.server_maintenance
|
||||
- service: script.status_annc
|
||||
data:
|
||||
who: "{{ who|default('everywhere') }}"
|
||||
|
@ -3,6 +3,7 @@ weather:
|
||||
name: "Iron Nerd Weather Station"
|
||||
condition_template: >
|
||||
{% set stations = [
|
||||
states.weather.home_tempest_forecast_home,
|
||||
states.weather.home,
|
||||
states.weather.kdfi_daynight,
|
||||
states.weather.iron_nerd_studios,
|
||||
@ -12,6 +13,7 @@ weather:
|
||||
{{ states(result) }}
|
||||
temperature_template: >
|
||||
{% set temps = [
|
||||
states.sensor.home_tempest_temperature,
|
||||
states.sensor.home_temperature,
|
||||
states.sensor.kdfi_temperature,
|
||||
states.sensor.pirateweather_temperature,
|
||||
@ -20,8 +22,28 @@ weather:
|
||||
{% set sensor = temps | selectattr('state','ne','unavailable') | selectattr('state','ne','unknown') | map(attribute='entity_id') | list | first %}
|
||||
{{ states(sensor) | float }}
|
||||
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: >
|
||||
{% set humidity = [
|
||||
states.sensor.home_tempest_humidity,
|
||||
states.sensor.home_relative_humidity,
|
||||
states.sensor.kdfi_relative_humidity,
|
||||
states.sensor.pirateweather_humidity,
|
||||
@ -40,12 +62,14 @@ weather:
|
||||
{{ forecasts | selectattr('forecast','defined') | map(attribute='forecast') | list | first }}
|
||||
forecast_hourly_template: >
|
||||
{% set forecasts = [
|
||||
states.sensor.weather_com_hourly_weather_forecast,
|
||||
states.sensor.weather_com_hourly_weather_forecast.attributes,
|
||||
states.sensor.pirateweather_hourly_weather_forecast.attributes
|
||||
] %}
|
||||
{{ forecasts | selectattr('forecast','defined') | map(attribute='forecast') | list | first }}
|
||||
pressure_template: >
|
||||
{% set pressures = [
|
||||
states.sensor.home_tempest_local_slp,
|
||||
states.sensor.home_tempest_cloud_sensors_sea_level_pressure,
|
||||
states.sensor.home_pressure,
|
||||
states.sensor.kdfi_barometric_pressure
|
||||
] %}
|
||||
@ -92,6 +116,7 @@ weather:
|
||||
name: "Iron Nerd Weather Station - Hourly"
|
||||
condition_template: >
|
||||
{% set stations = [
|
||||
states.weather.home_tempest_forecast_home,
|
||||
states.weather.home,
|
||||
states.weather.tomorrow_io_stratton_ave_hourly,
|
||||
states.weather.iron_nerd_studios,
|
||||
@ -102,6 +127,7 @@ weather:
|
||||
{{ states(result) }}
|
||||
temperature_template: >
|
||||
{% set temps = [
|
||||
states.sensor.home_tempest_temperature,
|
||||
states.sensor.home_temperature,
|
||||
states.sensor.kdfi_temperature,
|
||||
states.sensor.pirateweather_temperature,
|
||||
@ -110,8 +136,28 @@ weather:
|
||||
{% set sensor = temps | selectattr('state','ne','unavailable') | selectattr('state','ne','unknown') | map(attribute='entity_id') | list | first %}
|
||||
{{ states(sensor) | float }}
|
||||
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: >
|
||||
{% set humidity = [
|
||||
states.sensor.home_tempest_humidity,
|
||||
states.sensor.home_relative_humidity,
|
||||
states.sensor.kdfi_relative_humidity,
|
||||
states.sensor.pirateweather_humidity,
|
||||
@ -121,13 +167,15 @@ weather:
|
||||
{{ states(result) | float }}
|
||||
forecast_hourly_template: >
|
||||
{% set forecasts = [
|
||||
states.sensor.weather_com_hourly_weather_forecast,
|
||||
states.sensor.weather_com_hourly_weather_forecast.attributes,
|
||||
states.weather.tomorrow_io_stratton_ave_hourly.attributes,
|
||||
states.sensor.pirateweather_hourly_weather_forecast.attributes
|
||||
] %}
|
||||
{{ forecasts | selectattr('forecast','defined') | map(attribute='forecast') | list | first }}
|
||||
pressure_template: >
|
||||
{% set pressures = [
|
||||
states.sensor.home_tempest_local_slp,
|
||||
states.sensor.home_tempest_cloud_sensors_sea_level_pressure,
|
||||
states.sensor.home_pressure,
|
||||
states.sensor.kdfi_barometric_pressure
|
||||
] %}
|
||||
@ -322,6 +370,60 @@ sensor:
|
||||
# days: 7
|
||||
|
||||
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:
|
||||
- platform: time_pattern
|
||||
minutes: /15
|
||||
@ -668,10 +770,10 @@ template:
|
||||
{% endif %}
|
||||
- name: "Lightning Warning"
|
||||
unique_id: edaddfc4-f7f0-4d75-aada-a2c588afe029
|
||||
state: "{{ states('sensor.blitzortung_lightning_counter') | int > 0 }}"
|
||||
state: "{{ states('sensor.home_tempest_cloud_sensors_lightning_strikes_last_hour') | int > 0 }}"
|
||||
device_class: safety
|
||||
attributes:
|
||||
current_strikes: "{{ states('sensor.blitzortung_lightning_counter') | int }}"
|
||||
current_strikes: "{{ states('sensor.home_tempest_cloud_sensors_lightning_strikes_last_hour') | int }}"
|
||||
icon: "{{ 'mdi:flash-alert' if states('sensor.blitzortung_lightning_counter') | int > 0 else 'mdi:flash-outline'}}"
|
||||
- name: "Audible Weather Alerts Allowed"
|
||||
unique_id: 03851823-32d5-44c1-af42-256fcd922069
|
||||
@ -701,52 +803,57 @@ template:
|
||||
- name: Raining
|
||||
unique_id: 232b43a4-4598-4315-ab76-42348c11e6ff
|
||||
state: >
|
||||
{{ states('sensor.total_rain_sensors') | int > 1 }}
|
||||
icon: "{{ 'mdi:weather-rainy' if states('sensor.total_rain_sensors') | int > 1 else 'mdi:weather-cloudy' }}"
|
||||
{{ states('sensor.home_tempest_precipitation_intensity') | float > 0 or
|
||||
states('sensor.home_tempest_precipitation_type') in ['rain','hail','rain_hail'] or
|
||||
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:
|
||||
- name: Total Rain Sensors
|
||||
unique_id: b7c2e709-8f5c-4263-aa1d-fa8280afcddb
|
||||
unit_of_measurement: 'sensors'
|
||||
state: >
|
||||
{% set sensors = [
|
||||
states.sensor.pirateweather_precip,
|
||||
states.sensor.openweathermap_precipitation_kind,
|
||||
states.sensor.tomorrow_io_stratton_ave_precipitation_type
|
||||
] %}
|
||||
{% set numeric_sensors = [
|
||||
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 %}
|
||||
{{ (c1 + c2) | int }}
|
||||
# - name: Total Rain Sensors
|
||||
# unique_id: b7c2e709-8f5c-4263-aa1d-fa8280afcddb
|
||||
# unit_of_measurement: 'sensors'
|
||||
# state: >
|
||||
# {% set sensors = [
|
||||
# states.sensor.home_tempest_precipitation_type,
|
||||
# states.sensor.pirateweather_precip,
|
||||
# states.sensor.openweathermap_precipitation_kind,
|
||||
# states.sensor.tomorrow_io_stratton_ave_precipitation_type
|
||||
# ] %}
|
||||
# {% set numeric_sensors = [
|
||||
# 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 %}
|
||||
# {{ (c1 + c2) | int }}
|
||||
- name: Current Forecast
|
||||
unique_id: c0faea33-2ac3-40f1-8558-584c3f5d6b16
|
||||
icon: mdi:weather-sunny
|
||||
state: >-
|
||||
{% set forecast = state_attr('sensor.weather_com_daily_weather_forecast','forecast')[0] %}
|
||||
{% set forecast = state_attr('sensor.weatherflow_daily_weather_forecast','forecast')[0] %}
|
||||
{{ forecast.condition }}
|
||||
attributes:
|
||||
high_temp: >-
|
||||
{% set forecast = state_attr('sensor.weather_com_daily_weather_forecast','forecast')[0] %}
|
||||
{% set forecast = state_attr('sensor.weatherflow_daily_weather_forecast','forecast')[0] %}
|
||||
{{ forecast.temperature }}
|
||||
overnight_low: >-
|
||||
{% set forecast = state_attr('sensor.weather_com_daily_weather_forecast','forecast')[0] %}
|
||||
{% set forecast = state_attr('sensor.weatherflow_daily_weather_forecast','forecast')[0] %}
|
||||
{{ forecast.templow }}
|
||||
wind_bearing: >-
|
||||
{% set forecast = state_attr('sensor.weather_com_daily_weather_forecast','forecast')[0] %}
|
||||
{% set forecast = state_attr('sensor.weatherflow_daily_weather_forecast','forecast')[0] %}
|
||||
{{ forecast.wind_bearing }}
|
||||
wind_speed: >-
|
||||
{% set forecast = state_attr('sensor.weather_com_daily_weather_forecast','forecast')[0] %}
|
||||
{% set forecast = state_attr('sensor.weatherflow_daily_weather_forecast','forecast')[0] %}
|
||||
{{ forecast.wind_speed }}
|
||||
precipitation: >-
|
||||
{% if state_attr('weather.iron_nerd_weather_station','precipitation') %}
|
||||
{% set forecast = state_attr('weather.iron_nerd_weather_station','forecast')[0] %}
|
||||
{% else %}
|
||||
{% set forecast = state_attr('sensor.weather_com_daily_weather_forecast','forecast')[0] %}
|
||||
{% set forecast = state_attr('sensor.weatherflow_daily_weather_forecast','forecast')[0] %}
|
||||
{% endif %}
|
||||
{{ forecast.precipitation }}
|
||||
friendly: >-
|
||||
{% set forecast = state_attr('sensor.weather_com_daily_weather_forecast','forecast')[0] %}
|
||||
{% set forecast = state_attr('sensor.weatherflow_daily_weather_forecast','forecast')[0] %}
|
||||
{{ forecast.condition | replace("partlycloudy","partly cloudy") }}
|
||||
- name: Current Forecast Detail
|
||||
unique_id: e5ae9864-70b5-402c-9d2f-c4d6a10085df
|
||||
@ -861,23 +968,23 @@ template:
|
||||
unique_id: a8ae26b0-ed26-4568-bb2b-f7c72707b009
|
||||
icon: mdi:weather-sunny
|
||||
state: >-
|
||||
{% set forecast = state_attr('sensor.weather_com_daily_weather_forecast','forecast')[1] %}
|
||||
{% set forecast = state_attr('sensor.weatherflow_daily_weather_forecast','forecast')[1] %}
|
||||
{{ forecast.condition }}
|
||||
attributes:
|
||||
high_temp: >-
|
||||
{% set forecast = state_attr('sensor.weather_com_daily_weather_forecast','forecast')[1] %}
|
||||
{% set forecast = state_attr('sensor.weatherflow_daily_weather_forecast','forecast')[1] %}
|
||||
{{ forecast.temperature }}
|
||||
overnight_low: >-
|
||||
{% set forecast = state_attr('sensor.weather_com_daily_weather_forecast','forecast')[1] %}
|
||||
{% set forecast = state_attr('sensor.weatherflow_daily_weather_forecast','forecast')[1] %}
|
||||
{{ forecast.templow }}
|
||||
wind_bearing: >-
|
||||
{% set forecast = state_attr('sensor.weather_com_daily_weather_forecast','forecast')[1] %}
|
||||
{% set forecast = state_attr('sensor.weatherflow_daily_weather_forecast','forecast')[1] %}
|
||||
{{ forecast.wind_bearing }}
|
||||
wind_speed: >-
|
||||
{% set forecast = state_attr('sensor.weather_com_daily_weather_forecast','forecast')[1] %}
|
||||
{% set forecast = state_attr('sensor.weatherflow_daily_weather_forecast','forecast')[1] %}
|
||||
{{ forecast.wind_speed }}
|
||||
precipitation: >-
|
||||
{% set forecast = state_attr('sensor.weather_com_daily_weather_forecast','forecast')[1] %}
|
||||
{% set forecast = state_attr('sensor.weatherflow_daily_weather_forecast','forecast')[1] %}
|
||||
{{ forecast.precipitation }}
|
||||
- name: Tomorrow Forecast Detail
|
||||
unique_id: 21374ed0-80d1-49ba-817d-3e93eb3865e4
|
||||
@ -1182,7 +1289,7 @@ template:
|
||||
unit_of_measurement: '°F'
|
||||
device_class: temperature
|
||||
state: >-
|
||||
{% set forecast = state_attr('sensor.weather_com_daily_weather_forecast','forecast')[0] %}
|
||||
{% set forecast = state_attr('sensor.weatherflow_daily_weather_forecast','forecast')[0] %}
|
||||
{% if is_number(forecast.temperature) %}
|
||||
{{ forecast.temperature }}
|
||||
{% else %}
|
||||
@ -1193,14 +1300,14 @@ template:
|
||||
unit_of_measurement: '°F'
|
||||
device_class: temperature
|
||||
state: >-
|
||||
{% set forecast = state_attr('sensor.weather_com_daily_weather_forecast','forecast')[2] %}
|
||||
{% set forecast = state_attr('sensor.weatherflow_daily_weather_forecast','forecast')[2] %}
|
||||
{{ forecast.temperature }}
|
||||
- name: "Tonight's Low Temp"
|
||||
unique_id: 8ddc55b6-4728-4897-a32f-90be970f744b
|
||||
unit_of_measurement: '°F'
|
||||
device_class: temperature
|
||||
state: >-
|
||||
{% set forecast = state_attr('sensor.weather_com_daily_weather_forecast','forecast')[0] %}
|
||||
{% set forecast = state_attr('sensor.weatherflow_daily_weather_forecast','forecast')[0] %}
|
||||
{{ forecast.templow }}
|
||||
- name: "Clothing Forecast"
|
||||
unique_id: 8ed2684b-d0ad-402c-bc3c-340cb9b2437a
|
||||
@ -1461,8 +1568,8 @@ template:
|
||||
unit_of_measurement: '°F'
|
||||
state: >
|
||||
{% set ns = namespace(temps=[]) %}
|
||||
{% set x = state_attr('sensor.weather_com_hourly_weather_forecast','forecast') | count %}
|
||||
{% set pd = state_attr('sensor.weather_com_hourly_weather_forecast','forecast') %}
|
||||
{% set x = state_attr('sensor.weatherflow_hourly_weather_forecast','forecast') | count %}
|
||||
{% set pd = state_attr('sensor.weatherflow_hourly_weather_forecast','forecast') %}
|
||||
{% for i in range(0,x) %}
|
||||
{% 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) %}
|
||||
|
@ -44,6 +44,9 @@ input_boolean:
|
||||
adaptive_lighting_adjustments:
|
||||
name: Adaptive Lighting Adjustments
|
||||
icon: mdi:knob
|
||||
sunset_lights_triggered:
|
||||
name: Sunset Lights Triggered
|
||||
icon: mdi:weather-sunset
|
||||
|
||||
input_number:
|
||||
upstairs_bathroom_motion_off_delay:
|
||||
@ -207,6 +210,21 @@ input_number:
|
||||
step: 5
|
||||
unit_of_measurement: lx
|
||||
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
|
||||
daytime_colortemp_front_porch:
|
||||
|
@ -602,26 +602,16 @@ script:
|
||||
{% 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_fantime = state_attr('input_datetime.kallen_fan','timestamp') | int %}
|
||||
{% set bedroom_hot = is_state('binary_sensor.kallen_bedroom_hot','on') %}
|
||||
{% set cutoff = 81000 %} {# Cutoff time is 22:30 #}
|
||||
{% if is_state('binary_sensor.kallen_school_tomorrow','on') %}
|
||||
{% if is_state('input_boolean.hot_day','on') %}
|
||||
{{ (kallen_bedtime - 3600) | timestamp_custom('%H:%M',false) }}
|
||||
{% if is_state('input_boolean.hot_day','on') or bedroom_hot == true %}
|
||||
{{ (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) }}
|
||||
{% endif %}
|
||||
{% elif low > 60 or high > 74 %}
|
||||
{% if kallen_bedtime < cutoff %}
|
||||
{{ kallen_bedtime | timestamp_custom('%H:%M',false) }}
|
||||
{% else %}
|
||||
22:00
|
||||
{% endif %}
|
||||
{% elif 56 <= low <= 60 %}
|
||||
22:30
|
||||
{% else %}
|
||||
00:00
|
||||
{% endif %}
|
||||
- service: input_datetime.set_datetime
|
||||
entity_id: input_datetime.master_bedroom_fan
|
||||
data:
|
||||
|
@ -106,7 +106,7 @@ template:
|
||||
unique_id: 2987ae95-f55d-4994-b9dd-018278d2f5ad
|
||||
state: >
|
||||
{% from 'sports.jinja' import sports_inhibit %}
|
||||
{{ state_attr('sensor.minnesota_twins','opponent_abbr') in ['CLE','LAD'] or sports_inhibit('sensor.minnesota_twins') }}
|
||||
{{ sports_inhibit('sensor.minnesota_twins') }}
|
||||
- name: Minnesota Twins Event Today
|
||||
unique_id: 30055cb3-d259-4cef-90e1-7dea0a5cb439
|
||||
state: >
|
||||
@ -116,7 +116,7 @@ template:
|
||||
unique_id: b0980d47-d762-4f23-97b1-9e88da729d8f
|
||||
state: >
|
||||
{% from 'sports.jinja' import sports_inhibit %}
|
||||
{{ sports_inhibit('sensor.cleveland_guardians') }}
|
||||
{{ state_attr('sensor.cleveland_guardians','opponent_abbr') in ['MIN','LAD'] or sports_inhibit('sensor.cleveland_guardians') }}
|
||||
- name: Cleveland Guardians Event Today
|
||||
unique_id: 985a7b2c-9ebd-4a2e-8ee2-2ab5359310e0
|
||||
state: >
|
||||
@ -126,7 +126,7 @@ template:
|
||||
unique_id: 2c6aae6e-eff6-46e5-bee9-311f9bbc0c0e
|
||||
state: >
|
||||
{% from 'sports.jinja' import sports_inhibit %}
|
||||
{{ state_attr('sensor.los_angeles_dodgers','opponent_abbr') in ['CLE'] or sports_inhibit('sensor.los_angeles_dodgers') }}
|
||||
{{ state_attr('sensor.los_angeles_dodgers','opponent_abbr') in ['MIN'] or sports_inhibit('sensor.los_angeles_dodgers') }}
|
||||
- name: Los Angeles Dodgers Event Today
|
||||
unique_id: 7c2bd060-ea2c-4b81-8af7-3e6b9b3c639d
|
||||
state: >
|
||||
|
@ -1,3 +1,8 @@
|
||||
input_boolean:
|
||||
server_maintenance:
|
||||
name: Server Maintenance
|
||||
icon: mdi:wrench-clock
|
||||
|
||||
input_select:
|
||||
log_level:
|
||||
name: Log Level
|
||||
|
37
readme.md
37
readme.md
@ -2,11 +2,9 @@ # Tony's Home Assistant Configs
|
||||
|
||||
Just a place to track my work on my personal Home Assistant configuration, and learn as I go. Maybe also TRY to keep myself a little bit more organized ;)
|
||||
|
||||
## New location for Node-RED flows
|
||||
## Node-RED flows
|
||||
|
||||
I have recently started using the Node-RED Projects feature, which makes version control for my flows a LOT easier than it was before.
|
||||
|
||||
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).
|
||||
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).
|
||||
|
||||
## Attributions
|
||||
|
||||
@ -34,7 +32,6 @@ ## HACS Components
|
||||
- [Node-RED Companion](https://github.com/zachowj/hass-node-red)
|
||||
- [Holidays](https://github.com/bruxy70/Holidays)
|
||||
- [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)
|
||||
- [Holidays](https://github.com/bruxy70/Holidays)
|
||||
- [Thermal Comfort](https://github.com/dolezsa/thermal_comfort)
|
||||
@ -42,7 +39,7 @@ ## HACS Components
|
||||
- [HASS.Agent Media Player](https://github.com/LAB02-Research/HASS.Agent-MediaPlayer)
|
||||
- [Music Assistant](https://github.com/music-assistant/hass-music-assistant)
|
||||
- [Blitzortung Lightning Detector](https://github.com/mrk-its/homeassistant-blitzortung)
|
||||
- [Midea Air Conditioning](https://github.com/mill1000/midea-ac-py)
|
||||
- [Midea Air Conditioning](https://github.com/wuwentao/midea_ac_lan)
|
||||
- [WeatherAPI](https://github.com/iprak/weatherapi)
|
||||
- [Browser Mod](https://github.com/thomasloven/hass-browser_mod)
|
||||
- [Watchman](https://github.com/dummylabs/thewatchman)
|
||||
@ -50,7 +47,6 @@ ## HACS Components
|
||||
- [PyScript](https://github.com/custom-components/pyscript)
|
||||
- [Hass Animated Scenes](https://github.com/chazzu/hass-animated-scenes)
|
||||
- [Jokes](https://github.com/LaggAt/ha-jokes)
|
||||
- [Google Photos](https://github.com/Daanoz/ha-google-photos)
|
||||
- [Uptime Kuma](https://github.com/meichthys/uptime_kuma)
|
||||
- [Jellyfin](https://github.com/koying/jellyfin_ha)
|
||||
- [Sonoff LAN](https://github.com/AlexxIT/SonoffLAN)
|
||||
@ -58,6 +54,9 @@ ## HACS Components
|
||||
- [Govee LAN Control](https://github.com/wez/govee-lan-hass)
|
||||
- [Discord Game](https://github.com/LordBoos/discord_game)
|
||||
- [Versatile Thermostat](https://github.com/jmcollin78/versatile_thermostat)
|
||||
- [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>
|
||||
|
||||
@ -70,22 +69,19 @@ ## HACS Lovelace Cards
|
||||
|
||||
- [Bubble Card](https://github.com/Clooos/Bubble-Card) Backbone of the new mobile dashboard
|
||||
- [Config Template Card](https://github.com/iantrich/config-template-card)
|
||||
- [Decluttering Card](https://github.com/custom-cards/decluttering-card)
|
||||
- [Card Tools](https://github.com/thomasloven/lovelace-card-tools) (required for various other cards)
|
||||
- [Streamline Card](https://github.com/brunosabot/streamline-card)
|
||||
- [Layout Card](https://github.com/thomasloven/lovelace-layout-card)
|
||||
- [Scheduler Card](https://github.com/nielsfaber/scheduler-card) (required for Scheduler component)
|
||||
- [Horizon Card](https://github.com/rejuvenate/lovelace-horizon-card)
|
||||
- [Lovelace Home Feed Card](https://github.com/gadgetchnnel/lovelace-home-feed-card)
|
||||
- [Mini Graph Card](https://github.com/kalkih/mini-graph-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)
|
||||
- [Atomic Calendar Revive](https://github.com/totaldebug/atomic-calendar-revive)
|
||||
- [Plotly Graph Card](https://github.com/dbuezas/lovelace-plotly-graph-card)
|
||||
- [Mushroom](https://github.com/piitaya/lovelace-mushroom)
|
||||
- [Apexcharts Card](https://github.com/RomRider/apexcharts-card)
|
||||
- [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)
|
||||
- [Stack In Card](https://github.com/custom-cards/stack-in-card)
|
||||
- [Paper Buttons Row](https://github.com/jcwillox/lovelace-paper-buttons-row)
|
||||
@ -93,32 +89,24 @@ ## HACS Lovelace Cards
|
||||
- [Multiple Entity Row](https://github.com/benct/lovelace-multiple-entity-row)
|
||||
- [Weather Card](https://github.com/bramkragten/weather-card)
|
||||
- [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)
|
||||
- [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)
|
||||
- [Simple Thermostat Card](https://github.com/nervetattoo/simple-thermostat)
|
||||
- [Clock Weather Card](https://github.com/pkissling/clock-weather-card)
|
||||
- [Tabbed Card](https://github.com/kinghat/tabbed-card)
|
||||
- [HA Team Tracker Card](https://github.com/vasqued2/ha-teamtracker-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)
|
||||
- [Energy Overview Card](https://github.com/Sese-Schneider/ha-energy-overview-card)
|
||||
- [Button Card](https://github.com/custom-cards/button-card)
|
||||
- [Number Box Card](https://github.com/htmltiger/numberbox-card)
|
||||
- [Restriction Card](https://github.com/iantrich/restriction-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)
|
||||
- [Hourly Weather Card](https://github.com/decompil3d/lovelace-hourly-weather)
|
||||
- [Formula One Card](https://github.com/marcokreeft87/formulaone-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)
|
||||
- [Swipe Card](https://github.com/bramkragten/swipe-card)
|
||||
- [Meteoalarm Card](https://github.com/MrBartusek/MeteoalarmCard)
|
||||
- [Weather Chart Card](https://github.com/mlamberts78/weather-chart-card)
|
||||
- [Comfortable Environment Card](https://github.com/argaar/comfortable-environment-card)
|
||||
@ -135,6 +123,16 @@ ## AppDaemon Apps
|
||||
|
||||
</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
|
||||
|
||||
<details>
|
||||
@ -146,5 +144,6 @@ ## Themes/Icons
|
||||
- [BHA Icon Pack](https://github.com/hulkhaugen/hass-bha-icons)
|
||||
- [Custom Icons Library](https://github.com/Mariusthvdb/custom-icons)
|
||||
- [FontAwesome](https://github.com/thomasloven/hass-fontawesome)
|
||||
- [Material Symbols](https://github.com/beecho01/material-symbols)
|
||||
|
||||
</details>
|
||||
|
40
scripts.yaml
40
scripts.yaml
@ -854,6 +854,12 @@ adaptive_on_first_floor:
|
||||
adaptive_on_second_floor:
|
||||
alias: Adaptive on Second Floor
|
||||
sequence:
|
||||
- action: switch.turn_on
|
||||
metadata: {}
|
||||
data: {}
|
||||
target:
|
||||
entity_id: switch.adaptive_lighting_stairwell
|
||||
alias: Turn on adaptive lighting in stairwell
|
||||
- if:
|
||||
- condition: state
|
||||
entity_id: light.hallway_overhead
|
||||
@ -1441,16 +1447,42 @@ evening_on_second_floor:
|
||||
goodnight_in_basement:
|
||||
alias: Goodnight in Basement
|
||||
sequence:
|
||||
- service: light.turn_off
|
||||
target:
|
||||
- target:
|
||||
area_id:
|
||||
- basement_studio
|
||||
- furnace_room
|
||||
data: {}
|
||||
- service: fan.turn_off
|
||||
target:
|
||||
action: light.turn_off
|
||||
alias: Turn lights off
|
||||
- target:
|
||||
entity_id: fan.basement_fan
|
||||
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:
|
||||
alias: Goodnight on First Floor
|
||||
sequence:
|
||||
|
Reference in New Issue
Block a user