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 <\>.
--------------------------------
------ Variables à éditer ------
--------------------------------
local user_var = 'Pompe Piscine' -- Nom de la variable utilisateur (uservariable)utilisé pour mémoriser la valeur en minutes dans Domoticz (Domoticz-->configuration-->plus d'options-->variables utilisateurs).
local switch = 'Relais_pompe_piscine' -- Nom de l'interrupteur virtuel de la pompe dans Domoticz
local Heure_Besoin = 'Besoin_filtration' --Durée de filtration requise en fonctione de la temperature
local counter_txt = 345 -- Numéro idx du capteur virtuel texte "Durée filtration"
local besoin_txt = 344 -- Numéro idx du capteur virtuel texte "Besoin_filtration"
local Heure_Raz = 10 -- Heure de remise à zéro du compteur.
local duree_cycle = 80 --M3 piscine / débit M3 pompe *60
--Definition de la durée de filtration en fonction du temps d'un cycle/Température
local T_eau=tonumber((otherdevices_svalues['Sortie_piscine']))
local T_eau_chaude=tonumber((otherdevices_svalues['entree_piscine']))
local M3 = 4
local M3H = 3
local duree_cycle = tonumber(M3)/tonumber(M3H)*60 --M3 piscine / débit M3 pompe *60
local C01=(0.1 *duree_cycle) -- si <10°
local C02=(0.5*duree_cycle) -- si 10-14°
local C03=(1*duree_cycle) -- si 15-20°
local C04=(2*duree_cycle) -- si 20-28°
local C05=(3*duree_cycle) -- si >28°
--------------------------------
-- Fin des variables à éditer --
--------------------------------
local scriptName = 'Cyclage_Filtration'
local scriptVersion = '0.1'
print "---------------------------------------------------------------------------------------------------"
print "--------------------Calcul du temps de fonctionnement quotidien -----------------------------------"
print "---------------------------------------------------------------------------------------------------"
commandArray = {}
time=os.time()
local minutes = tonumber(os.date('%M',time))
local hours = tonumber(os.date('%H',time))
local NowInMinutes = (hours * 60 + minutes)
local h_min = (Heure_Raz * 60)
print "----------------------------------------------------------------------------------------------------"
print "--------------------Calcul du temps de cycles ------------------------------------------------------"
print "----------------------------------------------------------------------------------------------------"
if tostring(Valeur_Compteur) > tostring(Valeur_Besoin) then domoticz.device('switch').switchOff()
----------------------------------------------------------------------------------------------------------
elseif tostring(T_eau) < '10' then
commandArray ['Variable:Besoin_filtration'] = (C01) and print("C01 - temps nécessaire = "..C01.." mn "..(uservariables['Besoin_filtration']))
----------------------------------------------------------------------------------------------------------
elseif tostring(T_eau) >= '10' and tostring(T_eau) < '14' then
commandArray ['Besoin_filtration'] = (C02) and print("C02 - temps nécessaire = "..C02.." mn "..(uservariables['Besoin_filtration']))
----------------------------------------------------------------------------------------------------------
elseif tostring(T_eau) >= '14' and tostring(T_eau) < '20' then
commandArray ['Besoin_filtration'] = (C03) and print("C03 - temps nécessaire = "..C03.." mn "..(uservariables['Besoin_filtration']))
----------------------------------------------------------------------------------------------------------
elseif tostring(T_eau) >= '20' and tostring(T_eau) < '28' then
commandArray ['Besoin_filtration'] = (C04) and print("C04 - temps nécessaire = "..C04.." mn "..(uservariables['Besoin_filtration']))
----------------------------------------------------------------------------------------------------------
elseif tostring(T_eau) >= '28' then
commandArray ['Variable:Besoin_filtration'] = (C05) and print("C05 - temps nécessaire = "..C05.." mn "..(uservariables['Besoin_filtration']))
----------------------------------------------------------------------------------------------------------
end
print("Température "..T_eau)
print("Valeur du scenario 1 -> "..C01.." si <10° ") --Status: LUA: 8.0
print("Valeur du scenario 2 -> "..C02.." si 10-14° ") -- Status: LUA: 40.0
print("Valeur du scenario 3 -> "..C03.." si 15-20° ") -- Status: LUA: 80
print("Valeur du scenario 4 -> "..C04.." si 20-28° ") -- Status: LUA: 160
print("Valeur du scenario 5 -> "..C05.." si >28° ") -- Status: LUA: 160
print(Heure_Besoin.." <- Valeur de la variable Heure_Besoin")
print(uservariables['Besoin_filtration'].." <- Valeur de la variable user 'Besoin_filtration'")
print(uservariables['Pompe Piscine'].." <- Valeur de la variable user 'Pompe Piscine'")
print "----------------------------------------------------------------------------------------------------"
print "--------------------Fin du calcul du temps de cycles--------------------------------"
print "----------------------------------------------------------------------------------------------------"
---Mise à jour de la valeur ndas l'interrupteur virtuel
if (otherdevices[switch]=='On') then
commandArray['Variable:'..user_var] = tostring(uservariables[user_var] +1)--Lecture user variable et enregistrement et incrementation
Valeur_Compteur = tostring(uservariables[user_var]) --Lecture de la variable temporaire
Valeur_Besoin = (uservariables[Heure_Besoin]) --Lecture de la variable temporaire
Valeur_Compteur_txt = tostring("0"..math.floor((Valeur_Compteur/60)).. "h"..math.floor(Valeur_Compteur-(math.floor((Valeur_Compteur/60))*60)).." Heure de raz "..(Heure_Raz).."h00".."")--Calcul et enregistrement dans valeur tempo txt + formatage
Valeur_Besoin_txt = tostring("0"..math.floor((Valeur_Besoin/60)).. "h"..math.floor(Valeur_Besoin-(math.floor((Valeur_Besoin/60))*60)).. "")--Calcul et enregistrement dans valeur tempo txt + formatage
commandArray[1] = {['UpdateDevice'] = besoin_txt ..'|0|'.. Valeur_Besoin_txt} --Enregistrement dans Compteur Txt
commandArray[2] = {['UpdateDevice'] = counter_txt ..'|0|'.. Valeur_Compteur_txt} --Enregistrement dans Compteur Txt
print (Valeur_Besoin_txt.." <- Valeur de la variable Heure_Besoin_txt")
print (Valeur_Besoin.." <- Valeur de la variable Heure_Besoin")
print (Valeur_Compteur_txt.." <- Valeur de la variable Valeur_Compteur_txt")
print (Valeur_Compteur.." <- Valeur de la variable Valeur_Compteur")
end
if ((NowInMinutes > h_min) and (NowInMinutes < (h_min + 10))) then--RAZ journalier à l'heure voulu.
commandArray['Variable:'..user_var]= tostring(0)
Valeur_Compteur_txt = tostring("0H:0Mn")
commandArray['UpdateDevice'] = counter_txt .. '|0|' .. Valeur_Compteur_txt
end
print "----------------------------------------------------------------------------------------------------"
print "--------------------Fin Calcul du temps de fonctionnement quotidien --------------------------------"
print "----------------------------------------------------------------------------------------------------"
return commandArray
elseif tostring(T_eau) >= '14' and tostring(T_eau) < '20' then
En utilisant tostring, tu transformes la variable en chaine de caractère : tu fais une opération mathématique sur une chaine de caractère. Il vaudrait mieux convertir les variables en nombre.
Concernant la mise à jour des variables, il faut savoir que DomoticZ exécute tous les CommandArray en une seule fois à la fin du programme. Ce n'est pas séquentiel. Par conséquent, si tu mets à jours une UserVariable et que "après" tu fais appel à cette UserVariable, tu auras l'ancienne valeur : la nouvelle ne sera envoyée qu'à la fin de l'exécution.
if tostring(uservariables['Pompe Piscine']) > tostring(uservariables['Besoin_filtration']) then commandArray['Relais_pompe_piscine'] ='Off' and print("Pompe OFF "..(switch))
else commandArray['Relais_pompe_piscine'] ='On' and print("Pompe ON "..(switch))
end
if tonumber(uservariables['Pompe Piscine']) > tonumber(uservariables['Besoin_filtration']) then
commandArray['Relais_pompe_piscine'] ='Off'
print("Pompe OFF "..(switch))
else
commandArray['Relais_pompe_piscine'] ='On'
print("Pompe ON "..(switch))
end
Maintenant pour comprendre ce qu'il se passe, il faut déboguer en plaçant des print afin de savoir quelles sont les valeurs utilisées par le programme.
Génial ! Merci pour ton aide, pour l'activation de la pompe, ça marche ! J'ai également déplacé le IF à la fin du script des fois que... Il me reste juste la mise à jour de cette satané variable !
Donc pour suivre ton conseil j'ai commenté le "and print"
print "----------------------------------------------------------------------------------------------------"
print "--------------------Calcul du temps de cycles ------------------------------------------------------"
print "----------------------------------------------------------------------------------------------------"
if (T_eau) > 50 then print("===Calcul du temps de cycle===")
----------------------------------------------------------------------------------------------------------
elseif (T_eau) < 10 then
commandArray ['Variable:Besoin_filtration'] = (C01) -- and print("C01 - temps nécessaire = "..C01.." mn "..(uservariables['Besoin_filtration']))
----------------------------------------------------------------------------------------------------------
elseif (T_eau) >= 10 and (T_eau) < 14 then
commandArray ['Variable:Besoin_filtration'] = (C02) -- and print("C02 - temps nécessaire = "..C02.." mn "..(uservariables['Besoin_filtration']))
----------------------------------------------------------------------------------------------------------
elseif (T_eau) >= 14 and (T_eau) < 20 then
commandArray ['Variable:Besoin_filtration'] = (C03) -- and print("C03 - temps nécessaire = "..C03.." mn "..(uservariables['Besoin_filtration']))
----------------------------------------------------------------------------------------------------------
elseif (T_eau) >= 20 and (T_eau) < 28 then
commandArray ['Variable:Besoin_filtration'] = (C04) -- and print("C04 - temps nécessaire = "..C04.." mn "..(uservariables['Besoin_filtration']))
----------------------------------------------------------------------------------------------------------
elseif (T_eau) >= 28 then
commandArray ['Variable:Besoin_filtration'] = (C05) -- and print("C05 - temps nécessaire = "..C05.." mn "..(uservariables['Besoin_filtration']))
----------------------------------------------------------------------------------------------------------
end
2021-06-29 20:26:01.691 Error: EventSystem: commandArray in script Script_time_Piscine should only return ['string']='actionstring' or [integer]={['string']='actionstring'}
Ca marche ! en fait mon plus gros problème venait du fait que je n'attendais pas deux exécutions du script avant de vérifier.
Donc je pensais que ça ne fonctionnait pas mais si avec un peu de patience !
Un grand merci pour ton aide Keros, sans ton aide je crois que j'aurais fini par abandonner sans trouver !
Il me reste deux trois petite chose à faire (loguer le temps de fonctionnement quotidien, envoyer des notif voir un rapport quotidien) Bref encore beaucoup de boulot ^^
J'ajoute mon script "dans l'etat" mias fonctionnel si ça peut servir
--------------------------------
------ Variables à éditer ------
--------------------------------
local user_var = 'Pompe Piscine' -- Nom de la variable utilisateur (uservariable)utilisé pour mémoriser la valeur en minutes dans Domoticz (Domoticz-->configuration-->plus d'options-->variables utilisateurs).
local switch = 'Relais_pompe_piscine' -- Nom de l'interrupteur virtuel de la pompe dans Domoticz
local Heure_Besoin = 'Besoin_filtration' --Durée de filtration requise en fonctione de la temperature
local counter_txt = 345 -- Numéro idx du capteur virtuel texte "Durée filtration"
local besoin_txt = 344 -- Numéro idx du capteur virtuel texte "Besoin_filtration"
local Heure_Raz = 10 -- Heure de remise à zéro du compteur.
local duree_cycle = 80 --M3 piscine / débit M3 pompe *60
local T_eau=tonumber((otherdevices_svalues['Sortie_piscine']))
local T_eau_chaude=tonumber((otherdevices_svalues['entree_piscine']))
local M3 = 6
local M3H = 3
local duree_cycle = tonumber(M3)/tonumber(M3H)*60 --M3 piscine / débit M3 pompe *60
local C01=0.1*duree_cycle -- si <10°
local C02=0.5*duree_cycle -- si 10-14°
local C03=1*duree_cycle -- si 15-20°
local C04=2*duree_cycle -- si 20-28°
local C05=3*duree_cycle -- si >28°
--------------------------------
-- Fin des variables à éditer --
--------------------------------
local scriptName = 'Cyclage_Filtration'
local scriptVersion = '0.1'
print "---------------------------------------------------------------------------------------------------"
print "--------------------Calcul du temps de fonctionnement quotidien -----------------------------------"
print "---------------------------------------------------------------------------------------------------"
commandArray = {}
time=os.time()
local minutes = tonumber(os.date('%M',time))
local hours = tonumber(os.date('%H',time))
local NowInMinutes = (hours * 60 + minutes)
local h_min = (Heure_Raz * 60)
T_eau=tonumber(T_eau)
print "----------------------------------------------------------------------------------------------------"
print "--------------------Calcul du temps de cycles ------------------------------------------------------"
print "----------------------------------------------------------------------------------------------------"
if (T_eau) > 50 then print("===Calcul du temps de cycle===")
----------------------------------------------------------------------------------------------------------
elseif (T_eau) < 10 then
commandArray['Variable:Besoin_filtration'] = tostring (C01)
----------------------------------------------------------------------------------------------------------
elseif (T_eau) >= 10 and (T_eau) < 14 then
commandArray['Variable:Besoin_filtration'] = tostring (C02)
----------------------------------------------------------------------------------------------------------
elseif (T_eau) >= 14 and (T_eau) < 20 then
commandArray['Variable:Besoin_filtration'] = tostring (C03)
----------------------------------------------------------------------------------------------------------
elseif (T_eau) >= 20 and (T_eau) < 28 then
commandArray['Variable:Besoin_filtration'] = tostring (C04)
----------------------------------------------------------------------------------------------------------
elseif (T_eau) >= 28 then
commandArray['Variable:Besoin_filtration'] = tostring (C05)
----------------------------------------------------------------------------------------------------------
end
print(uservariables['Besoin_filtration'])
print("Température "..T_eau)
print("Valeur du scenario 1 -> "..C01.." si <10° ") --Status: LUA: 8.0
print("Valeur du scenario 2 -> "..C02.." si 10-14° ") -- Status: LUA: 40.0
print("Valeur du scenario 3 -> "..C03.." si 15-20° ") -- Status: LUA: 80
print("Valeur du scenario 4 -> "..C04.." si 20-28° ") -- Status: LUA: 160
print("Valeur du scenario 5 -> "..C05.." si >28° ") -- Status: LUA: 160
print(Heure_Besoin.." <- Valeur de la variable Heure_Besoin")
print(uservariables['Besoin_filtration'].." <- Valeur de la variable user 'Besoin_filtration'")
print(uservariables['Pompe Piscine'].." <- Valeur de la variable user 'Pompe Piscine'")
print "----------------------------------------------------------------------------------------------------"
print "--------------------Fin du calcul du temps de cycles------------------------------------------------"
print "----------------------------------------------------------------------------------------------------"
print "----------------------------------------------------------------------------------------------------"
print "--------------------Mise à jour de la valeur ndas l'interrupteur virtuel------------------------------------------------"
print "----------------------------------------------------------------------------------------------------"
if (otherdevices[switch]=='On') then
commandArray['Variable:'..user_var] = tostring(uservariables[user_var] +1)--Lecture user variable et enregistrement et incrementation
Valeur_Compteur = tostring(uservariables[user_var]) --Lecture de la variable temporaire
Valeur_Besoin = (uservariables[Heure_Besoin]) --Lecture de la variable temporaire
Valeur_Compteur_txt = tostring("0"..math.floor((Valeur_Compteur/60)).. "h"..math.floor(Valeur_Compteur-(math.floor((Valeur_Compteur/60))*60)).." Heure de raz "..(Heure_Raz).."h00".."")--Calcul et enregistrement dans valeur tempo txt + formatage
Valeur_Besoin_txt = tostring("0"..math.floor((Valeur_Besoin/60)).. "h"..math.floor(Valeur_Besoin-(math.floor((Valeur_Besoin/60))*60)).. "")--Calcul et enregistrement dans valeur tempo txt + formatage
commandArray[1] = {['UpdateDevice'] = besoin_txt ..'|0|'.. Valeur_Besoin_txt} --Enregistrement dans Compteur Txt
commandArray[2] = {['UpdateDevice'] = counter_txt ..'|0|'.. Valeur_Compteur_txt} --Enregistrement dans Compteur Txt
print (Valeur_Besoin_txt.." <- Valeur de la variable Heure_Besoin_txt")
print (Valeur_Besoin.." <- Valeur de la variable Heure_Besoin")
print (Valeur_Compteur_txt.." <- Valeur de la variable Valeur_Compteur_txt")
print (Valeur_Compteur.." <- Valeur de la variable Valeur_Compteur")
end
if ((NowInMinutes > h_min) and (NowInMinutes < (h_min + 10))) then--RAZ journalier à l'heure voulu.
commandArray['Variable:'..user_var]= tostring(0)
Valeur_Compteur_txt = tostring("0H:0Mn")
commandArray['UpdateDevice'] = counter_txt .. '|0|' .. Valeur_Compteur_txt
end
print "----------------------------------------------------------------------------------------------------"
print "--------------------Fin Mise à jour de la valeur ndas l'interrupteur virtuel -----------------------"
print "----------------------------------------------------------------------------------------------------"
print "----------------------------------------------------------------------------------------------------"
print "---------------------------------------------MARCHE/ARRET-Début-------------------------------------"
print "----------------------------------------------------------------------------------------------------"
if tonumber(uservariables['Pompe Piscine']) > tonumber(uservariables['Besoin_filtration']) then
commandArray['Relais_pompe_piscine'] ='Off'
print("Pompe OFF "..(switch))
else
commandArray['Relais_pompe_piscine'] ='On'
print("Pompe ON "..(switch))
end
print "----------------------------------------------------------------------------------------------------"
print "---------------------------------------------MARCHE/ARRET-Fin---------------------------------------"
print "----------------------------------------------------------------------------------------------------"
return commandArray