diff options
Diffstat (limited to 'blueprints/automation/motion/presence_switch.yaml')
-rw-r--r-- | blueprints/automation/motion/presence_switch.yaml | 256 |
1 files changed, 256 insertions, 0 deletions
diff --git a/blueprints/automation/motion/presence_switch.yaml b/blueprints/automation/motion/presence_switch.yaml new file mode 100644 index 0000000..eaaf1a6 --- /dev/null +++ b/blueprints/automation/motion/presence_switch.yaml @@ -0,0 +1,256 @@ +blueprint: + name: Switch controlled by combination of motion and presence sensors + description: Turns on light only on large movements, but turns off only if no movements in the room detected + domain: automation + input: + motion_entity: + name: Motion Sensor (or presence sensor if separate motion sensor is not available) + selector: + entity: + domain: binary_sensor +# device_class: motion + + presence_entity: + name: Presence Sensor + description: Presence sensor (or motion sensor if presence sensor is not available) + selector: + entity: + domain: binary_sensor +# device_class: motion + + door_entity: + name: Door Contact + description: Additionally trigger if door opens while no motion detected + default: [] + selector: + entity: + multiple: true + domain: binary_sensor +# device_class: contact + + light_target: + name: Light Target + default: [] + selector: + entity: + multiple: true + domain: [switch, light] + + no_motion_wait: + name: Wait time + description: Time to leave the light on after last motion is detected. + default: 120 + selector: + number: + min: 0 + max: 3600 + unit_of_measurement: seconds + + +############## Light based ########################## + illumination_test: + name: Illumination Test + description: Select how to check if existing illumination is sufficient + default: sun + selector: + select: + options: + - label: Illuminance Sensor + value: sensor + - label: Sun Elevation + value: sun + - label: Always turn on lights + value: none + illuminance_entity: + name: Illuminance Sensor + description: Sensor providing information about illumination in the room (keep empty to rely on sun position) + selector: + entity: + domain: sensor + device_class: illuminance + lux_threshold: + name: LUX threshold + description: Threshold bellow which we consider that lighting is needed + default: 40 + selector: + number: + min: 10 + max: 1000 + unit_of_measurement: lux + sun_elevation: + name: Sun Elevation + description: Sun elevation (suggested between 0 and -6) when dusks settles and we need to turn on lights) + default: 0 + selector: + number: + min: -30 + max: 30 + unit_of_measurement: ° + +############################# Preconditions ######################################### + +# Also should be off for some time, otherwise it can get switched back on once we turn light off + on_cond_should_be_off: + name: Switch-on precondition - entities which must be off + description: E.g. all lights should be off in the room + default: [] + selector: + entity: + multiple: true + domain: [ input_boolean, binary_sensor, switch, light ] + +# We can wait a bit if events slightly desynchronized and motion in hall noticed later than in the room + on_cond_should_be_on: + name: Switch-on precondition - entities which must be on + description: E.g. we only turn light if entering from the hall + default: [] + selector: + entity: + multiple: true + domain: [ input_boolean, binary_sensor, switch, light ] + + off_cond_should_be_off: + name: Switch-off precondition - entities which must be off + description: E.g. if some lights or devices are on, we assume room is still occupied + default: [] + selector: + entity: + multiple: true + domain: [ input_boolean, binary_sensor, switch, light ] + + off_cond_should_be_on: + name: Switch-off precondition - entities which must be on + description: E.g. motion in coridor should be detected + default: [] + selector: + entity: + multiple: true + domain: [ input_boolean, binary_sensor, switch, light ] + + +############################# Custom Actions ##################################### + + on_click: + name: on_click + description: Additional actions to perform while turning on master light + default: [] + selector: + action: + off_click: + name: off_click + description: Additional actions to perform while turning off master light + default: [] + selector: + action: + + + +variables: + lux_threshold: !input lux_threshold + illuminance_entity: !input illuminance_entity + test: !input illumination_test + + current_lux: '{{ (states(illuminance_entity) | float) }}' + +# If motion is detected within the delay, +# we restart the script. +mode: restart +max_exceeded: silent + +trigger: + - platform: state + id: "turn_on" + entity_id: !input motion_entity + from: "off" + to: "on" + - platform: state + id: "door" + entity_id: !input door_entity + from: "off" + to: "on" + - platform: state + id: "turn_off" + entity_id: !input presence_entity + from: "on" + to: "off" + for: + seconds: !input no_motion_wait + +action: + - choose: + - conditions: + - condition: or + conditions: + - condition: trigger + id: "turn_on" + - condition: and + conditions: + - condition: trigger + id: "door" + - condition: state + entity_id: !input motion_entity + state: 'off' + - condition: or + conditions: + - condition: and + conditions: + - condition: template + value_template: '{{ test == "sensor" }}' + - condition: template + value_template: '{{ (states(illuminance_entity) | float) < lux_threshold }}' + - condition: and + conditions: + - condition: template + value_template: '{{ test == "sun" }}' + - condition: numeric_state + entity_id: sun.sun + attribute: elevation + below: !input sun_elevation + - condition: template + value_template: '{{ test == "none" }}' + - condition: state + entity_id: !input on_cond_should_be_off + state: 'off' + for: + hours: 0 + minutes: 0 + seconds: 10 + sequence: + - repeat: + while: + - condition: state + entity_id: !input on_cond_should_be_on + match: any + state: 'off' + sequence: +# Race here: state might change between 'condition' check and 'wait_for_trigger'. We might be better to just finish the loop and check once more before the actions... + - wait_for_trigger: + - platform: state + entity_id: !input on_cond_should_be_on + to: 'on' + timeout: + seconds: 2 + continue_on_timeout: false + + - choose: [] + default: !input "on_click" + - service: switch.turn_on + target: + entity_id: !input light_target + + - conditions: + - condition: trigger + id: "turn_off" + - condition: state + entity_id: !input off_cond_should_be_off + state: 'off' + - condition: state + entity_id: !input off_cond_should_be_on + state: 'on' + sequence: + - choose: [] + default: !input "off_click" + - service: switch.turn_off + target: + entity_id: !input light_target + default: [] |