[LUA] Renforcement du signal pour les interrupteurs sans état

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.
balajol
Messages : 864
Inscription : 13 nov. 2015, 18:54
Localisation : 62

Re: Renforcement du signal pour les interrupteurs sans état

Message par balajol »

fratton a écrit :
balajol a écrit :A priori cela ne fonctionne pas, voilà ce que donne le LOG

2016-08-20 13:32:03.557 Error: EventSystem: in C:\Program Files (x86)\Domoticz\scripts\lua\script_time_renforcement.lua: ... (x86)\Domoticz\scripts\lua\script_time_renforcement.lua:10: bad argument #1 to 'gmatch' (string expected, got nil)
Salut en passant, on a souvent cette erreur en LUA, dans 99% des cas pour moi, c'est simplement parce que j'ai mal écrit le nom de la variable InterrupteursSansEtat qui devient InterrupteurSansEtat (sans le s a interrupteur). Autre possibilité, la fonction LUA gmatch cherche un pipe "|", vu qu'il n'y a qu'un seul interrupteur, il faut finir par un "|". Ce qui donne :

Valeur de la variable: VoyantP.Garage-OUV-Pri-Phenix-8|

Bonsoir ou bonjour Fratton,
J'avais tenté le caractère | après le nom, cela n'a pas résolu le Problème.
Je viens de vérifier le fichier de base qui m' a servi de source, je ne voie pas également de faute d'orthographe :cry:
A priori je n'ai plus de message d'erreur par contre je ne voie pas de lancement du script RENFORCEMENT dans le LOG ..
Cela dépasse mes compétences actuelles, je verrai le résultat si j'ai encore un défaut à l'extinction de la lampe témoin qui m'indique que Ma porte se sous-sol est Ouverte :) alors qu'elle ne l'est pas..
Merci de votre aide
Cordialement
Bertrand
2024.6 PC Windows10 ; 2ème DEBIAN 10;DANFOSS LC13, Topp; Senseurs univ FIBARO FGBS001, Flood Sensor, ZMNHBD1 Flush 2 Relays ; FIBARO FGS222-FGS212;RFXCOM-RFXtrx433 USB 433.92MHz , Prises Phénix, Prises et Eclairage DI-O, SOMFY RTS,Sonoff ..
vil1driver
Messages : 5661
Inscription : 30 janv. 2015, 11:07
Localisation : Rennes (35)

Re: Renforcement du signal pour les interrupteurs sans état

Message par vil1driver »

si un pipe avait été nécessaire, la modification que je t'ai proposé aurait également généré la même erreur..
puisque ça ne fait que supprimer le besoin d'aller lire le contenu de la variable, en écrivant directement..
d'ailleurs étrange que lire la variable ne fonctionnait pas..

si je peux me permettre l'usage de la variable InterrupteursSansEtat et la fonction gmatch pour remplir la table switch,
c'est sympa pour le côté didactique mais c'est un peu se compliquer la vie.

perso je trouve plus simple de remplir la table directement à la main dans le script
serte éditer le script ou la variable ne se fait pas aussi simplement, mais en à-t-on un besoin régulier?
exemple, remplacer ceci,

Code : Tout sélectionner

local switchs={}

