128 lines
5.2 KiB
YAML
128 lines
5.2 KiB
YAML
################################################################################
|
|
# PACKAGE: Laundry Lights Backup Occupancy Automation
|
|
################################################################################
|
|
#
|
|
# Operation:
|
|
# - Turns Laundry lights on when either of these sensors becomes active:
|
|
# - Laundry cupboard/wall PIR from ESPHome laundry environment device
|
|
# - Backup ceiling PIR from Zigbee
|
|
#
|
|
# - Turns Laundry lights off only after BOTH PIRs are clear for the configured
|
|
# delay period.
|
|
#
|
|
# Notes:
|
|
# - This is treated as a BACKUP automation.
|
|
# - The ESPHome devices should normally communicate directly via MQTT.
|
|
# - The wall PIR should still operate the lights with MQTT only.
|
|
# - This HA automation provides a fallback path using HA entity states.
|
|
#
|
|
################################################################################
|
|
|
|
################################################################################
|
|
# USER SETTINGS / PACKAGE VARIABLES
|
|
################################################################################
|
|
input_number:
|
|
laundry_lights_backup_clear_delay_seconds:
|
|
name: "Laundry Lights Backup Clear Delay Seconds"
|
|
min: 0
|
|
max: 3600
|
|
step: 1
|
|
mode: box
|
|
unit_of_measurement: s
|
|
icon: mdi:timer-outline
|
|
initial: 240
|
|
|
|
################################################################################
|
|
# AUTOMATIONS
|
|
################################################################################
|
|
automation:
|
|
- id: laundry_lights_backup_occupancy_control
|
|
alias: "Laundry Lights - Backup Occupancy Control"
|
|
description: >
|
|
Backup automation for Laundry lights. Turns lights on when either the
|
|
ESPHome wall/cupboard PIR or Zigbee ceiling PIR detects movement/occupancy.
|
|
Turns lights off after both PIRs are clear for the configured delay period.
|
|
mode: restart
|
|
triggers:
|
|
# Either PIR becoming active turns the Laundry lights on.
|
|
- trigger: state
|
|
entity_id: binary_sensor.esp_laundryenv_laundry_pir
|
|
to: "on"
|
|
id: laundry_wall_pir_detected
|
|
|
|
- trigger: state
|
|
entity_id: binary_sensor.laundry_ceiling_pir_x03ir_occupancy
|
|
to: "on"
|
|
id: laundry_ceiling_pir_detected
|
|
|
|
# Either PIR becoming clear causes a check. The action only continues
|
|
# to the off-delay when BOTH PIRs are clear.
|
|
- trigger: state
|
|
entity_id:
|
|
- binary_sensor.esp_laundryenv_laundry_pir
|
|
- binary_sensor.laundry_ceiling_pir_x03ir_occupancy
|
|
to: "off"
|
|
id: laundry_pir_clear_check
|
|
|
|
# On HA startup, re-evaluate the current state. This prevents lights
|
|
# staying on indefinitely if HA restarted while the room was already clear.
|
|
- trigger: homeassistant
|
|
event: start
|
|
id: ha_startup_check
|
|
|
|
actions:
|
|
- choose:
|
|
######################################################################
|
|
# ON LOGIC:
|
|
# If either PIR is active, turn the Laundry lights on immediately.
|
|
######################################################################
|
|
- alias: "Turn lights on if either Laundry PIR is active"
|
|
conditions:
|
|
- condition: template
|
|
value_template: >
|
|
{{
|
|
is_state('binary_sensor.esp_laundryenv_laundry_pir', 'on')
|
|
or is_state('binary_sensor.laundry_ceiling_pir_x03ir_occupancy', 'on')
|
|
}}
|
|
sequence:
|
|
- action: switch.turn_on
|
|
target:
|
|
entity_id: switch.esp_laundrylights_relay_1_laundry_lights
|
|
|
|
######################################################################
|
|
# OFF LOGIC:
|
|
# Only start the off-delay if BOTH PIRs are clear.
|
|
# After the delay, check both PIRs again before switching off.
|
|
######################################################################
|
|
- alias: "Wait, then turn lights off if both Laundry PIRs remain clear"
|
|
conditions:
|
|
- condition: template
|
|
value_template: >
|
|
{{
|
|
is_state('binary_sensor.esp_laundryenv_laundry_pir', 'off')
|
|
and is_state('binary_sensor.laundry_ceiling_pir_x03ir_occupancy', 'off')
|
|
}}
|
|
sequence:
|
|
- delay:
|
|
seconds: >
|
|
{{
|
|
states('input_number.laundry_lights_backup_clear_delay_seconds') | int(240)
|
|
}}
|
|
|
|
# Re-check after the delay in case either PIR became active again.
|
|
- condition: template
|
|
value_template: >
|
|
{{
|
|
is_state('binary_sensor.esp_laundryenv_laundry_pir', 'off')
|
|
and is_state('binary_sensor.laundry_ceiling_pir_x03ir_occupancy', 'off')
|
|
}}
|
|
|
|
# Only send OFF if the Laundry lights are currently ON.
|
|
- condition: state
|
|
entity_id: switch.esp_laundrylights_relay_1_laundry_lights
|
|
state: "on"
|
|
|
|
- action: switch.turn_off
|
|
target:
|
|
entity_id: switch.esp_laundrylights_relay_1_laundry_lights
|