Smart Thermostat - le chauffage contrôlé par PID

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.

Pour autotune, je pense que tu doit mettre la méthode ex: « ciancone-marlin »
Par contre attention, les valeurs de Kp,Ki,Kd ne sont pas sauvegarder au reboot d’HA.

Un fois autotune activer il faut regarder les valeurs et les mettres dans le configuration.yaml

A priori il faut 2h de chauffe pour que les valeurs soit « bonne »

Hello, ce qui est montré dans la table c’est des règles pour le calcul des gains Kp, Ki et Kd par l’autotuner à la fin de son acquisition. Pas les modes du PID.

Si vous activez l’autotune, le PID est désactivé le temps que l’autotune aie fini. Et il faut faire un step sur la consigne pour la mettre au dessus de la température ambiante (ou en dessous dans le cas d’une clim) pour déclencher l’autotuner.
Vous verrez alors le chauffage s’activer et s’éteindre comme avec le thermostat basique de HA.
L’attribut autotune_status va passer de step up à step down tout seul en faisant osciller la température avec le chauffage autour de la température de consigne ± la valeur du paramètre noiseband, et ce jusqu’à ce qu’il ait assez de points de mesure pour calculer les gains pour le PID.

Il faut en effet mettre le nom de la règle choisie dans le paramètre autotune, et non pas ses coefficients.
Pour les 2h, tout dépendra du temps de réaction de votre système de chauffage. Avec le paramètre lookback vous pouvez ajuster la durée d’analyse max du tuner, sachant qu’il faut 5 cycles step up /step down pour avoir assez de données. Donc potentiellement sur un chauffage très lent 2h peuvent ne pas suffire si la noiseband est large.

Comme indiqué dans ma doc, l’autotune n’est pas encore testé, donc je ne garantis rien. Il peut ne pas fonctionner, c’est du code de récup. Les retours sont les bienvenus.

1 « J'aime »

Autant pour moi !!! (donc à préciser dans la doc)

C’est fait dans la branche master pour la prochaine release.

1 « J'aime »

Quand je met le nom de la règle j’ai cette erreur au boot :

Traceback (most recent call last):
  File "/usr/src/homeassistant/homeassistant/helpers/entity_platform.py", line 249, in _async_setup_platform
    await asyncio.shield(task)
  File "/config/custom_components/smart_thermostat/climate.py", line 173, in async_setup_platform
    async_add_entities([SmartThermostat(
  File "/config/custom_components/smart_thermostat/climate.py", line 248, in __init__
    self.pidAutotune = pid_controller.PIDAutotune(self._target_temp, self.difference,
  File "/config/custom_components/smart_thermostat/pid_controller/__init__.py", line 185, in __init__
    raise ValueError('setpoint must be specified')
ValueError: setpoint must be specified

Ma config :

- platform: smart_thermostat
  name: cuisine
  heater: switch.action_chauffage_cuisine
  target_sensor: sensor.temp_cuisine
  min_temp: 7
  max_temp: 28
  ac_mode: False
#  target_temp: 19
  keep_alive:
    seconds: 60
  away_temp: 14
  kp : 75
  ki : 0.001
  kd : 70000
  pwm : 00:15:00
  autotune: "ciancone-marlin"

Une idée ?
Que veut-il dire par « setpoint must be specified » ?

En tout merci d’avoir repris ce projet. Je vais tester un peu et probablement y consacrer un petit article.

2 « J'aime »

Carrément, merci a toi @ScratMan parce que je trouve que la gestion des thermostats de HA est très limité à l’heure actuel.

Il faut rajouter le setting target_temp (avec une valeur en dessous de l’ambiante actuelle, sinon je pense que ça risque de bugger) car c’est lui qui est passé à l’autotuner à l’init.

Je viens de tester et effectivement le thermostat boot, par contre j’ai perdu tt mes pré-réglage. Normal ?

Préréglages de quoi ?