@mike.maxwell I just did some more testing and found the following:
I used the driver setpoint functions and the UI still reported 20.5c instead of 20.0c:

However, If I send 21.0c and then 20.0c it reports the correct setpoints for both.
dev:8792023-09-21 09:51:29.004 AMtracechanged?- sp:false, hsp:false, csp:false, os:false
dev:8792023-09-21 09:51:28.996 AMtraceupdateSetpoints params- sp:null, hsp:20.0, csp:null, os:heat
dev:8792023-09-21 09:51:28.988 AMdebuggetHeatingSetpointResult:20
dev:8792023-09-21 09:51:28.973 AMdebugdescMap: [raw:DF270102010A120029D007, dni:DF27, endpoint:01, cluster:0201, size:0A, attrId:0012, encoding:29, command:0A, value:07D0, clusterInt:513, attrInt:18]
dev:8792023-09-21 09:51:20.015 AMtracechanged?- sp:false, hsp:false, csp:false, os:false
dev:8792023-09-21 09:51:20.008 AMtraceupdateSetpoints params- sp:null, hsp:20.0, csp:null, os:heat
dev:8792023-09-21 09:51:20.000 AMdebuggetHeatingSetpointResult:20
dev:8792023-09-21 09:51:19.993 AMdebugdescMap: [raw:DF270102010C120029D007, dni:DF27, endpoint:01, cluster:0201, size:0C, attrId:0012, encoding:29, command:01, value:07D0, clusterInt:513, attrInt:18]
dev:8792023-09-21 09:51:19.870 AMtracechanged?- sp:false, hsp:false, csp:false, os:false
dev:8792023-09-21 09:51:19.862 AMtraceupdateSetpoints params- sp:null, hsp:20.0, csp:null, os:heat
dev:8792023-09-21 09:51:19.855 AMdebuggetHeatingSetpointResult:20
dev:8792023-09-21 09:51:19.848 AMdebugdescMap: [raw:DF270102010C120029D007, dni:DF27, endpoint:01, cluster:0201, size:0C, attrId:0012, encoding:29, command:01, value:07D0, clusterInt:513, attrInt:18]
dev:8792023-09-21 09:51:19.566 AMinfoUpstairs thermostatSetpoint was set to 20.0°C
dev:8792023-09-21 09:51:19.559 AMinfoUpstairs heatingSetpoint was set to 20.0°C
dev:8792023-09-21 09:51:19.551 AMtracechanged?- sp:false, hsp:true, csp:false, os:false
dev:8792023-09-21 09:51:19.544 AMtraceupdateSetpoints params- sp:null, hsp:20.0, csp:null, os:heat
dev:8792023-09-21 09:51:19.537 AMdebuggetHeatingSetpointResult:20
dev:8792023-09-21 09:51:19.530 AMdebugdescMap: [raw:DF270102010C120029D007, dni:DF27, endpoint:01, cluster:0201, size:0C, attrId:0012, encoding:29, command:01, value:07D0, clusterInt:513, attrInt:18]
dev:8792023-09-21 09:51:16.306 AMinfosetHeatingSetpoint(20)
dev:8792023-09-21 09:51:08.169 AMinfosetHeatingSetpoint(20)
dev:8792023-09-21 09:51:04.888 AMtracechanged?- sp:false, hsp:false, csp:false, os:false
dev:8792023-09-21 09:51:04.880 AMtraceupdateSetpoints params- sp:null, hsp:21.0, csp:null, os:heat
dev:8792023-09-21 09:51:04.873 AMdebuggetHeatingSetpointResult:21
dev:8792023-09-21 09:51:04.858 AMdebugdescMap: [raw:DF270102010C1200293408, dni:DF27, endpoint:01, cluster:0201, size:0C, attrId:0012, encoding:29, command:01, value:0834, clusterInt:513, attrInt:18]
dev:8792023-09-21 09:50:57.754 AMtracechanged?- sp:false, hsp:false, csp:false, os:true
dev:8792023-09-21 09:50:57.740 AMtraceupdateSetpoints params- sp:null, hsp:null, csp:null, os:heating
dev:8792023-09-21 09:50:57.730 AMinfoUpstairs thermostatOperatingState is heating [stage 1]
dev:8792023-09-21 09:50:57.719 AMdebuggetThermostatOperatingStateResult: 5
dev:8792023-09-21 09:50:57.709 AMdebugdescMap: [raw:DF270102010A2900190500, dni:DF27, endpoint:01, cluster:0201, size:0A, attrId:0029, encoding:19, command:0A, value:0005, clusterInt:513, attrInt:41]
dev:8792023-09-21 09:50:57.671 AMtracechanged?- sp:false, hsp:false, csp:false, os:false
dev:8792023-09-21 09:50:57.662 AMtraceupdateSetpoints params- sp:null, hsp:21.0, csp:null, os:heat
dev:8792023-09-21 09:50:57.645 AMdebuggetHeatingSetpointResult:21
dev:8792023-09-21 09:50:57.636 AMdebugdescMap: [raw:DF270102010C1200293408, dni:DF27, endpoint:01, cluster:0201, size:0C, attrId:0012, encoding:29, command:01, value:0834, clusterInt:513, attrInt:18]
dev:8792023-09-21 09:50:56.156 AMtracechanged?- sp:false, hsp:false, csp:false, os:false
dev:8792023-09-21 09:50:56.149 AMtraceupdateSetpoints params- sp:null, hsp:21.0, csp:null, os:heat
dev:8792023-09-21 09:50:56.139 AMdebuggetHeatingSetpointResult:21
dev:8792023-09-21 09:50:56.132 AMdebugdescMap: [raw:DF270102010C1200293408, dni:DF27, endpoint:01, cluster:0201, size:0C, attrId:0012, encoding:29, command:01, value:0834, clusterInt:513, attrInt:18]
dev:8792023-09-21 09:50:56.076 AMtracechanged?- sp:false, hsp:false, csp:false, os:false
dev:8792023-09-21 09:50:56.066 AMtraceupdateSetpoints params- sp:null, hsp:21.0, csp:null, os:heat
dev:8792023-09-21 09:50:56.055 AMdebuggetHeatingSetpointResult:21
dev:8792023-09-21 09:50:56.048 AMdebugdescMap: [raw:DF270102010C1200293408, dni:DF27, endpoint:01, cluster:0201, size:0C, attrId:0012, encoding:29, command:01, value:0834, clusterInt:513, attrInt:18]
dev:8792023-09-21 09:50:55.863 AMtracechanged?- sp:false, hsp:false, csp:false, os:false
dev:8792023-09-21 09:50:55.835 AMtraceupdateSetpoints params- sp:null, hsp:21.0, csp:null, os:heat
dev:8792023-09-21 09:50:55.804 AMdebuggetHeatingSetpointResult:21
dev:8792023-09-21 09:50:55.785 AMdebugdescMap: [raw:DF270102010C1200293408, dni:DF27, endpoint:01, cluster:0201, size:0C, attrId:0012, encoding:29, command:01, value:0834, clusterInt:513, attrInt:18]
dev:8792023-09-21 09:50:55.709 AMinfoUpstairs thermostatSetpoint was set to 21.0°C
dev:8792023-09-21 09:50:55.701 AMinfoUpstairs coolingSetpoint was set to 23.0°C
dev:8792023-09-21 09:50:55.690 AMinfoUpstairs heatingSetpoint was set to 21.0°C
dev:8792023-09-21 09:50:55.682 AMtracechanged?- sp:false, hsp:true, csp:false, os:false
dev:8792023-09-21 09:50:55.674 AMtraceupdateSetpoints params- sp:null, hsp:21.0, csp:null, os:heat
dev:8792023-09-21 09:50:55.666 AMdebuggetHeatingSetpointResult:21
dev:8792023-09-21 09:50:55.659 AMdebugdescMap: [raw:DF270102010A1200293408, dni:DF27, endpoint:01, cluster:0201, size:0A, attrId:0012, encoding:29, command:0A, value:0834, clusterInt:513, attrInt:18]
dev:8792023-09-21 09:50:51.965 AMinfosetHeatingSetpoint(21)

Notice how the thermostat setpoint now matches the heating setpoint and it didnt previously. The cooling setpoint also updated and I didnt touch that.
My Downstairs stat only controls heating, vs upstairs which does heating and cooling (reverse cycle AC) so I dont think it is a fair comparision.
We run our upstairs system in Auto mode overnight, when it's been a warm day and it'll be a cool night, with a min/max temp and im wondering if this has anything to do with it. As in, the driver isn't handling the changeover properly.