Smart Thermostat - le chauffage contrôlé par PID

On peut encore les laisser dans la configuration YAML, au reboot les dernières valeurs utilisées sont restaurées. Le fichier de configuration n’est alors utilisé qu’en cas de suppression ou corruption de la base de données de Home Assistant. Donc autant copier dans le YAML les valeurs de température et de gains PID une fois le bon réglage trouvé.

Pour la base de données avec des exemples, j’y pense, mais il faudrait un retour des utilisateurs de l’intégration avec le type d’installation et les réglages utilisés.

Une des prochaines étapes est de pouvoir démarrer et arrêter l’autotune sans devoir redémarrer Home Assistant, et pouvoir forcer une analyse pour plus de flexibilité. Associé à un mode PID Off ça permettrait de faire une mesure et de sortir des coefficients de base en quelques heures à peine.

1 « J'aime »

Hello encore :slight_smile:
Autre question : j’ai du mal à comprendre la différence dans les paramètres entre le keep_alive, et le pwm…

J’avais mis un keep_alive à 1min comme dans l’« exemple » et un pwm à 10min pour avoir 6 périodes dans 1h, mais je me retrouve avec mes chauffages qui s’allument parfois pendant 30s toutes les 2min… Si je ne dis pas de bêtise, quand le thermostat donne une puissance de 10%, il est sensé lancer la chauffe durant 1min sur les 10min du PWM, et attendre le cycle suivant pour relancer une chauffe non ? Et le keep_alive devrait juste faire la MAJ du PWM, et ajuster la durée suivant le besoin, non ? (genre au lancement de la chauffe ça devait être 10%, mais aux vues des infos MAJ, on passe à 12%, donc reste allumé encore un moment)

Oui, c’est bien ce principe. Le keep_alive ne gère que le « rafraîchissement » pour s’assurer que le PWM bascule bien.
Si le thermostat bascule le chauffage off/on/off trop fréquemment c’est souvent lié à un sensor de température qui envoie une information bruitée, les changements de température provoquant un nouveau calcul du PID. Avec des variations de 0,1/0,2°C très fréquentes, le delta t est très court, la composante dérivation qui évolue en di/dt passe donc de fortement négative à fortement positive selon le sens de la variation de la température + ou -, ce qui fait basculer le thermostat de 0 à 100%.

Pour éviter ce phénomène, on peut soit :

  • Réduire le nombre de mesures faites par le capteur s’il est réglable
  • Utiliser le paramètre sampling_period dans la configuration du thermostat pour ne prendre qu’un échantillon toutes les X minutes (10 ou 15mn par exemple) pour stabiliser la boucle de régulation

Il faut aussi adapter les gains Ki et Kd au taux d’échantillonnage du système. Si le delta t est court le gain Kd sera plus petit, et Ki plus grand ; si le delta t est long il faudra augmenter le Kd et réduire le Ki.

Ce n’était pas le cas, j’ai justement mis un sampling à 5min pour éviter les dérives trop rapides…
En revanche, j’avais modifié mon PWM et mon keep_alive au format hh:mm:ss et c’est là que les problèmes sont apparus. Je suis passé en secondes, et là ça a l’air mieux.

Hello, il lui faut combien de cycle à l’auto tune pour faire le boulot?

Tout à fait.
@Moderateur serait-il possible de déplacer les messages sur le thermostat PID dans un sujet dédié ?
Merci

Normalement, 1,5 cycle.

Ok merci.
Je vais l’arrêter parce que depuis ce matin 9h il a pas terminé

Note l’amplitude et la durée de la période de l’oscillation comme indiqué dans un de mes messages plus haut, ça te permettra au moins de calculer les gains à la main. Ca marche plutôt bien.

Bonjour a tous

Est ce qu’il y a une raison pourquoi le mode chauffe ne se declanche pas ?
J’ai du changer quelques reglage du PID depuis ce matin, mais j’ai reboot et fait un smart_thermostat.clear_integral entre temps.

Je sais pas ou ragerder, j’ai rien dans les logs

Il fait 17.7 dans mon salon, et le target est 19.5

platform: smart_thermostat
name: Living Room
heater: switch.living_room_heater_relay
target_sensor: sensor.living_room_temperature
min_temp: 16
max_temp: 20
ac_mode: false
target_temp: 18
keep_alive:
  seconds: 60
initial_hvac_mode: "off" # J'ai une automation qui le rallume au boot
away_temp: 18
boost_temp: 20
comfort_temp: 19.5
kp: 50
ki: 0.01
kd: 200
pwm: 00:15:00
target_temp_step: 0.1
precision: 0.1
#autotune: "ziegler-nichols"

J’ai testé avec cette configuration sur mon environnement de test, et ça a l’air de marcher, si je baisse la température sous la consigne ça déclenche la chauffe.

