Transformer un script LUA en DZVETNS

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 <\>.
kisskool
Messages : 70
Inscription : 01 juin 2021, 11:24

Transformer un script LUA en DZVETNS

Message 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
Keros
Messages : 6638
Inscription : 23 juil. 2019, 20:57

Re: Transformer un script LUA en DZVETNS

Message 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.
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
kisskool
Messages : 70
Inscription : 01 juin 2021, 11:24

Re: Transformer un script LUA en DZVETNS

Message 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
}
Dernière modification par kisskool le 15 juil. 2021, 15:15, modifié 1 fois.
boum
Messages : 233
Inscription : 18 janv. 2019, 11:34
Localisation : France

Re: Transformer un script LUA en DZVETNS

Message 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
Domoticz v2022.2 sur linux-mint / Z-Wave-JS / RFXCom / Zigbee2MQTT
kisskool
Messages : 70
Inscription : 01 juin 2021, 11:24

Re: Transformer un script LUA en DZVETNS

Message 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 !
Keros
Messages : 6638
Inscription : 23 juil. 2019, 20:57

Re: Transformer un script LUA en DZVETNS

Message 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.
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
kisskool
Messages : 70
Inscription : 01 juin 2021, 11:24

Re: Transformer un script LUA en DZVETNS

Message 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 
kisskool
Messages : 70
Inscription : 01 juin 2021, 11:24

Re: Transformer un script LUA en DZVETNS

Message 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
        
Keros
Messages : 6638
Inscription : 23 juil. 2019, 20:57

Re: Transformer un script LUA en DZVETNS

Message 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.
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
kisskool
Messages : 70
Inscription : 01 juin 2021, 11:24

Re: Transformer un script LUA en DZVETNS

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