2525 lines
74 KiB
YAML
2525 lines
74 KiB
YAML
- alias: MSR 2 Testing
|
|
id: d0be7b52-30f2-4947-a8de-a20a15df8849
|
|
mode: parallel
|
|
trigger:
|
|
- platform: state
|
|
entity_id: &id001
|
|
- binary_sensor.apollo_msr_2_8935e0_radar_zone_1_occupancy
|
|
- binary_sensor.apollo_msr_2_8935e0_radar_zone_2_occupancy
|
|
- binary_sensor.apollo_msr_2_8935e0_radar_zone_3_occupancy
|
|
variables:
|
|
entities: *id001
|
|
colors:
|
|
'on':
|
|
- 0
|
|
- 255
|
|
- 0
|
|
'off':
|
|
- 255
|
|
- 0
|
|
- 0
|
|
unknown:
|
|
- 255
|
|
- 255
|
|
- 255
|
|
unavailable:
|
|
- 0
|
|
- 0
|
|
- 255
|
|
color: '{{ colors.get(trigger.to_state.state, colors.unavailable) }}
|
|
|
|
'
|
|
index: '{{ entities.index(trigger.to_state.entity_id) }}
|
|
|
|
'
|
|
target: light.test_segment_{{ index + 1 }}
|
|
action:
|
|
- if: '{{ is_state(''light.test_main'', ''off'') }}'
|
|
then:
|
|
- service: light.turn_on
|
|
target:
|
|
entity_id: light.test_main
|
|
data:
|
|
brightness: 255
|
|
- service: light.turn_on
|
|
target:
|
|
entity_id: '{{ target }}'
|
|
data:
|
|
rgb_color: '{{ color }}'
|
|
- alias: Notify Aurora
|
|
id: 1d19d3a4-4ce1-433e-b27a-bc5fa8364153
|
|
triggers:
|
|
- trigger: state
|
|
entity_id: binary_sensor.aurora_visibility_visibility_alert
|
|
from: 'off'
|
|
to: 'on'
|
|
conditions:
|
|
- condition: numeric_state
|
|
entity_id: sensor.aurora_visibility_visibility
|
|
above: 0
|
|
actions:
|
|
- service: script.notify
|
|
data:
|
|
title: Snapshot Status
|
|
message: There's a {{ states('sensor.aurora_visibility_visibility') }}% chance
|
|
that Aurora Borealis may be visible.
|
|
- alias: Update Group Members
|
|
id: plants_update group members
|
|
trigger:
|
|
- platform: time
|
|
at: 00:00:00
|
|
- platform: homeassistant
|
|
event: start
|
|
- platform: event
|
|
event_type: event_template_reloaded
|
|
action:
|
|
- service: group.set
|
|
data:
|
|
name: Plants
|
|
object_id: plants
|
|
icon: mdi:sprout
|
|
entities: '{{ states.plant | map(attribute=''entity_id'') | list }}'
|
|
- alias: Notify
|
|
id: plants_notify
|
|
trigger:
|
|
- platform: state
|
|
entity_id: binary_sensor.plant_issue
|
|
to: 'on'
|
|
from: 'off'
|
|
variables:
|
|
state: '{{ trigger.to_state.state }}'
|
|
- platform: time
|
|
at: '10:00'
|
|
variables: &id002
|
|
state: '{{ states(''binary_sensor.plant_issue'') }}'
|
|
- platform: time
|
|
at: '15:30'
|
|
variables: *id002
|
|
- platform: time
|
|
at: '19:00'
|
|
variables: *id002
|
|
variables:
|
|
problems: '{{ state_attr(''sensor.plant_events'', ''events'') }}
|
|
|
|
'
|
|
count: '{{ problems | length }}
|
|
|
|
'
|
|
title: 'Plant{{ ''s'' if count > 1 else '''' }} Need{{ '''' if count > 1 else
|
|
''s'' }} Attention!
|
|
|
|
'
|
|
message: "{%- set ns = namespace(items=[]) %} {%- for issue, plants in problems\
|
|
\ | groupby(attribute='problems') %}\n {%- set phrases = plants | map(attribute='name')\
|
|
\ | list %}\n {%- set phrase = phrases[:-1] | join(', ') ~ ' and ' ~ phrases[-1]\
|
|
\ if phrases | length > 1 else phrases | first | default %}\n {%- set plural\
|
|
\ = '' if phrases | length > 1 else 's' %}\n {%- set ns.items = ns.items +\
|
|
\ [ (phrase ~ ' need%s ' % plural ~ issue ~ '.') | capitalize ] %}\n{%- endfor\
|
|
\ %} {{ ns.items | join('\\n') }}\n"
|
|
condition:
|
|
- condition: template
|
|
value_template: '{{ count > 0 }}'
|
|
action:
|
|
- service: script.notify
|
|
data:
|
|
title: '{{ title }}'
|
|
message: '{{ message }}'
|
|
- alias: Zigbee Button Toggler
|
|
id: button_toggle_lights
|
|
mode: parallel
|
|
trigger:
|
|
- platform: state
|
|
entity_id:
|
|
- event.workshop_button_action
|
|
- event.mikes_button_action
|
|
- event.jims_button_action
|
|
- event.lindsays_button_action
|
|
variables:
|
|
continue: '{{ trigger | default(none) is not none and trigger.to_state is defined
|
|
and trigger.from_state is defined }}
|
|
|
|
'
|
|
event: '{{ trigger.to_state.attributes.event_type | default('''') if continue
|
|
else '''' }}
|
|
|
|
'
|
|
source: '{{ trigger.entity_id }}
|
|
|
|
'
|
|
config:
|
|
event.workshop_button_action:
|
|
single:
|
|
- light.workshop_desk
|
|
double:
|
|
- light.workshop_desk
|
|
- light.workshop_bench_strip
|
|
hold:
|
|
- light.workshop_desk
|
|
- light.workshop_dome
|
|
- switch.floating_double_plug_left
|
|
- light.workshop_bench_strip
|
|
event.mikes_button_action:
|
|
single:
|
|
- light.mikes_lamp
|
|
double:
|
|
- light.living_room
|
|
hold:
|
|
- switch.movie_time
|
|
event.jims_button_action:
|
|
single:
|
|
- light.jims_lamp
|
|
double:
|
|
- light.all_living_room
|
|
hold:
|
|
- light.all_living_room
|
|
event.lindsays_button_action:
|
|
single:
|
|
- light.lindsays_lamp
|
|
double:
|
|
- light.living_room
|
|
hold:
|
|
- light.all_living_room
|
|
which: '{%- set item = config.get(source, {}) %} {{ item.get(event, []) }}
|
|
|
|
'
|
|
targets: '{{ which | count > 0 }}
|
|
|
|
'
|
|
are_on: '{{ which | select(''is_state'', ''on'') | list | count > 0 }}
|
|
|
|
'
|
|
condition:
|
|
- condition: template
|
|
value_template: '{{ continue and targets }}'
|
|
action:
|
|
- service: homeassistant.turn_o{{ 'ff' if are_on else 'n' }}
|
|
target:
|
|
entity_id: '{{ which }}'
|
|
- alias: Living Room Scene Controller
|
|
id: button_living_room_scene_controller
|
|
mode: parallel
|
|
trigger:
|
|
- platform: event
|
|
event_type: zwave_js_value_notification
|
|
variables:
|
|
device: '{{ trigger.event.data.device_id }}
|
|
|
|
'
|
|
value: '{{ trigger.event.data.value }}
|
|
|
|
'
|
|
label: "{{ trigger.event.data.label }} \n"
|
|
config:
|
|
215253fb0f54a57d98bc940fac442073:
|
|
Scene 001:
|
|
KeyPressed:
|
|
service: light.toggle
|
|
data:
|
|
entity_id: light.downstairs_ambiance
|
|
Scene 002:
|
|
KeyPressed:
|
|
service: light.toggle
|
|
data:
|
|
entity_id: light.living_room_uplight
|
|
Scene 003:
|
|
KeyPressed:
|
|
service: light.toggle
|
|
data:
|
|
entity_id: light.dining_room_uplight_1
|
|
Scene 004:
|
|
KeyPressed:
|
|
service: light.toggle
|
|
data:
|
|
entity_id: light.dining_room_uplight_2
|
|
Scene 005:
|
|
KeyPressed:
|
|
service: light.toggle
|
|
data:
|
|
entity_id: light.living_room
|
|
KeyPressed2x:
|
|
service: light.toggle
|
|
data:
|
|
entity_id: light.all_living_room
|
|
f7a1fe2db74bf6a3b652301589f7cebc:
|
|
Scene 001:
|
|
KeyPressed:
|
|
service: light.toggle
|
|
data:
|
|
entity_id: light.mikes_lamp
|
|
Scene 002:
|
|
KeyPressed:
|
|
service: light.toggle
|
|
data:
|
|
entity_id: light.lindsays_lamp
|
|
Scene 003:
|
|
KeyPressed:
|
|
service: light.toggle
|
|
data:
|
|
entity_id: light.jims_lamp
|
|
Scene 004:
|
|
KeyPressed:
|
|
service: switch.toggle
|
|
data:
|
|
entity_id: switch.hyperion_usb_capture
|
|
KeyPressed2x:
|
|
service: switch.toggle
|
|
data:
|
|
entity_id: switch.hyperion_cinema
|
|
KeyPressed3x:
|
|
service: switch.toggle
|
|
data:
|
|
entity_id: switch.hyperion_rainbow_swirl_fast
|
|
Scene 005:
|
|
KeyPressed:
|
|
service: light.toggle
|
|
data:
|
|
entity_id: light.living_room
|
|
KeyPressed2x:
|
|
service: light.toggle
|
|
data:
|
|
entity_id: light.all_living_room
|
|
service: '{{ config.get(device, {}).get(label, {}).get(value, {}).get(''service'')
|
|
}}
|
|
|
|
'
|
|
data: '{{ config.get(device, {}).get(label, {}).get(value, {}).get(''data'') }}
|
|
|
|
'
|
|
condition:
|
|
- condition: template
|
|
value_template: '{{ service is not none and data is not none }}'
|
|
action:
|
|
- service: '{{ service }}'
|
|
data: '{{ data }}'
|
|
- alias: Living Room Scene Controller LEDs
|
|
id: button_living_room_scene_controller_leds
|
|
mode: queued
|
|
trigger:
|
|
- platform: state
|
|
entity_id:
|
|
- light.mikes_lamp
|
|
- light.lindsays_lamp
|
|
- light.jims_lamp
|
|
- switch.hyperion_usb_capture
|
|
- switch.hyperion_cinema
|
|
- switch.hyperion_rainbow_swirl_fast
|
|
- light.all_living_room
|
|
- light.downstairs_ambiance
|
|
- light.dining_room_uplight_1
|
|
- light.dining_room_uplight_2
|
|
- light.living_room_uplight
|
|
variables:
|
|
values:
|
|
'on': 2
|
|
'off': 3
|
|
unavailable: 3
|
|
unknown: 3
|
|
colors:
|
|
white: 0
|
|
blue: 1
|
|
green: 2
|
|
red: 3
|
|
config:
|
|
light.mikes_lamp:
|
|
devices: f7a1fe2db74bf6a3b652301589f7cebc
|
|
parameter: 2
|
|
light.lindsays_lamp:
|
|
devices: f7a1fe2db74bf6a3b652301589f7cebc
|
|
parameter: 3
|
|
light.jims_lamp:
|
|
devices: f7a1fe2db74bf6a3b652301589f7cebc
|
|
parameter: 4
|
|
switch.hyperion_usb_capture:
|
|
devices: f7a1fe2db74bf6a3b652301589f7cebc
|
|
parameter: 5
|
|
switch.hyperion_cinema:
|
|
devices: f7a1fe2db74bf6a3b652301589f7cebc
|
|
parameter: 5
|
|
switch.hyperion_rainbow_swirl_fast:
|
|
devices: f7a1fe2db74bf6a3b652301589f7cebc
|
|
parameter: 5
|
|
light.all_living_room:
|
|
devices:
|
|
- f7a1fe2db74bf6a3b652301589f7cebc
|
|
- 215253fb0f54a57d98bc940fac442073
|
|
parameter: 1
|
|
light.downstairs_ambiance:
|
|
devices: 215253fb0f54a57d98bc940fac442073
|
|
parameter: 2
|
|
light.dining_room_uplight_1:
|
|
devices: 215253fb0f54a57d98bc940fac442073
|
|
parameter: 4
|
|
light.dining_room_uplight_2:
|
|
devices: 215253fb0f54a57d98bc940fac442073
|
|
parameter: 5
|
|
light.living_room_uplight:
|
|
devices: 215253fb0f54a57d98bc940fac442073
|
|
parameter: 3
|
|
value: '{{ values.get(trigger.to_state.state) }}
|
|
|
|
'
|
|
state_parameter: '{{ config.get(trigger.entity_id, {}).get(''parameter'') }}
|
|
|
|
'
|
|
devices: '{% set devices = config.get(trigger.entity_id, {}).get(''devices'')
|
|
%} {{ devices if devices is list else [devices] }}
|
|
|
|
'
|
|
color_parameter: '{{ state_parameter + 5 if state_parameter is not none else none
|
|
}}
|
|
|
|
'
|
|
state_good: '{{ trigger.to_state.state in [''on'', ''off''] }}
|
|
|
|
'
|
|
state_bad: '{{ trigger.to_state.state in [''unavailable'', ''unknown''] }}
|
|
|
|
'
|
|
state_off: '{{ trigger.to_state.state == ''off'' }}
|
|
|
|
'
|
|
color: "{% if state_good and state_off %}\n {{ colors.get('white') }}\n{% elif\
|
|
\ state_bad %}\n {{ colors.get('red') }}\n{% else %}\n None\n{% endif %}\n"
|
|
condition:
|
|
- condition: template
|
|
value_template: '{{ value is not none and state_parameter is not none }}'
|
|
action:
|
|
- repeat:
|
|
for_each: '{{ devices }}'
|
|
sequence:
|
|
- service: zwave_js.bulk_set_partial_config_parameters
|
|
target: &id003
|
|
device_id: '{{ repeat.item }}'
|
|
data:
|
|
parameter: '{{ state_parameter }}'
|
|
value: '{{ value }}'
|
|
- condition: template
|
|
value_template: '{{ color is not none and (state_bad or state_off) }}'
|
|
- repeat:
|
|
for_each: '{{ devices }}'
|
|
sequence:
|
|
- service: zwave_js.bulk_set_partial_config_parameters
|
|
target: *id003
|
|
data:
|
|
parameter: '{{ color_parameter }}'
|
|
value: '{{ color }}'
|
|
- alias: Calibration Helper
|
|
id: 467417d9-fe47-4fb8-a0fd-2764c92e099a
|
|
mode: parallel
|
|
trigger:
|
|
- platform: state
|
|
entity_id:
|
|
- sensor.basement_bme280_temperature
|
|
- sensor.basement_bme280_humidity
|
|
variables:
|
|
config:
|
|
sensor.basement_bme280_temperature:
|
|
notify: notify.basement_temperature
|
|
sensor: sensor.apollo_air_1_1ecac0_sen55_temperature
|
|
sensor.basement_bme280_humidity:
|
|
notify: notify.basement_humidity
|
|
sensor: sensor.apollo_air_1_1ecac0_sen55_humidity
|
|
which: '{{ config.get(trigger.to_state.entity_id) }}'
|
|
condition:
|
|
- condition: template
|
|
value_template: '{{ which is not none }}'
|
|
action:
|
|
- service: notify.send_message
|
|
target:
|
|
entity_id: '{{ which.notify }}'
|
|
data:
|
|
message: '{{ now().isoformat() }},{{ trigger.to_state.state }},{{ states(which.sensor)
|
|
}}'
|
|
- alias: Turn off Outside Cameras based on temperature
|
|
id: turn_off_outside_cameras_based_on_temperature
|
|
trigger:
|
|
- platform: state
|
|
entity_id: binary_sensor.camera_shutoff
|
|
from: 'off'
|
|
to: 'on'
|
|
action:
|
|
- service: script.notify
|
|
data:
|
|
message: '[{{ now().strftime(''%-I:%M:%S %p'') }}] Temperature is moving below
|
|
16°F, turning off the driveway and backyard camera.
|
|
|
|
'
|
|
- service: switch.turn_off
|
|
data:
|
|
entity_id:
|
|
- switch.driveway_camera_port
|
|
- switch.patio_camera_port
|
|
- alias: Turn on Outside Cameras based on temperature
|
|
id: turn_on_outside_cameras_based_on_temperature
|
|
trigger:
|
|
- platform: state
|
|
entity_id: binary_sensor.camera_turn_on
|
|
from: 'off'
|
|
to: 'on'
|
|
action:
|
|
- service: script.notify
|
|
data:
|
|
message: '[{{ now().strftime(''%-I:%M:%S %p'') }}] Temperature is moving above
|
|
20°F, turning on the driveway and backyard camera.
|
|
|
|
'
|
|
- service: switch.turn_on
|
|
data:
|
|
entity_id:
|
|
- switch.driveway_camera_port
|
|
- switch.patio_camera_port
|
|
- id: f6524e79-6b0c-4aa2-b508-3d67f83901a8
|
|
alias: Cube Actions
|
|
mode: parallel
|
|
trigger:
|
|
- platform: state
|
|
entity_id: event.mikes_cube_action
|
|
from: null
|
|
variables:
|
|
continue: '{{ trigger | default(none) is not none and trigger.to_state is defined
|
|
and trigger.from_state is defined }}
|
|
|
|
'
|
|
event: '{{ trigger.to_state.attributes.event_type | default(None) if continue
|
|
else None }}'
|
|
player: media_player.yamaha_rx_v6a
|
|
volume: '{{ state_attr(player, ''volume_level'') }}'
|
|
condition:
|
|
- condition: template
|
|
value_template: '{{ event is not none }}'
|
|
action:
|
|
- alias: Which action
|
|
choose:
|
|
- alias: Shake
|
|
conditions: '{{ event == ''shake'' }}'
|
|
sequence:
|
|
- service: switch.toggle
|
|
target:
|
|
entity_id: switch.movie_time
|
|
- alias: Rotate
|
|
conditions: '{{ ''rotate'' in event }}'
|
|
sequence:
|
|
- if: '{{ volume is not none }}'
|
|
then:
|
|
- service: media_player.volume_set
|
|
target:
|
|
entity_id: '{{ player }}'
|
|
data:
|
|
volume_level: '{% set c = 0.05 if event == ''rotate_right'' else -0.05
|
|
%} {{ ([ 0, volume + c, 1] | sort)[1] | round(2) }}
|
|
|
|
'
|
|
- alias: MQTT Discovery
|
|
id: mqtt_store_door_states_discovery
|
|
mode: single
|
|
trigger:
|
|
- platform: homeassistant
|
|
event: start
|
|
variables:
|
|
doors:
|
|
- name: Main Door
|
|
identifiers:
|
|
- a8541
|
|
unique_id: main_door_last_opened
|
|
- name: Sliding Door
|
|
identifiers:
|
|
- 59e40
|
|
unique_id: sliding_door_last_opened
|
|
- name: Garage Door
|
|
identifiers:
|
|
- 922c2
|
|
unique_id: front_garage_door_last_opened
|
|
- name: Garage Entry Door
|
|
identifiers:
|
|
- 5ef46
|
|
unique_id: garage_entry_door_last_opened
|
|
- name: Rear Garage Door
|
|
identifiers:
|
|
- 0fff6
|
|
unique_id: rear_garage_door_last_opened
|
|
- name: Passenger Door
|
|
identifiers:
|
|
- 069aa
|
|
unique_id: passenger_door_last_opened
|
|
action:
|
|
- repeat:
|
|
for_each: '{{ doors }}'
|
|
sequence:
|
|
- service: script.mqtt_automated_config
|
|
data:
|
|
domain: sensor
|
|
name: Last Opened
|
|
unique_id: '{{ repeat.item.unique_id }}'
|
|
device_class: timestamp
|
|
device:
|
|
name: '{{ repeat.item.name }}'
|
|
identifiers: '{{ repeat.item.identifiers }}'
|
|
manufacturer: Petro
|
|
model: Virtual Door
|
|
sw_version: '1.0'
|
|
- alias: Notify when Open
|
|
id: notify_on_door_state_change
|
|
mode: parallel
|
|
trigger: &id004
|
|
- platform: state
|
|
entity_id:
|
|
- binary_sensor.main_door
|
|
- binary_sensor.garage_entry_door
|
|
- binary_sensor.sliding_door
|
|
- binary_sensor.front_garage_door
|
|
- binary_sensor.rear_garage_door
|
|
- binary_sensor.passenger_door
|
|
from: 'off'
|
|
to: 'on'
|
|
variables:
|
|
valid: '{{ trigger | default(none) is not none and trigger.to_state is defined
|
|
and trigger.from_state is defined }}
|
|
|
|
'
|
|
source: "{%- if valid %}\n {{ trigger.to_state.entity_id }}\n{%- endif %}\n"
|
|
timestamp: '{{ (datetime | default(now())).isoformat() }}
|
|
|
|
'
|
|
object_id: '{{ source.split(''.'')[-1] }}
|
|
|
|
'
|
|
unique_id: '{{ object_id }}_last_opened
|
|
|
|
'
|
|
count_script: 'script.notify_count_{{ object_id }}
|
|
|
|
'
|
|
sensor: 'sensor.{{ unique_id }}
|
|
|
|
'
|
|
last_opened: '{{ states(sensor) | default('''') }}
|
|
|
|
'
|
|
quiet_window: "{%- set times = {\n 'binary_sensor.main_door': 120,\n 'binary_sensor.garage_entry_door':\
|
|
\ 120,\n 'binary_sensor.sliding_door': 120,\n 'input_boolean.test_door': 10,\n\
|
|
} %} {%- if valid and source in times %}\n {{ times[source] }}\n{%- else %}\n\
|
|
\ 0\n{%- endif %}\n"
|
|
delta: "{%- set last = last_opened | as_datetime %} {%- set current = timestamp\
|
|
\ | as_datetime %} {%- if last and current %}\n {{ (current - last).seconds\
|
|
\ }}\n{%- else %}\n {{ quiet_window + 1 }}\n{%- endif %}\n"
|
|
in_quiet_window: '{{ delta < quiet_window }}
|
|
|
|
'
|
|
count: "{%- if in_quiet_window %}\n {%- set current = state_attr(sensor, 'count')\
|
|
\ %}\n {%- if current is none %}\n 1\n {%- else %}\n {{ current + 1\
|
|
\ }}\n {%- endif %}\n{%- else %}\n 0\n{%- endif %}\n"
|
|
count_timestamp: "{%- if count == 0 %}\n {{ timestamp }}\n{%- else %}\n {{ state_attr(sensor,\
|
|
\ 'count_timestamp') }}\n{%- endif %}\n"
|
|
who: '{{ state_attr(''sensor.people_at_home'', ''or'') }}
|
|
|
|
'
|
|
what: '{{ state_attr(trigger.entity_id, ''friendly_name'') }}
|
|
|
|
'
|
|
condition: &id005
|
|
- condition: template
|
|
value_template: '{{ valid }}'
|
|
action:
|
|
- service: script.mqtt_automated_states
|
|
data:
|
|
domain: sensor
|
|
unique_id: '{{ unique_id }}'
|
|
state: '{{ timestamp }}'
|
|
attributes: '{{ { ''who'': who, ''count'': count, ''source'': source, ''count_timestamp'':
|
|
count_timestamp } | tojson }}'
|
|
- choose:
|
|
- conditions:
|
|
- condition: template
|
|
value_template: '{{ count > 0 }}'
|
|
sequence:
|
|
- service: '{{ count_script }}'
|
|
data:
|
|
door_name: '{{ what }}'
|
|
duration: '{{ quiet_window }}'
|
|
count: '{{ count + 1 }}'
|
|
count_timestamp: '{{ count_timestamp }}'
|
|
default:
|
|
- service: script.notify
|
|
data:
|
|
title: '{{ what }} Opened!'
|
|
message: '{{ who }} used the {{ what }}.
|
|
|
|
'
|
|
- condition: template
|
|
value_template: '{{ who in [''unknown''] }}'
|
|
- wait_for_trigger:
|
|
- platform: template
|
|
value_template: '{{ states(''sensor.people_at_home'') | int(default=0) > 0 }}'
|
|
timeout:
|
|
seconds: 30
|
|
- choose:
|
|
- conditions:
|
|
- condition: template
|
|
value_template: '{%- set current = timestamp | as_datetime %} {{ (now() -
|
|
current).seconds >= 30 if current else False }}
|
|
|
|
'
|
|
sequence:
|
|
- service: script.notify
|
|
data:
|
|
title: '{{ what }} user is still unknown!'
|
|
message: The person who used the {{ what | lower }} is still unknown!
|
|
default:
|
|
- service: script.notify
|
|
data:
|
|
title: Found {{ what }} user!
|
|
message: The person who used the {{ what | lower }} is {{ state_attr('sensor.people_at_home',
|
|
'or') }}!
|
|
- alias: Notify when Open too long.
|
|
id: notify_on_door_ajar
|
|
mode: parallel
|
|
trigger: *id004
|
|
variables:
|
|
valid: '{{ trigger | default(none) is not none and trigger.to_state is defined
|
|
and trigger.from_state is defined }}
|
|
|
|
'
|
|
source: "{%- if valid %}\n {{ trigger.to_state.entity_id }}\n{%- endif %}\n"
|
|
timestamp: '{{ (datetime | default(now())).isoformat() }}
|
|
|
|
'
|
|
duration: "{%- set times = {\n 'binary_sensor.main_door': 90,\n 'binary_sensor.garage_entry_door':\
|
|
\ 90,\n 'binary_sensor.sliding_door': 240,\n 'binary_sensor.front_garage_door':\
|
|
\ 300,\n 'binary_sensor.rear_garage_door': 300,\n 'binary_sensor.passenger_door':\
|
|
\ 90,\n 'input_boolean.test_door': 5,\n} %} {%- if valid and trigger.to_state.entity_id\
|
|
\ in times %}\n {{ times[trigger.to_state.entity_id] }}\n{%- else %} {# default\
|
|
\ to 5 minutes for other doors #}\n 300\n{%- endif %}\n"
|
|
door_name: '{{ state_attr(trigger.entity_id, ''friendly_name'') }}
|
|
|
|
'
|
|
condition: *id005
|
|
action:
|
|
- service: script.notify_if_ajar
|
|
data:
|
|
duration: '{{ duration }}'
|
|
door: '{{ source }}'
|
|
door_name: '{{ door_name }}'
|
|
timestamp: '{{ timestamp }}'
|
|
- alias: Illuminate Door
|
|
id: illuminate_doors_when_open
|
|
mode: parallel
|
|
trigger:
|
|
- platform: state
|
|
entity_id:
|
|
- binary_sensor.main_door
|
|
- binary_sensor.garage_entry_door
|
|
- binary_sensor.sliding_door
|
|
- binary_sensor.server_room_door_contact
|
|
from: 'off'
|
|
to: 'on'
|
|
variables:
|
|
metadata:
|
|
binary_sensor.main_door:
|
|
entities:
|
|
- switch.foyer
|
|
duration: 120
|
|
binary_sensor.garage_entry_door:
|
|
entities:
|
|
- switch.garage_entry
|
|
- switch.garage_cans
|
|
duration: 120
|
|
binary_sensor.sliding_door:
|
|
entities:
|
|
- light.dining_room_chandelier
|
|
duration: 30
|
|
input_boolean.test_door:
|
|
entities:
|
|
- input_boolean.test_switch
|
|
- input_boolean.test_switch_2
|
|
duration: 10
|
|
valid: '{{ trigger | default(none) is not none and trigger.to_state is defined
|
|
and trigger.from_state is defined }}
|
|
|
|
'
|
|
source: "{%- if valid %}\n {{ trigger.to_state.entity_id }}\n{%- endif %}\n"
|
|
timestamp: '{{ (datetime | default(now())).isoformat() }}
|
|
|
|
'
|
|
object_id: '{{ source.split(''.'')[-1] }}
|
|
|
|
'
|
|
sensor: 'sensor.{{ object_id }}_last_opened
|
|
|
|
'
|
|
script: 'script.resume_{{ object_id }}
|
|
|
|
'
|
|
last_opened: '{{ states(sensor) | default('''') }}
|
|
|
|
'
|
|
current: "{%- if valid and source in metadata %}\n {{ metadata[source] }}\n{%-\
|
|
\ endif %}\n"
|
|
snapshot_entities: '{{ current.entities | default([]) }}
|
|
|
|
'
|
|
action_data: "{%- macro kvp(k, v) %}{{ '\"{}\"'.format(k) }}: {{ '\"{}\"'.format(v)\
|
|
\ if v is string and not (v.startswith('{') or v.startswith('['))else v }}{%\
|
|
\ endmacro %} {%- macro coll(item, t='curly') %}{{ '{}{}{}'.format('{' if t\
|
|
\ == 'curly' else '[',item | join(', ') if item is iterable and item is not\
|
|
\ string else item, '}' if t == 'curly' else ']') }}{% endmacro %} {%- set ns\
|
|
\ = namespace(entities=[], scene_ids=[], scripts=[]) %} {%- set brightness =\
|
|
\ current.brightness | default(255) %} {%- for entity in snapshot_entities %}\n\
|
|
\ {%- set ns.scripts = ns.scripts + [ '\"script.resume_{}\"'.format(entity.replace('.','_'))]\
|
|
\ %}\n {%- set ns.scene_ids = ns.scene_ids + [ '\"{}\"'.format(entity.replace('.','_'))]\
|
|
\ %}\n {%- if entity.startswith('light.') %}\n {%- set ret = [kvp('state',\
|
|
\ 'on'), kvp('brightness', brightness)] %}\n {%- else %}\n {%- set ret =\
|
|
\ kvp('state', 'on') %}\n {%- endif %}\n {%- set ns.entities = ns.entities\
|
|
\ + [ kvp(entity, coll(ret)) ] %}\n{%- endfor %} {%- set ret = [ kvp('entities',\
|
|
\ coll(ns.entities | join(','))), kvp('scripts', coll(ns.scripts | join(','),\
|
|
\ 'list')), kvp('scene_ids', coll(ns.scene_ids | join(','), 'list'))] %} {{\
|
|
\ coll(ret) }}\n"
|
|
duration: '{{ current.duration | default(0)}}
|
|
|
|
'
|
|
delta: "{%- set last = last_opened | as_datetime %} {%- set current = timestamp\
|
|
\ | as_datetime %} {%- if last and current %}\n {{ (current - last).seconds\
|
|
\ }}\n{%- else %}\n {{ duration + 1 }}\n{%- endif %}\n"
|
|
in_duration: '{{ delta < duration }}
|
|
|
|
'
|
|
condition: &id006
|
|
- condition: template
|
|
value_template: '{{ valid }}'
|
|
- condition: or
|
|
conditions:
|
|
- condition: state
|
|
entity_id: sun.sun
|
|
state: below_horizon
|
|
- condition: numeric_state
|
|
entity_id: sensor.garage_luminance
|
|
below: 11
|
|
action:
|
|
- choose:
|
|
- conditions:
|
|
- condition: template
|
|
value_template: '{{ not in_duration }}'
|
|
sequence:
|
|
- repeat:
|
|
count: '{{ action_data.scene_ids | length }}'
|
|
sequence:
|
|
- service: scene.create
|
|
data:
|
|
scene_id: '{{ action_data.scene_ids[repeat.index - 1] }}'
|
|
snapshot_entities: '{{ snapshot_entities[repeat.index - 1] }}'
|
|
- service: scene.apply
|
|
data:
|
|
entities: '{{ action_data.entities }}'
|
|
- wait_template: '{{ is_state(source, ''off'') }}'
|
|
- repeat:
|
|
count: '{{ action_data.scripts | length }}'
|
|
sequence:
|
|
- event: illuminate_door
|
|
event_data:
|
|
service: '{{ action_data.scripts[repeat.index - 1] }}'
|
|
duration: '{{ duration }}'
|
|
scene_id: '{{ action_data.scene_ids[repeat.index - 1] }}'
|
|
- alias: Illuminate Event Handler
|
|
id: illuminate_door_event_handler
|
|
mode: parallel
|
|
trigger:
|
|
- platform: event
|
|
event_type: illuminate_door
|
|
variables:
|
|
data: '{{ trigger.event.data | default({}) }}
|
|
|
|
'
|
|
service: '{{ data.service | default }}
|
|
|
|
'
|
|
duration: '{{ data.duration | default }}
|
|
|
|
'
|
|
scene_id: '{{ data.scene_id | default }}
|
|
|
|
'
|
|
valid: '{{ true if service and duration and scene_id else false }}
|
|
|
|
'
|
|
condition: *id006
|
|
action:
|
|
- service: '{{ service }}'
|
|
data:
|
|
duration: '{{ duration }}'
|
|
scene_id: '{{ scene_id }}'
|
|
- alias: Cancel Scheduled Resume State
|
|
id: cancel_scheduled_resume_state
|
|
mode: parallel
|
|
trigger:
|
|
- platform: state
|
|
entity_id:
|
|
- switch.foyer
|
|
- switch.garage_entry
|
|
- switch.garage_cans
|
|
- light.dining_room_chandelier
|
|
variables:
|
|
valid: '{{ trigger | default(none) is not none and trigger.to_state is defined
|
|
and trigger.from_state is defined }}
|
|
|
|
'
|
|
source: "{%- if valid %}\n {{ trigger.to_state.entity_id }}\n{%- endif %}\n"
|
|
script: '{{ ''script.resume_{}''.format(source.replace(''.'',''_'')) }}
|
|
|
|
'
|
|
condition: *id006
|
|
action:
|
|
- service: script.turn_off
|
|
target:
|
|
entity_id: '{{ script }}'
|
|
- alias: Illuminate Server Room
|
|
id: illuminate_server_room
|
|
mode: parallel
|
|
trigger:
|
|
- platform: state
|
|
entity_id: binary_sensor.server_room_door_contact
|
|
variables:
|
|
continue: '{{ trigger | default(none) is not none and trigger.to_state is defined
|
|
and trigger.from_state is defined }}
|
|
|
|
'
|
|
to_state: '{{ trigger.to_state.state | default('''') if continue else '''' }}
|
|
|
|
'
|
|
condition:
|
|
- condition: template
|
|
value_template: '{{ continue and to_state in [''on'',''off''] }}'
|
|
action:
|
|
- service: switch.turn_{{ to_state }}
|
|
target:
|
|
entity_id:
|
|
- switch.server_room_switch
|
|
- alias: Notify
|
|
id: announce_and_notify_on_doorbell_press
|
|
mode: parallel
|
|
trigger:
|
|
- platform: state
|
|
entity_id:
|
|
- binary_sensor.doorbell_chime
|
|
to: 'on'
|
|
from: 'off'
|
|
variables:
|
|
valid: '{{ trigger | default(none) is not none and trigger.to_state is defined
|
|
and trigger.from_state is defined }}
|
|
|
|
'
|
|
timeout: "{%- if valid %}\n {{ as_timestamp(trigger.to_state.last_changed, 0)\
|
|
\ - as_timestamp(trigger.from_state.last_changed, 0) }}\n{% endif %}\n"
|
|
continue: '{{ timeout and timeout > 15 }}
|
|
|
|
'
|
|
condition:
|
|
- condition: template
|
|
value_template: '{{ continue }}'
|
|
action:
|
|
- service: script.notify
|
|
data:
|
|
title: Door Bell!
|
|
message: Door Bell!
|
|
- alias: Suppress Chime
|
|
id: suppress_doorbell_chime
|
|
mode: single
|
|
trigger:
|
|
- platform: state
|
|
entity_id:
|
|
- binary_sensor.doorbell_chime
|
|
to: 'on'
|
|
from: 'off'
|
|
action:
|
|
- service: switch.turn_off
|
|
target:
|
|
entity_id: switch.doorbell_chime_active
|
|
- delay: 00:00:15
|
|
- service: switch.turn_on
|
|
target:
|
|
entity_id: switch.doorbell_chime_active
|
|
- alias: MQTT Discovery
|
|
id: mqtt_store_drink_states_discovery
|
|
mode: single
|
|
trigger:
|
|
- platform: homeassistant
|
|
event: start
|
|
variables:
|
|
root: homeassistant
|
|
milliliter: 0.20288414
|
|
teaspoon: 1
|
|
tablespoon: 3
|
|
ounce: 6
|
|
shot: 9
|
|
quarter: 12
|
|
third: 16
|
|
half: 24
|
|
two_thirds: 32
|
|
three_forths: 36
|
|
cup: 48
|
|
drinks:
|
|
- name: Soco Manhattan
|
|
id: soco_manhattan
|
|
image: /local/images/manhattan.png
|
|
parts:
|
|
- name: Southern Comfort
|
|
type: parts
|
|
count: '{{ 3 * ounce }}'
|
|
- name: Sweet Vermouth
|
|
type: parts
|
|
count: '{{ ounce }}'
|
|
- name: Angostura Bitters
|
|
type: dash
|
|
- name: Cherry
|
|
type: garnish
|
|
- name: Smoke Rings
|
|
id: smoke_rings
|
|
image: /local/images/smoke_rings.png
|
|
parts:
|
|
- name: Rittenhouse Rye Whiskey
|
|
type: parts
|
|
count: '{{ 3 * ounce }}'
|
|
- name: Sweet Vermouth
|
|
type: parts
|
|
count: '{{ ounce }}'
|
|
- name: Angostura Bitters
|
|
type: dash
|
|
- name: Hickory Smoke
|
|
type: garnish
|
|
- name: Maple Syrup
|
|
type: parts
|
|
count: '{{ teaspoon }}'
|
|
- name: Old Fashioned
|
|
id: old_fashio
|
|
image: /local/images/old_fashioned.png
|
|
parts:
|
|
- name: Rye Whiskey or Bourbon
|
|
type: parts
|
|
count: '{{ 3 * shot }}'
|
|
- name: Cherry Juice
|
|
type: parts
|
|
count: '{{ 1/2 * shot }}'
|
|
- name: Club Soda
|
|
type: parts
|
|
count: '{{ 1/2 * shot }}'
|
|
- name: Angostura Bitters
|
|
type: dash
|
|
- name: Orance Slice
|
|
type: garnish
|
|
- name: 3 Cherries
|
|
type: garnish
|
|
- name: Mango Habanero Margarita
|
|
id: mango_habanero
|
|
image: /local/images/spicy_margarita.png
|
|
parts:
|
|
- name: Habanero Tequila
|
|
type: parts
|
|
count: '{{ quarter }}'
|
|
- name: Naked Mango
|
|
type: parts
|
|
count: '{{ cup }}'
|
|
- name: Cointreau Orange Liqueur
|
|
type: parts
|
|
count: '{{ 2 * tablespoon }}'
|
|
- name: Lime Juice
|
|
type: parts
|
|
count: '{{ tablespoon }}'
|
|
- name: Apple Cider Margarita
|
|
id: apple_cider_margarita
|
|
image: /local/images/apple_cider_margarita.png
|
|
parts:
|
|
- name: Cinnamon Tequila
|
|
type: parts
|
|
count: '{{ quarter }}'
|
|
- name: Cider
|
|
type: parts
|
|
count: '{{ cup }}'
|
|
- name: Cointreau Orange Liqueur
|
|
type: parts
|
|
count: '{{ ounce }}'
|
|
- name: Simple Syrup
|
|
type: parts
|
|
count: '{{ ounce }}'
|
|
- name: Cosmopolitan
|
|
id: cosmopolitan
|
|
image: /local/images/apple_cider_margarita.png
|
|
parts:
|
|
- name: Vodka
|
|
type: parts
|
|
count: '{{ 2 * shot }}'
|
|
- name: Cranberry
|
|
type: parts
|
|
count: '{{ 2 * shot }}'
|
|
- name: Triple Sec
|
|
type: parts
|
|
count: '{{ shot }}'
|
|
- name: Lime Juice
|
|
type: parts
|
|
count: '{{ shot }}'
|
|
action:
|
|
- service: script.mqtt_automated_config
|
|
data:
|
|
domain: sensor
|
|
unique_id: drinks_config
|
|
- service: script.mqtt_automated_states
|
|
data:
|
|
domain: sensor
|
|
unique_id: drinks_config
|
|
state: '{{ drinks | count }}'
|
|
attributes: "{{ {\n 'drinks': drinks\n} }}\n"
|
|
- service: mqtt.publish
|
|
data: "{% set command_template = \"{% set drinks = \" ~ drinks ~ \"%}{% set drink\
|
|
\ = drinks | selectattr('name', 'eq', value) | first | default(drinks[0]) %}{{\
|
|
\ drink | to_json }}\" %} {% set options = drinks | map(attribute='name') |\
|
|
\ list %} {{\n {\n 'topic': root ~ '/select/drinks/config',\n 'payload':\
|
|
\ {\n 'name': 'Drink',\n 'unique_id': 'drink_selector',\n\
|
|
\ 'object_id': 'drink',\n 'state_topic': root ~ '/select/drinks/state',\n\
|
|
\ 'value_template': '{{ value_json.name }}',\n 'command_topic':\
|
|
\ root ~ '/select/drinks/state',\n 'command_template': command_template,\n\
|
|
\ 'json_attributes_topic': root ~ '/select/drinks/state',\n \
|
|
\ 'json_attributes_template': '{{ {\"parts\": value_json.parts, \"image\"\
|
|
: value_json.image} | tojson }}',\n 'value_template': \"{{ value_json.name\
|
|
\ }}\",\n 'options': options,\n 'retain': True,\n }\
|
|
\ | to_json,\n 'retain': True,\n }\n}}\n"
|
|
- alias: MQTT Discovery
|
|
id: mqtt_store_echo_states_discovery
|
|
mode: single
|
|
trigger:
|
|
- platform: homeassistant
|
|
event: start
|
|
action:
|
|
- service: script.mqtt_automated_config
|
|
data:
|
|
domain: sensor
|
|
unique_id: alexa_last_tts
|
|
device_class: timestamp
|
|
- alias: Events - Milestone Notifications
|
|
id: event_milestone_notifications
|
|
trigger:
|
|
- platform: time
|
|
at: '10:00:00'
|
|
- platform: time
|
|
at: '15:30:00'
|
|
- platform: time
|
|
at: '19:00:00'
|
|
variables:
|
|
target_date: '{{ today_at().date() | string }}
|
|
|
|
'
|
|
events: '{{ state_attr(''binary_sensor.personal_events'', ''events'') | selectattr(''when'',
|
|
''eq'', target_date) | list }}
|
|
|
|
'
|
|
condition:
|
|
- condition: state
|
|
entity_id: binary_sensor.personal_events
|
|
state: 'on'
|
|
action:
|
|
- repeat:
|
|
for_each: '{{ events }}'
|
|
sequence:
|
|
- service: script.notify
|
|
data:
|
|
message: 'Today is {{ repeat.item.who }}s {{ repeat.item.event }}!
|
|
|
|
'
|
|
- alias: Events - Milestone Reminders
|
|
id: event_milestone_reminders
|
|
trigger:
|
|
- platform: time
|
|
at: '10:00:00'
|
|
- platform: time
|
|
at: '15:30:00'
|
|
- platform: time
|
|
at: '19:00:00'
|
|
variables:
|
|
target_dates: '{% set ns = namespace(dates=[]) %} {%- for offset in [30, 14, 7]
|
|
%} {%- set ns.dates = ns.dates + [(today_at() + timedelta(days=offset)).date()
|
|
| string] %} {%- endfor %} {{ ns.dates }}
|
|
|
|
'
|
|
events: '{{ state_attr(''binary_sensor.personal_events'', ''events'') | selectattr(''when'',
|
|
''in'', target_dates) | selectattr(''who'', ''search'', ''Mike|Lindsay'') |
|
|
list }}
|
|
|
|
'
|
|
condition:
|
|
- condition: template
|
|
value_template: '{{ events | count > 0 }}'
|
|
action:
|
|
- repeat:
|
|
for_each: '{{ events }}'
|
|
sequence:
|
|
- service: script.notify
|
|
data:
|
|
message: '{{ repeat.item.who }}s {{ repeat.item.event }} is in {{ repeat.item.days_away
|
|
}} day{{ ''s'' if repeat.item.days_away > 1 else '''' }}!
|
|
|
|
'
|
|
- alias: Events - Calendar Reminders
|
|
id: event_calendar_reminders
|
|
trigger:
|
|
- platform: time
|
|
at: '19:00:00'
|
|
action:
|
|
- service: script.events
|
|
- alias: Events - Forward Reload Templates
|
|
id: reload_templates
|
|
trigger:
|
|
- platform: event
|
|
event_type: event_template_reloaded
|
|
action:
|
|
- delay: 00:00:01
|
|
- event: templates_reloaded
|
|
event_data: {}
|
|
- alias: Turn On Livingroom lights with Activities
|
|
id: turn_on_livingroom_lights_with_harmony_activities
|
|
trigger:
|
|
- platform: state
|
|
entity_id:
|
|
- switch.xbox_one
|
|
- switch.playstation
|
|
- switch.roku
|
|
- switch.switch
|
|
- switch.tv
|
|
to: 'on'
|
|
from: 'off'
|
|
condition:
|
|
- condition: state
|
|
entity_id: sun.sun
|
|
state: below_horizon
|
|
action:
|
|
- service: homeassistant.turn_on
|
|
target:
|
|
entity_id:
|
|
- light.living_room
|
|
- switch.hyperion_usb_capture
|
|
- alias: Turn Off Hyperion with Activities
|
|
id: turn_off_hyperion_lights_with_harmony_activities
|
|
trigger:
|
|
- platform: template
|
|
value_template: '{{ is_state_attr(''remote.living_room'', ''current_activity'',
|
|
''PowerOff'') }}'
|
|
condition:
|
|
- condition: state
|
|
entity_id: sun.sun
|
|
state: below_horizon
|
|
action:
|
|
- service: switch.turn_off
|
|
target:
|
|
entity_id: switch.hyperion_usb_capture
|
|
- alias: Give ChromeCast control to remote using emulated roku
|
|
id: harmony_give_chromecast_control_to_remote_using_emulated_roku
|
|
mode: restart
|
|
trigger:
|
|
- platform: event
|
|
event_type: roku_command
|
|
event_data:
|
|
source_name: Home Assistant
|
|
variables:
|
|
target: media_player.chromecast
|
|
jump_in_seconds: 10
|
|
key: '{{ trigger.event.data.key | default("NoPress") }}
|
|
|
|
'
|
|
keys:
|
|
- Play
|
|
- Rev
|
|
- Fwd
|
|
play_pause: '{{ key == ''Play'' }}'
|
|
rev: '{{ key == ''Rev'' }}'
|
|
fwd: '{{ key == ''Fwd'' }}'
|
|
rev_fwd: '{{ fwd or rev }}'
|
|
condition:
|
|
- condition: template
|
|
value_template: '{{ states(target) in [''playing'', ''paused''] and key != ''NoPress''
|
|
}}
|
|
|
|
'
|
|
action:
|
|
- choose:
|
|
- conditions:
|
|
- condition: template
|
|
value_template: '{{ play_pause }}'
|
|
sequence:
|
|
- service: media_player.media_play_pause
|
|
target:
|
|
entity_id: '{{ target }}'
|
|
- conditions:
|
|
- condition: template
|
|
value_template: '{{ rev_fwd }}'
|
|
sequence:
|
|
- service: media_player.media_seek
|
|
target:
|
|
entity_id: '{{ target }}'
|
|
data:
|
|
seek_position: "{%- set current = state_attr(target, 'media_position') |\
|
|
\ default(0) %} {%- set total = state_attr(target, 'media_duration') |\
|
|
\ default(0) %} {%- set dir = 1 if fwd else -1 %} {%- set next = current\
|
|
\ + jump_in_seconds * dir %} {%- if fwd %}\n {{ total if next >= total\
|
|
\ else next }}\n{%- else %}\n {{ 0 if next <= 0 else next }}\n{%- endif\
|
|
\ %}\n "
|
|
- alias: Timed Event - Holiday Lights
|
|
id: indoor_holiday_lights
|
|
mode: parallel
|
|
trigger:
|
|
- id: indoor
|
|
platform: state
|
|
entity_id: binary_sensor.indoor_holiday
|
|
not_from:
|
|
- unknown
|
|
- unavailable
|
|
- id: outdoor_on
|
|
platform: sun
|
|
event: sunset
|
|
- id: outdoor_off
|
|
platform: sun
|
|
event: sunrise
|
|
variables:
|
|
continue: "{% if trigger.platform == 'state' %}\n {{ trigger | default(none)\
|
|
\ is not none and trigger.to_state is defined and trigger.from_state is defined\
|
|
\ }}\n{% else %}\n True\n{% endif %}\n"
|
|
to_state: "{% if trigger.platform == 'state' %}\n {{ trigger.to_state.state |\
|
|
\ default if continue else None }}\n{% else %}\n {{ trigger.id.split('_')[-1]\
|
|
\ }}\n{% endif %}\n"
|
|
indoor:
|
|
- switch.indoor_holiday
|
|
outdoor: []
|
|
target: '{{ indoor if trigger.id == ''indoor'' else outdoor }}
|
|
|
|
'
|
|
condition:
|
|
- condition: template
|
|
value_template: '{{ target | count > 0 and continue and to_state in [''on'',''off'']
|
|
}}'
|
|
action:
|
|
- service: switch.turn_{{ to_state }}
|
|
target:
|
|
entity_id: '{{ target }}'
|
|
- alias: Turn on fan when bathroom humidity is high.
|
|
id: bathroom_turn_on_fan_when_humidity_is_high
|
|
mode: restart
|
|
trigger:
|
|
- platform: state
|
|
entity_id: binary_sensor.master_bathroom_humidity_status
|
|
variables:
|
|
check: '{{ trigger | default(none) is not none and trigger.to_state is defined
|
|
and trigger.from_state is defined }}
|
|
|
|
'
|
|
continue: '{%- set valid = [''on'', ''off''] %} {{ check and trigger.to_state.state
|
|
in valid and trigger.from_state.state in valid }}
|
|
|
|
'
|
|
service: 'switch.turn_{{ trigger.to_state.state if continue else none }}
|
|
|
|
'
|
|
add_delay: '{{ trigger.to_state.state == ''off'' if continue else False }}
|
|
|
|
'
|
|
condition:
|
|
- condition: template
|
|
value_template: '{{ continue }}'
|
|
action:
|
|
- choose:
|
|
- conditions: '{{ add_delay }}'
|
|
sequence:
|
|
- delay: 00:20:00
|
|
- service: '{{ service }}'
|
|
target:
|
|
entity_id: switch.master_bathroom_fan
|
|
- delay:
|
|
seconds: 1
|
|
- alias: Notify when basement humidity is high
|
|
id: basement_notify_when_humidity_is_high
|
|
mode: parallel
|
|
trigger:
|
|
- id: 2 hours
|
|
platform: state
|
|
entity_id: binary_sensor.basement_humidity_high
|
|
to: 'on'
|
|
for:
|
|
hours: 2
|
|
- id: 10 hours
|
|
platform: state
|
|
entity_id: binary_sensor.basement_humidity_high
|
|
to: 'on'
|
|
for:
|
|
hours: 10
|
|
action:
|
|
- service: script.notify
|
|
data:
|
|
title: Basement humidity has been high for {{ trigger.id }}.
|
|
message: Basement humidity has been high for {{ trigger.id }}.
|
|
- alias: Execute Effects
|
|
id: hyperion_execute_effects
|
|
mode: restart
|
|
trigger:
|
|
- platform: state
|
|
entity_id:
|
|
- input_number.hyperion_brightness
|
|
- input_select.hyperion_effects
|
|
variables:
|
|
valid: "{{ trigger.from_state is defined and trigger.from_state is not none \n\
|
|
\ and trigger.to_state is defined and trigger.to_state is not none \n and\
|
|
\ trigger.from_state.state != trigger.to_state.state }}\n"
|
|
source: '{{ trigger.to_state.entity_id }}
|
|
|
|
'
|
|
target: light.gpio_18_tv
|
|
brightness: "{%- if source == 'input_number.hyperion_brightness' %}\n {{ trigger.to_state.state\
|
|
\ }}\n{%- else %}\n {{ states('input_number.hyperion_brightness') }}\n{%- endif\
|
|
\ %}\n"
|
|
effect: "{%- if source == 'input_select.hyperion_effects' %}\n {{ trigger.to_state.state\
|
|
\ }}\n{%- else %}\n {{ states('input_select.hyperion_effects') }}\n{%- endif\
|
|
\ %}\n"
|
|
condition:
|
|
- condition: template
|
|
value_template: '{{ valid }}'
|
|
action:
|
|
- service: light.turn_on
|
|
target:
|
|
entity_id: '{{ target }}'
|
|
data:
|
|
brightness: '{{ brightness }}'
|
|
effect: '{{ effect }}'
|
|
- alias: MQTT Discovery
|
|
id: aafa91b8-a2e2-4df2-9412-536288327566
|
|
mode: single
|
|
trigger:
|
|
- platform: homeassistant
|
|
event: start
|
|
action:
|
|
- service: script.turn_on
|
|
target:
|
|
entity_id: script.irrigation_mqtt_discovery
|
|
- alias: Set Next Irrigation
|
|
id: 54f20352-b2ba-44d7-80f5-44ada2469dbc
|
|
mode: restart
|
|
trigger:
|
|
- platform: homeassistant
|
|
event: start
|
|
- platform: time
|
|
at: 00:00:00
|
|
- platform: state
|
|
entity_id:
|
|
- input_datetime.irrigation_program_start
|
|
- switch.back_yard_status
|
|
- switch.front_yard_status
|
|
- number.back_yard_day_cycle
|
|
- number.front_yard_day_cycle
|
|
- switch.rain_bird_sprinkler_1_status
|
|
- switch.rain_bird_sprinkler_2_status
|
|
- switch.rain_bird_sprinkler_3_status
|
|
- switch.rain_bird_sprinkler_5_status
|
|
- switch.rain_bird_sprinkler_6_status
|
|
- switch.rain_bird_sprinkler_7_status
|
|
- switch.rain_bird_sprinkler_8_status
|
|
- number.rain_bird_sprinkler_1_program_duration
|
|
- number.rain_bird_sprinkler_2_program_duration
|
|
- number.rain_bird_sprinkler_3_program_duration
|
|
- number.rain_bird_sprinkler_5_program_duration
|
|
- number.rain_bird_sprinkler_6_program_duration
|
|
- number.rain_bird_sprinkler_7_program_duration
|
|
- number.rain_bird_sprinkler_8_program_duration
|
|
action:
|
|
- service: script.get_next_irrigations
|
|
response_variable: irrigations
|
|
- condition: template
|
|
value_template: '{{ irrigations.zones | count > 0 }}'
|
|
- repeat:
|
|
for_each: '{{ irrigations.zones }}'
|
|
sequence:
|
|
- service: script.mqtt_automated_states
|
|
data:
|
|
domain: sensor
|
|
unique_id: '{{ repeat.item.zone_next_run_id }}'
|
|
state: '{{ repeat.item.zone_next_run }}'
|
|
- alias: Start Irrigation Cycle
|
|
id: 1c67152d-d153-41a9-b5a7-78ce036fecbf
|
|
mode: single
|
|
trigger:
|
|
- platform: time
|
|
at: &id007
|
|
- sensor.rain_bird_sprinkler_1_start
|
|
- sensor.rain_bird_sprinkler_2_start
|
|
- sensor.rain_bird_sprinkler_3_start
|
|
- sensor.rain_bird_sprinkler_5_start
|
|
- sensor.rain_bird_sprinkler_6_start
|
|
- sensor.rain_bird_sprinkler_7_start
|
|
- sensor.rain_bird_sprinkler_8_start
|
|
variables:
|
|
entities: *id007
|
|
trigger_time: '{{ trigger.now.astimezone(utcnow().tzinfo).replace(second=0, microsecond=0).isoformat()
|
|
}}
|
|
|
|
'
|
|
start: '{{ entities | select(''is_state'', trigger_time) | first | default }}
|
|
|
|
'
|
|
object_id: '{{ start | regex_findall(''sensor.(.*)_start'') | first }}
|
|
|
|
'
|
|
switch: switch.{{ object_id }}
|
|
number: number.{{ object_id }}_program_duration
|
|
last_run_unique_id: '{% set identifier = device_attr(''sensor.{0}_last_run''.format(object_id),
|
|
''identifiers'') | list | first | last %} {{ identifier | slugify | replace(''_'',
|
|
'''') ~ ''lr'' }}
|
|
|
|
'
|
|
last_run_attributes: '{{ dict(by=''irrigation'' if is_state(''binary_sensor.rain_bird_controller_rainsensor'',
|
|
''off'') else ''rain'') }}
|
|
|
|
'
|
|
duration: '{{ states(number) | int(0) }}
|
|
|
|
'
|
|
condition:
|
|
- condition: template
|
|
value_template: '{{ duration > 0 }}'
|
|
action:
|
|
- service: script.mqtt_automated_states
|
|
data:
|
|
domain: sensor
|
|
unique_id: '{{ last_run_unique_id }}'
|
|
state: '{{ trigger_time }}'
|
|
attributes: '{{ last_run_attributes }}'
|
|
- if: '{{ is_state(''binary_sensor.rain_bird_controller_rainsensor'', ''off'') }}'
|
|
then:
|
|
- service: rainbird.start_irrigation
|
|
data:
|
|
entity_id: '{{ switch }}'
|
|
duration: '{{ duration }}'
|
|
- alias: Check Rain Today
|
|
id: a9040111-cd2f-4dd4-9a6b-518bfa2e90e9
|
|
mode: restart
|
|
triggers:
|
|
- trigger: time
|
|
at:
|
|
- entity_id: input_datetime.irrigation_program_start
|
|
offset: -00:01:00
|
|
variables:
|
|
trigger_time: '{{ trigger.now.astimezone(utcnow().tzinfo).replace(second=0, microsecond=0).isoformat()
|
|
}}
|
|
|
|
'
|
|
conditions:
|
|
- condition: state
|
|
entity_id: binary_sensor.rain_bird_controller_rainsensor
|
|
state: 'on'
|
|
- condition: state
|
|
entity_id: binary_sensor.irrigation_season
|
|
state: 'on'
|
|
actions:
|
|
- action: script.set_last_irrigation
|
|
data:
|
|
time: '{{ (trigger_time | as_datetime).time() }}'
|
|
date: '{{ (trigger_time | as_datetime).date() }}'
|
|
switches: '{{ integration_entities(''rainbird'') | select(''match'', ''^switch.'')
|
|
| list }}'
|
|
reason: rain
|
|
- alias: Valve Reminders
|
|
id: 33596fc1-7dbf-4837-a589-953f2d5d072a
|
|
trigger:
|
|
- platform: time
|
|
at: '10:00:00'
|
|
- platform: time
|
|
at: '15:30:00'
|
|
- platform: time
|
|
at: '19:00:00'
|
|
variables:
|
|
target_dates: '{% set ns = namespace(dates=[]) %} {%- for offset in [7, 1] %}
|
|
{%- set ns.dates = ns.dates + [(today_at() + timedelta(days=offset)).date()
|
|
| string] %} {%- endfor %} {{ ns.dates }}
|
|
|
|
'
|
|
entities:
|
|
- sensor.irrigation_season_start
|
|
- sensor.irrigation_season_end
|
|
events: "{%- from 'easy_time.jinja' import speak_the_days %} {%- set phrase =\
|
|
\ 'Turn o{} the water irrigation shutoff value{}{}' %} {%- set ns = namespace(items=[])\
|
|
\ %} {%- for e in entities %}\n {%- set dt = states(e) | as_datetime %}\n \
|
|
\ {%- set date = dt.date() | string %}\n {%- set name = state_attr(e, 'friendly_name')\
|
|
\ %}\n {%- set p = 'n' if 'Start' in name else 'ff' %}\n {%- set f = speak_the_days(dt)\
|
|
\ %}\n {%- set m = ' ' if 'in' in f else ' before ' %}\n {%- set ns.items\
|
|
\ = ns.items + [\n dict(\n title=name,\n when=date,\n message=phrase.format(p,\
|
|
\ m, f)\n )\n ] -%}\n{%- endfor %} {{ ns.items }}\n"
|
|
event: '{{ events | selectattr(''when'', ''in'', target_dates) | list | first
|
|
| default(None) }}
|
|
|
|
'
|
|
condition:
|
|
- condition: template
|
|
value_template: '{{ event is not none }}'
|
|
action:
|
|
- service: script.notify
|
|
data:
|
|
title: '{{ event.title }}'
|
|
message: '{{ event.message }}'
|
|
- alias: Garage position indicator
|
|
id: laser_position_indicator_automation
|
|
mode: parallel
|
|
trigger:
|
|
- platform: state
|
|
entity_id:
|
|
- binary_sensor.front_garage_door
|
|
variables:
|
|
laser: switch.garage_ceiling_outlet
|
|
valid: '{{ trigger | default(none) is not none and trigger.to_state is defined
|
|
and trigger.from_state is defined }}
|
|
|
|
'
|
|
is_on: '{{ trigger.to_state.state == ''on'' and trigger.from_state.state == ''off''
|
|
}}
|
|
|
|
'
|
|
is_off: '{{ trigger.to_state.state == ''off'' and trigger.from_state.state ==
|
|
''on'' }}
|
|
|
|
'
|
|
continue: '{{ valid and (is_on or is_off) }}
|
|
|
|
'
|
|
is_laser_on: '{{ is_state(laser, ''on'') }}
|
|
|
|
'
|
|
condition:
|
|
- condition: template
|
|
value_template: '{{ continue }}'
|
|
action:
|
|
- choose:
|
|
- conditions:
|
|
- condition: template
|
|
value_template: '{{ is_on }}'
|
|
sequence:
|
|
- service: script.turn_off
|
|
target:
|
|
entity_id: script.laser_position_timer
|
|
- choose:
|
|
- conditions:
|
|
- condition: template
|
|
value_template: '{{ not is_laser_on }}'
|
|
sequence:
|
|
- service: switch.turn_on
|
|
target:
|
|
entity_id: '{{ laser }}'
|
|
- service: script.laser_position_timer
|
|
- conditions:
|
|
- condition: template
|
|
value_template: '{{ is_off }}'
|
|
sequence:
|
|
- choose:
|
|
- conditions:
|
|
- condition: template
|
|
value_template: '{{ is_laser_on }}'
|
|
sequence:
|
|
- service: script.turn_off
|
|
target:
|
|
entity_id: script.laser_position_timer
|
|
- service: switch.turn_off
|
|
target:
|
|
entity_id: '{{ laser }}'
|
|
- alias: Notify
|
|
id: announce_dryer_when_complete
|
|
mode: parallel
|
|
trigger:
|
|
- platform: state
|
|
entity_id:
|
|
- binary_sensor.dryer_status
|
|
- binary_sensor.washer
|
|
to: 'off'
|
|
from: 'on'
|
|
variables:
|
|
valid: '{{ trigger | default(none) is not none and trigger.to_state is defined
|
|
and trigger.from_state is defined }}
|
|
|
|
'
|
|
timeout: "{%- if valid %}\n {{ as_timestamp(trigger.to_state.last_changed, 0)\
|
|
\ - as_timestamp(trigger.from_state.last_changed, 0) }}\n{% endif %}\n"
|
|
continue: '{{ timeout and timeout > 15 }}
|
|
|
|
'
|
|
name: '{{ trigger.to_state.name.split('' '')[0] if valid else ''Unknown'' }}
|
|
|
|
'
|
|
announce: '{{ name.lower() if name != ''Unkonwn'' else none }}
|
|
|
|
'
|
|
condition:
|
|
- condition: template
|
|
value_template: '{{ continue and announce is not none }}'
|
|
action:
|
|
- event: announce_energy
|
|
event_data:
|
|
machine: '{{ announce }}'
|
|
- service: script.notify
|
|
data:
|
|
title: '{{ name }} is finished!'
|
|
message: '{{ name }} is finished!'
|
|
- alias: Booleans
|
|
id: washer_and_dryer_booleans
|
|
mode: parallel
|
|
trigger:
|
|
- platform: state
|
|
entity_id:
|
|
- sensor.dryer_power
|
|
- sensor.washer_power
|
|
variables:
|
|
config:
|
|
sensor.washer_power:
|
|
input_boolean: input_boolean.washer
|
|
threshold: 80
|
|
sensor.dryer_power:
|
|
input_boolean: input_boolean.dryer
|
|
threshold: 150
|
|
valid: '{{ trigger | default(none) is not none and trigger.to_state is defined
|
|
and trigger.from_state is defined }}
|
|
|
|
'
|
|
current: '{{ config.get(trigger.entity_id) }}
|
|
|
|
'
|
|
have_current: '{{ current is not none }}
|
|
|
|
'
|
|
number: '{{ trigger.to_state.state if valid and is_number(trigger.to_state.state)
|
|
else none }}
|
|
|
|
'
|
|
have_number: '{{ number is not none }}
|
|
|
|
'
|
|
disposition: '{{ number > current.threshold if have_current and have_number else
|
|
none }}
|
|
|
|
'
|
|
service_target: '{{ current.input_boolean if have_current else none }}
|
|
|
|
'
|
|
service_call: 'homeassistant.turn_o{{ ''n'' if disposition else ''ff'' }}
|
|
|
|
'
|
|
continue: '{{ valid and disposition is not none }}
|
|
|
|
'
|
|
condition:
|
|
- condition: template
|
|
value_template: '{{ continue }}'
|
|
action:
|
|
- service: '{{ service_call }}'
|
|
target:
|
|
entity_id: '{{ service_target }}'
|
|
- alias: Cycle Counter
|
|
id: washer_and_dryer_cycle_counter
|
|
mode: parallel
|
|
trigger:
|
|
- platform: state
|
|
entity_id:
|
|
- input_boolean.test_washer
|
|
- binary_sensor.washer_status
|
|
variables:
|
|
prefix: washer_dryer_
|
|
valid: '{{ trigger | default(none) is not none and trigger.to_state is defined
|
|
and trigger.from_state is defined }}
|
|
|
|
'
|
|
continue: '{{ trigger.to_state.state != trigger.from_state.state if valid else
|
|
False }}
|
|
|
|
'
|
|
source: '{{ trigger.entity_id }}
|
|
|
|
'
|
|
next_phase: '{{ trigger.to_state.state if valid else none }}
|
|
|
|
'
|
|
condition:
|
|
- condition: template
|
|
value_template: '{{ continue }}'
|
|
action:
|
|
- service: script.calculate_washer_cycle
|
|
data:
|
|
prefix: '{{ prefix }}'
|
|
source: '{{ source }}'
|
|
next_phase: '{{ next_phase }}'
|
|
- alias: MQTT Discovery
|
|
id: 3e5e2ffb-d811-4818-a6bd-1f1386c6dbae
|
|
trigger:
|
|
- platform: homeassistant
|
|
event: start
|
|
action:
|
|
- variables:
|
|
prefix: washer_dryer_
|
|
binary_sensors:
|
|
- test_washer
|
|
- washer
|
|
- repeat:
|
|
count: '{{ binary_sensors | length }}'
|
|
sequence:
|
|
- service: script.mqtt_automated_config
|
|
data:
|
|
domain: binary_sensor
|
|
unique_id: '{{ prefix }}{{ binary_sensors[repeat.index - 1] }}'
|
|
object_id: '{{ binary_sensors[repeat.index - 1] }}'
|
|
device_class: running
|
|
- alias: Leak Warning
|
|
id: 0705a3d3-e7e4-475f-9063-70e7c6107c83
|
|
description: Notify if there's a leak
|
|
triggers:
|
|
- trigger: state
|
|
entity_id:
|
|
- binary_sensor.leak
|
|
to: 'on'
|
|
actions:
|
|
- action: script.notify
|
|
data:
|
|
title: Leak Detected!
|
|
message: '{{ state_attr(''binary_sensor.leak'', ''message'') }}'
|
|
- action: input_datetime.set_datetime
|
|
target: &id008
|
|
entity_id: input_datetime.leak_annoy
|
|
data: &id009
|
|
datetime: '{{ now() + timedelta(minutes=15) }}
|
|
|
|
'
|
|
- alias: Leak Persistence
|
|
id: 391d15c8-d9de-4937-94e9-c6367690ea4a
|
|
description: Keep notifying if there's a leak.
|
|
triggers:
|
|
- trigger: time
|
|
at: input_datetime.leak_annoy
|
|
conditions:
|
|
- condition: state
|
|
entity_id: binary_sensor.leak
|
|
state: 'on'
|
|
actions:
|
|
- action: script.notify
|
|
data:
|
|
title: Leak Detected!
|
|
message: '{{ message }}'
|
|
- action: input_datetime.set_datetime
|
|
target: *id008
|
|
data: *id009
|
|
- alias: Execute Quick Effects on UI updates
|
|
id: execute_quick_effects_on_ui_updates
|
|
mode: restart
|
|
trigger:
|
|
- platform: state
|
|
entity_id:
|
|
- input_number.quick_strip_brightness
|
|
- input_number.quick_strip_color_temp
|
|
- input_number.quick_strip_hue
|
|
- input_select.quick_strip_effect
|
|
variables:
|
|
valid_trigger: "{{ trigger.from_state is defined and trigger.from_state is not\
|
|
\ none \n and trigger.to_state is defined and trigger.to_state is not none\
|
|
\ \n and trigger.from_state.state != trigger.to_state.state }}\n"
|
|
choose_service: "{# Should we run a choose service? Returns 0 if we shouldn't\
|
|
\ #} {%- if valid_trigger %}\n {%- set color_temp = 'color_temp' in trigger.to_state.object_id\
|
|
\ %}\n {%- set hue = 'hue' in trigger.to_state.object_id %}\n {%- set effect\
|
|
\ = 'effect' in trigger.to_state.object_id %}\n {%- if hue or color_temp %}\n\
|
|
\ input_boolean.turn_{{ 'on' if color_temp else 'off' }}\n {%- elif effect\
|
|
\ %}\n {# This is because you can't turn it off in hue mode for some reason\
|
|
\ #}\n {{ 'input_boolean.turn_on' if trigger.to_state.state == 'off' else\
|
|
\ 0 }}\n {%- else %}\n 0\n {%- endif %}\n{%- else %}\n 0\n{%- endif %}\n"
|
|
continue_actions: "{%- if valid_trigger %}\n {%- if 'effect' in trigger.to_state.object_id\
|
|
\ %}\n true\n {%- else %}\n {{ states('input_select.quick_strip_effect')\
|
|
\ != 'off' }}\n {%- endif %}\n{%- else %}\n false\n{%- endif %}\n"
|
|
condition:
|
|
- condition: template
|
|
value_template: '{{ continue_actions }}'
|
|
action:
|
|
- choose:
|
|
- conditions:
|
|
- condition: template
|
|
value_template: '{{ choose_service != 0 }}'
|
|
sequence:
|
|
- service: '{{ choose_service }}'
|
|
data:
|
|
entity_id: input_boolean.hue_color_temp
|
|
- service: script.lzw45_ui_quick_effect
|
|
- alias: Manage LZW Pixel Effects & Quick Strip Effects
|
|
id: manage_lzw_pixel_effects_and_quick_strip_effects
|
|
trigger:
|
|
- platform: state
|
|
entity_id:
|
|
- input_select.quick_strip_effect
|
|
- script.lzw45_ui_pixel_effect
|
|
- script.lzw45_ui_custom_effect
|
|
variables:
|
|
from_state_trigger_valid: '{{ trigger.from_state is defined and trigger.from_state
|
|
is not none and trigger.from_state.state not in [''unavailable'', ''unknown'']
|
|
}}
|
|
|
|
'
|
|
to_state_trigger_valid: '{{ trigger.to_state is defined and trigger.to_state is
|
|
not none and trigger.to_state.state not in [''unavailable'', ''unknown''] }}
|
|
|
|
'
|
|
valid_trigger: '{{ from_state_trigger_valid and to_state_trigger_valid and trigger.from_state.state
|
|
!= trigger.to_state.state }}
|
|
|
|
'
|
|
last_effect: "{%- if valid_trigger %}\n {%- if trigger.to_state.object_id in\
|
|
\ ('lzw45_ui_pixel_effect', 'lzw45_party_effect') %}\n {{ states('input_select.pixel_effect')\
|
|
\ }}\n {%- elif trigger.to_state.object_id == 'lzw45_ui_custom_effect' %}\n\
|
|
\ custom\n {%- else %}\n {{ trigger.to_state.state }}\n {%- endif %}\n\
|
|
{%- endif %}\n"
|
|
condition:
|
|
- condition: template
|
|
value_template: '{{ valid_trigger }}'
|
|
action:
|
|
- service: input_text.set_value
|
|
data:
|
|
entity_id: input_text.lzw45_last_effect
|
|
value: '{{ last_effect }}'
|
|
- alias: Keep Sunset Switches On.
|
|
id: reaction_keep_sunset_switches_on
|
|
mode: parallel
|
|
trigger:
|
|
- platform: state
|
|
entity_id:
|
|
- switch.passenger_sconce
|
|
- switch.sconces_garage
|
|
- switch.sconces_main_entrance
|
|
to: 'off'
|
|
variables:
|
|
continue: '{{ trigger | default(none) is not none and trigger.to_state is defined
|
|
and trigger.from_state is defined }}
|
|
|
|
'
|
|
condition:
|
|
- condition: template
|
|
value_template: '{{ continue }}'
|
|
action:
|
|
- service: switch.turn_on
|
|
target:
|
|
entity_id: '{{ trigger.entity_id }}'
|
|
- service: script.notify
|
|
data:
|
|
title: Sunset Switch Turned Off
|
|
message: '{{ state_attr(trigger.entity_id, ''friendly_name'') }} door sconce
|
|
switch was turned off, turning back on.
|
|
|
|
'
|
|
- service: script.notify_area
|
|
data:
|
|
message: Jim counter action initiative in affect. Turning on {{ state_attr(trigger.entity_id,
|
|
'friendly_name') }} door sconces.
|
|
announce: false
|
|
area: living_room
|
|
- condition: sun
|
|
after: sunrise
|
|
before: sunset
|
|
- delay:
|
|
seconds: 5
|
|
- service: light.turn_off
|
|
target:
|
|
entity_id: light.outdoor_bulbs
|
|
- alias: Living Room Lamp Availability.
|
|
id: reaction_keep_living_room_lamps_available
|
|
mode: parallel
|
|
trigger:
|
|
- platform: state
|
|
entity_id: &id010
|
|
- light.jims_lamp
|
|
- light.mikes_lamp
|
|
- light.lindsays_lamp
|
|
to: unavailable
|
|
variables:
|
|
triggering: '{{ trigger.entity_id }}
|
|
|
|
'
|
|
entities: *id010
|
|
continue: '{{ trigger | default(none) is not none and trigger.to_state is defined
|
|
and trigger.from_state is defined }}
|
|
|
|
'
|
|
only_triggering_light: '{{ expand(entities) | rejectattr(''entity_id'', ''eq'',
|
|
triggering) | map(attribute=''state'') | select(''eq'', ''unavailable'') | list
|
|
| length == 0 }}
|
|
|
|
'
|
|
name: '{{ state_attr(triggering, ''friendly_name'') or ''unknown'' }}
|
|
|
|
'
|
|
condition:
|
|
- condition: template
|
|
value_template: '{{ continue and only_triggering_light }}'
|
|
action:
|
|
- service: script.notify
|
|
data:
|
|
message: '{{ name.capitalize() }} went unavailable! Notifying living room.
|
|
|
|
'
|
|
- service: script.notify_area
|
|
data:
|
|
message: "Please do not turn off living room lamps, turn the lamp back on. \
|
|
\ If you want to turn on this lamp in the future, say: Turn on {{ name }}.\
|
|
\ \n"
|
|
announce: false
|
|
area: living_room
|
|
- alias: Fix Zwave Multicast Errors
|
|
id: 6c4bb70c-e8a7-40c8-9c78-bb077023e3b9
|
|
description: Refreshes a zwave multicast light and attempts to fix it.
|
|
mode: single
|
|
triggers:
|
|
- not_from: &id011
|
|
- unknown
|
|
- unavailable
|
|
not_to: &id012
|
|
- unknown
|
|
- unavailable
|
|
trigger: state
|
|
entity_id: sensor.multicast_error
|
|
variables:
|
|
action: '{{ trigger.to_state.attributes.action | default(None) }}'
|
|
entity_id: '{{ trigger.to_state.attributes.entity_id | default(None) }}'
|
|
new: '{# Stops reload template from triggering. #} {%- set t = now() %} {%- set
|
|
yesterday = t - timedelta(hours=24) %} {{ t - trigger.to_state.state | as_datetime(yesterday)
|
|
| as_local < timedelta(seconds=10) }}
|
|
|
|
'
|
|
continue: '{{ action is not none and entity_id is not none and new }}'
|
|
conditions:
|
|
- condition: template
|
|
value_template: '{{ continue }}'
|
|
action:
|
|
- action: script.notify
|
|
data:
|
|
notify: notify.mobile_app_petro
|
|
title: Multicast Error
|
|
message: Refreshing {{ state_attr(entity_id, 'friendly_name') }}
|
|
- action: script.get_zwave_entities_from_light_group
|
|
data:
|
|
light: '{{ entity_id }}'
|
|
response_variable: response
|
|
- delay: 1
|
|
- action: zwave_js.refresh_value
|
|
target:
|
|
entity_id: '{{ response.entity_id }}'
|
|
- action: '{{ action }}'
|
|
target:
|
|
entity_id: '{{ entity_id }}'
|
|
- alias: Fix Wled Errors
|
|
id: 06cfa18a-fa57-406d-94dc-5037e6096b87
|
|
description: Refreshes a zwave multicast light and attempts to fix it.
|
|
mode: single
|
|
triggers:
|
|
- not_from: *id011
|
|
not_to: *id012
|
|
trigger: state
|
|
entity_id: sensor.wled_api_error
|
|
variables:
|
|
config:
|
|
wled_hutch:
|
|
- light.hutch_uplight
|
|
kitchen_uplight:
|
|
- light.cabinet_master
|
|
- light.cabinet_slave
|
|
kitchen_cabinet_2:
|
|
- light.cabinet_surface
|
|
source: '{{ trigger.to_state.attributes.source | default(None) }}
|
|
|
|
'
|
|
action: '{{ trigger.to_state.attributes.action | default(None) }}
|
|
|
|
'
|
|
entities: '{{ config.get(trigger.to_state.attributes.source, []) }}
|
|
|
|
'
|
|
to_state: '{{ action.split(''_'') | last if action else None }}
|
|
|
|
'
|
|
filtered: '{{ entities | reject(''is_state'', to_state) | list }}
|
|
|
|
'
|
|
new: '{# Stops reload template from triggering. #} {%- set t = now() %} {%- set
|
|
yesterday = t - timedelta(hours=24) %} {{ t - trigger.to_state.state | as_datetime(yesterday)
|
|
| as_local < timedelta(seconds=10) }}
|
|
|
|
'
|
|
continue: '{{ filtered | length > 0 and new }}
|
|
|
|
'
|
|
conditions:
|
|
- condition: template
|
|
value_template: '{{ continue }}'
|
|
action:
|
|
- action: script.notify
|
|
data:
|
|
notify: notify.mobile_app_petro
|
|
title: WLED Error
|
|
message: Refreshing {{ filtered | map('state_attr', 'friendly_name') | list
|
|
| join(', ') }}
|
|
- delay: 1
|
|
- action: homeassistant.turn_{{ to_state }}
|
|
target:
|
|
entity_id: '{{ filtered }}'
|
|
- alias: Fix Doorbell Chime Status
|
|
id: 3f1c8cab-0151-4961-854e-80fdb956fcae
|
|
description: Checks to see if the doorbell chime is on periodically.
|
|
triggers:
|
|
- id: turn_on
|
|
trigger: state
|
|
entity_id: switch.doorbell_chime_active
|
|
to: 'off'
|
|
for:
|
|
minutes: 5
|
|
- id: turn_on
|
|
trigger: template
|
|
value_template: '{{ states(''sensor.doorbell_chime_off'') | float(0) == 5 }}'
|
|
- id: check
|
|
trigger: time
|
|
at: '8:00:00'
|
|
variables:
|
|
message: "{% if trigger.id == 'turn_on' %}\n Doorbell chime has been off for\
|
|
\ at least 5 minutes. Turning Back on.\n{% elif is_state('sensor.doorbell_chime_off',\
|
|
\ 'off') %}\n Doorbell chime was found to be off at 8am, turning back on.\n\
|
|
{% else%}\n None\n{% endif %}\n"
|
|
continue: '{{ message is not none }}'
|
|
conditions:
|
|
- condition: template
|
|
value_template: '{{ continue }}'
|
|
action:
|
|
- action: script.notify
|
|
data:
|
|
notify: notify.mobile_app_petro
|
|
title: Fixing Doorbell Chime
|
|
message: '{{ message }}'
|
|
- action: switch.turn_on
|
|
target:
|
|
entity_id: switch.doorbell_chime_active
|
|
- alias: Play/Pause lighting in living room
|
|
id: 0c371ea2-c700-476b-9c3d-b36bd3c9a662
|
|
description: Turn on lighting when paused, turn off lighting when playing.
|
|
triggers:
|
|
- trigger: state
|
|
entity_id: media_player.roku_living_room
|
|
to:
|
|
- playing
|
|
- paused
|
|
not_from:
|
|
- unavailable
|
|
- unknown
|
|
variables:
|
|
light: light.living_room
|
|
media_state: '{{ trigger.to_state.state }}'
|
|
light_state: '{{ ''on'' if media_state == ''paused'' else ''off'' }}'
|
|
movie_time: '{{ is_state(''switch.movie_time'', ''on'') }}'
|
|
turned_on_by_this: "{% if this.context.parent_id is not none %}\n {{ light |\
|
|
\ expand | selectattr('state', 'eq', 'on') | selectattr('context.parent_id',\
|
|
\ 'eq', this.context.parent_id) | map(attribute='entity_id') | list }}\n{% else\
|
|
\ %}\n []\n{% endif %}\n"
|
|
living_room_lights: "{% if movie_time and media_state == 'paused' and is_state(light,\
|
|
\ 'off') %}\n {{ state_attr(light, 'entity_id') }}\n{% elif movie_time and\
|
|
\ media_state == 'playing' and is_state(light, 'on') %}\n {{ turned_on_by_this\
|
|
\ }}\n{% else %}\n []\n{% endif %}\n"
|
|
conditions:
|
|
- condition: template
|
|
value_template: '{{ living_room_lights | length > 0 }}'
|
|
actions:
|
|
- action: light.turn_{{ light_state }}
|
|
target:
|
|
entity_id: '{{ living_room_lights }}'
|
|
- alias: Ignore Spook Repair
|
|
id: repair_ignore_spook_repair
|
|
trigger:
|
|
- platform: state
|
|
entity_id: event.repair
|
|
variables:
|
|
continue: '{{ trigger | default(none) is not none and trigger.to_state is defined
|
|
and trigger.from_state is defined }}
|
|
|
|
'
|
|
attrs: '{{ trigger.to_state.attributes | default({}) if continue else {} }}
|
|
|
|
'
|
|
issue_id: '{{ attrs.get(''issue_id'') }}
|
|
|
|
'
|
|
target: '{{ issue_id if ''timed_event_snapshot_status'' in issue_id else None
|
|
}}
|
|
|
|
'
|
|
condition:
|
|
- condition: template
|
|
value_template: '{{ target is not none }}'
|
|
action:
|
|
- service: repairs.remove
|
|
data:
|
|
issue_id: '{{ target }}'
|
|
- alias: Notify Snapshot status
|
|
id: snapshot_status
|
|
trigger:
|
|
- platform: state
|
|
entity_id: sensor.samba_backup
|
|
variables:
|
|
valid: '{{ trigger | default(none) is not none and trigger.to_state is defined
|
|
and trigger.from_state is defined }}"
|
|
|
|
'
|
|
status: '{{ trigger.to_state.state | default | lower }}
|
|
|
|
'
|
|
not_idle: '{{ status != ''idle'' }}
|
|
|
|
'
|
|
condition:
|
|
- condition: template
|
|
value_template: '{{ valid and not_idle }}'
|
|
action:
|
|
- service: script.notify
|
|
data:
|
|
title: Snapshot Status
|
|
message: Samba backup {{ status }}.
|
|
- alias: Notify Garbage Day Message
|
|
id: garbage_day_message
|
|
trigger:
|
|
- platform: time
|
|
at: '10:00:00'
|
|
- platform: time
|
|
at: '15:30:00'
|
|
- platform: time
|
|
at: '19:00:00'
|
|
variables:
|
|
recycling: '{% set recycling_origin = strptime(states(''input_datetime.recycling''),
|
|
''%Y-%m-%d'') | as_local %} {% set tomorrow = (today_at() + timedelta(days=1))
|
|
%} {% set days = (tomorrow - recycling_origin).days %} {{ (days // 7) % 2 ==
|
|
0 }}
|
|
|
|
'
|
|
what: 'Trash {{ ''and Recycling '' if recycling else '''' }}day tomorrow!
|
|
|
|
'
|
|
condition:
|
|
- condition: time
|
|
weekday:
|
|
- mon
|
|
action:
|
|
- service: script.notify
|
|
data:
|
|
message: '{{ what }}'
|
|
- alias: Notify Change Filters Message
|
|
id: change_filters_message
|
|
trigger:
|
|
- platform: time
|
|
at: '10:00:00'
|
|
- platform: time
|
|
at: '19:00:00'
|
|
condition:
|
|
- condition: template
|
|
value_template: '{{ now().day == 1 and now().month in [ 1, 4, 7, 10 ] }}'
|
|
action:
|
|
- service: script.notify
|
|
data:
|
|
message: Change HVAC filter.
|
|
- alias: Notify Mosby Heartworm and Flee Medication.
|
|
id: mosby_heartworm
|
|
trigger:
|
|
- platform: time
|
|
at: '10:00:00'
|
|
- platform: time
|
|
at: '19:00:00'
|
|
condition:
|
|
- condition: template
|
|
value_template: '{{ now().day == 1 }}'
|
|
action:
|
|
- service: script.notify
|
|
data:
|
|
message: Give mosby heartworm and flee medication.
|
|
- alias: Notify DST Change
|
|
id: dst_warning
|
|
trigger:
|
|
- platform: time
|
|
at: '10:00:00'
|
|
- platform: time
|
|
at: '19:00:00'
|
|
condition:
|
|
- condition: template
|
|
value_template: '{{ states(''sensor.daylight_savings_days_until'') | int(0) in
|
|
[7,1] }}
|
|
|
|
'
|
|
action:
|
|
- service: script.notify
|
|
data:
|
|
message: '{%- set days = states(''sensor.daylight_savings_days_until'') | int(0)
|
|
%} {%- set plural = ''s'' if days | int(0) > 1 else '''' %} Daylight savings
|
|
in {{ days }} day{{plural}}, you will {{ states(''sensor.daylight_savings_phrase'')
|
|
}}!
|
|
|
|
'
|
|
- alias: Outdoor Lights On at Sunset, Off at Sunrise
|
|
id: outdoor_lights_on_off
|
|
trigger:
|
|
- platform: sun
|
|
event: sunset
|
|
- platform: sun
|
|
event: sunrise
|
|
variables:
|
|
event: '{{ trigger.event | default(''invalid'') }}
|
|
|
|
'
|
|
scene: '{{ states(''sensor.seasonal_lights'') }}
|
|
|
|
'
|
|
action:
|
|
- service: script.sunrise_sunset
|
|
data:
|
|
event: '{{ event }}'
|
|
scene: '{{ scene }}'
|
|
- alias: Clear persistent_notifications at bedtime
|
|
id: clear_persistent_notifications_around_bedtime
|
|
trigger:
|
|
- platform: time
|
|
at: '22:00:00'
|
|
action:
|
|
- service: persistent_notification.dismiss_all
|
|
- alias: Simple Thermostat
|
|
id: simple_thermostat
|
|
trigger:
|
|
- platform: calendar
|
|
event: start
|
|
entity_id: calendar.thermostat
|
|
variables:
|
|
config:
|
|
heat: 70
|
|
cool: 66
|
|
event: '{{ trigger.calendar_event.summary.lower() }}
|
|
|
|
'
|
|
temperature: '{{ config.get(event) }}
|
|
|
|
'
|
|
condition:
|
|
- condition: template
|
|
value_template: '{{ temperature is not none }}'
|
|
action:
|
|
- service: climate.set_temperature
|
|
target:
|
|
entity_id: climate.living_room_thermostat
|
|
data:
|
|
temperature: '{{ temperature }}'
|
|
- alias: Setup Mike's Todo Lists
|
|
id: d11bb907-e656-4a0b-8f03-ecbbf3e40a3a
|
|
mode: single
|
|
triggers:
|
|
- trigger: time
|
|
at: 00:00:00
|
|
- trigger: event
|
|
event_type: run_manual_schedule_update
|
|
variables:
|
|
day: '{% from ''easy_time.jinja'' import count_the_days %} {# Assumes monday is
|
|
always selected #} {{ count_the_days(''input_datetime.mike_run_program'') }}
|
|
|
|
'
|
|
week: '{{ (day | abs / 7 + 1) | int }}
|
|
|
|
'
|
|
action:
|
|
- if: '{{ 1 <= week <= 10 }}'
|
|
then:
|
|
- action: script.set_run_schedule
|
|
data:
|
|
program: 718485f4-3031-46a3-bce5-990189a6e06c
|
|
week: '{{ week }}'
|
|
weekly_todo: todo.mike_this_week
|
|
daily_todo: todo.mike_today
|
|
max_heart_rate: 200
|
|
- action: script.set_mikes_daily_list
|
|
- event: roll_up_todo
|
|
- alias: Game Room Lights
|
|
id: toggle_game_room_lights
|
|
trigger:
|
|
- platform: state
|
|
entity_id: switch.game_room_switch
|
|
variables:
|
|
continue: '{{ trigger | default(none) is not none and trigger.to_state is defined
|
|
and trigger.from_state is defined }}
|
|
|
|
'
|
|
to_state: '{{ trigger.to_state.state | default('''') if continue else '''' }}
|
|
|
|
'
|
|
condition:
|
|
- condition: template
|
|
value_template: '{{ continue and to_state in [''on'',''off''] }}'
|
|
action:
|
|
- service: switch.turn_{{ to_state }}
|
|
target:
|
|
entity_id:
|
|
- switch.game_room_bookcase_outlet
|
|
- switch.game_room_buffet_outlet
|
|
- alias: Basement Lights
|
|
id: toggle_basement_lights
|
|
trigger:
|
|
- platform: state
|
|
entity_id: switch.basement_stairs
|
|
variables:
|
|
continue: '{{ trigger | default(none) is not none and trigger.to_state is defined
|
|
and trigger.from_state is defined }}
|
|
|
|
'
|
|
to_state: '{{ trigger.to_state.state | default('''') if continue else '''' }}
|
|
|
|
'
|
|
condition:
|
|
- condition: template
|
|
value_template: '{{ continue and to_state in [''on'',''off''] }}'
|
|
action:
|
|
- service: switch.turn_{{ to_state }}
|
|
target:
|
|
entity_id:
|
|
- switch.basement_cans
|
|
- alias: Deck String Lights
|
|
id: toggle_deck_string_lights
|
|
trigger:
|
|
- platform: state
|
|
entity_id: &id013
|
|
- switch.deck_mood_lighting
|
|
- switch.patio_string_light
|
|
variables:
|
|
entities: *id013
|
|
state_list:
|
|
- 'on'
|
|
- 'off'
|
|
continue: '{{ trigger | default(none) is not none and trigger.to_state is defined
|
|
and trigger.from_state is defined }}
|
|
|
|
'
|
|
to_state: '{{ trigger.to_state.state | default(none) if continue else none }}
|
|
|
|
'
|
|
targets: '{{ expand(entities) | rejectattr(''entity_id'', ''eq'', trigger.entity_id)
|
|
| rejectattr(''state'', ''eq'', to_state) | map(attribute=''entity_id'') | list
|
|
if continue else [] }}
|
|
|
|
'
|
|
condition:
|
|
- condition: template
|
|
value_template: '{{ continue and to_state in state_list and targets | count >
|
|
0 }}'
|
|
action:
|
|
- service: switch.turn_{{ to_state }}
|
|
target:
|
|
entity_id: '{{ targets }}'
|
|
- alias: Uplight & Downlight Cabinet from Switch
|
|
id: toggle_cabinet_string_lights
|
|
mode: single
|
|
trigger:
|
|
- platform: state
|
|
entity_id: switch.kitchen_cabinet
|
|
variables:
|
|
entities:
|
|
- switch.kitchen_cabinet_2
|
|
- switch.kitchen_uplight
|
|
in_season: '{% set remove = [''switch.kitchen_uplight''] if is_state(''binary_sensor.indoor_holiday'',
|
|
''on'') else [] %} {{ entities | reject(''in'', remove) | list }}
|
|
|
|
'
|
|
state_list:
|
|
- 'on'
|
|
- 'off'
|
|
continue: '{{ trigger | default(none) is not none and trigger.to_state is defined
|
|
and trigger.from_state is defined and trigger.to_state.state in state_list }}
|
|
|
|
'
|
|
targets: '{{ in_season | reject(''is_state'', trigger.to_state.state) | list if
|
|
continue else [] }}
|
|
|
|
'
|
|
condition:
|
|
- condition: template
|
|
value_template: '{{ targets | count > 0 }}'
|
|
action:
|
|
- service: switch.turn_{{ trigger.to_state.state }}
|
|
target:
|
|
entity_id: '{{ targets }}'
|
|
- alias: Notify Power Outage
|
|
id: ups_notify_power_outage
|
|
trigger:
|
|
- id: notify
|
|
platform: state
|
|
entity_id: binary_sensor.house_power_status
|
|
to: 'on'
|
|
- id: power off
|
|
platform: state
|
|
entity_id: binary_sensor.house_power_status
|
|
to: 'on'
|
|
for: 00:01:00
|
|
- id: cancel
|
|
platform: state
|
|
entity_id: binary_sensor.house_power_status
|
|
from: 'on'
|
|
to: 'off'
|
|
variables:
|
|
valid: '{{ trigger | default(none) is not none and trigger.to_state is defined
|
|
and trigger.from_state is defined }}
|
|
|
|
'
|
|
message: "{% if trigger.id == 'notify' %}\n Detected power outage, starting power\
|
|
\ down sequence in 1 minute if power is not restored.\n{% elif trigger.id ==\
|
|
\ 'power off' %}\n Power was not restored, starting power down sequence.\n\
|
|
{% else %}\n Power has restored, canceling power down sequence.\n{% endif %}\n"
|
|
condition:
|
|
- condition: template
|
|
value_template: '{{ valid }}'
|
|
action:
|
|
- service: script.notify
|
|
data:
|
|
message: '{{ message }}'
|
|
- condition: template
|
|
value_template: '{{ trigger.id == ''power off'' }}'
|
|
- service: script.power_down_sequence
|
|
- alias: MQTT Discovery and Automation
|
|
id: mqtt_store_and_automate_weights
|
|
mode: parallel
|
|
trigger:
|
|
- id: start
|
|
platform: homeassistant
|
|
event: start
|
|
- id: new
|
|
platform: state
|
|
entity_id: sensor.master_scale_weight
|
|
variables:
|
|
root: homeassistant
|
|
range: 20
|
|
config:
|
|
- person: person.petro
|
|
initial: 200
|
|
- person: person.lambo
|
|
initial: 145
|
|
people: "{%- set ns = namespace(items=[]) %} {%- for item in config %}\n {%-\
|
|
\ set object_id = item.person.split('.')[-1] ~ '_weight' %}\n {%- set ns.items\
|
|
\ = ns.items + [{\n 'unique_id': object_id,\n 'object_id': object_id,\n\
|
|
\ 'initial': item.initial,\n 'current': states('sensor.' ~ object_id)\
|
|
\ | float(None),\n }] %}\n{%- endfor %} {{ ns.items }}\n"
|
|
weight: "{%- if trigger.id == 'new' and trigger.to_state.state | is_number %}\n\
|
|
\ {%- set next_weight = trigger.to_state.state | float %}\n {%- set ns = namespace(items=[])\
|
|
\ %}\n {%- for person in people %}\n {%- set current = person.current or\
|
|
\ person.initial %}\n {%- if current - range <= next_weight <= current +\
|
|
\ range %}\n {%- set ns.items = ns.items + [{'next':next_weight, 'unique_id':person.unique_id}]\
|
|
\ %}\n {%- endif %}\n {%- endfor %}\n {{ ns.items | first | default }}\n\
|
|
{%- else -%}\n None\n{%- endif %}\n"
|
|
action:
|
|
- choose:
|
|
- conditions: '{{ trigger.id == ''start'' }}'
|
|
sequence:
|
|
- repeat:
|
|
for_each: '{{ people }}'
|
|
sequence:
|
|
- service: script.mqtt_automated_config
|
|
data:
|
|
domain: sensor
|
|
unique_id: '{{ repeat.item.unique_id }}'
|
|
object_id: '{{ repeat.item.object_id }}'
|
|
state_class: measurement
|
|
device_class: weight
|
|
unit_of_measurement: lb
|
|
- conditions: '{{ weight is not none }}'
|
|
sequence:
|
|
- service: script.mqtt_automated_states
|
|
data:
|
|
domain: sensor
|
|
unique_id: '{{ weight.unique_id }}'
|
|
state: '{{ weight.next }}'
|