Plugin régulateur correcteur *PID* (proportionnel, intégral, dérivé)

Pour la gestion des données reçues dans jeedom (par protocol modbus par ex ) :
Permettre de renvoyé des infos (par protocol modbus par ex ) traitées par jeedom .
Traitement avec la fonction de régulateur correcteur PID (proportionnel, intégral, dérivé).
Il me semble que cette intelligence existe dans le plugin thermostat ?
Merci

1 « J'aime »

J’ai réalisé un régulateur PID pour la gestion d’une vanne thermostatique Z-Wave Spirit en mode manuelle (fonctionnement en %). Parce que moi je veux que ça commence avec du pied au plancher (vanne ouverte à 100%) à 5h le matin pour que ça monte rapidement en température :smiley:

Le régulateur calcule une valeur d’ouverture de vanne comprise entre 0% et 100% à envoyer à la tête thermostatique en fonction de l’écart entre la température mesurée et la température de consigne afin de réguler la température de la pièce à partir d’une sonde de température de votre choix.

Un peu de lecture

Pour comprendre plus facilement la régulation PID avec les mains, je vous conseille de lire la première partie de cette page Implémenter un PID sans faire de calculs ! » Sciences et Techniques

Je vous invite également à lire cette page Principes de régulation : P - PI - PID - Energie Plus Le Site qui explique super bien les types de régulation P et PI pour le chauffage.

Enfin, pour l’explication plus théorique de ce type de régulateur, je vous laisse lire la page Wikipedia Régulateur PID — Wikipédia

Fonctionnement

Le régulateur PID calcule l’ouverture d’une vanne physique d’un radiateur entre 0% et 99% afin que la température mesurée dans la pièce atteigne la température de consigne. Il régule les têtes thermostatiques Spirit qui peuvent fonctionner en mode manuel où c’est à l’utilisateur de choisir l’ouverture de vanne en % (il n’y a plus de régulation interne au niveau de la tête thermostatique).

Pas de plugin

Comme je ne sais pas faire de plugin, j’ai créé un virtuel et un scénario qui tourne derrière avec quelques variables.

Virtuel

Le virtuel ne sert qu’à la visualisation et aux réglages du régulateur PID

Tout d’abord, il faut définir les températures de consigne et mesures

Réglages des coefficients


Choix du type de régulation parmi toutes les combinaisons P/I/D.
Pour le chauffage, ce sont les régulations P, PI et PID qui nous intéressent, à la rigueur une régulation I s’il n’y pas pas de changement de consigne ou pour bien comprendre le fonctionnement.

La position C permet de fixer un pourcentage d’ouverture de vanne lorsque l’erreur nulle, c’est-à-dire lorsque la température mesurée égale la température de consigne. Ce paramètre n’est utilisé que s’il n’y pas de correction Intégrale I. Si cette position C est nulle, la vanne est fermée lorsque la pièce est à température et le radiateur ne chauffe plus. Donc, il faut une erreur pour que la vanne s’ouvre et que la pièce chauffe (ceci est très bien expliqué dans le lien précédent). Pour commencer, il est préférable choisir une position médiane entre 25% et 50%.

Le coefficient Kp représente le gain proportionnel en % d’ouverture par degré d’erreur %/°C. Avec un Kp=30%/°C, un changement de +2°C sur la consigne fera augmenter l’ouverture de vanne de +60%.
Avec une régulation Proportionnelle, il y aura toujours une erreur résiduelle, c’est-à-dire toujours un écart avec la température de consigne.

Le coefficient Ki représente le gain de l’action intégrale en % d’ouverture par degré d’erreur cumulée %/(°C.h). L’action intégration permet de supprimer l’erreur résiduelle, l’écart final de température entre la mesure et la consigne. Donc l’action intégrale est nécessaire pour d’obtenir la température de consigne. Lorsque la température de consigne est atteinte, il n’y a plus d’erreur, le terme proportionnel est nul et il reste seulement le terme intégral. Exemple, avec un Ki=5%/°C.h, la vanne sera ouverte à 20% pour une erreur cumulée de 4°C.h après une montée en température.
Ki=Kp/Ti avec Ti qui correspond à la période d’intégration en minutes.

