Multizone thermostat incl various control options

Finally I’ve got it working again by removing filterpy as requirement and removing all scipy functions. I’ve also did some code cleaning and tested it in HA/core. The new version is available via github updated version.

This week I’ve been testing the new version in a 6 zone configuration en seems to run without problems.

During boot there may be several warnings in HA log when sensors or switches are not ready yet. When the sensor and/or switch is ‘online’ it should change to normal operation mode on its own.

Extract of my log of a single zone

2021-11-10 22:59:41 INFO (MainThread) [multizone_thermostat.woonkamer] initialise: woonkamer
2021-11-10 22:59:41 INFO (MainThread) [multizone_thermostat.woonkamer.heat] Config hvac settings for mode : heat
...
2021-11-10 22:59:41 INFO (MainThread) [multizone_thermostat.woonkamer] init thermostat
2021-11-10 22:59:41 INFO (MainThread) [multizone_thermostat.woonkamer] restore old controller settings
2021-11-10 22:59:41 INFO (MainThread) [multizone_thermostat.woonkamer.heat.pid] forcing new integral: 0.0
2021-11-10 22:59:41 INFO (MainThread) [multizone_thermostat.woonkamer] HVAC mode changed to heat
2021-11-10 22:59:41 INFO (MainThread) [multizone_thermostat.woonkamer] HVAC mode heat
2021-11-10 22:59:41 INFO (MainThread) [multizone_thermostat.woonkamer] new sensor filter mode for heat to: 4
2021-11-10 22:59:41 INFO (MainThread) [multizone_thermostat.woonkamer] new sensor filter mode (4) but no temperature reading for heat
2021-11-10 22:59:41 INFO (MainThread) [multizone_thermostat.woonkamer] new sensor filter mode for heat to: 4
2021-11-10 22:59:41 INFO (MainThread) [multizone_thermostat.woonkamer] new sensor filter mode (4) but no temperature reading for heat
2021-11-10 22:59:41 INFO (MainThread) [multizone_thermostat.woonkamer] new sensor filter mode for heat to: 4
2021-11-10 22:59:41 INFO (MainThread) [multizone_thermostat.woonkamer] new sensor filter mode (4) but no temperature reading for heat
2021-11-10 22:59:41 WARNING (MainThread) [multizone_thermostat.woonkamer] Current temp is None, cannot compare with target
...
2021-11-10 22:59:42 INFO (MainThread) [multizone_thermostat.woonkamer] new sensor filter mode for heat to: 4

When I have some time the next weeks I’ll check if the boot warnings can be improved/limited.

1 Like

Perfect!!!

I’m running it now as we speak!!!

Great Job

Ah nice. Good too hear it finally running! Let me know if you have feedback.

Hello, I’m trying to understand how multi-zone work. What is the advantage of a multi-zone thermostat (with master and slaves) vs standalone thermostat ?

Good question.
In the most basic from a house has a single, in the livingroom positioned, thermostat. This will try to keep the livingroom at the chosen setpoint by switching the heater (gas heater, distric heating, heat pump etc). The heating of all other rooms depend on the heat requiment of the livingroom.

This can be upgraded by valves and thermostat per room to have better control per room. This is heating individually per zone/room.

Some systems still use the main thermostat (most likely the livingroom) as primary switch to control the heater. In this case, when a secondary room needs heating, it still depends on the main thermostat: when the main thermostat does not require heat there will be no heater activity thus the secondary room will warm up.

One of the operation modes of the multizone thermostat uses the weighted average of all rooms (satellites) heat requirement plus setpoints to determine the temperature error. This error can be used to control the heater.

In total three control options are available for the master which are:

  • weather (heat requirement depending outdoor temperature)
  • PID based on weighted room temps+setpoints
  • PID based on max valve position of all satellites (extra heat when satellite valve is opened too much. This means there is a lot of required heat for that room)

Each satellite has the same control options except PID on valve position.

Edit:
This part is only the software operation. Please check if hardware modifications to you’re heating system are required! For instance: maybe the system needs to be equipped with a bypass valve to handle situations where too much valves are closed but still heat is required.

Thanks for this explanation. I’ve implemented multi zone thermostat based on markferry work.

Expect the fact that I can change generic thermostat with PID thermostat, I’m still trying to find an advantage of you solution versus the other one

Hello, is it possible to configure a minimum cycle duration for a gas boiler in a proportional mode ?

I think it’s minimal_diff , but don’t know how to use it

Hi Edouard,

I was not familiar with this topic thus cannot say directly which one you should use. There seem to be several variations which were created more or less at the same time period.

The main advantage of my version (for me at least) is that I control the main valve based on outdoor temperature (by linear trend) which directly compensates the heat loss. This is further adjusted by the max valve opening of each zone and the average room-setpoint temp scaled by room size.
Furthermore the satelite states are updated tot the master, and numerous adjustments can be made.

For me it is providing all options and insight for setting up - tuning of my heating system. But best is to try several versions to se which one fits you best.

Yes it should be minimal_diff. I think this should work:

  - platform: multizone_thermostat
    name: pid
    unique_id: mz_pid
    sensor: sensor.fake_sensor_1
    sensor_filter: 4
    initial_hvac_mode: "off"
    initial_preset_mode: "none"
    room_area: 60
    precision: 0.1
    sensor_stale_duration:
      hours: 3
    passive_switch_check: True
    heat:
      entity_id: input_number.fake_pwm_heat
      passive_switch_duration:
        hours: 5
      min_temp: 15
      max_temp: 24
      initial_target_temp: 21
      away_temp: 12
      proportional_mode:
        control_interval:
          seconds: 100
        difference: 100
        pwm:
          seconds: 600
        minimal_diff: 5
        PID_mode:
          kp: 30
          ki: 0.003
          kd: -24000
          window_open_tempdrop: -3.6

This example has a control range of 0 to 100 and should result in switch activation when control value is above 5.

I just made a big update to the code. If you have some issues please try the new version.

Thanks a lot, I will try the new version.

Just released an update as the previous version did not properly initiate the temperature filter.
see version 0.4.1 bugfixes for more details

Hey @axax
I used adrien.b 's PID Thermostat, but wanted to try something different, since I run multi zone heating. Previously, I just used automation outside of thermostat to determine if main switch should be on/off (this gives signal to heat pump to heat). With 7 different zones, there were times when one zone stopped heating, heater went off, and few minutes later, there was demand from other zone, so it started again. Not the end of the world, but not ideal for heatpump either, so I wanted to see how yours behave.

First of all, any news on if or when this will be included in HACS repository?

Secondly, I literally just deployed it, mostly followed examples as I am bit confused which values do what. The documentation isn’t greatest :slight_smile: But I noticed that some room, despite being 0,2 degrees below setpoint, did not change hvac action to heating.

Also, I don’t quite get the % of valve opened. I have simple on/off valves (NC), that open when zones need heat. My main switch is just signal for heat pump to start heating.

I tried to use room area ratio, not sure I got that right. Below is my config.
Any recommendations you can suggest? I have underfloor heating, which is really slow to react. With adrien’s PID thermostat, I used following settings:

  kp : 100
  ki : 0.003
  kd : 220000
  ke: 0.588
  pwm : 02:00:00
  sampling_period: 00:10:00

But in your multizone, I kept the default you suggested for underfloor heating:

- platform: multizone_thermostat
  name: master_thermostat
  sensor_out: sensor.espaltherma_outside
  sensor_filter: 3
  initial_hvac_mode: "off"
  initial_preset_mode: "none"
  precision: 0.1
  heat:
    entity_id: switch.heat_pump_switch
    initial_target_temp: 20
    away_temp: 17
    proportional_mode:
      control_interval:
        seconds: 60
      difference: 100
      minimal_diff: 5
      pwm:
        seconds: 600
      PID_mode:
        kp: 3
        ki: 0
        kd: 0
      weather_mode:
        ka: 2
        kb: -6
      MASTER_mode:
        satelites: [living_room, guest_room, bathroom, office, master_bathroom, master_bedroom, kids_room]
        goal: 150
        kp: -0.15
        ki: 0
        kd: 0
  sensor_stale_duration:
    hours: 12
  restore_from_old_state: True
  restore_parameters: False
  restore_integral: True

