Page 1 sur 3

Transformer un script LUA en DZVETNS

Publié : 14 juil. 2021, 09:18
par kisskool
Bonjour,
Après m'être fait les dents en LUA j'aimerais transformer mon script en Dzvents. Je n'ai pas vraiment trouvé de tuto ou de doc compréhensible (je suis débutant)pour le faire, avez-vous un site, des conseils à me donner ou un peu de temps pour m'aider ?

Code : Tout sélectionner

 --------------------------------
 ------ 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 = 'Filtration 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 ModeMnu = 'Pompe  mode manu'--interrupteur
 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 Dur_fonct_quot = 353
 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']))
 --T_eau=tonumber(T_eau)
 local T_eau_chaude=tonumber((otherdevices_svalues['Entree_piscine'])) 
 --T_eau_chaude=tonumber(T_eau_chaude)
 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 -----------------------------------"

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)


        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 "----------------------------------------------------------------------------------------------------"
print("Valeur du scenario 1 -> "..C01.." si <10° ")
print("Valeur du scenario 2 -> "..C02.." si 10-14° ")
print("Valeur du scenario 3 -> "..C03.." si 15-20° ")
print("Valeur du scenario 4 -> "..C04.." si 20-28° ") 
print("Valeur du scenario 5 -> "..C05.." si >28° ")
print "----------------------------------------------------------------------------------------------------"
print("Température "..T_eau.." O->")
print("Température "..T_eau_chaude.." ->O")
print "----------------------------------------------------------------------------------------------------"
print(uservariables['Besoin_filtration'].." <- Valeur de la variable user 'Besoin_filtration'")
print(uservariables['Pompe Piscine'].." <- Durée de filtration du jour")
print "----------------------------------------------------------------------------------------------------"


print "Incrémentation du compteur de filtration 'Pompe Piscine'------------------------------------------------"
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
        
	end
-------------------test log duree temp dans variable--------------------------------
	if ((NowInMinutes > h_min) and (NowInMinutes < h_min)) then --ecriture de la valeur si heure de RAZ.
	    commandArray['Variable:Durée fonctionnement quotidien'] = tostring(uservariables[user_var])
	    commandArray['UpdateDevice'] = Dur_fonct_quot .. '|0|' .. tostring(uservariables[user_var].." Minutes / Durée de filtration J-1 MàJ : "..(Heure_Raz).."h00".."")
	    print("*****Log Durée de filtration avant réinitialisation***** "..'Variable:Durée fonctionnement quotidien')
	    --commandArray['UpdateDevice'] = Dur_fonct_quot .. '|0|' .. tostring("0"..math.floor((uservariables[user_var]/60)).. "h"..math.floor(uservariables[user_var]-(math.floor((uservariables[user_var]/60))*60)).." raz "..(Heure_Raz).."h00".."")
	end
-------------------fin du test-------------------------------------------------------
	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
		print('RAZ de la durée de filtration')
		
	end
--if (otherdevices['ModeManu']=='Off') then 
print('interrrupteur')
    if tonumber(uservariables[user_var]) > tonumber(uservariables[Heure_Besoin])then 
        commandArray[switch] ='Off'
        print("*****Pompe OFF "..(switch))
    --elseif otherdevices['switch']== 'Off' and tonumber(uservariables[user_var]) < tonumber(uservariables[Heure_Besoin]) or (T_eau) < (T_eau_chaude)then 
    elseif tonumber(uservariables[user_var]) < tonumber(uservariables[Heure_Besoin]) then 
        commandArray[switch] ='On'
        print("*****Pompe ON "..(switch))
    end
--end    
print "---------------------------------------------Fin du script---------------------------------------"
print "----------------------------------------------------------------------------------------------------"


return commandArray

Re: Transformer un script LUA en DZVETNS

Publié : 14 juil. 2021, 11:30
par Keros
Toutes les commandes DzVents sont regroupées dans le wiki.

Une partie assez difficile à appréhender est le fonctionnement des déclencheurs. J'ai écrit un petit guide qui, je l'espère pourra t'aider à comprendre cette différence par rapport au LUA.

Re: Transformer un script LUA en DZVETNS

Publié : 15 juil. 2021, 14:15
par kisskool
Mouais, c'est la seule chose que je pensais avoir commencé à comprendre ! lol
Mais non en fait je comprend même pas comment comparer deux valeurs de température comme dans mon script, ni même comment déclarer mes variables...
C'est mal partie...

Code : Tout sélectionner

local T_eau='Sortie_piscine'
local T_eau_chaude='Entree_piscine'
local scriptName = 'Script_PISCINE_DZVENT'
local scriptVersion = '0.01'

return {
	on = {
	   
		timer = {
			'every minute',				-- causes the script to be called every minute
		}
	},

execute = function(domoticz)
			 if T_eau > T_eau_chaude then 
                domoticz.log ('***********************CHOIX 1****************************');
            else
                domoticz.log ('***********************CHOIX 2****************************');
			end
end
}

Re: Transformer un script LUA en DZVETNS

Publié : 15 juil. 2021, 15:01
par boum

Code : Tout sélectionner

if domoticz.devices('Sortie_piscine').temperature > domoticz.devices('Entree_piscine').temperature then 
Voir https://www.domoticz.com/wiki/DzVents:_ ... object_API
et plus précisément https://www.domoticz.com/wiki/DzVents:_ ... ure_sensor

Re: Transformer un script LUA en DZVETNS

Publié : 15 juil. 2021, 15:24
par kisskool
J'ai enfin eu une sortie sans erreur !

