From 485fb3be329b46bce58ce9cacab693609740746e Mon Sep 17 00:00:00 2001 From: "J.P. Krauss" Date: Mon, 2 Sep 2024 15:33:46 -0700 Subject: [PATCH] feat: Start implementing HVAC controls (migrate pause/restore to script) --- packages/climate/climate.yaml | 129 +++++++++++++++++------- packages/notification/notification.yaml | 14 +++ 2 files changed, 107 insertions(+), 36 deletions(-) diff --git a/packages/climate/climate.yaml b/packages/climate/climate.yaml index 01c3ae5..67a701c 100644 --- a/packages/climate/climate.yaml +++ b/packages/climate/climate.yaml @@ -6,10 +6,8 @@ input_select: climate_mode: name: Climate Control Mode options: - - Home - - Night - - Away - 'Off' + - Auto - Manual - Paused @@ -63,12 +61,68 @@ input_datetime: has_date: false has_time: true +input_text: + hvac_last_mode: + template: binary_sensor: - name: HVAC Fan Running state: > {{ 'Running' in state_attr('climate.thermostat', 'fan_state') }} +# ----------------------------------------------------------------------------- +# Climate Scripts +script: + hvac_pause: + alias: Pause HVAC + mode: restart + sequence: + # Save the current thermostat mode because it may not be captured properly + # by `scene.create` (see https://github.com/home-assistant/core/issues/69925) + - action: input_text.set_value + target: + entity_id: input_text.hvac_last_mode + data: + value: "{{ states('climate.thermostat') }}" + + # Snapshot the current mode and thermostat status + - action: scene.create + data: + scene_id: hvac_restore_state + snapshot_entities: + - climate.thermostat + - input_select.climate_mode + - input_text.hvac_last_mode + + # Turn off the thermostat and set the mode to Paused + - action: climate.set_hvac_mode + target: + entity_id: climate.thermostat + data: + hvac_mode: "off" + + - service: input_select.select_option + target: + entity_id: input_select.climate_mode + data: + option: Paused + + hvac_restore: + alias: Resume HVAC + mode: restart + sequence: + # Restore the snapshot + - action: scene.turn_on + target: + entity_id: scene.hvac_restore_state + + # Restore the thermostat mode + - action: climate.set_hvac_mode + target: + entity_id: climate.thermostat + data: + hvac_mode: "{{ states('input_text.hvac_last_mode') }}" + # ----------------------------------------------------------------------------- # Climate Automations automation: @@ -92,26 +146,27 @@ automation: - "{{ not is_state('input_select.climate_mode', 'Paused') }}" - "{{ is_state('input_boolean.guest_mode', 'off') }}" action: - - service: scene.create + # - service: scene.create + # data: + # scene_id: hvac_restore_state + # snapshot_entities: + # # See https://github.com/home-assistant/core/issues/69925 + # # - climate.thermostat + # - input_select.climate_mode + # - service: climate.set_hvac_mode + # target: + # entity_id: climate.thermostat + # data: + # hvac_mode: "off" + # - service: input_select.select_option + # target: + # entity_id: input_select.climate_mode + # data: + # option: Paused + - action: script.hvac_pause + - action: notify.status data: - scene_id: hvac_restore_state - snapshot_entities: - # See https://github.com/home-assistant/core/issues/69925 - # - climate.thermostat - - input_select.climate_mode - - service: climate.set_hvac_mode - target: - entity_id: climate.thermostat - data: - hvac_mode: "off" - - service: input_select.select_option - target: - entity_id: input_select.climate_mode - data: - option: Paused - - service: notify.general - data: - message: HVAC Paused (Window or Door Open) + message: "HVAC Paused ({{ states('sensor.open_windows_doors') }} open)" - alias: Restore HVAC when Doors/Windows Closed mode: queued @@ -128,23 +183,25 @@ automation: to: 'off' for: minutes: 5 - condition: - - "{{ not is_state('input_select.climate_mode', 'Manual') }}" + condition: - "{{ is_state('input_select.climate_mode', 'Paused') }}" + - "{{ is_state('binary_sensor.all_doors', 'off') }}" + - "{{ is_state('binary_sensor.all_windows', 'off') }}" action: - - service: scene.turn_on - target: - entity_id: scene.hvac_restore_state - # See https://github.com/home-assistant/core/issues/69925 - # Assume thermostat is always heat_cool when not off - - service: climate.set_hvac_mode - target: - entity_id: climate.thermostat + # - service: scene.turn_on + # target: + # entity_id: scene.hvac_restore_state + # # See https://github.com/home-assistant/core/issues/69925 + # # Assume thermostat is always heat_cool when not off + # - service: climate.set_hvac_mode + # target: + # entity_id: climate.thermostat + # data: + # hvac_mode: "{{ 'off' if is_state('input_select.climate_mode', 'Off') else 'heat_cool' }}" + - action: script.hvac_restore + - action: notify.status data: - hvac_mode: "{{ 'off' if is_state('input_select.climate_mode', 'Off') else 'heat_cool' }}" - - service: notify.general - data: - message: HVAC Restored (Window or Door Open) + message: HVAC Restored (Windows and Doors closed) - alias: Widen HVAC Range at Night mode: queued diff --git a/packages/notification/notification.yaml b/packages/notification/notification.yaml index 61bb60c..5bc58f1 100644 --- a/packages/notification/notification.yaml +++ b/packages/notification/notification.yaml @@ -32,6 +32,20 @@ notify: services: - action: iphone_jp + # `notify.status` used for simple status reporting (e.g. washer done) + # Keeps these notifications separated from security alerts + - name: status + platform: group + services: + - action: iphone_jp + data: + data: + group: 'status-notification-group' + - action: iphone_jen + data: + data: + group: 'status-notification-group' + - name: everyone platform: group services: