# Climate Package

# -----------------------------------------------------------------------------
# Climate State Helpers
input_select:
  climate_mode:
    name: Climate Control Mode
    options:
      - Home
      - Night
      - Away
      - 'Off'
      - Manual
      - Paused

input_number:
  temp_setpoint_day_high:
    name: Temperature Setpoint Day (High)
    initial: 74
    min: 60
    max: 90
    step: 1
  temp_setpoint_day_low:
    name: Temperature Setpoint Day (Low)
    initial: 70
    min: 60
    max: 90
    step: 1
  temp_setpoint_night_high:
    name: Temperature Setpoint Night (High)
    initial: 76
    min: 60
    max: 90
    step: 1
  temp_setpoint_night_low:
    name: Temperature Setpoint Night (Low)
    initial: 70
    min: 60
    max: 90
    step: 1
  temp_setpoint_away_high:
    name: Temperature Setpoint Away (High)
    initial: 80
    min: 60
    max: 90
    step: 1
  temp_setpoint_away_low:
    name: Temperature Setpoint Away (Low)
    initial: 66
    min: 60
    max: 90
    step: 1

input_datetime:
  hvac_start_day:
    name: HVAC Daytime Start
    initial: '10:00'
    has_date: false
    has_time: true
  hvac_start_night:
    name: HVAC Nighttime Start
    initial: '20:00'
    has_date: false
    has_time: true

template:
  binary_sensor:
    - name: HVAC Fan Running
      state: >
        {{ 'Running' in state_attr('climate.thermostat', 'fan_state') }}

# -----------------------------------------------------------------------------
# Climate Automations
automation:

# Automations for Open Windows/Doors
  - alias: Pause HVAC when Doors/Windows Open
    mode: queued
    trigger:
      - platform: state
        entity_id: binary_sensor.all_doors
        to: 'on'
        for:
          minutes: 5
      - platform: state
        entity_id: binary_sensor.all_windows
        to: 'on'
        for:
          minutes: 5
    condition: "{{ not is_state('input_select.climate_mode', 'Paused') }}"
    action:
      - 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
      - service: notify.telegram_home
        data:
          message: HVAC Paused (Window or Door Open)

  - alias: Restore HVAC when Doors/Windows Closed
    mode: queued
    trigger:
      - platform: state
        entity_id: binary_sensor.all_doors
        from: 'on'
        to: 'off'
        for:
          minutes: 5
      - platform: state
        entity_id: binary_sensor.all_windows
        from: 'on'
        to: 'off'
        for:
          minutes: 5
    condition: "{{ is_state('input_select.climate_mode', 'Paused') }}"
    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
        data:
          hvac_mode: "{{ 'off' if is_state('input_select.climate_mode', 'Off') else 'heat_cool' }}"
      - service: notify.telegram_home
        data:
          message: HVAC Restored (Window or Door Open)

  - alias: Widen HVAC Range at Night
    mode: queued
    trigger:
      - platform: time
        at: input_datetime.hvac_start_night
    condition: "{{ not is_state('input_select.house_presence_state', 'Extended Away') }}"
    action:
      - service: climate.set_temperature
        target:
          entity_id: climate.thermostat
        data:
          target_temp_high: "{{ states('input_number.temp_setpoint_night_high')|float }}"
          target_temp_low: "{{ states('input_number.temp_setpoint_night_low')|float }}"

  - alias: Narrow HVAC Range during Day
    mode: queued
    trigger:
      - platform: time
        at: input_datetime.hvac_start_day
    condition: "{{ not is_state('input_select.house_presence_state', 'Extended Away') }}"
    action:
      - service: climate.set_temperature
        target:
          entity_id: climate.thermostat
        data:
          target_temp_high: "{{ states('input_number.temp_setpoint_day_high')|float }}"
          target_temp_low: "{{ states('input_number.temp_setpoint_day_low')|float }}"

  - alias: Widen HVAC Range during Vacation
    mode: queued
    trigger:
      - platform: state
        entity_id: input_select.house_presence_state
        to: 'Extended Away'
    action:
      - service: climate.set_temperature
        target:
          entity_id: climate.thermostat
        data:
          target_temp_high: "{{ states('input_number.temp_setpoint_away_high')|float }}"
          target_temp_low: "{{ states('input_number.temp_setpoint_away_low')|float }}"
