diff --git a/blueprints/automation/motion-light.yaml b/blueprints/automation/motion-light.yaml new file mode 100644 index 0000000..c4bcb48 --- /dev/null +++ b/blueprints/automation/motion-light.yaml @@ -0,0 +1,140 @@ +blueprint: + name: Motion-activated Light/Switch with Optional Lux + description: Turn on a light or switch when motion is detected, optionally only if lux is below a threshold. + domain: automation + author: Home Assistant + input: + motion_entity: + name: Motion Sensor + selector: + entity: + filter: + - device_class: occupancy + domain: binary_sensor + - device_class: motion + domain: binary_sensor + target_entity: + name: Light or Switch + selector: + target: + entity: + domain: + - light + - switch + lux_entity: + name: Lux Sensor (optional) + default: null + selector: + entity: + domain: sensor + device_class: illuminance + lux_threshold: + name: Lux Threshold + description: Only turn on the light if lux is below this value. + default: 50 + selector: + number: + min: 0 + max: 1000 + unit_of_measurement: lx + no_motion_wait: + name: Wait time + description: Time to leave the light/switch on after last motion is detected. + default: 120 + selector: + number: + min: 0 + max: 3600 + unit_of_measurement: seconds + +mode: restart +max_exceeded: silent + +trigger: + - platform: state + entity_id: !input motion_entity + from: "off" + to: "on" + +variables: + lux_entity_var: !input lux_entity + lux_threshold_var: !input lux_threshold + target_entity_id: "{{ expand(!input target_entity) | map(attribute='entity_id') | list | first }}" + target_domain: "{{ target_entity_id.split('.')[0] }}" + +condition: + - alias: "Optional lux check" + condition: template + value_template: > + {% if lux_entity_var and states(lux_entity_var) not in ['unknown','unavailable'] %} + {{ states(lux_entity_var) | float(0) < lux_threshold_var | float(0) }} + {% else %} + true + {% endif %} + +action: + - alias: "Set dynamic brightness" + variables: + max_brightness: 255 + sun_elevation: "{{ state_attr('sun.sun','elevation') | float(0) }}" + current_lux: > + {% if lux_entity_var %} + {{ states(lux_entity_var) | float(0) }} + {% else %} + 0 + {% endif %} + brightness: >- + {% set base = 50 %} + {% if sun_elevation > 10 %} + {% set base = 100 %} + {% elif sun_elevation > 0 %} + {% set base = 150 %} + {% else %} + {% set base = 200 %} + {% endif %} + {% if current_lux > 50 %} + {% set base = base - ((current_lux / 500) * base) | int %} + {% endif %} + {{ [base, max_brightness] | min }} + + - alias: "Turn on the device" + choose: + # Case: Light with brightness support + - conditions: > + {{ target_domain == 'light' and 'brightness' in state_attr(target_entity_id, 'supported_color_modes') | default([]) }} + sequence: + - service: light.turn_on + target: !input target_entity + data: + brightness: "{{ brightness }}" + # Case: Light without brightness + - conditions: "{{ target_domain == 'light' }}" + sequence: + - service: light.turn_on + target: !input target_entity + # Case: Switch + - conditions: "{{ target_domain == 'switch' }}" + sequence: + - service: switch.turn_on + target: !input target_entity + + - alias: "Wait until there is no motion from device" + wait_for_trigger: + - platform: state + entity_id: !input motion_entity + from: "on" + to: "off" + + - alias: "Wait the number of seconds that has been set" + delay: !input no_motion_wait + + - alias: "Turn off the device" + choose: + - conditions: "{{ target_domain == 'light' }}" + sequence: + - service: light.turn_off + target: !input target_entity + - conditions: "{{ target_domain == 'switch' }}" + sequence: + - service: switch.turn_off + target: !input target_entity \ No newline at end of file