[LUA] Script de chauffage avec détection PIR et retour de conso

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: script de chauffage avec détection PIR et retour de conso

Message par vil1driver »

mise à jour du script

ajout de l'anticipation, façon façon :mrgreen:
en gros arrêter de chauffer avant la consigne et recommencer à chauffer avant de passer sous la consigne..
en gros tout l'inverse de l'hystérésis :mrgreen:

principe grossier: (oui tout est très gros :o )

lorsque le chauffage est allumé, on incrémente un compteur +1/min
suivant ce compteur, la consigne à atteindre est abaissée de 0.1°C toutes les 10 minutes, avec un abaissement maxi de 0.5°C
donc plus le temps passe, plus la température de la pièce augmente et plus la consigne baisse..

lorsque la température rejoint la consigne(modifiée), on arrête de chauffer.
on laisse un peu la pièce profiter de l'énergie accumulée dans les radiateurs.
dans le même temps on décrémente le compteur -1/min ce qui va remonter la consigne de 0.1°C toutes les 10 minutes
donc plus le temps passe et plus la température continue de monter et plus la consigne augmente (jusqu'à relancer la chauffe)

l'idée est d'atteindre la consigne initiale avec douceur, pour ne pas la dépasser(dépense inutile)

lorsque l'on atteint et/ou dépasse la consigne initiale le compteur est remis à zéro.
au bout de 7 minutes à la consigne voulue, on remet en route le chauffage pour 2min puis on le stop 2min et on recommence.
en gros le radiateur fonctionne (50% du temps) jusqu'à dépasser la consigne ou descendre en dessous..
si cela nous fait dépasser la consigne on arrête.
si on tombe sous la consigne, on aura gagné en réactivité car le radiateur sera préchauffé.

les valeur d'incrément/décrément du compteur sont réglables ce qui modifie tous les temps énoncés précédemment.
ça permet d'ajuster

voili voilou

un petit graph prochainement pour mettre ceci en 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
frugonn
Messages : 15
Inscription : 22 janv. 2016, 14:28

Re: script de chauffage avec détection PIR et retour de conso

Message par frugonn »

Bonjour,
j'ai tenté d'integrer ton script que je trouve tres interessant a mon systeme de chauffage.
Je dispose d'un detecteur de mouvement et de chauffages dans mon salon.

J'ai tenté d'adapter le script mais j'ai l'impression qu'il me manque des données notement vis a vis des variables globales energy et npower qui ne sont pas declarées dans le script.

J'attends la lueur de ta lanterne. et encore bravo pour ton travail.


Fred.
vil1driver
Messages : 5661
Inscription : 30 janv. 2015, 11:07
Localisation : Rennes (35)

Re: script de chauffage avec détection PIR et retour de conso

Message par vil1driver »

salut,

energy et npower n'ont pas à être déclarées, c'est interne au script. le compteur virtuel lui doit être créé et renseigné, ou alors supprimer tout ce qui s'y rapporte
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
frugonn
Messages : 15
Inscription : 22 janv. 2016, 14:28

Re: script de chauffage avec détection PIR et retour de conso

Message par frugonn »

Bonsoir,

merci pour les infos,

J'ai donc intégré le scipt, cependant j'ai une erreur :

Code : Tout sélectionner

2016-01-27 00:05:00.277 Error: EventSystem: ...e/pi/domoticz/scripts/lua/script_time_ChauffageSALON.lua:237: attempt to concatenate global 'energy' (a nil value)
J'ai adapté les variables et voici le code :

Code : Tout sélectionner

--[[ 

Type:          time
Name:          chauffageChambre
 
Description:   Ce script permet de maintenir une température de confort,
            suivant la détection de notre présence (dans une plage horaire donnée),
            puis de progressivement abaisser la température en notre abscence.

Usage:         un interrupteur général 'mode' permet de passer du mode auto (conf/éco) au mode hors gêle.
            un second 'boost' permet de chauffer hors plage horaire (toujours sur détection de présence)
            un troisième 'guess' permet de forcer notre présence

            si nous faisons la fête, pour avoir du chauffage tant que la soirée à lieu
            activer 'boost'
            'boost' se désactivera de lui même après une heure sans détection de présence
            
            si vous voulez chauffer(confort) même sans détection de mouvement (bébé, personne alitée)
            activer 'guess'
            
            le script permet également de renseigner un capteur virtuel de consommation électrique.
            
Inertie:      lorsque le chauffage est allumé, on incrémente un compteur +1/min
            suivant ce compteur, la consigne à atteindre est abaissée de 0.1°C toutes les 10 minutes, avec un abaissement maxi de 0.5°C
            donc plus le temps passe, plus la température de la pièce augmente et plus la consigne baisse..

            lorsque la température rejoint la consigne(modifiée), on arrête de chauffer.
            on laisse un peu la pièce profiter de l'énergie accumulée dans les radiateurs.
            et on décrémente le compteur -1/min ce qui va remonter la consigne de 0.1°C toutes les 10 minutes
            donc plus le temps passe et plus la température continue de monter et plus la consigne augmente (jusqu'à relancer la chauffe)

            lorsque l'on atteint et/ou dépasse la consigne initiale le compteur est remis à zéro.
            au bout de 10 minutes à la consigne voulue, on remet en route le chauffe pour 2min puis on le stop 2min et on recommence.
            si cela nous fait dépasser la consigne on arrête.
            si on tombe sous la consigne, on aura gagné en réactivité car le radiateur sera préchauffé.

--]]
 
--------------------------------
------ Variables à éditer ------
--------------------------------

-- nom de zone
local zone = 'Salon'                  -- nom de la zone pour affichage dans les logs et alerte mail

-- consignes
local consigne_conf = 'Th_Salon'           -- nom de thermostat virtuel de gestion de la température de confort
local consigne_abs = 10                 -- Température lors d'abscence prolongée (hors gêle)
local consigne_1h = 0.5                  -- valeur d'abaissement de la consigne après 1 heure d'abscence
local consigne_2h = 1.5                  -- valeur d'abaissement de la consigne après 2 heure d'abscence
local consigne_3h = 2.5                  -- valeur d'abaissement de la consigne après 3 heure d'abscence

-- capteurs
local sonde = 'T° Salon'                   -- Nom de la sonde de température
local presence = 'Motion Salon'             -- Nom du capteur de mouvement
local mode = 'mode_chauffage'                -- Nom de l'interrupteur virtuel général (On=auto Off=hors gêle)
local boost = 'BOOST RADIATEURS PAV'                  -- Nom de l'interrupteur virtuel pour déroger au couvre feu (chauffer hors plage de chauffe définie) 
local guess = 'GUESS SALON'                  -- Nom de l'interrupteur virtuel pour forcer notre présence

-- période de chauffage
-- pour une période de 24h, mettre debut = '00:00' et fin = '24:00'
-- bien respecter le format hh:mm
local debut =    '07:00'
local fin =    '23:00'

-- radiateur
local radiateur = 'Planning Radiateurs Maison'     -- Nom de l'interrupteur de chauffage
local puissance = 3800                 				 -- puissance du chauffage en watt
local conso = 'Compteur_NRJ'      		      -- nom du capteur virtuel de consommation électrique (type= instant + counter)
local conso_id = 82138                  -- idx du capteur virtuel de consommation électrique
local reset = false                     -- force la mise à zero de la consomation instantané (laisser à false pour un fonctionnement normal) true/false

-- inertie
local inertie = true                  -- radiateur à inertie (beta) true/false
local up = 0.7                        -- incrément du compteur par minute (vitesse d'abaissement de la consigne)
local down = 1.3                     -- décrément du compteur par minute (vitesse de remontée de la consigne)

-- email
local mail = 'fr.hugonnet@gmail.com'         -- pour réception alerte sonde muette (chauffage coupé)

-- domoticz
local url = '192.168.1.84:8080'         -- user:pass@ip:port de domoticz, pour la création des variables

--------------------------------
-- Fin des variables à éditer --
--------------------------------
 


function timedifference(d)
   s = otherdevices_lastupdate[d]
   year = string.sub(s, 1, 4)
   month = string.sub(s, 6, 7)
   day = string.sub(s, 9, 10)
   hour = string.sub(s, 12, 13)
   minutes = string.sub(s, 15, 16)
   seconds = string.sub(s, 18, 19)
   t1 = os.time()
   t2 = os.time{year=year, month=month, day=day, hour=hour, min=minutes, sec=seconds}
   difference = os.difftime (t1, t2)
   return difference
end

-- quelle heure est-il
local heure = string.sub(os.date("%X"), 1, 5)
-- on regarde depuis combien de temps on est abscent
local abscence = string.sub(os.date("!%X", timedifference(presence)), 1, 5)
if (otherdevices[guess] == 'On') then
   abscence = '00:00'
end   
-- notre dernière apparition était elle dans la plage horaire ?
if ((60*tonumber(string.sub(heure,1,2)) + tonumber(string.sub(heure,4,5))) - (60*tonumber(string.sub(abscence,1,2)) + tonumber(string.sub(abscence,4,5))) >= 60*tonumber(string.sub(debut,1,2)) + tonumber(string.sub(debut,4,5))) then
   inScope = true
else
   inScope = false
end
-- on regarde de quand date la dernière relève de température
local lastSeen = string.sub(os.date("!%X", timedifference(sonde)), 1, 5)

commandArray = {}

   --envoie d'une alerte mail si la sonde reste muette (pas de valeur reçue sur les 30 dernières minutes)
   if (lastSeen >= '00:30' and lastSeen < '00:32') then
      commandArray['SendEmail']='Domoticz Alerte#Alerte sonde '..zone..' muette#'..mail
   end
   
   -- création variable pour mémoriser la durée de chauffe, servant à éviter un fort dépassement de consigne suite à une longue période de chauffe (inertie des radiateurs)
   if (uservariables['chauffage_'..zone] == nil) then
      commandArray['OpenURL']=url..'/json.htm?type=command&param=saveuservariable&vname=chauffage_'..zone..'&vtype=2&vvalue=0'
      print('script chauffage '..zone..' interrompu pour création variable manquante')
      return commandArray
   end   
   
      
   -- gestion de la consigne
   consigne_conf = tonumber(otherdevices_svalues[consigne_conf])
   -- si le thermostat général est actif
    if (otherdevices[mode] == 'On') then
      -- si il y a absence de moins d'une heure, la journée ou jusqu'au landemain matin si boost actif
        if ((inScope or otherdevices[guess] == 'On') and abscence <= '01:00' and ((heure >= debut and heure < fin) or otherdevices[boost] == 'On')) then 
         consigne = consigne_conf
      -- si absence de 1 à 2 heures la journée, abaissement de la consigne de 1°C
      elseif ((inScope or otherdevices[guess] == 'On')  and abscence > '01:00' and abscence <= '02:00' and heure >= debut and heure < fin) then 
         consigne = consigne_conf - consigne_1h
      -- si absence de 2 à 3 heures la journée, abaissement de la consigne de 2°C   
      elseif ((inScope or otherdevices[guess] == 'On')  and abscence > '02:00' and abscence <= '03:00' and heure >= debut and heure < fin) then
         consigne = consigne_conf - consigne_2h
      -- sinon, passage en consigne éco (3°C en dessous de la consigne confort)
      else
         consigne = consigne_conf - consigne_3h
         commandArray[boost] = 'Off'
      end
   else
         consigne = consigne_abs
   end   
   
   
   -- adaptation de la consigne pour tenir compte de l'inertie des radiateurs
   -- on soustrait/ajoute 0.1°C à la consigne, par tranche de 10 minutes (max 1°C)
   local count = tonumber(uservariables['chauffage_'..zone])
   if (count > 0) then
      adj = math.ceil(count / 10) / 10 - 0.1
   else
      adj = math.ceil(count / 10) / 10
   end   
   if (inertie) then
      consigne = consigne - adj
   end

      
   -- on récupère la température fournie par la sonde
    local temperature = tonumber(string.sub(otherdevices_svalues[sonde],1,4)) 

   
   -- si la température est supérieure ou égale à la consigne,
   -- ou que la sonde semble muette (10 min sans relève),
   if (temperature >= consigne or lastSeen > '00:10') then   
   
      -- on stop la chauffe 
      commandArray[radiateur]='Off'
      log = 'Radiateur -. OFF .-'
      
      
      -- calcul de la conso
      npower, energy = string.match(otherdevices_svalues[conso], "(%d+%.*%d*);(%d+%.*%d*)")
      if (otherdevices[radiateur] == 'On') then
         power = tonumber(npower - puissance)
         if (power < 0) then
            power = 0
         end
      else
         power = tonumber(npower)
      end   
      energy = tonumber(energy)
      
      
      -- si on dépasse la consigne voulue on remet le compteur à zero
      if (temperature > consigne + adj) then
         commandArray['Variable:chauffage_'..zone] = '0'
      -- on décrémente progessivement le compteur durée de chauffe (on ne passe sous zero que si on est à la consigne voulue)   
      elseif (otherdevices[radiateur] == 'Off' and (count > 0 or temperature == consigne + adj)) then
         commandArray['Variable:chauffage_'..zone] = tostring(count - down)
      end

      
   -- si la température est inférieur à la consigne et que la sonde est OK
   else
   
      -- on chauffe
      commandArray[radiateur]='On'
      log = 'Radiateur -. ON .-'
      
            
      -- calcul de la conso
      npower, energy = string.match(otherdevices_svalues[conso], "(%d+%.*%d*);(%d+%.*%d*)")
      if (otherdevices[radiateur] == 'On') then
         power = tonumber(npower)
      else
         power = tonumber(npower + puissance)
      end   
      energy = tonumber(energy + (puissance / 60))
      
      
      -- si on tombe sous la consigne voulue et que le compteur est negatif, on le remet à zero
      if (temperature < consigne + adj and tonumber(uservariables['chauffage_'..zone]) < 0) then
         commandArray['Variable:chauffage_'..zone] = '0'
      -- sinon on incrémente le compteur durée de chauffe (max 100)
      elseif (otherdevices[radiateur] == 'On' and count + up <= 50) then   
         commandArray['Variable:chauffage_'..zone] = tostring(count + up)
      end
   end
   
   -- envoie de la conso dans le capteur virtuel d'énergie
   if (reset) then
      power = 0
   end   
   commandArray[3]={['UpdateDevice'] = conso_id .. '|0|' .. power .. ';' .. energy}
   
   -- logs
   print('*** Chauffage '..zone..' ***')
   print(log)
   if inertie then
      print('Gestion de l\'inertie: count '..count)
   end
   if (otherdevices[boost] == 'On') then
      print('Couvre feu désactivé')
   end   
   if (inScope and otherdevices[guess] == 'Off')then
      print('Absence '..zone..' : '..abscence)
   elseif (otherdevices[guess] == 'On') then
      print('Présence continue activée')
   end   
   if (otherdevices[mode] == 'Off') then
      print('Thermostat général sur Off')
   elseif (lastSeen > '00:10') then
      print('Sonde muette !')
   else   
      print('il fait '..temperature..'°C pour '..consigne..'°C souhaité')
   end   
   print('*** *** *** *** *** ***')
return commandArray
Quelqu'un aurait une idée du problème ?
je tourne en Version: 2.3530
Build Hash: 9eef872

Merci d'avance
vil1driver
Messages : 5661
Inscription : 30 janv. 2015, 11:07
Localisation : Rennes (35)

Re: script de chauffage avec détection PIR et retour de conso

Message par vil1driver »

certains ont eu à rebooter.. essai..

sinon c'est bien un compteur 'instant + counter' que tu as créés ?

fiou idx = 82138 .??
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
frugonn
Messages : 15
Inscription : 22 janv. 2016, 14:28

Re: script de chauffage avec détection PIR et retour de conso

Message par frugonn »

Bonjour,

alors apres reboot, toujours rien,
sinon qu'appelle tu compteur 'instant + counter'? j'ai fais un virtual depuis les dispositif et celui oui il a le logo avec un eclaire.
(je sais pas si c'est claire)
pour l'idx il est affiché dans les dispositifs utilisé du coups, le nombre m'a effectivement surpris, sachant que j'ai pas tant de dispositif dans ma config.

sinon peux tu m'expliquer cette ligne qui bug justement ? les '..' et '|0|', comment savoir quels arguments doivent recevoir un peripherique et sous quelle forme (int, var, string.. ) ?

Code : Tout sélectionner

commandArray[3]={['UpdateDevice'] = conso_id .. '|0|' .. power .. ';' .. energy}


merci d'avance
frugonn
Messages : 15
Inscription : 22 janv. 2016, 14:28

Re: script de chauffage avec détection PIR et retour de conso

Message par frugonn »

Bonjour,

J'ai réussi a faire marcher le script, je n'avais pas le bon compteur ! enfin voila résolu. Aussi ce n'etait pas le bon IDX j'ai confondu avec l'ID ce qui est totalement different. Sais tu comment faire pour creer un compteur qui additionne tous les compteurs virtuels de chauffage ?

Sinon le script fonctionne a merveille, je l'ai modifié pour les instruction avec un interrupteur planning.

A bientôt.
vil1driver
Messages : 5661
Inscription : 30 janv. 2015, 11:07
Localisation : Rennes (35)

Re: script de chauffage avec détection PIR et retour de conso

Message par vil1driver »

Ce script permet de n'utiliser qu'un seul compteur..
Tout se cumule sur le même.
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
vil1driver
Messages : 5661
Inscription : 30 janv. 2015, 11:07
Localisation : Rennes (35)

Re: script de chauffage avec détection PIR et retour de conso

Message par vil1driver »

Maj du script pour prendre en compte une récente remontée de bug :D

viewtopic.php?p=12617#p12617
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
bruno_ghost17
Messages : 97
Inscription : 01 févr. 2016, 18:56
Localisation : Rochefort(17)

Re: script de chauffage avec détection PIR et retour de conso

Message par bruno_ghost17 »

bonjour a tous
je suis tout nouveau dans domoticz etant ayant depuis peu un RPI 2, j'ai rejoins ce forum
je commencerais par saluer l'excellent travail de vil1driver , j'ai adapté un peu car je n'ai pas de detecteur de mouvement et j'ai un gros toutou ! lol
vil1driver,pourrais je te demander le raisonnement que tu a suivi pour l'inertie des radiateurs(j'ai un radiateur steatite et un grille pas (atlantic) que je mets en marche s'il y a plus de 3° a rattraper) , j'aimerais y inclure la temperature exterieure qui a mon avis influx pas mal sur l'inertie.

bon , je ne suis au LUA que depuis une semaine a tout casser , j'ai un peu de mal avec la comprehension de certaine choses ,donc je pioche a droite et a gauche pour arriver a mes fins :)


merci ! :)
Raspi 2 - RFxCom - sondes Oregon
Répondre