- platform: multizone_thermostat
  name: living_room
  sensor: sensor.aerq_temperature_and_humidity_sensor_v2_0_air_temperature_7
  sensor_filter: 3
  initial_hvac_mode: "off"
  initial_preset_mode: "none"
  room_area: 40
  precision: 0.1
  heat:
    entity_id: switch.underfloor_heating_ground_floor
    min_temp: 17
    max_temp: 28
    initial_target_temp: 20
    away_temp: 17
    proportional_mode:
      control_interval:
        seconds: 60
      difference: 100
      minimal_diff: 5
      pwm:
        seconds: 180
      PID_mode:
        kp: 30
        ki: 0.005
        kd: -24000
  sensor_stale_duration:
    hours: 12
  restore_from_old_state: True
  restore_parameters: False
  restore_integral: True

- platform: multizone_thermostat
  name: guest_room
  sensor: sensor.aerq_temperature_and_humidity_sensor_v2_0_air_temperature_5
  sensor_filter: 3
  initial_hvac_mode: "off"
  initial_preset_mode: "none"
  room_area: 20
  precision: 0.1
  heat:
    entity_id: switch.underfloor_heating_ground_floor_2
    min_temp: 17
    max_temp: 28
    initial_target_temp: 20
    away_temp: 17
    proportional_mode:
      control_interval:
        seconds: 60
      difference: 100
      minimal_diff: 5
      pwm:
        seconds: 180
      PID_mode:
        kp: 30
        ki: 0.005
        kd: -24000
  sensor_stale_duration:
    hours: 12
  restore_from_old_state: True
  restore_parameters: False
  restore_integral: True

- platform: multizone_thermostat
  name: bathroom
  sensor: sensor.aerq_temperature_and_humidity_sensor_v2_0_air_temperature_6
  sensor_filter: 3
  initial_hvac_mode: "off"
  initial_preset_mode: "none"
  room_area: 10
  precision: 0.1
  heat:
    entity_id: switch.underfloor_heating_ground_floor_3
    min_temp: 17
    max_temp: 28
    initial_target_temp: 20
    away_temp: 17
    proportional_mode:
      control_interval:
        seconds: 60
      difference: 100
      minimal_diff: 5
      pwm:
        seconds: 180
      PID_mode:
        kp: 30
        ki: 0.005
        kd: -24000
  sensor_stale_duration:
    hours: 12
  restore_from_old_state: True
  restore_parameters: False
  restore_integral: True

- platform: multizone_thermostat
  name: office
  sensor: sensor.aerq_temperature_and_humidity_sensor_v2_0_air_temperature
  sensor_filter: 3
  initial_hvac_mode: "off"
  initial_preset_mode: "none"
  room_area: 20
  precision: 0.1
  heat:
    entity_id: switch.underfloor_heating_1st_floor_4
    min_temp: 17
    max_temp: 28
    initial_target_temp: 20
    away_temp: 17
    proportional_mode:
      control_interval:
        seconds: 60
      difference: 100
      minimal_diff: 5
      pwm:
        seconds: 180
      PID_mode:
        kp: 30
        ki: 0.005
        kd: -24000
  sensor_stale_duration:
    hours: 12
  restore_from_old_state: True
  restore_parameters: False
  restore_integral: True

- platform: multizone_thermostat
  name: master_bathroom
  sensor: sensor.aerq_temperature_and_humidity_sensor_v2_0_air_temperature_2
  sensor_filter: 3
  initial_hvac_mode: "off"
  initial_preset_mode: "none"
  room_area: 20
  precision: 0.1
  heat:
    entity_id: switch.underfloor_heating_1st_floor
    min_temp: 17
    max_temp: 28
    initial_target_temp: 20
    away_temp: 17
    proportional_mode:
      control_interval:
        seconds: 60
      difference: 100
      minimal_diff: 5
      pwm:
        seconds: 180
      PID_mode:
        kp: 30
        ki: 0.005
        kd: -24000
  sensor_stale_duration:
    hours: 12
  restore_from_old_state: True
  restore_parameters: False
  restore_integral: True