Le coefficient Kd représente le gain de l’action dérivée en % d’ouverture par variation d’erreur %/(°C/h). L’action dérivée permet au régulateur de réagir aux perturbations et de donner un coup de boost lors du changement de consigne. Exemple, lors d’un changement de +2°C sur la consigne, la variation d’erreur passe à 24°C/h pour un pas de calcul de 5 minutes. Plus le pas de calcul est petit, plus la variation d’erreur est grande. Celle-ci est ensuite multipliée par le coefficient Kd, ainsi le terme dérivé Kd * Erreur_Variation peut être très violent et l’ouverture/fermeture de vanne aussi. Je déconseille l’utilisation de l’action dérivée dans un premier temps.
Kd=Kp*Td avec Td qui correspond à la période de dérivation en minutes. Pour commencer, il est préférable de choisir Td=Ti/4

La dérivée de l’erreur est très sensible aux changements de consigne ainsi qu’au bruit de mesures (oui, une résolution de 0.1 °C même 0.625°C pour la température mesurée, c’est très bruité). C’est pourquoi, il est nécessaire de filtrer cette dérivée.

L’impact du filtrage est fixé par le coefficient N. N=0 signifie pas de filtrage du tout (la formule de filtrage n’est pas utilisée) mais inutilisable en pratique. Ensuite, plus N est grand, plus le filtrage est faible. Dans la littérature, il est souvent écrit de prendre N entre 5 et 20. Je trouve qu’avec N>3 le filtrage n’est pas suffisant. N=2 me parait satisfaisant.


On voit bien les changements de consigne sur la variation de l’erreur filtrée.

Affichage des coefficients précédemment choisis

Le régulateur (scénario) calcule les différentes erreurs dans des variables, le virtuel ne fait qu’afficher simplement ces variables.

  • Erreur (Proportionnelle) : erreur entre la température de consigne et la température mesurée
  • Erreur Intégration : erreur cumulée en degré heure (°C.h) de l’erreur proportionnelle
  • Erreur Variation : variation d’erreur en degré par heure (°C/h)

L’ouverture de vanne est la somme des 3 actions Proportionnel P, Intégrale I, Dérivée D et d’un terme constant C lorsqu’il n’y a pas d’action Intégrale. Ceci permet d’un coup d’œil de savoir quelle action active principalement la vanne.

Les unités et les limites de réglages sont adaptés pour le chauffage. Mais le principe de régulation reste le même pour une autre utilisation.

Scénario

Passons à la partie la plus intéressante, le précieux code.

Toutes X minutes, le scénario récupère d’abord tous les paramètres dont il a besoin dans des tags.

Le scénario calcule les différentes erreurs quelque soit le type de régulation choisie. Cela permet de voir via le virtuel comment aurait pu se comporter le régulateur si telle correction avait été sélectionnée. Exemple, si je ne sélectionne pas la Dérivation, je visualise tout de même la variation d’erreur filtrée et j’ai juste à la multiplier par le coefficient Kd pour avoir une idée qu’aurait apportée la correction Dérivée.


Pour les formules qu’on ne voit pas entièrement

Erreur_Integration = #Erreur_Integration_Corrigee#+#Te#*(#Erreur#+#Erreur_Precedente#)/2
Erreur_Variation = (#Td#*#Erreur_Variation_Precedente#+#N#*(#Erreur#-#Erreur_Precedente#))/(#Td#+#N#*#Te#)

L’ouverture de vanne correspond à la somme des 3 corrections P I D plus la constante C s’il n’y a pas de correction I

La vanne physique ne peut pas prendre n’importe quelles valeurs, donc il faut limiter la vanne pour qu’elle reste dans l’intervalle 0% à 99%

Lorsque la vanne réelle arrive en butée 0% ou 99%, il ne faut plus continuer l’intégration de l’erreur. En effet, si par exemple la vanne se ferme suite à une baisse de consigne de plusieurs degrés (passage en mode Eco), la température réelle peut rester très longtemps (plusieurs heures) au dessus de la consigne. Pendant ce temps, l’erreur cumulée ne ferait que diminuer la vanne idéale dans des valeurs très négatives car pour le régulateur, il fait toujours trop chaud, donc il veut fermer davantage la vanne à chaque cycle. Lors d’une augmentation de consigne de plusieurs degrés (passage en mode Confort), il faudrait un certain temps (très long) afin l’erreur cumulée augmente pour faire revenir la vanne idéale vers des valeurs positives et pendant tout ce temps perdu, la vanne réelle resterait à 0%. L’idée est de venir retrancher l’erreur, que j’ai appelée erreur de saturation, en trop avant l’intégration pour que celle ci ne diverge pas.


Pour la formule complète

Erreur_Integration = #Erreur_Integration#-(#Ti#/#Ts#)*#Te#*(#Erreur_Saturation#+#Erreur_Saturation_Precedente#)/2

En fin de scénario, toutes les variables sont sauvées pour le prochain cycle


J’ai dû arrondir les valeurs afin d’éviter ce problème

C’est un peu moche comme code, mais en attendant que quelqu’un me propose mieux…

Bon, finalement l’astuce est est mettre des ' ' sur les tag des nombres qui peuvent être avec exposant pour que le calcul soit effectué correctement. Remarque, " " fonctionne aussi mais peut poser parfois des soucis sur certaines expressions en cas de double "" "".

Pour terminer, le scénario applique l’ouverture de la vanne si le radiateur est en mode régulation externe

Code source
Vous pouvez télécharger le code corrigé du scénario ici scenario_tag_quote.txt (7,5 Ko)
Afin de pouvoir importer facilement le scénario, il faut utiliser ce template corrigé PID_tag_quote.json.txt (74,3 Ko) (extension .txt est à enlever car c’est un fichier JSON)
J’en ai profité pour remplacer la syntaxe #MonTag# par tag(MonTag).

Conclusion

J’ai un peu galéré pour l’implémentation de certaines parties (le filtrage et la limitation de l’intégrateur) car la littérature ne parle que de choses théoriques. Je ne suis pas un expert en régulation, mes cours datent un peu et je ne travaille pas du tout dans ce domaine. Si vous voyez des erreurs dans l’implémentation ou que je raconte des conneries ou si avez des idées d’amélioration, n’hésitez pas.

Résultats en images dans un petit bureau de 8m² avec une personne présente en journée 8h-18h.
Température mesurée en bleu et consigne en noir : 20.5° le jour et 17.5°C la nuit.


Remarque, comme il a fait assez froid dehors, j’ai perdu les 3°C dans la nuit entre 22h et 5h30 du matin.

Ouverture de vanne en sortie du régulateur.


La vanne commence la journée à 5H30 avec 100% d’ouverture les premières heures puis se termine vers 30%.

7 « J'aime »

Merci pour ton partage .
Je dois faire le même mais pour l’électricité … donc c 'est top !
Comment puis je t aider pr le développement ?
Moi, en gros, je suis nul … ;o) et je ne sais pas créer de plugin non plus.
Mais je peux faire des tests .
Donc, si je peux avoir ton travail , je peux tj le proposer à martinez ou a babel pour qu’il l’intégré à leurs plugin mymodbus / modbus RTU / … ?

Qu’est-ce que tu dois faire exactement ?

Merci. Pour la conception des calculs du régulateur, c’est à peu près OK. Maintenant, il faut du temps pour tester car le chauffage est un système qui évolue lentement. Donc, être plusieurs à tester, oui, c’est une bonne idée. Je suis en mode Confort le jour et Eco la nuit, soit 1 montée et 1 descente en température par jour.

