AutomationDataset/Chris-V/Chris-V_automations.yaml

1457 lines
49 KiB
YAML

- id: a4fe52e0-99f0-449d-9bc7-50378d9d6df8
alias: night_ambiance
initial_state: true
mode: restart
triggers:
- trigger: numeric_state
entity_id: sun.sun
attribute: elevation
below: -3.0
- trigger: state
entity_id: group.household
to: home
conditions:
- condition: time
before: input_datetime.evening_ambiance_end
- condition: numeric_state
entity_id: sun.sun
attribute: elevation
below: -3.0
- condition: state
entity_id: group.household
state: home
actions:
- parallel:
- action: script.evening_ambiance
- action: light.turn_on
target:
entity_id:
- light.backyard_string
- light.front_porch
- light.side_porch_sconce
- light.shed_outdoor
- id: 2c48ecbc-7b65-4938-af37-dcda12952465
alias: arrival_lights
initial_state: true
mode: restart
triggers:
- trigger: state
entity_id:
- person.chris
- person.karine
- group.guests
to: home
conditions:
- condition: numeric_state
entity_id: sun.sun
attribute: elevation
below: -3.0
actions:
- action: light.turn_on
target:
entity_id:
- light.front_porch
- light.side_porch_sconce
- id: a109af89-0910-45b2-9a0e-11d3ae43ec7c
alias: turn_off_outdoor
initial_state: true
mode: restart
triggers:
- trigger: state
entity_id: light.outdoor_lights
to: 'on'
for: 300
- trigger: time
at: input_datetime.evening_ambiance_end
- trigger: state
entity_id: binary_sensor.guest_mode
to: 'off'
conditions:
- condition: state
entity_id: binary_sensor.guest_mode
state: 'off'
- condition: state
entity_id: light.outdoor_lights
state: 'on'
for: 300
- condition: time
after: input_datetime.evening_ambiance_end
before: '15:00:00'
actions:
- action: light.turn_off
target:
entity_id: light.outdoor_lights
- id: 36afcfe6-d475-447c-b089-d33aec62a774
alias: broadcast_notifications
initial_state: true
mode: queued
max: 25
triggers:
- trigger: homeassistant
event: start
- trigger: state
entity_id: todo.audio_broadcast
- trigger: state
entity_id: group.household
to: home
for: 120
- trigger: time
at:
- input_datetime.broadcast_weekday_start
- input_datetime.broadcast_weekend_start
conditions:
- condition: numeric_state
entity_id: todo.audio_broadcast
above: 0
- condition: state
entity_id: group.household
state: home
for: 120
- or:
- condition: time
after: input_datetime.broadcast_weekday_start
before: input_datetime.broadcast_weekday_end
weekday:
- mon
- tue
- wed
- thu
- condition: time
after: input_datetime.broadcast_weekday_start
before: input_datetime.broadcast_weekend_end
weekday:
- fri
- condition: time
after: input_datetime.broadcast_weekend_start
before: input_datetime.broadcast_weekend_end
weekday:
- sat
- condition: time
after: input_datetime.broadcast_weekend_start
before: input_datetime.broadcast_weekday_end
weekday:
- sun
actions:
- action: todo.get_items
response_variable: broadcast_items
target:
entity_id: todo.audio_broadcast
data:
status:
- needs_action
- variables:
broadcast_item: '{{ broadcast_items[''todo.audio_broadcast''][''items''][0]
}}'
- action: script.broadcast_notification
data:
message: '{{ broadcast_item[''description''] | default(broadcast_item[''summary''],
true) }}'
- wait_template: '{{ is_state(''script.broadcast_notification'', ''off'') }}'
- action: script.manage_broadcast_queue
data:
action: pop
tag: '{{ broadcast_item[''summary''] }}'
- id: e50d2e13-9c88-4b02-89af-e863a7d763d5
alias: chris_remote_restore_initial_option
description: Restore entity selected by Chris' remote after some time
use_blueprint:
path: reset_input_select.yaml
input:
default_option: light.bedside_chris
delay: 300
entity_id: input_select.chris_remote_entity
- id: ff872bdf-a0af-4e30-9aa3-449d7ff4367b
alias: chris_remote_apply_color_change
description: Turn on and change the color on Chris' remote entity
initial_state: true
max_exceeded: silent
mode: queued
triggers:
- trigger: state
entity_id: input_select.chris_remote_color
actions:
- action: light.turn_on
target:
entity_id: '{{ states(''input_select.chris_remote_entity'') }}'
data:
rgb_color: '{{ trigger.to_state.state }}'
- id: abf7b09f-0e7b-4b0c-b6ef-85631f25c63e
alias: chris_remote
description: Map Chris' remote buttons to useful actions
use_blueprint:
path: zha/bedside_remote.yaml
input:
color_input_select: input_select.chris_remote_color
device_ieee: 00:0d:6f:ff:fe:61:69:25
entity_input_select: input_select.chris_remote_entity
- id: 1ff64444-5414-49d5-b314-b0a3a82075c5
alias: update_backend_theme
initial_state: true
mode: queued
triggers:
- trigger: state
entity_id:
- input_select.default_theme
- binary_sensor.use_alarm_theme
- binary_sensor.winter_credit_peak_event
to: null
actions:
- action: frontend.set_theme
data:
name: "{%\n set mode = 'dark'\n if is_state('binary_sensor.use_dark_theme',\
\ 'on')\n else 'light'\n-%} {% if is_state('binary_sensor.use_alarm_theme',\
\ 'on') -%}\n ios-{{ mode }}-mode-red\n{%- elif is_state('binary_sensor.winter_credit_peak_event',\
\ 'on') -%}\n ios-{{ mode }}-mode-light-blue\n{%- else -%}\n {{ states('input_select.default_theme')\
\ | default('default', True) -}}\n{% endif %}"
- id: a87a26c7-b1d4-4080-842b-4ee8a6e5b6f5
alias: update_default_theme
initial_state: true
mode: restart
triggers:
- trigger: state
entity_id:
- binary_sensor.use_dark_theme
- input_boolean.automatic_night_theme
- input_select.day_theme
- input_select.night_theme
to: null
- trigger: homeassistant
event: start
conditions:
- condition: state
entity_id: input_boolean.automatic_night_theme
state: 'on'
actions:
- action: input_select.select_option
target:
entity_id: input_select.default_theme
data:
option: "{{\n states(\n 'input_select.'\n ~ ('night' if is_state('binary_sensor.use_dark_theme',\
\ 'on') else 'day' )\n ~ '_theme'\n ) | default('default')\n}}"
- id: 54655af9-ddc7-491d-9200-41aaaddbb21a
alias: empty_house
initial_state: true
triggers:
- trigger: state
entity_id: group.household
from: home
for: 30
conditions:
- condition: state
entity_id: binary_sensor.guest_mode
state: 'off'
actions:
- action: script.everything_off
- action: lock.lock
target:
entity_id: lock.kitchen_door
- id: 77087f1e-f617-4fa6-8520-22793f3c1bfb
alias: Use internal heat pump temperature probe
description: Switch to the internal heat pump temperature probe
mode: restart
triggers:
- trigger: state
entity_id: input_boolean.use_heat_pump_virtual_probe
to: 'off'
actions:
- action: esphome.ground_floor_heat_pump_use_internal_temperature
- id: 4c8cf214-db8a-4d0e-b039-f502dc5e21ed
alias: Sync virtual heat pump temperature probe
description: Keep the heat pump's external temperature prope in sync with thermostat
readings
mode: restart
triggers:
- trigger: homeassistant
event: start
- trigger: state
entity_id: input_boolean.use_heat_pump_virtual_probe
to: 'on'
- trigger: state
entity_id: sensor.heat_pump_virtual_probe
for: 5
not_to: unavailable
conditions:
- condition: state
entity_id: input_boolean.use_heat_pump_virtual_probe
state: 'on'
- not:
- condition: state
entity_id: sensor.heat_pump_virtual_probe
state: unavailable
actions:
- action: esphome.ground_floor_heat_pump_set_remote_temperature
data:
temperature: '{{ states(''sensor.heat_pump_virtual_probe'') | round(precision
= 0) }}'
- id: 6ea34d47-1181-4c94-9ab6-43fe4c0b42cc
alias: notify_update_available
initial_state: true
mode: parallel
triggers:
- trigger: state
entity_id: sensor.latest_home_assistant_version
not_to:
- unknown
- unavailable
conditions: '{{ trigger.to_state.state | version > states(''sensor.current_home_assistant_version'')
}}'
actions:
- action: python_script.notify
data:
persistent: true
push_target: admin
tag: hass_version
url: https://github.com/home-assistant/home-assistant/releases/tag/{{ trigger.to_state.state
}}
title: Home Assistant Update
message: Home Assistant {{ trigger.to_state.state }} is available.
- id: 0c595e90-4186-4152-b80e-41a491749dde
alias: notify_failed_login_attempt
initial_state: true
mode: parallel
triggers:
- trigger: event
event_type: call_service
event_data:
domain: persistent_notification
action: create
service_data:
notification_id: http-login
actions:
- action: python_script.notify
data:
push_target: admin
title: '{{ trigger.event.data.service_data.title }}'
message: '{{ trigger.event.data.service_data.message }}'
- id: 673d5462-19e1-4a63-ad41-75c0690dcaa2
alias: Notify HA status.
triggers:
- trigger: homeassistant
event: start
variables:
action: started
- trigger: homeassistant
event: shutdown
variables:
action: shut down
actions:
- action: notify.admin
data:
message: Home-Assistant has {{ action }}.
data:
tag: homeassistant-status
- alias: Reload jinja2 templates
id: c7929657-8241-478e-9a89-d2562c720120
mode: single
max_exceeded: silent
triggers:
- trigger: state
entity_id: event.jinja2_custom_templates_updated
actions:
- action: homeassistant.reload_custom_templates
- alias: presence_alarm_armed
id: 2c7d9807-9f19-4b55-b944-17005a27e6c0
description: Initialize home alarm states when arming is enabled.
initial_state: true
triggers:
- trigger: state
entity_id: binary_sensor.presence_armed
from: 'off'
to: 'on'
actions:
- action: notify.send_message
target:
entity_id: notify.intrusion_log
data:
message: Intrusion alarm armed.
- action: script.initialize_alarm_states
- alias: log_intrusion_clear
id: 249f90de-0afe-4735-9b17-a59f035ec4f3
description: Log intrusion cleared events.
initial_state: true
mode: single
max_exceeded: silent
triggers:
- trigger: state
entity_id: binary_sensor.intrusion_activity
from: 'on'
to: 'off'
actions:
- action: notify.send_message
target:
entity_id: notify.intrusion_log
data:
message: ({{ states('input_text.presence_armed_id') }}) Intrusion cleared.
- alias: log_presence_alarm_disarmed
id: 64ef04c6-d94c-4d70-a116-d50ab1b295a5
description: Log disarming of presence alarm.
initial_state: true
triggers:
- trigger: state
entity_id: binary_sensor.presence_armed
from: 'on'
to: 'off'
actions:
- action: notify.send_message
target:
entity_id: notify.intrusion_log
data:
message: ({{ states('input_text.presence_armed_id') }}) Presence alarm disarmed.
- alias: record_activity_while_armed
id: 1bbacc2c-2ce3-428a-bfdd-6d9480be23b8
description: Record activity in the house while system is armed.
initial_state: true
mode: queued
triggers:
- trigger: state
entity_id:
- sensor.current_door
- sensor.current_motion
- sensor.current_window
variables:
entity_id: '{{ trigger.to_state.state }}'
- trigger: state
entity_id:
- event.hallway_spots_dimmer_on_pressed
- event.hallway_spots_dimmer_off_pressed
- event.kitchen_track_light_dimmer_off_pressed
- event.kitchen_track_light_dimmer_on_pressed
- event.backyard_soffit_spots_dimmer_off_pressed
- event.backyard_soffit_spots_dimmer_on_pressed
- event.dining_room_light_dimmer_off_pressed
- event.dining_room_light_dimmer_on_pressed
- event.side_porch_sconce_dimmer_off_pressed
- event.side_porch_sconce_dimmer_on_pressed
- event.master_bedroom_sconces_dimmer_off_pressed
- event.master_bedroom_sconces_dimmer_on_pressed
- event.master_bedroom_spots_dimmer_off_pressed
- event.master_bedroom_spots_dimmer_on_pressed
- event.kitchen_sink_light_switch_off_pressed
- event.kitchen_sink_light_switch_on_pressed
- event.front_porch_light_switch_off_pressed
- event.front_porch_light_switch_on_pressed
- event.shed_outdoor_light_switch_on_pressed
- event.shed_outdoor_light_switch_off_pressed
- event.shed_light_switch_off_pressed
- event.shed_light_switch_on_pressed
- event.master_bedroom_closet_light_switch_off_pressed
- event.master_bedroom_closet_light_switch_on_pressed
- event.basement_bathroom_fan_switch_on_pressed
- event.basement_bathroom_fan_switch_off_pressed
- event.basement_bathroom_light_switch_on_pressed
- event.basement_bathroom_light_switch_off_pressed
- event.basement_bathroom_vanity_dimmer_on_pressed
- event.basement_bathroom_vanity_dimmer_off_pressed
- event.basement_hallway_dimmer_on_pressed
- event.basement_hallway_dimmer_off_pressed
- event.downstairs_light_switch_on_pressed
- event.downstairs_light_switch_off_pressed
- event.guest_bedroom_closet_light_switch_on_pressed
- event.guest_bedroom_closet_light_switch_off_pressed
- event.guest_bedroom_spots_dimmer_off_pressed
- event.guest_bedroom_spots_dimmer_on_pressed
- event.laundry_dimmer_off_pressed
- event.laundry_dimmer_on_pressed
- event.bookshelf_light_switch_on_pressed
- event.bookshelf_light_switch_off_pressed
- event.foyer_light_switch_on_pressed
- event.foyer_light_switch_off_pressed
- event.living_room_dimmer_off_pressed
- event.living_room_dimmer_on_pressed
- event.staircase_dimmer_on_pressed
- event.staircase_dimmer_off_pressed
- event.lounge_dimmer_off_pressed
- event.lounge_dimmer_on_pressed
- event.main_bathroom_dimmer_on_pressed
- event.main_bathroom_dimmer_off_pressed
- event.main_bathroom_fan_switch_on_pressed
- event.main_bathroom_fan_switch_off_pressed
- event.main_bathroom_vanity_light_switch_on_pressed
- event.main_bathroom_vanity_light_switch_off_pressed
- event.office_spots_dimmer_off_pressed
- event.office_spots_dimmer_on_pressed
- event.studio_panel_light_switch_off_pressed
- event.studio_panel_light_switch_on_pressed
- event.studio_spots_dimmer_off_pressed
- event.studio_spots_dimmer_on_pressed
- event.workshop_light_switch_on_pressed
- event.workshop_light_switch_off_pressed
variables:
entity_id: '{{ trigger.entity_id }}'
conditions:
- condition: state
entity_id: binary_sensor.presence_armed
state: 'on'
- condition: template
value_template: '{{ entity_id != '''' }}'
actions:
- action: notify.send_message
target:
entity_id: notify.intrusion_log
data:
message: '({{ states(''input_text.presence_armed_id'') }}) Intrusion activity:
{{ entity_id | device_name }} ({{ entity_id }})'
- action: todo.add_item
target:
entity_id: todo.intrusion_record
data:
item: '{{ entity_id }}'
- alias: start_intrusion_alarm
id: 6943625e-997b-4650-b608-acb10bf3ca57
description: Trigger alarm notifications when an intrusion is detected.
use_blueprint:
path: alarm/start_alarm.yaml
input:
name: Intrusion
group: binary_sensor.intrusion_activity
tag: '{{ states(''input_text.presence_armed_id'') }}'
actions:
- action: silence_{{ states('input_text.presence_armed_id') }}
title: Silence
- action: reset_{{ states('input_text.presence_armed_id') }}
title: Reset
silenced:
- condition: state
entity_id: input_boolean.silence_intrusion_alarm
state: 'off'
- alias: clear_intrusion_alarm
id: 8e77137f-af56-48bd-b82c-7e5bb0ab4ff8
description: Clear alarm notifications when an intrusion is no longer active.
use_blueprint:
path: alarm/clear_alarm.yaml
input:
name: Intrusion
group: binary_sensor.intrusion_activity
tag: '{{ states(''input_text.presence_armed_id'') }}'
- alias: silence_intrusion_alarm
id: 65383759-a03c-4c81-9965-7154e83626fd
description: Silence the home alarm audio when requested.
initial_state: true
mode: single
max_exceeded: silent
triggers:
- trigger: event
event_type:
- html5_notification.clicked
- mobile_app_notification_action
variables:
arming_id: '{{ states(''input_text.presence_armed_id'') }}'
conditions:
- condition: state
entity_id: binary_sensor.intrusion_activity
state: 'on'
- '{{ trigger.event.data.action == ''silence_'' ~ arming_id }}'
actions:
- action: input_boolean.turn_on
target:
entity_id: input_boolean.silence_intrusion_alarm
- action: notify.send_message
target:
entity_id: notify.intrusion_log
data:
message: ({{ arming_id }}) Intrusion alarm silenced.
- alias: reset_intrusion_alarm
id: f1d67201-6a81-4214-a528-8a5afff919c0
description: Reinitialize the home alarm when requested.
initial_state: true
mode: single
max_exceeded: silent
triggers:
- trigger: event
event_type:
- html5_notification.clicked
- mobile_app_notification_action
variables:
arming_id: '{{ states(''input_text.presence_armed_id'') }}'
conditions:
- condition: state
entity_id: binary_sensor.intrusion_activity
state: 'on'
- '{{ trigger.event.data.action == ''reset_'' ~ arming_id }}'
actions:
- action: notify.send_message
target:
entity_id: notify.intrusion_log
data:
message: ({{ arming_id }}) Intrusion alarm cleared manually.
- action: script.initialize_alarm_states
- id: 686ea290-b4ee-4220-ad02-e233771483b7
alias: karine_remote_restore_initial_option
description: Restore entity selected by Karine's remote after some time
use_blueprint:
path: reset_input_select.yaml
input:
default_option: light.bedside_karine
delay: 300
entity_id: input_select.karine_remote_entity
- id: 3ff136d3-b8cb-4016-bf56-c9b0a4b65e09
alias: karine_remote_apply_color_change
description: Turn on and change the color on Karine's remote entity
mode: queued
triggers:
- trigger: state
entity_id: input_select.karine_remote_color
actions:
- action: light.turn_on
target:
entity_id: '{{ states(''input_select.karine_remote_entity'') }}'
data:
rgb_color: '{{ trigger.to_state.state }}'
- id: b214c9a3-937d-4391-9915-98185b7cb152
alias: karine_remote
description: Map Karine's remote buttons to useful actions
use_blueprint:
path: zha/bedside_remote.yaml
input:
color_input_select: input_select.karine_remote_color
device_ieee: 14:b4:57:ff:fe:7c:23:0e
entity_input_select: input_select.karine_remote_entity
- id: automation.notify_jammed_lock
alias: notify_jammed_lock
initial_state: true
mode: parallel
triggers:
- trigger: state
entity_id: binary_sensor.kitchen_door_lock_jammed
to:
- 'on'
- 'off'
variables:
is_jammed: '{{ trigger.to_state.state }}'
actions:
- if: '{{ is_jammed == ''on'' }}'
then:
- action: python_script.notify
data:
tag: kitchen_lock_jammed
audio: true
persistent: true
push_target: household
priority: true
title: The kitchen door lock is jammed.
else:
- action: python_script.notify
data:
tag: kitchen_lock_jammed
audio: true
persistent: true
push_target: household
priority: true
dismiss: true
- id: f614d09a-6589-4e21-9f86-205edea10917
alias: master_bed_occupied
triggers:
- trigger: state
entity_id:
- binary_sensor.master_bed_occupied_chris
- binary_sensor.master_bed_occupied_karine
to: 'on'
action:
if:
- condition: state
entity_id: binary_sensor.master_bed_occupied_both
state: 'off'
- condition: state
entity_id:
- person.karine
- person.chris
state: home
then:
- action: script.bedtime
else:
- action: lock.lock
target:
entity_id: lock.kitchen_door
- action: script.everything_off
- id: 650fdbf6-2f22-4bd0-b430-c8a1c29d3217
alias: master_bedroom_spots_dimmer_scenes
use_blueprint:
path: zwave/paddle_scenes.yaml
input:
on_entity_id: event.master_bedroom_spots_dimmer_on_pressed
off_entity_id: event.master_bedroom_spots_dimmer_off_pressed
tap_on_2x:
- action: light.turn_on
target:
entity_id: light.bedside_chris
tap_off_2x:
- action: light.turn_off
target:
entity_id: light.bedside_chris
tap_on_3x:
- action: light.turn_on
target:
entity_id: light.master_bedroom_lights
tap_off_3x:
- action: light.turn_off
target:
entity_id: light.master_bedroom_lights
- id: 7d71c23b-929c-4553-a150-2f990fc7ff87
alias: master_bedroom_sconces_dimmer_scenes
use_blueprint:
path: zwave/paddle_scenes.yaml
input:
on_entity_id: event.master_bedroom_sconces_dimmer_on_pressed
off_entity_id: event.master_bedroom_sconces_dimmer_off_pressed
tap_on_2x:
- action: light.turn_on
target:
entity_id: light.bedside_karine
tap_off_2x:
- action: light.turn_off
target:
entity_id: light.bedside_karine
tap_on_3x:
- action: light.turn_on
target:
entity_id: light.master_bedroom_lights
tap_off_3x:
- action: light.turn_off
target:
entity_id: light.master_bedroom_lights
- id: 0a607c5b-9dc1-4e86-b46c-f5dd6ebcc542
alias: master_bedroom_closet_dimmer_scenes
use_blueprint:
path: zwave/paddle_scenes.yaml
input:
on_entity_id: event.master_bedroom_closet_light_switch_on_pressed
off_entity_id: event.master_bedroom_closet_light_switch_off_pressed
tap_on_2x:
- action: light.turn_on
target:
entity_id:
- light.master_bedroom_sconces
- light.master_bedroom_spots
tap_off_2x:
- action: light.turn_off
target:
entity_id: light.master_bedroom_lights
- alias: select_manual_climate_mode
id: a8b031db-937a-4b34-bd64-a30f51900ed0
description: Flag climate entity to manual mode when the managed temperature differs
from the actual temperature.
initial_state: true
mode: parallel
max: 9
triggers:
- trigger: state
entity_id:
- climate.heat_pump
- climate.basement_hallway_thermostat
- climate.dining_room_thermostat
- climate.guest_bedroom_thermostat
- climate.living_room_thermostat
- climate.lounge_thermostat
- climate.master_bedroom_thermostat
- climate.office_thermostat
- climate.studio_thermostat
attribute: temperature
not_to: unavailable
for: 5
variables:
name: "{{\n trigger.to_state.object_id\n | replace('_auto_mode', '')\n \
\ | replace('_mode', '')\n | replace('_comfort_setpoint', '')\n | replace('_eco_setpoint',\
\ '')\n}}"
auto_mode: '{{ states(''input_select.{}_auto_mode''.format(name)) | default(''Eco'')
}}'
mode: '{{ states(''input_select.{}_mode''.format(name)) | default(''Auto'') }}'
target_setpoint: '{{ states(''input_number.{}_{}_setpoint''.format(name, auto_mode
| lower)) | default | float(0) }}'
current_setpoint: '{{ trigger.to_state.attributes.temperature | default | float(0)
}}'
conditions: '{{ trigger.to_state.attributes.preset_mode | default(''none'') != ''none''
or target_setpoint != current_setpoint }}'
actions:
- action: input_select.select_option
target:
entity_id: input_select.{{ name }}_mode
data:
option: Manual
- alias: update_climate_setpoint
id: 0954c8e4-8429-4777-a8ba-4a1c99853ea2
description: Update climate setpoint
initial_state: true
mode: queued
max: 10
triggers:
- trigger: state
entity_id: &id001
- input_select.heat_pump_mode
- input_select.basement_hallway_thermostat_mode
- input_select.dining_room_thermostat_mode
- input_select.guest_bedroom_thermostat_mode
- input_select.living_room_thermostat_mode
- input_select.lounge_thermostat_mode
- input_select.master_bedroom_thermostat_mode
- input_select.office_thermostat_mode
- input_select.studio_thermostat_mode
to: Auto
- trigger: state
entity_id:
- input_select.heat_pump_auto_mode
- input_select.basement_hallway_thermostat_auto_mode
- input_select.dining_room_thermostat_auto_mode
- input_select.guest_bedroom_thermostat_auto_mode
- input_select.living_room_thermostat_auto_mode
- input_select.lounge_thermostat_auto_mode
- input_select.master_bedroom_thermostat_auto_mode
- input_select.office_thermostat_auto_mode
- input_select.studio_thermostat_auto_mode
to: null
- trigger: state
entity_id:
- input_number.heat_pump_comfort_setpoint
- input_number.basement_hallway_thermostat_comfort_setpoint
- input_number.dining_room_thermostat_comfort_setpoint
- input_number.guest_bedroom_thermostat_comfort_setpoint
- input_number.living_room_thermostat_comfort_setpoint
- input_number.lounge_thermostat_comfort_setpoint
- input_number.master_bedroom_thermostat_comfort_setpoint
- input_number.office_thermostat_comfort_setpoint
- input_number.studio_thermostat_comfort_setpoint
to: null
for: 5
- trigger: state
entity_id:
- input_number.heat_pump_eco_setpoint
- input_number.basement_hallway_thermostat_eco_setpoint
- input_number.dining_room_thermostat_eco_setpoint
- input_number.guest_bedroom_thermostat_eco_setpoint
- input_number.living_room_thermostat_eco_setpoint
- input_number.lounge_thermostat_eco_setpoint
- input_number.master_bedroom_thermostat_eco_setpoint
- input_number.office_thermostat_eco_setpoint
- input_number.studio_thermostat_eco_setpoint
to: null
for: 5
variables:
name: "{{\n trigger.to_state.object_id\n | replace('_auto_mode', '')\n \
\ | replace('_mode', '')\n | replace('_comfort_setpoint', '')\n | replace('_eco_setpoint',\
\ '')\n}}"
auto_mode: '{{ states(''input_select.{}_auto_mode''.format(name)) | default(''Eco'')
}}'
mode: '{{ states(''input_select.{}_mode''.format(name)) | default(''Auto'') }}'
target_setpoint: '{{ states(''input_number.{}_{}_setpoint''.format(name, auto_mode
| lower)) | default | float(0) }}'
current_setpoint: '{{ state_attr(''climate.{}''.format(name), ''temperature'')
| default | float(0) }}'
conditions: '{{ mode == ''Auto'' and target_setpoint != current_setpoint }}'
actions:
- action: climate.set_temperature
target:
entity_id: climate.{{ name }}
data:
temperature: '{{ target_setpoint }}'
- alias: start_manual_climate_reset_timer
id: 330d72c1-954a-4d1e-a3e1-47412d134dc5
description: Start the timer to reset climate modes to auto (managed) after it has
been on manual for some time.
mode: parallel
max: 15
triggers:
- trigger: state
entity_id: *id001
not_to: Auto
actions:
- action: timer.start
target:
entity_id: timer.{{ trigger.to_state.object_id | replace('_mode', '_manual_mode_reset')
}}
data:
duration: '{{ states(''input_datetime.climate_manual_mode_timer'') }}'
- alias: revert_manual_climate_mode
id: 5c387ec4-b18b-4ec6-9174-8d844e7e88e9
description: Reset climate mode to auto (managed) when the timer for manual time
is elapsed.
mode: parallel
max: 15
triggers:
- trigger: state
entity_id: &id002
- timer.heat_pump_manual_mode_reset
- timer.basement_hallway_thermostat_manual_mode_reset
- timer.dining_room_thermostat_manual_mode_reset
- timer.guest_bedroom_thermostat_manual_mode_reset
- timer.living_room_thermostat_manual_mode_reset
- timer.lounge_thermostat_manual_mode_reset
- timer.master_bedroom_thermostat_manual_mode_reset
- timer.office_thermostat_manual_mode_reset
- timer.studio_thermostat_manual_mode_reset
from: active
to: idle
conditions:
- condition: state
entity_id: input_boolean.climate_scheduling_enabled
state: 'on'
actions:
- action: input_select.select_option
target:
entity_id: input_select.{{ trigger.to_state.object_id | replace('_manual_mode_reset',
'_mode') }}
data:
option: Auto
- alias: revert_all_expired_manual_climate_mode
id: 2e58b9fa-1838-4c38-8b4a-d38b43c76105
description: Reset climate mode to auto (managed) when the timer for manual time
is elapsed.
mode: single
triggers:
- trigger: homeassistant
event: start
- trigger: state
entity_id: input_boolean.climate_scheduling_enabled
from: 'off'
to: 'on'
actions:
repeat:
for_each: *id002
sequence:
- if: '{{ is_state(repeat.item, ''idle'') }}'
then:
- action: input_select.select_option
target:
entity_id: input_select.{{ states[repeat.item].object_id | replace('_manual_mode_reset',
'_mode') }}
data:
option: Auto
- id: 88b9562c-a5bf-4be6-bd7b-d3dfe109a816
alias: Notify low batteries
initial_state: true
mode: parallel
triggers:
- trigger: numeric_state
entity_id:
- sensor.basement_bathroom_multisensor_battery
- sensor.basement_smoke_co_detector_battery
- sensor.chris_bedside_remote_battery
- sensor.drake_battery
- sensor.guest_bedroom_window_sensor_battery
- sensor.karine_bedside_remote_battery
- sensor.kitchen_door_lock_battery
- sensor.kitchen_door_sensor_battery
- sensor.kitchen_sink_leak_sensor_battery
- sensor.living_room_door_sensor_battery
- sensor.living_room_remote_battery
- sensor.living_room_smoke_co_detector_battery
- sensor.laundry_motion_sensor_battery
- sensor.lounge_airthings_battery
- sensor.lounge_window_sensor_battery
- sensor.main_bathroom_multisensor_battery
- sensor.maitre_doyle_battery
- sensor.snicket_battery
- sensor.spidy_battery
- sensor.studio_window_sensor_battery
- sensor.ups_battery_status
- sensor.viny_battery
- sensor.water_heater_leak_sensor_battery
- sensor.workshop_motion_sensor_battery
value_template: "{% if state.state in ['unknown', 'unavailable'] -%}\n 100\n\
{%- else -%}\n {{ state.state | int - state.attributes.battery_warning_level\
\ | default | int(25) - 1 }}\n{%- endif %}"
below: 0
actions:
- action: python_script.notify
data:
persistent: true
push_target: household
tag: battery_low_{{ trigger.to_state.object_id }}
url: "{% set battery_type = trigger.to_state.attributes.battery_type %} {% if\
\ battery_type is undefined %}\n \"/lovelace/settings\"\n{% else %}\n https://www.amazon.ca/s/?field-keywords=battery+{{\
\ battery_type | replace(' ', '+') }}\n{% endif %}"
title: Replace {{ trigger.to_state.name | lower }}
message: "{% set battery_type = trigger.to_state.attributes.battery_type %}\
\ {% if battery_type is defined %}\n Search on Amazon for \"{{ battery_type\
\ }}\" batteries.\n{% endif %}"
- id: 994eba31-84de-4769-8958-f24b5346111a
alias: notify_plant_problems
initial_state: true
mode: parallel
triggers:
- trigger: state
attribute: problem
entity_id:
- plant.drake
- plant.spidy
- plant.viny
variables:
name: '{{ trigger.to_state.name }}'
tag: plant_{{ trigger.to_state.object_id }}
issues: "{{\n (trigger.to_state.attributes.problem | default('') | lower).split(',\
\ ')\n | reject('match', '.*(unavailable|unknown|none)', ignorecase=true)\n\
\ | reject('match', '(brightness|battery).*', ignorecase=true)\n | reject('in',\
\ ['conductivity high'])\n | map('replace', 'moisture low', 'thirsty')\n\
\ | map('replace', 'moisture high', 'drowning')\n | map('replace', 'temperature\
\ low', 'cold')\n | map('replace', 'temperature high', 'hot')\n | map('replace',\
\ 'conductivity low', 'hungry')\n | sort\n}}"
actions:
- if: '{{ issues | length == 0 }}'
then:
- action: python_script.notify
data:
audio: '{{ is_state(''input_boolean.broadcast_plant_problems'', ''on'') }}'
persistent: true
push_target: household
tag: '{{ tag }}'
dismiss: true
else:
- action: python_script.notify
data:
audio: '{{ is_state(''input_boolean.broadcast_plant_problems'', ''on'') }}'
persistent: true
push_target: household
tag: '{{ tag }}'
url: /lovelace/livings
title: Check {{ name }}
message: "{% for issue in issues -%}\n {%- if loop.first %}{{ name }} is\
\ {% elif loop.last %} and {% else %}, {% endif -%}\n {{ issue }}\n {%-\
\ if loop.last %}.{% endif %}\n{%- endfor %}"
- id: 91bb52da-440a-4082-a6f3-4e58253a51c8
alias: notify_guest_arrives
initial_state: true
mode: parallel
triggers:
- trigger: state
entity_id:
- person.guest_cava
- person.guest_gipa
- person.guest_laboro
- person.guest_stfr
- person.guest_syvi
to: home
conditions: "{{\n is_state('input_boolean.notify_individual_guest_arrivals', 'on')\n\
\ or is_state_attr('sensor.guests_home', 'count', '1')\n}}"
actions:
- action: python_script.notify
data:
persistent: true
push_target: household
tag: presence_{{ trigger.to_state.object_id }}
title: '{{ trigger.to_state.name }} is here'
message: '{{ state_attr(''sensor.guests_home'', ''count'') }} guests are home.'
- id: 33ae901e-24b8-4576-b876-4d2a87a7bd3b
alias: notify_household_person_arrives
initial_state: true
mode: parallel
triggers:
- trigger: state
entity_id: &id003
- person.chris
- person.karine
to: home
conditions:
- condition: state
entity_id: input_boolean.notify_household_changes
state: 'on'
actions:
- action: python_script.notify
data:
push_target: admin
tag: presence_{{ trigger.to_state.object_id }}
title: '{{ trigger.to_state.name }} arrived home.'
message: Household is {{ states_translated('group.household') }}.
- id: b3882bea-08d5-4c54-a076-092754457354
alias: notify_household_person_leaves
initial_state: true
mode: parallel
triggers:
- trigger: state
entity_id: *id003
from: home
conditions:
- condition: state
entity_id: input_boolean.notify_household_changes
state: 'on'
actions:
- action: python_script.notify
data:
push_target: admin
tag: presence_{{ trigger.to_state.object_id }}
title: '{{ trigger.to_state.name }} left home.'
message: Household is {{ states_translated('group.household') }}.
- id: fd33012e-1f9a-4205-8c29-3639015bd2ad
alias: apply_scheduled_climate_preset
initial_state: true
mode: restart
triggers:
- trigger: state
entity_id: sensor.scheduled_climate_preset
to: null
- trigger: state
entity_id: input_boolean.climate_scheduling_enabled
to: 'on'
conditions:
- condition: state
entity_id: input_boolean.climate_scheduling_enabled
state: 'on'
- '{{ has_value(''sensor.scheduled_climate_preset'') }}'
actions:
- action: script.apply_scheduled_climate_preset
- id: a179c0b0-9c03-4be6-9437-c2bd6c58e9b7
alias: notify_new_network_device
initial_state: true
mode: parallel
triggers:
- trigger: event
event_type: device_tracker_new_device
actions:
- action: python_script.notify
data:
push_target: admin
persistent: true
title: New device detected on network
message: 'Device data: {{ trigger.event.data | tojson }}'
- id: 778a17bc-898a-43ca-a457-b42c5c32b193
alias: notify_server_state_change
initial_state: true
mode: parallel
triggers:
- trigger: state
entity_id:
- switch.network_media
to: null
for: 45
variables:
state: '{% if trigger.to_state.state == ''on'' %}on{% else %}off{% endif %}'
state_action: '{% if state == ''on'' %}off{% else %}on{% endif %}'
conditions:
- condition: state
entity_id: input_boolean.notify_server_outages
state: 'on'
actions:
- action: python_script.notify
data:
push_target: admin
tag: server_{{ trigger.to_state.object_id }}
title: '{{ trigger.to_state.name }} server is {{ state }}line'
url: /admin-infrastructure/network
push_data:
entity_id: '{{ trigger.entity_id }}'
push_actions:
- action: power_{{ state_action }}_server
title: Power {{ state_action }}
icon: /local/icons/power-plug-{{ state_action }}.png
- id: ed45f4fc-3c90-456d-b499-516f568adf4e
alias: power_on_server
initial_state: true
mode: parallel
triggers:
- trigger: event
event_type:
- html5_notification.clicked
- mobile_app_notification_action
event_data:
action: power_on_server
actions:
- action: switch.turn_on
target:
entity_id: '{{ trigger.event.data.data.entity_id }}'
- id: c4358eec-8328-4049-ba29-25438eb44fa6
alias: power_off_server
initial_state: true
mode: parallel
triggers:
- trigger: event
event_type:
- html5_notification.clicked
- mobile_app_notification_action
event_data:
action: power_off_server
actions:
- action: switch.turn_off
target:
entity_id: '{{ trigger.event.data.data.entity_id }}'
- id: 5cdf949f-e2e8-48b2-88c1-59f2c2f4fad2
alias: power_outage_management
initial_state: true
mode: restart
triggers:
- trigger: state
entity_id: binary_sensor.ups_online_status
to: 'off'
for: 30
variables:
shutdown_minutes: 2
actions:
- action: python_script.notify
data:
persistent: true
push_target: household
tag: power_outage
title: Power outage
url: /admin-infrastructure/network
message: 'A power outage is ongoing at home.
{%- if is_state(''switch.managed_auxialiary_servers'', ''off'') %} Auxiliary
servers are already turned off.
{%- elif is_state(''input_boolean.power_outage_manage_devices'', ''on'') %}
Auxiliary servers will automatically shutdown in {{ shutdown_minutes }} minutes.
{%- else %} Automatic shutdown of auxiliary servers is disabled.
{%- endif %}'
push_actions: "{% set ns = namespace(actions = []) %} {% if is_state('switch.managed_auxialiary_servers',\
\ 'on') %}\n {% set ns.actions = ns.actions + [{\"action\": \"power_outage_shutdown\"\
, \"title\": \"Shutdown now\"}] %}\n {% if is_state('input_boolean.power_outage_manage_devices',\
\ 'on') %}\n {% set ns.actions = ns.actions + [{\"action\": \"power_outage_cancel\"\
, \"title\": \"Cancel\"}] %}\n {% endif %}\n{% endif %} {{ ns.actions }}"
- condition: state
entity_id: switch.managed_auxialiary_servers
state: 'on'
- wait_for_trigger:
- trigger: state
entity_id: binary_sensor.ups_online_status
to: 'on'
- trigger: event
event_type:
- html5_notification.clicked
- mobile_app_notification_action
event_data:
action: power_outage_shutdown
- trigger: event
event_type:
- html5_notification.clicked
- mobile_app_notification_action
event_data:
action: power_outage_cancel
timeout:
minutes: '{{ shutdown_minutes if is_state(''input_boolean.power_outage_manage_devices'',
''on'') else 240 }}'
continue_on_timeout: true
- condition: "{% set timed_out = wait.trigger is none %} {{\n is_state('binary_sensor.ups_online_status',\
\ 'off')\n and (\n (timed_out and is_state('input_boolean.power_outage_manage_devices',\
\ 'on'))\n or (not timed_out and wait.trigger.event.data.action != 'power_outage_cancel')\n\
\ )\n}}"
- action: switch.turn_off
target:
entity_id: switch.network_media
- action: python_script.notify
data:
persistent: true
push_target: household
tag: power_outage
title: Power outage
url: /admin-infrastructure/network
message: A power outage is ongoing at home. Auxiliary servers have been shutdown.
- id: 37c346a4-c34f-40bf-9ad9-d34407afc29c
alias: notify_power_restored
initial_state: true
mode: restart
triggers:
- trigger: state
entity_id: binary_sensor.ups_online_status
to: 'on'
for: 60
- trigger: homeassistant
event: start
variables:
power_on_minutes: 2
conditions:
- condition: state
entity_id: binary_sensor.ups_online_status
state: 'on'
for: 60
actions:
- action: python_script.notify
data:
persistent: true
push_target: household
title: Power restored
message: 'A power outage has finished after {{ time_since(trigger.from_state.last_changed,
0) }}.
{%- if is_state(''switch.managed_auxialiary_servers'', ''on'') %} Auxiliary
servers are already powered on.
{%- elif is_state(''input_boolean.power_outage_manage_devices'', ''on'') %}
Auxiliary servers will automatically power on in {{ power_on_minutes }} minutes.
{%- else %} Automatic power on of auxiliary servers is disabled.
{%- endif %}'
push_actions: "{% set ns = namespace(actions = []) %} {% if is_state('switch.managed_auxialiary_servers',\
\ 'off') and is_state('input_boolean.power_outage_manage_devices', 'on') %}\n\
\ {% set ns.actions = ns.actions + [{\"action\": \"power_restored_cancel\"\
, \"title\": \"Cancel\"}] %}\n{% endif %} {{ ns.actions }}"
- condition: and
conditions:
- condition: state
entity_id: switch.managed_auxialiary_servers
state: 'off'
- condition: state
entity_id: input_boolean.power_outage_manage_devices
state: 'on'
- wait_for_trigger:
- trigger: state
entity_id: binary_sensor.ups_online_status
to: 'off'
- trigger: event
event_type:
- html5_notification.clicked
- mobile_app_notification_action
event_data:
action: power_restored_cancel
timeout:
minutes: '{{ power_on_minutes }}'
continue_on_timeout: true
- condition: "{% set timed_out = wait.trigger is none %} {{\n is_state('binary_sensor.ups_online_status',\
\ 'on')\n and timed_out\n and is_state('input_boolean.power_outage_manage_devices',\
\ 'on')\n}}"
- action: switch.turn_on
target:
entity_id: switch.network_media
- id: dc44848a-cdb1-4b0b-bd76-711a2f81e4b2
alias: schedule_hydro_peak_event
initial_state: true
mode: parallel
triggers:
- trigger: state
entity_id: sensor.chris_pixel_6_last_notification
to: null
variables:
text: '{{ trigger.to_state.attributes[''android.text''] | default('''') }}'
conditions:
- '{{ is_state(''binary_sensor.winter_credit_enabled'', ''on'') }}'
- '{{ trigger.to_state.attributes[''package''] | default('''') == ''com.hydroquebec.mf_android''
}}'
- '{{ ''Winter Credit Option:'' in text }}'
- '{{ ''Reminder.'' not in text }}'
actions:
- variables:
text: '{{ text | replace(''a.m.'', ''AM'') | replace(''p.m.'', ''PM'') }}'
pattern: '(?:([a-z]+\.? \d{1,2}), )?from (\d{1,2}(?::\d{2})?)(?: (AM|PM))? to
(\d{1,2}(?::\d{2})?)(?: (AM|PM)?)'
date_time_format: '%Y-%m-%d %H:%M:%S'
count: '{{ text | regex_findall(pattern, ignorecase = True) | length }}'
events: "{% set ns = namespace(day = None, events = []) %}\n{% for match in\
\ (text | regex_findall(pattern, ignorecase = True)) %}\n {% set ns.day =\
\ strptime(match[0] | regex_replace('[^a-zA-Z0-9 ]', ''), '%b %d', None) |\
\ default(ns.day, True) -%}\n {% set start_hour = strptime(\n match[1]\n\
\ ~ (':00' if ':' not in match[1])\n ~ ' ' ~ (match[2] or match[4]\
\ or 'AM'),\n '%I:%M %p', None) -%}\n {% set end_hour = strptime(\n\
\ match[3]\n ~ (':00' if ':' not in match[3])\n ~ ' ' ~\
\ (match[4] or match[2] or 'AM'),\n '%I:%M %p', None) -%}\n\n {% if\
\ [ns.day, start_hour, end_hour] | select('none') | first is not none -%}\n\
\ {%- set start = ns.day.replace(year = now().year, hour = start_hour.hour,\
\ minute = start_hour.minute) -%}\n {%- set end = ns.day.replace(year =\
\ now().year, hour = end_hour.hour, minute = end_hour.minute) -%}\n {%\
\ set ns.events = ns.events + [{\n 'start': (start - timedelta(minutes\
\ = 90)) | as_timestamp | timestamp_custom(date_time_format),\n 'end':\
\ start | as_timestamp | timestamp_custom(date_time_format),\n 'preset':\
\ 'Boost',\n }, {\n 'start': start | as_timestamp | timestamp_custom(date_time_format),\n\
\ 'end': end | as_timestamp | timestamp_custom(date_time_format),\n \
\ 'preset': 'Winter Credit: Peak Event',\n }, {\n 'start': end\
\ | as_timestamp | timestamp_custom(date_time_format),\n 'end': (end\
\ + timedelta(minutes = 90)) | as_timestamp | timestamp_custom(date_time_format),\n\
\ 'preset': 'Boost',\n }] -%}\n {% endif -%}\n{% endfor %}\n{{ ns.events\
\ }}\n"
- if: '{{ count == 0 or count != events | length / 3 }}'
then:
- action: persistent_notification.create
data:
title: Failed to parse peak event notification
message: '<strong>{{ text }}</strong>
<hr>
<pre>{{ events }}</pre>
'
else:
- repeat:
for_each: '{{ events }}'
sequence:
- action: calendar.create_event
target:
entity_id: calendar.climate_exceptions
data:
summary: '{{ repeat.item.preset }}'
description: '{{ text }}'
start_date_time: '{{ repeat.item.start }}'
end_date_time: '{{ repeat.item.end }}'
- id: automation.detect_dead_zwave_nodes
alias: detect_dead_zwave_nodes
initial_state: true
triggers:
- trigger: state
entity_id: &id004
- sensor.backyard_outlet_node_status
- sensor.backyard_soffit_spots_dimmer_node_status
- sensor.basement_bathroom_fan_switch_node_status
- sensor.basement_bathroom_light_switch_node_status
- sensor.basement_bathroom_multisensor_node_status
- sensor.basement_bathroom_vanity_dimmer_node_status
- sensor.basement_hallway_dimmer_node_status
- sensor.basement_hallway_thermostat_node_status
- sensor.basement_smoke_co_detector_node_status
- sensor.bookshelf_light_switch_node_status
- sensor.dining_room_light_dimmer_node_status
- sensor.dining_room_thermostat_node_status
- sensor.downstairs_light_switch_node_status
- sensor.front_porch_light_switch_node_status
- sensor.guest_bedroom_closet_light_switch_node_status
- sensor.guest_bedroom_dimmer_node_status
- sensor.guest_bedroom_thermostat_node_status
- sensor.guest_bedroom_window_sensor_node_status
- sensor.hallway_spots_dimmer_node_status
- sensor.kitchen_door_lock_node_status
- sensor.kitchen_door_sensor_node_status
- sensor.kitchen_sink_light_switch_node_status
- sensor.kitchen_track_light_dimmer_node_status
- sensor.kitchen_sink_leak_sensor_node_status
- sensor.laundry_dimmer_node_status
- sensor.laundry_motion_sensor_node_status
- sensor.living_room_couch_outlet_node_status
- sensor.living_room_door_sensor_node_status
- sensor.living_room_remote_node_status
- sensor.living_room_smoke_co_detector_node_status
- sensor.living_room_thermostat_node_status
- sensor.lounge_dimmer_node_status
- sensor.lounge_thermostat_node_status
- sensor.lounge_window_sensor_node_status
- sensor.main_bathroom_dimmer_node_status
- sensor.main_bathroom_fan_switch_node_status
- sensor.main_bathroom_multisensor_node_status
- sensor.main_bathroom_vanity_light_switch_node_status
- sensor.main_water_shut_off_valve_node_status
- sensor.master_bedroom_closet_light_switch_node_status
- sensor.master_bedroom_sconces_switch_node_status
- sensor.master_bedroom_spots_switch_node_status
- sensor.master_bedroom_thermostat_node_status
- sensor.office_spots_dimmer_node_status
- sensor.office_lamp_node_status
- sensor.office_thermostat_node_status
- sensor.shed_light_switch_node_status
- sensor.shed_outdoor_light_switch_node_status
- sensor.side_porch_sconce_dimmer_node_status
- sensor.lydia_power_strip_node_status
- sensor.staircase_dimmer_node_status
- sensor.studio_dimmer_node_status
- sensor.studio_thermostat_node_status
- sensor.studio_window_sensor_node_status
- sensor.washing_machine_leak_sensor_node_status
- sensor.water_heater_leak_sensor_node_status
- sensor.water_heater_switch_node_status
- sensor.workshop_light_switch_node_status
- sensor.workshop_motion_sensor_node_status
from: alive
to: dead
for: 60
variables:
dismiss: false
- trigger: state
entity_id: *id004
from: dead
to: alive
variables:
dismiss: true
actions:
- action: python_script.notify
data:
push_target: admin
persistent: true
dismiss: '{{ dismiss }}'
tag: '{{ trigger.to_state.entity_id }}'
title: '☠️ {{ trigger.to_state.name | lower | replace('': node status'', '''')
| title }} is dead '