How to set schedule on Honeywell TH6320ZW2003 thermostat

I have successfully paired my Honeywell TH6320ZW2003 thermostat with Home Assistant using the Aeotec Z-Stick Gen5. It works fine… I can turn the heat and AC on and off and can change the temperature but I don’t see any way to adjust the schedule that I have programmed directly on the thermostat. I am switching away from Total Connect 2.0 to Home Assistant. Total Connect 2.0 allowed me to change the schedule (although it wouldn’t let the “heat to” and “cool to” temperatures get within 3 degrees of each other even though the thermostat allows it) so I’m assuming there is a way to control the schedule via Home Assistant. Any suggestions are much appreciated.

Once you connect the thermostat to Z-Wave, the schedule in the thermostat is no longer used. I used packages to make my yaml based schedule. Schedy is app-daemon based and another way to do it.

What I made is essentially a 4 period schedule, because that’s how I wanted it.

Morning: at 6:00a, change setpoint, change fan mode
Away: if unocc, change setpoint, change fan mode
Home: if occ or home 2 hours after Morning, change setpoint, change fan mode
Sleep: at 10:00p, change setpoint, change fan mode

The config has changed a little bit since there is only one entity for the thermostat, so it will only send the setpoint for the current mode. I have another yaml package that will switch modes if it gets warm or cool.

So any time you want to change the schedule you have to change it in the YAML file? I was hoping there was a way to change the schedule via the Home Assistant UI otherwise it’s just as easy to change it on the thermostat directly. Total Connect 2.0 allowed me to change it in the iOS app which must have overridden the schedule on the thermostat like you said but that would be fine with me as long as I can control it in the Home Assistant UI.

Negative. I use input booleans, input selects, and date time objects that are changed via UI.

Below is part of my schedule config, but only the UI portions. The groups are used for a popup in lovelace. It is part of a single package and I used node anchors throughout to cut down as much as I could.

group:
  hvac_morning:
    friendly_name: "Morning"
    icon: mdi:weather-sunset
    entities:
    - input_datetime.hvac_morning
    - input_number.hvac_morning_heat_sp
    - input_number.hvac_morning_cool_sp
    - input_select.hvac_morning_fan_mode
  hvac_away:
    friendly_name: "Leave"
    icon: mdi:home-outline
    entities:
    - input_number.hvac_away_heat_sp
    - input_number.hvac_away_cool_sp
    - input_select.hvac_away_fan_mode
  hvac_home:
    friendly_name: "Arrive"
    icon: mdi:home
    entities:
    - input_number.hvac_occ_after_morning
    - input_number.hvac_home_heat_sp
    - input_number.hvac_home_cool_sp
    - input_select.hvac_home_fan_mode
  hvac_sleep:
    friendly_name: "Sleep"
    icon: mdi:bed-empty
    entities:
    - input_datetime.hvac_sleep
    - input_number.hvac_sleep_heat_sp
    - input_number.hvac_sleep_cool_sp
    - input_select.hvac_sleep_fan_mode

input_number:
  hvac_morning_heat_sp: &sched-heat
    name: Heat
    min: 62
    max: 72
    step: 1
    icon: mdi:fire
    unit_of_measurement: °F
    mode: box
  hvac_morning_cool_sp: &sched-cool
    name: Cool
    min: 72
    max: 80
    step: 1
    icon: mdi:snowflake
    unit_of_measurement: °F
    mode: box
  hvac_away_heat_sp: *sched-heat
  hvac_away_cool_sp: *sched-cool
  hvac_home_heat_sp: *sched-heat
  hvac_home_cool_sp: *sched-cool
  hvac_sleep_heat_sp: *sched-heat
  hvac_sleep_cool_sp: *sched-cool
  
  hvac_occ_after_morning:
    name: Home After
    min: 1
    max: 6
    step: 0.5
    icon: mdi:timer-sand
    unit_of_measurement: hrs
    mode: box

