[LUA] Chauffage PID

Vous avez créé un script LUA dont vous êtes fier, un .sh génial, un programme Python hors du commun, un Tuto, c'est ici que vous pouvez les partager.
vil1driver
Messages : 5661
Inscription : 30 janv. 2015, 11:07
Localisation : Rennes (35)

Re: chauffage PID

Message par vil1driver »

toutes mes sondes virtuelles sont nommées de la sorte: nom de la vrai sonde + _pid
exemple:
sonde réelle : salon
sonde virtuelle : salon_pid

j'ai donc un script de type device

Code : Tout sélectionner

-- envoie dans une sonde vituelle la temp réelle et la valeur de la commande pid en tant qu'humidité
 

-- chargement des modules
dofile('/home/vil1driver/domoticz/scripts/lua/modules.lua')

debug = false  -- true pour voir les logs dans la console log Dz ou false pour ne pas les voir

commandArray = {} 
local sondes = {}

sondes[1] = 'thomas'
sondes[2] = 'salle de bain'
sondes[3] = 'salon'
sondes[4] = 'parents'
--etc

for n,sonde in pairs(sondes) do
	if devicechanged[sonde] then
		commandArray['UpdateDevice'] = otherdevices_idx[sonde..'_pid']..'|0|'..getTemp(sonde)..';'..getHum(sonde..'_pid')..';0'
		break
	end
end
return commandArray
et 2 modifications dans modules.lua
vers la ligne 700
log('commande: '..commande..'% ('..string.sub(os.date("!%X",heatTime),4,8):gsub("%:", "\'")..'\")')
log('')
end


