[LUA] Retour d'état portail

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 <\>.
Benjdev
Messages : 37
Inscription : 04 févr. 2020, 22:47

[LUA] Retour d'état portail

Message par Benjdev »

Bonjour à tous,

J'ai déjà un peu codé en Python, mais je souhaiterai m'essayer au LUA pour lire plus facilement la position de mon portail, que j'ai domotisé en Zwave avec un Smart Implant Fibaro (FGBS 222).
Pour contextualiser mon souci, les contacts sec n'étant pas dissociables des sorties sur le FGBS 222, j'ai du configurer mes fin de course en capteur analogiques, qui me renvoient donc 5V si appuyé, 0V sinon (environ...).

J'ai donc dans domoticz :
-> Portail fermé : 'sonde portail fermé' à 5v, 'sonde portail ouvert' à 0v
-> Portail entrouvert : mes deux sondes à 0v
-> Portail ouvert : 'sonde portail fermé' à 0v, 'sonde portail ouvert' à 5v

C'est fonctionnel, mais pas très intuitif !
Je voudrais donc faire un script LUA device qui lit les valeurs de ces deux sondes puis change la position d'un sélecteur pour le mettre sur la position qui correspond (dans un second temps je ferais 3 scripts qui a l'appui sur le bouton du sélecteur lancent la commande appropriée pour actionner le portail... mais dans un second temps seulement !).

J'ai démarré avec le script demo de domoticz, qui se lance bien (je vois le print dans les log) mais qui me donne cette erreur : "25: attempt to compare number with nil"
En fait je ne sais pas trop comment comparer les valeurs des devices avec ma valeur de référence puis comment modifier le sélecteur.

Mon ébauche de code :

Code : Tout sélectionner

print('this will end up in the domoticz log')

commandArray = {}
if (devicechanged['Sonde portail fermé'] > 3 and devicechanged['Sonde portail ouvert'] < 3) then
        commandArray['Portail']='Set Level: 0'
end
return commandArray
En gros quand le portail est fermé je voudrais mettre le sélecteur "portail" en position "Fermé", qui correspond au niveau 0...
Si une âme charitable pourrait m'aider à avancer (ou m'indiquer où je pourrais trouver un exemples suffisamment documenté...) ça serait top ! (je n'ai rien trouvé de concluant pour l'instant pour répondre à mes nombreuses interrogations : dois-je mettre le niveau ou le nom dans la valeur du sélecteur ? Quelle syntaxe pour comparer les valeurs de mes sondes ?...)

Un grand merci déjà d'avoir lu jusque là, et déjà un autre merci d'avance pour le coup de main que vous pourrez me filer.
Bonne fin de weekend et à bientôt !!
denis_brasseur
Messages : 898
Inscription : 24 déc. 2018, 17:05
Localisation : (26)

Re: [LUA]Retour d'état portail

Message par denis_brasseur »

Code : Tout sélectionner

if (devicechanged['Sonde portail fermé'] > 3 and devicechanged['Sonde portail ouvert'] < 3) then
Dans l'état actuel de ton code, la condition ne sera respectée que si il y a changement simultané de 'Sonde portail fermé' et de 'Sonde portail ouvert', ce qui semble improbable.

Le changement d'état du selector 'Portail' se fait bien en indiquant le level

Code : Tout sélectionner