input_datetime:
  hvac_morning: &sched-time
    name: Time
    has_date: false
    has_time: true
  hvac_sleep: *sched-time

input_select:
  hvac_morning_fan_mode: &sched-fan
    name: Fan Mode
    options:
      - On Low
      - Circulate
      - Auto Low
    initial: Circulate
  hvac_away_fan_mode:
    <<: *sched-fan
    initial: Auto Low
  hvac_home_fan_mode:
    <<: *sched-fan
  hvac_sleep_fan_mode:
    <<: *sched-fan
    initial: On Low
  hvac_recent_change:
    name: '[hvac] Recent Change'
    options:
      - morning
      - away
      - home
      - sleep

Which looks like:

1 2

2 Likes

Oh perfect. I will look into doing the same thing and may have more follow up questions. Thanks for steering me in the right direction.

How did you connect your TH6320ZW2003 thermostat to ha? It’s currently connect to my alarm.com panel and I file want Adt to see what my HVAC is doing.

I have an Aeotec Gen5 dongle using ZwaveJS2MQTT.

Yup sorry I didn’t put in there I have that installed. Here is my main post.

I know this more than a year old, but you can you share more details on how you did this ?

Sure! What would you like to know?

I would like to see the automation side. I have setup a basic automation but would like to make it better.
I am trying to simulate the 5-2-2 type schedule (weekdays-weekend-2 periods) and ultimately try to estimate when should heating be turned on to reach the target temperature at the set time

Mine is just a daily 4 period schedule. Using occupancy status to change between home and away.

The recent change portion is to make sure the thermostat has been changed to the correct setpoint. The setpoint commands seem to take without retry on the TH6320.

HVAC Schedule YAML Package
################################################################
## Packages / HVAC Schedule Config
################################################################

## EXTERNAL REFERENCES:
## group.occ_card
## sensor.time

## AUTOMATION GROUP TO BE ENABLED
## group.z_hvac_schedule

################################################
## Customize
################################################

homeassistant:
  customize:
    ################################################
    ## Node Anchors
    ################################################

    package.node_anchors:
      customize: &customize
        package: 'hvac_schedule'

      expose: &expose
        <<: *customize
        haaska_hidden: false
        homebridge_hidden: false
        
    group.hvac_morning:
      <<: *customize
      friendly_name: "Morning"
      icon: mdi:weather-sunset
    group.hvac_away:
      <<: *customize
      friendly_name: "Leave"
      icon: mdi:home-outline
    group.hvac_home:
      <<: *customize
      friendly_name: "Arrive"
      icon: mdi:home
    group.hvac_sleep:
      <<: *customize
      friendly_name: "Sleep"
      icon: mdi:bed-empty
        
################################################
## History
################################################

history:
  exclude:
    entities:
    - input_datetime.hvac_morning
    - input_number.hvac_morning_heat_sp
    - input_number.hvac_morning_cool_sp
    - input_select.hvac_morning_fan_mode
    - input_number.hvac_away_heat_sp
    - input_number.hvac_away_cool_sp
    - input_select.hvac_away_fan_mode
    - input_number.hvac_home_heat_sp
    - input_number.hvac_home_cool_sp
    - input_select.hvac_home_fan_mode
    - input_datetime.hvac_sleep
    - input_number.hvac_sleep_heat_sp
    - input_number.hvac_sleep_cool_sp
    - input_select.hvac_sleep_fan_mode

################################################
## Group
################################################