Pour le développement d’un plugin, il faut d’abord savoir combien de personnes sont intéressées avant de se lancer tête baissée la dedans. Qui est intéressé par ce régulateur PID ?

Je ne vois pas trop le lien avec les plugins modbus. Dans le domaine modbus, il doit exister déjà des régulateur PID professionnels très robustes (chers certainement).

2 « J'aime »

Vu qu’il n’y a pas foule depuis des mois sur ce sujet, je préfère publier mon code que de perdre mon temps à faire un plugin.

Maintenant ceux qui ont des têtes thermostatiques Spirit peuvent essayer la régulation de leur vanne en mode manuel avec une sonde externe de leur choix et tenter d’être plus malin qu’Eurotronic dans les choix des coefficients. :smiley:

Pour information, le Kp de la vanne Spirit est de 20%/°C.

À vous de jouer !

Je suis sur des PAC air/air pas sûr que cela puisse fonctionner de la même manière ?

Peux-tu développer un peu ?

Je chauffe à l’aide de pompes à chaleur air/air. On ne peut pas réguler une PAC en dosant un pourcentage d’ouverture de vanne. C’est soit en route soit non et c’est la PAC qui régule avec la température de consigne.

Voilà pourquoi je disais qu’il me semblait difficile d’utiliser ce correcteur PID avec des PAC air/air

Oui, c’est la PAC qui régule elle même, donc hors sujet.

ma pompe a chaleur samsung peut reguler la vitesse du compresseur via une carte d’integration modbus .
tu peux egalement utilisé un emeteur infra rouge broadlink universal remote qui change la temperature de consigne suivant du PID.
Donc le pid est possible de 2 manières différente sans faire de on/off

Qu’est-ce que tu dois faire exactement ?
=> j’ai un triac Power Control Eurotherm EPack™ qui varie 40 A en modbus . Le but est de régulé la puissance des 40 A suivant une autre consigne modbus ( une valeur de puissance que l’onduleur photovoltaique fournit d’une maniere fort variable ) .

Donc un PID sur une valeur modbus en entree , et sortire la valeur en modbus avec la regulation pid .
Le but est de ne pas tirer sur la batterie du offgrid local . si possible un PID en 10 secondes max .

c est un peux comme font les appareil ici dans le lien
MY-PV AC • THOR
MY-PV ELWA DC Immersion Heater

Le constructeur ne propose-t-il rien correspondant à ton besoin ?
Ton compresseur, tourne-t-il par intermittence comme un frigo ?
Comment régule la pompe à chaleur actuellement ? Où sont les sont les consignes ?
Supposons que tu prennes la carte d’intégration modbus et que tu puisses faire varier la vitesse du compresseur de 0 à 100%, tu voudrais faire varier ce pourcentage en fonction de la température intérieure et de la température de consigne comme je le fais avec les vannes thermostatiques ? Dans ce cas, je peux t’aider

c’est un 2ème sujet ?

Le régulateur doit calculer un courant entre 0 et 40A. OK

Je ne comprends pas bien. Quelle est la consigne ? Quelle est la grandeur mesurée ?

Les crons et les scénarios Jeedom fonctionnent plutôt à la minute ==> pas très adapté !

Pourquoi ne prends tu pas un appareil déjà tout fait car ton application semble assez critique ?

Que se passerait-il lors d’un redémarrage de Jeedom ou lors d’un autre problème possible avec une valeur constante sur le triac pendant plusieurs minutes ?

As-tu déjà regardé du côté des petits automates type Crouzet ou Logo Siemens en leur rajoutant une interface modbus ? En effet, ils contiennent des blocs régulateurs PID tous faits !
Il existe aussi des régulateurs PID en modbus prêt à l’emploi.
http://dpannelec.fr/Pages/Produits_Pixsys.html

2 « J'aime »

Maintenant qu’il fait bien froid, la régulation devient plus intéressante, voici le résultat.

1 « J'aime »

