|
12 | 12 | # - Treat 3+ minutes in a room as "being cleaned" and dequeue immediately (queue = remaining rooms). |
13 | 13 | # - Phase changes are driven by `sensor.l10s_vacuum_task_status: completed` and an empty queue to avoid skipping ahead on false room transitions. |
14 | 14 | # - Avoid reissuing `dreame_vacuum.vacuum_clean_segment` while already cleaning; only send a new segment job when starting/resuming or switching phases. |
| 15 | +# - Jinja2 loop scoping: use a `namespace` when building lists (otherwise the queue can appear empty and get cleared). |
15 | 16 | ###################################################################### |
16 | 17 |
|
17 | 18 | ## 1. Helpers |
@@ -207,26 +208,26 @@ automation: |
207 | 208 | trigger: |
208 | 209 | - platform: state |
209 | 210 | entity_id: sensor.l10s_vacuum_current_room |
210 | | - for: '00:03:00' |
| 211 | + for: '00:02:30' |
211 | 212 | variables: |
212 | | - room_map: {14:'kitchen',12:'dining-room',10:'living room',7:'master-bedroom',15:'foyer',9:'stacey-office',17:'formal-dining',13:'hallway',8:'justin-bedroom',6:'paige-bedroom',4:'master-bathroom',2:'office',1:'pool-bath',3:'kids-bathroom'} |
| 213 | + room_map: {14: Kitchen, 12: 'Dining Room', 10: 'Living Room', 7: 'Master Bedroom', 15: Foyer, 9: 'Stacey Office', 17: 'Formal Dining', 13: Hallway, 8: 'Justin Bedroom', 6: 'Paige Bedroom', 4: 'Master Bathroom', 2: Office, 1: 'Pool Bath', 3: 'Kids Bathroom'} |
213 | 214 | queue_raw: "{{ states('input_text.l10s_vacuum_room_queue') | default('', true) | string | replace(' ', '') }}" |
214 | | - queue_ints: "{{ queue_raw | regex_findall('[0-9]+') | map('int') | list | default([], true) }}" |
| 215 | + queue_ints: "{{ queue_raw | regex_findall('[0-9]+') | map('int') | select('gt', 0) | list | default([], true) }}" |
215 | 216 | cleaned_room_state: "{{ trigger.to_state.state if trigger.to_state is not none else '' }}" |
216 | 217 | cleaned_room_id: "{{ (trigger.to_state.attributes.room_id if trigger.to_state is not none else 0) | int(0) }}" |
217 | 218 | matched_room_id: "{{ cleaned_room_id if cleaned_room_id > 0 and cleaned_room_id in (queue_ints | default([], true)) else 0 }}" |
218 | 219 | room_name: "{{ room_map.get(matched_room_id, cleaned_room_state) }}" |
219 | 220 | remaining_list: > |
220 | | - {% set rem = [] %} |
| 221 | + {% set ns = namespace(rem=[]) %} |
221 | 222 | {% set removed = namespace(done=false) %} |
222 | 223 | {% for r in queue_ints %} |
223 | 224 | {% if not removed.done and r == matched_room_id %} |
224 | 225 | {% set removed.done = true %} |
225 | 226 | {% else %} |
226 | | - {% set rem = rem + [r] %} |
| 227 | + {% set ns.rem = ns.rem + [r] %} |
227 | 228 | {% endif %} |
228 | 229 | {% endfor %} |
229 | | - {{ rem }} |
| 230 | + {{ ns.rem }} |
230 | 231 | remaining_rooms: "{{ remaining_list | join(',') }}" |
231 | 232 | remaining_count: "{{ remaining_list | length }}" |
232 | 233 | phase_order: ['sweep_main', 'sweep_bath', 'mop_main', 'mop_bath'] |
|
0 commit comments