Page 1 sur 5

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

Publié : 15 avr. 2015, 11:26
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 


Re: Enovyer 2 fois les commandes On/Off

Publié : 01 juin 2015, 12:01
par deennoo
je viens de mettre en place ton script car j'ai le meme probleme que toi, il semble fonctionner nickel

MERCI

Re: Enovyer 2 fois les commandes On/Off

Publié : 02 juin 2015, 10:00
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.

Re: Envoyer 2 fois les commandes On/Off

Publié : 03 juin 2015, 12:22
par deennoo
Ok Merci,

Re: Enovyer 2 fois les commandes On/Off

Publié : 03 juin 2015, 12:27
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)

Re: Envoyer 2 fois les commandes On/Off

Publié : 03 juin 2015, 13:03
par vil1driver
pas d'erreur ici :/ quelle est la ligne 62 pour toi ?

Re: Envoyer 2 fois les commandes On/Off

Publié : 03 juin 2015, 15:24
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)

Re: Envoyer 2 fois les commandes On/Off

Publié : 03 juin 2015, 18:13
par vil1driver
Erreur normale, tu as modifié le nom de la table.

Dans mon script : switchs
Dans le tien: check

Re: Envoyer 2 fois les commandes On/Off

Publié : 03 juin 2015, 20:54
par deennoo
C'est vrai corrigé et cela fonctionne beaucoup mieux

Merci :ugeek:

Re: Envoyer 2 fois les commandes On/Off

Publié : 30 sept. 2015, 10:12
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 ?