Page 1 sur 1

Script Lua et base qui grossit indéfiniment

Publié : 24 nov. 2019, 19:25
par regis
Bonjour

Je voudrais mettre en place une commande automatisée de mes radiateurs électriques.
J'ai des modules Dio qui commandent mes radiateurs en 433Hz.
Dans domoticz, j'ai un interrupteur qui commande sans problème un des radiateurs (chambre1)
J'ai un script Lua (script_device_chauffageCh1.lua) qui récupère les valeurs d'un thermomètre Oregon, d'un thermostat virtuel et déclenche ou pas l'allumage du radiateur. Ce script fonctionne correctement et gère bien le radiateur.
Mon problème : le script n'arrête pas de se lancer, jusqu'à 13 fois par seconde ce qui entraîne un grossissement de la base démesuré (de 1Mo à 27 Mo en 1/2 journée), celle-ci enregistrant chaque ordre envoyé au radiateur dans la table LightingLog.

Si je supprime les enregistrements de ce radiateur dans la table et que je nettoie la base avec VACUUM, la base fait à nouveau moins de 1Mo

Le gros problème, la base devient plus grosse que le répertoire /var/tmp (en mémoire vive) et les sauvegardes échouent.
J'ai bien augmenté la taille du répertoire mais la base ne faisant que grossir, ce n'est pas pérenne. Quand /var/tmp était sur la carte SSD, la base a fini par remplir pratiquement toute la carte

Comment puis-je faire pour avoir moins de log ?
Du coup me vient une idée, est-ce bien un script_device qu'il faut que j'utilise ou ne serait-ce pas mieux de passer par un script_time ?

Code : Tout sélectionner

-- ===== script LUA =====

-- =================================
-- Thermostat ch1
-- =================================

-- ———————————————-
-- —— Configuration ——
-- ———————————————-

-- nom de zone
local zone = "chambre_ch1" -- nom de la zone pour affichage dans les logs et alerte mail

-- consignes
local consigne_conf = 'Thermostat_ch1' -- nom du 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_nuit = 16 -- Température pour la nuit

-- capteurs
local sonde = 'Thermometre_ch1' -- Nom de la sonde de température
local mode = 'Chauffage' -- Nom de l’interrupteur virtuel général (On=auto Off=hors gêle)

-- bien respecter le format hh:mm
-- heures pleines
local debut = '06:00'
local fin = '22:00'
-- heures creuses
local debutNuit = '22:00'
local finNuit = '06:00'

-- radiateur
local radiateur = 'radiateur_ch1' -- Nom de l’interrupteur de chauffage 
local modech1 = 'Chauffage_ch1' -- Nom du selecteur de mode de chauffage
local arret = "0"
local force = '10'
local automatique = "20"
local horsGel = '30'
local manuel = '40'

-- email
local mail = 'xxxxx.xxxxxxxxxx@xxxxxxxxxx.xx' -- pour réception alerte sonde muette (chauffage coupé)

-- ———————————————-
-- — Fin de la partie configuration —
-- ———————————————-

-- Calcule la durée depuis la dernière mise à jour
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 pour gérer les heures creuses un jour
local heure = string.sub(os.date('%X'), 1, 5)
--  notre dernière apparition était elle dans la plage horaire heures pleines?
if (
        (
            (60*tonumber(string.sub(heure,1,2)) + tonumber(string.sub(heure,4,5))) >= 60*tonumber(string.sub(debut,1,2)) + tonumber(string.sub(debut,4,5))
            and
            (60*tonumber(string.sub(heure,1,2)) + tonumber(string.sub(heure,4,5))) < 60*tonumber(string.sub(fin,1,2)) + tonumber(string.sub(fin,4,5))
        )
    ) then
    inScope = true
else
    inScope = false
end

if (
	(
		(60*tonumber(string.sub(heure,1,2)) + tonumber(string.sub(heure,4,5))) >= 60*tonumber(string.sub(finNuit,1,2)) + tonumber(string.sub(finNuit,4,5) - 120)
		and
		(60*tonumber(string.sub(heure,1,2)) + tonumber(string.sub(heure,4,5))) < 60*tonumber(string.sub(finNuit,1,2)) + tonumber(string.sub(finNuit,4,5))
	)
) then
	-- on remonte la température de la pièce à la température du thermostat à partir de 4:00 du matin en profitant des heures creuses
	consigne_nuit = tonumber(otherdevices_svalues[consigne_conf])	
end

