Page 1 sur 16

[LUA] Speedup accélérer la réactivité de domoticz

Publié : 15 oct. 2016, 13:42
par vil1driver
Salut,

pour faire suite à ce sujet viewtopic.php?f=8&t=1898
je vous fais part ici de la solution collégialement trouvée (merci à Deennoo et Neutrino)

alors voila :

créer un fichier dans le dossier lua nommé modules.lua dont voici le contenu :

Code : Tout sélectionner


-- /!\ require Domoticz v3.5776 and after /!\

curl = '/usr/bin/curl ' -- don't forgot the final space

domoticzIP = '127.0.0.1'
domoticzPORT = '8080'
domoticzURL = 'http://'..domoticzIP..':'..domoticzPORT

-- switch On a device and set level if dimmmable
function switchOn(device, level)
	if level ~= nil then
		os.execute(curl..'"'..domoticzURL..'/json.htm?type=command&param=switchlight&idx='..otherdevices_idx[device]..'&switchcmd=Set%20Level&level='..level..'" &')
	else	
		os.execute(curl..'"'..domoticzURL..'/json.htm?type=command&param=switchlight&idx='..otherdevices_idx[device]..'&switchcmd=On" &')
	end	
end

-- switch On a devive for x seconds
-- non compatible avec le script sendTwice
function switchOnFor(device, secs)
   switchOn(device)
   commandArray[device] = "Off AFTER "..secs
end

-- switch Off a device
function switchOff(device)
	os.execute(curl..'"'..domoticzURL..'/json.htm?type=command&param=switchlight&idx='..otherdevices_idx[device]..'&switchcmd=Off" &')
end

-- Toggle a device
function switch(device)
	os.execute(curl..'"'..domoticzURL..'/json.htm?type=command&param=switchlight&idx='..otherdevices_idx[device]..'&switchcmd=Toggle" &')
end

-- switch On a group or scene
function groupOn(device)
	os.execute(curl..'"'..domoticzURL..'/json.htm?type=command&param=switchscene&idx='..otherdevices_scenesgroups_idx[device]..'&switchcmd=On" &')
end

-- switch Off a group
function groupOff(device)
	os.execute(curl..'"'..domoticzURL..'/json.htm?type=command&param=switchscene&idx='..otherdevices_scenesgroups_idx[device]..'&switchcmd=Off" &')
end


en suite dans tous vos script_device_blabla.lua dans lesquels vous souhaitez avoir un gain de réactivité,
ajoutez au tout début ces 2 lignes pour charger modules.lua (en adaptant le chemin vers votre dossier lua au besoin)

Code : Tout sélectionner

-- chargement des modules
dofile('/home/pi/domoticz/scripts/lua/modules.lua')
puis dans vos scripts

Code : Tout sélectionner

commandArray['ma lampe']='On'	           devient		switchOn('ma lampe')
commandArray['ma lampe']='On FOR 30'      devient    switchOnFor('ma lampe', '30')
commandArray['ma lampe']='Off'				devient		switchOff('ma lampe')
commandArray['ma lampe']='Toggle'		   devient		switch('ma lampe')
commandArray['ma lampe']='Set Level 50'	devient		switchOn('ma lampe',50)
commandArray['Group:mon groupe']='On'	  devient		groupOn('mon groupe')
commandArray['Group:mon groupe']='Off'	 devient		groupOff('mon groupe')
commandArray['Scene:ma scène']='On'		 devient		groupOn('ma scène')
le temps de réponse en sera grandement amélioré :D

exemple avec un script qui va allumer la lumière dans la pièce dès que j'ouvre la porte ( script_device_porte.lua )

avant :

Code : Tout sélectionner

commandArray = {}

-- si la porte s'ouvre la nuit, on allume la lampe
if ( devicechanged['la porte'] == 'Open' and timeofday['Nighttime'] ) then

   commandArray['le salon']='On'
   
end
return commandArray 
temps de réponse:

Code : Tout sélectionner

2016-10-16 15:40:38.829 (rfx_net) Lighting 2 (la porte)
2016-10-16 15:40:38.846 LUA: > commandArray["le salon"]='On'
2016-10-16 15:40:39.647 (rfx_net) Lighting 1 (le salon)
soit 818ms :|

après :

Code : Tout sélectionner

-- chargement des modules
dofile('/home/pi/domoticz/scripts/lua/modules.lua')