group:
  hvac_morning:
    entities:
    - input_datetime.hvac_morning
    - input_number.hvac_morning_heat_sp
    - input_number.hvac_morning_cool_sp
    - input_select.hvac_morning_fan_mode
  hvac_away:
    entities:
    - input_number.hvac_away_heat_sp
    - input_number.hvac_away_cool_sp
    - input_select.hvac_away_fan_mode
  hvac_home:
    entities:
    - input_datetime.hvac_home
    - input_number.hvac_home_heat_sp
    - input_number.hvac_home_cool_sp
    - input_select.hvac_home_fan_mode
  hvac_sleep:
    entities:
    - input_datetime.hvac_sleep
    - input_number.hvac_sleep_heat_sp
    - input_number.hvac_sleep_cool_sp
    - input_select.hvac_sleep_fan_mode
  z_hvac_schedule:
    entities:
    #- automation.hvac_start_timer_occ
    #- automation.hvac_start_timer_unocc
    - automation.hvac_time_schedule_event
    - automation.hvac_occ_after_morning_event
    - automation.hvac_occ_for_5_min
    - automation.hvac_unocc_for_5_min
    - automation.hvac_schedule_sleep_event
    - automation.hvac_recent_change_loop

################################################
## Input Boolean
################################################

input_boolean:
  hvac_recent_change:
    initial: false

################################################
## Input Number
################################################

input_number:
  hvac_morning_heat_sp: &sched-heat
    name: Heat
    min: 62
    max: 72
    step: 1
    icon: mdi:fire
    unit_of_measurement: °F
    mode: box
  hvac_morning_cool_sp: &sched-cool
    name: Cool
    min: 72
    max: 80
    step: 1
    icon: mdi:snowflake
    unit_of_measurement: °F
    mode: box
  hvac_away_heat_sp: *sched-heat
  hvac_away_cool_sp: *sched-cool
  hvac_home_heat_sp: *sched-heat
  hvac_home_cool_sp: *sched-cool
  hvac_sleep_heat_sp: *sched-heat
  hvac_sleep_cool_sp: *sched-cool

################################################
## Input Datetime
################################################

input_datetime:
  hvac_morning: &sched-time
    name: Time
    has_date: false
    has_time: true
  hvac_home: *sched-time
  hvac_sleep: *sched-time

################################################
## Input Select
################################################
    
input_select:
  hvac_morning_fan_mode: &sched-fan
    name: Fan Mode
    options:
      - Low
      - Circulation
      - Auto low
    #initial: Circulation
  hvac_away_fan_mode:
    <<: *sched-fan
    #initial: Auto low
  hvac_home_fan_mode:
    <<: *sched-fan
  hvac_sleep_fan_mode:
    <<: *sched-fan
    #initial: Low
  hvac_recent_change:
    name: '[hvac] Recent Change'
    options:
      - morning
      - away
      - home
      - sleep

timer:
  occ:
    name: Arrive Timer
    duration: '00:05:00'
    icon: mdi:home
  unocc:
    name: Leaving Timer
    duration: '00:05:00'
    icon: mdi:home-outline

################################################
## Automations
################################################

automation:

- alias: '[hvac] occ timer control'
  mode: restart
  trigger:
    - platform: state
      entity_id: group.occ_card
  action:
    - choose:
        - conditions: "{{ trigger.to_state.state == 'home' }}"
          sequence:
            - service: timer.cancel
              entity_id: timer.unocc
            - service: timer.start
              entity_id: timer.occ
        - conditions: "{{ trigger.to_state.state == 'not_home' }}"
          sequence:
            - service: timer.cancel
              entity_id: timer.occ
            - service: timer.start
              entity_id: timer.unocc

- alias: '[hvac] time schedule event'
  trigger:
    platform: time
    at: input_datetime.hvac_morning
  condition: &condition-home
    condition: state
    entity_id: group.occ_card
    state: 'home'
  action:
    - service: script.hvac_schedule_morning

- alias: '[hvac] occ after morning event'
  trigger:
    platform: time
    at: input_datetime.hvac_home
  condition: *condition-home
  action:
    - service: script.hvac_schedule_home

- alias: '[hvac] occ for 5 min'
  trigger:
    - platform: event
      event_type: timer.finished
      event_data:
        entity_id: timer.occ
  action:
    - choose:
        - conditions:
            - condition: time
              after: input_datetime.hvac_sleep
              before: input_datetime.hvac_morning
          sequence:
            - service: script.hvac_schedule_sleep
      default:
        - service: script.hvac_schedule_home

