Ta function voir_les_logs (s, debugging) ne doit pas être placé dans la boucle for key, mais avant, au niveau de l'autre fonction.
Idem pour
cette ligne doit être placé en dehors de la boucle for key, avant.
La fonction voir_les_logs est destiné à remplacé tout les
afin d'éviter l'erreur d'oublier le end à la fin.
Inutile de ne l'utiliser qu'une seule fois, autant s'en passer dans ces conditions.
Ta fonction
Code : Tout sélectionner
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)
if (year > '2000') and (year < '2099')
and (month >= '01') and (month <= '12')
and (day >= '01') and (day <= '31')
and (hour >= '00') and (hour <= '23')
and (minutes >= '00') and (minutes <= '59')
and (seconds >= '00') and (seconds <= '59') then
t1 = os.time()
end
t2 = os.time{year=year, month=month, day=day, hour=hour, min=minutes, sec=seconds}
difference = os.difftime (t1, t2)
return difference
end
dans laquelle tu a ajouté un test sur la valeur year, month day, hour, minutes et seconds ne te retourneras pas la valeur t1 = os.time() si les conditions ne sont pas respectées, la fonction te retournera donc une erreur.
Attention à l'utilisation de la variable log, j'utiliserais plutôt log1, il me semble que ça peux être autre chose qu'une variable nativement.
Idem pour le mot debug, utilise plutôt debugging par rexemple.
Pour l'utilisation de
tu risque d’être notifié très souvent, ce qui était la cas chez moi.
Ta variable statut n'est pas déclaré et pas initialisé par défaut.
Attention également à l'utilisation de
Si je n'ai rien oublié, ceci est plus propre
Code : Tout sélectionner
--[[
par Nissa MAJ du 09/02/2019
Ajout de la verification de l'état du poele avant action
Ajout de variables d'état pour rendre le code plus lisible
Type: time
Name: chauffage
Algorythme :
Si Chauffage=ON et Programmateur chauffage=ON
Consigne=Confort (22)
sinon
Consigne=Eco(19)
sinon Consigne=Hors gel(17)
NOTA : Ce script est volontairement tres verbeux afin d'avoir dans les logs le statut de chaque radiateur
(toutes les minutes !). On peut l eviter en initialisant la variable 'verbose' a false.
Sinon, il est fortement conseille de commenter l option log de domoticz (dans domoticz.sh) afin de ne pas
saturer l espace de stockage par un fichier log trop important
--]]
----------------------------------------------
------ Configuration ------
----------------------------------------------
local piece={} -- Tableau Rajouter ici les radiateurs
piece['0']='chambre Dorian'
piece['1']='SdB enfants'
local watt={} -- Tableau Rajouter ici la puissance en watts du radiateur (L'index doit correspondre a celui de la piece ci-dessus)
watt['0']='1250'
watt['1']='1000'
local presence = 'Chauffage'
local calendrier = 'Programmateur chauffage'
-- consignes de thermostat virtuels
local consigne_confort = 'Confort'
local consigne_eco = 'Eco'
local consigne_horsgel = 'Hors gel'
local conso = 'Consommation chauffage' -- nom du capteur virtuel de consommation électrique (type= instant + counter)
local conso_id = 80 -- 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
local hysteresis = 0.4 -- Valeur seuil pour éviter que le relais ne cesse de commuter dans les 2 sens
local debugging = false -- true or false pour voir tous les messages debug dans le log
local verbose = true -- Print ou non des logs
-- email
local mail = 'xxxx' -- pour réception alerte sonde muette (chauffage coupé)
-- domoticz
local url = '192.168.x.xx:xxxx' -- user:pass@ip:port de domoticz, pour la création des variables
local status = 0
local cumul_power = 0 -- initialisation de la puissance instantanee des radiateurs en fonctionnement
----------------------------------------------
-- Fin de la partie configuration --
----------------------------------------------
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
commandArray = {}
for key, valeur in pairs(piece) do
-- Maj des variables en fonction de la valeur de la table
local le_radiateur_est_sur_ON = false -- Etat du radiateur false ou true
local sonde_KO = false -- Sonde de temperature HS
local sonde = string.format("%s%s", "Temperature ", valeur) -- Nom de la sonde de température
local radiateur = string.format("%s%s", "Radiateur ", valeur) -- Nom de l'interrupteur de chauffage
log1 = '***'
log2 = '***'
local heure = string.sub(os.date("%X"), 1, 5) -- Recuperation de l'heure du systeme
local lastSeen = string.sub(os.date("!%X", timedifference(sonde)), 1, 5) -- Heure de la derniere releve de la sonde de temperature
puissance=tonumber(watt[key]) -- Puissance en watt du radiateur
if (debugging) then print ('>>>>>>>>>>>>>>>Initialisation '..puissance..' Radiateur>'..valeur) end
----------------------------------------------
------ Alerte mail ------
-- si la sonde est muette depuis 30' --
----------------------------------------------
if (lastSeen >= '00:30' and lastSeen < '00:32') then
commandArray['SendEmail']='Domoticz Alerte#Alerte sonde chambre '..piece..' muette#'..mail
if (debugging) then print('>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> Envoi mail probleme de sonde ') end
end
----------------------------------------------
------ Gestion consigne ------
----------------------------------------------
-- récupération de la valeur du thermostat
if (otherdevices[presence] == 'On') then -- si la presence est active (interrupteur manuel 'Chauffage')
if (otherdevices[calendrier] == 'On') then -- ET calendrier ON (Programmateur chauffage)
consigne = tonumber(otherdevices_svalues[consigne_confort])
else
consigne = tonumber(otherdevices_svalues[consigne_eco])
end
else -- presence = OFF
consigne = tonumber(otherdevices_svalues[consigne_horsgel])
end
if (debugging) then print('>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> Initialisation Consigne chambre '..valeur..' > '..consigne) end
-- on récupère la température fournie par la sonde
local temperature = otherdevices_temperature[sonde]
if (debugging) then print('>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> Recup valeur sonde chambre '..valeur..' > '..temperature) end
----------------------------------------------
-- Inititialisation des Variables d etat --
----------------------------------------------
if (otherdevices[radiateur] == 'On') then le_radiateur_est_sur_ON = true end
if lastSeen > '00:10' then
local sonde_KO = true
log2 = '*** Sonde muette '
end
----------------------------------------------
------ Gestion du radiateur ------
--- selon temperature relevee et consigne --
----------------------------------------------
if (le_radiateur_est_sur_ON) and not (sonde_KO) then
log1 = '*** IF 1 > Le Radiateur est en marche'
status = 1
if temperature >= (consigne + hysteresis) then
commandArray[#commandArray + 1]={[radiateur]='Off'}
log1 = '*** IF 2 > Arret du Radiateur'
status = 0 -- Pour eviter le delai de la Maj du device (variable utilisee dans le if du calcul de conso)
end
else
log1 = '*** IF 3 > Le Radiateur est arrete'
status = 0
if temperature <= (consigne - hysteresis) and not (sonde_KO) then
commandArray[#commandArray + 1]={[radiateur]='On'}
log1 = '*** IF 4 > Allumage du Radiateur'
status = 1
end
end
-- calcul de la conso (npower = puissance actuelle / energy = puissance cumulee)
npower, energy = string.match(otherdevices_svalues[conso], "(%d+%.*%d*);(%d+%.*%d*)") -- extraction des valeurs stockees dans le device conso
if (status == 1) then -- le radiateur est allume
cumul_power = tonumber(cumul_power + puissance)
energy = tonumber(energy + (puissance / 60)) -- puissance journaliere cumulee
else -- Le radiateur est eteint
energy = tonumber(energy)
end
power = tonumber(cumul_power) -- puissance instantanee
-- envoi de la conso dans le capteur virtuel d'énergie
if (reset) then
power = 0
energy = 0
end
commandArray[#commandArray + 1]={['UpdateDevice'] = conso_id .. '|0|' .. power .. ';' .. energy}
-- logs
if (verbose) then
print ' '
print('********************* Chauffage '..valeur..' *********************')
print('*** Il fait '..temperature..'°C pour une consigne de '..consigne..'°C souhaités')
print(log1,log2)
print('********************************************************************')
end
end -- fin de tableau
return commandArray