Optimisation de script

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 <\>.
Wolfen38
Messages : 1983
Inscription : 19 oct. 2017, 14:49

Optimisation de script

Message par Wolfen38 »

Salut à tous,

Pour mes luminaires, j'ai pour chaque interrupteur (des xiaomi controlés par zigate) des script lua comme celà :

Code : Tout sélectionner

commandArray = {}
 
if (devicechanged['Interrupteur Anna'] == '1 Click' and otherdevices['Virtuel Anna'] == 'Off') then
    commandArray['Virtuel Anna']='On'
	commandArray['Group:Lumiere blanche Anna1']='On'
	commandArray['Interrupteur Anna']='Set Level: 40'
			
	else
	if (devicechanged['Interrupteur Anna'] == '1 Click' and otherdevices['Virtuel Anna'] == 'On') then
		commandArray['Group:Lumiere blanche Anna1']='Off'
		commandArray['Group:Lumiere blanche Anna2']='Off'
		commandArray['Group:Lumiere blanche Anna rgb']='Off'
		commandArray['Group:Lumiere violette Anna']='Off'
		commandArray['Virtuel Anna']='Off'
		commandArray['Interrupteur Anna']='Set Level: 40'
		end
	
end

if (devicechanged['Interrupteur Anna'] == '2 Click' and otherdevices['Virtuel Anna'] == 'Off') then
	commandArray['Virtuel Anna']='On'
	commandArray['Group:Lumiere blanche Anna2']='On'
	commandArray['Interrupteur Anna']='Set Level: 40'
	
	else
	if (devicechanged['Interrupteur Anna'] == '2 Click' and otherdevices['Virtuel Anna'] == 'On') then
		commandArray['Group:Lumiere blanche Anna1']='On'
		commandArray['Interrupteur Anna']='Set Level: 40'
		end
	
end

if ((devicechanged['Interrupteur Anna'] == '3 Click' and otherdevices['Virtuel Anna'] == 'Off')) then 
	commandArray['Virtuel Anna']='On'
	commandArray['Group:Lumiere violette Anna']='On'
	commandArray['Interrupteur Anna']='Set Level: 40'
	
		
	else
	if ((devicechanged['Interrupteur Anna'] == '3 Click' and otherdevices['Virtuel Anna'] == 'On')) then
		commandArray['Group:Lumiere blanche Anna rgb']='On'
		commandArray['Interrupteur Anna']='Set Level: 40'
		end
	
end

if ((devicechanged['Interrupteur Anna'] == '4 Click' and otherdevices['Virtuel prise Anna'] == 'Off')) then 
	commandArray['Virtuel prise Anna']='On'
	commandArray['Prise lampe Anna']='On'
	commandArray['Interrupteur Anna']='Set Level: 40'
	
		
	else
	if ((devicechanged['Interrupteur Anna'] == '4 Click' and otherdevices['Virtuel prise Anna'] == 'On')) then
	commandArray['Virtuel prise Anna']='Off'
	commandArray['Prise lampe Anna']='Off'
	commandArray['Interrupteur Anna']='Set Level: 40'
		end
	
end

