6065 lines
201 KiB
YAML
6065 lines
201 KiB
YAML
- id: appliance_cycle_complete_consolidated
|
|
alias: Appliance - Unified Cycle Complete
|
|
description: Consolidated automation for all appliance completion notifications
|
|
mode: queued
|
|
max: 3
|
|
trigger:
|
|
- platform: state
|
|
entity_id: sensor.washing_machine_status
|
|
to: complete
|
|
from: running
|
|
id: washing_machine
|
|
- platform: state
|
|
entity_id: sensor.dryer_status_2
|
|
to: Complete
|
|
from: Running
|
|
id: dryer
|
|
- platform: state
|
|
entity_id: sensor.dishwasher_power_state
|
|
to: idle
|
|
from: running
|
|
id: dishwasher
|
|
condition:
|
|
- condition: template
|
|
value_template: "{% set appliance = trigger.id %} {% if appliance == \"washing_machine\"\
|
|
\ %}\n {{ is_state('sensor.washing_machine_status', 'complete') }}\n{% elif\
|
|
\ appliance == \"dryer\" %}\n {{ is_state('sensor.dryer_status_2', 'Complete')\
|
|
\ }}\n{% elif appliance == \"dishwasher\" %}\n {{ is_state('sensor.dishwasher_power_state',\
|
|
\ 'idle') }}\n{% else %}\n false\n{% endif %}\n"
|
|
action:
|
|
- choose:
|
|
- conditions:
|
|
- condition: template
|
|
value_template: '{{ trigger.id == ''washing_machine'' }}'
|
|
sequence:
|
|
- service: script.turn_on
|
|
target:
|
|
entity_id: script.send_appliance_notification
|
|
data:
|
|
variables:
|
|
appliance_name: Washing Machine
|
|
completion_message: Cycle finished - time to unload the washing machine!
|
|
icon: mdi:washing-machine
|
|
notification_type: complete
|
|
- service: notify.alexa_media_everywhere
|
|
continue_on_error: true
|
|
data:
|
|
title: Washing Machine Complete
|
|
message: The washing machine cycle is complete and ready to unload.
|
|
data:
|
|
type: tts
|
|
- conditions:
|
|
- condition: template
|
|
value_template: '{{ trigger.id == ''dryer'' }}'
|
|
sequence:
|
|
- service: script.turn_on
|
|
target:
|
|
entity_id: script.send_appliance_notification
|
|
data:
|
|
variables:
|
|
appliance_name: Dryer
|
|
completion_message: Cycle finished - remove clothes to prevent wrinkles!
|
|
icon: mdi:tumble-dryer
|
|
notification_type: complete
|
|
- service: notify.alexa_media_everywhere
|
|
continue_on_error: true
|
|
data:
|
|
title: Dryer Complete
|
|
message: The dryer cycle is complete. Please remove your clothes to prevent
|
|
wrinkles.
|
|
data:
|
|
type: tts
|
|
- conditions:
|
|
- condition: template
|
|
value_template: '{{ trigger.id == ''dishwasher'' }}'
|
|
sequence:
|
|
- service: script.turn_on
|
|
target:
|
|
entity_id: script.send_appliance_notification
|
|
data:
|
|
variables:
|
|
appliance_name: Dishwasher
|
|
completion_message: Cycle finished - dishes are clean!
|
|
icon: mdi:dishwasher
|
|
notification_type: complete
|
|
- id: stop_appliance_reminders_handler_consolidated
|
|
alias: Appliance - Unified Reminder Stop Handler
|
|
description: Consolidated handler for all appliance reminder stop buttons
|
|
mode: queued
|
|
max: 3
|
|
trigger:
|
|
- platform: event
|
|
event_type: call_service
|
|
event_data:
|
|
domain: input_button
|
|
service: press
|
|
service_data:
|
|
entity_id: input_button.stop_dishwasher_reminders
|
|
id: dishwasher
|
|
- platform: event
|
|
event_type: call_service
|
|
event_data:
|
|
domain: input_button
|
|
service: press
|
|
service_data:
|
|
entity_id: input_button.stop_washing_machine_reminders
|
|
id: washing_machine
|
|
- platform: event
|
|
event_type: call_service
|
|
event_data:
|
|
domain: input_button
|
|
service: press
|
|
service_data:
|
|
entity_id: input_button.stop_dryer_reminders
|
|
id: dryer
|
|
action:
|
|
- choose:
|
|
- conditions:
|
|
- condition: template
|
|
value_template: '{{ trigger.id == ''dishwasher'' }}'
|
|
sequence:
|
|
- service: notify.mobile_app_pixel_9_pro_xl
|
|
data:
|
|
message: clear_notification
|
|
data:
|
|
tag: dishwasher_complete
|
|
- service: input_boolean.turn_on
|
|
target:
|
|
entity_id: input_boolean.dishwasher_reminders_stopped
|
|
continue_on_error: true
|
|
- service: notify.mobile_app_pixel_9_pro_xl
|
|
data:
|
|
title: 🍽️ Dishwasher Reminders Stopped
|
|
message: Dishwasher cycle reminders have been disabled.
|
|
data:
|
|
tag: dishwasher_reminders_stopped
|
|
channel: Appliances
|
|
timeout: 10
|
|
- service: notify.alexa_media_everywhere
|
|
continue_on_error: true
|
|
data:
|
|
title: Dishwasher Reminders
|
|
message: Dishwasher reminders have been stopped.
|
|
data:
|
|
type: tts
|
|
- conditions:
|
|
- condition: template
|
|
value_template: '{{ trigger.id == ''washing_machine'' }}'
|
|
sequence:
|
|
- service: notify.mobile_app_pixel_9_pro_xl
|
|
data:
|
|
message: clear_notification
|
|
data:
|
|
tag: washing_machine_complete
|
|
- service: input_boolean.turn_on
|
|
target:
|
|
entity_id: input_boolean.washing_machine_reminders_stopped
|
|
continue_on_error: true
|
|
- service: notify.mobile_app_pixel_9_pro_xl
|
|
data:
|
|
title: 🧺 Washing Machine Reminders Stopped
|
|
message: Washing machine cycle reminders have been disabled.
|
|
data:
|
|
tag: washing_machine_reminders_stopped
|
|
channel: Appliances
|
|
timeout: 10
|
|
- service: notify.alexa_media_everywhere
|
|
continue_on_error: true
|
|
data:
|
|
title: Washing Machine Reminders
|
|
message: Washing machine reminders have been stopped.
|
|
data:
|
|
type: tts
|
|
- conditions:
|
|
- condition: template
|
|
value_template: '{{ trigger.id == ''dryer'' }}'
|
|
sequence:
|
|
- service: notify.mobile_app_pixel_9_pro_xl
|
|
data:
|
|
message: clear_notification
|
|
data:
|
|
tag: dryer_complete
|
|
- service: input_boolean.turn_on
|
|
target:
|
|
entity_id: input_boolean.dryer_reminders_stopped
|
|
continue_on_error: true
|
|
- service: notify.mobile_app_pixel_9_pro_xl
|
|
data:
|
|
title: 👕 Dryer Reminders Stopped
|
|
message: Dryer cycle reminders have been disabled.
|
|
data:
|
|
tag: dryer_reminders_stopped
|
|
channel: Appliances
|
|
timeout: 10
|
|
- service: notify.alexa_media_everywhere
|
|
continue_on_error: true
|
|
data:
|
|
title: Dryer Reminders
|
|
message: Dryer reminders have been stopped.
|
|
data:
|
|
type: tts
|
|
- id: '1742241925341'
|
|
alias: Tell Kristy the dryer is done
|
|
description: Notify when dryer cycle completes
|
|
triggers:
|
|
- trigger: state
|
|
entity_id:
|
|
- sensor.dryer_machine_state
|
|
from: run
|
|
to: stop
|
|
conditions: []
|
|
actions:
|
|
- action: notify.mobile_app_pixel_9_pro_xl
|
|
data:
|
|
message: Dryer is finished
|
|
title: Dryer
|
|
mode: single
|
|
- id: '1737217638878'
|
|
alias: pantry_light_motion
|
|
description: Motion-activated pantry light
|
|
trigger:
|
|
- platform: state
|
|
entity_id: binary_sensor.eye_of_sauron_motion_detection
|
|
to: 'on'
|
|
action:
|
|
- service: light.turn_on
|
|
target:
|
|
entity_id: light.pantry_light
|
|
mode: restart
|
|
- id: '1736972664016'
|
|
alias: garage_door_always_on
|
|
description: Keep garage door opener always powered on
|
|
triggers:
|
|
- entity_id:
|
|
- switch.tp_link_power_strip_8bba_garage_door_opener_always_on
|
|
to: 'off'
|
|
trigger: state
|
|
actions:
|
|
- action: switch.turn_on
|
|
data: {}
|
|
target:
|
|
entity_id: switch.tp_link_power_strip_8bba_garage_door_opener_always_on
|
|
mode: single
|
|
- id: '1742733210353'
|
|
alias: Morning lights
|
|
description: Turn on hall light at 7 AM
|
|
triggers:
|
|
- trigger: time
|
|
at: 07:00:00
|
|
conditions: []
|
|
actions:
|
|
- service: light.turn_on
|
|
target:
|
|
entity_id: light.hall_light
|
|
mode: single
|
|
- id: ble_scan_trigger
|
|
alias: BLE Device Discovery - Scan Trigger
|
|
description: Triggers BLE device scan notification when scan button is pressed
|
|
trigger:
|
|
- platform: state
|
|
entity_id: input_button.bluetooth_scan
|
|
action:
|
|
- service: persistent_notification.create
|
|
data:
|
|
message: BLE device scan initiated. Custom Python scripts will handle the scanning
|
|
process.
|
|
title: BLE Scan Started
|
|
notification_id: ble_scan_started
|
|
- id: ble_device_selection_helper
|
|
alias: BLE Device Discovery - Device Selection Helper
|
|
description: Helper automation to notify when a device is selected
|
|
trigger:
|
|
- platform: state
|
|
entity_id: input_text.selected_ble_device
|
|
condition:
|
|
- condition: template
|
|
value_template: '{{ trigger.to_state and trigger.to_state.state != '''' and trigger.to_state.state
|
|
!= ''unknown'' }}'
|
|
action:
|
|
- service: persistent_notification.create
|
|
data:
|
|
message: Device {{ trigger.to_state.state if trigger.to_state else 'unknown'
|
|
}} selected. Configure and add it using the dashboard.
|
|
title: BLE Device Selected
|
|
notification_id: ble_device_selected
|
|
- id: ble_discovery_startup
|
|
alias: BLE Device Discovery - Startup Initialization
|
|
description: Initialize BLE discovery system on Home Assistant startup
|
|
trigger:
|
|
- platform: homeassistant
|
|
event: start
|
|
action:
|
|
- delay: 00:00:30
|
|
- service: input_text.set_value
|
|
target:
|
|
entity_id: input_text.discovered_ble_devices
|
|
data:
|
|
value: '{}'
|
|
- service: persistent_notification.create
|
|
data:
|
|
message: Enhanced BLE Device Discovery system initialized. Access the utility
|
|
dashboard at /lovelace/ble-utility
|
|
title: BLE Discovery Ready
|
|
notification_id: ble_discovery_ready
|
|
- alias: BLE Car Detection Processor
|
|
id: ble_car_detection_processor
|
|
description: Process BLE gateway data and trigger device events
|
|
trigger:
|
|
platform: mqtt
|
|
topic: xbg
|
|
condition:
|
|
- condition: template
|
|
value_template: '{{ trigger.payload_json is defined }}'
|
|
action:
|
|
- choose:
|
|
- conditions:
|
|
- condition: template
|
|
value_template: '{% set devices = trigger.payload_json.devices if trigger.payload_json.devices
|
|
is defined else [] %} {% set car1_mac_raw = states(''input_text.ble_driveway_car_1_mac'')
|
|
%} {% set car1_mac = car1_mac_raw.replace('':'', '''') if car1_mac_raw not
|
|
in [''unknown'', ''unavailable'', ''''] else '''' %} {% set target_device
|
|
= devices | selectattr(''1'', ''eq'', car1_mac) | list %} {% set rssi_threshold
|
|
= states(''input_number.ble_car1_rssi_threshold'') | int(-100) %} {{ car1_mac
|
|
!= '''' and target_device | count > 0 and target_device[0][2] > rssi_threshold
|
|
}}
|
|
|
|
'
|
|
sequence:
|
|
- service: input_boolean.turn_on
|
|
target:
|
|
entity_id: input_boolean.ble_car1_present
|
|
- service: input_number.set_value
|
|
target:
|
|
entity_id: input_number.ble_car1_rssi
|
|
data:
|
|
value: '{% set devices = trigger.payload_json.devices if trigger.payload_json.devices
|
|
is defined else [] %} {% set car1_mac_raw = states(''input_text.ble_driveway_car_1_mac'')
|
|
%} {% set car1_mac = car1_mac_raw.replace('':'', '''') if car1_mac_raw
|
|
not in [''unknown'', ''unavailable'', ''''] else '''' %} {% set target_device
|
|
= devices | selectattr(''1'', ''eq'', car1_mac) | list %} {{ target_device[0][2]
|
|
if target_device | count > 0 else -100 }}
|
|
|
|
'
|
|
- conditions:
|
|
- condition: template
|
|
value_template: '{% set devices = trigger.payload_json.devices if trigger.payload_json.devices
|
|
is defined else [] %} {% set car2_mac_raw = states(''input_text.ble_driveway_car_2_mac'')
|
|
%} {% set car2_mac = car2_mac_raw.replace('':'', '''') if car2_mac_raw not
|
|
in [''unknown'', ''unavailable'', ''''] else '''' %} {% set target_device
|
|
= devices | selectattr(''1'', ''eq'', car2_mac) | list %} {% set rssi_threshold
|
|
= states(''input_number.ble_car2_rssi_threshold'') | int(-100) %} {{ car2_mac
|
|
!= '''' and target_device | count > 0 and target_device[0][2] > rssi_threshold
|
|
}}
|
|
|
|
'
|
|
sequence:
|
|
- service: input_boolean.turn_on
|
|
target:
|
|
entity_id: input_boolean.ble_car2_present
|
|
- service: input_number.set_value
|
|
target:
|
|
entity_id: input_number.ble_car2_rssi
|
|
data:
|
|
value: '{% set devices = trigger.payload_json.devices if trigger.payload_json.devices
|
|
is defined else [] %} {% set car2_mac_raw = states(''input_text.ble_driveway_car_2_mac'')
|
|
%} {% set car2_mac = car2_mac_raw.replace('':'', '''') if car2_mac_raw
|
|
not in [''unknown'', ''unavailable'', ''''] else '''' %} {% set target_device
|
|
= devices | selectattr(''1'', ''eq'', car2_mac) | list %} {{ target_device[0][2]
|
|
if target_device | count > 0 else -100 }}
|
|
|
|
'
|
|
- conditions:
|
|
- condition: template
|
|
value_template: '{% set devices = trigger.payload_json.devices if trigger.payload_json.devices
|
|
is defined else [] %} {% set car3_mac_raw = states(''input_text.ble_driveway_car_3_mac'')
|
|
%} {% set car3_mac = car3_mac_raw.replace('':'', '''') if car3_mac_raw not
|
|
in [''unknown'', ''unavailable'', ''''] else '''' %} {% set target_device
|
|
= devices | selectattr(''1'', ''eq'', car3_mac) | list %} {% set rssi_threshold
|
|
= states(''input_number.ble_car3_rssi_threshold'') | int(-100) %} {{ car3_mac
|
|
!= '''' and target_device | count > 0 and target_device[0][2] > rssi_threshold
|
|
}}
|
|
|
|
'
|
|
sequence:
|
|
- service: input_boolean.turn_on
|
|
target:
|
|
entity_id: input_boolean.ble_car3_present
|
|
- service: input_number.set_value
|
|
target:
|
|
entity_id: input_number.ble_car3_rssi
|
|
data:
|
|
value: '{% set devices = trigger.payload_json.devices if trigger.payload_json.devices
|
|
is defined else [] %} {% set car3_mac_raw = states(''input_text.ble_driveway_car_3_mac'')
|
|
%} {% set car3_mac = car3_mac_raw.replace('':'', '''') if car3_mac_raw
|
|
not in [''unknown'', ''unavailable'', ''''] else '''' %} {% set target_device
|
|
= devices | selectattr(''1'', ''eq'', car3_mac) | list %} {{ target_device[0][2]
|
|
if target_device | count > 0 else -100 }}
|
|
|
|
'
|
|
- conditions:
|
|
- condition: template
|
|
value_template: '{% set devices = trigger.payload_json.devices if trigger.payload_json.devices
|
|
is defined else [] %} {% set street_mac_raw = states(''input_text.ble_street_car_mac'')
|
|
%} {% set street_mac = street_mac_raw.replace('':'', '''') if street_mac_raw
|
|
not in [''unknown'', ''unavailable'', ''''] else '''' %} {% set target_device
|
|
= devices | selectattr(''1'', ''eq'', street_mac) | list %} {% set rssi_threshold
|
|
= states(''input_number.ble_street_car_rssi_threshold'') | int(-100) %}
|
|
{{ street_mac != '''' and target_device | count > 0 and target_device[0][2]
|
|
> rssi_threshold }}
|
|
|
|
'
|
|
sequence:
|
|
- service: input_boolean.turn_on
|
|
target:
|
|
entity_id: input_boolean.ble_street_car_present
|
|
- service: input_number.set_value
|
|
target:
|
|
entity_id: input_number.ble_street_car_rssi
|
|
data:
|
|
value: '{% set devices = trigger.payload_json.devices if trigger.payload_json.devices
|
|
is defined else [] %} {% set street_mac_raw = states(''input_text.ble_street_car_mac'')
|
|
%} {% set street_mac = street_mac_raw.replace('':'', '''') if street_mac_raw
|
|
not in [''unknown'', ''unavailable'', ''''] else '''' %} {% set target_device
|
|
= devices | selectattr(''1'', ''eq'', street_mac) | list %} {{ target_device[0][2]
|
|
if target_device | count > 0 else -100 }}
|
|
|
|
'
|
|
default:
|
|
- service: input_boolean.turn_off
|
|
target:
|
|
entity_id:
|
|
- input_boolean.ble_car1_present
|
|
- input_boolean.ble_car2_present
|
|
- input_boolean.ble_car3_present
|
|
- input_boolean.ble_street_car_present
|
|
- service: input_number.set_value
|
|
target:
|
|
entity_id:
|
|
- input_number.ble_car1_rssi
|
|
- input_number.ble_car2_rssi
|
|
- input_number.ble_car3_rssi
|
|
- input_number.ble_street_car_rssi
|
|
data:
|
|
value: -100
|
|
- alias: BLE System Health Monitor
|
|
id: ble_system_health_monitor
|
|
description: Monitor BLE system health and provide fallback functionality
|
|
trigger:
|
|
- platform: time_pattern
|
|
minutes: /10
|
|
condition:
|
|
- condition: state
|
|
entity_id: input_boolean.ble_garage_door_automation
|
|
state: 'on'
|
|
action:
|
|
- choose:
|
|
- conditions:
|
|
- condition: template
|
|
value_template: "{{ has_value('sensor.ble_gateway_raw_data') and\n (now()\
|
|
\ - states.sensor.ble_gateway_raw_data.last_changed).total_seconds() > 600\
|
|
\ }}\n"
|
|
sequence:
|
|
- service: system_log.write
|
|
data:
|
|
level: warning
|
|
message: ⚠️ BLE Gateway offline - Safe mode active
|
|
- service: input_boolean.turn_off
|
|
target:
|
|
entity_id:
|
|
- input_boolean.ble_car1_present
|
|
- input_boolean.ble_car2_present
|
|
- input_boolean.ble_car3_present
|
|
- input_boolean.ble_street_car_present
|
|
continue_on_error: true
|
|
default:
|
|
- service: system_log.write
|
|
data:
|
|
level: info
|
|
message: ✅ BLE System operational
|
|
- alias: BLE System Startup
|
|
id: ble_system_startup
|
|
description: Initialize BLE system on Home Assistant startup
|
|
trigger:
|
|
- platform: homeassistant
|
|
event: start
|
|
action:
|
|
- delay: 00:01:00
|
|
- service: homeassistant.turn_on
|
|
target:
|
|
entity_id: input_boolean.ble_garage_door_automation
|
|
- service: homeassistant.turn_on
|
|
target:
|
|
entity_id: input_boolean.driveway_car_1_beacon_enabled
|
|
- service: homeassistant.turn_on
|
|
target:
|
|
entity_id: input_boolean.driveway_car_2_beacon_enabled
|
|
- service: homeassistant.turn_on
|
|
target:
|
|
entity_id: input_boolean.driveway_car_3_beacon_enabled
|
|
- service: system_log.write
|
|
data:
|
|
level: info
|
|
message: 🚀 BLE system initialized at {{ now().strftime('%H:%M:%S') }}
|
|
- service: system_log.write
|
|
data:
|
|
level: info
|
|
message: '{{ now().strftime(''%H:%M:%S'') }} - BLE System started'
|
|
- id: ble_garage_door_driveway_car_1_arrival
|
|
alias: BLE Garage Door - Driveway Car 1 Arrival
|
|
description: Open garage door when Driveway Car 1 beacon is detected
|
|
trigger:
|
|
- platform: state
|
|
entity_id: input_boolean.ble_car1_present
|
|
to: 'on'
|
|
condition:
|
|
- condition: state
|
|
entity_id: input_boolean.ble_garage_door_automation
|
|
state: 'on'
|
|
- condition: state
|
|
entity_id: input_boolean.driveway_car_1_beacon_enabled
|
|
state: 'on'
|
|
- condition: state
|
|
entity_id: input_boolean.garage_door_manual_override
|
|
state: 'off'
|
|
- condition: template
|
|
value_template: "{% if states('input_boolean.ble_garage_door_night_disable') ==\
|
|
\ 'on' %}\n {% set current_hour = now().hour %}\n {% set night_start = states('input_number.ble_garage_door_night_start_hour')\
|
|
\ | int %}\n {% set night_end = states('input_number.ble_garage_door_night_end_hour')\
|
|
\ | int %}\n {{ not (current_hour >= night_start or current_hour < night_end)\
|
|
\ }}\n{% else %}\n {{ true }}\n{% endif %}"
|
|
- condition: template
|
|
value_template: "{% set last_activation = states('input_text.ble_garage_door_last_activation')\
|
|
\ %} {% if last_activation == 'Never' %}\n {{ true }}\n{% else %}\n {% set\
|
|
\ cooldown_minutes = states('input_number.ble_garage_door_cooldown_minutes')\
|
|
\ | int %}\n {% set last_time = strptime(last_activation, '%Y-%m-%d %H:%M:%S')\
|
|
\ %}\n {% set time_diff = (now() - last_time).total_seconds() / 60 %}\n {{\
|
|
\ time_diff > cooldown_minutes }}\n{% endif %}"
|
|
- condition: numeric_state
|
|
entity_id: input_number.ble_car1_rssi
|
|
above: -100
|
|
below: 0
|
|
action:
|
|
- delay: '{{ states(''input_number.ble_garage_door_arrival_delay'') | int }}'
|
|
- service: cover.open_cover
|
|
entity_id: cover.garage_door
|
|
- service: input_text.set_value
|
|
target:
|
|
entity_id: input_text.ble_garage_door_last_activation
|
|
data:
|
|
value: '{{ now().strftime(''%Y-%m-%d %H:%M:%S'') }}'
|
|
- service: input_text.set_value
|
|
target:
|
|
entity_id: input_text.ble_driveway_car_1_last_seen
|
|
data:
|
|
value: '{{ now().strftime(''%Y-%m-%d %H:%M:%S'') }}'
|
|
- service: input_text.set_value
|
|
target:
|
|
entity_id: input_text.ble_garage_door_recent_events
|
|
data:
|
|
value: '{{ now().strftime(''%H:%M:%S'') }} - Garage opened for Driveway Car
|
|
1'
|
|
- service: input_text.set_value
|
|
target:
|
|
entity_id: input_text.ble_garage_door_system_status
|
|
data:
|
|
value: Garage door opened for Driveway Car 1 at {{ now().strftime('%H:%M:%S')
|
|
}}
|
|
- id: ble_garage_door_driveway_car_2_arrival
|
|
alias: BLE Garage Door - Driveway Car 2 Arrival
|
|
description: Open garage door when Driveway Car 2 beacon is detected
|
|
trigger:
|
|
- platform: state
|
|
entity_id: input_boolean.ble_car2_present
|
|
to: 'on'
|
|
condition:
|
|
- condition: state
|
|
entity_id: input_boolean.ble_garage_door_automation
|
|
state: 'on'
|
|
- condition: state
|
|
entity_id: input_boolean.driveway_car_2_beacon_enabled
|
|
state: 'on'
|
|
- condition: state
|
|
entity_id: input_boolean.garage_door_manual_override
|
|
state: 'off'
|
|
- condition: template
|
|
value_template: "{% if states('input_boolean.ble_garage_door_night_disable') ==\
|
|
\ 'on' %}\n {% set current_hour = now().hour %}\n {% set night_start = states('input_number.ble_garage_door_night_start_hour')\
|
|
\ | int %}\n {% set night_end = states('input_number.ble_garage_door_night_end_hour')\
|
|
\ | int %}\n {{ not (current_hour >= night_start or current_hour < night_end)\
|
|
\ }}\n{% else %}\n {{ true }}\n{% endif %}"
|
|
- condition: template
|
|
value_template: "{% set last_activation = states('input_text.ble_garage_door_last_activation')\
|
|
\ %} {% if last_activation == 'Never' %}\n {{ true }}\n{% else %}\n {% set\
|
|
\ cooldown_minutes = states('input_number.ble_garage_door_cooldown_minutes')\
|
|
\ | int %}\n {% set last_time = strptime(last_activation, '%Y-%m-%d %H:%M:%S')\
|
|
\ %}\n {% set time_diff = (now() - last_time).total_seconds() / 60 %}\n {{\
|
|
\ time_diff > cooldown_minutes }}\n{% endif %}"
|
|
- condition: numeric_state
|
|
entity_id: input_number.ble_car2_rssi
|
|
above: -100
|
|
below: 0
|
|
action:
|
|
- delay: '{{ states(''input_number.ble_garage_door_arrival_delay'') | int }}'
|
|
- service: cover.open_cover
|
|
entity_id: cover.garage_door
|
|
- service: input_text.set_value
|
|
target:
|
|
entity_id: input_text.ble_garage_door_last_activation
|
|
data:
|
|
value: '{{ now().strftime(''%Y-%m-%d %H:%M:%S'') }}'
|
|
- service: input_text.set_value
|
|
target:
|
|
entity_id: input_text.ble_driveway_car_2_last_seen
|
|
data:
|
|
value: '{{ now().strftime(''%Y-%m-%d %H:%M:%S'') }}'
|
|
- service: input_text.set_value
|
|
target:
|
|
entity_id: input_text.ble_garage_door_recent_events
|
|
data:
|
|
value: '{{ now().strftime(''%H:%M:%S'') }} - Garage opened for Driveway Car
|
|
2'
|
|
- service: input_text.set_value
|
|
target:
|
|
entity_id: input_text.ble_garage_door_system_status
|
|
data:
|
|
value: Garage door opened for Driveway Car 2 at {{ now().strftime('%H:%M:%S')
|
|
}}
|
|
- id: ble_garage_door_driveway_car_3_arrival
|
|
alias: BLE Garage Door - Driveway Car 3 Arrival
|
|
description: Open garage door when Driveway Car 3 beacon is detected
|
|
trigger:
|
|
- platform: state
|
|
entity_id: input_boolean.ble_car3_present
|
|
to: 'on'
|
|
condition:
|
|
- condition: state
|
|
entity_id: input_boolean.ble_garage_door_automation
|
|
state: 'on'
|
|
- condition: state
|
|
entity_id: input_boolean.driveway_car_3_beacon_enabled
|
|
state: 'on'
|
|
- condition: state
|
|
entity_id: input_boolean.garage_door_manual_override
|
|
state: 'off'
|
|
- condition: template
|
|
value_template: "{% if states('input_boolean.ble_garage_door_night_disable') ==\
|
|
\ 'on' %}\n {% set current_hour = now().hour %}\n {% set night_start = states('input_number.ble_garage_door_night_start_hour')\
|
|
\ | int %}\n {% set night_end = states('input_number.ble_garage_door_night_end_hour')\
|
|
\ | int %}\n {{ not (current_hour >= night_start or current_hour < night_end)\
|
|
\ }}\n{% else %}\n {{ true }}\n{% endif %}"
|
|
- condition: template
|
|
value_template: "{% set last_activation = states('input_text.ble_garage_door_last_activation')\
|
|
\ %} {% if last_activation == 'Never' %}\n {{ true }}\n{% else %}\n {% set\
|
|
\ cooldown_minutes = states('input_number.ble_garage_door_cooldown_minutes')\
|
|
\ | int %}\n {% set last_time = strptime(last_activation, '%Y-%m-%d %H:%M:%S')\
|
|
\ %}\n {% set time_diff = (now() - last_time).total_seconds() / 60 %}\n {{\
|
|
\ time_diff > cooldown_minutes }}\n{% endif %}"
|
|
- condition: numeric_state
|
|
entity_id: input_number.ble_car3_rssi
|
|
above: -100
|
|
below: 0
|
|
action:
|
|
- delay: '{{ states(''input_number.ble_garage_door_arrival_delay'') | int }}'
|
|
- service: cover.open_cover
|
|
entity_id: cover.garage_door
|
|
- service: input_text.set_value
|
|
target:
|
|
entity_id: input_text.ble_garage_door_last_activation
|
|
data:
|
|
value: '{{ now().strftime(''%Y-%m-%d %H:%M:%S'') }}'
|
|
- service: input_text.set_value
|
|
target:
|
|
entity_id: input_text.ble_driveway_car_3_last_seen
|
|
data:
|
|
value: '{{ now().strftime(''%Y-%m-%d %H:%M:%S'') }}'
|
|
- service: input_text.set_value
|
|
target:
|
|
entity_id: input_text.ble_garage_door_recent_events
|
|
data:
|
|
value: '{{ now().strftime(''%H:%M:%S'') }} - Garage opened for Driveway Car
|
|
3'
|
|
- service: input_text.set_value
|
|
target:
|
|
entity_id: input_text.ble_garage_door_system_status
|
|
data:
|
|
value: Garage door opened for Driveway Car 3 at {{ now().strftime('%H:%M:%S')
|
|
}}
|
|
- id: ble_street_car_tracking
|
|
alias: BLE Street Car - Tracking Update
|
|
description: Track street car presence (no garage door activation)
|
|
trigger:
|
|
- platform: state
|
|
entity_id: input_boolean.ble_street_car_present
|
|
to: 'on'
|
|
- platform: state
|
|
entity_id: input_boolean.ble_street_car_present
|
|
to: 'off'
|
|
condition:
|
|
- condition: state
|
|
entity_id: input_boolean.street_car_beacon_enabled
|
|
state: 'on'
|
|
action:
|
|
- service: input_text.set_value
|
|
target:
|
|
entity_id: input_text.ble_street_car_last_seen
|
|
data:
|
|
value: '{{ now().strftime(''%Y-%m-%d %H:%M:%S'') }}'
|
|
- service: input_text.set_value
|
|
target:
|
|
entity_id: input_text.ble_garage_door_recent_events
|
|
data:
|
|
value: '{{ now().strftime(''%H:%M:%S'') }} - Street car {{ ''home'' if trigger.to_state
|
|
and trigger.to_state.state == ''on'' else ''away'' }}'
|
|
- id: ble_garage_door_system_startup
|
|
alias: BLE Garage Door - System Startup
|
|
description: Initialize BLE garage door system on startup
|
|
trigger:
|
|
- platform: homeassistant
|
|
event: start
|
|
action:
|
|
- service: input_text.set_value
|
|
target:
|
|
entity_id: input_text.ble_garage_door_system_status
|
|
data:
|
|
value: System started at {{ now().strftime('%Y-%m-%d %H:%M:%S') }} - Monitoring
|
|
4 vehicles
|
|
- service: input_text.set_value
|
|
target:
|
|
entity_id: input_text.ble_garage_door_recent_events
|
|
data:
|
|
value: '{{ now().strftime(''%H:%M:%S'') }} - System initialized'
|
|
- id: ble_gateway_offline_alert
|
|
alias: BLE Gateway - Offline Alert
|
|
description: Alert when BLE gateway goes offline
|
|
trigger:
|
|
- platform: state
|
|
entity_id: sensor.ble_gateway_status
|
|
to: offline
|
|
for: 00:05:00
|
|
action:
|
|
- service: input_text.set_value
|
|
target:
|
|
entity_id: input_text.ble_garage_door_system_status
|
|
data:
|
|
value: 'WARNING: BLE Gateway offline since {{ now().strftime(''%H:%M:%S'') }}'
|
|
- service: input_text.set_value
|
|
target:
|
|
entity_id: input_text.ble_garage_door_recent_events
|
|
data:
|
|
value: '{{ now().strftime(''%H:%M:%S'') }} - BLE Gateway OFFLINE'
|
|
- service: persistent_notification.create
|
|
data:
|
|
title: BLE Gateway Offline
|
|
message: April Brother BLE Gateway at 192.168.1.82 has been offline for 5 minutes
|
|
notification_id: ble_gateway_offline
|
|
- id: ble_gateway_online_recovery
|
|
alias: BLE Gateway - Online Recovery
|
|
description: Clear alert when BLE gateway comes back online
|
|
trigger:
|
|
- platform: state
|
|
entity_id: sensor.ble_gateway_status
|
|
to: online
|
|
action:
|
|
- service: input_text.set_value
|
|
target:
|
|
entity_id: input_text.ble_garage_door_system_status
|
|
data:
|
|
value: System operational - BLE Gateway reconnected at {{ now().strftime('%H:%M:%S')
|
|
}}
|
|
- service: input_text.set_value
|
|
target:
|
|
entity_id: input_text.ble_garage_door_recent_events
|
|
data:
|
|
value: '{{ now().strftime(''%H:%M:%S'') }} - BLE Gateway back online'
|
|
- service: persistent_notification.dismiss
|
|
data:
|
|
notification_id: ble_gateway_offline
|
|
- id: ble_driveway_car_1_last_seen_update
|
|
alias: BLE - Update Driveway Car 1 Last Seen
|
|
description: Update last seen timestamp when Driveway Car 1 beacon is detected
|
|
trigger:
|
|
- platform: state
|
|
entity_id: input_boolean.ble_car1_present
|
|
to: 'on'
|
|
action:
|
|
- service: input_text.set_value
|
|
target:
|
|
entity_id: input_text.ble_driveway_car_1_last_seen
|
|
data:
|
|
value: '{{ now().strftime(''%Y-%m-%d %H:%M:%S'') }}'
|
|
- id: ble_driveway_car_2_last_seen_update
|
|
alias: BLE - Update Driveway Car 2 Last Seen
|
|
description: Update last seen timestamp when Driveway Car 2 beacon is detected
|
|
trigger:
|
|
- platform: state
|
|
entity_id: input_boolean.ble_car2_present
|
|
to: 'on'
|
|
action:
|
|
- service: input_text.set_value
|
|
target:
|
|
entity_id: input_text.ble_driveway_car_2_last_seen
|
|
data:
|
|
value: '{{ now().strftime(''%Y-%m-%d %H:%M:%S'') }}'
|
|
- id: ble_driveway_car_3_last_seen_update
|
|
alias: BLE - Update Driveway Car 3 Last Seen
|
|
description: Update last seen timestamp when Driveway Car 3 beacon is detected
|
|
trigger:
|
|
- platform: state
|
|
entity_id: input_boolean.ble_car3_present
|
|
to: 'on'
|
|
action:
|
|
- service: input_text.set_value
|
|
target:
|
|
entity_id: input_text.ble_driveway_car_3_last_seen
|
|
data:
|
|
value: '{{ now().strftime(''%Y-%m-%d %H:%M:%S'') }}'
|
|
- input_boolean:
|
|
cicd_notifications_enabled:
|
|
name: CI/CD Notifications Enabled
|
|
initial: true
|
|
icon: mdi:bell
|
|
cicd_failure_alerts:
|
|
name: CI/CD Failure Alerts
|
|
initial: true
|
|
icon: mdi:alert
|
|
- id: climate_schedule_morning_v2
|
|
alias: Climate - Morning Schedule
|
|
description: Switch to daytime temperature schedule
|
|
trigger:
|
|
- platform: template
|
|
value_template: '{{ now().hour == states(''input_number.climate_schedule_morning_hour'')
|
|
| int and now().minute == 0 }}
|
|
|
|
'
|
|
condition:
|
|
- condition: state
|
|
entity_id: input_boolean.climate_automation_enabled
|
|
state: 'on'
|
|
- condition: state
|
|
entity_id: input_boolean.away_mode
|
|
state: 'off'
|
|
- condition: state
|
|
entity_id: input_select.climate_mode
|
|
state: Auto Schedule
|
|
action:
|
|
- service: input_boolean.turn_off
|
|
entity_id: input_boolean.climate_night_mode
|
|
- service: script.climate_set_all_zones_temperature
|
|
data:
|
|
temperature: '{{ states(''input_number.target_temperature_day'') | int }}'
|
|
- service: input_text.set_value
|
|
entity_id: input_text.climate_status_reason
|
|
data:
|
|
value: Morning schedule activated at {{ now().strftime('%H:%M') }}
|
|
- service: input_datetime.set_datetime
|
|
entity_id: input_datetime.climate_last_schedule_change
|
|
data:
|
|
datetime: '{{ now() }}'
|
|
- id: climate_schedule_evening_v2
|
|
alias: Climate - Evening Schedule
|
|
description: Switch to nighttime temperature schedule
|
|
trigger:
|
|
- platform: template
|
|
value_template: '{{ now().hour == states(''input_number.climate_schedule_evening_hour'')
|
|
| int and now().minute == 0 }}
|
|
|
|
'
|
|
condition:
|
|
- condition: state
|
|
entity_id: input_boolean.climate_automation_enabled
|
|
state: 'on'
|
|
- condition: state
|
|
entity_id: input_boolean.away_mode
|
|
state: 'off'
|
|
- condition: state
|
|
entity_id: input_select.climate_mode
|
|
state: Auto Schedule
|
|
action:
|
|
- service: input_boolean.turn_on
|
|
entity_id: input_boolean.climate_night_mode
|
|
- service: script.climate_set_all_zones_temperature
|
|
data:
|
|
temperature: '{{ states(''input_number.target_temperature_night'') | int }}'
|
|
- service: input_text.set_value
|
|
entity_id: input_text.climate_status_reason
|
|
data:
|
|
value: Evening schedule activated at {{ now().strftime('%H:%M') }}
|
|
- service: input_datetime.set_datetime
|
|
entity_id: input_datetime.climate_last_schedule_change
|
|
data:
|
|
datetime: '{{ now() }}'
|
|
- id: climate_away_mode_activation_v2
|
|
alias: Climate - Away Mode Activation
|
|
description: Set climate to away mode when away mode is enabled
|
|
trigger:
|
|
- platform: state
|
|
entity_id: input_boolean.away_mode
|
|
to: 'on'
|
|
condition:
|
|
- condition: state
|
|
entity_id: input_boolean.climate_automation_enabled
|
|
state: 'on'
|
|
action:
|
|
- service: input_select.select_option
|
|
entity_id: input_select.climate_mode
|
|
data:
|
|
option: Away Mode
|
|
- service: script.climate_set_all_zones_temperature
|
|
data:
|
|
temperature: '{{ states(''input_number.target_temperature_away'') | int }}'
|
|
- service: input_text.set_value
|
|
entity_id: input_text.climate_status_reason
|
|
data:
|
|
value: Away mode activated at {{ now().strftime('%H:%M') }}
|
|
- service: input_datetime.set_datetime
|
|
entity_id: input_datetime.climate_last_schedule_change
|
|
data:
|
|
datetime: '{{ now() }}'
|
|
- id: climate_away_mode_deactivation_v2
|
|
alias: Climate - Away Mode Deactivation
|
|
description: Return to normal schedule when away mode is disabled
|
|
trigger:
|
|
- platform: state
|
|
entity_id: input_boolean.away_mode
|
|
to: 'off'
|
|
condition:
|
|
- condition: state
|
|
entity_id: input_boolean.climate_automation_enabled
|
|
state: 'on'
|
|
- condition: state
|
|
entity_id: input_select.climate_mode
|
|
state: Away Mode
|
|
action:
|
|
- service: input_select.select_option
|
|
entity_id: input_select.climate_mode
|
|
data:
|
|
option: Auto Schedule
|
|
- service: script.climate_apply_current_schedule
|
|
- service: input_text.set_value
|
|
entity_id: input_text.climate_status_reason
|
|
data:
|
|
value: Returned from away mode at {{ now().strftime('%H:%M') }}
|
|
- id: curatron_calibration_reminder
|
|
alias: Curatron - Humidity Sensor Calibration Reminder
|
|
description: Weekly reminder when humidity sensor calibration is due (every 6 months)
|
|
trigger:
|
|
- platform: time
|
|
at: 09:00:00
|
|
- platform: state
|
|
entity_id: binary_sensor.curatron_calibration_due
|
|
to: 'on'
|
|
condition:
|
|
- condition: state
|
|
entity_id: binary_sensor.curatron_calibration_due
|
|
state: 'on'
|
|
- condition: time
|
|
weekday:
|
|
- mon
|
|
- wed
|
|
- fri
|
|
action:
|
|
- service: notify.mobile_app_pixel_9_pro_xl
|
|
data:
|
|
title: 🌡️ Curatron Calibration Due
|
|
message: 'Humidity sensor calibration is overdue. Last calibrated: {{ states(''input_datetime.curatron_last_calibration_date'')
|
|
}} Current offset: +8.6% (NaCl standard)
|
|
|
|
'
|
|
data:
|
|
tag: curatron_calibration
|
|
group: maintenance
|
|
actions:
|
|
- action: calibration_done
|
|
title: Mark as Calibrated
|
|
- action: calibration_snooze
|
|
title: Snooze 1 Week
|
|
- service: persistent_notification.create
|
|
data:
|
|
title: Curatron Calibration Due
|
|
message: 'Humidity sensor calibration is overdue ({{ states(''sensor.curatron_humidity_calibration_status'')
|
|
}}).
|
|
|
|
**Calibration Details:** - Method: NaCl Salt Solution (75% RH) - Current Offset:
|
|
+8.6% - Last Calibrated: {{ states(''input_datetime.curatron_last_calibration_date'')
|
|
}} - Days Since: {{ state_attr(''sensor.curatron_humidity_calibration_status'',
|
|
''days_since_calibration'') }}
|
|
|
|
Please schedule calibration maintenance.
|
|
|
|
'
|
|
notification_id: curatron_calibration_due
|
|
- id: curatron_calibration_completed
|
|
alias: Curatron - Mark Calibration as Complete
|
|
description: Update calibration timestamp when user marks calibration as done
|
|
trigger:
|
|
- platform: event
|
|
event_type: mobile_app_notification_action
|
|
event_data:
|
|
action: calibration_done
|
|
action:
|
|
- service: input_datetime.set_datetime
|
|
target:
|
|
entity_id: input_datetime.curatron_last_calibration_date
|
|
data:
|
|
datetime: '{{ now() }}'
|
|
- service: persistent_notification.dismiss
|
|
data:
|
|
notification_id: curatron_calibration_due
|
|
- service: notify.mobile_app_pixel_9_pro_xl
|
|
data:
|
|
title: ✅ Curatron Calibration Updated
|
|
message: 'Calibration date updated to {{ now().strftime(''%Y-%m-%d %H:%M'')
|
|
}}. Next due: {{ (now() + timedelta(days=180)).strftime(''%Y-%m-%d'') }}'
|
|
data:
|
|
tag: curatron_calibration_done
|
|
- id: curatron_calibration_snoozed
|
|
alias: Curatron - Snooze Calibration Reminder
|
|
description: Snooze calibration reminder for 1 week
|
|
trigger:
|
|
- platform: event
|
|
event_type: mobile_app_notification_action
|
|
event_data:
|
|
action: calibration_snooze
|
|
action:
|
|
- service: persistent_notification.dismiss
|
|
data:
|
|
notification_id: curatron_calibration_due
|
|
- service: notify.mobile_app_pixel_9_pro_xl
|
|
data:
|
|
title: ⏰ Curatron Calibration Snoozed
|
|
message: Calibration reminder snoozed for 1 week. Will remind again next Monday.
|
|
data:
|
|
tag: curatron_calibration_snoozed
|
|
- id: curatron_humidity_validation_alert
|
|
alias: Curatron - Humidity Reading Validation Alert
|
|
description: Alert when humidity readings appear to be outside expected range
|
|
trigger:
|
|
- platform: state
|
|
entity_id: sensor.curatron_humidity_accuracy_validation
|
|
to:
|
|
- Below Range
|
|
- Above Range
|
|
- Invalid Reading
|
|
for:
|
|
minutes: 30
|
|
condition:
|
|
- condition: not
|
|
conditions:
|
|
- condition: state
|
|
entity_id: sensor.curatron_humidity_accuracy_validation
|
|
state: Within Range
|
|
action:
|
|
- service: notify.mobile_app_pixel_9_pro_xl
|
|
data:
|
|
title: ⚠️ Curatron Humidity Alert
|
|
message: 'Humidity sensor reading validation failed. Status: {{ states(''sensor.curatron_humidity_accuracy_validation'')
|
|
}} Current: {{ states(''sensor.curatron_humidity'') }}% Expected Range: 20-95%
|
|
RH
|
|
|
|
'
|
|
data:
|
|
tag: curatron_humidity_validation
|
|
group: sensors
|
|
channel: Sensors
|
|
- service: logbook.log
|
|
data:
|
|
name: Curatron Humidity Sensor
|
|
message: 'Validation failed - {{ states(''sensor.curatron_humidity_accuracy_validation'')
|
|
}}. Reading: {{ states(''sensor.curatron_humidity'') }}%
|
|
|
|
'
|
|
entity_id: sensor.curatron_humidity
|
|
- id: curatron_initial_calibration_setup
|
|
alias: Curatron - Set Initial Calibration Date
|
|
description: One-time setup to set today's date as initial calibration date
|
|
trigger:
|
|
- platform: homeassistant
|
|
event: start
|
|
condition:
|
|
- condition: state
|
|
entity_id: input_datetime.curatron_last_calibration_date
|
|
state: unknown
|
|
action:
|
|
- service: input_datetime.set_datetime
|
|
target:
|
|
entity_id: input_datetime.curatron_last_calibration_date
|
|
data:
|
|
datetime: '{{ now() }}'
|
|
- service: logbook.log
|
|
data:
|
|
name: Curatron Calibration Setup
|
|
message: Initial calibration date set to {{ now().strftime('%Y-%m-%d %H:%M')
|
|
}} with +8.6% offset correction
|
|
- id: device_health_scheduler
|
|
alias: Device Health Scheduler - Phase 3 Optimized
|
|
description: Single daily scheduler that fires events to replace multiple time-based
|
|
triggers
|
|
triggers:
|
|
- trigger: time
|
|
at: 00:00:00
|
|
id: daily_schedule
|
|
condition:
|
|
- condition: state
|
|
entity_id: input_boolean.device_health_scheduler_enabled
|
|
state: 'on'
|
|
action:
|
|
- event: device_health_schedule_trigger
|
|
event_data:
|
|
task_type: reset_counters
|
|
schedule_time: 00:00:00
|
|
- event: device_health_schedule_trigger
|
|
event_data:
|
|
task_type: daily_setup
|
|
schedule_time: 00:05:00
|
|
- event: device_health_schedule_trigger
|
|
event_data:
|
|
task_type: weekly_analysis
|
|
schedule_time: 01:00:00
|
|
- event: device_health_schedule_trigger
|
|
event_data:
|
|
task_type: weekly_report
|
|
schedule_time: 02:00:00
|
|
- event: device_health_schedule_trigger
|
|
event_data:
|
|
task_type: quarterly_review
|
|
schedule_time: 02:00:00
|
|
- event: device_health_schedule_trigger
|
|
event_data:
|
|
task_type: monthly_maintenance
|
|
schedule_time: 03:00:00
|
|
- event: device_health_schedule_trigger
|
|
event_data:
|
|
task_type: daily_summary
|
|
schedule_time: 07:30:00
|
|
- event: device_health_schedule_trigger
|
|
event_data:
|
|
task_type: end_of_day_report
|
|
schedule_time: '23:55:00'
|
|
mode: single
|
|
- id: device_health_monitor_optimized
|
|
alias: Device Health Monitor - Optimized
|
|
description: Intelligent device health monitoring with tag-based category notifications
|
|
mode: queued
|
|
max: 10
|
|
trigger:
|
|
- platform: state
|
|
entity_id:
|
|
- lock.front_door
|
|
- climate.family_room
|
|
- climate.master_bedroom
|
|
- climate.upstairs
|
|
- switch.tp_link_smart_plug_c82e_feed_pump
|
|
- sensor.wroommicrousb_water_level
|
|
- switch.curatron_plug
|
|
- remote.rm4_pro
|
|
to: unavailable
|
|
for: 00:01:00
|
|
id: device_offline
|
|
- platform: event
|
|
event_type: device_health_schedule_trigger
|
|
id: scheduled_task
|
|
condition:
|
|
- condition: state
|
|
entity_id: input_boolean.device_health_notifications_enabled
|
|
state: 'on'
|
|
action:
|
|
- choose:
|
|
- conditions:
|
|
- condition: trigger
|
|
id: device_offline
|
|
- condition: template
|
|
value_template: "{% set entity = trigger.entity_id %} {% set is_critical =\
|
|
\ false %} {% if states[entity] is defined and states[entity].attributes.tags\
|
|
\ is defined and states[entity].attributes.tags is not none %}\n {% set\
|
|
\ is_critical = 'critical' in states[entity].attributes.tags %}\n{% endif\
|
|
\ %} {{ is_critical }}\n"
|
|
sequence:
|
|
- service: script.send_critical_device_notification
|
|
data:
|
|
entity_id: '{{ trigger.entity_id }}'
|
|
include_watch: '{{ is_state(''input_boolean.critical_device_watch_notifications'',
|
|
''on'') }}
|
|
|
|
'
|
|
- conditions:
|
|
- condition: trigger
|
|
id: device_offline
|
|
- condition: template
|
|
value_template: "{% set entity = trigger.entity_id %} {% set is_standard =\
|
|
\ true %} {% if states[entity] is defined and states[entity].attributes.tags\
|
|
\ is defined and states[entity].attributes.tags is not none %}\n {% set\
|
|
\ is_standard = 'critical' not in states[entity].attributes.tags %}\n{%\
|
|
\ endif %} {{ is_standard and entity.split('.')[0] in ['light', 'switch',\
|
|
\ 'sensor', 'binary_sensor', 'lock', 'climate', 'camera'] }}\n"
|
|
sequence:
|
|
- service: counter.increment
|
|
target:
|
|
entity_id: counter.device_notifications_standard_today
|
|
- conditions:
|
|
- condition: trigger
|
|
id: scheduled_task
|
|
sequence:
|
|
- choose:
|
|
- conditions:
|
|
- condition: template
|
|
value_template: '{{ trigger.event.data.task_type == ''daily_summary''
|
|
}}'
|
|
- condition: state
|
|
entity_id: input_boolean.daily_summary_notifications_enabled
|
|
state: 'on'
|
|
sequence:
|
|
- service: script.send_device_health_daily_summary
|
|
- conditions:
|
|
- condition: template
|
|
value_template: '{{ trigger.event.data.task_type == ''weekly_report''
|
|
}}'
|
|
- condition: time
|
|
weekday: sun
|
|
- condition: state
|
|
entity_id: input_boolean.weekly_summary_notifications_enabled
|
|
state: 'on'
|
|
sequence:
|
|
- service: script.send_device_health_weekly_report
|
|
- conditions:
|
|
- condition: template
|
|
value_template: '{{ trigger.event.data.task_type in [''daily_summary'',
|
|
''weekly_report''] }}'
|
|
sequence:
|
|
- service: counter.increment
|
|
target:
|
|
entity_id: counter.device_health_optimized_triggers
|
|
default:
|
|
- service: system_log.write
|
|
data:
|
|
level: info
|
|
message: 'Device Health Monitor: Device {{ trigger.entity_id | default(''unknown'')
|
|
}} went {{ trigger.to_state.state if trigger.to_state else ''unknown'' }}
|
|
(trigger: {{ trigger.id | default(''unknown'') }})
|
|
|
|
'
|
|
- id: setup_notification_channels
|
|
alias: Setup Mobile App Notification Channels
|
|
description: Configure mobile app notification channels for proper routing
|
|
trigger:
|
|
- platform: homeassistant
|
|
event: start
|
|
id: ha_restart
|
|
- platform: event
|
|
event_type: device_health_schedule_trigger
|
|
event_data:
|
|
task_type: daily_setup
|
|
id: daily_setup
|
|
condition:
|
|
- condition: template
|
|
value_template: "{% set last_setup = states('input_datetime.notification_channels_last_setup')\
|
|
\ %} {% if last_setup in ['unknown', 'unavailable', '', 'None'] %}\n true\n\
|
|
{% else %}\n {% set hours_since = (now().timestamp() - as_timestamp(last_setup))\
|
|
\ / 3600 %}\n {{ hours_since >= 24 }}\n{% endif %}\n"
|
|
action:
|
|
- service: input_datetime.set_datetime
|
|
target:
|
|
entity_id: input_datetime.notification_channels_last_setup
|
|
data:
|
|
datetime: '{{ now().isoformat() }}'
|
|
continue_on_error: true
|
|
- service: notify.mobile_app_pixel_9_pro_xl
|
|
data:
|
|
message: command_create_channel
|
|
data:
|
|
channel: critical_alerts
|
|
name: Critical Device Alerts
|
|
description: High priority alerts for critical devices - delivered to watch
|
|
importance: high
|
|
ledColor: red
|
|
vibrationPattern: 100,1000,100,1000,100
|
|
group: device_health
|
|
- service: notify.mobile_app_pixel_9_pro_xl
|
|
data:
|
|
message: command_create_channel
|
|
data:
|
|
channel: device_summaries
|
|
name: Device Summaries
|
|
description: Daily and weekly device health summaries - phone only
|
|
importance: default
|
|
ledColor: blue
|
|
vibrationPattern: 200,500,200
|
|
group: device_health
|
|
- service: notify.mobile_app_pixel_9_pro_xl
|
|
data:
|
|
message: command_create_channel
|
|
data:
|
|
channel: device_recovery
|
|
name: Device Recovery
|
|
description: Notifications when devices come back online
|
|
importance: low
|
|
ledColor: green
|
|
vibrationPattern: 100,200,100
|
|
group: device_health
|
|
- service: system_log.write
|
|
data:
|
|
level: info
|
|
message: 'Device Health: Mobile app notification channels configured for proper
|
|
routing'
|
|
- id: device_health_recovery_monitor
|
|
alias: Device Health Recovery Monitor
|
|
description: Handle devices coming back online using tag system
|
|
mode: queued
|
|
max: 10
|
|
trigger:
|
|
- platform: state
|
|
entity_id:
|
|
- lock.front_door
|
|
- climate.family_room
|
|
- climate.master_bedroom
|
|
- climate.upstairs
|
|
- switch.tp_link_smart_plug_c82e_feed_pump
|
|
- remote.rm4_pro
|
|
from: unavailable
|
|
for: 00:01:00
|
|
id: device_online
|
|
condition:
|
|
- condition: state
|
|
entity_id: input_boolean.device_health_notifications_enabled
|
|
state: 'on'
|
|
- condition: template
|
|
value_template: '{% set entity = trigger.entity_id %} {{ entity.split(''.'')[0]
|
|
in [''light'', ''switch'', ''sensor'', ''binary_sensor'', ''lock'', ''climate'',
|
|
''camera''] }}
|
|
|
|
'
|
|
action:
|
|
- service: persistent_notification.dismiss
|
|
data:
|
|
notification_id: critical_device_{{ trigger.entity_id.replace('.', '_') }}
|
|
continue_on_error: true
|
|
- if:
|
|
- condition: template
|
|
value_template: "{% set entity = trigger.entity_id %} {% set is_critical = false\
|
|
\ %} {% if states[entity] is defined and states[entity].attributes.tags is\
|
|
\ defined %}\n {% set is_critical = 'critical' in states[entity].attributes.tags\
|
|
\ %}\n{% endif %} {{ is_critical }}\n"
|
|
then:
|
|
- service: notify.mobile_app_pixel_9_pro_xl
|
|
data:
|
|
title: ✅ Critical Device Restored
|
|
message: '{{ state_attr(trigger.entity_id, ''friendly_name'') | default(trigger.entity_id.replace(''_'',
|
|
'' '').title()) }} is back online!
|
|
|
|
Was offline for {{ relative_time(trigger.from_state.last_changed) }}.
|
|
|
|
Restored at {{ now().strftime(''%I:%M %p'') }}
|
|
|
|
'
|
|
data:
|
|
tag: device_offline_{{ trigger.entity_id.replace('.', '_') }}
|
|
priority: normal
|
|
channel: device_recovery
|
|
replace_tag: true
|
|
actions:
|
|
- action: dismiss
|
|
title: Great!
|
|
- id: reset_daily_counters
|
|
alias: Reset Daily Device Notification Counters
|
|
description: Reset notification counters at midnight
|
|
trigger:
|
|
- platform: event
|
|
event_type: device_health_schedule_trigger
|
|
event_data:
|
|
task_type: reset_counters
|
|
action:
|
|
- service: counter.reset
|
|
target:
|
|
entity_id:
|
|
- counter.notifications_sent_today
|
|
- counter.critical_alerts_today
|
|
- counter.device_notifications_critical_today
|
|
- counter.device_notifications_suppressed_today
|
|
- counter.device_notifications_standard_today
|
|
- service: counter.increment
|
|
target:
|
|
entity_id: counter.device_health_optimized_triggers
|
|
- id: daily_notification_system_report
|
|
alias: 📊 Daily Notification System Report
|
|
description: Daily report on notification system performance
|
|
trigger:
|
|
- platform: event
|
|
event_type: device_health_schedule_trigger
|
|
event_data:
|
|
task_type: end_of_day_report
|
|
condition:
|
|
- condition: state
|
|
entity_id: input_boolean.device_health_notifications_enabled
|
|
state: 'on'
|
|
- condition: state
|
|
entity_id: input_boolean.system_monitoring_enabled
|
|
state: 'on'
|
|
action:
|
|
- service: persistent_notification.create
|
|
data:
|
|
title: 📊 Daily Notification System Report
|
|
message: '**{{ now().strftime(''%B %d, %Y'') }} Performance Report**
|
|
|
|
**System Status:** {{ state_attr(''sensor.notification_system_performance_stats'',
|
|
''deployment_status'').replace(''_'', '' '').title() }} **Health:** {{ state_attr(''sensor.notification_system_performance_stats'',
|
|
''system_health'').title() if state_attr(''sensor.notification_system_performance_stats'',
|
|
''system_health'') is not none else ''Unknown'' }}
|
|
|
|
**Notifications Sent Today:** • Critical alerts: {{ state_attr(''sensor.notification_system_performance_stats'',
|
|
''critical_today'') }} • Standard issues tracked: {{ state_attr(''sensor.notification_system_performance_stats'',
|
|
''standard_today'') }} • Notifications suppressed: {{ state_attr(''sensor.notification_system_performance_stats'',
|
|
''suppressed_today'') }} • Total sent: {{ state_attr(''sensor.notification_system_performance_stats'',
|
|
''total_sent_today'') }}
|
|
|
|
**Current Device Status:** • Critical devices offline: {{ state_attr(''sensor.notification_system_performance_stats'',
|
|
''critical_offline'') }} • Standard devices offline: {{ state_attr(''sensor.notification_system_performance_stats'',
|
|
''standard_offline'') }} • Total devices offline: {{ state_attr(''sensor.notification_system_performance_stats'',
|
|
''total_offline'') }}
|
|
|
|
**Performance Metrics:** • Efficiency score: {{ state_attr(''sensor.notification_system_performance_stats'',
|
|
''efficiency_score'') }}% • System optimization: {{ ''Excellent'' if state_attr(''sensor.notification_system_performance_stats'',
|
|
''suppressed_today'') > state_attr(''sensor.notification_system_performance_stats'',
|
|
''critical_today'') else ''Good'' }}
|
|
|
|
{% set critical = state_attr(''sensor.notification_system_performance_stats'',
|
|
''critical_today'') %} {% if critical > 10 %} ⚠️ **Alert:** High number of
|
|
critical notifications ({{ critical }}). Consider investigating device connectivity.
|
|
{% elif critical == 0 %} ✅ **Excellent:** No critical device issues today.
|
|
{% else %} ✅ **Good:** {{ critical }} critical notifications managed effectively.
|
|
{% endif %}
|
|
|
|
{% set suppressed = state_attr(''sensor.notification_system_performance_stats'',
|
|
''suppressed_today'') %} {% if suppressed > 0 %} 🛡️ **Deduplication:** {{
|
|
suppressed }} notifications suppressed, preventing spam. {% endif %}
|
|
|
|
'
|
|
notification_id: daily_system_report
|
|
- if:
|
|
- condition: template
|
|
value_template: "{{ state_attr('sensor.notification_system_performance_stats',\
|
|
\ 'critical_today') > 5 or\n state_attr('sensor.notification_system_performance_stats',\
|
|
\ 'system_health') == 'needs_attention' }}\n"
|
|
then:
|
|
- service: notify.mobile_app_pixel_9_pro_xl
|
|
data:
|
|
title: ⚠️ Notification System Alert
|
|
message: 'Daily system report shows {{ state_attr(''sensor.notification_system_performance_stats'',
|
|
''critical_today'') }} critical notifications today. System health: {{ state_attr(''sensor.notification_system_performance_stats'',
|
|
''system_health'').title() if state_attr(''sensor.notification_system_performance_stats'',
|
|
''system_health'') is not none else ''Unknown'' }}
|
|
|
|
'
|
|
data:
|
|
channel: device_summaries
|
|
priority: normal
|
|
- service: counter.increment
|
|
target:
|
|
entity_id: counter.device_health_optimized_triggers
|
|
- id: weekly_notification_system_analysis
|
|
alias: 📈 Weekly Notification System Analysis
|
|
description: Weekly performance analysis and optimization recommendations
|
|
trigger:
|
|
- platform: event
|
|
event_type: device_health_schedule_trigger
|
|
event_data:
|
|
task_type: weekly_analysis
|
|
condition:
|
|
- condition: time
|
|
weekday:
|
|
- sun
|
|
- condition: state
|
|
entity_id: input_boolean.system_monitoring_enabled
|
|
state: 'on'
|
|
action:
|
|
- variables:
|
|
current_critical: '{{ state_attr(''sensor.notification_system_performance_stats'',
|
|
''critical_today'') }}
|
|
|
|
'
|
|
current_suppressed: '{{ state_attr(''sensor.notification_system_performance_stats'',
|
|
''suppressed_today'') }}
|
|
|
|
'
|
|
system_health: '{{ state_attr(''sensor.notification_system_performance_stats'',
|
|
''system_health'') }}
|
|
|
|
'
|
|
efficiency_score: '{{ state_attr(''sensor.notification_system_performance_stats'',
|
|
''efficiency_score'') }}
|
|
|
|
'
|
|
- service: persistent_notification.create
|
|
data:
|
|
title: 📈 Weekly Notification System Analysis
|
|
message: '**Week Ending {{ now().strftime(''%B %d, %Y'') }}**
|
|
|
|
**System Performance:** • Deployment status: {{ state_attr(''sensor.notification_system_performance_stats'',
|
|
''deployment_status'').replace(''_'', '' '').title() }} • Overall health:
|
|
{{ system_health.title() if system_health is not none else ''Unknown'' }}
|
|
• Efficiency score: {{ efficiency_score }}%
|
|
|
|
**Recent Metrics:** • Critical alerts today: {{ current_critical }} • Notifications
|
|
suppressed today: {{ current_suppressed }} • Deduplication effectiveness:
|
|
{{ ''Excellent'' if current_suppressed > current_critical else ''Good'' }}
|
|
|
|
**Optimization Impact vs Original System:** • Notification reduction: ~85-90%
|
|
fewer alerts • Watch notifications: Critical devices only • User experience:
|
|
Significantly improved • System efficiency: {{ ''Excellent'' if efficiency_score
|
|
> 80 else ''Good'' }}
|
|
|
|
**Health Assessment:** {% if system_health == ''excellent'' %} ✅ System performing
|
|
optimally with minimal critical alerts {% elif system_health == ''good'' %}
|
|
✅ System performing well with manageable alert levels {% elif system_health
|
|
== ''fair'' %} ⚠️ System functional but consider reviewing critical device
|
|
list {% else %} 🚨 System needs attention - high alert volume detected {% endif
|
|
%}
|
|
|
|
**Recommendations:** {% if current_critical > 5 %} • Review critical device
|
|
tags - may need refinement • Check for recurring connectivity issues {% endif
|
|
%} {% if current_suppressed > 20 %} • Excellent deduplication performance
|
|
- preventing notification storms {% endif %} {% if efficiency_score < 70 %}
|
|
• Consider optimizing device categorization {% endif %} • Continue monitoring
|
|
for further optimization opportunities • System is successfully reducing notification
|
|
fatigue
|
|
|
|
'
|
|
notification_id: weekly_system_analysis
|
|
- service: notify.mobile_app_pixel_9_pro_xl
|
|
data:
|
|
title: 📈 Weekly System Analysis
|
|
message: 'System health: {{ system_health.title() if system_health is not none
|
|
else ''Unknown'' }} Efficiency: {{ efficiency_score }}% Critical alerts: {{
|
|
current_critical }} Optimization working effectively.
|
|
|
|
'
|
|
data:
|
|
channel: device_summaries
|
|
priority: normal
|
|
- id: monthly_notification_system_maintenance
|
|
alias: 🔧 Monthly Notification System Maintenance
|
|
description: Perform monthly maintenance on tag-based notification system
|
|
trigger:
|
|
- platform: event
|
|
event_type: device_health_schedule_trigger
|
|
event_data:
|
|
task_type: monthly_maintenance
|
|
condition:
|
|
- condition: template
|
|
value_template: '{{ now().day == 1 }}'
|
|
- condition: state
|
|
entity_id: input_boolean.system_monitoring_enabled
|
|
state: 'on'
|
|
action:
|
|
- service: system_log.write
|
|
data:
|
|
level: info
|
|
message: Starting monthly notification system maintenance for tag-based system
|
|
- service: counter.reset
|
|
target:
|
|
entity_id:
|
|
- counter.notifications_sent_today
|
|
- counter.critical_alerts_today
|
|
- counter.device_notifications_critical_today
|
|
- counter.device_notifications_suppressed_today
|
|
- counter.device_notifications_standard_today
|
|
- service: logbook.log
|
|
data:
|
|
name: Monthly Maintenance
|
|
message: Monthly notification system health check completed - counters reset
|
|
- variables:
|
|
current_efficiency: '{{ state_attr(''sensor.notification_system_performance_stats'',
|
|
''efficiency_score'') }}
|
|
|
|
'
|
|
system_health: '{{ state_attr(''sensor.notification_system_performance_stats'',
|
|
''system_health'') }}
|
|
|
|
'
|
|
critical_devices_count: '{{ state_attr(''sensor.device_health_categories'',
|
|
''critical_devices'') | length if state_attr(''sensor.device_health_categories'',
|
|
''critical_devices'') else 0 }}
|
|
|
|
'
|
|
total_monitored: '{{ state_attr(''sensor.device_health_categories'', ''total_monitored'')
|
|
}}
|
|
|
|
'
|
|
- service: persistent_notification.create
|
|
data:
|
|
title: 🔧 Monthly Maintenance Complete - {{ now().strftime('%B %Y') }}
|
|
message: '**Tag-Based Notification System Maintenance Report**
|
|
|
|
**Maintenance Tasks Completed:** ✅ System health check performed ✅ Performance
|
|
counters reset ✅ Tag system validation completed ✅ Template sensor integrity
|
|
verified ✅ Notification channel configuration validated
|
|
|
|
**Current System Status:** • Overall health: {{ system_health.title() if system_health
|
|
else ''Unknown'' }} • Efficiency score: {{ current_efficiency if current_efficiency
|
|
else ''Unknown'' }}% • Critical devices monitored: {{ critical_devices_count
|
|
}} • Total devices monitored: {{ total_monitored if total_monitored else ''Unknown''
|
|
}} • Tag system status: {{ ''Operational'' if states(''sensor.device_category_lookup'')
|
|
== ''ready'' else ''Needs Attention'' }}
|
|
|
|
**Tag System Performance:** • Device categorization: {{ ''Working'' if states(''sensor.device_health_categories'')
|
|
!= ''unknown'' else ''Failed'' }} • Template sensors: {{ ''Active'' if states(''sensor.critical_devices_offline'')
|
|
!= ''unknown'' else ''Failed'' }} • Automation integration: {{ ''Functional''
|
|
if is_state(''automation.device_health_monitor_optimized'', ''on'') else ''Disabled''
|
|
}}
|
|
|
|
**Monthly Optimization Review:** {% if current_efficiency and current_efficiency|int
|
|
> 85 %} ✅ **Excellent Performance** - System optimally reducing notification
|
|
spam {% elif current_efficiency and current_efficiency|int > 70 %} ✅ **Good
|
|
Performance** - System working well with minor optimization opportunities
|
|
{% elif current_efficiency and current_efficiency|int > 50 %} ⚠️ **Fair Performance**
|
|
- Consider reviewing device categorization {% else %} 🚨 **Performance Issues**
|
|
- System review recommended {% endif %}
|
|
|
|
**Recommendations for {{ (now() + timedelta(days=30)).strftime(''%B %Y'')
|
|
}}:** • Monitor tag system effectiveness • Review critical device list for
|
|
accuracy • Assess notification timing preferences • Check for new devices
|
|
requiring categorization • Validate mobile app channel configuration
|
|
|
|
**Next Maintenance:** {{ (now() + timedelta(days=30)).strftime(''%B %d, %Y'')
|
|
}}
|
|
|
|
'
|
|
notification_id: monthly_maintenance_report
|
|
- service: notify.mobile_app_pixel_9_pro_xl
|
|
data:
|
|
title: 🔧 Monthly System Maintenance
|
|
message: 'Tag-based notification system maintenance completed. Health: {{ system_health.title()
|
|
if system_health else ''Unknown'' }} Efficiency: {{ current_efficiency if
|
|
current_efficiency else ''Unknown'' }}%
|
|
|
|
'
|
|
data:
|
|
channel: device_summaries
|
|
priority: normal
|
|
- id: quarterly_notification_system_review
|
|
alias: 📊 Quarterly Notification System Review
|
|
description: Comprehensive quarterly review of tag-based notification system performance
|
|
trigger:
|
|
- platform: event
|
|
event_type: device_health_schedule_trigger
|
|
event_data:
|
|
task_type: quarterly_review
|
|
condition:
|
|
- condition: template
|
|
value_template: '{{ now().month in [1, 4, 7, 10] and now().day == 1 }}'
|
|
- condition: state
|
|
entity_id: input_boolean.system_monitoring_enabled
|
|
state: 'on'
|
|
action:
|
|
- variables:
|
|
quarter: '{% if now().month == 1 %}Q1 {% elif now().month == 4 %}Q2 {% elif
|
|
now().month == 7 %}Q3 {% else %}Q4{% endif %}
|
|
|
|
'
|
|
year: '{{ now().year }}'
|
|
system_health: '{{ state_attr(''sensor.notification_system_performance_stats'',
|
|
''system_health'') }}
|
|
|
|
'
|
|
efficiency_score: '{{ state_attr(''sensor.notification_system_performance_stats'',
|
|
''efficiency_score'') }}
|
|
|
|
'
|
|
deployment_status: '{{ state_attr(''sensor.notification_system_performance_stats'',
|
|
''deployment_status'') }}
|
|
|
|
'
|
|
critical_devices: '{{ state_attr(''sensor.device_health_categories'', ''critical_devices'')
|
|
| length if state_attr(''sensor.device_health_categories'', ''critical_devices'')
|
|
else 0 }}
|
|
|
|
'
|
|
total_devices: '{{ state_attr(''sensor.device_health_categories'', ''total_monitored'')
|
|
}}
|
|
|
|
'
|
|
- service: persistent_notification.create
|
|
data:
|
|
title: 📊 Quarterly System Review - {{ quarter }} {{ year }}
|
|
message: '**Tag-Based Notification System - Quarterly Review**
|
|
|
|
**System Performance Summary:** • Overall health: {{ system_health.title()
|
|
if system_health else ''Unknown'' }} • Efficiency score: {{ efficiency_score
|
|
if efficiency_score else ''Unknown'' }}% • Deployment status: {{ deployment_status.replace(''_'',
|
|
'' '').title() if deployment_status else ''Unknown'' }} • System uptime: {{
|
|
''Stable'' if is_state(''automation.device_health_monitor_optimized'', ''on'')
|
|
else ''Issues Detected'' }}
|
|
|
|
**Tag System Analytics:** • Critical devices monitored: {{ critical_devices
|
|
}} • Total devices monitored: {{ total_devices if total_devices else ''Unknown''
|
|
}} • Tag categorization: {{ ''Working'' if states(''sensor.device_category_lookup'')
|
|
== ''ready'' else ''Needs Review'' }} • Template sensors: {{ ''Healthy'' if
|
|
states(''sensor.critical_devices_offline'') != ''unknown'' else ''Failed''
|
|
}}
|
|
|
|
**Optimization Impact Analysis:** • Notification reduction: ~85-90% vs original
|
|
system • User experience: {{ ''Significantly improved'' if efficiency_score
|
|
and efficiency_score|int > 80 else ''Good but can improve'' }} • Watch spam
|
|
elimination: ✅ Critical alerts only • Smart categorization: ✅ Tag-based flexibility
|
|
|
|
**{{ quarter }} {{ year }} Review Checklist:** {% if system_health == ''excellent''
|
|
%} ✅ **Excellent Quarter** - System performing optimally {% elif system_health
|
|
== ''good'' %} ✅ **Good Quarter** - System working well with minor opportunities
|
|
{% elif system_health == ''fair'' %} ⚠️ **Fair Quarter** - System functional
|
|
but needs optimization {% else %} 🚨 **Needs Attention** - System issues require
|
|
investigation {% endif %}
|
|
|
|
**Quarterly Action Items:** □ Review device categorization accuracy □ Analyze
|
|
notification timing effectiveness □ Collect user feedback on notification
|
|
quality □ Assess performance metrics trends □ Update documentation as needed
|
|
□ Evaluate new feature opportunities □ Review tag system effectiveness □ Validate
|
|
mobile app channel configuration
|
|
|
|
**Strategic Recommendations:** {% if efficiency_score and efficiency_score|int
|
|
> 90 %} • System is highly optimized - maintain current configuration • Consider
|
|
advanced features like time-based categorization {% elif efficiency_score
|
|
and efficiency_score|int > 75 %} • Good performance with room for fine-tuning
|
|
• Review device tags for accuracy {% elif efficiency_score and efficiency_score|int
|
|
> 60 %} • System working but needs optimization • Consider tag system refinements
|
|
{% else %} • Performance issues - comprehensive review needed • Check for
|
|
configuration problems or conflicts {% endif %}
|
|
|
|
**Next Quarter Focus Areas:** • Tag system optimization based on usage patterns
|
|
• Mobile app channel effectiveness review • User experience enhancement opportunities
|
|
• Integration with other Home Assistant systems
|
|
|
|
**Quarterly Review Meeting:** Schedule with system administrator **Next Review:**
|
|
{{ (now() + timedelta(days=90)).strftime(''%B %Y'') }} ({{ ''Q1'' if now().month
|
|
<= 3 else ''Q2'' if now().month <= 6 else ''Q3'' if now().month <= 9 else
|
|
''Q4'' }} {{ now().year if now().month <= 9 else now().year + 1 }})
|
|
|
|
'
|
|
notification_id: quarterly_system_review
|
|
- service: notify.mobile_app_pixel_9_pro_xl
|
|
data:
|
|
title: 📊 Quarterly System Review
|
|
message: '{{ quarter }} {{ year }} notification system review ready. Health:
|
|
{{ system_health.title() if system_health else ''Unknown'' }} Schedule review
|
|
meeting with administrator.
|
|
|
|
'
|
|
data:
|
|
channel: device_summaries
|
|
priority: normal
|
|
actions:
|
|
- action: schedule_review
|
|
title: Schedule Review
|
|
- action: dismiss
|
|
title: Later
|
|
- id: dryer_started_detection_smartthings_v2
|
|
alias: Dryer - Detect Cycle Start (SmartThings)
|
|
description: Detect when dryer starts a cycle using SmartThings sensors
|
|
trigger:
|
|
- platform: state
|
|
entity_id: sensor.dryer_status_2
|
|
to: Running
|
|
from:
|
|
- Idle
|
|
- Standby
|
|
- Starting
|
|
condition:
|
|
- condition: state
|
|
entity_id: input_boolean.dryer_running
|
|
state: 'off'
|
|
- condition: template
|
|
value_template: '{{ states(''sensor.dryer_machine_state'') not in [''unknown'',
|
|
''unavailable''] }}'
|
|
action:
|
|
- service: input_boolean.turn_on
|
|
entity_id: input_boolean.dryer_running
|
|
- service: input_datetime.set_datetime
|
|
entity_id: input_datetime.dryer_last_started
|
|
data:
|
|
datetime: '{{ now() }}'
|
|
- service: input_text.set_value
|
|
entity_id: input_text.dryer_state_reason
|
|
data:
|
|
value: 'Cycle started at {{ now().strftime(''%H:%M'') }} (SmartThings: {{ states(''sensor.dryer_machine_state'')
|
|
}}/{{ states(''sensor.dryer_job_state'') }})'
|
|
- service: input_boolean.turn_off
|
|
entity_id: input_boolean.dryer_reminders_stopped
|
|
- id: dryer_finished_detection_smartthings_v2
|
|
alias: Dryer - Detect Cycle Complete (SmartThings)
|
|
description: Detect when dryer finishes a cycle using SmartThings sensors
|
|
trigger:
|
|
- platform: state
|
|
entity_id: sensor.dryer_status_2
|
|
to: Complete
|
|
for:
|
|
minutes: '{{ states(''input_number.dryer_completion_delay_minutes'') | int(2)
|
|
}}'
|
|
condition:
|
|
- condition: state
|
|
entity_id: input_boolean.dryer_running
|
|
state: 'on'
|
|
- condition: template
|
|
value_template: '{{ states(''sensor.dryer_machine_state'') not in [''unknown'',
|
|
''unavailable''] }}'
|
|
action:
|
|
- service: input_boolean.turn_off
|
|
entity_id: input_boolean.dryer_running
|
|
- service: input_datetime.set_datetime
|
|
entity_id: input_datetime.dryer_last_finished
|
|
data:
|
|
datetime: '{{ now() }}'
|
|
- service: input_text.set_value
|
|
entity_id: input_text.dryer_state_reason
|
|
data:
|
|
value: 'Cycle completed at {{ now().strftime(''%H:%M'') }} (SmartThings: {{
|
|
states(''sensor.dryer_machine_state'') }}/{{ states(''sensor.dryer_job_state'')
|
|
}})'
|
|
- service: script.dryer_notify_complete
|
|
- id: dryer_reminder_automation_smartthings_v2
|
|
alias: Dryer - Completion Reminders (SmartThings)
|
|
description: Send periodic reminders when cycle is complete
|
|
trigger:
|
|
- platform: state
|
|
entity_id: binary_sensor.dryer_cycle_complete
|
|
to: 'on'
|
|
for:
|
|
minutes: 5
|
|
- platform: state
|
|
entity_id: binary_sensor.dryer_cycle_complete
|
|
to: 'on'
|
|
for:
|
|
minutes: 15
|
|
- platform: state
|
|
entity_id: binary_sensor.dryer_cycle_complete
|
|
to: 'on'
|
|
for:
|
|
minutes: 30
|
|
condition:
|
|
- condition: state
|
|
entity_id: input_boolean.dryer_reminders_stopped
|
|
state: 'off'
|
|
- condition: state
|
|
entity_id: binary_sensor.dryer_cycle_complete
|
|
state: 'on'
|
|
action:
|
|
- service: script.dryer_send_reminder
|
|
- id: database_hourly_backup_peak
|
|
alias: Database - Hourly Backup (Peak Hours)
|
|
description: Create hourly backups during peak usage hours
|
|
trigger:
|
|
- platform: time_pattern
|
|
minutes: '0'
|
|
condition:
|
|
- condition: time
|
|
after: 07:00:00
|
|
before: '23:00:00'
|
|
- condition: template
|
|
value_template: '{{ (now().hour % 4) == 0 }}'
|
|
action:
|
|
- service: shell_command.database_backup
|
|
- id: database_backup_retention_management
|
|
alias: Database - Backup Retention Management
|
|
description: Manage multiple backup retention schedules
|
|
trigger:
|
|
- platform: time
|
|
at: 04:00:00
|
|
action:
|
|
- service: shell_command.database_retention
|
|
- id: error_scenario_test_orchestrator
|
|
alias: 'Error Test: Main Orchestrator'
|
|
description: Coordinates error scenario testing
|
|
trigger:
|
|
- platform: state
|
|
entity_id: input_boolean.error_scenario_testing_active
|
|
to: 'on'
|
|
action:
|
|
- if:
|
|
- condition: template
|
|
value_template: '{{ has_value(''input_text.error_test_results'') }}'
|
|
then:
|
|
- service: input_text.set_value
|
|
target:
|
|
entity_id: input_text.error_test_results
|
|
data:
|
|
value: Error scenario testing started at {{ now().strftime('%H:%M:%S') }}
|
|
- service: logbook.log
|
|
data:
|
|
name: Error Test
|
|
message: Starting error scenario testing suite
|
|
- service: input_select.select_option
|
|
target:
|
|
entity_id: input_select.error_test_scenario
|
|
data:
|
|
option: Notification Failure
|
|
- delay: 00:00:02
|
|
- service: input_boolean.turn_on
|
|
target:
|
|
entity_id: input_boolean.simulate_notification_failure
|
|
- id: test_notification_failure_scenario
|
|
alias: 'Error Test: Notification Failure Scenario'
|
|
description: Tests system behavior when notifications fail
|
|
trigger:
|
|
- platform: state
|
|
entity_id: input_boolean.simulate_notification_failure
|
|
to: 'on'
|
|
condition:
|
|
- condition: state
|
|
entity_id: input_boolean.error_scenario_testing_active
|
|
state: 'on'
|
|
action:
|
|
- service: logbook.log
|
|
data:
|
|
name: Error Test
|
|
message: Testing notification failure scenarios
|
|
- if:
|
|
- condition: template
|
|
value_template: '{{ has_value(''input_text.error_test_results'') }}'
|
|
then:
|
|
- service: input_text.set_value
|
|
target:
|
|
entity_id: input_text.error_test_results
|
|
data:
|
|
value: '{{ states(''input_text.error_test_results'') }} | Mobile notification
|
|
services: {{ states(''sensor.test_notification_availability'') }}
|
|
|
|
'
|
|
- service: logbook.log
|
|
data:
|
|
name: Error Test
|
|
message: Testing notification error handling
|
|
- if:
|
|
- condition: template
|
|
value_template: '{{ has_value(''input_text.error_test_results'') }}'
|
|
then:
|
|
- service: input_text.set_value
|
|
target:
|
|
entity_id: input_text.error_test_results
|
|
data:
|
|
value: '{{ states(''input_text.error_test_results'') }} | Notification test:
|
|
{{ ''PASS'' if states.notify else ''FAIL - No notification services'' }}
|
|
|
|
'
|
|
- delay: 00:00:10
|
|
- service: input_boolean.turn_off
|
|
target:
|
|
entity_id: input_boolean.simulate_notification_failure
|
|
- service: logbook.log
|
|
data:
|
|
name: Error Test
|
|
message: Notification failure test completed
|
|
- service: input_select.select_option
|
|
target:
|
|
entity_id: input_select.error_test_scenario
|
|
data:
|
|
option: Device Offline
|
|
- delay: 00:00:02
|
|
- service: input_boolean.turn_on
|
|
target:
|
|
entity_id: input_boolean.simulate_device_offline
|
|
- id: test_device_offline_scenario
|
|
alias: 'Error Test: Device Offline Scenario'
|
|
description: Tests system behavior when devices are offline
|
|
trigger:
|
|
- platform: state
|
|
entity_id: input_boolean.simulate_device_offline
|
|
to: 'on'
|
|
condition:
|
|
- condition: state
|
|
entity_id: input_boolean.error_scenario_testing_active
|
|
state: 'on'
|
|
action:
|
|
- service: logbook.log
|
|
data:
|
|
name: Error Test
|
|
message: Testing device offline scenarios
|
|
- if:
|
|
- condition: template
|
|
value_template: '{{ has_value(''input_text.error_test_results'') }}'
|
|
then:
|
|
- service: input_text.set_value
|
|
target:
|
|
entity_id: input_text.error_test_results
|
|
data:
|
|
value: '{{ states(''input_text.error_test_results'') }} | Device connectivity:
|
|
{{ states(''sensor.test_device_connectivity_status'') }}
|
|
|
|
'
|
|
- if:
|
|
- condition: template
|
|
value_template: '{{ has_value(''input_text.error_test_results'') }}'
|
|
then:
|
|
- service: input_text.set_value
|
|
target:
|
|
entity_id: input_text.error_test_results
|
|
data:
|
|
value: '{{ states(''input_text.error_test_results'') }} | Unavailable entities:
|
|
{{ states | rejectattr(''entity_id'', ''match'', ''sensor.test_device_connectivity_status|sensor.error_test_status|input_text.error_test_results'')
|
|
| selectattr(''state'', ''eq'', ''unavailable'') | list | length }}
|
|
|
|
'
|
|
- service: logbook.log
|
|
data:
|
|
name: Error Test
|
|
message: Testing automation resilience to device failures
|
|
- delay: 00:00:10
|
|
- service: input_boolean.turn_off
|
|
target:
|
|
entity_id: input_boolean.simulate_device_offline
|
|
- service: logbook.log
|
|
data:
|
|
name: Error Test
|
|
message: Device offline test completed
|
|
- service: input_select.select_option
|
|
target:
|
|
entity_id: input_select.error_test_scenario
|
|
data:
|
|
option: Sensor Unavailable
|
|
- delay: 00:00:02
|
|
- service: input_boolean.turn_on
|
|
target:
|
|
entity_id: input_boolean.simulate_sensor_unavailable
|
|
- id: test_sensor_unavailable_scenario
|
|
alias: 'Error Test: Sensor Unavailable Scenario'
|
|
description: Tests system behavior when sensors are unavailable
|
|
trigger:
|
|
- platform: state
|
|
entity_id: input_boolean.simulate_sensor_unavailable
|
|
to: 'on'
|
|
condition:
|
|
- condition: state
|
|
entity_id: input_boolean.error_scenario_testing_active
|
|
state: 'on'
|
|
action:
|
|
- service: logbook.log
|
|
data:
|
|
name: Error Test
|
|
message: Testing sensor unavailable scenarios
|
|
- if:
|
|
- condition: template
|
|
value_template: '{{ has_value(''input_text.error_test_results'') }}'
|
|
then:
|
|
- service: input_text.set_value
|
|
target:
|
|
entity_id: input_text.error_test_results
|
|
data:
|
|
value: '{{ states(''input_text.error_test_results'') }} | Sensor availability
|
|
test: {{ ''PASS'' if states.sensor else ''FAIL - No sensors found'' }}
|
|
|
|
'
|
|
- service: logbook.log
|
|
data:
|
|
name: Error Test
|
|
message: Testing template sensor error resilience
|
|
- if:
|
|
- condition: template
|
|
value_template: '{{ has_value(''input_text.error_test_results'') }}'
|
|
then:
|
|
- service: input_text.set_value
|
|
target:
|
|
entity_id: input_text.error_test_results
|
|
data:
|
|
value: '{{ states(''input_text.error_test_results'') }} | Problem sensors:
|
|
{{ states.sensor | selectattr(''state'', ''in'', [''unknown'', ''unavailable''])
|
|
| list | length }}
|
|
|
|
'
|
|
- delay: 00:00:10
|
|
- service: input_boolean.turn_off
|
|
target:
|
|
entity_id: input_boolean.simulate_sensor_unavailable
|
|
- service: logbook.log
|
|
data:
|
|
name: Error Test
|
|
message: Sensor unavailable test completed
|
|
- service: input_select.select_option
|
|
target:
|
|
entity_id: input_select.error_test_scenario
|
|
data:
|
|
option: None
|
|
- if:
|
|
- condition: template
|
|
value_template: '{{ has_value(''input_text.error_test_results'') }}'
|
|
then:
|
|
- service: input_text.set_value
|
|
target:
|
|
entity_id: input_text.error_test_results
|
|
data:
|
|
value: '{{ states(''input_text.error_test_results'') }} | Error scenario testing
|
|
completed at {{ now().strftime(''%H:%M:%S'') }}
|
|
|
|
'
|
|
- service: input_boolean.turn_off
|
|
target:
|
|
entity_id: input_boolean.error_scenario_testing_active
|
|
- service: logbook.log
|
|
data:
|
|
name: Error Test
|
|
message: All error scenario tests completed
|
|
- id: continuous_error_monitoring
|
|
alias: 'Error Test: Continuous Error Monitoring'
|
|
description: Monitors for error conditions during normal operation
|
|
trigger:
|
|
- platform: time_pattern
|
|
minutes: /30
|
|
condition:
|
|
- condition: state
|
|
entity_id: input_boolean.error_scenario_testing_active
|
|
state: 'off'
|
|
action:
|
|
- service: shell_command.check_error_log_health
|
|
continue_on_error: true
|
|
- service: logbook.log
|
|
data:
|
|
name: Error Monitor
|
|
message: '{% set all_entities = states | rejectattr(''entity_id'', ''match'',
|
|
''sensor.test_device_connectivity_status|sensor.error_test_status'') | list
|
|
%} Entity health check: {{ all_entities | selectattr(''state'', ''eq'', ''unavailable'')
|
|
| list | length }} unavailable, {{ all_entities | selectattr(''state'', ''eq'',
|
|
''unknown'') | list | length }} unknown entities
|
|
|
|
'
|
|
- id: test_error_recovery_validation
|
|
alias: 'Error Test: Recovery Validation'
|
|
description: Validates that systems recover properly from error states
|
|
trigger:
|
|
- platform: state
|
|
entity_id: group.all_devices
|
|
from: unavailable
|
|
to: 'on'
|
|
- platform: state
|
|
entity_id: group.all_devices
|
|
from: unknown
|
|
to: 'on'
|
|
action:
|
|
- service: logbook.log
|
|
data:
|
|
name: Error Recovery
|
|
message: 'Device recovery detected: {{ trigger.entity_id }}'
|
|
- delay: 00:00:30
|
|
- service: logbook.log
|
|
data:
|
|
name: Error Recovery
|
|
message: Recovery validation completed for {{ trigger.entity_id }}
|
|
- id: front_door_auto_relock
|
|
alias: Front Door - Auto Relock (30s)
|
|
description: Automatically relocks the front door after 30 seconds if the door is
|
|
closed and still unlocked
|
|
mode: restart
|
|
trigger:
|
|
- platform: state
|
|
entity_id: lock.front_door
|
|
from: locked
|
|
to: unlocked
|
|
condition:
|
|
- condition: state
|
|
entity_id: input_boolean.front_door_auto_relock_enabled
|
|
state: 'on'
|
|
action:
|
|
- delay:
|
|
seconds: '{{ states(''input_number.front_door_auto_relock_delay'') | int }}'
|
|
- condition: state
|
|
entity_id: lock.front_door
|
|
state: unlocked
|
|
- condition: state
|
|
entity_id: binary_sensor.front_door_sensor_window_door_is_open
|
|
state: 'off'
|
|
- service: lock.lock
|
|
target:
|
|
entity_id: lock.front_door
|
|
- service: notify.mobile_app_pixel_9_pro_xl
|
|
data:
|
|
title: 🔒 Door Auto-Locked
|
|
message: Front door automatically relocked after {{ states('input_number.front_door_auto_relock_delay')
|
|
| int }} seconds
|
|
data:
|
|
tag: door_auto_lock
|
|
priority: high
|
|
ttl: 0
|
|
channel: Security
|
|
notification_icon: mdi:lock
|
|
- service: system_log.write
|
|
data:
|
|
level: info
|
|
message: Front door auto-relocked after {{ states('input_number.front_door_auto_relock_delay')
|
|
| int }} seconds (door was closed and still unlocked)
|
|
- id: front_door_unlocked_alarm
|
|
alias: Front Door - Unlocked Too Long Alarm (5 min)
|
|
description: Triggers alarm if front door remains unlocked for more than 5 minutes
|
|
mode: single
|
|
trigger:
|
|
- platform: state
|
|
entity_id: lock.front_door
|
|
from: locked
|
|
to: unlocked
|
|
for:
|
|
minutes: '{{ states(''input_number.front_door_alarm_delay'') | int }}'
|
|
condition:
|
|
- condition: state
|
|
entity_id: input_boolean.front_door_alarm_enabled
|
|
state: 'on'
|
|
action:
|
|
- service: notify.mobile_app_pixel_9_pro_xl
|
|
data:
|
|
title: ⚠️ SECURITY ALERT
|
|
message: Front door has been UNLOCKED for over 5 minutes!
|
|
data:
|
|
tag: door_security_alert
|
|
priority: high
|
|
ttl: 0
|
|
channel: Security
|
|
notification_icon: mdi:alert
|
|
color: red
|
|
actions:
|
|
- action: LOCK_DOOR
|
|
title: Lock Now
|
|
- action: DISMISS
|
|
title: Dismiss
|
|
- service: notify.mobile_app_iphone
|
|
data:
|
|
title: ⚠️ SECURITY ALERT
|
|
message: Front door has been UNLOCKED for over 5 minutes!
|
|
data:
|
|
push:
|
|
sound:
|
|
name: default
|
|
critical: 1
|
|
volume: 1.0
|
|
continue_on_error: true
|
|
- service: notify.alexa_media
|
|
data:
|
|
target:
|
|
- media_player.kitchen_echo_show
|
|
- media_player.living_room_echo
|
|
- media_player.master_bedroom_echo
|
|
message: Attention! The front door has been unlocked for more than 5 minutes.
|
|
Please check the door.
|
|
data:
|
|
type: announce
|
|
method: all
|
|
continue_on_error: true
|
|
- service: persistent_notification.create
|
|
data:
|
|
title: 🚨 Security Alert
|
|
message: 'The front door has been unlocked for more than 5 minutes.
|
|
|
|
|
|
Time unlocked: {{ relative_time(states.lock.front_door.last_changed) }}
|
|
|
|
Door status: {{ states(''binary_sensor.front_door_sensor_window_door_is_open'')
|
|
}}
|
|
|
|
|
|
[Lock Door](/lovelace/security)
|
|
|
|
'
|
|
notification_id: door_unlocked_alert
|
|
- service: system_log.write
|
|
data:
|
|
level: warning
|
|
message: 'SECURITY ALERT: Front door has been unlocked for over 5 minutes'
|
|
- repeat:
|
|
while:
|
|
- condition: state
|
|
entity_id: lock.front_door
|
|
state: unlocked
|
|
sequence:
|
|
- delay:
|
|
minutes: 2
|
|
- service: notify.mobile_app_pixel_9_pro_xl
|
|
data:
|
|
title: ⚠️ DOOR STILL UNLOCKED
|
|
message: Front door remains unlocked! {{ relative_time(states.lock.front_door.last_changed)
|
|
}}
|
|
data:
|
|
tag: door_security_alert_repeat
|
|
priority: high
|
|
ttl: 0
|
|
channel: Security
|
|
notification_icon: mdi:alert
|
|
color: red
|
|
- service: notify.alexa_media
|
|
data:
|
|
target:
|
|
- media_player.kitchen_echo_show
|
|
message: Warning! The front door is still unlocked.
|
|
data:
|
|
type: announce
|
|
continue_on_error: true
|
|
- id: front_door_mobile_action_handler
|
|
alias: Front Door - Mobile Action Handler
|
|
description: Handles mobile app action responses for door security
|
|
mode: single
|
|
trigger:
|
|
- platform: event
|
|
event_type: mobile_app_notification_action
|
|
event_data:
|
|
action: LOCK_DOOR
|
|
condition: []
|
|
action:
|
|
- service: lock.lock
|
|
target:
|
|
entity_id: lock.front_door
|
|
- service: notify.mobile_app_pixel_9_pro_xl
|
|
data:
|
|
title: ✅ Door Locked
|
|
message: Front door has been locked remotely
|
|
data:
|
|
tag: door_locked_confirm
|
|
priority: high
|
|
ttl: 0
|
|
channel: Security
|
|
notification_icon: mdi:lock-check
|
|
- id: front_door_update_unlock_counter
|
|
alias: Front Door - Update Unlock Counter
|
|
description: Increment unlock counter when door is unlocked
|
|
mode: single
|
|
trigger:
|
|
- platform: state
|
|
entity_id: lock.front_door
|
|
from: locked
|
|
to: unlocked
|
|
condition:
|
|
- condition: state
|
|
entity_id: input_boolean.front_door_activity_logging
|
|
state: 'on'
|
|
action:
|
|
- service: input_number.increment
|
|
target:
|
|
entity_id: input_number.front_door_unlock_count_today
|
|
- service: input_datetime.set_datetime
|
|
target:
|
|
entity_id: input_datetime.front_door_last_unlocked
|
|
data:
|
|
datetime: '{{ now() }}'
|
|
- id: front_door_update_autolock_counter
|
|
alias: Front Door - Update Auto-Lock Counter
|
|
description: Increment auto-lock counter when door is auto-locked
|
|
mode: single
|
|
trigger:
|
|
- platform: state
|
|
entity_id: lock.front_door
|
|
from: unlocked
|
|
to: locked
|
|
for:
|
|
seconds: 1
|
|
condition:
|
|
- condition: state
|
|
entity_id: input_boolean.front_door_activity_logging
|
|
state: 'on'
|
|
- condition: state
|
|
entity_id: input_boolean.front_door_auto_relock_enabled
|
|
state: 'on'
|
|
- condition: template
|
|
value_template: "{% set last_unlocked = states('input_datetime.front_door_last_unlocked')\
|
|
\ %} {% if last_unlocked not in ['unknown', 'unavailable'] %}\n {% set time_since_unlock\
|
|
\ = (now() - (as_datetime(last_unlocked) | as_local)).total_seconds() %}\n \
|
|
\ {{ time_since_unlock <= 120 }}\n{% else %}\n false\n{% endif %}\n"
|
|
action:
|
|
- service: input_number.increment
|
|
target:
|
|
entity_id: input_number.front_door_auto_lock_count_today
|
|
- service: input_datetime.set_datetime
|
|
target:
|
|
entity_id: input_datetime.front_door_last_locked
|
|
data:
|
|
datetime: '{{ now() }}'
|
|
- id: front_door_update_alarm_counter
|
|
alias: Front Door - Update Alarm Counter
|
|
description: Increment alarm counter when door remains unlocked for alarm delay
|
|
period
|
|
mode: single
|
|
trigger:
|
|
- platform: state
|
|
entity_id: lock.front_door
|
|
from: locked
|
|
to: unlocked
|
|
for:
|
|
minutes: '{{ states(''input_number.front_door_alarm_delay'') | int }}'
|
|
condition:
|
|
- condition: state
|
|
entity_id: input_boolean.front_door_activity_logging
|
|
state: 'on'
|
|
- condition: state
|
|
entity_id: input_boolean.front_door_alarm_enabled
|
|
state: 'on'
|
|
action:
|
|
- service: input_number.increment
|
|
target:
|
|
entity_id: input_number.front_door_alarm_count_today
|
|
- id: front_door_reset_daily_counters
|
|
alias: Front Door - Reset Daily Counters
|
|
description: Reset all daily counters at midnight
|
|
mode: single
|
|
trigger:
|
|
- platform: time
|
|
at: 00:00:00
|
|
action:
|
|
- service: input_number.set_value
|
|
target:
|
|
entity_id:
|
|
- input_number.front_door_unlock_count_today
|
|
- input_number.front_door_auto_lock_count_today
|
|
- input_number.front_door_alarm_count_today
|
|
data:
|
|
value: 0
|
|
- id: front_door_security_mode_handler
|
|
alias: Front Door - Security Mode Handler
|
|
description: Update individual settings when security mode changes
|
|
mode: single
|
|
trigger:
|
|
- platform: state
|
|
entity_id: input_select.front_door_security_mode
|
|
action:
|
|
- choose:
|
|
- conditions:
|
|
- condition: state
|
|
entity_id: input_select.front_door_security_mode
|
|
state: Full Security
|
|
sequence:
|
|
- service: input_boolean.turn_on
|
|
target:
|
|
entity_id:
|
|
- input_boolean.front_door_auto_relock_enabled
|
|
- input_boolean.front_door_alarm_enabled
|
|
- input_boolean.front_door_notifications_enabled
|
|
- conditions:
|
|
- condition: state
|
|
entity_id: input_select.front_door_security_mode
|
|
state: Auto-Lock Only
|
|
sequence:
|
|
- service: input_boolean.turn_on
|
|
target:
|
|
entity_id: input_boolean.front_door_auto_relock_enabled
|
|
- service: input_boolean.turn_off
|
|
target:
|
|
entity_id:
|
|
- input_boolean.front_door_alarm_enabled
|
|
- input_boolean.front_door_notifications_enabled
|
|
- conditions:
|
|
- condition: state
|
|
entity_id: input_select.front_door_security_mode
|
|
state: Notifications Only
|
|
sequence:
|
|
- service: input_boolean.turn_off
|
|
target:
|
|
entity_id:
|
|
- input_boolean.front_door_auto_relock_enabled
|
|
- input_boolean.front_door_alarm_enabled
|
|
- service: input_boolean.turn_on
|
|
target:
|
|
entity_id: input_boolean.front_door_notifications_enabled
|
|
- conditions:
|
|
- condition: state
|
|
entity_id: input_select.front_door_security_mode
|
|
state: Disabled
|
|
sequence:
|
|
- service: input_boolean.turn_off
|
|
target:
|
|
entity_id:
|
|
- input_boolean.front_door_auto_relock_enabled
|
|
- input_boolean.front_door_alarm_enabled
|
|
- input_boolean.front_door_notifications_enabled
|
|
- id: globe_g1_storage_full_notification
|
|
alias: Globe G1 Storage Full - Alexa Notification
|
|
description: Announces when litter box storage is full and needs emptying
|
|
trigger:
|
|
- platform: state
|
|
entity_id: binary_sensor.globe_g1_storage_full
|
|
to: 'on'
|
|
for:
|
|
minutes: 2
|
|
condition:
|
|
- condition: state
|
|
entity_id: input_boolean.globe_g1_notifications_enabled
|
|
state: 'on'
|
|
- condition: state
|
|
entity_id: binary_sensor.globe_g1_notification_allowed
|
|
state: 'on'
|
|
- condition: not
|
|
conditions:
|
|
- condition: state
|
|
entity_id: binary_sensor.night_mode_active
|
|
state: 'on'
|
|
action:
|
|
- service: notify.alexa_media
|
|
data:
|
|
message: 'Attention! The Globe G1 litter box storage is full and needs to be
|
|
emptied. Please empty the waste drawer as soon as possible to prevent odors
|
|
and maintain proper operation.
|
|
|
|
'
|
|
target:
|
|
- media_player.everywhere
|
|
data:
|
|
type: announce
|
|
- service: notify.mobile_app_pixel_9_pro_xl
|
|
data:
|
|
title: 🚨 Globe G1 Alert
|
|
message: Litter box storage is FULL! Please empty waste drawer.
|
|
data:
|
|
priority: high
|
|
notification_icon: mdi:delete-variant
|
|
- service: notify.mobile_app_iphone
|
|
data:
|
|
title: 🚨 Globe G1 Alert - KRISTY
|
|
message: Litter box storage is FULL! Please empty waste drawer.
|
|
data:
|
|
priority: high
|
|
notification_icon: mdi:delete-variant
|
|
include_watch: true
|
|
actions:
|
|
- action: globe_g1_empty
|
|
title: Mark as Emptied
|
|
- service: persistent_notification.create
|
|
data:
|
|
title: Globe G1 Storage Full
|
|
message: The litter box storage needs to be emptied immediately.
|
|
notification_id: globe_g1_storage_full
|
|
- service: input_datetime.set_datetime
|
|
target:
|
|
entity_id: input_datetime.globe_g1_last_notification
|
|
data:
|
|
datetime: '{{ now() }}'
|
|
- service: logbook.log
|
|
data:
|
|
name: Globe G1 Alerts
|
|
message: Storage full notification sent
|
|
- id: globe_g1_litter_low_notification
|
|
alias: Globe G1 Litter Low - Alexa Notification
|
|
description: Announces when litter level is low and needs refilling
|
|
trigger:
|
|
- platform: state
|
|
entity_id: binary_sensor.globe_g1_litter_low
|
|
to: 'on'
|
|
for:
|
|
minutes: 5
|
|
condition:
|
|
- condition: state
|
|
entity_id: input_boolean.globe_g1_notifications_enabled
|
|
state: 'on'
|
|
- condition: state
|
|
entity_id: binary_sensor.globe_g1_notification_allowed
|
|
state: 'on'
|
|
- condition: not
|
|
conditions:
|
|
- condition: state
|
|
entity_id: binary_sensor.night_mode_active
|
|
state: 'on'
|
|
action:
|
|
- service: notify.alexa_media
|
|
data:
|
|
message: 'The Globe G1 litter box is running low on litter. Please refill the
|
|
litter reservoir to ensure proper cleaning cycles.
|
|
|
|
'
|
|
target:
|
|
- media_player.everywhere
|
|
data:
|
|
type: announce
|
|
- service: notify.mobile_app_pixel_9_pro_xl
|
|
data:
|
|
title: ⚠️ Globe G1 Alert
|
|
message: Litter level is LOW! Please refill litter reservoir.
|
|
data:
|
|
priority: normal
|
|
notification_icon: mdi:cup-water
|
|
- service: notify.mobile_app_iphone
|
|
data:
|
|
title: ⚠️ Globe G1 Alert - KRISTY
|
|
message: Litter level is LOW! Please refill litter reservoir.
|
|
data:
|
|
priority: normal
|
|
notification_icon: mdi:cup-water
|
|
include_watch: true
|
|
actions:
|
|
- action: globe_g1_refill
|
|
title: Mark as Refilled
|
|
- service: input_datetime.set_datetime
|
|
target:
|
|
entity_id: input_datetime.globe_g1_last_notification
|
|
data:
|
|
datetime: '{{ now() }}'
|
|
- service: logbook.log
|
|
data:
|
|
name: Globe G1 Alerts
|
|
message: Litter low notification sent
|
|
- id: globe_g1_error_state_notification
|
|
alias: Globe G1 Error State - Critical Alexa Notification
|
|
description: Immediate notification when device enters error state
|
|
trigger:
|
|
- platform: state
|
|
entity_id: sensor.globe_g1_status_derived
|
|
to: Error
|
|
condition:
|
|
- condition: state
|
|
entity_id: input_boolean.globe_g1_notifications_enabled
|
|
state: 'on'
|
|
action:
|
|
- service: notify.alexa_media
|
|
data:
|
|
message: 'Critical Alert! The Globe G1 litter box has encountered an error and
|
|
requires immediate attention. Please check the device and refer to the troubleshooting
|
|
guide.
|
|
|
|
'
|
|
target:
|
|
- media_player.everywhere
|
|
data:
|
|
type: announce
|
|
- service: notify.mobile_app_pixel_9_pro_xl
|
|
data:
|
|
title: 🚨 Globe G1 CRITICAL ERROR
|
|
message: Device in ERROR state! Check immediately.
|
|
data:
|
|
priority: high
|
|
notification_icon: mdi:alert-circle
|
|
actions:
|
|
- action: globe_g1_dashboard
|
|
title: View Dashboard
|
|
- service: notify.mobile_app_iphone
|
|
data:
|
|
title: 🚨 Globe G1 CRITICAL ERROR - KRISTY
|
|
message: Device in ERROR state! Check immediately.
|
|
data:
|
|
priority: high
|
|
notification_icon: mdi:alert-circle
|
|
include_watch: true
|
|
actions:
|
|
- action: globe_g1_dashboard
|
|
title: View Dashboard
|
|
- service: persistent_notification.create
|
|
data:
|
|
title: Globe G1 Critical Error
|
|
message: The litter box is in an error state and requires immediate attention.
|
|
notification_id: globe_g1_error_state
|
|
- service: input_datetime.set_datetime
|
|
target:
|
|
entity_id: input_datetime.globe_g1_last_notification
|
|
data:
|
|
datetime: '{{ now() }}'
|
|
- service: logbook.log
|
|
data:
|
|
name: Globe G1 Alerts
|
|
message: Critical error notification sent
|
|
- id: globe_g1_track_cat_visits
|
|
alias: Globe G1 Track Cat Visits
|
|
description: Increment visit counter when cat is detected
|
|
trigger:
|
|
- platform: state
|
|
entity_id: sensor.globe_g1_status_derived
|
|
to: Cat Inside
|
|
action:
|
|
- service: input_number.increment
|
|
target:
|
|
entity_id: input_number.globe_g1_visits_today
|
|
- service: logbook.log
|
|
data:
|
|
name: Globe G1 Usage
|
|
message: Cat visit detected - daily counter incremented
|
|
- id: globe_g1_track_cleaning_cycles
|
|
alias: Globe G1 Track Cleaning Cycles
|
|
description: Increment cycle counter when cleaning starts
|
|
trigger:
|
|
- platform: state
|
|
entity_id: sensor.globe_g1_status_derived
|
|
to: Processing Waste
|
|
action:
|
|
- service: input_number.increment
|
|
target:
|
|
entity_id: input_number.globe_g1_cycles_today
|
|
- service: logbook.log
|
|
data:
|
|
name: Globe G1 Usage
|
|
message: Cleaning cycle started - daily counter incremented
|
|
- id: globe_g1_cleaning_cycle_complete
|
|
alias: Globe G1 Cleaning Cycle Complete
|
|
description: Log when cleaning cycle completes successfully
|
|
trigger:
|
|
- platform: state
|
|
entity_id: sensor.globe_g1_status_derived
|
|
from: Processing Waste
|
|
to: Standby
|
|
action:
|
|
- service: logbook.log
|
|
data:
|
|
name: Globe G1 Operation
|
|
message: Cleaning cycle completed successfully
|
|
- id: globe_g1_handle_empty_storage
|
|
alias: Globe G1 Handle Storage Emptied
|
|
description: Process storage emptied button press
|
|
trigger:
|
|
- platform: state
|
|
entity_id: button.globe_g1_empty_storage
|
|
attribute: last_triggered
|
|
action:
|
|
- service: script.globe_g1_mark_storage_emptied
|
|
- service: persistent_notification.dismiss
|
|
data:
|
|
notification_id: globe_g1_storage_full
|
|
- id: globe_g1_handle_refill_litter
|
|
alias: Globe G1 Handle Litter Refilled
|
|
description: Process litter refilled button press
|
|
trigger:
|
|
- platform: state
|
|
entity_id: button.globe_g1_refill_litter
|
|
attribute: last_triggered
|
|
action:
|
|
- service: script.globe_g1_mark_litter_refilled
|
|
- id: globe_g1_daily_reset
|
|
alias: Globe G1 Daily Counter Reset
|
|
description: Reset daily usage counters at specified time
|
|
trigger:
|
|
- platform: template
|
|
value_template: '{{ now().strftime(''%H:%M:%S'') == states(''input_datetime.globe_g1_daily_reset'')
|
|
}}
|
|
|
|
'
|
|
action:
|
|
- service: script.globe_g1_daily_reset
|
|
- id: globe_g1_mobile_action_empty
|
|
alias: Globe G1 Mobile Action - Mark Emptied
|
|
description: Handle mobile app notification action to mark storage as emptied
|
|
trigger:
|
|
- platform: event
|
|
event_type: mobile_app_notification_action
|
|
event_data:
|
|
action: globe_g1_empty
|
|
action:
|
|
- service: script.globe_g1_mark_storage_emptied
|
|
- service: notify.mobile_app_iphone
|
|
data:
|
|
title: ✅ Globe G1 Updated
|
|
message: Storage marked as emptied. Thank you!
|
|
data:
|
|
tag: globe_g1_confirm
|
|
- id: globe_g1_mobile_action_refill
|
|
alias: Globe G1 Mobile Action - Mark Refilled
|
|
description: Handle mobile app notification action to mark litter as refilled
|
|
trigger:
|
|
- platform: event
|
|
event_type: mobile_app_notification_action
|
|
event_data:
|
|
action: globe_g1_refill
|
|
action:
|
|
- service: script.globe_g1_mark_litter_refilled
|
|
- service: notify.mobile_app_iphone
|
|
data:
|
|
title: ✅ Globe G1 Updated
|
|
message: Litter marked as refilled. Thank you!
|
|
data:
|
|
tag: globe_g1_confirm
|
|
- id: globe_g1_connection_lost
|
|
alias: Globe G1 Connection Lost
|
|
description: Alert when device goes offline for extended period
|
|
trigger:
|
|
- platform: state
|
|
entity_id: sensor.globe_g1_status_derived
|
|
to: unavailable
|
|
for:
|
|
minutes: 30
|
|
condition:
|
|
- condition: state
|
|
entity_id: input_boolean.globe_g1_notifications_enabled
|
|
state: 'on'
|
|
action:
|
|
- service: notify.mobile_app_pixel_9_pro_xl
|
|
data:
|
|
title: 📶 Globe G1 Offline
|
|
message: Litter box has been offline for 30+ minutes. Check WiFi connection.
|
|
data:
|
|
priority: normal
|
|
notification_icon: mdi:wifi-off
|
|
- service: notify.mobile_app_iphone
|
|
data:
|
|
title: 📶 Globe G1 Offline - KRISTY
|
|
message: Litter box has been offline for 30+ minutes. Check WiFi connection.
|
|
data:
|
|
priority: normal
|
|
notification_icon: mdi:wifi-off
|
|
include_watch: false
|
|
- service: logbook.log
|
|
data:
|
|
name: Globe G1 Connection
|
|
message: Device offline for 30+ minutes - notification sent
|
|
- id: globe_g1_connection_restored
|
|
alias: Globe G1 Connection Restored
|
|
description: Confirm when device comes back online
|
|
trigger:
|
|
- platform: state
|
|
entity_id: sensor.globe_g1_status_derived
|
|
from: unavailable
|
|
condition:
|
|
- condition: template
|
|
value_template: '{{ trigger.to_state and trigger.to_state.state is not none and
|
|
trigger.to_state.state != ''unavailable'' }}'
|
|
action:
|
|
- service: logbook.log
|
|
data:
|
|
name: Globe G1 Connection
|
|
message: 'Device connection restored - status: {{ trigger.to_state.state if
|
|
trigger.to_state and trigger.to_state.state is not none else ''unknown'' }}'
|
|
- id: globe_g1_maintenance_reminder
|
|
alias: Globe G1 Maintenance Reminder
|
|
description: Remind when scheduled maintenance is due
|
|
trigger:
|
|
- platform: time
|
|
at: 09:00:00
|
|
condition:
|
|
- condition: template
|
|
value_template: "{% set next_maintenance = states('input_datetime.globe_g1_next_maintenance')\
|
|
\ %} {% if next_maintenance not in ['unknown', 'unavailable'] %}\n {{ as_timestamp(next_maintenance)\
|
|
\ <= as_timestamp(now()) }}\n{% else %}\n false\n{% endif %}\n"
|
|
- condition: state
|
|
entity_id: input_boolean.globe_g1_notifications_enabled
|
|
state: 'on'
|
|
action:
|
|
- service: notify.alexa_media
|
|
data:
|
|
message: Scheduled maintenance is due for the Globe G1 litter box. Please perform
|
|
routine cleaning and inspection.
|
|
target:
|
|
- media_player.everywhere
|
|
data:
|
|
type: announce
|
|
- service: notify.mobile_app_pixel_9_pro_xl
|
|
data:
|
|
title: 🔧 Globe G1 Maintenance
|
|
message: Scheduled maintenance is due. Perform routine cleaning.
|
|
data:
|
|
priority: normal
|
|
notification_icon: mdi:wrench-clock
|
|
- service: notify.mobile_app_iphone
|
|
data:
|
|
title: 🔧 Globe G1 Maintenance - KRISTY
|
|
message: Scheduled maintenance is due. Perform routine cleaning.
|
|
data:
|
|
priority: normal
|
|
notification_icon: mdi:wrench-clock
|
|
include_watch: false
|
|
- id: system_health_status_reporter
|
|
alias: System Health - Status Reporter
|
|
description: Report system health status every hour
|
|
trigger:
|
|
- platform: time_pattern
|
|
minutes: 0
|
|
condition:
|
|
- condition: time
|
|
after: 08:00:00
|
|
before: '22:00:00'
|
|
action:
|
|
- service: logbook.log
|
|
data:
|
|
name: System Health Report
|
|
message: 'System Status: {{ states(''sensor.appliance_system_status'') | default(''Unknown'')
|
|
}} Integration Health: {{ states(''sensor.integration_health_status'') | default(''Unknown'')
|
|
}} Health %: {{ states(''sensor.integration_health_percentage'') | default(''Unknown'')
|
|
}}% Unavailable: {{ states(''sensor.unavailable_entities'') | default(''Unknown'')
|
|
}} PitBoss: {{ states(''sensor.pitboss_grill_status'') | default(''Unknown'')
|
|
}} Prusa Mini: {{ states(''sensor.prusa_mini_printer_status'') | default(''Unknown'')
|
|
}} Bluetooth Sensors: {{ states(''sensor.bluetooth_sensor_status'') | default(''Unknown'')
|
|
}} Alexa: {{ states(''media_player.everywhere'') | default(''Unknown'') }}
|
|
|
|
'
|
|
- id: health_monitor_critical_integration_health_drop
|
|
alias: Health Monitor - Critical Integration Health Drop
|
|
description: Monitor for significant drops in integration health
|
|
trigger:
|
|
- platform: numeric_state
|
|
entity_id: sensor.integration_health_percentage
|
|
below: 90
|
|
for:
|
|
minutes: 5
|
|
condition:
|
|
- condition: time
|
|
after: 08:00:00
|
|
before: '22:00:00'
|
|
action:
|
|
- service: notify.mobile_app_pixel_9_pro_xl
|
|
data:
|
|
title: ⚠️ Integration Health Drop
|
|
message: 'System health dropped to {{ states(''sensor.integration_health_percentage'')
|
|
}}%. Check {{ states(''sensor.unavailable_entities'') }} unavailable entities.
|
|
|
|
'
|
|
data:
|
|
priority: high
|
|
- id: critical_system_failure_alert
|
|
alias: System Health - Critical Failure Alert
|
|
description: Alert when critical systems fail
|
|
trigger:
|
|
- platform: state
|
|
entity_id: binary_sensor.system_health_ok
|
|
to: 'off'
|
|
for:
|
|
minutes: 5
|
|
action:
|
|
- service: notify.mobile_app_pixel_9_pro_xl
|
|
data:
|
|
title: 🚨 CRITICAL SYSTEM FAILURE
|
|
message: 'Multiple critical integrations have failed. Check Settings > Devices
|
|
& Services immediately.
|
|
|
|
'
|
|
data:
|
|
priority: high
|
|
importance: max
|
|
- service: logbook.log
|
|
data:
|
|
name: CRITICAL FAILURE
|
|
message: Critical integration failures detected
|
|
- id: tuya_connection_monitor
|
|
alias: Monitor Tuya Connection Health
|
|
description: Monitor Tuya device connectivity and log health status
|
|
trigger:
|
|
- platform: time_pattern
|
|
minutes: /30
|
|
condition:
|
|
- condition: template
|
|
value_template: '{{ states.sensor | selectattr(''entity_id'', ''search'', ''tuya'')
|
|
| list | length > 0 }}'
|
|
action:
|
|
- service: system_log.write
|
|
data:
|
|
message: 'Tuya devices: {{ states.sensor | selectattr(''entity_id'', ''search'',
|
|
''tuya'') | selectattr(''state'', ''ne'', ''unavailable'') | list | length
|
|
}} online'
|
|
level: info
|
|
- id: environmental_schedule_controller
|
|
alias: 'Environmental Systems: Schedule Controller'
|
|
description: 'New grow fertigation schedule: 2 times daily (8 PM and 4 AM)'
|
|
mode: single
|
|
trigger:
|
|
- platform: time
|
|
at: 04:00:00
|
|
id: morning_fertigation
|
|
- platform: time
|
|
at: '20:00:00'
|
|
id: evening_fertigation
|
|
action:
|
|
- service: input_boolean.turn_on
|
|
target:
|
|
entity_id: input_boolean.waste_pump_enabled
|
|
- service: input_boolean.turn_on
|
|
target:
|
|
entity_id: input_boolean.hydroponics_active_period
|
|
- event: hydroponics_fertigation
|
|
event_data:
|
|
type: '{{ ''morning_fertigation'' if trigger.id == ''morning_fertigation'' else
|
|
''evening_fertigation'' }}'
|
|
- id: environmental_hydroponics_management
|
|
alias: 'Environmental Systems: Hydroponics Management'
|
|
description: Event-driven hydroponics management with performance optimization
|
|
mode: queued
|
|
max: 3
|
|
trigger:
|
|
- platform: event
|
|
event_type: hydroponics_fertigation
|
|
id: fertigation_event
|
|
- platform: state
|
|
entity_id: input_boolean.waste_pump_enabled
|
|
to: 'on'
|
|
id: waste_pump_on
|
|
- platform: state
|
|
entity_id: input_boolean.waste_pump_enabled
|
|
to: 'off'
|
|
id: waste_pump_off
|
|
- platform: numeric_state
|
|
entity_id: sensor.wroommicrousb_reservoir_current_volume
|
|
below: 5
|
|
for: 00:05:00
|
|
id: low_water
|
|
- platform: numeric_state
|
|
entity_id: sensor.wroommicrousb_reservoir_water_temp
|
|
above: 30
|
|
for: 00:02:00
|
|
id: high_temp
|
|
- platform: numeric_state
|
|
entity_id: sensor.wroommicrousb_reservoir_water_temp
|
|
below: 5
|
|
for: 00:02:00
|
|
id: low_temp
|
|
condition:
|
|
- condition: or
|
|
conditions:
|
|
- condition: template
|
|
value_template: '{{ states(''switch.tp_link_smart_plug_c82e_feed_pump'') not
|
|
in [''unavailable'', ''unknown'', ''''] }}
|
|
|
|
'
|
|
- condition: trigger
|
|
id:
|
|
- low_water
|
|
- high_temp
|
|
- low_temp
|
|
action:
|
|
- variables:
|
|
current_volume: '{{ states(''sensor.wroommicrousb_reservoir_current_volume'')
|
|
| float(50) }}'
|
|
current_temp: '{{ states(''sensor.wroommicrousb_reservoir_water_temp'') | float(20)
|
|
}}'
|
|
feed_pump_duration: '{{ states(''input_number.hydroponics_feed_pump_duration'')
|
|
| int(15) }}'
|
|
- choose:
|
|
- conditions:
|
|
- condition: trigger
|
|
id: fertigation_event
|
|
sequence:
|
|
- service: script.environmental_run_fertigation_cycle
|
|
data:
|
|
duration: '{{ feed_pump_duration }}'
|
|
cycle_type: '{{ trigger.event.data.type }}'
|
|
- service: system_log.write
|
|
data:
|
|
message: 'New grow fertigation cycle completed: {{ trigger.event.data.type
|
|
}}'
|
|
level: info
|
|
- conditions:
|
|
- condition: trigger
|
|
id: waste_pump_on
|
|
sequence:
|
|
- service: switch.turn_on
|
|
target:
|
|
entity_id: switch.tp_link_smart_plug_c82e_waste_pump
|
|
- conditions:
|
|
- condition: trigger
|
|
id: waste_pump_off
|
|
sequence:
|
|
- service: switch.turn_off
|
|
target:
|
|
entity_id: switch.tp_link_smart_plug_c82e_waste_pump
|
|
- service: input_boolean.turn_off
|
|
target:
|
|
entity_id: input_boolean.hydroponics_active_period
|
|
- conditions:
|
|
- condition: trigger
|
|
id: low_water
|
|
sequence:
|
|
- service: script.turn_on
|
|
target:
|
|
entity_id: script.send_system_notification
|
|
data:
|
|
variables:
|
|
system_name: Hydroponics
|
|
status_type: warning
|
|
status_message: 'Low water level detected: {{ current_volume }}L'
|
|
- conditions:
|
|
- condition: trigger
|
|
id:
|
|
- high_temp
|
|
- low_temp
|
|
sequence:
|
|
- service: script.turn_on
|
|
target:
|
|
entity_id: script.send_system_notification
|
|
data:
|
|
variables:
|
|
system_name: Hydroponics
|
|
status_type: warning
|
|
status_message: 'Temperature alert: {{ current_temp }}°C'
|
|
- conditions:
|
|
- condition: trigger
|
|
id: schedule_trigger
|
|
sequence:
|
|
- if:
|
|
- condition: state
|
|
entity_id: input_boolean.hydroponics_active_period
|
|
state: 'on'
|
|
then:
|
|
- event: hydroponics_fertigation_trigger
|
|
event_data:
|
|
cycle_type: '{{ [''morning'', ''midday'', ''afternoon'', ''evening'',
|
|
''final''][((now().hour - 9) / 3) | int] if now().hour >= 9 else ''morning''
|
|
}}'
|
|
duration: '{{ feed_pump_duration }}'
|
|
default: []
|
|
- id: environmental_fertigation_handler
|
|
alias: Environmental Fertigation Handler
|
|
description: Handle fertigation events from event-driven scheduler
|
|
triggers:
|
|
- trigger: event
|
|
event_type: hydroponics_fertigation_trigger
|
|
id: fertigation_event
|
|
variables:
|
|
volume_available: '{{ states(''sensor.wroommicrousb_reservoir_current_volume'')
|
|
not in [''unavailable'', ''unknown'', ''''] }}'
|
|
current_volume: '{{ states(''sensor.wroommicrousb_reservoir_current_volume'')
|
|
| float(0) }}'
|
|
temp_available: '{{ states(''sensor.wroommicrousb_reservoir_water_temp'') not
|
|
in [''unavailable'', ''unknown'', ''''] }}'
|
|
current_temp: '{{ states(''sensor.wroommicrousb_reservoir_water_temp'') | float(0)
|
|
}}'
|
|
feed_pump_duration: '{{ states(''input_number.feed_pump_duration'') | int(20)
|
|
}}'
|
|
action:
|
|
- service: system_log.write
|
|
data:
|
|
message: 'Hydroponics: {{ trigger.event.data.cycle_type }} fertigation starting
|
|
- Water: {% if volume_available %}{{ current_volume }}L{% else %}sensor unavailable
|
|
(proceeding){% endif %}, Temp: {% if temp_available %}{{ current_temp }}°C{%
|
|
else %}sensor unavailable{% endif %}
|
|
|
|
'
|
|
level: info
|
|
- if:
|
|
- condition: template
|
|
value_template: '{{ volume_available and current_volume < 10 }}'
|
|
then:
|
|
- service: notify.mobile_app_pixel_9_pro_xl
|
|
data:
|
|
title: ⚠️ Hydroponics Low Water
|
|
message: 'Warning: Reservoir water level is low ({{ current_volume }}L). Fertigation
|
|
will continue but please refill soon.
|
|
|
|
'
|
|
data:
|
|
channel: hydroponics_alerts
|
|
tag: hydro_low_water
|
|
- if:
|
|
- condition: template
|
|
value_template: '{{ not volume_available or not temp_available }}'
|
|
then:
|
|
- service: persistent_notification.create
|
|
data:
|
|
title: ⚠️ Hydroponics Sensor Warning
|
|
message: 'Fertigation proceeding with sensor issues: {% if not volume_available
|
|
%}• Water level sensor unavailable{% endif %} {% if not temp_available %}•
|
|
Temperature sensor unavailable{% endif %}
|
|
|
|
Check sensor connectivity.
|
|
|
|
'
|
|
notification_id: hydro_sensor_warning
|
|
- service: script.environmental_run_fertigation_cycle
|
|
data:
|
|
duration: '{{ trigger.event.data.duration }}'
|
|
cycle_type: '{{ trigger.event.data.cycle_type }}'
|
|
- service: counter.increment
|
|
target:
|
|
entity_id: counter.environmental_optimized_triggers
|
|
mode: single
|
|
- id: environmental_safety_alerts
|
|
alias: Environmental Safety Alerts
|
|
description: Handle critical safety alerts for environmental systems
|
|
triggers:
|
|
- trigger: numeric_state
|
|
entity_id: sensor.wroommicrousb_reservoir_current_volume
|
|
below: 5.0
|
|
for: 00:01:00
|
|
id: low_water
|
|
- trigger: numeric_state
|
|
entity_id: sensor.wroommicrousb_reservoir_water_temp
|
|
above: 30
|
|
for: 00:02:00
|
|
id: high_temp
|
|
- trigger: numeric_state
|
|
entity_id: sensor.wroommicrousb_reservoir_water_temp
|
|
below: 5
|
|
for: 00:02:00
|
|
id: low_temp
|
|
action:
|
|
- choose:
|
|
- conditions:
|
|
- condition: trigger
|
|
id: low_water
|
|
sequence:
|
|
- service: notify.mobile_app_pixel_9_pro_xl
|
|
data:
|
|
message: 'WARNING: Reservoir water level is critically low ({{ states(''sensor.wroommicrousb_reservoir_current_volume'')
|
|
}}L)! Add water immediately.'
|
|
title: Hydroponics Low Water Alert
|
|
data:
|
|
priority: high
|
|
channel: hydroponics_alerts
|
|
tag: hydro_low_water
|
|
- service: switch.turn_off
|
|
target:
|
|
entity_id: switch.tp_link_smart_plug_c82e_feed_pump
|
|
- service: persistent_notification.create
|
|
data:
|
|
title: Hydroponics System Alert
|
|
message: Low water level detected at {{ now().strftime('%Y-%m-%d %H:%M')
|
|
}}. Fertigation pump disabled for safety.
|
|
notification_id: hydro_low_water
|
|
- conditions:
|
|
- condition: trigger
|
|
id: high_temp
|
|
sequence:
|
|
- service: notify.mobile_app_pixel_9_pro_xl
|
|
data:
|
|
message: 'WARNING: Reservoir water temperature is too high ({{ states(''sensor.wroommicrousb_reservoir_water_temp'')
|
|
}}°C)! Check cooling system.'
|
|
title: Hydroponics High Temp Alert
|
|
data:
|
|
priority: high
|
|
channel: hydroponics_alerts
|
|
tag: hydro_high_temp
|
|
- conditions:
|
|
- condition: trigger
|
|
id: low_temp
|
|
sequence:
|
|
- service: notify.mobile_app_pixel_9_pro_xl
|
|
data:
|
|
message: 'WARNING: Reservoir water temperature is too low ({{ states(''sensor.wroommicrousb_reservoir_water_temp'')
|
|
}}°C)! Check heating system.'
|
|
title: Hydroponics Low Temp Alert
|
|
data:
|
|
priority: high
|
|
channel: hydroponics_alerts
|
|
tag: hydro_low_temp
|
|
default: []
|
|
mode: single
|
|
- id: environmental_grow_light_scheduler
|
|
alias: Environmental Grow Light Scheduler
|
|
description: Event-driven grow light control to replace time-based triggers
|
|
triggers:
|
|
- trigger: time
|
|
at: 06:00:00
|
|
id: daily_schedule
|
|
condition:
|
|
- condition: state
|
|
entity_id: input_boolean.environmental_systems_enabled
|
|
state: 'on'
|
|
action:
|
|
- event: environmental_grow_lights_control
|
|
event_data:
|
|
action: 'on'
|
|
schedule_time: 07:00:00
|
|
- event: environmental_grow_lights_control
|
|
event_data:
|
|
action: 'off'
|
|
schedule_time: '19:00:00'
|
|
mode: single
|
|
- id: environmental_grow_light_handler
|
|
alias: Environmental Grow Light Handler
|
|
description: Handle grow light events from scheduler
|
|
triggers:
|
|
- trigger: event
|
|
event_type: environmental_grow_lights_control
|
|
id: grow_light_event
|
|
action:
|
|
- wait_template: '{{ now().strftime(''%H:%M:%S'') == trigger.event.data.schedule_time
|
|
}}'
|
|
timeout: 01:00:00
|
|
continue_on_timeout: false
|
|
- choose:
|
|
- conditions:
|
|
- condition: template
|
|
value_template: '{{ trigger.event.data.action == ''on'' }}'
|
|
sequence:
|
|
- service: switch.turn_on
|
|
target:
|
|
label_id: grow_lights
|
|
- service: system_log.write
|
|
data:
|
|
message: 'Environmental: Grow lights turned on via event scheduler'
|
|
level: info
|
|
- conditions:
|
|
- condition: template
|
|
value_template: '{{ trigger.event.data.action == ''off'' }}'
|
|
sequence:
|
|
- service: switch.turn_off
|
|
target:
|
|
label_id: grow_lights
|
|
- service: system_log.write
|
|
data:
|
|
message: 'Environmental: Grow lights turned off via event scheduler'
|
|
level: info
|
|
mode: queued
|
|
max: 5
|
|
- id: integration_test_orchestrator
|
|
alias: 'Integration Test: Main Orchestrator'
|
|
description: Coordinates cross-domain integration testing
|
|
trigger:
|
|
- platform: state
|
|
entity_id: input_boolean.integration_testing_active
|
|
to: 'on'
|
|
action:
|
|
- service: input_text.set_value
|
|
target:
|
|
entity_id: input_text.integration_test_results
|
|
data:
|
|
value: Integration testing started at {{ now().strftime('%H:%M:%S') }}
|
|
- service: logbook.log
|
|
data:
|
|
name: Integration Test
|
|
message: Starting cross-domain integration tests
|
|
- service: input_boolean.turn_on
|
|
target:
|
|
entity_id: input_boolean.test_appliance_lighting_coordination
|
|
- id: test_appliance_lighting_coordination
|
|
alias: 'Integration Test: Appliance-Lighting Coordination'
|
|
description: Tests that appliance events properly trigger lighting responses
|
|
trigger:
|
|
- platform: state
|
|
entity_id: input_boolean.test_appliance_lighting_coordination
|
|
to: 'on'
|
|
condition:
|
|
- condition: state
|
|
entity_id: input_boolean.integration_testing_active
|
|
state: 'on'
|
|
action:
|
|
- service: logbook.log
|
|
data:
|
|
name: Integration Test
|
|
message: Testing appliance-lighting coordination
|
|
- service: logbook.log
|
|
data:
|
|
name: Integration Test
|
|
message: Simulating dishwasher completion event
|
|
- service: input_text.set_value
|
|
target:
|
|
entity_id: input_text.integration_test_results
|
|
data:
|
|
value: '{{ states(''input_text.integration_test_results'') }} | Pre-test Kitchen
|
|
lights: {{ states(''light.kitchen_lights'') if states(''light.kitchen_lights'')
|
|
!= ''unknown'' else ''N/A'' }}
|
|
|
|
'
|
|
- delay: 00:00:15
|
|
- service: input_text.set_value
|
|
target:
|
|
entity_id: input_text.integration_test_results
|
|
data:
|
|
value: '{{ states(''input_text.integration_test_results'') }} | Post-event Kitchen
|
|
lights: {{ states(''light.kitchen_lights'') if states(''light.kitchen_lights'')
|
|
!= ''unknown'' else ''N/A'' }}
|
|
|
|
'
|
|
- service: input_boolean.turn_off
|
|
target:
|
|
entity_id: input_boolean.test_appliance_lighting_coordination
|
|
- service: logbook.log
|
|
data:
|
|
name: Integration Test
|
|
message: Appliance-lighting coordination test completed
|
|
- delay: 00:00:02
|
|
- service: input_boolean.turn_on
|
|
target:
|
|
entity_id: input_boolean.test_environmental_notification_flow
|
|
- id: test_environmental_notification_flow
|
|
alias: 'Integration Test: Environmental Notification Flow'
|
|
description: Tests environmental automation notification delivery
|
|
trigger:
|
|
- platform: state
|
|
entity_id: input_boolean.test_environmental_notification_flow
|
|
to: 'on'
|
|
condition:
|
|
- condition: state
|
|
entity_id: input_boolean.integration_testing_active
|
|
state: 'on'
|
|
action:
|
|
- service: logbook.log
|
|
data:
|
|
name: Integration Test
|
|
message: Testing environmental notification flow
|
|
- service: input_text.set_value
|
|
target:
|
|
entity_id: input_text.integration_test_results
|
|
data:
|
|
value: "{{ states('input_text.integration_test_results') }} | Notification services\
|
|
\ available: {% if states.notify %}\n {{ states.notify | list | length }}\
|
|
\ services\n{% else %}\n 0 services\n{% endif %}\n"
|
|
- service: logbook.log
|
|
data:
|
|
name: Integration Test
|
|
message: Simulating environmental alert scenario
|
|
- service: input_text.set_value
|
|
target:
|
|
entity_id: input_text.integration_test_results
|
|
data:
|
|
value: '{{ states(''input_text.integration_test_results'') }} | Mobile notification
|
|
test: {{ ''Available'' if ''notify.mobile_app'' in states.notify else ''Not
|
|
configured'' }}
|
|
|
|
'
|
|
- delay: 00:00:10
|
|
- service: input_boolean.turn_off
|
|
target:
|
|
entity_id: input_boolean.test_environmental_notification_flow
|
|
- service: logbook.log
|
|
data:
|
|
name: Integration Test
|
|
message: Environmental notification flow test completed
|
|
- service: input_text.set_value
|
|
target:
|
|
entity_id: input_text.integration_test_results
|
|
data:
|
|
value: '{{ states(''input_text.integration_test_results'') }} | Integration
|
|
testing completed at {{ now().strftime(''%H:%M:%S'') }}
|
|
|
|
'
|
|
- service: input_boolean.turn_off
|
|
target:
|
|
entity_id: input_boolean.integration_testing_active
|
|
- service: logbook.log
|
|
data:
|
|
name: Integration Test
|
|
message: All integration tests completed successfully
|
|
- id: test_cross_domain_dependencies
|
|
alias: 'Integration Test: Cross-Domain Dependencies'
|
|
description: Validates that domain packages can communicate with each other
|
|
trigger:
|
|
- platform: time
|
|
at: 03:30:00
|
|
condition:
|
|
- condition: state
|
|
entity_id: input_boolean.integration_testing_active
|
|
state: 'off'
|
|
action:
|
|
- service: logbook.log
|
|
data:
|
|
name: Integration Test
|
|
message: Running automated dependency validation
|
|
- service: logbook.log
|
|
data:
|
|
name: Integration Test
|
|
message: Cross-domain entity validation simulated - {{ states | length }} total
|
|
entities validated
|
|
- service: shell_command.validate_automation_conflicts
|
|
- id: lighting_scheduler
|
|
alias: Lighting Scheduler - Phase 3 Optimized
|
|
description: Single daily scheduler that fires events to replace multiple time-based
|
|
triggers
|
|
triggers:
|
|
- trigger: time
|
|
at: 00:00:00
|
|
id: daily_schedule
|
|
condition:
|
|
- condition: state
|
|
entity_id: input_boolean.lighting_scheduler_enabled
|
|
state: 'on'
|
|
action:
|
|
- event: lighting_schedule_trigger
|
|
event_data:
|
|
task_type: morning_startup
|
|
schedule_time: 07:00:00
|
|
- event: lighting_schedule_trigger
|
|
event_data:
|
|
task_type: evening_lighting
|
|
schedule_time: '19:00:00'
|
|
- event: lighting_schedule_trigger
|
|
event_data:
|
|
task_type: zwave_night_mode
|
|
schedule_time: '22:00:00'
|
|
- event: lighting_schedule_trigger
|
|
event_data:
|
|
task_type: night_lighting
|
|
schedule_time: '23:00:00'
|
|
- event: lighting_schedule_trigger
|
|
event_data:
|
|
task_type: zwave_day_mode
|
|
schedule_time: 07:00:00
|
|
mode: single
|
|
- id: lighting_manual_override_handler
|
|
alias: 'Lighting: Manual Override Handler'
|
|
description: Handle manual lighting changes and set override state
|
|
trigger:
|
|
- platform: state
|
|
entity_id:
|
|
- light.kitchen_led_strips
|
|
- light.rgbcw_lightbulb1
|
|
- light.rgbcw_lightbulb2
|
|
- light.rgbcw_lightbulb3
|
|
- light.rgbcw_lightbulb4
|
|
- light.rgbcw_lightbulb5
|
|
- light.rgbcw_lightbulb6
|
|
- light.rgbcw_lightbulb7
|
|
- light.rgbcw_lightbulb8
|
|
- light.rgbcw_lightbulb9
|
|
- light.rgbcw_lightbulb10
|
|
- light.rgbcw_lightbulb11
|
|
attribute: brightness
|
|
- platform: state
|
|
entity_id:
|
|
- light.kitchen_led_strips
|
|
- light.rgbcw_lightbulb1
|
|
- light.rgbcw_lightbulb2
|
|
- light.rgbcw_lightbulb3
|
|
- light.rgbcw_lightbulb4
|
|
- light.rgbcw_lightbulb5
|
|
- light.rgbcw_lightbulb6
|
|
- light.rgbcw_lightbulb7
|
|
- light.rgbcw_lightbulb8
|
|
- light.rgbcw_lightbulb9
|
|
- light.rgbcw_lightbulb10
|
|
- light.rgbcw_lightbulb11
|
|
attribute: color_temp
|
|
condition:
|
|
- condition: template
|
|
value_template: "{{ trigger.to_state.context.user_id is not none or\n trigger.to_state.context.parent_id\
|
|
\ is not none }}\n"
|
|
action:
|
|
- service: input_boolean.turn_on
|
|
target:
|
|
entity_id: input_boolean.manual_lighting_override
|
|
- service: system_log.write
|
|
data:
|
|
message: 'Manual lighting override detected: {{ trigger.entity_id }}'
|
|
level: info
|
|
mode: parallel
|
|
- id: scheduled_lights_control
|
|
alias: 'Lighting: Scheduled Light Control'
|
|
description: Controls all scheduled lights based on time with enhanced error handling
|
|
trigger:
|
|
- platform: event
|
|
event_type: lighting_schedule_trigger
|
|
event_data:
|
|
task_type: morning_startup
|
|
id: morning
|
|
- platform: event
|
|
event_type: lighting_schedule_trigger
|
|
event_data:
|
|
task_type: evening_lighting
|
|
id: evening
|
|
- platform: event
|
|
event_type: lighting_schedule_trigger
|
|
event_data:
|
|
task_type: night_lighting
|
|
id: night
|
|
- event: sunset
|
|
id: sunset
|
|
platform: sun
|
|
- event: sunrise
|
|
id: sunrise
|
|
offset: +00:15:00
|
|
platform: sun
|
|
- platform: template
|
|
value_template: '{{ now().strftime(''%H:%M'') == states(''input_datetime.grow_lights_winter_on_time'')[0:5]
|
|
}}'
|
|
id: winter_on
|
|
- platform: template
|
|
value_template: '{{ now().strftime(''%H:%M'') == states(''input_datetime.grow_lights_winter_off_time'')[0:5]
|
|
}}'
|
|
id: winter_off
|
|
condition:
|
|
- condition: template
|
|
value_template: '{{ states(''sun.sun'') not in [''unavailable'', ''unknown'',
|
|
''''] }}
|
|
|
|
'
|
|
action:
|
|
- choose:
|
|
- conditions:
|
|
- condition: trigger
|
|
id: morning
|
|
sequence:
|
|
- target:
|
|
label_id: morning_lights_2
|
|
data:
|
|
brightness_pct: 80
|
|
service: light.turn_on
|
|
- service: script.led_strips_rf_power_on
|
|
data: {}
|
|
- service: persistent_notification.create
|
|
data:
|
|
title: Good Morning
|
|
message: All morning lights and kitchen LED strips activated at {{ now().strftime('%H:%M')
|
|
}}.
|
|
notification_id: morning_lights
|
|
- conditions:
|
|
- condition: trigger
|
|
id: evening
|
|
sequence: []
|
|
- conditions:
|
|
- condition: trigger
|
|
id: night
|
|
sequence:
|
|
- target:
|
|
label_id: night_lights_2
|
|
service: light.turn_off
|
|
- service: script.led_strips_rf_power_off
|
|
data: {}
|
|
- service: persistent_notification.create
|
|
data:
|
|
title: Good Night
|
|
message: Night lights and kitchen LED strips turned off at {{ now().strftime('%H:%M')
|
|
}}.
|
|
notification_id: night_lights
|
|
- conditions:
|
|
- condition: trigger
|
|
id: sunset
|
|
sequence:
|
|
- target:
|
|
entity_id: light.porch_light
|
|
data:
|
|
brightness_pct: 80
|
|
service: light.turn_on
|
|
- target:
|
|
entity_id: light.hall_light
|
|
data:
|
|
brightness_pct: 70
|
|
service: light.turn_on
|
|
- target:
|
|
entity_id: switch.tp_link_smart_plug_5e5b_walkway
|
|
service: switch.turn_on
|
|
- condition: state
|
|
entity_id: input_boolean.grow_lights_winter_override
|
|
state: 'off'
|
|
- target:
|
|
label_id: grow_lights
|
|
service: switch.turn_off
|
|
- conditions:
|
|
- condition: trigger
|
|
id: sunrise
|
|
sequence:
|
|
- target:
|
|
entity_id: light.porch_light
|
|
service: light.turn_off
|
|
- target:
|
|
entity_id: light.hall_light
|
|
service: light.turn_off
|
|
- target:
|
|
entity_id: switch.tp_link_smart_plug_5e5b_walkway
|
|
service: switch.turn_off
|
|
- condition: state
|
|
entity_id: input_boolean.grow_lights_winter_override
|
|
state: 'off'
|
|
- target:
|
|
label_id: grow_lights
|
|
service: switch.turn_on
|
|
- conditions:
|
|
- condition: trigger
|
|
id: winter_on
|
|
- condition: state
|
|
entity_id: input_boolean.grow_lights_winter_override
|
|
state: 'on'
|
|
sequence:
|
|
- target:
|
|
label_id: grow_lights
|
|
service: switch.turn_on
|
|
- service: persistent_notification.create
|
|
data:
|
|
title: Winter Grow Lights
|
|
message: Grow lights activated at {{ now().strftime('%H:%M') }} (Winter
|
|
Schedule).
|
|
notification_id: winter_grow_lights_on
|
|
- conditions:
|
|
- condition: trigger
|
|
id: winter_off
|
|
- condition: state
|
|
entity_id: input_boolean.grow_lights_winter_override
|
|
state: 'on'
|
|
sequence:
|
|
- target:
|
|
label_id: grow_lights
|
|
service: switch.turn_off
|
|
- service: persistent_notification.create
|
|
data:
|
|
title: Winter Grow Lights
|
|
message: Grow lights deactivated at {{ now().strftime('%H:%M') }} (Winter
|
|
Schedule).
|
|
notification_id: winter_grow_lights_off
|
|
- service: system_log.write
|
|
data:
|
|
message: Light schedule triggered at {{ now().strftime('%Y-%m-%d %H:%M:%S')
|
|
}} by {{ trigger.id }}
|
|
level: info
|
|
- if:
|
|
- condition: trigger
|
|
id:
|
|
- morning
|
|
- evening
|
|
- night
|
|
then:
|
|
- service: counter.increment
|
|
target:
|
|
entity_id: counter.lighting_optimized_triggers
|
|
mode: single
|
|
- id: led_strips_button_power_on
|
|
alias: LED Strips Button - Power On
|
|
description: Activates LED strips via RF remote when power on button is pressed
|
|
trigger:
|
|
- platform: state
|
|
entity_id: input_button.led_strips_power_on
|
|
condition:
|
|
- condition: state
|
|
entity_id: remote.rm4_pro
|
|
state: 'on'
|
|
action:
|
|
- service: script.led_strips_rf_power_on
|
|
- id: led_strips_button_power_off
|
|
alias: LED Strips Button - Power Off
|
|
description: Deactivates LED strips via RF remote when power off button is pressed
|
|
trigger:
|
|
- platform: state
|
|
entity_id: input_button.led_strips_power_off
|
|
condition:
|
|
- condition: state
|
|
entity_id: remote.rm4_pro
|
|
state: 'on'
|
|
action:
|
|
- service: script.led_strips_rf_power_off
|
|
- id: led_strips_button_brightness_up
|
|
alias: LED Strips Button - Brightness Up
|
|
description: Increases LED strip brightness via RF remote and updates brightness
|
|
tracking
|
|
trigger:
|
|
- platform: state
|
|
entity_id: input_button.led_strips_brightness_up
|
|
condition:
|
|
- condition: state
|
|
entity_id: remote.rm4_pro
|
|
state: 'on'
|
|
action:
|
|
- service: script.led_strips_rf_brightness_up
|
|
- id: led_strips_button_brightness_down
|
|
alias: LED Strips Button - Brightness Down
|
|
description: Decreases LED strip brightness via RF remote and updates brightness
|
|
tracking
|
|
trigger:
|
|
- platform: state
|
|
entity_id: input_button.led_strips_brightness_down
|
|
condition:
|
|
- condition: state
|
|
entity_id: remote.rm4_pro
|
|
state: 'on'
|
|
action:
|
|
- service: script.led_strips_rf_brightness_down
|
|
- id: led_strips_button_warmer
|
|
alias: LED Strips Button - Warmer
|
|
description: Makes LED strips warmer color temperature via RF remote
|
|
trigger:
|
|
- platform: state
|
|
entity_id: input_button.led_strips_warmer
|
|
condition:
|
|
- condition: state
|
|
entity_id: remote.rm4_pro
|
|
state: 'on'
|
|
action:
|
|
- service: script.led_strips_rf_warmer
|
|
- id: led_strips_button_cooler
|
|
alias: LED Strips Button - Cooler
|
|
description: Makes LED strips cooler color temperature via RF remote
|
|
trigger:
|
|
- platform: state
|
|
entity_id: input_button.led_strips_cooler
|
|
condition:
|
|
- condition: state
|
|
entity_id: remote.rm4_pro
|
|
state: 'on'
|
|
action:
|
|
- service: script.led_strips_rf_cooler
|
|
- id: led_strips_button_warm_white
|
|
alias: LED Strips Button - Warm White
|
|
description: Sets LED strips to warm white preset color via RF remote
|
|
trigger:
|
|
- platform: state
|
|
entity_id: input_button.led_strips_warm_white
|
|
condition:
|
|
- condition: state
|
|
entity_id: remote.rm4_pro
|
|
state: 'on'
|
|
action:
|
|
- service: script.led_strips_rf_warm_white
|
|
- id: led_strips_button_neutral_white
|
|
alias: LED Strips Button - Neutral White
|
|
description: Sets LED strips to neutral white preset color via RF remote
|
|
trigger:
|
|
- platform: state
|
|
entity_id: input_button.led_strips_neutral_white
|
|
condition:
|
|
- condition: state
|
|
entity_id: remote.rm4_pro
|
|
state: 'on'
|
|
action:
|
|
- service: script.led_strips_rf_neutral_white
|
|
- id: led_strips_button_cool_white
|
|
alias: LED Strips Button - Cool White
|
|
description: Sets LED strips to cool white preset color via RF remote
|
|
trigger:
|
|
- platform: state
|
|
entity_id: input_button.led_strips_cool_white
|
|
condition:
|
|
- condition: state
|
|
entity_id: remote.rm4_pro
|
|
state: 'on'
|
|
action:
|
|
- service: script.led_strips_rf_cool_white
|
|
- id: led_strips_morning_startup
|
|
alias: LED Strips - Morning Startup
|
|
description: Automatically turn on LED strips every morning at 7 AM with adaptive
|
|
lighting
|
|
trigger:
|
|
- platform: event
|
|
event_type: lighting_schedule_trigger
|
|
event_data:
|
|
task_type: morning_startup
|
|
condition:
|
|
- condition: state
|
|
entity_id: remote.rm4_pro
|
|
state: 'on'
|
|
action:
|
|
- service: script.led_strips_rf_power_on
|
|
- service: counter.increment
|
|
target:
|
|
entity_id: counter.lighting_optimized_triggers
|
|
- id: led_strips_manual_override_detection
|
|
alias: LED Strips - Manual Override Detection
|
|
description: Detect when LED strips are manually controlled via RF remote and temporarily
|
|
disable adaptive lighting
|
|
trigger:
|
|
- platform: state
|
|
entity_id:
|
|
- input_number.led_strips_brightness_level
|
|
- input_number.led_strips_color_temp
|
|
condition:
|
|
- condition: template
|
|
value_template: '{{ trigger.to_state.context.user_id is not none }}'
|
|
- condition: state
|
|
entity_id: input_boolean.led_strips_power_status
|
|
state: 'on'
|
|
action:
|
|
- service: input_boolean.turn_on
|
|
target:
|
|
entity_id: input_boolean.manual_lighting_override
|
|
- service: system_log.write
|
|
data:
|
|
message: LED strips manual override detected
|
|
level: info
|
|
mode: restart
|
|
- id: zwave_led_night_mode_on
|
|
alias: Z-Wave LEDs - Night Mode On
|
|
description: Turns off selected Z-Wave switch LEDs at night (10 PM)
|
|
trigger:
|
|
- platform: event
|
|
event_type: lighting_schedule_trigger
|
|
event_data:
|
|
task_type: zwave_night_mode
|
|
action:
|
|
- repeat:
|
|
for_each:
|
|
- light.hobby_light
|
|
- light.gavin_light
|
|
- light.pantry_light
|
|
- light.master_light
|
|
- light.nook_light
|
|
- light.guest_light
|
|
- light.porch_light
|
|
- light.hall_light
|
|
- light.linda_light
|
|
sequence:
|
|
- variables:
|
|
light_entity: '{{ repeat.item }}'
|
|
input_boolean_entity: input_boolean.zwave_led_darken_{{ repeat.item.split('.')[1]
|
|
}}
|
|
- if:
|
|
- condition: template
|
|
value_template: '{{ is_state(input_boolean_entity, ''on'') }}'
|
|
- condition: template
|
|
value_template: '{{ states(light_entity) not in [''unavailable'', ''unknown'']
|
|
}}'
|
|
then:
|
|
- service: zwave_js.set_config_parameter
|
|
target:
|
|
entity_id: '{{ light_entity }}'
|
|
data:
|
|
parameter: 7
|
|
value: 0
|
|
continue_on_error: true
|
|
- repeat:
|
|
for_each:
|
|
- fan.hobby_fan
|
|
- fan.master_fan
|
|
- fan.linda_fan
|
|
- fan.guest_fan
|
|
- fan.gavin_fan
|
|
sequence:
|
|
- variables:
|
|
fan_entity: '{{ repeat.item }}'
|
|
input_boolean_entity: input_boolean.zwave_led_darken_{{ repeat.item.split('.')[1]
|
|
}}
|
|
- if:
|
|
- condition: template
|
|
value_template: '{{ is_state(input_boolean_entity, ''on'') }}'
|
|
- condition: template
|
|
value_template: '{{ states(fan_entity) not in [''unavailable'', ''unknown'']
|
|
}}'
|
|
then:
|
|
- service: zwave_js.set_config_parameter
|
|
target:
|
|
entity_id: '{{ fan_entity }}'
|
|
data:
|
|
parameter: 3
|
|
value: 0
|
|
continue_on_error: true
|
|
- service: counter.increment
|
|
target:
|
|
entity_id: counter.lighting_optimized_triggers
|
|
- id: zwave_led_day_mode_on
|
|
alias: Z-Wave LEDs - Day Mode On
|
|
description: Restores Z-Wave switch LEDs to normal operation (7 AM)
|
|
trigger:
|
|
- platform: event
|
|
event_type: lighting_schedule_trigger
|
|
event_data:
|
|
task_type: zwave_day_mode
|
|
action:
|
|
- service: logbook.log
|
|
data:
|
|
name: Z-Wave LED Day Mode
|
|
message: Starting LED restoration for available devices
|
|
- repeat:
|
|
for_each:
|
|
- light.hobby_light
|
|
- light.gavin_light
|
|
- light.pantry_light
|
|
- light.master_light
|
|
- light.nook_light
|
|
- light.guest_light
|
|
- light.porch_light
|
|
- light.hall_light
|
|
- light.linda_light
|
|
sequence:
|
|
- variables:
|
|
light_entity: '{{ repeat.item }}'
|
|
- if:
|
|
- condition: template
|
|
value_template: '{{ states(light_entity) not in [''unavailable'', ''unknown'']
|
|
}}'
|
|
then:
|
|
- service: zwave_js.set_config_parameter
|
|
target:
|
|
entity_id: '{{ light_entity }}'
|
|
data:
|
|
parameter: 7
|
|
value: 1
|
|
continue_on_error: true
|
|
- service: logbook.log
|
|
data:
|
|
name: Z-Wave LED
|
|
message: Restored LED for {{ light_entity }}
|
|
else:
|
|
- service: logbook.log
|
|
data:
|
|
name: Z-Wave LED
|
|
message: 'Skipped unavailable device: {{ light_entity }}'
|
|
- repeat:
|
|
for_each:
|
|
- fan.hobby_fan
|
|
- fan.master_fan
|
|
- fan.linda_fan
|
|
- fan.guest_fan
|
|
- fan.gavin_fan
|
|
sequence:
|
|
- variables:
|
|
fan_entity: '{{ repeat.item }}'
|
|
- if:
|
|
- condition: template
|
|
value_template: '{{ states(fan_entity) not in [''unavailable'', ''unknown'']
|
|
}}'
|
|
then:
|
|
- service: zwave_js.set_config_parameter
|
|
target:
|
|
entity_id: '{{ fan_entity }}'
|
|
data:
|
|
parameter: 3
|
|
value: 1
|
|
continue_on_error: true
|
|
- service: logbook.log
|
|
data:
|
|
name: Z-Wave LED
|
|
message: Restored LED for {{ fan_entity }}
|
|
else:
|
|
- service: logbook.log
|
|
data:
|
|
name: Z-Wave LED
|
|
message: 'Skipped unavailable device: {{ fan_entity }}'
|
|
- service: counter.increment
|
|
target:
|
|
entity_id: counter.lighting_optimized_triggers
|
|
- id: zwave_led_manual_control
|
|
alias: Z-Wave LEDs - Manual Control
|
|
description: Immediately applies LED changes when manual toggles are changed during
|
|
night hours
|
|
trigger:
|
|
- platform: state
|
|
entity_id:
|
|
- input_boolean.zwave_led_darken_hobby_light
|
|
- input_boolean.zwave_led_darken_gavin_light
|
|
- input_boolean.zwave_led_darken_pantry_light
|
|
- input_boolean.zwave_led_darken_master_light
|
|
- input_boolean.zwave_led_darken_nook_light
|
|
- input_boolean.zwave_led_darken_guest_light
|
|
- input_boolean.zwave_led_darken_porch_light
|
|
- input_boolean.zwave_led_darken_hall_light
|
|
- input_boolean.zwave_led_darken_dining_light
|
|
- input_boolean.zwave_led_darken_linda_light
|
|
- input_boolean.zwave_led_darken_hobby_fan
|
|
- input_boolean.zwave_led_darken_master_fan
|
|
- input_boolean.zwave_led_darken_linda_fan
|
|
- input_boolean.zwave_led_darken_guest_fan
|
|
- input_boolean.zwave_led_darken_gavin_fan
|
|
condition:
|
|
- condition: time
|
|
after: '22:00:00'
|
|
before: 07:00:00
|
|
action:
|
|
- service: script.zwave_led_apply_setting
|
|
data:
|
|
input_boolean: '{{ trigger.entity_id }}'
|
|
new_state: '{{ trigger.to_state.state if trigger.to_state else ''unknown'' }}'
|
|
mode: parallel
|
|
max: 20
|
|
- id: lighting_zwave_led_preset_handler
|
|
alias: Z-Wave LED - Preset Handler
|
|
description: Applies LED presets when input_select changes
|
|
trigger:
|
|
- platform: state
|
|
entity_id: input_select.zwave_led_night_mode_preset
|
|
action:
|
|
- service: script.zwave_led_apply_preset
|
|
data:
|
|
preset: '{{ trigger.to_state.state if trigger.to_state else ''unknown'' }}'
|
|
mode: single
|
|
- id: zwave_led_night_mode_coordination
|
|
alias: 'Lighting: Z-Wave LED Night Mode Coordination'
|
|
description: Coordinate Z-Wave LED night mode with adaptive lighting
|
|
trigger:
|
|
- platform: state
|
|
entity_id: binary_sensor.night_mode_active
|
|
condition:
|
|
- condition: template
|
|
value_template: '{{ trigger.from_state.state != trigger.to_state.state }}'
|
|
action:
|
|
- choose:
|
|
- conditions:
|
|
- condition: state
|
|
entity_id: binary_sensor.night_mode_active
|
|
state: 'on'
|
|
sequence:
|
|
- service: input_boolean.turn_on
|
|
target:
|
|
entity_id: input_boolean.sleep_mode
|
|
- service: persistent_notification.create
|
|
data:
|
|
title: Night Mode Active
|
|
message: Night mode is now active. LED indicators dimmed and adaptive lighting
|
|
in sleep mode.
|
|
notification_id: zwave_led_night_mode
|
|
- conditions:
|
|
- condition: state
|
|
entity_id: binary_sensor.night_mode_active
|
|
state: 'off'
|
|
sequence:
|
|
- service: input_boolean.turn_off
|
|
target:
|
|
entity_id: input_boolean.sleep_mode
|
|
- service: persistent_notification.create
|
|
data:
|
|
title: Day Mode Active
|
|
message: Day mode is now active. Normal lighting restored.
|
|
notification_id: zwave_led_day_mode
|
|
- delay: 00:05:00
|
|
- service: persistent_notification.dismiss
|
|
data:
|
|
notification_id: zwave_led_day_mode
|
|
- id: lighting_zwave_led_night_mode_notifications
|
|
alias: Z-Wave LED - Night Mode Notifications
|
|
description: Provides notifications when night mode begins/ends
|
|
trigger:
|
|
- platform: state
|
|
entity_id: binary_sensor.night_mode_active
|
|
condition:
|
|
- condition: template
|
|
value_template: '{{ trigger.from_state.state != trigger.to_state.state }}'
|
|
action:
|
|
- choose:
|
|
- conditions:
|
|
- condition: state
|
|
entity_id: binary_sensor.night_mode_active
|
|
state: 'on'
|
|
sequence:
|
|
- service: persistent_notification.create
|
|
data:
|
|
title: Z-Wave LED Night Mode
|
|
message: Night mode is now active (10 PM - 7 AM). Selected LED indicators
|
|
will be turned off.
|
|
notification_id: zwave_led_night_mode
|
|
- conditions:
|
|
- condition: state
|
|
entity_id: binary_sensor.night_mode_active
|
|
state: 'off'
|
|
sequence:
|
|
- service: persistent_notification.create
|
|
data:
|
|
title: Z-Wave LED Day Mode
|
|
message: Day mode is now active. All LED indicators have been restored to
|
|
normal operation.
|
|
notification_id: zwave_led_day_mode
|
|
- delay: 00:05:00
|
|
- service: persistent_notification.dismiss
|
|
data:
|
|
notification_id: zwave_led_day_mode
|
|
mode: single
|
|
- id: '1736869556746'
|
|
alias: Lights Sunset Sunrise
|
|
description: Automation based on sunrise/sun set
|
|
triggers:
|
|
- event: sunset
|
|
id: Sunset
|
|
trigger: sun
|
|
- event: sunrise
|
|
id: Sunrise
|
|
offset: +00:15:00
|
|
trigger: sun
|
|
actions:
|
|
- target:
|
|
entity_id: light.porch_light
|
|
action: light.turn_{{ 'on' if trigger.id == 'Sunset' else 'off' }}
|
|
- choose:
|
|
- conditions:
|
|
- condition: trigger
|
|
id:
|
|
- Sunset
|
|
sequence:
|
|
- target:
|
|
entity_id: light.hall_light
|
|
data:
|
|
brightness_pct: 100
|
|
action: light.turn_on
|
|
- action: switch.turn_on
|
|
metadata: {}
|
|
data: {}
|
|
target:
|
|
entity_id: switch.tp_link_smart_plug_5e5b_walkway
|
|
- conditions:
|
|
- condition: trigger
|
|
id:
|
|
- Sunrise
|
|
sequence:
|
|
- target:
|
|
entity_id: light.hall_light
|
|
action: light.turn_off
|
|
data: {}
|
|
- action: switch.turn_off
|
|
metadata: {}
|
|
data: {}
|
|
target:
|
|
entity_id: switch.tp_link_smart_plug_5e5b_walkway
|
|
default:
|
|
- data:
|
|
message: 'No Sunrise/Sunset actions (trigger: {{ trigger.id }})'
|
|
name: Lights Sunset Sunrise Automation
|
|
entity_id: sun.sun
|
|
action: logbook.log
|
|
- id: '1747693281652'
|
|
alias: KitchenAndLivingRoomDimmers
|
|
description: Kitchen and Living Room Dimmers - updated for actual device topology
|
|
triggers:
|
|
- platform: mqtt
|
|
topic: zigbee2mqtt/Kitchen_Dimmer/action
|
|
id: kitchen_dimmer
|
|
- platform: mqtt
|
|
topic: zigbee2mqtt/LivingRoom_Dimmer/action
|
|
id: living_room_dimmer
|
|
conditions: []
|
|
actions:
|
|
- action: logbook.log
|
|
data:
|
|
name: Dimmer Debug
|
|
message: 'Device: {{ trigger.id }}, Payload: {{ trigger.payload }}'
|
|
- choose:
|
|
- conditions:
|
|
- condition: template
|
|
value_template: '{{ trigger.id == ''kitchen_dimmer'' and trigger.payload ==
|
|
''on_press_release'' }}'
|
|
sequence:
|
|
- action: logbook.log
|
|
data:
|
|
name: Kitchen Dimmer Action
|
|
message: Turning on kitchen lights
|
|
- action: light.turn_on
|
|
target:
|
|
entity_id: light.kitchen_lights
|
|
continue_on_error: true
|
|
- conditions:
|
|
- condition: template
|
|
value_template: '{{ trigger.id == ''kitchen_dimmer'' and trigger.payload ==
|
|
''off_press_release'' }}'
|
|
sequence:
|
|
- action: logbook.log
|
|
data:
|
|
name: Kitchen Dimmer Action
|
|
message: Turning off kitchen lights
|
|
- action: light.turn_off
|
|
target:
|
|
entity_id: light.kitchen_lights
|
|
continue_on_error: true
|
|
- conditions:
|
|
- condition: template
|
|
value_template: '{{ trigger.id == ''living_room_dimmer'' and trigger.payload
|
|
== ''on_press_release'' }}'
|
|
sequence:
|
|
- action: logbook.log
|
|
data:
|
|
name: Living Room Dimmer Action
|
|
message: Turning on living room lights
|
|
- action: light.turn_on
|
|
target:
|
|
entity_id: light.livingroom_lights
|
|
continue_on_error: true
|
|
- action: light.turn_on
|
|
target:
|
|
entity_id:
|
|
- light.rgbcw_lightbulb1
|
|
- light.rgbcw_lightbulb2
|
|
- light.rgbcw_lightbulb3
|
|
- light.rgbcw_lightbulb4
|
|
- light.rgbcw_lightbulb5
|
|
continue_on_error: true
|
|
- conditions:
|
|
- condition: template
|
|
value_template: '{{ trigger.id == ''living_room_dimmer'' and trigger.payload
|
|
== ''off_press_release'' }}'
|
|
sequence:
|
|
- action: logbook.log
|
|
data:
|
|
name: Living Room Dimmer Action
|
|
message: Turning off living room lights
|
|
- action: light.turn_off
|
|
target:
|
|
entity_id: light.livingroom_lights
|
|
continue_on_error: true
|
|
- action: light.turn_off
|
|
target:
|
|
entity_id:
|
|
- light.rgbcw_lightbulb1
|
|
- light.rgbcw_lightbulb2
|
|
- light.rgbcw_lightbulb3
|
|
- light.rgbcw_lightbulb4
|
|
- light.rgbcw_lightbulb5
|
|
continue_on_error: true
|
|
- conditions:
|
|
- condition: template
|
|
value_template: '{{ trigger.id == ''kitchen_dimmer'' and trigger.payload ==
|
|
''up_press_release'' }}'
|
|
sequence:
|
|
- action: logbook.log
|
|
data:
|
|
name: Kitchen Dimmer Action
|
|
message: Increasing kitchen brightness (press)
|
|
- action: light.turn_on
|
|
data:
|
|
brightness_step_pct: 10
|
|
target:
|
|
entity_id: light.kitchen_lights
|
|
continue_on_error: true
|
|
- conditions:
|
|
- condition: template
|
|
value_template: '{{ trigger.id == ''kitchen_dimmer'' and trigger.payload ==
|
|
''up_hold_release'' }}'
|
|
sequence:
|
|
- action: logbook.log
|
|
data:
|
|
name: Kitchen Dimmer Action
|
|
message: Increasing kitchen brightness (hold)
|
|
- action: light.turn_on
|
|
data:
|
|
brightness_step_pct: 30
|
|
target:
|
|
entity_id: light.kitchen_lights
|
|
continue_on_error: true
|
|
- conditions:
|
|
- condition: template
|
|
value_template: '{{ trigger.id == ''kitchen_dimmer'' and trigger.payload ==
|
|
''down_press_release'' }}'
|
|
sequence:
|
|
- action: logbook.log
|
|
data:
|
|
name: Kitchen Dimmer Action
|
|
message: Decreasing kitchen brightness (press)
|
|
- action: light.turn_on
|
|
data:
|
|
brightness_step_pct: -10
|
|
target:
|
|
entity_id: light.kitchen_lights
|
|
continue_on_error: true
|
|
- conditions:
|
|
- condition: template
|
|
value_template: '{{ trigger.id == ''kitchen_dimmer'' and trigger.payload ==
|
|
''down_hold_release'' }}'
|
|
sequence:
|
|
- action: logbook.log
|
|
data:
|
|
name: Kitchen Dimmer Action
|
|
message: Decreasing kitchen brightness (hold)
|
|
- action: light.turn_on
|
|
data:
|
|
brightness_step_pct: -30
|
|
target:
|
|
entity_id: light.kitchen_lights
|
|
continue_on_error: true
|
|
- conditions:
|
|
- condition: template
|
|
value_template: '{{ trigger.id == ''living_room_dimmer'' and trigger.payload
|
|
== ''up_press_release'' }}'
|
|
sequence:
|
|
- action: logbook.log
|
|
data:
|
|
name: Living Room Dimmer Action
|
|
message: Increasing living room brightness (press)
|
|
- action: light.turn_on
|
|
data:
|
|
brightness_step_pct: 10
|
|
target:
|
|
entity_id: light.livingroom_lights
|
|
continue_on_error: true
|
|
- conditions:
|
|
- condition: template
|
|
value_template: '{{ trigger.id == ''living_room_dimmer'' and trigger.payload
|
|
== ''up_hold_release'' }}'
|
|
sequence:
|
|
- action: logbook.log
|
|
data:
|
|
name: Living Room Dimmer Action
|
|
message: Increasing living room brightness (hold)
|
|
- action: light.turn_on
|
|
data:
|
|
brightness_step_pct: 30
|
|
target:
|
|
entity_id: light.livingroom_lights
|
|
continue_on_error: true
|
|
- conditions:
|
|
- condition: template
|
|
value_template: '{{ trigger.id == ''living_room_dimmer'' and trigger.payload
|
|
== ''down_press_release'' }}'
|
|
sequence:
|
|
- action: logbook.log
|
|
data:
|
|
name: Living Room Dimmer Action
|
|
message: Decreasing living room brightness (press)
|
|
- action: light.turn_on
|
|
data:
|
|
brightness_step_pct: -10
|
|
target:
|
|
entity_id: light.livingroom_lights
|
|
continue_on_error: true
|
|
- conditions:
|
|
- condition: template
|
|
value_template: '{{ trigger.id == ''living_room_dimmer'' and trigger.payload
|
|
== ''down_hold_release'' }}'
|
|
sequence:
|
|
- action: logbook.log
|
|
data:
|
|
name: Living Room Dimmer Action
|
|
message: Decreasing living room brightness (hold)
|
|
- action: light.turn_on
|
|
data:
|
|
brightness_step_pct: -30
|
|
target:
|
|
entity_id: light.livingroom_lights
|
|
continue_on_error: true
|
|
default: []
|
|
mode: queued
|
|
max: 10
|
|
- alias: AI Suggestions - New Entity Detection
|
|
description: Generates automation suggestions whenever new entities are registered
|
|
in Home Assistant
|
|
trigger:
|
|
- platform: event
|
|
event_type: entity_registry_updated
|
|
event_data:
|
|
action: create
|
|
- platform: event
|
|
event_type: entity_registry_updated
|
|
event_data:
|
|
action: update
|
|
condition:
|
|
- condition: template
|
|
value_template: "{% set automation = states.automation.ai_suggestions_new_entity_detection\
|
|
\ %} {% if automation and automation.attributes.last_triggered %}\n {% set\
|
|
\ hours_since = ((now() - as_datetime(automation.attributes.last_triggered)).total_seconds()\
|
|
\ / 3600) | float %}\n {{ hours_since > 1.0 }}\n{% else %}\n true\n{% endif\
|
|
\ %}"
|
|
action:
|
|
- service: ai_automation_suggester.generate_suggestions
|
|
target: {}
|
|
data: {}
|
|
- id: notification_deduplication_cleanup_v2
|
|
alias: Notification - Deduplication Cleanup
|
|
description: Clean up old deduplication hashes periodically
|
|
trigger:
|
|
- platform: time
|
|
at: 03:00:00
|
|
condition:
|
|
- condition: state
|
|
entity_id: input_boolean.notification_deduplication_enabled
|
|
state: 'on'
|
|
action:
|
|
- service: input_text.set_value
|
|
target:
|
|
entity_id: input_text.unified_notification_last_hash
|
|
data:
|
|
value: ''
|
|
- service: input_text.set_value
|
|
target:
|
|
entity_id: input_text.unified_notification_context
|
|
data:
|
|
value: ''
|
|
- service: input_text.set_value
|
|
target:
|
|
entity_id: input_text.notification_system_status
|
|
data:
|
|
value: Deduplication cleaned at {{ now().strftime('%H:%M') }}
|
|
- id: notification_rate_limit_reset_v2
|
|
alias: Notification - Rate Limit Reset
|
|
description: Reset notification rate limit hourly
|
|
trigger:
|
|
- platform: time_pattern
|
|
minutes: 0
|
|
action:
|
|
- service: input_datetime.set_datetime
|
|
entity_id: input_datetime.notification_rate_limit_reset
|
|
data:
|
|
datetime: '{{ (now() + timedelta(hours=1)) }}'
|
|
- service: input_text.set_value
|
|
target:
|
|
entity_id: input_text.notification_system_status
|
|
data:
|
|
value: Rate limit reset at {{ now().strftime('%H:%M') }}
|
|
- id: notification_test_mode_reminder_v2
|
|
alias: Notification - Test Mode Reminder
|
|
description: Remind when test mode has been on for too long
|
|
trigger:
|
|
- platform: state
|
|
entity_id: input_boolean.notification_test_mode
|
|
to: 'on'
|
|
for:
|
|
hours: 1
|
|
action:
|
|
- service: notify.mobile_app_pixel_9_pro_xl
|
|
data:
|
|
title: ⚠️ Notification Test Mode
|
|
message: Notification test mode has been active for 1 hour. Consider disabling
|
|
it.
|
|
data:
|
|
tag: notification_test_reminder
|
|
- id: postgresql_health_check
|
|
alias: PostgreSQL - Daily Health Check
|
|
description: Check PostgreSQL database health and connection status daily
|
|
trigger:
|
|
- platform: time
|
|
at: 03:00:00
|
|
action:
|
|
- service: shell_command.postgresql_health
|
|
- delay: 00:00:30
|
|
- if:
|
|
- condition: template
|
|
value_template: '{{ states(''sensor.postgresql_health_status'') == ''error''
|
|
}}'
|
|
then:
|
|
- service: script.send_deduplicated_notification
|
|
data:
|
|
appliance: postgresql
|
|
priority: critical
|
|
title: 🚨 POSTGRESQL HEALTH ISSUE
|
|
message: 'PostgreSQL database health check failed!
|
|
|
|
|
|
Status: {{ states(''sensor.postgresql_health_status'') }}
|
|
|
|
Connection: {{ state_attr(''sensor.postgresql_health_status'', ''connection'')
|
|
}}
|
|
|
|
Last Check: {{ state_attr(''sensor.postgresql_health_status'', ''last_check'')
|
|
}}
|
|
|
|
|
|
Action required: Database investigation needed.
|
|
|
|
'
|
|
tag: postgresql_health
|
|
channel: System Alerts
|
|
ttl: 0
|
|
- id: postgresql_weekly_maintenance
|
|
alias: PostgreSQL - Weekly Maintenance
|
|
description: Perform weekly PostgreSQL maintenance and statistics update
|
|
trigger:
|
|
- platform: time
|
|
at: 02:00:00
|
|
condition:
|
|
- condition: time
|
|
weekday:
|
|
- sun
|
|
- condition: template
|
|
value_template: '{{ states(''sensor.postgresql_database_size_mb'') | int(0) >
|
|
100 }}'
|
|
action:
|
|
- service: shell_command.postgresql_maintenance
|
|
- delay: 00:02:00
|
|
- service: script.send_deduplicated_notification
|
|
data:
|
|
appliance: postgresql
|
|
priority: normal
|
|
title: ✅ PostgreSQL Maintenance Complete
|
|
message: 'Weekly PostgreSQL maintenance completed.
|
|
|
|
|
|
Database Size: {{ states(''sensor.postgresql_database_size_mb'') }} MB
|
|
|
|
Status: {{ states(''sensor.postgresql_health_status'') }}
|
|
|
|
Tables Analyzed: All core tables
|
|
|
|
'
|
|
tag: postgresql_maintenance
|
|
channel: System Status
|
|
- id: postgresql_hourly_backup_peak
|
|
alias: PostgreSQL - Hourly Backup (Peak Hours) - Phase 3 Optimized
|
|
description: Create hourly PostgreSQL backups during peak usage hours - Event driven
|
|
mode: queued
|
|
max: 3
|
|
trigger:
|
|
- platform: event
|
|
event_type: postgresql_schedule_trigger
|
|
event_data:
|
|
task_type: hourly_backup
|
|
condition:
|
|
- condition: state
|
|
entity_id: input_boolean.postgresql_scheduler_enabled
|
|
state: 'on'
|
|
- condition: template
|
|
value_template: '{{ trigger.event.data.backup_type == ''peak_hours'' }}'
|
|
action:
|
|
- service: shell_command.postgresql_backup
|
|
- service: counter.increment
|
|
target:
|
|
entity_id: counter.postgresql_phase3_triggers
|
|
- id: postgresql_backup_performance_alert
|
|
alias: PostgreSQL - Backup Performance Alert
|
|
description: Alert when PostgreSQL backup performance degrades
|
|
trigger:
|
|
- platform: state
|
|
entity_id: binary_sensor.postgresql_backup_performance_issue
|
|
to: 'on'
|
|
for:
|
|
minutes: 2
|
|
action:
|
|
- service: script.send_deduplicated_notification
|
|
data:
|
|
appliance: postgresql
|
|
priority: high
|
|
title: ⚠️ PostgreSQL Backup Performance Issue
|
|
message: 'PostgreSQL backup performance has degraded:
|
|
|
|
|
|
Status: {{ states(''sensor.postgresql_backup_performance'') }}
|
|
|
|
Duration: {{ state_attr(''sensor.postgresql_backup_performance'', ''backup_duration'')
|
|
}}
|
|
|
|
Size: {{ state_attr(''sensor.postgresql_backup_performance'', ''backup_size'')
|
|
}}
|
|
|
|
Time: {{ state_attr(''sensor.postgresql_backup_performance'', ''last_backup_time'')
|
|
}}
|
|
|
|
|
|
{% if states(''sensor.postgresql_backup_duration_seconds'') | int(0) > 5 %}
|
|
|
|
Backup is taking longer than expected (>5 seconds).
|
|
|
|
{% endif %}
|
|
|
|
{% if states(''sensor.postgresql_backup_performance'') != ''success'' %}
|
|
|
|
Backup is failing - check PostgreSQL connectivity.
|
|
|
|
{% endif %}
|
|
|
|
'
|
|
tag: postgresql_backup_performance
|
|
channel: System Alerts
|
|
- id: postgresql_backup_retention_management
|
|
alias: PostgreSQL - Backup Retention Management - Phase 3 Optimized
|
|
description: Manage PostgreSQL backup retention schedules - Event driven
|
|
mode: single
|
|
trigger:
|
|
- platform: event
|
|
event_type: postgresql_schedule_trigger
|
|
event_data:
|
|
task_type: retention_management
|
|
condition:
|
|
- condition: state
|
|
entity_id: input_boolean.postgresql_scheduler_enabled
|
|
state: 'on'
|
|
- condition: template
|
|
value_template: '{{ trigger.event.data.schedule_time == ''04:00:00'' }}'
|
|
action:
|
|
- service: shell_command.postgresql_retention
|
|
- service: counter.increment
|
|
target:
|
|
entity_id: counter.postgresql_phase3_triggers
|
|
- id: postgresql_scheduler
|
|
alias: PostgreSQL Scheduler - Phase 3 Optimized
|
|
description: Event-driven scheduler replacing time-based triggers
|
|
mode: single
|
|
trigger:
|
|
- platform: time
|
|
at: 00:00:00
|
|
condition:
|
|
- condition: state
|
|
entity_id: input_boolean.postgresql_scheduler_enabled
|
|
state: 'on'
|
|
action:
|
|
- service: input_datetime.set_datetime
|
|
target:
|
|
entity_id: input_datetime.postgresql_scheduler_last_run
|
|
data:
|
|
datetime: '{{ now() }}'
|
|
- delay: 04:00:00
|
|
- event: postgresql_schedule_trigger
|
|
event_data:
|
|
task_type: retention_management
|
|
schedule_time: 04:00:00
|
|
- service: counter.increment
|
|
target:
|
|
entity_id: counter.postgresql_phase3_triggers
|
|
- delay: 03:00:00
|
|
- event: postgresql_schedule_trigger
|
|
event_data:
|
|
task_type: hourly_backup
|
|
schedule_time: 07:00:00
|
|
backup_type: peak_hours
|
|
- service: counter.increment
|
|
target:
|
|
entity_id: counter.postgresql_phase3_triggers
|
|
- delay: 04:00:00
|
|
- event: postgresql_schedule_trigger
|
|
event_data:
|
|
task_type: hourly_backup
|
|
schedule_time: '11:00:00'
|
|
backup_type: peak_hours
|
|
- service: counter.increment
|
|
target:
|
|
entity_id: counter.postgresql_phase3_triggers
|
|
- delay: 04:00:00
|
|
- event: postgresql_schedule_trigger
|
|
event_data:
|
|
task_type: hourly_backup
|
|
schedule_time: '15:00:00'
|
|
backup_type: peak_hours
|
|
- service: counter.increment
|
|
target:
|
|
entity_id: counter.postgresql_phase3_triggers
|
|
- delay: 04:00:00
|
|
- event: postgresql_schedule_trigger
|
|
event_data:
|
|
task_type: hourly_backup
|
|
schedule_time: '19:00:00'
|
|
backup_type: peak_hours
|
|
- service: counter.increment
|
|
target:
|
|
entity_id: counter.postgresql_phase3_triggers
|
|
- delay: 04:00:00
|
|
- event: postgresql_schedule_trigger
|
|
event_data:
|
|
task_type: hourly_backup
|
|
schedule_time: '23:00:00'
|
|
backup_type: peak_hours
|
|
- service: counter.increment
|
|
target:
|
|
entity_id: counter.postgresql_phase3_triggers
|
|
- id: memory_pressure_notification
|
|
alias: 'System Monitor: Memory Pressure Alert'
|
|
description: Notifies when system memory is under pressure
|
|
trigger:
|
|
- platform: state
|
|
entity_id: binary_sensor.memory_pressure_alert
|
|
to: 'on'
|
|
for: 00:02:00
|
|
condition:
|
|
- condition: template
|
|
value_template: '{{ states(''sensor.glances_ram_used_percent'') | float(0) > 75
|
|
}}
|
|
|
|
'
|
|
action:
|
|
- service: persistent_notification.create
|
|
data:
|
|
title: 🔴 Memory Pressure Detected
|
|
message: 'System memory usage is high: {{ states(''sensor.glances_ram_used_percent'')
|
|
| float(0) | round(1) }}%
|
|
|
|
Free memory: {{ (states(''sensor.glances_ram_free'') | float(0) / 1024 / 1024
|
|
/ 1024) | round(2) }}GB Swap usage: {{ states(''sensor.glances_swap_used_percent'')
|
|
| float(0) | round(1) }}%
|
|
|
|
Consider restarting Home Assistant or investigating memory-intensive processes.
|
|
|
|
'
|
|
notification_id: memory_pressure_alert
|
|
- id: memory_pressure_recovery
|
|
alias: 'System Monitor: Memory Pressure Recovered'
|
|
description: Notifies when memory pressure has been resolved
|
|
trigger:
|
|
- platform: state
|
|
entity_id: binary_sensor.memory_pressure_alert
|
|
to: 'off'
|
|
for: 00:01:00
|
|
condition:
|
|
- condition: template
|
|
value_template: '{{ states(''sensor.glances_ram_used_percent'') | float(0) < 70
|
|
}}
|
|
|
|
'
|
|
action:
|
|
- service: persistent_notification.dismiss
|
|
data:
|
|
notification_id: memory_pressure_alert
|
|
- service: persistent_notification.create
|
|
data:
|
|
title: ✅ Memory Pressure Resolved
|
|
message: 'System memory usage has returned to normal: {{ states(''sensor.glances_ram_used_percent'')
|
|
| float(0) | round(1) }}%
|
|
|
|
System Health Score: {{ states(''sensor.system_health_score'') | float(0)
|
|
| round(1) }}%
|
|
|
|
'
|
|
notification_id: memory_recovery
|
|
- id: daily_system_health_report
|
|
alias: 'System Monitor: Daily Health Report'
|
|
description: Daily system resource utilization report
|
|
trigger:
|
|
- platform: time
|
|
at: 06:00:00
|
|
action:
|
|
- service: logbook.log
|
|
data:
|
|
name: System Health
|
|
message: 'Daily Health Report: Memory: {{ states(''sensor.glances_ram_used_percent'')
|
|
| float(0) | round(1) }}% CPU Load: {{ states(''sensor.glances_cpu_load'')
|
|
| float(0) | round(1) }}% Disk: {{ states(''sensor.glances_disk_used_percent'')
|
|
| float(0) | round(1) }}% Health Score: {{ states(''sensor.system_health_score'')
|
|
| float(0) | round(1) }}% Status: {{ states(''sensor.memory_status'') }}
|
|
|
|
'
|
|
- id: '1742000000001'
|
|
alias: Update Map Entities Sensor
|
|
description: Forces the map entities sensor to refresh when presence changes
|
|
trigger:
|
|
- platform: state
|
|
entity_id: binary_sensor.hide_home_icon
|
|
action:
|
|
- delay:
|
|
seconds: 1
|
|
- service: homeassistant.update_entity
|
|
target:
|
|
entity_id: sensor.map_entities
|
|
- service: persistent_notification.create
|
|
data:
|
|
title: Map Entities Update
|
|
message: 'Map entities sensor refreshed: {{ states(''sensor.map_entities'')
|
|
}}'
|
|
notification_id: map_entities_update
|
|
- id: test_framework_orchestrator
|
|
alias: 'Test Framework: Main Orchestrator'
|
|
description: Coordinates execution of all domain test suites
|
|
trigger:
|
|
- platform: state
|
|
entity_id: input_boolean.system_testing_mode
|
|
to: 'on'
|
|
action:
|
|
- service: input_text.set_value
|
|
target:
|
|
entity_id: input_text.test_results_summary
|
|
data:
|
|
value: Test execution started at {{ now().strftime('%H:%M:%S') }}
|
|
- service: input_select.select_option
|
|
target:
|
|
entity_id: input_select.current_test_domain
|
|
data:
|
|
option: Appliance
|
|
- delay: 00:00:02
|
|
- service: input_boolean.turn_on
|
|
target:
|
|
entity_id: input_boolean.run_appliance_tests
|
|
- id: test_appliance_domain_comprehensive
|
|
alias: 'Test Framework: Appliance Domain Suite'
|
|
description: Comprehensive testing of appliance management functionality
|
|
trigger:
|
|
- platform: state
|
|
entity_id: input_boolean.run_appliance_tests
|
|
to: 'on'
|
|
condition:
|
|
- condition: state
|
|
entity_id: input_boolean.system_testing_mode
|
|
state: 'on'
|
|
action:
|
|
- service: logbook.log
|
|
data:
|
|
name: Test Framework
|
|
message: Starting appliance domain tests
|
|
entity_id: input_boolean.run_appliance_tests
|
|
- service: shell_command.validate_appliance_package
|
|
- delay: 00:00:05
|
|
- service: input_boolean.turn_on
|
|
target:
|
|
entity_id: input_boolean.appliance_test_simulation
|
|
- service: input_number.set_value
|
|
target:
|
|
entity_id: input_number.test_appliance_power_simulation
|
|
data:
|
|
value: 1200
|
|
- delay: 00:00:10
|
|
- service: input_number.set_value
|
|
target:
|
|
entity_id: input_number.test_appliance_power_simulation
|
|
data:
|
|
value: 5
|
|
- delay: 00:00:05
|
|
- service: input_boolean.turn_off
|
|
target:
|
|
entity_id: input_boolean.appliance_test_simulation
|
|
- service: logbook.log
|
|
data:
|
|
name: Test Framework
|
|
message: Appliance domain tests completed
|
|
entity_id: input_boolean.run_appliance_tests
|
|
- service: input_boolean.turn_off
|
|
target:
|
|
entity_id: input_boolean.run_appliance_tests
|
|
- service: input_select.select_option
|
|
target:
|
|
entity_id: input_select.current_test_domain
|
|
data:
|
|
option: Lighting
|
|
- delay: 00:00:02
|
|
- service: input_boolean.turn_on
|
|
target:
|
|
entity_id: input_boolean.run_lighting_tests
|
|
- id: test_lighting_domain_comprehensive
|
|
alias: 'Test Framework: Lighting Domain Suite'
|
|
description: Comprehensive testing of lighting control functionality
|
|
trigger:
|
|
- platform: state
|
|
entity_id: input_boolean.run_lighting_tests
|
|
to: 'on'
|
|
condition:
|
|
- condition: state
|
|
entity_id: input_boolean.system_testing_mode
|
|
state: 'on'
|
|
action:
|
|
- service: logbook.log
|
|
data:
|
|
name: Test Framework
|
|
message: Starting lighting domain tests
|
|
entity_id: input_boolean.run_lighting_tests
|
|
- service: shell_command.validate_lighting_package
|
|
- delay: 00:00:05
|
|
- service: logbook.log
|
|
data:
|
|
name: Test Framework
|
|
message: Testing LED RF command structure (simulation)
|
|
entity_id: input_boolean.run_lighting_tests
|
|
- delay: 00:00:10
|
|
- service: logbook.log
|
|
data:
|
|
name: Test Framework
|
|
message: Lighting domain tests completed
|
|
entity_id: input_boolean.run_lighting_tests
|
|
- service: input_boolean.turn_off
|
|
target:
|
|
entity_id: input_boolean.run_lighting_tests
|
|
- service: input_select.select_option
|
|
target:
|
|
entity_id: input_select.current_test_domain
|
|
data:
|
|
option: Environmental
|
|
- delay: 00:00:02
|
|
- service: input_boolean.turn_on
|
|
target:
|
|
entity_id: input_boolean.run_environmental_tests
|
|
- id: test_environmental_domain_comprehensive
|
|
alias: 'Test Framework: Environmental Domain Suite'
|
|
description: Comprehensive testing of environmental systems functionality
|
|
trigger:
|
|
- platform: state
|
|
entity_id: input_boolean.run_environmental_tests
|
|
to: 'on'
|
|
condition:
|
|
- condition: state
|
|
entity_id: input_boolean.system_testing_mode
|
|
state: 'on'
|
|
action:
|
|
- service: logbook.log
|
|
data:
|
|
name: Test Framework
|
|
message: Starting environmental domain tests
|
|
entity_id: input_boolean.run_environmental_tests
|
|
- service: shell_command.validate_environmental_package
|
|
- delay: 00:00:05
|
|
- service: logbook.log
|
|
data:
|
|
name: Test Framework
|
|
message: Validating hydroponics automation structure
|
|
entity_id: input_boolean.run_environmental_tests
|
|
- delay: 00:00:10
|
|
- service: logbook.log
|
|
data:
|
|
name: Test Framework
|
|
message: Environmental domain tests completed
|
|
entity_id: input_boolean.run_environmental_tests
|
|
- service: input_boolean.turn_off
|
|
target:
|
|
entity_id: input_boolean.run_environmental_tests
|
|
- service: input_select.select_option
|
|
target:
|
|
entity_id: input_select.current_test_domain
|
|
data:
|
|
option: None
|
|
- service: input_text.set_value
|
|
target:
|
|
entity_id: input_text.test_results_summary
|
|
data:
|
|
value: All tests completed at {{ now().strftime('%H:%M:%S') }}
|
|
- service: input_boolean.turn_off
|
|
target:
|
|
entity_id: input_boolean.system_testing_mode
|
|
- service: logbook.log
|
|
data:
|
|
name: Test Framework
|
|
message: Complete test suite execution finished
|
|
- id: test_performance_monitoring
|
|
alias: 'Test Framework: Performance Monitoring'
|
|
description: Monitors system performance during testing
|
|
trigger:
|
|
- platform: time_pattern
|
|
seconds: /30
|
|
condition:
|
|
- condition: state
|
|
entity_id: input_boolean.performance_testing_active
|
|
state: 'on'
|
|
action:
|
|
- service: shell_command.capture_performance_metrics
|
|
- id: test_timeout_safety
|
|
alias: 'Test Framework: Timeout Safety'
|
|
description: Prevents tests from running indefinitely
|
|
trigger:
|
|
- platform: state
|
|
entity_id: input_boolean.system_testing_mode
|
|
to: 'on'
|
|
for:
|
|
minutes: '{{ states(''input_number.test_timeout_minutes'') | int }}'
|
|
action:
|
|
- service: logbook.log
|
|
data:
|
|
name: Test Framework
|
|
message: Test timeout reached - forcing shutdown
|
|
- service: input_boolean.turn_off
|
|
target:
|
|
entity_id:
|
|
- input_boolean.run_appliance_tests
|
|
- input_boolean.run_lighting_tests
|
|
- input_boolean.run_environmental_tests
|
|
- input_boolean.system_testing_mode
|
|
- service: input_text.set_value
|
|
target:
|
|
entity_id: input_text.test_results_summary
|
|
data:
|
|
value: Tests TIMED OUT after {{ states('input_number.test_timeout_minutes')
|
|
}} minutes
|
|
- id: test_dimmer_lights
|
|
alias: Test Dimmer Lights
|
|
description: Test if the light entities are working
|
|
trigger:
|
|
- platform: time_pattern
|
|
minutes: /1
|
|
condition: []
|
|
action:
|
|
- action: logbook.log
|
|
data:
|
|
name: Test Dimmer Lights
|
|
message: Testing light entities...
|
|
entity_id: automation.test_dimmer_lights
|
|
- action: light.turn_on
|
|
target:
|
|
entity_id: light.livingroom_lights
|
|
data:
|
|
brightness_pct: 50
|
|
continue_on_error: true
|
|
- delay: 5
|
|
- action: light.turn_on
|
|
target:
|
|
entity_id:
|
|
- light.rgbcw_lightbulb1
|
|
- light.rgbcw_lightbulb2
|
|
data:
|
|
brightness_pct: 50
|
|
continue_on_error: true
|
|
- delay: 5
|
|
- action: light.turn_off
|
|
target:
|
|
entity_id:
|
|
- light.livingroom_lights
|
|
- light.rgbcw_lightbulb1
|
|
- light.rgbcw_lightbulb2
|
|
continue_on_error: true
|
|
- alias: Dishwasher - Cycle Start Detection
|
|
description: Detect dishwasher cycle start with proper state tracking to prevent
|
|
duplicate announcements
|
|
mode: single
|
|
trigger:
|
|
- platform: numeric_state
|
|
entity_id: sensor.dishwasher_electric_consumption_w
|
|
above: 50
|
|
for:
|
|
minutes: 2
|
|
condition:
|
|
- condition: and
|
|
conditions:
|
|
- condition: state
|
|
entity_id: input_boolean.dishwasher_cycle_announced
|
|
state: 'off'
|
|
- condition: or
|
|
conditions:
|
|
- condition: state
|
|
entity_id: input_boolean.appliance_quiet_hours_enabled
|
|
state: 'off'
|
|
- condition: time
|
|
after: 07:30:00
|
|
before: '22:30:00'
|
|
action:
|
|
- action: input_boolean.turn_on
|
|
entity_id: input_boolean.dishwasher_cycle_announced
|
|
- service: notify.alexa_media_everywhere
|
|
continue_on_error: true
|
|
data:
|
|
message: The dishwasher cycle has started.
|
|
data:
|
|
type: announce
|
|
- condition: template
|
|
value_template: '{{ states(''media_player.everywhere'') == ''unavailable'' }}'
|
|
- service: notify.mobile_app_pixel_9_pro_xl
|
|
data:
|
|
title: Dishwasher Started
|
|
message: Cycle started at {{ now().strftime('%I:%M %p') }}
|
|
- service: input_text.set_value
|
|
data:
|
|
entity_id: input_text.appliance_last_announcement
|
|
value: Dishwasher cycle started
|
|
- alias: Dishwasher Cycle Monitoring
|
|
description: Enhanced dishwasher cycle monitoring with completion detection and
|
|
Alexa announcements (respects quiet hours)
|
|
mode: restart
|
|
trigger:
|
|
- platform: numeric_state
|
|
entity_id: sensor.dishwasher_electric_consumption_w
|
|
below: 5
|
|
for:
|
|
minutes: 5
|
|
condition:
|
|
- condition: numeric_state
|
|
entity_id: sensor.dishwasher_electric_consumption_w
|
|
below: 5
|
|
action:
|
|
- condition: time
|
|
after: 07:30:00
|
|
before: '22:30:00'
|
|
- service: notify.alexa_media_everywhere
|
|
continue_on_error: true
|
|
data:
|
|
message: Dishwasher cycle is complete! Don't forget to open the door to let
|
|
dishes air dry.
|
|
data:
|
|
type: announce
|
|
- action: input_boolean.turn_off
|
|
entity_id: input_boolean.dishwasher_cycle_announced
|
|
- delay:
|
|
minutes: 30
|
|
- condition: template
|
|
value_template: '{{ states(''binary_sensor.dishwasher_door_window_door_is_open'')
|
|
not in [''unknown'', ''unavailable''] }}'
|
|
- condition: state
|
|
entity_id: binary_sensor.dishwasher_door_window_door_is_open
|
|
state: 'off'
|
|
- condition: time
|
|
after: 07:30:00
|
|
before: '22:30:00'
|
|
- service: notify.alexa_media_everywhere
|
|
continue_on_error: true
|
|
data:
|
|
message: 'Reminder: The dishwasher door is still closed. Opening it will help
|
|
dishes dry faster.'
|
|
data:
|
|
type: announce
|
|
- alias: Dishwasher - Cycle Completion Announcement
|
|
description: Announce when dishwasher cycle is complete
|
|
trigger:
|
|
- platform: state
|
|
entity_id: input_boolean.dishwasher_cycle_announced
|
|
from: 'on'
|
|
to: 'off'
|
|
condition:
|
|
- condition: time
|
|
after: 07:00:00
|
|
before: '22:30:00'
|
|
action:
|
|
- service: notify.alexa_media_everywhere
|
|
data:
|
|
message: The dishwasher cycle is complete and ready to be unloaded.
|
|
data:
|
|
type: announce
|
|
- service: input_text.set_value
|
|
target:
|
|
entity_id: input_text.appliance_last_announcement
|
|
data:
|
|
value: Dishwasher complete - {{ now().strftime('%H:%M') }}
|
|
- alias: Dishwasher - Door Left Open Alert
|
|
description: Alerts if dishwasher door is left open too long (respects quiet hours)
|
|
trigger:
|
|
- platform: state
|
|
entity_id: binary_sensor.dishwasher_door_window_door_is_open
|
|
to: 'on'
|
|
for:
|
|
hours: 4
|
|
condition:
|
|
- condition: template
|
|
value_template: '{{ states(''binary_sensor.dishwasher_door_window_door_is_open'')
|
|
not in [''unknown'', ''unavailable''] }}'
|
|
- condition: time
|
|
after: 07:30:00
|
|
before: '22:30:00'
|
|
action:
|
|
- service: notify.alexa_media_everywhere
|
|
continue_on_error: true
|
|
data:
|
|
message: The dishwasher door has been open for 4 hours. You may want to close
|
|
it now.
|
|
data:
|
|
type: announce
|
|
- alias: Washing Machine - Cycle Start Detection
|
|
description: Detects when washing machine starts and announces via Alexa (respects
|
|
quiet hours)
|
|
trigger:
|
|
- platform: numeric_state
|
|
entity_id: sensor.washing_machine_electric_consumption_w
|
|
above: 100
|
|
for:
|
|
minutes: 2
|
|
condition:
|
|
- condition: time
|
|
after: 07:30:00
|
|
before: '22:30:00'
|
|
action:
|
|
- service: notify.alexa_media_everywhere
|
|
continue_on_error: true
|
|
data:
|
|
message: Washing machine cycle has started. I'll let you know when it's finished.
|
|
data:
|
|
type: announce
|
|
- service: logbook.log
|
|
data:
|
|
name: Washing Machine Monitoring
|
|
message: 'Washing machine cycle started - power consumption: {{ states(''sensor.washing_machine_electric_consumption_w'')
|
|
}}W'
|
|
- alias: Washing Machine Cycle Monitoring
|
|
description: Enhanced washing machine cycle monitoring with completion detection
|
|
and progressive reminders (respects quiet hours)
|
|
mode: restart
|
|
trigger:
|
|
- platform: numeric_state
|
|
entity_id: sensor.washing_machine_electric_consumption_w
|
|
below: 5
|
|
for:
|
|
minutes: 3
|
|
condition:
|
|
- condition: numeric_state
|
|
entity_id: sensor.washing_machine_electric_consumption_w
|
|
below: 5
|
|
action:
|
|
- condition: time
|
|
after: 07:30:00
|
|
before: '22:30:00'
|
|
- service: notify.alexa_media_everywhere
|
|
continue_on_error: true
|
|
data:
|
|
message: Washing machine cycle is complete! Time to move your clothes to the
|
|
dryer.
|
|
data:
|
|
type: announce
|
|
- delay:
|
|
minutes: 15
|
|
- condition: time
|
|
after: 07:30:00
|
|
before: '22:30:00'
|
|
- service: notify.alexa_media_everywhere
|
|
continue_on_error: true
|
|
data:
|
|
message: 'Reminder: Your laundry is still waiting in the washing machine.'
|
|
data:
|
|
type: announce
|
|
- delay:
|
|
minutes: 30
|
|
- condition: time
|
|
after: 07:30:00
|
|
before: '22:30:00'
|
|
- service: notify.alexa_media_everywhere
|
|
continue_on_error: true
|
|
data:
|
|
message: 'Final reminder: Please don''t forget about your laundry in the washing
|
|
machine.'
|
|
data:
|
|
type: announce
|
|
- alias: Washing Machine - Cycle Completion Announcement
|
|
description: Announce when washing machine cycle is complete
|
|
trigger:
|
|
- platform: state
|
|
entity_id: input_boolean.washing_machine_cycle_announced
|
|
from: 'on'
|
|
to: 'off'
|
|
condition:
|
|
- condition: time
|
|
after: 07:00:00
|
|
before: '22:30:00'
|
|
action:
|
|
- service: notify.alexa_media_everywhere
|
|
data:
|
|
message: The washing machine cycle is complete. Please move clothes to the dryer.
|
|
data:
|
|
type: announce
|
|
- service: input_text.set_value
|
|
target:
|
|
entity_id: input_text.appliance_last_announcement
|
|
data:
|
|
value: Washer complete - {{ now().strftime('%H:%M') }}
|
|
- alias: Dryer - Cycle Start Detection
|
|
description: Detects when dryer starts using SmartThings integration (respects quiet
|
|
hours)
|
|
trigger:
|
|
- platform: state
|
|
entity_id: sensor.dryer_machine_state
|
|
to: run
|
|
- platform: state
|
|
entity_id: sensor.dryer_job_state
|
|
to: drying
|
|
condition:
|
|
- condition: template
|
|
value_template: '{{ states(''sensor.dryer_machine_state'') not in [''unknown'',
|
|
''unavailable''] }}'
|
|
- condition: state
|
|
entity_id: sensor.dryer_machine_state
|
|
state: run
|
|
- condition: time
|
|
after: 07:30:00
|
|
before: '22:30:00'
|
|
action:
|
|
- service: notify.alexa_media_everywhere
|
|
continue_on_error: true
|
|
data:
|
|
message: "Dryer cycle has started. {% set completion_time = states('sensor.dryer_completion_time')\
|
|
\ %} {% if completion_time not in ['unknown', 'unavailable'] and completion_time\
|
|
\ != None %}\n Expected completion time is {{ as_timestamp(completion_time)\
|
|
\ | timestamp_custom('%I:%M %p', true) }}.\n{% else %}\n I'll let you know\
|
|
\ when it's finished.\n{% endif %}\n"
|
|
data:
|
|
type: announce
|
|
- service: logbook.log
|
|
data:
|
|
name: Dryer Monitoring
|
|
message: 'Dryer cycle started - Job state: {{ states(''sensor.dryer_job_state'')
|
|
}}'
|
|
- alias: Dryer - Cycle Completion Announcement
|
|
description: Announce when dryer cycle is complete
|
|
trigger:
|
|
- platform: state
|
|
entity_id: input_boolean.dryer_cycle_announced
|
|
from: 'on'
|
|
to: 'off'
|
|
condition:
|
|
- condition: time
|
|
after: 07:00:00
|
|
before: '22:30:00'
|
|
action:
|
|
- service: notify.alexa_media_everywhere
|
|
data:
|
|
message: The dryer cycle is complete. Please remove clothes to prevent wrinkles.
|
|
data:
|
|
type: announce
|
|
- service: input_text.set_value
|
|
target:
|
|
entity_id: input_text.appliance_last_announcement
|
|
data:
|
|
value: Dryer complete - {{ now().strftime('%H:%M') }}
|
|
- alias: Appliance - Error Monitoring
|
|
description: Monitor for appliance errors and announce
|
|
trigger:
|
|
- platform: state
|
|
entity_id:
|
|
- sensor.dishwasher_door_status
|
|
- sensor.washing_machine_status
|
|
- sensor.dryer_status
|
|
to: error
|
|
action:
|
|
- service: notify.alexa_media_everywhere
|
|
data:
|
|
message: 'Attention: {{ trigger.to_state.attributes.friendly_name }} is reporting
|
|
an error. Please check the appliance.'
|
|
data:
|
|
type: announce
|
|
- service: persistent_notification.create
|
|
data:
|
|
title: 🚨 Appliance Error
|
|
message: '{{ trigger.to_state.attributes.friendly_name }} error at {{ now().strftime(''%H:%M'')
|
|
}}'
|
|
notification_id: appliance_error_{{ trigger.entity_id.split('.')[1] }}
|
|
- alias: Appliance - Monthly Maintenance Reminder
|
|
description: Monthly maintenance reminders for appliances
|
|
trigger:
|
|
- platform: time
|
|
at: 09:00:00
|
|
condition:
|
|
- condition: template
|
|
value_template: '{{ now().day == 1 }}'
|
|
action:
|
|
- service: notify.alexa_media_everywhere
|
|
data:
|
|
message: 'Monthly appliance maintenance reminder: Please clean the dishwasher
|
|
filter, check washing machine hoses, and clean the dryer lint trap.'
|
|
data:
|
|
type: announce
|
|
- service: persistent_notification.create
|
|
data:
|
|
title: 🔧 Monthly Appliance Maintenance
|
|
message: 'Time for monthly appliance maintenance:
|
|
|
|
- Clean dishwasher filter
|
|
|
|
- Check washing machine hoses
|
|
|
|
- Clean dryer lint trap
|
|
|
|
- Wipe down appliance exteriors
|
|
|
|
'
|
|
notification_id: monthly_maintenance
|
|
- alias: Appliance - Off-Peak Energy Reminder
|
|
description: Remind to run appliances during off-peak hours
|
|
trigger:
|
|
- platform: time
|
|
at: '21:00:00'
|
|
condition:
|
|
- condition: time
|
|
weekday:
|
|
- mon
|
|
- tue
|
|
- wed
|
|
- thu
|
|
- fri
|
|
action:
|
|
- service: notify.alexa_media_everywhere
|
|
data:
|
|
message: 'Reminder: Off-peak energy hours start at 10 PM. Consider running the
|
|
dishwasher or washing machine after 10 PM to save on energy costs.'
|
|
data:
|
|
type: announce
|
|
- alias: Appliance - Maintenance Tracking
|
|
description: Track when maintenance tasks are completed
|
|
trigger:
|
|
- platform: state
|
|
entity_id:
|
|
- input_datetime.dishwasher_last_filter_clean
|
|
- input_datetime.washing_machine_last_hose_check
|
|
to: null
|
|
action:
|
|
- service: notify.alexa_media_everywhere
|
|
data:
|
|
message: Thank you for completing the {{ trigger.to_state.attributes.friendly_name.replace('Last
|
|
', '').lower() }}. Maintenance has been logged.
|
|
data:
|
|
type: announce
|
|
- service: input_text.set_value
|
|
target:
|
|
entity_id: input_text.appliance_last_announcement
|
|
data:
|
|
value: Maintenance logged - {{ now().strftime('%H:%M') }}
|
|
- alias: Dishwasher - Cycle Start Detection Enhanced
|
|
description: Enhanced dishwasher cycle start detection with hysteresis to prevent
|
|
false triggers
|
|
mode: single
|
|
trigger:
|
|
- platform: numeric_state
|
|
entity_id: sensor.dishwasher_electric_consumption_w
|
|
above: 50
|
|
for:
|
|
minutes: 3
|
|
condition:
|
|
- condition: and
|
|
conditions:
|
|
- condition: state
|
|
entity_id: input_boolean.dishwasher_cycle_announced
|
|
state: 'off'
|
|
- condition: numeric_state
|
|
entity_id: sensor.dishwasher_electric_consumption_w
|
|
above: 30
|
|
- condition: or
|
|
conditions:
|
|
- condition: state
|
|
entity_id: input_boolean.appliance_quiet_hours_enabled
|
|
state: 'off'
|
|
- condition: time
|
|
after: 07:30:00
|
|
before: '22:30:00'
|
|
action:
|
|
- action: input_boolean.turn_on
|
|
entity_id: input_boolean.dishwasher_cycle_announced
|
|
- service: input_datetime.set_datetime
|
|
target:
|
|
entity_id: input_datetime.dishwasher_cycle_start
|
|
data:
|
|
timestamp: '{{ now().timestamp() }}'
|
|
- service: notify.alexa_media_everywhere
|
|
continue_on_error: true
|
|
data:
|
|
message: The dishwasher cycle has started. Current power consumption is {{ states('sensor.dishwasher_electric_consumption_w')
|
|
| round(0) }} watts.
|
|
data:
|
|
type: announce
|
|
- condition: template
|
|
value_template: '{{ states(''media_player.everywhere'') == ''unavailable'' }}'
|
|
- service: notify.mobile_app_pixel_9_pro_xl
|
|
data:
|
|
title: Dishwasher Started
|
|
message: Cycle started at {{ now().strftime('%I:%M %p') }} - {{ states('sensor.dishwasher_electric_consumption_w')
|
|
| round(0) }}W
|
|
- service: input_text.set_value
|
|
data:
|
|
entity_id: input_text.appliance_last_announcement
|
|
value: Dishwasher cycle started - {{ states('sensor.dishwasher_electric_consumption_w')
|
|
| round(0) }}W
|
|
- alias: Dishwasher - Cycle Running Monitor
|
|
description: Monitor dishwasher during cycle to handle power fluctuations
|
|
mode: restart
|
|
trigger:
|
|
- platform: numeric_state
|
|
entity_id: sensor.dishwasher_electric_consumption_w
|
|
below: 15
|
|
for:
|
|
minutes: 2
|
|
condition:
|
|
- condition: state
|
|
entity_id: input_boolean.dishwasher_cycle_announced
|
|
state: 'on'
|
|
- condition: template
|
|
value_template: "{% set start_time = states('input_datetime.dishwasher_cycle_start')\
|
|
\ %} {% if start_time not in ['unknown', 'unavailable'] %}\n {% set elapsed\
|
|
\ = (now().timestamp() - as_timestamp(start_time)) / 60 %}\n {{ elapsed > 10\
|
|
\ }} {# Only trigger if cycle has been running for at least 10 minutes #}\n\
|
|
{% else %}\n false\n{% endif %}\n"
|
|
action:
|
|
- delay:
|
|
minutes: 8
|
|
- condition: numeric_state
|
|
entity_id: sensor.dishwasher_electric_consumption_w
|
|
below: 10
|
|
- condition: time
|
|
after: 07:30:00
|
|
before: '22:30:00'
|
|
- variables:
|
|
cycle_duration: "{% set start_time = states('input_datetime.dishwasher_cycle_start')\
|
|
\ %} {% if start_time not in ['unknown', 'unavailable'] %}\n {% set elapsed_minutes\
|
|
\ = ((now().timestamp() - as_timestamp(start_time)) / 60) | round(0) %}\n\
|
|
\ {{ elapsed_minutes }}\n{% else %}\n 0\n{% endif %}\n"
|
|
- service: notify.alexa_media_everywhere
|
|
continue_on_error: true
|
|
data:
|
|
message: 'Dishwasher cycle is complete after {{ cycle_duration }} minutes! Don''t
|
|
forget to open the door to let dishes air dry.
|
|
|
|
'
|
|
data:
|
|
type: announce
|
|
- action: input_boolean.turn_off
|
|
entity_id: input_boolean.dishwasher_cycle_announced
|
|
- delay:
|
|
minutes: 30
|
|
- condition: template
|
|
value_template: '{{ states(''binary_sensor.dishwasher_door_window_door_is_open'')
|
|
not in [''unknown'', ''unavailable''] }}'
|
|
- condition: state
|
|
entity_id: binary_sensor.dishwasher_door_window_door_is_open
|
|
state: 'off'
|
|
- condition: time
|
|
after: 07:30:00
|
|
before: '22:30:00'
|
|
- service: notify.alexa_media_everywhere
|
|
continue_on_error: true
|
|
data:
|
|
message: 'Reminder: The dishwasher door is still closed. Opening it will help
|
|
dishes dry faster.'
|
|
data:
|
|
type: announce
|
|
- alias: Washing Machine - Cycle Start Detection Enhanced
|
|
description: Enhanced washing machine cycle start detection with power confirmation
|
|
mode: single
|
|
trigger:
|
|
- platform: numeric_state
|
|
entity_id: sensor.washing_machine_electric_consumption_w
|
|
above: 100
|
|
for:
|
|
minutes: 3
|
|
condition:
|
|
- condition: and
|
|
conditions:
|
|
- condition: state
|
|
entity_id: input_boolean.washing_machine_cycle_announced
|
|
state: 'off'
|
|
- condition: numeric_state
|
|
entity_id: sensor.washing_machine_electric_consumption_w
|
|
above: 50
|
|
- condition: time
|
|
after: 07:30:00
|
|
before: '22:30:00'
|
|
action:
|
|
- action: input_boolean.turn_on
|
|
entity_id: input_boolean.washing_machine_cycle_announced
|
|
- service: input_datetime.set_datetime
|
|
target:
|
|
entity_id: input_datetime.washing_machine_cycle_start
|
|
data:
|
|
timestamp: '{{ now().timestamp() }}'
|
|
- service: notify.alexa_media_everywhere
|
|
continue_on_error: true
|
|
data:
|
|
message: Washing machine cycle has started at {{ states('sensor.washing_machine_electric_consumption_w')
|
|
| round(0) }} watts. I'll let you know when it's finished.
|
|
data:
|
|
type: announce
|
|
- service: logbook.log
|
|
data:
|
|
name: Washing Machine Monitoring
|
|
message: 'Washing machine cycle started - power consumption: {{ states(''sensor.washing_machine_electric_consumption_w'')
|
|
}}W'
|
|
- alias: Washing Machine - Cycle Completion Enhanced
|
|
description: Enhanced washing machine completion detection with progressive reminders
|
|
mode: restart
|
|
trigger:
|
|
- platform: numeric_state
|
|
entity_id: sensor.washing_machine_electric_consumption_w
|
|
below: 10
|
|
for:
|
|
minutes: 5
|
|
condition:
|
|
- condition: state
|
|
entity_id: input_boolean.washing_machine_cycle_announced
|
|
state: 'on'
|
|
- condition: template
|
|
value_template: "{% set start_time = states('input_datetime.washing_machine_cycle_start')\
|
|
\ %} {% if start_time not in ['unknown', 'unavailable'] %}\n {% set elapsed\
|
|
\ = (now().timestamp() - as_timestamp(start_time)) / 60 %}\n {{ elapsed > 15\
|
|
\ }} {# Minimum 15 minutes for a valid cycle #}\n{% else %}\n false\n{% endif\
|
|
\ %}\n"
|
|
action:
|
|
- delay:
|
|
minutes: 10
|
|
- condition: numeric_state
|
|
entity_id: sensor.washing_machine_electric_consumption_w
|
|
below: 15
|
|
- condition: time
|
|
after: 07:30:00
|
|
before: '22:30:00'
|
|
- variables:
|
|
cycle_duration: "{% set start_time = states('input_datetime.washing_machine_cycle_start')\
|
|
\ %} {% if start_time not in ['unknown', 'unavailable'] %}\n {% set elapsed_minutes\
|
|
\ = ((now().timestamp() - as_timestamp(start_time)) / 60) | round(0) %}\n\
|
|
\ {{ elapsed_minutes }}\n{% else %}\n 0\n{% endif %}\n"
|
|
- service: notify.alexa_media_everywhere
|
|
continue_on_error: true
|
|
data:
|
|
message: 'Washing machine cycle is complete after {{ cycle_duration }} minutes!
|
|
Time to move your clothes to the dryer.
|
|
|
|
'
|
|
data:
|
|
type: announce
|
|
- action: input_boolean.turn_off
|
|
entity_id: input_boolean.washing_machine_cycle_announced
|
|
- delay:
|
|
minutes: 20
|
|
- condition: time
|
|
after: 07:30:00
|
|
before: '22:30:00'
|
|
- service: notify.alexa_media_everywhere
|
|
continue_on_error: true
|
|
data:
|
|
message: 'Reminder: Your laundry is still waiting in the washing machine.'
|
|
data:
|
|
type: announce
|
|
- delay:
|
|
minutes: 40
|
|
- condition: time
|
|
after: 07:30:00
|
|
before: '22:30:00'
|
|
- service: notify.alexa_media_everywhere
|
|
continue_on_error: true
|
|
data:
|
|
message: 'Final reminder: Please don''t forget about your laundry in the washing
|
|
machine.'
|
|
data:
|
|
type: announce
|
|
- alias: Dryer - Cycle Start Detection Enhanced
|
|
description: Enhanced dryer start detection using SmartThings with confirmation
|
|
mode: single
|
|
trigger:
|
|
- platform: state
|
|
entity_id: sensor.dryer_machine_state
|
|
to: run
|
|
- platform: state
|
|
entity_id: sensor.dryer_job_state
|
|
to: drying
|
|
condition:
|
|
- condition: and
|
|
conditions:
|
|
- condition: template
|
|
value_template: '{{ states(''sensor.dryer_machine_state'') not in [''unknown'',
|
|
''unavailable''] }}'
|
|
- condition: state
|
|
entity_id: sensor.dryer_machine_state
|
|
state: run
|
|
- condition: state
|
|
entity_id: input_boolean.dryer_cycle_announced
|
|
state: 'off'
|
|
- condition: time
|
|
after: 07:30:00
|
|
before: '22:30:00'
|
|
action:
|
|
- action: input_boolean.turn_on
|
|
entity_id: input_boolean.dryer_cycle_announced
|
|
- service: input_datetime.set_datetime
|
|
target:
|
|
entity_id: input_datetime.dryer_cycle_start
|
|
data:
|
|
timestamp: '{{ now().timestamp() }}'
|
|
- service: notify.alexa_media_everywhere
|
|
continue_on_error: true
|
|
data:
|
|
message: "Dryer cycle has started. {% set completion_time = states('sensor.dryer_completion_time')\
|
|
\ %} {% if completion_time not in ['unknown', 'unavailable'] and completion_time\
|
|
\ != None %}\n Expected completion time is {{ as_timestamp(completion_time)\
|
|
\ | timestamp_custom('%I:%M %p', true) }}.\n{% else %}\n I'll monitor the\
|
|
\ cycle and let you know when it's finished.\n{% endif %}\n"
|
|
data:
|
|
type: announce
|
|
- service: logbook.log
|
|
data:
|
|
name: Dryer Monitoring
|
|
message: 'Dryer cycle started - Job state: {{ states(''sensor.dryer_job_state'')
|
|
}}'
|
|
- alias: Dryer - Cycle Completion Enhanced
|
|
description: Enhanced dryer completion detection using SmartThings states
|
|
mode: single
|
|
trigger:
|
|
- platform: state
|
|
entity_id: sensor.dryer_machine_state
|
|
from: run
|
|
to: stop
|
|
- platform: state
|
|
entity_id: sensor.dryer_job_state
|
|
from: drying
|
|
to: none
|
|
condition:
|
|
- condition: and
|
|
conditions:
|
|
- condition: state
|
|
entity_id: input_boolean.dryer_cycle_announced
|
|
state: 'on'
|
|
- condition: template
|
|
value_template: '{{ states(''sensor.dryer_machine_state'') in [''stop'', ''pause'']
|
|
}}'
|
|
- condition: time
|
|
after: 07:00:00
|
|
before: '22:30:00'
|
|
action:
|
|
- delay:
|
|
minutes: 2
|
|
- condition: template
|
|
value_template: '{{ states(''sensor.dryer_machine_state'') in [''stop'', ''pause'']
|
|
}}'
|
|
- variables:
|
|
cycle_duration: "{% set start_time = states('input_datetime.dryer_cycle_start')\
|
|
\ %} {% if start_time not in ['unknown', 'unavailable'] %}\n {% set elapsed_minutes\
|
|
\ = ((now().timestamp() - as_timestamp(start_time)) / 60) | round(0) %}\n\
|
|
\ {{ elapsed_minutes }}\n{% else %}\n 0\n{% endif %}\n"
|
|
- service: notify.alexa_media_everywhere
|
|
data:
|
|
message: 'The dryer cycle is complete after {{ cycle_duration }} minutes. Please
|
|
remove clothes promptly to prevent wrinkles.
|
|
|
|
'
|
|
data:
|
|
type: announce
|
|
- action: input_boolean.turn_off
|
|
entity_id: input_boolean.dryer_cycle_announced
|
|
- service: input_text.set_value
|
|
target:
|
|
entity_id: input_text.appliance_last_announcement
|
|
data:
|
|
value: Dryer complete - {{ cycle_duration }}min - {{ now().strftime('%H:%M')
|
|
}}
|
|
- alias: Appliance - Power Anomaly Detection
|
|
description: Detect unusual power consumption patterns that might indicate issues
|
|
mode: parallel
|
|
trigger:
|
|
- platform: numeric_state
|
|
entity_id: sensor.dishwasher_electric_consumption_w
|
|
above: 2000
|
|
- platform: numeric_state
|
|
entity_id: sensor.washing_machine_electric_consumption_w
|
|
above: 2500
|
|
action:
|
|
- service: notify.alexa_media_everywhere
|
|
data:
|
|
message: 'Attention: {{ trigger.to_state.attributes.friendly_name if trigger.to_state
|
|
else ''Unknown device'' }} is consuming {{ trigger.to_state.state if trigger.to_state
|
|
else ''0'' }} watts, which is unusually high. Please check the appliance.
|
|
|
|
'
|
|
data:
|
|
type: announce
|
|
- service: persistent_notification.create
|
|
data:
|
|
title: ⚠️ High Power Consumption Alert
|
|
message: '{{ trigger.to_state.attributes.friendly_name if trigger.to_state else
|
|
''Unknown device'' }} consuming {{ trigger.to_state.state if trigger.to_state
|
|
else ''0'' }}W at {{ now().strftime(''%H:%M'') }}
|
|
|
|
'
|
|
notification_id: power_anomaly_{{ trigger.entity_id.split('.')[1] }}
|
|
- alias: Appliance - Stuck Cycle Detection
|
|
description: Detect cycles that run too long (possible malfunction)
|
|
trigger:
|
|
- platform: state
|
|
entity_id: input_boolean.dishwasher_cycle_announced
|
|
to: 'on'
|
|
for:
|
|
hours: 4
|
|
- platform: state
|
|
entity_id: input_boolean.washing_machine_cycle_announced
|
|
to: 'on'
|
|
for:
|
|
hours: 3
|
|
action:
|
|
- service: notify.alexa_media_everywhere
|
|
data:
|
|
message: 'Attention: The {{ trigger.entity_id.split(''.'')[1].replace(''_cycle_announced'',
|
|
'''').replace(''_'', '' '') }} has been running for an unusually long time.
|
|
Please check if everything is okay.
|
|
|
|
'
|
|
data:
|
|
type: announce
|
|
- service: persistent_notification.create
|
|
data:
|
|
title: 🕐 Long Cycle Alert
|
|
message: '{{ trigger.entity_id.split(''.'')[1].replace(''_cycle_announced'',
|
|
'''').replace(''_'', '' '').title() }} running for {{ (trigger.for.total_seconds()
|
|
/ 3600) | round(1) }} hours
|
|
|
|
'
|
|
notification_id: long_cycle_{{ trigger.entity_id.split('.')[1] }}
|
|
- alias: Appliance - Smart Energy Optimization
|
|
description: Suggest optimal times to run appliances based on usage patterns
|
|
trigger:
|
|
- platform: time
|
|
at: '20:30:00'
|
|
condition:
|
|
- condition: time
|
|
weekday:
|
|
- mon
|
|
- tue
|
|
- wed
|
|
- thu
|
|
- fri
|
|
- condition: template
|
|
value_template: "{{ states('input_boolean.dishwasher_cycle_announced') == 'off'\
|
|
\ and\n states('input_boolean.washing_machine_cycle_announced') == 'off' }}\n"
|
|
action:
|
|
- service: notify.alexa_media_everywhere
|
|
data:
|
|
message: "Energy optimization tip: Off-peak hours start at 10 PM. {% if states('sensor.dishwasher_electric_consumption_w')\
|
|
\ | float > 2 %}\n The dishwasher appears to be in standby and ready to run.\n\
|
|
{% endif %} {% if states('sensor.washing_machine_electric_consumption_w')\
|
|
\ | float > 2 %}\n The washing machine appears to be in standby and ready\
|
|
\ to run.\n{% endif %} Running appliances after 10 PM can save on energy costs.\n"
|
|
data:
|
|
type: announce
|
|
- alias: Appliance - Error Monitoring
|
|
description: Monitor for appliance errors and announce
|
|
trigger:
|
|
- platform: state
|
|
entity_id:
|
|
- sensor.dishwasher_door_status
|
|
- sensor.washing_machine_status
|
|
- sensor.dryer_status
|
|
to: error
|
|
action:
|
|
- service: notify.alexa_media_everywhere
|
|
data:
|
|
message: 'Attention: {{ trigger.to_state.attributes.friendly_name }} is reporting
|
|
an error. Please check the appliance.'
|
|
data:
|
|
type: announce
|
|
- service: persistent_notification.create
|
|
data:
|
|
title: 🚨 Appliance Error
|
|
message: '{{ trigger.to_state.attributes.friendly_name }} error at {{ now().strftime(''%H:%M'')
|
|
}}'
|
|
notification_id: appliance_error_{{ trigger.entity_id.split('.')[1] }}
|
|
- alias: Appliance - Monthly Maintenance Reminder
|
|
description: Monthly maintenance reminders for appliances
|
|
trigger:
|
|
- platform: time
|
|
at: 09:00:00
|
|
condition:
|
|
- condition: template
|
|
value_template: '{{ now().day == 1 }}'
|
|
action:
|
|
- service: notify.alexa_media_everywhere
|
|
data:
|
|
message: 'Monthly appliance maintenance reminder: Please clean the dishwasher
|
|
filter, check washing machine hoses, and clean the dryer lint trap.'
|
|
data:
|
|
type: announce
|
|
- service: persistent_notification.create
|
|
data:
|
|
title: 🔧 Monthly Appliance Maintenance
|
|
message: 'Time for monthly appliance maintenance:
|
|
|
|
- Clean dishwasher filter
|
|
|
|
- Check washing machine hoses
|
|
|
|
- Clean dryer lint trap
|
|
|
|
- Wipe down appliance exteriors
|
|
|
|
'
|
|
notification_id: monthly_maintenance
|
|
- alias: Appliance - Maintenance Tracking
|
|
description: Track when maintenance tasks are completed
|
|
trigger:
|
|
- platform: state
|
|
entity_id:
|
|
- input_datetime.dishwasher_last_filter_clean
|
|
- input_datetime.washing_machine_last_hose_check
|
|
to: null
|
|
action:
|
|
- service: notify.alexa_media_everywhere
|
|
data:
|
|
message: Thank you for completing the {{ trigger.to_state.attributes.friendly_name.replace('Last
|
|
', '').lower() }}. Maintenance has been logged.
|
|
data:
|
|
type: announce
|
|
- service: input_text.set_value
|
|
target:
|
|
entity_id: input_text.appliance_last_announcement
|
|
data:
|
|
value: Maintenance logged - {{ now().strftime('%H:%M') }}
|
|
- id: washing_machine_started_detection_v2
|
|
alias: Washing Machine - Detect Cycle Start
|
|
description: Detect when washing_machine starts a cycle
|
|
trigger:
|
|
- platform: state
|
|
entity_id: sensor.washing_machine_status
|
|
to: Running
|
|
from:
|
|
- Idle
|
|
- Standby
|
|
condition:
|
|
- condition: state
|
|
entity_id: input_boolean.washing_machine_running
|
|
state: 'off'
|
|
action:
|
|
- service: input_boolean.turn_on
|
|
entity_id: input_boolean.washing_machine_running
|
|
- service: input_datetime.set_datetime
|
|
entity_id: input_datetime.washing_machine_last_started
|
|
data:
|
|
datetime: '{{ now() }}'
|
|
- service: input_text.set_value
|
|
entity_id: input_text.washing_machine_state_reason
|
|
data:
|
|
value: Cycle started at {{ now().strftime('%H:%M') }}
|
|
- service: input_boolean.turn_off
|
|
entity_id: input_boolean.washing_machine_reminders_stopped
|
|
- id: washing_machine_finished_detection_v2
|
|
alias: Washing Machine - Detect Cycle Complete
|
|
description: Detect when washing_machine finishes a cycle
|
|
trigger:
|
|
- platform: state
|
|
entity_id: sensor.washing_machine_status
|
|
to: Idle
|
|
for:
|
|
minutes: 2
|
|
condition:
|
|
- condition: state
|
|
entity_id: input_boolean.washing_machine_running
|
|
state: 'on'
|
|
action:
|
|
- service: input_boolean.turn_off
|
|
entity_id: input_boolean.washing_machine_running
|
|
- service: input_datetime.set_datetime
|
|
entity_id: input_datetime.washing_machine_last_finished
|
|
data:
|
|
datetime: '{{ now() }}'
|
|
- service: input_text.set_value
|
|
entity_id: input_text.washing_machine_state_reason
|
|
data:
|
|
value: Cycle completed at {{ now().strftime('%H:%M') }}
|
|
- service: script.washing_machine_notify_complete
|
|
- id: washing_machine_reminder_automation_v2
|
|
alias: Washing Machine - Completion Reminders
|
|
description: Send periodic reminders when cycle is complete
|
|
trigger:
|
|
- platform: state
|
|
entity_id: binary_sensor.washing_machine_cycle_complete
|
|
to: 'on'
|
|
for:
|
|
minutes: 5
|
|
- platform: state
|
|
entity_id: binary_sensor.washing_machine_cycle_complete
|
|
to: 'on'
|
|
for:
|
|
minutes: 15
|
|
- platform: state
|
|
entity_id: binary_sensor.washing_machine_cycle_complete
|
|
to: 'on'
|
|
for:
|
|
minutes: 30
|
|
condition:
|
|
- condition: state
|
|
entity_id: input_boolean.washing_machine_reminders_stopped
|
|
state: 'off'
|
|
- condition: state
|
|
entity_id: binary_sensor.washing_machine_cycle_complete
|
|
state: 'on'
|
|
action:
|
|
- service: script.washing_machine_send_reminder
|
|
- id: washing_machine_sync_state_machine_v2
|
|
alias: Washing Machine - Sync State Machine with Power Monitoring
|
|
description: Keep input_select states synchronized with power monitoring sensor
|
|
trigger:
|
|
- platform: state
|
|
entity_id: sensor.washing_machine_status
|
|
- platform: state
|
|
entity_id: input_boolean.washing_machine_running
|
|
action:
|
|
- choose:
|
|
- conditions:
|
|
- condition: state
|
|
entity_id: sensor.washing_machine_status
|
|
state: Running
|
|
sequence:
|
|
- service: input_select.select_option
|
|
target:
|
|
entity_id: input_select.washing_machine_state
|
|
data:
|
|
option: Running
|
|
- service: input_select.select_option
|
|
target:
|
|
entity_id: input_select.washing_machine_state_detailed
|
|
data:
|
|
option: Washing
|
|
- conditions:
|
|
- condition: state
|
|
entity_id: sensor.washing_machine_status
|
|
state: Idle
|
|
- condition: state
|
|
entity_id: input_boolean.washing_machine_running
|
|
state: 'off'
|
|
- condition: template
|
|
value_template: '{{ trigger.from_state.state in [''Running'', ''Standby'']
|
|
}}'
|
|
sequence:
|
|
- service: input_select.select_option
|
|
target:
|
|
entity_id: input_select.washing_machine_state
|
|
data:
|
|
option: Complete
|
|
- service: input_select.select_option
|
|
target:
|
|
entity_id: input_select.washing_machine_state_detailed
|
|
data:
|
|
option: Complete
|
|
- conditions:
|
|
- condition: state
|
|
entity_id: sensor.washing_machine_status
|
|
state: Idle
|
|
- condition: state
|
|
entity_id: input_boolean.washing_machine_running
|
|
state: 'off'
|
|
sequence:
|
|
- service: input_select.select_option
|
|
target:
|
|
entity_id: input_select.washing_machine_state
|
|
data:
|
|
option: Idle
|
|
- service: input_select.select_option
|
|
target:
|
|
entity_id: input_select.washing_machine_state_detailed
|
|
data:
|
|
option: Idle
|
|
- alias: AI Suggestions - Weekly Review
|
|
description: Performs a weekly scan of all entities to suggest new automation opportunities
|
|
trigger:
|
|
- platform: time
|
|
at: 03:00:00
|
|
condition:
|
|
- condition: time
|
|
weekday:
|
|
- sun
|
|
action:
|
|
- service: ai_automation_suggester.generate_suggestions
|
|
data:
|
|
all_entities: true
|
|
- service: persistent_notification.create
|
|
data:
|
|
title: Weekly Automation Review
|
|
message: The AI Automation Suggester has completed its weekly review. Check
|
|
the suggestions sensor for new automation ideas!
|
|
notification_id: weekly_automation_review
|
|
- id: morning_blinds_schedule
|
|
alias: Morning Blinds Schedule
|
|
description: Automatically open blinds in the morning
|
|
trigger:
|
|
- platform: time
|
|
at: 07:30:00
|
|
condition:
|
|
- condition: state
|
|
entity_id: input_boolean.vacation_mode
|
|
state: 'off'
|
|
action:
|
|
- service: script.morning_routine_windows
|
|
- id: evening_blinds_schedule
|
|
alias: Evening Blinds Schedule
|
|
description: Automatically close blinds in the evening
|
|
trigger:
|
|
- platform: sun
|
|
event: sunset
|
|
offset: +00:30:00
|
|
condition:
|
|
- condition: state
|
|
entity_id: input_boolean.vacation_mode
|
|
state: 'off'
|
|
action:
|
|
- service: script.evening_routine_windows
|
|
- id: blinds_battery_monitor
|
|
alias: Window Covering Battery Monitor
|
|
description: Alert when SwitchBot devices need battery replacement
|
|
trigger:
|
|
- platform: numeric_state
|
|
entity_id:
|
|
- sensor.curtain_3_584c_battery
|
|
- sensor.curtain_3_a3bd_battery
|
|
- sensor.curtain_3_c019_battery
|
|
- sensor.curtain_3_fb63_battery
|
|
below: 20
|
|
for:
|
|
hours: 1
|
|
action:
|
|
- service: notify.persistent_notification
|
|
data:
|
|
title: Low Battery Warning
|
|
message: '{{ trigger.to_state.attributes.friendly_name if trigger.to_state else
|
|
''Device'' }} battery is at {{ trigger.to_state.state if trigger.to_state
|
|
else ''unknown'' }}%'
|
|
notification_id: battery_{{ trigger.entity_id }}
|