InterrupteursSansEtat=uservariables["InterrupteursSansEtat"]
for DeviceName in string.gmatch(InterrupteursSansEtat, "[^|]+") do
        switchs[#switchs + 1] = DeviceName
end
par ceci

Code : Tout sélectionner

local switchs={}	
	switchs['0']='Prise1'
	switchs['1']='Prise2'
	switchs['2']='Prise3'
-- etc..
l'usage de variables et gestion du lastupdate c'est un peu too much à mon gout aussi..
autant lancer le script toutes les 30 minutes plutôt que de vérifier que le device à été actionné il y a au moins 30 minutes..
l'idée est sympa c'est juste que j'aime faire au plus simple..
évidement ça ne donne pas le même résultat, le device pouvant être ré actionné bien avant les 30 minutes, mais est-ce gênant ?

voici le script que j'utilise personnellement, sans usage de variables.

Code : Tout sélectionner

-- script_time_check.lua
--
-- ce script renvoie la commande 'Off' aux périphériques listés, toutes les 15 minutes
-- biensure, seulement s'il sont censés être à Off ^^


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

   local check={}
   
   check['0']='la cafetiere'
--   check['1']='la chambre'
--   check['2']='le salon'
--   check['3']='les pierres'
--   check['4']='leds'
 
-- 	etc...

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


commandArray = {}

date = os.date("*t")
-- toutes les 15 minutes
if (date.min % 15 == 0) then

   for key, valeur in pairs(check) do
		if (otherdevices[valeur] == 'Off') then
			print('CHECK : '..valeur.. ' -> ' ..otherdevices[valeur])
			commandArray[tonumber(key)]={[valeur]=otherdevices[valeur]}
		end
   end
 
end

return commandArray
simplement supprimer

Code : Tout sélectionner

if (otherdevices[valeur] == 'Off') then
et le end qui suit pour prendre aussi en compte la valeur On
ce que je ne fais pas car j'ai un délai d'extinction sur le On (de ma cafetière) et cela le relancerait indéfiniment..
ce script permet de sans cesse toute les 15 minutes de lui renvoyer Off si elle est censé être éteinte bien sure, question de sécurité.

pour les commandes de chauffage ou autres..lancées par script, il suffit de ne pas tester l'état du device avant d'envoyer la commande.
ce qui est souvent fait c'est
si device pas déjà à On, envoyer On
perso j'envoie On même si déjà à On, du coups ça fiabilise d’emblée..
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
balajol
Messages : 864
Inscription : 13 nov. 2015, 18:54
Localisation : 62

Re: Renforcement du signal pour les interrupteurs sans état

Message par balajol »

Bonjour vil1driver,
Merci de tes suggestions d'amélioration, je regarde et test cela dès que possible.
Cordialement
Bertrand
2024.6 PC Windows10 ; 2ème DEBIAN 10;DANFOSS LC13, Topp; Senseurs univ FIBARO FGBS001, Flood Sensor, ZMNHBD1 Flush 2 Relays ; FIBARO FGS222-FGS212;RFXCOM-RFXtrx433 USB 433.92MHz , Prises Phénix, Prises et Eclairage DI-O, SOMFY RTS,Sonoff ..
fratton
Messages : 150
Inscription : 19 août 2015, 16:38

Re: Renforcement du signal pour les interrupteurs sans état

Message par fratton »

vil1driver a écrit :si un pipe avait été nécessaire, la modification que je t'ai proposé aurait également généré la même erreur..
ok, j'avais pas tout lu sur le coup
vil1driver a écrit :perso je trouve plus simple de remplir la table directement à la main dans le script
serte éditer le script ou la variable ne se fait pas aussi simplement, mais en à-t-on un besoin régulier?
exemple, remplacer ceci,
A ce compte là, pour faire encore plus simple, autant écrire 4 lignes à la suite avec le nom des 4 variables que de faire un array et une boucle pour le lire, c'est encore plus simple, mais bon, est-ce si grave :?

Code : Tout sélectionner

commandArray = {}
date = os.date("*t")
-- toutes les 15 minutes
if (date.min % 15 == 0) then
	commandArray['Prise1'] = otherdevices['Prise1']
	commandArray['Prise2'] = otherdevices['Prise2']
	commandArray['Prise3'] = otherdevices['Prise3']
	commandArray['Prise4'] = otherdevices['Prise4']
end
return commandArray
vil1driver a écrit :l'usage de variables et gestion du lastupdate c'est un peu too much à mon gout aussi..
autant lancer le script toutes les 30 minutes plutôt que de vérifier que le device à été actionné il y a au moins 30 minutes..
l'idée est sympa c'est juste que j'aime faire au plus simple..
évidement ça ne donne pas le même résultat, le device pouvant être ré actionné bien avant les 30 minutes, mais est-ce gênant ?
Là je ne suis pas d'accord avec toi, le 433MHz peut vite être encombrer toutes les 15 minutes si tu relance la transmission de tous les interrupteurs à la suite à heure fixe. Dans ce cas tu augmente le risque de ne pas recevoir une info d'un PIR, capteur de porte ou autre sonde 433MHz... C'est pour cela que je préfère avoir un intervalle en fonction du lastupdate, ça échelonne les renvois de code si comme moi tu commence à avoir plus d'une douzaine de prise 433MHz. De plus, je souhaité renvoyé la commande juste après 1 minute pour fiabiliser le ON/OFF.

Par exemple la cafetière, si la prise ne reçois le 1er ON, dans ton script il faut attendre jusqu’à 1/4 d'heure avant que la cafetière démarre, ce qui fait que ton café peu ne pas être prêt au réveil : l'HORREUR !!!
Idem pour le OFF, t'as cafetière tourne 1/4 d'heure de plus est tu consomme pour rien : l'HORREUR !!!
(PS: C'est ironique bien sûr, quoi que faut pas me croiser sans mon café le matin ;) ).

Je préfère donc mon script et ses variables, il fonctionne chez moi depuis quelques moi et a bien fiabilisé mon installation ;)
Raspberry Pi B+ / RF-Link 433MHz / divers device maison 433MHz et Wifi
vil1driver
Messages : 5661
Inscription : 30 janv. 2015, 11:07
Localisation : Rennes (35)

Re: Renforcement du signal pour les interrupteurs sans état

Message par vil1driver »

fratton a écrit : A ce compte là, pour faire encore plus simple, autant écrire 4 lignes à la suite avec le nom des 4 variables(...)

j'avoue, j'aurais pu me passer de critiquer la méthode.
fratton a écrit : (...)ça échelonne les renvois de code si comme moi tu commence à avoir plus d'une douzaine de prise 433MHz.(...)

je ne l'avais pas vu sous cet angle, pour le coups ton code est plus intéressant dès que le nombre est important, c'est vrai.

il y à des jours ou je manque de me taire..

merci pour ton code ;)
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
Répondre