Le thermostat étant restauré dans le dernier état connu avant l’arrêt de HA, quel est l’état du thermostat dans les outils de développement ? (voir http://xxx.xxx.xxx.xxx:8123/developer-tools/state).

hvac_modes:
  - heat
  - 'off'
min_temp: 16
max_temp: 20
target_temp_step: 0.1
preset_modes:
  - none
  - away
  - boost
  - comfort
current_temperature: 17.3
temperature: 19.5
hvac_action: heating
preset_mode: none
away_temp: 18
eco_temp: null
boost_temp: 20
comfort_temp: 19.5
home_temp: null
sleep_temp: null
activity_temp: null
control_output: 100
Kp: 15
Ki: 0.02
Kd: 1000
pid_p: 32.999999999999986
pid_i: 18.542237342834472
pid_d: 55.50668377623727
autotune_status: 'off'
autotune_sample_time: 0
autotune_tuning_rule: none
autotune_set_point: 0
autotune_peak_count: 0
autotune_buffer_full: 0
autotune_buffer_length: 0
friendly_name: Salle de bain
supported_features: 17

On dirait que ça vient de tomber en marche.

J’avais désactivé les thermostats et remis le chauffage en marche forcée en attendant.

J’ai remis les smart_thermostat en marche, et remis un coup de set_pid_gain et ça s’est rallumé a l’instant

hvac_modes:

  • heat
  • ‹ off ›
    min_temp: 16
    max_temp: 20
    target_temp_step: 0.1
    preset_modes:
  • none
  • away
  • boost
  • comfort
    current_temperature: 19.3
    temperature: 20
    hvac_action: heating
    preset_mode: none
    away_temp: 18
    eco_temp: null
    boost_temp: 20
    comfort_temp: 19.5
    home_temp: null
    sleep_temp: null
    activity_temp: null
    control_output: 89.01063604452769
    Kp: 50
    Ki: 0.01
    Kd: 200
    pid_p: 34.999999999999964
    pid_i: 67.45539606809623
    pid_d: -0.0
    autotune_status: ‹ off ›
    autotune_sample_time: 0
    autotune_tuning_rule: none
    autotune_set_point: 0
    autotune_peak_count: 0
    autotune_buffer_full: 0
    autotune_buffer_length: 0
    friendly_name: Living Room
    supported_features: 17

Ah ca y est j’arrive a reproduire, hier j’avais tenté l’autotune c’est a ce moment là que ca voulait pas se lancer, ensuite j’ai desactivé l’autotune et ca voulait pas se lancer non plus.

Ca fait une petite demi heure que c’est lancé, ca ne se lance pas, j’ai meme aéré la maison avec les 40km/h qu’il y a, toujours aucune reaction.

J’ai peut etre raté un truc

#platform: generic_thermostat
platform: smart_thermostat
name: Living Room
heater: switch.living_room_heater_relay
target_sensor: sensor.living_room_temperature
min_temp: 16
max_temp: 20
ac_mode: false
target_temp: 18
keep_alive:
  seconds: 60
#initial_hvac_mode: "off"
away_temp: 18
boost_temp: 20
comfort_temp: 19.5
kp: 50
ki: 0.01
kd: 200
pwm: 00:15:00
target_temp_step: 0.1
precision: 0.1
autotune: "ziegler-nichols"
hvac_modes:
  - heat
  - 'off'
min_temp: 16
max_temp: 20
target_temp_step: 0.1
preset_modes:
  - none
  - away
  - boost
  - comfort
current_temperature: 18.5
temperature: 20
hvac_action: idle
preset_mode: none
away_temp: 18
eco_temp: null
boost_temp: 20
comfort_temp: 19.5
home_temp: null
sleep_temp: null
activity_temp: null
control_output: 0
Kp: 50
Ki: 0.01
Kd: 200
pid_p: 0
pid_i: 0
pid_d: 0
autotune_status: 'off'
autotune_sample_time: null
autotune_tuning_rule: ziegler-nichols
autotune_set_point: null
autotune_peak_count: 0
autotune_buffer_full: 0
autotune_buffer_length: 10
friendly_name: Living Room
supported_features: 17

L’autotune attend une dizaine de mesures du capteur de température pour estimer la période d’échantillonnage. Mais du coup pendant ce temps ça ne chauffe pas. C’est une faille du système à laquelle je n’avais pas pensé, en effet.

Je vais devoir revoir complètement son fonctionnement pour avoir deux boucles indépendantes, l’une pour réguler le chauffage à la façon d’un thermostat classique à hystérésis, et l’autre pour faire l’analyse.

En attendant je déconseille fortement l’utilisation de l’autotune.

Notez qu’on peut faire un autotune manuel en utilisant le thermostat générique de HA et en calculant manuellement les gains à partir des courbés de température obtenues (j’avais posté un message là dessus).

Bonjour à tous.

Je tenais tout d’abord à remercier tous les passionnés (Canaletto, Argonaute, et les autres) que vous êtes et qui m’aident indirectement à construire petit à petit mon HA.

Un grand MERCI à ScratMan pour ce projet de chauffage PID que je suis depuis le début.

Comme dit ScratMan plus haut, l’autotune ne permet pas le lancement du chauffage car il attend d’obtenir 10 mesures du capteur de température avant de s’activer. Ca peut être embêtant pour une pièce occupée…
Mais bon, pour ma part, j’ai fait la concession de perdre 2 degrés pour tester dans la chambre parentale qui n’est pas occupée en journée.
Une fois son cycle terminé, l’autotune m’a affiché dans les LOG de HA les valeurs PID des rulers Ciancone-marlin, Pessen-integral, Some-overshoot, No-overshoot, Brewing.

Il a été évoqué dans un post de regrouper quelques exemples de configuration, alors je souhaitais partager mes résultats, si ça peut aider certains comme base de départ. S’il manque des données je les rajouterai.
Plus qu’à tester sur quelques jours.

Merci encore ScratMan pour cette belle avancée dans le monde de Home Assistant !!

CHAUFFAGE :
Radiateur électrique à inertie sèche SAUTER
Puissance : 1500W
Installation : Sous la fenêtre du mur exposé NORD-EST

LOGEMENT :
Année de construction du logement : 1970
Murs : Parpaing de 30cm + plâtre
Isolation : Sans

SMART THERMOSTAT :
Version : v2021.11.9
Département : Hérault
Date : 02/12/2021
Températures lors de l’autotune : Min 05° C - Max 08° C
Capteur de température : Sonoff snzb-02 sous ZHA avec un refresh toutes les 15mn, placé à l’autre bout de la pièce
Début autotune : 10h00
Durée autotune : 21h
Ruler lors de l’autotune : Ciancone-marlin
Noiseband : 0.1

RÉSULTATS OBTENUS :
Ciancone-marlin :
Kp : 5.5118595010180265
Ki : 0.054012477094872606
Kd : 305.54124219524067

Pessen-integral
Kp : 12.992240252399634
Ki : 0.07233813896634723
Kd : 877.2413967646384

Some-overshoot :
Kp : 6.063045451119829
Ki : 0.027006238547436306
Kd : 907.4574893198649

Noo-overshoot :
Kp : 3.6378272706718975
Ki : 0.016203743128461782
Kd : 544.474493591919

Brewing :
Kp : 145.5130908268759
Ki : 0.0972224587707707
Kd : 3438.786275317382

2 « J'aime »

Merci pour ta reponse @ScratMan, c’est ce que je me suis dit en lisant les logs,

2021-12-03 10:33:38 WARNING (MainThread) [custom_components.smart_thermostat.climate] Autotune will run with the target temperature set after 10 temperature samples from sensor. Changes submitted after doesn't have any effect until autotuning is finished

Sauf que j’ai du reboot 10 fois depuis ce matin pour activer les logs et changer 2-3 parametres pour essayer de comprendre. Du coup j’ai perdu 1.5°C dans la maison (avec annonce des capteurs tous les 0.1°C) mais sans avoir 10 lectures d’affilé. Je me suis dit que ca se met en mode hysterisis et ensuite ca prends les mesures.

Je remet tout en chauffe, et je test sur le radiateur de la sdb en la laissant refroidir.

Hello, je vois que je ne suis pas le seul à chercher à améliorer la gestion du chauffage dans Home Assistant.

Je prends note sur la compensation de la température extérieure, ça m’a paru plus compliqué que ça à gérer au début, mais je vois que ça pourrait se faire assez simplement.

Pour la gestion des ouvrants, je vais regarder ça, en utilisant un sensor dédié, mais pas avec des détections de chute de température, c’est pas fiable. Mais ça peut déjà être géré très efficacement par des automatisations dans HA pour n’importe quel thermostat. Ca ne sera pas ma priorité.

Pour ceux qui maîtrisent Python, je suis ouvert aux contributions, si vous avez des idées n’hésitez pas à participer au code. J’ai repris un code existant et déjà corrigé pas mal de problèmes, et toute amélioration est bonne à prendre.

3 « J'aime »

Je viens de le mettre en place en remplacement de simple_thermostat mais je ne constate pas les ON/OFF comme dans son repo.
Tu l’a mit en place toi ?

Un peu de mal à appréhender les différents mode aussi :

image

Avec autotune ça ne passe pas.

  - platform: smart_thermostat
    name: "Thermostat : Lionel"
    heater: switch.sw01_lionel
    target_sensor: sensor.mi_lionel_temp
    min_temp: 10
    max_temp: 26
    ac_mode: False
    target_temp: 19
    keep_alive:
      seconds: 60
    precision: 0.1
    away_temp: 14
    eco_temp: 18
    boost_temp: 22
    comfort_temp: 20
    home_temp: 21
    sleep_temp: 17
    activity_temp: 20
    kp : 75
    ki : 0.001
    kd : 70000
    pwm : 00:15:00

Oui les ouvrants ça se gère très bien dans HA ou Schedy.