[LUA] Envoyer 2 fois les commandes On/Off (send twice)

Vous avez créé un script LUA dont vous êtes fier, un .sh génial, un programme Python hors du commun, un Tuto, c'est ici que vous pouvez les partager.
vil1driver
Messages : 5661
Inscription : 30 janv. 2015, 11:07
Localisation : Rennes (35)

[LUA] Envoyer 2 fois les commandes On/Off (send twice)

Message par vil1driver »

Bonjour,

j'ai ici trop souvent à mon gout des périphériques (rfxcom) qui font la sourde oreille.
j'ai par exemple plusieurs prises qui répondent au même signal radio, et parfois l'une d'entre elle ne va pas réagir.
je suis du coups obligé de renvoyer l'ordre manuellement.

certain me diront, change d'antenne, déplace le rfxcom etc... je suis conscient que c'est certainement le mieux, mais dans l'immédiat,
pour moi c'est plus simple de renvoyer l'ordre surtout si cela peut être fait automatiquement ^^

on trouve des scripts qui check toutes les x minutes l'état des périphériques et renvoient l'ordre correspondant à l'état supposé,
http://domoticz.blogspot.fr/2014/07/un- ... rence.html
c'est sympa mais j'avais besoin de quelque chose d'instantané, envoyer les commandes par groupe de 2,
j'ai donc écrit un petit script qui va, suivant une liste de périphérique pré-définis, renvoyer l'ordre immédiatement.

le voici:

Code : Tout sélectionner

-- script_device_twice.lua
--
-- ce script permet de doubler les commandes envoyées à certain périphériques
-- de sorte à fiabiliser leur fonctionnement
-- domoticz agit alors comme un répeteur


--------------------------------
------ Tableau à éditer ------
--------------------------------

 local ip = '192.168.22.100:8080'	-- user:pass@ip:port de domoticz
 
 local switchs={}	

	switchs['0']='la cafetiere'
	switchs['1']='la chambre'
	switchs['2']='les pierres'
	switchs['3']='leds'
--	switchs['4']='chauffage salon'
-- 	switchs['5']='chauffage salle de bain'
-- etc..
		
--------------------------------
-- Fin du tableau à éditer --
--------------------------------

time = os.date("*t")  

function timedifference(s)
	year = string.sub(s, 1, 4)
	month = string.sub(s, 6, 7)
	day = string.sub(s, 9, 10)
	hour = string.sub(s, 12, 13)
	minutes = string.sub(s, 15, 16)
	seconds = string.sub(s, 18, 19)
	t1 = os.time()
	t2 = os.time{year=year, month=month, day=day, hour=hour, min=minutes, sec=seconds}
	difference = os.difftime (t1, t2)
	return difference
end

function urlencode(str)
	if (str) then
	str = string.gsub (str, "\n", "\r\n")
	str = string.gsub (str, "([^%w ])",
	function (c) return string.format ("%%%02X", string.byte(c)) end)
	str = string.gsub (str, " ", "+")
	end
	return str
end 

commandArray = {}


   for key, valeur in pairs(switchs) do
				
				
				
			if(uservariables['TWICE_'..valeur..'_On'] == nil) then
				commandArray[tonumber(key)]={['OpenURL']=ip..'/json.htm?type=command&param=adduservariable&vname=TWICE_'..urlencode(valeur)..'_On&vtype=2&vvalue='..urlencode(otherdevices_lastupdate[valeur])}
				print('TWICE : création variable manquante TWICE_'..valeur..'_On')
			elseif(uservariables['TWICE_'..valeur..'_Off'] == nil) then
				commandArray[tonumber(key)]={['OpenURL']=ip..'/json.htm?type=command&param=adduservariable&vname=TWICE_'..urlencode(valeur)..'_Off&vtype=2&vvalue='..urlencode(otherdevices_lastupdate[valeur])}
				print('TWICE : création variable manquante TWICE_'..valeur..'_Off')	
			elseif (devicechanged[valeur] and timedifference(uservariables['TWICE_'..valeur..'_'..otherdevices[valeur]]) > 5) then
				commandArray[valeur] = otherdevices[valeur]..' AFTER 1'
				commandArray['Variable:TWICE_'..valeur..'_'..otherdevices[valeur]]=otherdevices_lastupdate[valeur]
				print('TWICE : '..valeur.. ' -> ' ..otherdevices[valeur])
			end
			
					
	end