- platform: multizone_thermostat
  name: master_bedroom
  sensor: sensor.aerq_temperature_and_humidity_sensor_v2_0_air_temperature_3
  sensor_filter: 3
  initial_hvac_mode: "off"
  initial_preset_mode: "none"
  room_area: 20
  precision: 0.1
  heat:
    entity_id: switch.underfloor_heating_1st_floor_2
    min_temp: 17
    max_temp: 28
    initial_target_temp: 20
    away_temp: 17
    proportional_mode:
      control_interval:
        seconds: 60
      difference: 100
      minimal_diff: 5
      pwm:
        seconds: 180
      PID_mode:
        kp: 30
        ki: 0.005
        kd: -24000
  sensor_stale_duration:
    hours: 12
  restore_from_old_state: True
  restore_parameters: False
  restore_integral: True

- platform: multizone_thermostat
  name: kids_room
  sensor: sensor.aerq_temperature_and_humidity_sensor_v2_0_air_temperature_4
  sensor_filter: 3
  initial_hvac_mode: "off"
  initial_preset_mode: "none"
  room_area: 20
  precision: 0.1
  heat:
    entity_id: switch.underfloor_heating_1st_floor_3
    min_temp: 17
    max_temp: 28
    initial_target_temp: 20
    away_temp: 17
    proportional_mode:
      control_interval:
        seconds: 60
      difference: 100
      minimal_diff: 5
      pwm:
        seconds: 180
      PID_mode:
        kp: 30
        ki: 0.005
        kd: -24000
  sensor_stale_duration:
    hours: 12
  restore_from_old_state: True
  restore_parameters: False
  restore_integral: True

Hi Stomko,

I intended to send just a short explanation but it gradually increased so hope it makes still some sense. :wink:

First of all, any news on if or when this will be included in HACS repository?

It is. You can add the repository as custom repository. I did not include it (yet) in the standard due to the complex operation, config and possible consequence when used not correctly.

Secondly, I literally just deployed it, mostly followed examples as I am bit confused which values do what. The documentation isn’t greatest :slight_smile:

If you are willing to spend some time, could you create a new issue in github (or by any other way) give me some feedback what needs further updates/improvement. Maybe after you’ve concluded this thermostat works for you or not?

But I noticed that some room, despite being 0,2 degrees below setpoint, did not change hvac action to heating.

I expect it might start with a warning and in emergency mode as it waits for a first update of the temperature reading (indoor and/or outdoor depending the config). The pwm and control routine loop independantly of each other. The control value is calculated each control_interval and each sensor (in- or outdoor) change. The pwm loop is checking each 1/10 of the pwm set interval when pwm > 0. The control value (valve_pos) is used in the pwm loop operation (duration open/close).
It could therefore take a short moment to actually see it acting. In your case I think the following should occur:

  1. thermostat starts with a warning
  2. control value update by control_interval
  3. no change due to no latest sensor change
  4. loop 2-3 until a receive of temperature sensor update
  5. update control value
  6. pwm loop updated

Check the attributes of the climate entity and search for valve_pos. This value will be between 0-100 and defines the valve on-off time ratio. Thus as soon this value is larger than 0 your valve should be switched on within the pwm defined period. When the valve_posis less than specified minimal_diff the valve is not switched on to avoid short activations.
Note several valve_pos could be present: one per control mode (*_valve_pos) and a combined (summed) as valve_pos. The latter is used for the pwm.

Also, I don’t quite get the % of valve opened. I have simple on/off valves (NC), that open when zones need heat. My main switch is just signal for heat pump to start heating.

In case pwm is not specified or as pwm = 0 it gives a numerical value as output instead of switching a switch between on-off. I have for instance a radiator valve which requires a valve position.
Another use could be for instance to use the weather_mode in combination with pwm=0 to output a required water temperature of the heating system.

Regarding your config, in general it seems to be oke. You can use your own PID values and interval times. In my config I use the weather mode to control the main valve and did not include it in the room thermostats to avoid control interference. as it would amplify the weahter compensation.

See the modified example below.

You could start with all restore_* = False to assure a clean start.