-- on calcule de quand date la dernière relève de température
local lastSeen = string.sub(os.date('!%X', timedifference(sonde)), 1, 5)


commandArray = {}
  
   -- print ('===== '..otherdevices[mode]..' =====')
  if (otherdevices[mode] == "On") then
      if (otherdevices_svalues[modech1] == arret) then
         -- on stoppe la chauffe
         -- print ('Interrupteur '..radiateur..' sur  Arrêt')
        commandArray[radiateur]='On'
        -- print (radiateur..' -. ON .-')
     elseif (otherdevices_svalues[modech1] == force) then
        -- on chauffe
        -- print ('Interrupteur '..radiateur..' sur  Force')
        commandArray[radiateur]='Off'
        -- print( radiateur..' -. OFF .-')
     elseif (otherdevices_svalues[modech1] == automatique or otherdevices_svalues[modech1] == horsGel ) then
        -- si la sonde semble muette (10 min sans relève),
          if (lastSeen > '00:10') then
            -- on stoppe la chauffe
            commandArray[radiateur]='On'
            -- print (radiateur..' -. ON .-')
          else
            -- on récupère la température fournie par la sonde
            local temperature = math.floor(10*tonumber(otherdevices_temperature[sonde]))/10
            if (otherdevices_svalues[modech1] == automatique) then
              -- print ('Interrupteur '..radiateur..' sur Automatique')
              -- récupération de la valeur du thermostat
              -- ##### TODO : gérer la couleur du jour #####
              -- si couleur du jour = Rouge et heures pleines → hors gel
              -- sinon → thermostat
              consigne_conf = tonumber(otherdevices_svalues[consigne_conf])
              if (otherdevices[mode] == 'On') then
                consigne = consigne_conf
              else
                consigne = consigne_abs
              end
            else
               -- print ('Interrupteur '..radiateur..' sur Hors gel')
              consigne = consigne_abs
            end
            -- si la température est supérieure ou égale à la consigne,
            if (temperature >= consigne) then
                -- on stoppe la chauffe
                commandArray[radiateur]='On'
            end
            -- si la température est inférieur à la consigne et que la sonde est OK
            if ((temperature < consigne - 0.25) and (lastSeen <= '00:10')) then
                -- on chauffe
                commandArray[radiateur]='Off'
            end
                 
          end
      elseif (otherdevices_svalues[modech1] == manuel) then
         -- print ('Interrupteur '..radiateur..' sur  Manuel')
         -- on ne fait rien
      else
         print ('Interrupteur '..radiateur..' position inconnue : '..otherdevices_svalues[modech1])
      end
   
  end
  
return commandArray


Re: Script Lua et base qui grossit indéfiniment

Publié : 24 nov. 2019, 20:21
par Keros
Je pense que tu as beaucoup de lancement car ton script s'exécute dès que tu as un capteur qui varie dans Domoticz.

Regarde les scrpits Device par défaut, tu verras qu'il y a un test pour regarder si le nom du capteur qui vient de changer de valeur correspond à celui que l'on souhaite.

Sinon, tu as les script time qui s'exécute toutes les minutes.

Re: Script Lua et base qui grossit indéfiniment

Publié : 24 nov. 2019, 22:02
par regis
C'est bien le problème, en fait, je n'avais pas compris comment ne lancer le script que quand le thermostat, le thermomètre ou le sélecteur de mode change.

Maintenant, le script ne se lance que toutes les 45'' (mise à jour du thermomètre) ça devrait réduire un grand coup la taille de la base et la table LigthingLog devrait se vider toutes les nuits (si j'ai bien compris le fonctionnement).

Merci pour la piste

Re: Script Lua et base qui grossit indéfiniment

Publié : 25 nov. 2019, 01:07
par regis
Finalement LigthingLog ne s"efface pas tous les soirs, je verrai demain comment la nettoyer

Re: Script Lua et base qui grossit indéfiniment

Publié : 25 nov. 2019, 18:27
par ogulf
regis a écrit : 25 nov. 2019, 01:07 Finalement LigthingLog ne s"efface pas tous les soirs, je verrai demain comment la nettoyer
L'historique des log dépend du nombre de jours paramétrés dans... paramètres/historique des logs
À toi de voir quelle profondeur d'historique tu souhaites (1j, 3j, 7j etc.)

Re: Script Lua et base qui grossit indéfiniment

Publié : 27 nov. 2019, 01:02
par regis
Merci

J'étais persuadé de l'avoir déjà réglé à 1 jour.
Cette nuit, l'historique des logs s'est bien nettoyé