commandArray[#commandArray+1] = {['Portail'] = 'Set Level 0'}
Pi3 + DD PiDrive - RFXtrx433 - AEON Labs ZW090
Benjdev
Messages : 37
Inscription : 04 févr. 2020, 22:47

Re: [LUA] Retour d'état portail

Message par Benjdev »

Ouch', ça va être plus compliqué que ce que j'espérais...

Alors, déjà merci pour cette réponse si rapide !
Ce qui entraîne une autre question : pourquoi le "#commandArray+1" ?

Sinon du coup en effet, si l'un ou l'autre de mes capteurs est à 5V, ça suffit pour déterminer si ouvert ou fermé... donc j'ai modifié mon code :

Code : Tout sélectionner

commandArray = {}
if (devicechanged[tonumber('Closed')] > 3 ) then
        commandArray[#commandArray+1]={['Portail']='Set Level: 0'}
end
return commandArray
J'ai aussi renommé mes capteurs en Closed et Opened pour plus de facilité.

Par contre j'ai toujours l'erreur comme quoi j'essaie de comparer un nombre au néant : je pense que je ne définis pas correctement 'Closed", c'est pour ça que j'ai essayé le tonumber, qui me semblait être "le nombre qui correspond à la valeur renvoyée par le capteur", mais là-dessus j'ai l'impression d'être à côté de la plaque.

Y-a-t-il quelque part une "bible" LUA ? Avec de la syntaxe et des exemples ? Parce que là j'ai vraiment l'impression d'y aller totalement à l'arrache... et comme ça à je risque d'avoir "très beaucoup besoin" de votre aide !!

En tous cas encore merci et à plus... ;)
denis_brasseur
Messages : 898
Inscription : 24 déc. 2018, 17:05
Localisation : (26)

Re: [LUA] Retour d'état portail

Message par denis_brasseur »

Concernant le message d'erreur, il faut le code en entier, ainsi que le détail de l'erreur afin de voir la ligne en cause

Ta syntaxe devicechanged[tonumber('Closed')] ne peux pas fonctionner, essaye ceci pour commencer

Code : Tout sélectionner

if devicechanged['Closed'] then --on teste le changement d'état
 	print(otherdevices['Closed'])
	if otherdevices['Closed'] > 3 then --on teste la valeur
	
	end
end
Le print(otherdevices['Closed']) te donnera la valeur afin de déterminer la syntaxe pour modifier la ligne suivante.

"#commandArray+1" est une habitude de codage.


Pour la bible lua, tu peux commencer par ceci
https://easydomoticz.com/mon-premier-sc ... en-oeuvre/
https://easydomoticz.com/mon-premier-sc ... ondations/
Pi3 + DD PiDrive - RFXtrx433 - AEON Labs ZW090
Benjdev
Messages : 37
Inscription : 04 févr. 2020, 22:47

Re: [LUA] Retour d'état portail

Message par Benjdev »

Me voici de retour... désolé pour le départ précipité : pas évident de se concentré en gérant mes filles !

Bon alors encore merci pour ton aide... j'avance, à petits pas mais j'avance !
Pour tes deux liens, j'avais commencé par ça, mais me replonger dans le second m'a fait dire que j'avais été un peu vite.

J'ai modifié donc mon code :

Code : Tout sélectionner

print('this will end up in the domoticz log')

commandArray = {}
if devicechanged['Closed'] then --on teste le changement d'état
        print(otherdevices['Closed'])
        if otherdevices_svalues['Closed'] > 3 then --on teste la valeur
                commandArray[#commandArray+1]={['Portail']='Set Level: 0'}
        end
end
return commandArray 
Et j'obtiens alors cette erreur :

Code : Tout sélectionner

 2022-10-24 10:35:57.617 Error: EventSystem: in /home/pi/domoticz/scripts/lua/script_device_retouretatportail.lua: ...domoticz/scripts/lua/script_device_retouretatportail.lua:27: attempt to compare number with string 
La ligne 27 est bien celle où je fais la comparaison, et si je mets otherdevices au lieu de otherdevices_values j'obtiens la même erreur.
Curieusement, lorsque Closed change de valeur, le print fonctionne bien :

Code : Tout sélectionner

 2022-10-24 10:41:54.520 Status: LUA: this will end up in the domoticz log
2022-10-24 10:41:54.520 Status: LUA: 3.360 
Voilà où j'en suis... j'aurais tendance du coup à revenir du côté de tonumber ? Vais creuser à partir de l'erreur...
Benjdev
Messages : 37
Inscription : 04 févr. 2020, 22:47

Re: [LUA] Retour d'état portail

Message par Benjdev »

Yesssssss !!! :D

Ce code fonctionne :

Code : Tout sélectionner

commandArray = {}
if devicechanged['Closed'] then --on teste le changement d'état
        print(otherdevices['Closed'])
        if tonumber(otherdevices['Closed']) > 3 then --on teste la valeur
                commandArray[#commandArray+1]={['Portail']='Set Level: 0'}
        end
end
return commandArray 
J'avais encore fait une boulette : 2 devices étaient nommés "Portail" donc le 'Set Level' ne fonctionnait pas (sans retourner d'erreur cependant...)

Encore un immense merci à toi Denis pour ton aide précieuse !
Je ne mets pas encore en résolu : je vais prendre le temps de compléter le script avec les autres positions du portail, puis les commandes et je mettrais tout ça ici, si ça peut servir à quelqu'un...
denis_brasseur
Messages : 898
Inscription : 24 déc. 2018, 17:05
Localisation : (26)

Re: [LUA] Retour d'état portail

Message par denis_brasseur »

L'erreur était bien identifié dans les logs

Code : Tout sélectionner

attempt to compare number with string
;)
Pi3 + DD PiDrive - RFXtrx433 - AEON Labs ZW090
Benjdev
Messages : 37
Inscription : 04 févr. 2020, 22:47

Re: [LUA] Retour d'état portail

Message par Benjdev »

En effet... vive les logs !!

Sinon pour ceux que ça intéresserait, voici le "corps du script", en version fonctionnelle avec le retour d'état mais aussi l'utilisation d'un sélecteur pour donner l'ordre au portail :

Code : Tout sélectionner

commandArray = {}

---- Première partie : on gère le retour d'état du portail
if devicechanged['Closed'] or devicechanged['Opened'] then -- On teste le changement d'état des capteurs
 	print("Portail actionné. Le capteur fermé prend la valeur "..otherdevices['Closed'] .. " et le capteur ouvert la valeur " .. otherdevices['Opened']) --on affiche les valeur des capteurs (pour debug)
	if tonumber(otherdevices['Closed']) > 3.5 then -- On teste la valeur du capteur fermé
		commandArray[#commandArray+1]={['Portail']='Set Level: 0'} -- On met le sélecteur position fermé
	elseif tonumber(otherdevices['Opened']) > 3.5 then -- On teste la valeur du capteur ouvert
                commandArray[#commandArray+1]={['Portail']='Set Level: 20'} -- On met le sélecteur position ouvert
	else commandArray[#commandArray+1]={['Portail']='Set Level: 10'} -- On met le sélecteur position entreouvert
	end

---- Seconde partie : on gère l'actionnement du sélecteur "Portail" dans Domoticz
elseif devicechanged['Portail'] then -- On teste le changement de position du sélecteur
	if otherdevices['Portail'] == 'Ouvert' then -- Boucle du choix d'action si position Ouvert
		if tonumber(otherdevices['Closed']) > 3.5 then
		commandArray[#commandArray+1]={['Ouverture totale'] = 'On'}
		elseif tonumber(otherdevices['Opened']) > 3.5 then
		--print("Ouverture enclenchée : Portail déjà ouvert !")
		else
		commandArray[#commandArray+1]={['Ouverture totale'] = 'On'}
		end
	elseif otherdevices['Portail'] == 'Entrouvert' then -- Boucle du choix d'action si position Entrouvert
		if tonumber(otherdevices['Closed']) > 3.5 then
                commandArray[#commandArray+1]={['Ouverture partielle'] = 'On'}
                elseif tonumber(otherdevices['Opened']) > 3.5 then
		commandArray[#commandArray+1]={['Portail']='Set Level: 20'} -- On remet le sélecteur position ouvert
		else
		-- print("Portail déjà entreouvert !")
                end
	elseif otherdevices['Portail'] == 'Fermé' then -- Boucle du choix d'action si position Fermé
                if tonumber(otherdevices['Opened']) > 3.5 then
                commandArray[#commandArray+1]={['Ouverture totale'] = 'On'}
                elseif tonumber(otherdevices['Closed']) > 3.5 then
                --print("Fermeture enclenchée : Portail fermé !")
                else
                commandArray[#commandArray+1]={['Ouverture partielle'] = 'On'}
                end
	end
end

return commandArray
Et encore un grand merci pour le coup de main salutaire ! ;-)
badaboum76
Messages : 66
Inscription : 01 oct. 2017, 20:14

Re: [LUA] Retour d'état portail

Message par badaboum76 »

Bonjour Benjdev , je cherche aussi à domotiser mon portail ( SOMFY RTS , modèle slidymoove 600 coulissant ) pour avoir un retour d'état depuis domoticz , et le top en même temps : ouvrir automatiquement mon portail quand j'arrive à x mètres en voiture ( via position gps du smartphone )

N'étant pas un pro des branchements , je sèche pour le raccordement du module zwave FGS211 ( ainsi que le fgbs222 )

Sur quelles bornes du moteur somfy fautil brancher le FGS211 ?

Merci d'avance pour tes réponses
Benjdev
Messages : 37
Inscription : 04 févr. 2020, 22:47

Re: [LUA] Retour d'état portail

Message par Benjdev »

Bonjour à toi,

Alors, compliqué de répondre sans avoir la carte sous les yeux...
D'après le mode d'emploi, tu as déjà un bornier "start" (5 et 6, page 19) pour brancher le visiophone : à mon avis c'est un contact sec et tu peux connecter ici une des deux sorties du fgbs222, et tu la configure en "impulsion" (0.5s d'allumage, ça enverra le signal d'ouverture ou de fermeture au portail).
Pour vérifier que c'est bien ça tu shunte rapidement 5 et 6 avec un bout de fil dénudé et tu verras si le portail se met en route...

Ensuite je n'ai pas trouvé dans la notice de contact sec piéton (ouverture partielle) mais à priori une seconde impulsion stoppe le portail : tu peux peut-être te servir de ça pour bidouiller ton ouverture partielle... (Tu fais un petit script qui envoie 2 impulsions séparées du temps nécessaire à ton ouverture partielle : en bonus tu peux configurer la largeur en modifiant le temps séparant les impulsions...).

Après pour avoir le retour d'état il te faut aller chercher l'info :
- soit tu poses des capteurs de fin de course : tu places des capteurs de chaque côté de la crémaillère par exemple, un activé ouvert et un activé fermé, mais attention : domoticz lie automatiquement entrée et sortie du fgbs si tes capteurs sont de simples contacts... L'astuce est de connecter une borne du contact à une alimentation entre 0 et 10v et de configurer les entrées du fgbs222 en "capteur analogique" : ils te renverront alors une tension si activés ou rien sinon (ou l'inverse selon si l'interrupteur est No ou NC...) et tu peux déduire de ces infos la position du portail.
- soit tu trouves directement sur ta carte une tension différente selon si le portail est ouvert, fermé ou entre les deux et tu relie ça aux entrées du fgbs, toujours en étant sûr que tes tensions sont entre 0 et 10v...
Là tu peux réfléchir à utiliser l'alimentation des moteurs, en intercalant un petit optocoupleur pour changer la tension (tes moteurs doivent être en 24v ? Si oui c'est trop pour le fgbs...) : Le défaut est que tu sais quand ton moteur tourne, éventuellement dans quel sens, mais tu ne sais pas si ton portail a atteint son but... 😅

Bon, tu vois le roman, tu as pas mal de pistes à explorer selon ta motorisation...
Pour ma part sur mon portail c'est une carte Net24N (assez standard et bien documentée...) avec une entrée contact sec ouverture totale et une entrée piéton : j'ai donc câblé les deux sorties du fgbs dessus.
Ensuite n'ayant rien trouvé de satisfaisant pour le retour d'état j'ai mis deux petits Switchs (https://a.aliexpress.com/_mL68azI) que j'ai connecté sur du 5v sur la carte et fixés de chaque côté du bras du moteur principal : de cette façon lorsque une des deux entrées reçoit 5v environ, je sais que le portail est ouvert ou fermé et si je n'ai pas de tension sur les deux entrées alors il est entrouvert !

Si tu as plus d'infos sur les connectiques de ta carte n'hésite pas et j'essaierai de t'aider un peu plus si je peux 😉

Bonne journée à toi et à vite !

[Edit] Je viens de relire et de voir que tu parlais d'un FGS211 : le fgbs222 devrait suffire à tout faire normalement, pas besoin de 2 modules.
Et enfin pour l'alimentation du fgbs il te faut aussi trouver la bonne tension sur ta carte, borne 7 et 9 tu dois avoir du 24v qui va bien je pense, à vérifier au multimètre... [/Edit]
Répondre