- platform: multizone_thermostat
  name: master_thermostat
  sensor_out: sensor.espaltherma_outside
  sensor_filter: 3
  initial_hvac_mode: "off"
  initial_preset_mode: "none"
  precision: 0.1
  heat:
    entity_id: switch.heat_pump_switch
    initial_target_temp: 20
    away_temp: 17
    proportional_mode:
      control_interval:
        seconds: 180
      difference: 100
      minimal_diff: 5
      pwm:
        seconds: 600
      PID_mode:
        kp: 3
        ki: 0
        kd: 0
      weather_mode:
        ka: 2
        kb: -6
      MASTER_mode:
        satelites: [living_room, guest_room, bathroom, office, master_bathroom, master_bedroom, kids_room]
        goal: 80
        kp: -0.15
        ki: 0
        kd: 0
  sensor_stale_duration:
    hours: 12
  restore_from_old_state: False
  restore_parameters: False
  restore_integral: False

- platform: multizone_thermostat
  name: living_room
  sensor: sensor.aerq_temperature_and_humidity_sensor_v2_0_air_temperature_7
  sensor_filter: 3
  initial_hvac_mode: "off"
  initial_preset_mode: "none"
  room_area: 40
  precision: 0.1
  heat:
    entity_id: switch.underfloor_heating_ground_floor
    min_temp: 17
    max_temp: 28
    initial_target_temp: 20
    away_temp: 17
    proportional_mode:
      control_interval:
        seconds: 600
      difference: 100
      minimal_diff: 5
      pwm:
        hours: 2
      PID_mode:
        kp: 100
        ki: 0.003
        kd: -220000
  sensor_stale_duration:
    hours: 12
  restore_from_old_state: False
  restore_parameters: False
  restore_integral: False

- platform: multizone_thermostat
  name: guest_room
  sensor: sensor.aerq_temperature_and_humidity_sensor_v2_0_air_temperature_5
  sensor_filter: 3
  initial_hvac_mode: "off"
  initial_preset_mode: "none"
  room_area: 20
  precision: 0.1
  heat:
    entity_id: switch.underfloor_heating_ground_floor_2
    min_temp: 17
    max_temp: 28
    initial_target_temp: 20
    away_temp: 17
    proportional_mode:
      control_interval:
        seconds: 600
      difference: 100
      minimal_diff: 5
      pwm:
        hours: 2
      PID_mode:
        kp: 100
        ki: 0.003
        kd: -220000
  sensor_stale_duration:
    hours: 12
  restore_from_old_state: False
  restore_parameters: False
  restore_integral: False

- platform: multizone_thermostat
  name: bathroom
  sensor: sensor.aerq_temperature_and_humidity_sensor_v2_0_air_temperature_6
  sensor_filter: 3
  initial_hvac_mode: "off"
  initial_preset_mode: "none"
  room_area: 10
  precision: 0.1
  heat:
    entity_id: switch.underfloor_heating_ground_floor_3
    min_temp: 17
    max_temp: 28
    initial_target_temp: 20
    away_temp: 17
    proportional_mode:
      control_interval:
        seconds: 600
      difference: 100
      minimal_diff: 5
      pwm:
        hours: 2
      PID_mode:
        kp: 100
        ki: 0.003
        kd: -220000
  sensor_stale_duration:
    hours: 12
  restore_from_old_state: False
  restore_parameters: False
  restore_integral: False

- platform: multizone_thermostat
  name: office
  sensor: sensor.aerq_temperature_and_humidity_sensor_v2_0_air_temperature
  sensor_filter: 3
  initial_hvac_mode: "off"
  initial_preset_mode: "none"
  room_area: 20
  precision: 0.1
  heat:
    entity_id: switch.underfloor_heating_1st_floor_4
    min_temp: 17
    max_temp: 28
    initial_target_temp: 20
    away_temp: 17
    proportional_mode:
      control_interval:
        seconds: 600
      difference: 100
      minimal_diff: 5
      pwm:
        hours: 2
      PID_mode:
        kp: 100
        ki: 0.003
        kd: -220000
  sensor_stale_duration:
    hours: 12
  restore_from_old_state: False
  restore_parameters: False
  restore_integral: False

