Hi Stomko,
I intended to send just a short explanation but it gradually increased so hope it makes still some sense.
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
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:
- thermostat starts with a warning
- control value update by
control_interval
- no change due to no latest sensor change
- loop 2-3 until a receive of temperature sensor update
- update control value
- 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_pos
is 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:
- 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
- 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