diff --git a/config/packages/README.md b/config/packages/README.md index 4653b4f2..d3901dce 100755 --- a/config/packages/README.md +++ b/config/packages/README.md @@ -48,7 +48,7 @@ Live collection of plug-and-play Home Assistant packages. Each YAML file in this | [apt_updates.yaml](apt_updates.yaml) | Weekly APT patch reporting for Docker hosts + Repairs reboot alerts. | `sensor.docker_*_apt_status`, `repairs.create`, `script.send_to_logbook` | | [phynplus.yaml](phynplus.yaml) | Phyn shutoff automations with push + Activity feed + Repairs issues for leak events. | `valve.phyn_shutoff_valve`, `binary_sensor.phyn_leak_test_running`, `repairs.create` | | [powerwall.yaml](powerwall.yaml) | Track Tesla Powerwall grid status and shed loads automatically when off-grid (alerts include Activity feed + Repairs). | `binary_sensor.powerwall_grid_status`, `sensor.powerwall_*`, `repairs.create` | -| [vacuum.yaml](vacuum.yaml) | Dreame vacuum orchestration with room tracking, push alerts, Activity feed, and Repairs issues on errors. | `input_select.l10s_vacuum_phase`, `sensor.l10s_vacuum_error`, `repairs.create` | +| [vacuum.yaml](vacuum.yaml) | Dreame vacuum orchestration with room tracking, push alerts, Activity feed, Repairs issues on errors, and Alexa one-off room-clean switches. | `input_select.l10s_vacuum_phase`, `sensor.l10s_vacuum_error`, `repairs.create` | | [hass_agent_homepc.yaml](hass_agent_homepc.yaml) | Mirrors PC lock/unlock state from HASS.Agent to the office lamp for instant desk presence cues. | `sensor.carlo_homepc_carlo_homepc_sessionstate`, `switch.office_lamp_switch` | | [finance.yaml](finance.yaml) | Yahoo Finance sensor bundle for portfolio glances and Lovelace cards. | `sensor.tsla`, `sensor.aapl`, `sensor.amzn`, `sensor.msft` | @@ -66,6 +66,7 @@ Live collection of plug-and-play Home Assistant packages. Each YAML file in this - Logic lives in [vacuum.yaml](vacuum.yaml): continuous four-phase loop (sweep main, sweep baths, mop main, mop baths) driven by `input_select.l10s_vacuum_phase` and `input_text.l10s_vacuum_room_queue`, with per-room notifications and automatic reseeding between phases. - Uses the Dreame HACS integration with segment IDs to enforce bathrooms last in each sweep/mop pass, dock on arrival, and auto-run if idle for 3+ days. - Room queue advances on a 2-minute dwell in `sensor.l10s_vacuum_current_room` (queue = remaining rooms); phase changes happen on `sensor.l10s_vacuum_task_status: completed` and an empty queue. +- One-off room cleaning for Alexa uses `input_boolean.l10s_vacuum_clean_*` (example: "Kitchen Clean") and runs a segment job without touching or checking the phased queue. ![Dreame Automations](../www/custom_ui/floorplan/images/branding/Dreame%20Automations.png) ### Blog & video deep dives diff --git a/config/packages/vacuum.yaml b/config/packages/vacuum.yaml index adedecbd..33c84fbe 100755 --- a/config/packages/vacuum.yaml +++ b/config/packages/vacuum.yaml @@ -4,7 +4,7 @@ # Original Repo : https://github.com/CCOSTAN/Home-AssistantConfig # ------------------------------------------------------------------- # Dreame Vacuum Orchestration - Continuous phased sweep/mop with away/on-demand -# Related Issue: 1550 +# Related Issue: 1550, 1553 # Phases: sweep main, sweep baths, mop main, mop baths; notifications + idle auto-start # ------------------------------------------------------------------- # Notes: @@ -17,6 +17,7 @@ # - Queue-empty trigger ignores already-completed tasks to avoid immediate reseeding. # - Queue-empty no longer auto-reseeds; phase advance handles the next run on completion. # - Mop phases use `sweeping_and_mopping` instead of mop-only. +# - One-off room clean booleans ignore the queue; they only run when the vacuum is docked/idle. ###################################################################### ## 1. Helpers @@ -26,6 +27,48 @@ input_boolean: l10s_vacuum_on_demand: name: Dreame Clean (On-Demand) icon: mdi:robot-vacuum + l10s_vacuum_clean_kitchen: + name: Kitchen Clean + icon: mdi:robot-vacuum + l10s_vacuum_clean_dining_room: + name: Dining Room Clean + icon: mdi:robot-vacuum + l10s_vacuum_clean_living_room: + name: Living Room Clean + icon: mdi:robot-vacuum + l10s_vacuum_clean_master_bedroom: + name: Master Bedroom Clean + icon: mdi:robot-vacuum + l10s_vacuum_clean_foyer: + name: Foyer Clean + icon: mdi:robot-vacuum + l10s_vacuum_clean_stacey_office: + name: Stacey Office Clean + icon: mdi:robot-vacuum + l10s_vacuum_clean_formal_dining: + name: Formal Dining Clean + icon: mdi:robot-vacuum + l10s_vacuum_clean_hallway: + name: Hallway Clean + icon: mdi:robot-vacuum + l10s_vacuum_clean_justin_bedroom: + name: Justin Bedroom Clean + icon: mdi:robot-vacuum + l10s_vacuum_clean_paige_bedroom: + name: Paige Bedroom Clean + icon: mdi:robot-vacuum + l10s_vacuum_clean_master_bathroom: + name: Master Bathroom Clean + icon: mdi:robot-vacuum + l10s_vacuum_clean_office: + name: Office Clean + icon: mdi:robot-vacuum + l10s_vacuum_clean_pool_bath: + name: Pool Bath Clean + icon: mdi:robot-vacuum + l10s_vacuum_clean_kids_bathroom: + name: Kids Bathroom Clean + icon: mdi:robot-vacuum input_select: l10s_vacuum_phase: @@ -160,6 +203,127 @@ automation: target: entity_id: input_boolean.l10s_vacuum_on_demand + - alias: 'Vacuum: One-Off Room Clean (Alexa)' + id: 5e2fd2b1-3f45-4680-ae74-68bb116cf1e8 + mode: queued + trigger: + - platform: state + entity_id: input_boolean.l10s_vacuum_clean_kitchen + to: 'on' + id: kitchen + - platform: state + entity_id: input_boolean.l10s_vacuum_clean_dining_room + to: 'on' + id: dining_room + - platform: state + entity_id: input_boolean.l10s_vacuum_clean_living_room + to: 'on' + id: living_room + - platform: state + entity_id: input_boolean.l10s_vacuum_clean_master_bedroom + to: 'on' + id: master_bedroom + - platform: state + entity_id: input_boolean.l10s_vacuum_clean_foyer + to: 'on' + id: foyer + - platform: state + entity_id: input_boolean.l10s_vacuum_clean_stacey_office + to: 'on' + id: stacey_office + - platform: state + entity_id: input_boolean.l10s_vacuum_clean_formal_dining + to: 'on' + id: formal_dining + - platform: state + entity_id: input_boolean.l10s_vacuum_clean_hallway + to: 'on' + id: hallway + - platform: state + entity_id: input_boolean.l10s_vacuum_clean_justin_bedroom + to: 'on' + id: justin_bedroom + - platform: state + entity_id: input_boolean.l10s_vacuum_clean_paige_bedroom + to: 'on' + id: paige_bedroom + - platform: state + entity_id: input_boolean.l10s_vacuum_clean_master_bathroom + to: 'on' + id: master_bathroom + - platform: state + entity_id: input_boolean.l10s_vacuum_clean_office + to: 'on' + id: office + - platform: state + entity_id: input_boolean.l10s_vacuum_clean_pool_bath + to: 'on' + id: pool_bath + - platform: state + entity_id: input_boolean.l10s_vacuum_clean_kids_bathroom + to: 'on' + id: kids_bathroom + variables: + room_map: + kitchen: {segment: 14, name: Kitchen} + dining_room: {segment: 12, name: 'Dining Room'} + living_room: {segment: 10, name: 'Living Room'} + master_bedroom: {segment: 7, name: 'Master Bedroom'} + foyer: {segment: 15, name: Foyer} + stacey_office: {segment: 9, name: 'Stacey Office'} + formal_dining: {segment: 17, name: 'Formal Dining'} + hallway: {segment: 13, name: Hallway} + justin_bedroom: {segment: 8, name: 'Justin Bedroom'} + paige_bedroom: {segment: 6, name: 'Paige Bedroom'} + master_bathroom: {segment: 4, name: 'Master Bathroom'} + office: {segment: 2, name: Office} + pool_bath: {segment: 1, name: 'Pool Bath'} + kids_bathroom: {segment: 3, name: 'Kids Bathroom'} + room_key: "{{ trigger.id }}" + room_name: "{{ room_map[room_key].name }}" + segment_id: "{{ room_map[room_key].segment | int }}" + vac_state: "{{ states('vacuum.l10s_vacuum') }}" + on_demand: "{{ is_state('input_boolean.l10s_vacuum_on_demand', 'on') }}" + queue_raw: "{{ states('input_text.l10s_vacuum_room_queue') | default('', true) | string | trim }}" + can_start: "{{ vac_state in ['docked', 'idle'] }}" + action: + - choose: + - conditions: + - condition: template + value_template: "{{ can_start }}" + sequence: + - service: script.send_to_logbook + data: + topic: "VACUUM" + message: "One-off clean: {{ room_name }}." + - continue_on_error: true + service: select.select_option + target: + entity_id: select.l10s_vacuum_cleaning_mode + data: + option: sweeping + - continue_on_error: true + service: vacuum.set_fan_speed + target: + entity_id: vacuum.l10s_vacuum + data: + fan_speed: Standard + - continue_on_error: true + service: dreame_vacuum.vacuum_clean_segment + target: + entity_id: vacuum.l10s_vacuum + data: + segments: "{{ [segment_id] }}" + - delay: "00:00:02" + default: + - service: script.send_to_logbook + data: + topic: "VACUUM" + message: "One-off clean blocked: {{ room_name }} (vac={{ vac_state }}, on_demand={{ on_demand }}, queue='{{ queue_raw }}')." + - service: input_boolean.turn_off + data: + entity_id: "{{ trigger.entity_id }}" + - alias: 'Away Vacuum: Start or Resume When we leave or On-Demand' id: 7f7e0a3c-6452-4f6b-8464-c6c25770a148 trigger: @@ -560,10 +724,10 @@ automation: entity_id: vacuum.l10s_vacuum - service: script.speech_engine data: - value1: > + value1: > {{ "Vacuum error: " ~ states('sensor.l10s_vacuum_error') ~ " [ask Residents to help]" }} Currently in {{states('sensor.l10s_vacuum_current_room')}} - - delay: 00:01:00 + - delay: 00:01:00 - service: vacuum.locate entity_id: vacuum.l10s_vacuum - delay: 00:20:00