Re: chauffage PID
Publié : 28 oct. 2017, 19:38
Je l'ai fait en modifiant un peu les deux scripts de vil1driver, celui du chauffage pid ainsi que modules.lua.
Il prend aussi en compte les heures pleines et heures creuses pour estimer les coûts. Il faudra bien sûr créer les interrupteurs, sélecteurs et variables nécessaires.
I - Modules.lua
Dans modules.lua, j'ai ajouté les deux fonctions suivantes :
Ensuite, dans la fonction compute(pid), j'ai modifié les lignes suivantes au niveau de "Action sur l'élément chauffant" :
II - Script chauffage PID
Maintenant, on passe sur le script de chauffage en lui-même. Modifier les variables dans local pid{} :
III - Puissance instantanée
Pour que la puissance instantanée affichée dans le compteur de consommation électrique revienne à zéro dès que le fil pilote repasse à Off, je n'ai pas trouvé d'autre solution que de créer un autre script lua de type device :
Il prend aussi en compte les heures pleines et heures creuses pour estimer les coûts. Il faudra bien sûr créer les interrupteurs, sélecteurs et variables nécessaires.
I - Modules.lua
Dans modules.lua, j'ai ajouté les deux fonctions suivantes :
Code : Tout sélectionner
-- Récupérer valeur d'un device
function getValue(device)
return tonumber(otherdevices_svalues[device])
end
-- Récupérer valeur d'un device (string)
function getValueString(device)
return string.match(otherdevices_svalues[device], "(%d+%.*%d*);(%d+%.*%d*)")
end
Code : Tout sélectionner
-- Action sur l'élément chauffant
if heatTime > 0 then
commandArray[1] = {[pid['radiateur']] = marche}
commandArray[2] = {[pid['radiateur']] = arret..' AFTER '..heatTime}
-- Envoi de la consommation dans le compteur de consommation électrique
power, energy = getValueString(pid['conso']) -- Récupération de la valeur du compteur de consommation électrique
local conso_cycle = tonumber(pid['puissance'] / 3600 * heatTime) -- Consommation du cycle PID
energy = tonumber(energy + conso_cycle) -- Somme valeur initiale + consommation du cycle
commandArray[3] = {['UpdateDevice'] = pid['conso_id'] .. '|0|' .. pid['puissance'] .. ';' .. energy} -- Mise à jour du compteur (puissance instantanée + conso du cycle)
-- Calcul du coût EDF et envoi dans le compteur virtuel
local hp_hc = getValue(pid['hp_hc']) -- Récupération du planning HP/HC
local tarifhp = tonumber(uservariables[pid['tarifhp']]) -- Récupération des tarifs HP/HC
local tarifhc = tonumber(uservariables[pid['tarifhc']])
if hp_hc == pid['lvl_hp'] then -- Si on est en heures pleines :
cout_cycle = tonumber(conso_cycle * tarifhp / 1000) -- On calcule le coût du cycle PID
elseif hp_hc == pid['lvl_hc'] then -- Si on est en heures creuses :
cout_cycle = tonumber(conso_cycle * tarifhc / 1000) -- On calcule le coût du cycle PID
end
local compteur_init = getValue(pid['inc_meter']) -- Récupération de la valeur initiale du compteur
local compteur_maj = tonumber(compteur_init + cout_cycle) -- On ajoute le coût du cycle au compteur
commandArray[4] = {['UpdateDevice'] = pid['inc_meter_id'] .. '|0|' .. compteur_maj} -- Mise à jour du compteur
else
commandArray[pid['radiateur']] = arret
end
Maintenant, on passe sur le script de chauffage en lui-même. Modifier les variables dans local pid{} :
Code : Tout sélectionner
local pid={}
pid['debug'] = true -- true pour voir les logs dans la console log Dz ou false pour ne pas les voir
pid['zone'] = 'RDC' -- Nom de la zone pour affichage dans les logs et distinction de variables
pid['sonde'] = 'sonde_rdc' -- Nom de la sonde de température
pid['OnOff'] = 'OnOff' -- Nom de l'interrupteur virtuel de mise en route
pid['thermostat'] = 'thermostat_rdc' -- Consigne ou 'nom' de l'interrupteur virtuel de thermostat
pid['conso'] = 'Consommation chauffage RDC' -- Nom du compteur virtuel de consommation électrique
pid['puissance'] = 3500 -- Puissance du chauffage en watt
pid['conso_id'] = 20 -- idx du compteur virtuel de consommation électrique
pid['hp_hc'] = 'EDF HP / HC' -- Nom du sélecteur Heures pleines/Heures creuses
pid['tarifhp'] = 'Tarif HP' -- Nom de la variable utilisateur Tarif HP
pid['tarifhc'] = 'Tarif HC' -- Nom de la variable utilisateur Tarif HC
pid['inc_meter'] = 'Coût chauffage RDC' -- Nom du compteur virtuel de coût EDF
pid['inc_meter_id'] = 23 -- idx du compteur virtuel de coût EDF
pid['lvl_hp'] = 10 -- Niveaux du sélecteur HP/HC
pid['lvl_hc'] = 20
-- Actionneur
pid['radiateur'] = 'Fil pilote RDC' -- Nom de l'interrupteur de chauffage
pid['invert'] = false -- Si On et Off doivent être inversé ou non
-- PID
pid['Kp'] = 40 -- Coefficient proportionnel
pid['Ki'] = 10 -- Coefficient intégrateur
pid['Kd'] = 40 -- Coefficient dérivateur
pid['cycle'] = 10 -- Temps en minute d'un cycle PID
pid['secu'] = 30 -- Temps mini en seconde entre 2 ordres opposésPour que la puissance instantanée affichée dans le compteur de consommation électrique revienne à zéro dès que le fil pilote repasse à Off, je n'ai pas trouvé d'autre solution que de créer un autre script lua de type device :
Code : Tout sélectionner
-- Chargement des modules vil1driver
dofile('/home/pi/domoticz/scripts/lua/modules.lua')
------------------------
-- Variables à éditer --
------------------------
local zone = 'RDC' -- Nom de la zone de chauffe pour affichage dans les logs et distinction de variables
local radiateur = 'Fil pilote RDC' -- Nom de l'interrupteur virtuel d'action fil pilote
local puissance = 3500 -- Puissance du chauffage en watt
local conso = 'Consommation chauffage RDC' -- Nom du compteur virtuel de consommation électrique
local conso_id = 20 -- idx du compteur virtuel de consommation électrique
--------------------------------
-- Fin des variables à éditer --
--------------------------------
commandArray = {}
if ( devicechanged[radiateur] == 'Off' ) then -- Si le fil pilote passe sur Off :
power, energy = getValueString(conso) -- Récupération de la valeur du compteur de consommation électrique
commandArray={['UpdateDevice'] = conso_id .. '|0|0;' .. energy} -- Mise à jour du compteur
end
return commandArray