summaryrefslogtreecommitdiffstats
path: root/blueprints/automation/motion/presence_switch.yaml
blob: eaaf1a6c542ac420421b137190e01bea77fe56d3 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
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: []