return commandArray 

Dernière modification par vil1driver le 10 mai 2016, 23:05, modifié 8 fois.
MAJ = VIDER LE CACHE(<-Clicable)
/!\Les mises à jour de Domoticz sont souvent sources de difficultés, ne sautez pas dessus
modules.lua

Un ex domoticzien
deennoo
Messages : 4036
Inscription : 25 janv. 2015, 02:00

Re: Enovyer 2 fois les commandes On/Off

Message par deennoo »

je viens de mettre en place ton script car j'ai le meme probleme que toi, il semble fonctionner nickel

MERCI
De quoi se faire Plaisir et essayer d'aider...
http://www.domo-attitude.fr
vil1driver
Messages : 5661
Inscription : 30 janv. 2015, 11:07
Localisation : Rennes (35)

Re: Enovyer 2 fois les commandes On/Off

Message par vil1driver »

content que ça te plaise :p

je l'ai un poil amélioré, je viens de mettre à jour le code dans le message précédent.
meilleur gestion de la création des variables utilisateur nécessaires avec distinction des appuis On/Off.
MAJ = VIDER LE CACHE(<-Clicable)
/!\Les mises à jour de Domoticz sont souvent sources de difficultés, ne sautez pas dessus
modules.lua

Un ex domoticzien
deennoo
Messages : 4036
Inscription : 25 janv. 2015, 02:00

Re: Envoyer 2 fois les commandes On/Off

Message par deennoo »

Ok Merci,
De quoi se faire Plaisir et essayer d'aider...
http://www.domo-attitude.fr
deennoo
Messages : 4036
Inscription : 25 janv. 2015, 02:00

Re: Enovyer 2 fois les commandes On/Off

Message par deennoo »

vil1driver a écrit :content que ça te plaise :p

je l'ai un poil amélioré, je viens de mettre à jour le code dans le message précédent.
meilleur gestion de la création des variables utilisateur nécessaires avec distinction des appuis On/Off.
je viens de le mettre a jour : erreur !

2015-06-03 12:25:37.283 Error: EventSystem: /home/pi/domoticz/scripts/lua/script_device_twice.lua:62: bad argument #1 to 'pairs' (table expected, got nil)
De quoi se faire Plaisir et essayer d'aider...
http://www.domo-attitude.fr
vil1driver
Messages : 5661
Inscription : 30 janv. 2015, 11:07
Localisation : Rennes (35)

Re: Envoyer 2 fois les commandes On/Off

Message par vil1driver »

pas d'erreur ici :/ quelle est la ligne 62 pour toi ?
MAJ = VIDER LE CACHE(<-Clicable)
/!\Les mises à jour de Domoticz sont souvent sources de difficultés, ne sautez pas dessus
modules.lua

Un ex domoticzien
deennoo
Messages : 4036
Inscription : 25 janv. 2015, 02:00

Re: Envoyer 2 fois les commandes On/Off

Message par deennoo »

voici mon script mis au propre.

lua indique une erreure ligne 64 :

for key, valeur in pairs(switchs) do

Code : Tout sélectionner

-- script_device_twice.lua
--
-- ce script permet de doubler les commandes envoyées à certain périphériques
-- de sorte à fiabiliser leur fonctionnement
-- domoticz agit alors comme un répeteur


--------------------------------
------ Tableau à éditer ------
--------------------------------

 local ip = '192.168.0.21:8080'   -- ip:port de domoticz

 local check={}

   check['0']='La lumière du salon'
   check['1']='La lumiere de la cheminée'
   check['2']='le PC du  Bureau de Nico'
   check['3']='Sapin de Noel'
   check['4']='l anti Mouche du salon'
   check['5']='l Anti Moustique des Parents'
   check['6']='La Lumiere du Cellier'
   check['7']='chargeur aspi balay'
   check['8']='le Moteur de la Piscine'
   check['9']='Lumiere Loisir'
   check['10']='VMC MAISON'
   check['11']='le seche serviettes de la Salle de Bains'

