Script Lua et base qui grossit indéfiniment

Forum dédié aux problématiques concernant les scripts pour DomoticZ.
Entourez votre code et les logs avec les balises nommées code grâce au bouton <\>.
regis
Messages : 20
Inscription : 09 févr. 2018, 19:02

Script Lua et base qui grossit indéfiniment

Message 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

Keros
Messages : 6638
Inscription : 23 juil. 2019, 20:57

Re: Script Lua et base qui grossit indéfiniment

Message 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.
Comment bien utiliser le forum : Poser une question, Mettre un script, un fichier, une image ou des logs
Mes petits guides : Débuter en programmation, Le débogage, Le choix de matériel, Les sauvegardes
Ma présentation - Mes Tutos
regis
Messages : 20
Inscription : 09 févr. 2018, 19:02

Re: Script Lua et base qui grossit indéfiniment

Message 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
regis
Messages : 20
Inscription : 09 févr. 2018, 19:02

Re: Script Lua et base qui grossit indéfiniment

Message par regis »

Finalement LigthingLog ne s"efface pas tous les soirs, je verrai demain comment la nettoyer
ogulf
Messages : 445
Inscription : 15 juin 2017, 14:41

Re: Script Lua et base qui grossit indéfiniment

Message 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.)
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
regis
Messages : 20
Inscription : 09 févr. 2018, 19:02

Re: Script Lua et base qui grossit indéfiniment

Message 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é
Répondre