[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.
rapinou
Messages : 119
Inscription : 17 nov. 2016, 01:44

Re: chauffage PID

Message par rapinou »

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 :

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
Ensuite, dans la fonction compute(pid), j'ai modifié les lignes suivantes au niveau de "Action sur l'élément chauffant" :

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
II - Script chauffage PID

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és
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 :

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
RPI 3 - Raspbian 8 (Jessie) - Domoticz V3.5877
padbol2002
Messages : 84
Inscription : 23 oct. 2017, 08:53

Re: chauffage PID

Message par padbol2002 »

rapinou a écrit :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 :

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
J'ai fais a peu près pareil, sauf pour la puissance instantanée je l'ai mis ds le script_time_chauffage_zone.lua
juste en dessous de la commande compute(pid)

if (otherdevices[pid['radiateur']] == 'Off') then
-- mise a 0 de la conso instantée du capteur virtuel d'energie lorsque l'élèment chauaffant est sur off
npower, energy = string.match(otherdevices_svalues[pid['conso']], "(%d+%.*%d*);(%d+%.*%d*)")
energy = tonumber(energy)
commandArray['UpdateDevice']=pid['conso_id'] .. '|0|' .. 0 .. ';' .. energy
else
end

ça evite 36000 scripts, de redéclarer des variables et cela reste multizones.
vil1driver
Messages : 5661
Inscription : 30 janv. 2015, 11:07
Localisation : Rennes (35)

Re: chauffage PID

Message par vil1driver »

et bien personnellement, j'aime de plus en plus séparer les scripts justement pour clarifier ce que chacun fait.
et les rendre indépendant.

pour par exemple ici avoir une mesure de conso qui ne dépends pas de la méthode de pilotage.. (fonctionne même si piloté manuellement)

du coups pour la conso de mes zones de chauffe (entre autres..) j'ai juste fait une petite modification dans modules.lua (30/10/17)
dans la fonction stateChange
j'ai ajouté ceci

Code : Tout sélectionner

duree = lastSeen(uservariables_lastupdate['lastState_'..device])
juste avant

Code : Tout sélectionner

updateVar('lastState_'..device,otherdevices[device])
puis j'ai créé ce script
viewtopic.php?f=17&t=5151&p=43284#p43284

bon, ok il ne prends pas en compte les heures pleines ni creuses et encore moin les tarifs mais ce script est utilisable pour n'importe quel appareil.. ;) la cafetière, la vmc, la pompe de la piscine, etc..
il détecte les marche/arrêt et renseigne les compteurs en fonction.
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
rapinou
Messages : 119
Inscription : 17 nov. 2016, 01:44

Re: chauffage PID

Message par rapinou »

Nickel ton script, mieux que ma solution, du coup je l'ai adopté :)
J'y ai ajouté mes modifs pour l'estimation des coûts EDF avec les heures pleines et creuses, je vais le poster sur ton topic.
Merci.
RPI 3 - Raspbian 8 (Jessie) - Domoticz V3.5877
jackslayter
Messages : 1040
Inscription : 30 sept. 2014, 14:40
Localisation : Isère (38)

Re: chauffage PID

Message par jackslayter »

salut je voudrais avoir ma conso heure pleine et heure creuse dans un "P1 compteur intelligent" celui avec les couleurs cyan et bleu clair via un "instantané compteur" qui récupère la conso heure pleine et heure creuse.

les compteurs instantané sont de ce type
dans l'ordre : compteur réel via rflink, compteur dummy HP, compteur dummy HC

Code : Tout sélectionner

consoInstant, consoCumule = otherdevices_svalues[capteurGlobal]:match("([^;]+);([^;]+)")
consoInstantHP, consoCumuleHP = otherdevices_svalues[capteurCptHP]:match("([^;]+);([^;]+)")
consoInstantHC, consoCumuleHC = otherdevices_svalues[capteurCptHC]:match("([^;]+);([^;]+)")
et le "P1 compteur intelligent" de ce type

Code : Tout sélectionner

     USAGE1= energy usage meter tariff 1
    USAGE2= energy usage meter tariff 2
    RETURN1= energy return meter tariff 1
    RETURN2= energy return meter tariff 2
    CONS= actual usage power (Watt)
    PROD= actual return power (Watt)

USAGE and RETURN are counters (they should only count up).
For USAGE and RETURN supply the data in total Wh with no decimal point.
(So if your meter displays f.i. USAGE1= 523,66 KWh you need to send 523660)
comment je pourrais faire pour avoir le bilan des conso HP et HC sur le P1?
je veux pas de script tout fait (sauf si il existe déjà) je veux juste une piste sur comment le faire.
merci
Raspberry Pi + RFLink + Domoticz Beta
Oregon - 3x Thgr122Nx / Chacon - micromodule 200w, télécommande 3b et 16b, 2x module 1000w, détecteur de fumée, contact de porte, 2x prise 3500w / OWL - CM180 / TRC02 v2 RGB 3M / Cheap - PIR, contact de porte
rapinou
Messages : 119
Inscription : 17 nov. 2016, 01:44

Re: chauffage PID

Message par rapinou »

Si ça peut aider, voici comment je fais pour un compteur simple, grâce au script de vil1driver partagé plus haut que j'ai légèrement modifié.

https://easydomoticz.com/forum/viewtopi ... 306#p43306
RPI 3 - Raspbian 8 (Jessie) - Domoticz V3.5877
Djodo
Messages : 86
Inscription : 23 févr. 2016, 12:32

Re: chauffage PID

Message par Djodo »

Bonjour tout le monde,
Question de débutant : pourquoi on ne peut pas mettre le script modules.lua dans les événements ?

Et merci vl1driver ! :)
vil1driver
Messages : 5661
Inscription : 30 janv. 2015, 11:07
Localisation : Rennes (35)

Re: chauffage PID

Message par vil1driver »

Car on ne peut pas charger un fichier qui n'est pas un fichier

dofile(..... En début de script

Et aussi car JSON.lua n'y est pas :D

Le script détermine l'emplacement de ce fichier par détection de son propre emplacement..
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
Djodo
Messages : 86
Inscription : 23 févr. 2016, 12:32

Re: chauffage PID

Message par Djodo »

Ok donc tu as choisi de le mettre dans ce dossier parce que tu n'as pas le choix (Domoticz est conçu comme ça) ? Ou par exemple on pourrait aussi mettre JSON.lua dans les événements ?

En faite je demande ça, car ce que j'aime bien dans le fait de mettre tous les scripts dans les événements, c'est que lorsqu'on fait une sauvegarde puis une restauration de Domoticz, tout redevient comme avant 8-)
lmet
Messages : 252
Inscription : 30 juin 2017, 18:16
Localisation : Val d'Oise
Contact :

Re: chauffage PID

Message par lmet »

Bonjour,
En fait il n'est plus utile de mettre les scripts dans ce répertoire.
Il suffit de copier ton script directement dans Events en cas de sauvegarde les scripts sont enregistrés dans la base de données et donc restitués lors d'un restore.
Domoticz : V4.10717
Zigate : V4.11230 plugin:4.5.4 firmware:031a
Mon petit blog domotique
Répondre