- platform: multizone_thermostat
  name: master_bathroom
  sensor: sensor.aerq_temperature_and_humidity_sensor_v2_0_air_temperature_2
  sensor_filter: 3
  initial_hvac_mode: "off"
  initial_preset_mode: "none"
  room_area: 20
  precision: 0.1
  heat:
    entity_id: switch.underfloor_heating_1st_floor
    min_temp: 17
    max_temp: 28
    initial_target_temp: 20
    away_temp: 17
    proportional_mode:
      control_interval:
        seconds: 600
      difference: 100
      minimal_diff: 5
      pwm:
        hours: 2
      PID_mode:
        kp: 100
        ki: 0.003
        kd: -220000
  sensor_stale_duration:
    hours: 12
  restore_from_old_state: False
  restore_parameters: False
  restore_integral: False

- platform: multizone_thermostat
  name: master_bedroom
  sensor: sensor.aerq_temperature_and_humidity_sensor_v2_0_air_temperature_3
  sensor_filter: 3
  initial_hvac_mode: "off"
  initial_preset_mode: "none"
  room_area: 20
  precision: 0.1
  heat:
    entity_id: switch.underfloor_heating_1st_floor_2
    min_temp: 17
    max_temp: 28
    initial_target_temp: 20
    away_temp: 17
    proportional_mode:
      control_interval:
        seconds: 600
      difference: 100
      minimal_diff: 5
      pwm:
        hours: 2
      PID_mode:
        kp: 100
        ki: 0.003
        kd: -220000
  sensor_stale_duration:
    hours: 12
  restore_from_old_state: False
  restore_parameters: False
  restore_integral: False

- platform: multizone_thermostat
  name: kids_room
  sensor: sensor.aerq_temperature_and_humidity_sensor_v2_0_air_temperature_4
  sensor_filter: 3
  initial_hvac_mode: "off"
  initial_preset_mode: "none"
  room_area: 20
  precision: 0.1
  heat:
    entity_id: switch.underfloor_heating_1st_floor_3
    min_temp: 17
    max_temp: 28
    initial_target_temp: 20
    away_temp: 17
    proportional_mode:
      control_interval:
        seconds: 600
      difference: 100
      minimal_diff: 5
      pwm:
        hours: 2
      PID_mode:
        kp: 100
        ki: 0.003
        kd: -220000
  sensor_stale_duration:
    hours: 12
  restore_from_old_state: False
  restore_parameters: False
  restore_integral: False

some explanation for the “master_thermostat”. All combinations are here possible iwth or without PID_mode, weather_mode and (goal,kp,ki,kd) in MASTER_mode.

      PID_mode:
        kp: 3
        ki: 0
        kd: 0

fine tuning of weather_mode. This reacts to the averaged (by room area) setpoints and room temps to change in my case the main
valve on-off time. It gives extra or less valve_pos depending the error between avg setpoint and room temps.

      weather_mode:
        ka: 2
        kb: -6

In this case the main controller of the valve_pos by outside temperature and averaged (by room area) room temps. valve_pos= dT*ka + kb

      MASTER_mode:
        satelites: [living_room, guest_room, bathroom, office, master_bathroom, master_bedroom, kids_room]

Marker that this is the master thermostat. Specify which rooms to use for averaging. Only those which have the same preset mode (heat or cool) will be included. When preset mode is different (for instance master at heat and rooms at cool or off are excluded).

        goal: 80
        kp: -0.15
        ki: 0
        kd: 0

In this case fine tuning of weather_mode. Adjust the valve_pos to get max valve opening of all included rooms at goal = 80 (max of valve_pos per room).

So you could use alternative config options. Note that I did not test these variations myself.

Examples are:

  1. only weather mode