commandArray = {}

-- si la porte s'ouvre la nuit, on allume la lampe
if ( devicechanged['la porte'] == 'Open' and timeofday['Nighttime'] ) then

   switchOn('le salon')
   
end
return commandArray 
temps de réponse:

Code : Tout sélectionner

2016-10-16 15:40:32.159 (rfx_net) Lighting 2 (la porte)
2016-10-16 15:40:32.179 LUA:  > switchOn("le salon")
2016-10-16 15:40:32.201 (rfx_net) Lighting 1 (le salon)
soit 42ms RADICAL :mrgreen:

Re: Speedup accélérer la réactivité de domoticz

Publié : 16 oct. 2016, 15:23
par vil1driver
MAJ du code pour utiliser la table ajoutée ce jour qui permet de récupérer l'idx d'un groupe par son nom.

Re: Speedup accélérer la réactivité de domoticz

Publié : 16 oct. 2016, 16:31
par frenchyyii
Il faut avoir compilé domoticz pour que ça fonctionne car je ne trouve même pas le dossier de modules ?
Merci

Re: Speedup accélérer la réactivité de domoticz

Publié : 16 oct. 2016, 16:32
par vil1driver
heu quel dossier modules :D

Re: Speedup accélérer la réactivité de domoticz

Publié : 16 oct. 2016, 16:38
par frenchyyii
Ok donc le dossier s'appelle Lua et c'est dedans que l'on met crée un fichier modules.lua

Sorry j'avais mal interprété la phrase ;)

Pas besoin de compiler du coup donc je présume.


Edit: les rares scripts lua que j'ai sont intégrés à la base ...vous pensez qu'il est intéressant de les refaire ?

Merci

Re: Speedup accélérer la réactivité de domoticz

Publié : 16 oct. 2016, 16:51
par vil1driver
;)

pas besoin de compiler non mais il faut au moins être en v3.5776 pour utiliser groupOn() groupOff()
pour le reste la v3.4834 suffit

je pense que tes scripts peuvent rester dans la base

Re: Speedup accélérer la réactivité de domoticz

Publié : 17 oct. 2016, 01:01
par frenchyyii
En effet ça fonctionne impec avec les scripts de la base.
Il y a un sacré gain !!! Merci beaucoup de nous faire bénéficier de telles améliorations !!

Re: Speedup accélérer la réactivité de domoticz

Publié : 03 nov. 2016, 13:45
par Cissou
Est-ce que ca fonctionne quand on utilise les capteurs d'un domoticz esclave dans les scripts d'un domoticz maitre ?

Re: Speedup accélérer la réactivité de domoticz

Publié : 03 nov. 2016, 18:02
par Grincheux
Nickel , merci les gars pour le boulot. :)

Pour ma part, les seuls scripts devices utilisent beaucoup de virtuel... mais bon le principe est là pour le futur.
2 remarques quand même :
Est ce normal que j'ai du remplacer l'ip 127.0.0.1 par mon ip de domoticz 192.168.1.xx, sinon marche pas, encore de la bidouille de host que je ne maîtrise pas...
Vous me confirmez, adios les fameux commandArray[1]={['xx']='Off'}, commandArray[2]={['xx']='On'} puisque j'ai testé et on en parle plus.
Sans avantage de réactivité, on peut étendre au script time pour la simplicité ?

Re: Speedup accélérer la réactivité de domoticz

Publié : 04 nov. 2016, 17:29
par vil1driver
étrange pour l'ip mais bon, tant que ça fonctionne ;)

commandArray est un tableau
:!: on ne peut pas avoir 2 lignes avec le même contenu pour la première colonne (l'id du tableau)
alors on triche en ajoutant une 3ème colonne.

en clair ceci est interdit
[ 'ma lampe' | 'On' ]
[ 'ma lampe' | 'Off' ]
alors on fait
[ '1' | 'ma lampe' | 'On' ]
[ '2' | 'ma lampe' | 'Off' ]
la méthode cité ici n'utilise pas du tout commandArray, on fait directement appel à la commande système curl
pour piloter domoticz via son api json, donc oui tu peux les chaîner

ceci est authorisé

Code : Tout sélectionner

switchOn('ma lampe')
switchOff('ma lampe')
effectivement dans un script_time le gain est négligeable mais oui tu peux l’utiliser si tu trouves ça plus pratique