-- maj sonde virtuelle
commandArray[#commandArray+1] = {['UpdateDevice'] = otherdevices_idx[pid['sonde']..'_pid']..'|0|'..temp..';'..commande..';0'}
vers la ligne 713
-- arrêt chauffage (renvoi commande systematique par sécurité)
commandArray[pid['radiateur']] = arret..' AFTER '..constrain(pid['secu']-lastSeen(pid['radiateur']),3,pid['secu'])

-- maj sonde virtuelle
commandArray[#commandArray+1] = {['UpdateDevice'] = otherdevices_idx[pid['sonde']..'_pid']..'|0|'..temp..';0;0'}
ce qui donne ce genre de graph (consigne à 20°C)
Image
MAJ = VIDER LE CACHE(<-Clicable)
/!\Les mises à jour de Domoticz sont souvent sources de difficultés, ne sautez pas dessus
modules.lua

Un ex domoticzien
jackyhi
Messages : 97
Inscription : 09 mai 2016, 23:49

Re: chauffage PID

Message par jackyhi »

Merci pour ton aide précieuse vil1driver.
voici mon script je n'ai qu'une sonde pour l'instant.

Code : Tout sélectionner

-- script_device_CopySondeToVirtuelle_PID.lua
-- envoie dans une sonde vituelle la temp réelle et la valeur de la commande pid en tant qu'humidité
 

-- chargement des modules
dofile('/home/pi/domoticz/scripts/lua/modules.lua')

debug = false  -- true pour voir les logs dans la console log Dz ou false pour ne pas les voir

commandArray = {} 
local sondes = {}

sondes[1] = 'TempSAM'
-- sondes[2] = 'salle de bain'
-- sondes[3] = 'salon'
-- sondes[4] = 'parents'
--etc

for n,sonde in pairs(sondes) do
   if devicechanged[sonde] then
      commandArray['UpdateDevice'] = otherdevices_idx[sonde..'_pid']..'|0|'..getTemp(sonde)..';'..getHum(sonde..'_pid')..';0'
      break
   end
end
return commandArray
Dans le module.lua voici les lignes ajoutées:

Code : Tout sélectionner

				log('commande: '..commande..'% ('..string.sub(os.date("!%X",heatTime),4,8):gsub("%:", "\'")..'\")')
				log('')
			end
			-- maj sonde virtuelle
			commandArray[#commandArray+1] = {['UpdateDevice'] = otherdevices_idx[pid['sonde']..'_pid']..'|0|'..temp..';'..commande..';0'}
		end
		
	end
	-- toutes les 15 minutes, si on ne veut pas chauffer
	if ( time.min%15 == 0 and otherdevices[pid['OnOff']] == 'Off' ) then

		-- arrêt chauffage (renvoi commande systematique par sécurité)
		commandArray[pid['radiateur']] = arret..' AFTER '..constrain(pid['secu']-lastSeen(pid['radiateur']),3,pid['secu'])
		-- maj sonde virtuelle
		commandArray[#commandArray+1] = {['UpdateDevice'] = otherdevices_idx[pid['sonde']..'_pid']..'|0|'..temp..';0;0'}

	end

end
CaptureSonde_PID.jpg
CaptureSonde_PID.jpg (23.59 Kio) Consulté 8175 fois
Encore merci.
Raspberry Pi2 VPN, Pi 3, Pi4 ,RFXCom, 6 volets BLYSS, sondes Temp_humid Attiny85, zigbee, Mysensors, RFLINK , Zwave capteurs portes Prises, Alarme avec 2 sirènes maison esp8266, Thermostat NETAMO vannes thermostatiques
Hawk49
Messages : 17
Inscription : 05 mars 2018, 10:35

Re: chauffage PID

Message par Hawk49 »

Bonjour Vl1Driver,

merci pour ton partage. Si je comprends bien ton script PID dans modules.lua, il part sur un principe d'une température de consigne constante. Du coup le calcul de l'intégrale n'est pas mis à 0 lorsque la consigne change (?).
Si c'est bien ça et si je comprends bien le fonctionnement, je pourrais créer un script lua qui se déclenche lorsque la consigne change et qui supprime les variables "'PID_temps_'..pid['zone']" et "'PID_integrale_'..pid['zone']".
Ou je raconte des co...ries ?! :roll:
vil1driver
Messages : 5661
Inscription : 30 janv. 2015, 11:07
Localisation : Rennes (35)

Re: chauffage PID

Message par vil1driver »

La consigne peut changer si, l'intégrale de toute façon sera rapidement adapté, il n'y a pas vraiment de gain à la passer à 0. Le chemin n'est pas forcément plus court jusqu'à la valeur optimale depuis zero ou depuis son ancienne valeur optimale (consigne précédente)
MAJ = VIDER LE CACHE(<-Clicable)
/!\Les mises à jour de Domoticz sont souvent sources de difficultés, ne sautez pas dessus
modules.lua

Un ex domoticzien
Hawk49
Messages : 17
Inscription : 05 mars 2018, 10:35

Re: chauffage PID

Message par Hawk49 »

Ok, merci beaucoup pour ta réponse.
rimram31
Messages : 659
Inscription : 04 oct. 2015, 11:22
Localisation : Toulouse

Re: chauffage PID

Message par rimram31 »

Ca faisait quelques temps que je ne m'étais pas promené sur le forum ... excellent ton script vil1driver, un régulateur PID pour le chauffage, le graal de la commande de chauffage :lol:

L'hiver est plutôt derrière nous (encore que ...) mais ton script me fait gamberger. Ma plus grosse question en fait vient de ce que mon script actuel, hysteresis, renvoie la commande On ou Off toute les minutes quelque soit l'etat actuel ce qui est bien pratique en RF quand tu as quelques ordres qui se perdent dans la nature. Du coup, je cherche a voir si on pourrait adapter le script quitte a avoir des périodes multiples de la minute (et donc gérer les on/off sur les passages périodiques).

Autre question (là c'est l'ingénieur thermicien qui s'interroge, mon premier métier ...), logiquement tes variables d'asservissement et surtout Kp doit dépendre elle-même des conditions extérieures ... (plus il fait froid, plus il faut envoyer) et là glop, j'ai le cerveau qui part en vrille :) As-tu observé ça dans ton application de ton algo ? Si oui, ça encourage pas obligatoirement a passer a un PID (vs hysteresis), je vois bien chez moi les grosses différences de montée en T selon la température extérieure et je me vois pas passer un hiver a optimiser le tout ...

Les derniers points ne sont que des petits détails, mon script actuel prend en param. une liste de sondes (logique moyenne et ignore sondes en erreur, fréquent chez moi ...) et une liste de switch pour la commande pour piloter n radiateurs pour une zone donnée.

Edit: La journée ayant porté conseil ... je me suis répondu entre temps aux 1ères et dernières questions. En utilisant une sonde et un switch virtuel pour ton script, ça peut le faire. En pre traitement, ca permet de gérer une liste de sondes, de switch physiques => virtuels avant appel, ça permet ensuite un post traitement ttes les minutes pour envoyer aux switchs RF un On/Off selon etat virtuel calculé par le pid (=> repeat).
Dernière modification par rimram31 le 28 mars 2018, 17:42, modifié 1 fois.
Raspberry Pi 2 + carte RF pi "maison" + Domoticz
Sonde Oregon + Aliexpress - Prises Chacon (3500W) - 1wire DS18B20
Hawk49
Messages : 17
Inscription : 05 mars 2018, 10:35

Re: chauffage PID

Message par Hawk49 »

Ça rejoint la question que je me posais à propos du temps nécessaire pour obtenir une température donnée à une heure prévue d'avance (typiquement lors d'un changement de température souhaitée pour mon salon entre la nuit et le matin au ptit dej').
Je la posais ici: https://easydomoticz.com/forum/viewtopi ... 846#p51846.

Car en effet, je me rappelle de la frustration après avoir digéré https://controlguru.com/table-of-contents/ et comprendre qu'il était logique que les paramètres chèrement acquis n'étaient valables que dans des conditions inchangées (influences extérieures, valeur de la consigne).

Du coup j'en reviens à ma réflexion de départ de connaitre les caractéristiques d'une pièce (en terme d'isolation) et du chauffage pour anticiper l'influence des conditions météo. Belle théorie mais pas évident à mettre en pratique...
J'ai peut être trouvé une réponse avec le Smart Virtual Thermostat (https://www.domoticz.com/wiki/Plugins/S ... ostat.html,http://www.domoticz.com/forum/viewtopic ... a+planning) avec un algorithme d'apprentissage automatique qui me parait intéressant. En revanche, j'en suis qu'au début de ma lecture, c'est à dire que les paramètres pris en compte me semblent satisfaisants mais je n'ai pas encore étudié l'algorithme en lui même.
Certains connaissent ?

Ogulf, toujours partant pour faire un enfant illégitime ?? Que dirais tu d'un rejeton issu d'un ménage à trois entre le script de Vil1Driver, celui de Greg et le SVT de Logread ? ;)
rimram31
Messages : 659
Inscription : 04 oct. 2015, 11:22
Localisation : Toulouse

Re: chauffage PID

Message par rimram31 »

@Hawk49 pas d'idée pour de l'auto apprentissage.

J'avais cherché il y a quelques temps sur les sujets généraux de réglages de boucle PID mais rien d'évident a mettre en oeuvre . La seule chose qui m'était resté était de mixer algo simple + pid en reajustant le Kp sur la base de la réponse du début de cycle en hysteresis simple (d'autant + lente qu'il fait froid). Les autres coeffs me paraissent moins importants et, je pense, moins dépendants des conditions extérieures + du "système" (pièce, radiateurs ...).
Raspberry Pi 2 + carte RF pi "maison" + Domoticz
Sonde Oregon + Aliexpress - Prises Chacon (3500W) - 1wire DS18B20
ogulf
Messages : 445
Inscription : 15 juin 2017, 14:41

Re: chauffage PID

Message par ogulf »

Hawk49 a écrit :Ogulf, toujours partant pour faire un enfant illégitime ?? Que dirais tu d'un rejeton issu d'un ménage à trois entre le script de Vil1Driver, celui de Greg et le SVT de Logread ? ;)
Je viens de parcourir la description du SVT : très intéressant, mais ressemble un peu à un algorithme PID en fait, car dépend de caractéristiques passées en paramètres ??
Cependant, ce plugin SVT mérite d'être testé, quitte à réutiliser les devices déjà existants (température de consigne, radiateurs, température de la pièce etc.) et supprimer ceux qui auront été créés par le plugin.
Question bête car je n'ai pas approfondi : peut-on gérer plusieurs zones ? Autant de SVT que de zones ? Est-ce seulement possible ?

Je vais attendre la fin de la saison de chauffe pour éventuellement tester cette approche :)
N'hésite pas à relancer le sujet :D

Mais j'ai pour l'instant un autre projet : installer une alarme (mon choix sera Visionic PowerMaxPro ou PowerMaster) et l'interfacer avec Domoticz (c'est décrit sur la PowerMaxPro sur le forum anglais - je n'ai pas le lien sous la main, mais rien n'existe il me semble pour la PowerMaster :?)

Edit : voilà > le lien < en question
Domoticz Stable sur RPi3 + RFPlayer + ZWave+ + RFLink R48 :
- 11 x RF660P
- 1 x FGSD-002
- 10 x F007TH
- 5 x Emcoluxr EV1527 + 4 x NAS-DS01Z
- 4 x NAS-PD02Z
- 1 x Shelly 1PM
rimram31
Messages : 659
Inscription : 04 oct. 2015, 11:22
Localisation : Toulouse

Re: chauffage PID

Message par rimram31 »

ogulf a écrit :Je viens de parcourir la description du SVT : très intéressant, mais ressemble un peu à un algorithme PID en fait...
A voir le code, c'est effectivement un paramètre de commande "%" de temps de chauffe (sur une période de temps donnée) mais je ne vois qu'un coefficient proportionnel, Kp (ConstC dans le code) pas de correction dérivée et intégrale. Il y a par contre un coefficient correcteur en fonction de la T extérieure (?) et une partie autoapprentissage qui apparemment corrige Kp. Pas capté comment on passe en "auto apprentissage".

De mes lectures (et mes souvenirs d'automatismes ...), il existe des méthodes pour déterminer les paramètres d'une régulation PID (http://php.iai.heig-vd.ch/~mee/seminair ... apidaj.pdf). Je me dis qu'en démarrant en hysteresis "simple" lors d'un changement de T du thermostat de commande (eco/confort) il y a peut-être moyen alors de calculer/adapter les paramètres du PID en fonction de la réponse observée. Mais je trouve rien sur la toile hors article universitaires ... (pas de code prêt a l'emploi, https://playground.arduino.cc/Code/PIDAutotuneLibrary ???)
Raspberry Pi 2 + carte RF pi "maison" + Domoticz
Sonde Oregon + Aliexpress - Prises Chacon (3500W) - 1wire DS18B20
Répondre