Bonjour,
en effet ça peut aider.
Alors de base, le principe d’un PID à double boucle ou encore PID en cascade :
Les avantages de la régulation en cascade | Watlow .
d’origine, mon code sous Arduino ressemblait à ça :
float TempAdjust = -2;
float LastRoomHum = 0;
float temperaturePiece = 0;
float CorrectedPartTemp = 0;
float HeatTemp = 0;
constexpr float pasDeLaConsigne = 0.50; // 0.5°C par cran
float consignePiece = 23;
constexpr float HeatTempMax = 40;
// PID
double entreePiece, sortiePiece, consignePIDPiece;
double kpPiece = 1, kiPiece = 0.5, kdPiece = 1;
double entreeChauffe, HeatOutput, consignePIDChauffe;
double kpChauffe = 2, kiChauffe = 0.8, kdChauffe = 4;
PID pidPiece(&entreePiece, &sortiePiece, &consignePIDPiece, kpPiece, kiPiece, kdPiece, DIRECT);
PID pidChauffe(&entreeChauffe, &HeatOutput, &consignePIDChauffe, kpChauffe, kiChauffe, kdChauffe, DIRECT);
void calculPID() {
entreePiece = temperaturePiece;
consignePIDPiece = consignePiece;
pidPiece.Compute();
consignePIDChauffe = sortiePiece;
if (consignePIDChauffe > HeatTempMax) {
consignePIDChauffe = HeatTempMax;
}
entreeChauffe = HeatTemp;
pidChauffe.Compute();
}
l’idée est d’utiliser ce composant :
Donc en gros, en travaillant mon code à partir de la doc amis aussi de perplexity.ai (je ne suis pas un programmeur fou) :
# Consignes modifiables HA/local (step 0.5)
number:
- platform: template
name: "Temp Consigne"
id: temp_consigne
min_value: 15
max_value: 30
step: 0.5
initial_value: 25
optimistic: true
update_interval: never
- platform: template
name: "Heater Max Temp"
id: heater_max_temp
min_value: 30
max_value: 50
step: 1
initial_value: 35
optimistic: true
update_interval: never
# PID interne: limite Temp_Heater (output: PWM)
climate:
- platform: pid
name: "PID Heater Limit"
id: pid_inner
sensor: temp_heater
heat_output: pwm_heater
control_parameters:
kp: 10
ki: 1
kd: 0.1
autotune_action:
- climate.pid.autotune
# PID externe: Temp ambiante → target pour inner PID
- platform: pid
name: "PID Ambient Control"
id: pid_outer
sensor: temp
heat_output: target_setter # Custom cascade
control_parameters:
kp: 5
ki: 0.5
kd: 0.05
autotune_action:
- climate.pid.autotune
# Cascade: PID outer → target inner PID
output:
- platform: template
id: target_setter
type: float
write_action:
- climate.control:
id: pid_inner
target_temperature: !lambda 'return state;'
# Mise à jour consignes PID toutes les 10s
interval:
- interval: 10s
then:
- climate.control:
id: pid_outer
target_temperature: !lambda 'return id(temp_consigne).state;'
- climate.control:
id: pid_inner
target_temperature: !lambda 'return id(heater_max_temp).state;'
Mais je voulais avoir votre avis parce que je comprends pas encore le fonctionnement du YAML et de ESPHOME. et dans ce code, est ce bien cette boucle (Interval) qui pilote la mise à jour des consignes ?