Code : Tout sélectionner

 2021-07-14 16:32:01.168 Status: dzVents: Info: ------ Start internal script: Piscine_DzVent:, trigger: "every minute"
2021-07-14 16:32:01.168 Status: dzVents: Info: ***********************CHOIX 1****************************
2021-07-14 16:32:01.169 Status: dzVents: Info: ------ Finished Piscine_DzVent 
avec

Code : Tout sélectionner

local T_eau='Sortie_piscine'
local T_eau_chaude='Entree_piscine'

local scriptName = 'Script_PISCINE_DZVENT'
local scriptVersion = '0.01'

return {
	on = {
	   
		timer = {
			'every minute',				-- causes the script to be called every minute
		}
	},

execute = function(domoticz, timer)
			 if T_eau > T_eau_chaude then 
                domoticz.log ('***********************CHOIX 1****************************');
            else
                domoticz.log ('***********************CHOIX 2****************************');
			end
end
}
C'est un début !

Re: Transformer un script LUA en DZVETNS

Publié : 15 juil. 2021, 18:50
par Keros
Sauf que là, pour le moment, tu compares deux chaines de caractères et pas du tout des températures.

Si tu regardes la réponse de boum, tu pourras comparer les valeurs des températures.

Re: Transformer un script LUA en DZVETNS

Publié : 15 juil. 2021, 20:43
par kisskool
Oui j'ai compris en essayant d'afficher les valeurs ! ^^ J'avance doucement, merci pour votre aide !
Je ne sais pas s'il est possible de limiter les décimales voire même de les supprimer et de mettre le petit ..°c

Code : Tout sélectionner

 2021-07-15 20:22:01.190 Status: dzVents: Info: Script_PISCINE_DZVENT v0.01: ------ Start internal script: Script_Piscine_DzVent:, trigger: "every minute"
2021-07-15 20:22:01.192 Status: dzVents: Info: Script_PISCINE_DZVENT v0.01: ***********************CHOIX 1****************************
2021-07-15 20:22:01.192 Status: dzVents: Info: Script_PISCINE_DZVENT v0.01: 20.299999237061
2021-07-15 20:22:01.192 Status: dzVents: Info: Script_PISCINE_DZVENT v0.01: 19.799999237061
2021-07-15 20:22:01.192 Status: dzVents: Info: Script_PISCINE_DZVENT v0.01: ***********************fin****************************
2021-07-15 20:22:01.193 Status: dzVents: Info: Script_PISCINE_DZVENT v0.01: ------ Finished Script_Piscine_DzVent 

Re: Transformer un script LUA en DZVETNS

Publié : 15 juil. 2021, 20:52
par kisskool
Y a t'il un moyen plus efficace et rapide de modifier une variable utilisateur en fonction de la temperature comme en lua ci-dessous? J'ai cru comprendre qu'il etait possible d'utiliser un 'tableau'

Code : Tout sélectionner

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°

        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
        

Re: Transformer un script LUA en DZVETNS

Publié : 15 juil. 2021, 21:40
par Keros
Concernant les décimales, regarde sur les moteurs de recherche, il y a des exemples. Tu peux faire les recherche pour le LUA, le DzVents est basé dessus : les calculs en LUA fonctionnent généralement en DzVents. Mais bien sûr, dès qu'il y a quelque chose en rapport avec DomoticZ, il faut utiliser les commandes du wiki.
J'utilise nombre = nombre - (nombre % 1) pour enlever les décimales.

L'utilisation des tableaux est plutôt compliquée et comme tu débutes en programmation, il vaudrait mieux que tu restes sur quelque chose de simple et que tu pourras recomprendre facilement dans plusieurs mois/années quand tu reviendras dessus.
J'ai une vague idée de ce qu'il serait possible de faire avec un tableau, mais, même pour moi, je sens l'usine à gaz et je pense qu'il n'y a pas de gain par rapport à ce que tu as déjà fait et qui fonctionne.

Re: Transformer un script LUA en DZVETNS

Publié : 15 juil. 2021, 22:33
par kisskool
J'ai fais pas mal de recherche et c'est difficle de trouver un exemple pertinent de script à la fois assez simple pour être lisible et compréhensible pour un néophyte.
Quand au wiki je pense que je n'ai pas les bases nécessaires à la bonne lecture, par exemple je veux comptabiliser la durée d'activation d'un interrupteur quotidienne, j'ai beau lire et tester je ne trouve pas les infos me permettant de comprendre, c'est vraiment frustrant pour un débutants !

domoticz.log (domoticz.devices('Filtration piscine').counterToday);
Me donne un "nil"

Le wiki:

Code : Tout sélectionner

Counter, managed Counter, counter incremental

    counter: Number
    counterToday: Number. Today’s counter value.
    updateCounter(value): Function. Overwrite current value for managed and standard counters; increment for incremental counters !!. Supports command options.
    updateHistory( date, sValues ): Strings 3.1.3 function Managed counter only! Used to write values to short or long term storage.

    local mCounter = domoticz.devices('device name')
    mCounter.updateHistory('2021-01-22', '10;1777193') -- Write to long term storage (meter_calendar table)
    mCounter.updateHistory('2021-01-22 10:05:02', '10;1777193') -- Write to short term storage (meter table)

    incrementCounter(value): Function. (counter incremental) Supports command options. To update with a complete new value you will have to do some calculation and take the counter divider into account.

    local newValue = value
    local iCounter = domoticz.devices('device name')
    local counterDivider = x -- x is depending on the counter divider set for the device
    iCounter.incrementCounter( ( -1 * iCounter.counter * counterDivider ) + newValue )