merci pr le lien des regulateurs PID . je vois des entrées anal mais pas numérique ? il y a une com modbus slave, mais je ne pense pas qu’il soit possible de communiquer avec l appareil pour une regulation avec une entree et une sortie modbus.

ma pompe a chaleur samsung regule la vitesse du compresseur , il ne s arrete jamais . actuellement, je l utilise avec un broadlink rm pro avec une commande que jeedom transfert avec l ir du rm pro .
je n achète pas la carte modbus propriétaire de samsung car elle coute moitié prix de la pompe a chaleure neuve … donc l infra rouge donne la consigne et c est la samsung qui fait le reste .

je parle du triac car c est lui que je desire faire une regulation PID . Pas pour la pompe samsung .

La consigne doit suivre la production photovoltaique . il n y a pas de consigne fixe . le régulateur modbus prend le maximum d’energie des panneaux solaire . ont s’enfou si il n y a pas assez d énergie fin de journee, car il y a une autre chaudiere qu gaz qui a une consigne également en cas de manque d energie elecrique et qui chauffe avec de energie fossile :pensive: . ( bâtiment off grid )

Pq 10 secondes ? car c est un temps moyen d e passage d un nuage devant les panneaux solaires . mais 1 minute c est correct aussi si obligatoire par le cron …

jene prends pas d appareils tout fait car a force d ajouter des appareils, c est non seulement plus chere, mais plus risquer d avoir 1 panne . j ai confiance a jeedom , ca fait 3 ans qu il tourne a merveille derrière un ups . Si le triac perds la communication modbus , je peux lui dire d arrêter la consommation de puissance ,remise en veille jusqu a que la communication revienne .

Si se n est pas moi qui developpe la regulation PID modbus dans jeedom, ca sera une autre personne plustard,jeedom evelue et evoluera dans cette direction grace a la communauté . Le plugin est peut etre deja existant, mais pas partager …

Il n’y pas de plugin pour l’instant @jeanlegrand, mais le code est existant et partagé, il n’y a plus qu’à t’y mettre. :grinning: Je peux t’aider bien sûr.

@afawaz vient d’implémenter le code pour externaliser la sonde de sa vanne thermostatique ici.

Pour revenir à ton triac

La consigne doit être fixe un minimum de temps pour le régulateur. Imagine un changement de consigne du chauffage toutes les 15 minutes ou un changement de consigne sur le régulateur de vitesse toutes les 2 secondes, le régulateur va galérer en permanence pour rejoindre la consigne.

La production photovoltaïque fluctue énormément avec le passage d’un nuage. Si cette grandeur doit servir de consigne pour autre chose, il faudra que le régulateur tourne plutôt très très vite, plusieurs fois par seconde. J’ai un peu de mal à comprendre. Quelle est la fréquence d’actualisation de la puissance de tes panneaux ? À quelle fréquence peux-tu modifier le courant de ton triac ? Peux-tu détailler ton installation (panneau, batterie, triac, chaudière gaz) ? Comment fais-tu actuellement sans ton futur PID ?

@Domatizer Mes reglages actuels :
image
Je dois avoir qlq chose qui ne va pas, surtout avec ce Ki !

Ce matin j’ai essayé d’aumenté la temperature de consigne a 25 degre pour voir comment ca reagit ! pas evident du tout !
voici le plan de l’appartement :

voici le resultat → ouverture vanne = 100% !!


autant dire que la monte en temperature est lente, temperature exterieur = 13 degre et appart isole double vitrage !
bref test en court …

Oui, ton Ki est beaucoup trop grand ! Du coup l’action intégrale I est à plus de 1500%
La durée Ti est trop petite, son ordre de grandeur est quelques heures : plutôt 200 à 300 minutes et non pas 5 min

Remarque, le changement de Ki fait un saut dans la courbe de l’erreur d’intégration pour ne pas avoir d’à-coup dans la courbe de l’action intégrale I. Dans ton cas, l’erreur d’intégration est dans les choux, je te propose modifier le Ti pour avoir un Ki correct et de la réinitialiser l’erreur d’intégration à zéro afin de gagner du temps.

