Script Lua et base qui grossit indéfiniment
Publié : 24 nov. 2019, 19:25
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 ?
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