- alias: '[hvac] unocc for 5 min'
  trigger:
    - platform: event
      event_type: timer.finished
      event_data:
        entity_id: timer.unocc
  action:
    - service: script.hvac_schedule_away

- alias: '[hvac] schedule sleep event'
  trigger:
    platform: time
    at: input_datetime.hvac_sleep
  condition: *condition-home
  action:
    - service: script.hvac_schedule_sleep

- alias: '[hvac] recent change loop'
  trigger:
    - platform: state
      entity_id: input_boolean.hvac_recent_change
      to: 'on'
      for:
        minutes: 2
  action:
    - service: input_boolean.turn_off
      entity_id: input_boolean.hvac_recent_change
    - condition: template
      value_template: >
        {% set t = state_attr('climate.hvac_thermostat_mode','temperature') %}
        {% set m = states('climate.hvac_thermostat_mode') %}
        {% set r = states('input_select.hvac_recent_change') %}
        {% set rc = states('input_number.hvac_' ~ r ~ '_' ~ m ~ '_sp') | int %}
        {{ true if t != rc else false }}
    - service_template: >
        script.hvac_schedule_{{ states('input_select.hvac_recent_change') | lower }}

################################################
## Scripts
################################################

script:
  hvac_schedule_morning:
    alias: '[hvac] schedule morning'
    sequence:
    - service: climate.set_temperature
      entity_id: climate.hvac_thermostat_mode
      data_template:
        temperature: >
          {% set m = states('climate.hvac_thermostat_mode') %}
          {{ states('input_number.hvac_morning_' ~ m ~ '_sp') | float }}
    - service: climate.set_fan_mode
      entity_id: climate.hvac_thermostat_mode
      data_template:
        fan_mode: "{{ states('input_select.hvac_morning_fan_mode') }}"
    - service: script.hvac_recent_change
      data:
        recent_change: morning
  hvac_schedule_away:
    alias: '[hvac] schedule away'
    sequence:
    - service: climate.set_temperature
      entity_id: climate.hvac_thermostat_mode
      data_template:
        temperature: >
          {% set m = states('climate.hvac_thermostat_mode') %}
          {{ states('input_number.hvac_away_' ~ m ~ '_sp') | float }}
    - service: climate.set_fan_mode
      entity_id: climate.hvac_thermostat_mode
      data_template:
        fan_mode: "{{ states('input_select.hvac_away_fan_mode') }}"
    - service: script.hvac_recent_change
      data:
        recent_change: away
  hvac_schedule_home:
    alias: '[hvac] schedule home'
    sequence:
    - service: climate.set_temperature
      entity_id: climate.hvac_thermostat_mode
      data_template:
        temperature: >
          {% set m = states('climate.hvac_thermostat_mode') %}
          {{ states('input_number.hvac_home_' ~ m ~ '_sp') | float }}
    - service: climate.set_fan_mode
      entity_id: climate.hvac_thermostat_mode
      data_template:
        fan_mode: "{{ states('input_select.hvac_home_fan_mode') }}"
    - service: script.hvac_recent_change
      data:
        recent_change: home
  hvac_schedule_sleep:
    alias: '[hvac] schedule sleep'
    sequence:
    - service: climate.set_temperature
      entity_id: climate.hvac_thermostat_mode
      data_template:
        temperature: >
          {% set m = states('climate.hvac_thermostat_mode') %}
          {{ states('input_number.hvac_sleep_' ~ m ~ '_sp') | float }}
    - service: climate.set_fan_mode
      entity_id: climate.hvac_thermostat_mode
      data_template:
        fan_mode: "{{ states('input_select.hvac_sleep_fan_mode') }}"
    - service: script.hvac_recent_change
      data:
        recent_change: sleep
  hvac_recent_change:
    alias: '[hvac] recent change'
    sequence:
    - service: input_boolean.turn_on
      entity_id: input_boolean.hvac_recent_change
    - service: input_select.select_option
      entity_id: input_select.hvac_recent_change
      data:
        option: "{{ recent_change }}"