Si la montée en température est lente avec une vanne ouverte à fond sachant qu’il fait 13°C dehors : soit l’eau n’est pas assez chaude, soit le radiateur sous dimensionné, soit la consigne est trop haute (c’est possible avec 25°C). Bref, c’est l’opposé de ce que je t’ai dit pour tes 6% précédemment !

À titre de comparaison, dans mon séjour de 30 m², le radiateur met environ 7h (de 5h à midi) pour atteindre la consigne de 20°C en partant de 18°C avec la vanne est ouverte à 100% les premières heures. Avec la régulation autonome de la tête, j’atteignais la consigne seulement en fin de journée puisque la tête ne voulait jamais ouvrir très grand la vanne. Dans mon cas, cette lenteur s’explique par le fait que chaudière applique de son côté la loi d’eau. En effet, elle chauffe l’eau au minimum nécessaire en fonction de la température extérieure. Donc l’eau n’est pas assez chaude pour monter rapidement en température. C’est un peu comme si on met une cale sous la pédale d’accélération, c’est plus long pour doubler ou pire impossible de doubler.

@afawaz Corrige tes coefficients, remet ta consigne à 22°C, monitore tout et laisse faire la régulation…

en 1 secondes les 2 onduleurs de 6kw peuvent passer de 100% à 20% et inversement avec un gros nuage. ce sont ses même onduleurs sunny boy sma qui fournissent l info en modbustcp ip . mais je peux recevoir l info par un autre onduleur sur place qui fait office de chef d orchestre , le sunny island .
le triac peut passer de 0à100% en 5 secondes ± et de 100 % à 0 % en 1 secondes . je peux le faire des milliers de x par jour …
actuellement je régule manuellement moi même ( en début de journée ) avec mymodbus ou j ai fait sur la dashboard 6 bouton de 20/30/40/50/60/100 . je choisit suivant la puissance moyenne des panneaux solaire dans la journée . Le soir , mon sunny island bascule un relay quand la batterie est moins de 60 % , le triac est donc en veille jusqu a que la batterie repasse au dessus de 70% ( hystérésis de 10 % pour ne pas avoir de on/off par dizaines entre la valeur±1%).
la chaudiere gaz est bloquee sur un thermostat fixe 24/24 à 22 degres … le batiment est super bien isolé,il y a que tres peux de deperdition, je ne coupe donc pas la nuit .

Ok @Domatizer, je remets a 22, je mets kp a 50%/°C et Ti a 240min !!
Mais du coup je n’est pas vraiment compris ce que c’est Ti ! Il faut vraiment que je replonge dans mes cours de régulation d’il y a 20 ans !
Mon scenario s’exécute tous les 5 mn.

Tu dis que N ne sert qu’a la régulation D, mais il intervient tout le temps dans le calcule de la variation_erreur. Je le remet a zero, ca simplifie .

Je test tout ca …
Merci

Oui, le calcul de variation_erreur est toujours effectué, tu peux laisser N=2, ça permet de voir l’allure du filtrage de la variation d’erreur même si elle n’est pas pris en compte lorsque le régulateur est en mode PI.

Ne va pas de te faire mal à la tête. :grinning:
Ti représente la constante de temps pour l’intégration. Je raisonne plutôt avec le Ki=Kp/Ti en %/(°C.h)
L’erreur d’intégration, correspond à la somme des erreurs au cours du temps et s’exprime en °C.h :
Erreur d’intégration = surface verte - surface rouge

Tu veux que ton triac suive tes onduleurs ? Tu ne peux pas dire à ton triac de prendre comme valeur la puissance fournies par tes onduleurs (ou un truc qui appui sur 1 de tes 6 boutons) toutes les 10 secondes ? Je ne vois toujours pas le besoin de régulateur.

1 « J'aime »