--    etc...

--------------------------------
-- Fin du tableau à éditer --
--------------------------------


time = os.date("*t")  

function timedifference(s)
   year = string.sub(s, 1, 4)
   month = string.sub(s, 6, 7)
   day = string.sub(s, 9, 10)
   hour = string.sub(s, 12, 13)
   minutes = string.sub(s, 15, 16)
   seconds = string.sub(s, 18, 19)
   t1 = os.time()
   t2 = os.time{year=year, month=month, day=day, hour=hour, min=minutes, sec=seconds}
   difference = os.difftime (t1, t2)
   return difference
end

function urlencode(str)
   if (str) then
   str = string.gsub (str, "\n", "\r\n")
   str = string.gsub (str, "([^%w ])",
   function (c) return string.format ("%%%02X", string.byte(c)) end)
   str = string.gsub (str, " ", "+")
   end
   return str
end 

commandArray = {}


   for key, valeur in pairs(switchs) do
            
            
            
         if(uservariables['TWICE_'..valeur..'_On'] == nil) then
            commandArray[tonumber(key)]={['OpenURL']=ip..'/json.htm?type=command&param=saveuservariable&vname=TWICE_'..urlencode(valeur)..'_On&vtype=2&vvalue='..urlencode(otherdevices_lastupdate[valeur])}
            print('TWICE : création variable manquante TWICE_'..valeur..'_On')
         elseif(uservariables['TWICE_'..valeur..'_Off'] == nil) then
            commandArray[tonumber(key)]={['OpenURL']=ip..'/json.htm?type=command&param=saveuservariable&vname=TWICE_'..urlencode(valeur)..'_Off&vtype=2&vvalue='..urlencode(otherdevices_lastupdate[valeur])}
            print('TWICE : création variable manquante TWICE_'..valeur..'_Off')   
         elseif (devicechanged[valeur] and timedifference(uservariables['TWICE_'..valeur..'_'..otherdevices[valeur]]) > 5) then
            commandArray[valeur] = otherdevices[valeur]..' AFTER 1'
            commandArray['Variable:TWICE_'..valeur..'_'..otherdevices[valeur]]=otherdevices_lastupdate[valeur]
            print('TWICE : '..valeur.. ' -> ' ..otherdevices[valeur])
         end
         
               
   end



return commandArray 
avec l'ancienne version, les variables etaient cree, et maintenant non (j'ai effacer les anciennes)
De quoi se faire Plaisir et essayer d'aider...
http://www.domo-attitude.fr
vil1driver
Messages : 5661
Inscription : 30 janv. 2015, 11:07
Localisation : Rennes (35)

Re: Envoyer 2 fois les commandes On/Off

Message par vil1driver »

Erreur normale, tu as modifié le nom de la table.

Dans mon script : switchs
Dans le tien: check
MAJ = VIDER LE CACHE(<-Clicable)
/!\Les mises à jour de Domoticz sont souvent sources de difficultés, ne sautez pas dessus
modules.lua

Un ex domoticzien
deennoo
Messages : 4036
Inscription : 25 janv. 2015, 02:00

Re: Envoyer 2 fois les commandes On/Off

Message par deennoo »

C'est vrai corrigé et cela fonctionne beaucoup mieux

Merci :ugeek:
De quoi se faire Plaisir et essayer d'aider...
http://www.domo-attitude.fr
deennoo
Messages : 4036
Inscription : 25 janv. 2015, 02:00

Re: Envoyer 2 fois les commandes On/Off

Message par deennoo »

Je rencontre un soucis avec la version 2.3207, pas sur que cela vient de ton script

J'ai quelque prise commander grace au planning, lorsque que l'action on ou off ce met en route, le script s'actionne encore et encore et encore et encore et ceci autant de fois qu'il y a de device actionner.

Une Idée ?
De quoi se faire Plaisir et essayer d'aider...
http://www.domo-attitude.fr
Répondre