Hot Water Priority by @lloyda - zxdavb/ramses_cc GitHub Wiki

Hot Water Priority with S-Plan

Im my opinion, the EvoHome implementation of hot water priority has one fundamental flaw. If one or more zones have an override set, then hot water priority is disabled. Here are some automations and scripts that overcome that shortcoming by saving the state of any overrides that are in place when hot water reheat is called for, and then restoring them when that is complete.

Prerequisites

For briefness, I have only shown 3 zones in the code. This can of course be expanded to suit your system.

Additions to config.yaml

var:
  zone_00_sp:
    friendly_name: 'Zone 0 Temporary Setpoint'
    initial_value: 0
    restore: true
    
  zone_01_sp:
    friendly_name: 'Zone 1 Temporary Setpoint'
    initial_value: 0
    restore: true

  zone_02_sp:
    friendly_name: 'Zone 2 Temporary Setpoint'
    initial_value: 0
    restore: true
    
  zone_00_mode:
    friendly_name: 'Zone 0 CH Mode'
    initial_value: not_defined
    restore: true
    
  zone_01_mode:
    friendly_name: 'Zone 1 CH Mode'
    initial_value: not_defined
    restore: true
    
  zone_02_mode:
    friendly_name: 'Zone 2 CH Mode'
    initial_value: not_defined
    restore: true
    
  zone_00_until:
    friendly_name: 'Zone 0 CH Override Until'
    initial_value: 0
    restore: true
    
  zone_01_until:
    friendly_name: 'Zone 1 CH Override Until'
    initial_value: 0
    restore: true
    
  zone_02_until:
    friendly_name: 'Zone 2 CH Override Until'
    initial_value: 0
    restore: true

Automations

Two automations are required, which look at change of state of the hot water demand.

- id: '1670936587258'
  alias: DHW Priority Enable
  description: Disables all zone overrides when DHW is heated, saving settings for later
  trigger:
  - platform: state
    entity_id:
    - sensor.fa_relay_demand
    to: '100.0'
  condition: []
  action:
  - service: script.overrides_save
  mode: single
- id: '1671038236020'
  alias: DHW Priority Disable
  description: Restores all zone overrides when DHW heating is complete
  trigger:
  - platform: state
    entity_id:
    - sensor.fa_relay_demand
    to: '0.0'
  condition: []
  action:
  - service: script.overrides_restore
  mode: single

Scripts

overrides_restore:
  alias: Overrides Restore
  mode: single
  sequence:
  - repeat:
      for_each:
      - zone_entity: climate.evohome_cc_01_185426_00
        var_sp: var.zone_00_sp
        var_mode: var.zone_00_mode
        var_until: var.zone_00_until
      - zone_entity: climate.evohome_cc_01_185426_01
        var_sp: var.zone_01_sp
        var_mode: var.zone_01_mode
        var_until: var.zone_01_until
      - zone_entity: climate.evohome_cc_01_185426_02
        var_sp: var.zone_02_sp
        var_mode: var.zone_02_mode
        var_until: var.zone_02_until
      sequence:
      - condition: template
        value_template: '{{ states(repeat.item.var_sp) != not_defined }}'
      - choose:
          - conditions:
            - condition: template
              value_template: '{{ states(repeat.item.var_mode) == ''temporary'' }}'
            sequence:
              - service: ramses_cc.set_zone_mode
                data:
                  entity_id: '{{ repeat.item.zone_entity }}'
                  mode: temporary_override
                  setpoint: '{{ states(repeat.item.var_sp) }}'
                  until: '{{ states(repeat.item.var_until) }}'
          - conditions:
            - condition: template
              value_template: '{{ states(repeat.item.var_mode) == ''permanent'' }}'
            sequence:
              - service: ramses_cc.set_zone_mode
                data:
                  entity_id: '{{ repeat.item.zone_entity }}'
                  mode: permanent_override
                  setpoint: '{{ states(repeat.item.var_sp) }}'

overrides_save:
  alias: Overrides Save
  mode: single
  sequence:
  - repeat:
      for_each:
      - zone_entity: climate.evohome_cc_01_185426_00
        var_sp: var.zone_00_sp
        var_mode: var.zone_00_mode
        var_until: var.zone_00_until
      - zone_entity: climate.evohome_cc_01_185426_01
        var_sp: var.zone_01_sp
        var_mode: var.zone_01_mode
        var_until: var.zone_01_until
      - zone_entity: climate.evohome_cc_01_185426_02
        var_sp: var.zone_02_sp
        var_mode: var.zone_02_mode
        var_until: var.zone_02_until
      sequence:
      - if:
        - condition: template
          value_template: '{{ state_attr(repeat.item.zone_entity, ''preset_mode'') != ''none'' }}'
        then:
          - service: var.set
            data_template:
              entity_id: '{{ repeat.item.var_sp }}'
              value: '{{ state_attr(repeat.item.zone_entity, ''temperature'') }}'
          - service: var.set
            data_template:
              entity_id: '{{ repeat.item.var_mode }}'
              value: '{{ state_attr(repeat.item.zone_entity, ''preset_mode'') }}'
          - if:
            - condition: template
              value_template: '{{ state_attr(repeat.item.zone_entity, ''preset_mode'') == ''temporary'' }}'
            then:     
              - service: var.set
                data_template:
                  entity_id: '{{ repeat.item.var_until }}'
                  value: '{{ state_attr(repeat.item.zone_entity, ''mode'').until }}'
          - service: ramses_cc.set_zone_mode
            data:
              entity_id: '{{ repeat.item.zone_entity }}'
              mode: follow_schedule
        else:
              - service: var.set
                data_template:
                  entity_id: '{{ repeat.item.var_mode }}'
                  value: not_defined