return commandArray
J'aurais besoin de votre aide pour 2 choses, pour essayer de réduire les latences
1 : Quelqu'un qui serait motivé pour ré écrire ce script en lua pour l'optimiser (enfin si possible, peut etre est il parfait mais vu mes connaissances j'en doute fort !)
2 : Quelqu'un de motivé pour me traduire ce scipt en dzvent, j'aimerai m'y mettre, mais je pige pas grand chose, donc avec un comparatif lua/dzvent, ca m'aiderait je pense.

Merci.
thier
Messages : 807
Inscription : 26 sept. 2015, 10:32
Localisation : charente

Re: Optimisation de script

Message par thier »

Peut-être une piste pour réduire la latence ici https://easydomoticz.com/forum/viewtopi ... 137#p23137
PI3+, Buster, Domoticz V2020.2, rflink, zwave, chauffage piloté par qubino, sondes oregon et Vil1d, boite aux lettres détection passage facteur, volets roulants qubino fibaro.
Wolfen38
Messages : 1983
Inscription : 19 oct. 2017, 14:49

Re: Optimisation de script

Message par Wolfen38 »

Merci de ta réponse.

J'avais essayé mais chez moi, je n'avais pas vu de réelles différences.
boum
Messages : 233
Inscription : 18 janv. 2019, 11:34
Localisation : France

Re: Optimisation de script

Message par boum »

En dzVents, ça donnerait qq chose comme ça :

Code : Tout sélectionner

return
{
    on =
    {
        devices = { 'Interrupteur Anna' }
    },

    execute = function(domoticz, item)
      local virtuelAnna = domoticz.devices('Virtuel Anna')
      if item.state == '1 Click' then
        if virtuelAnna.active then
          domoticz.groups('Lumiere blanche Anna1').switchOff()
          domoticz.groups('Lumiere blanche Anna2').switchOff()
          domoticz.groups('Lumiere blanche Anna rgb').switchOff()
          domoticz.groups('Lumiere violette Anna').switchOff()
          domoticz.devices('Interrupteur Anna').dimTo(40)
          virtuelAnna.switchOff()
        else
          domoticz.groups('Lumiere blanche Anna1').switchOn()
          domoticz.devices('Interrupteur Anna').dimTo(40)
          virtuelAnna.switchOn()
        end
      elseif item.state == '2 Click' then
        if virtuelAnna.active then
          domoticz.groups('Lumiere blanche Anna1').switchOn()
          domoticz.devices('Interrupteur Anna').dimTo(40)
        else
          domoticz.groups('Lumiere blanche Anna2').switchOn()
          domoticz.devices('Interrupteur Anna').dimTo(40)
          virtuelAnna.switchOn()
        end
      elseif item.state == '3 Click' then
        if virtuelAnna.active then
          domoticz.groups('Lumiere blanche Anna rgb').switchOn()
          domoticz.devices('Interrupteur Anna').dimTo(40)
        else
          domoticz.groups('Lumiere violette Anna').switchOn()
          domoticz.devices('Interrupteur Anna').dimTo(40)
          virtuelAnna.switchOn()
        end
      elseif item.state == '4 Click' then
        local virtuelPriseAnna = domoticz.devices('Virtuel prise Anna')
        if virtuelPriseAnna.active then
          domoticz.devices('Prise lampe Anna').switchOff()
          domoticz.devices('Interrupteur Anna').dimTo(40)
          virtuelPriseAnna.switchOff()
        else
          domoticz.devices('Prise lampe Anna').switchOn()
          domoticz.devices('Interrupteur Anna').dimTo(40)
          virtuelPriseAnna.switchOn()
        end
      end
    end
}
Pas testé, mais la syntaxe devrait être bonne.
J'ai recopié les actions. Le variateur 'Interrupteur Anna' est toujours mis à 40% et pourrait être placé hors des if.

Pour ce qui est de l'optimisation du Lua « classique » pas grand chose à dire. La seule chose qui potentiellement est couteuse — mais il faudrait mesurer — est d'avoir plusieurs tests avec devicechanged['Interrupteur Anna']. S'il y a vraiment beaucoup de dispositifs et beaucoup de changements d'état, on peut shunter le script. Mais ça réduit juste de 4 tests à 1 test.

Code : Tout sélectionner

-- au début du script (après commandArray = {})
local state = devicechanged['Interrupteur Anna'] -- peut être utilisé après plutôt que de refaire un accès à la table
if not state then return commandArray end
Domoticz v2022.2 sur linux-mint / Z-Wave-JS / RFXCom / Zigbee2MQTT
Wolfen38
Messages : 1983
Inscription : 19 oct. 2017, 14:49

Re: Optimisation de script

Message par Wolfen38 »

Merci je regarde tout ça de près. Une mine d'info

Envoyé de mon Mi 9T Pro en utilisant Tapatalk

Keros
Messages : 6638
Inscription : 23 juil. 2019, 20:57

Re: Optimisation de script

Message par Keros »

Merci Boum pour cette "traduction". Elle va m'aider à comprendre le DzEvents.
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
Keros
Messages : 6638
Inscription : 23 juil. 2019, 20:57

Re: Optimisation de script

Message par Keros »

Wolfen38, je regardais ton script LUA. Je pense que tu pourrais réduire le nombre de conditions :

Code : Tout sélectionner

if (devicechanged['Interrupteur Anna'] == '1 Click') then 
	
	if (otherdevices['Virtuel Anna'] == 'Off') then
    		commandArray['Virtuel Anna']='On'
		commandArray['Group:Lumiere blanche Anna1']='On'
		commandArray['Interrupteur Anna']='Set Level: 40'
	
	elseif (otherdevices['Virtuel Anna'] == 'On') then
		commandArray['Group:Lumiere blanche Anna1']='Off'
		commandArray['Group:Lumiere blanche Anna2']='Off'
		commandArray['Group:Lumiere blanche Anna rgb']='Off'
		commandArray['Group:Lumiere violette Anna']='Off'
		commandArray['Virtuel Anna']='Off'
		commandArray['Interrupteur Anna']='Set Level: 40'
	end
	
elseif (devicechanged['Interrupteur Anna'] == '2 Click') then
	
	if (otherdevices['Virtuel Anna'] == 'Off') then
		comandArray['Interrupteur Anna']='Set Level: 40'
	
	elseif (otherdevices['Virtuel Anna'] == 'On') then
		commandArray['Group:Lumiere blanche Anna1']='On'
		commandArray['Interrupteur Anna']='Set Level: 40'
	end
ETC ...
	
end
Je n'ai pas testé le code, je l'ai écrit pour exemple.

Dans l'idée, si le device a reçu la commande 1 click, ce n'est pas nécessaire de tester les autres commandes 2 click, 3 click, etc ...
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
Wolfen38
Messages : 1983
Inscription : 19 oct. 2017, 14:49

Re: Optimisation de script

Message par Wolfen38 »

Merci les gars pour votre aide.
Répondre