- platform: multizone_thermostat
  name: master_thermostat
  sensor_out: sensor.espaltherma_outside
  sensor_filter: 3
  initial_hvac_mode: "off"
  initial_preset_mode: "none"
  precision: 0.1
  heat:
    entity_id: switch.heat_pump_switch
    initial_target_temp: 20
    away_temp: 17
    proportional_mode:
      control_interval:
        seconds: 180
      difference: 100
      minimal_diff: 5
      pwm:
        seconds: 600
      weather_mode:
        ka: 2
        kb: -6
      MASTER_mode:
        satelites: [living_room, guest_room, bathroom, office, master_bathroom, master_bedroom, kids_room]
  sensor_stale_duration:
    hours: 12
  restore_from_old_state: False
  restore_parameters: False
  restore_integral: False
  1. Try to acihieve max 80% opening (expect it would result in max flow in one room thus minimum water temperature) and per room PID and optionally weather compensation.
    master mode only
- platform: multizone_thermostat
  name: master_thermostat
  sensor_out: sensor.espaltherma_outside
  sensor_filter: 3
  initial_hvac_mode: "off"
  initial_preset_mode: "none"
  precision: 0.1
  heat:
    entity_id: switch.heat_pump_switch
    initial_target_temp: 20
    away_temp: 17
    proportional_mode:
      control_interval:
        seconds: 180
      difference: 100
      minimal_diff: 5
      pwm:
        seconds: 600
      MASTER_mode:
        satelites: [living_room, guest_room, bathroom, office, master_bathroom, master_bedroom, kids_room]
        goal: 80
        kp: -2
        ki: -0.0001
        kd: 100000
  sensor_stale_duration:
    hours: 12
  restore_from_old_state: False
  restore_parameters: False
  restore_integral: False

3)master by PID only. thus operating on averaged setpoints and room temps.

- platform: multizone_thermostat
- platform: multizone_thermostat
  name: master_thermostat
  sensor_out: sensor.espaltherma_outside
  sensor_filter: 3
  initial_hvac_mode: "off"
  initial_preset_mode: "none"
  precision: 0.1
  heat:
    entity_id: switch.heat_pump_switch
    initial_target_temp: 20
    away_temp: 17
    proportional_mode:
      control_interval:
        seconds: 180
      difference: 100
      minimal_diff: 5
      pwm:
        seconds: 600
      PID_mode:
        kp: 3
        ki: 0
        kd: 0
      MASTER_mode:
        satelites: [living_room, guest_room, bathroom, office, master_bathroom, master_bedroom, kids_room]
  sensor_stale_duration:
    hours: 12
  restore_from_old_state: False
  restore_parameters: False
  restore_integral: False

Thanks. I have created issue #13 on github. Thanks for helping out.

I did update the issue #13 on github. I am not able to reliably get satellites to operate, and trigger master when needed. Can anyone suggest what am I doing wrong?

Hi, I have read the documentation and I still doubt whether this would be a solution for me.

My situation is that I have may floor heating segments with electric valves and I have a wired temperature sensor in each room. I currently control the system with one HASS generic thermostat for each room. The boiler is weather-controlled, so I don’t have any central thermostat; it just sets the water temperature based on the outside temperature. And once an open floor heating valve is detected (because there is water flow), the boiler starts running.

This is currently working OK, but now the boiler starts heating even if only one small room demands heat, which is very inefficient. Therefore, I would like the demand to be more “clustered”, so the room thermostats to also take into account the hystereses of other rooms. So the small room only starts heating when another big room also is.

Would that be achieved with this solution?

The requested functionality is not possible with the multizone thermostat. Each room thermostat operates independently and has no knowledge of the others or its state. Only the master thermostat uses the states of the room thermostats.
What you could try is switch the boiler heating depending the maximum valve opening (time) of all room thermostats. I guess this however means that you have to bypass the current boiler heating flow trigger and replace the pump operation with the multizone ‘master’ thermostat. This has as downside that if for al long duration one or multiple room thermostats ask for none or limited heat ( low valve opening (time)) it could cool down or drain the heat from the boiler without triggering heating as there is not sufficient flow?

1 Like

Hello, I have a NO head, i.e. normally open. I made such a thermostat but it works the other way around. Can you somehow reverse the operation of the head?

HI. This is not yet possible but can be implemented in a near future update. You could have look to PID thermostat if you need it right now.

Thanks for your reply, when will there be an update? is it possible to add a motion sensor, where after detecting inactivity for some time it will lower the temperature, e.g. by 3 degrees Celsius?