Page 1 sur 2

[résolu] Scripts pour tres grand debutant

Publié : 19 févr. 2019, 21:43
par freulon9292
Bonjour,

je suis un tres grand débutant, et j'ai un peu de mal à me retrouver dans les bribes d'infos que je trouve à droite et à gauche.
Pour me faire la main sur les scripts, j'ai décidé de commencer petit.

J'ai un uptime.sh super compliqué :
#!/bin/bash
uptime -p
uptime -s

:D
Le but est de lancer ce script depuis domoticz, et en récupérer la sortie.

j'ai créé un switch virtuel, et un event "script_device_dummy_switch_1.lua"

commandArray = {}
print ("ça commence");
if commandArray[dummy_switch_1] == 'On' then
os.execute ("/home/pi/domoticz/scripts/uptime.sh")
end
print ("ça fini");
return commandArray

Si je coche "event active" je vois dans les logs que ça tourne en boucle quoi que je fasse, et si c'est pas coché, j'arrive pas à le déclencher.

Ensuite, comment récupérer la sortie dans un capteur de type texte ? (je m'attendais naïvement à voir mon retour dans les logs).

Je débute, voyais plus ça comme un exercice que comme un besoin impèrieux de checker mon uptime.

Merci de votre aide.

Re: Scripts pour tres grand debutant

Publié : 20 févr. 2019, 06:05
par denis_brasseur
Si tu veux capter le changement d'état d'un switch :

Code : Tout sélectionner

if (devicechanged[dummy_switch_1] == 'On') then
Si tu veux capter l'état d'un switch :

Code : Tout sélectionner

if (otherdevices[dummy_switch_1] == 'On') then
Ce n'est pas le bon test à utiliser :

Code : Tout sélectionner

if commandArray[dummy_switch_1] == 'On' then

Code : Tout sélectionner

if (devicechanged[dummy_switch_1] == 'On') then
	print ("ça commence")
	os.execute ("/home/pi/domoticz/scripts/uptime.sh")
	print ("ça fini")
end
Pour exécuter un script, tu peux également utiliser Action On et Action Off de ton virtuel Device.
Action On: script:////home/pi/domoticz/scripts/uptime.sh (Should start with http://, https:// or script://)
Action Off: (Should start with http://, https:// or script://)

Re: Scripts pour tres grand debutant

Publié : 20 févr. 2019, 09:02
par vil1driver
Salut,
freulon9292 a écrit : 19 févr. 2019, 21:43
Je débute, voyais plus ça comme un exercice...
Tu ne t'es pas pris le plus simple des exercices.
Mais pourquoi venir chercher la solution ?
Le but de l'exercice n'est il pas d'y arriver soit même en s'appuyant sur le cours et exemples associés ?

;)

Mot clé pour t'aider à aller plus loin : 'os.capture'

Re: Scripts pour tres grand debutant

Publié : 20 févr. 2019, 14:40
par landaisbenj
Je pense aussi qu'il faut que tu regardes du coté du type de declenchement. En effet les scripts dans domoticz sont scrutés a certains moment bien précis. Soit des que n'importe quel device change d'etat, soit toutes les minutes, soit suivant l'etat du module de securité ou alors quand une variable utilisateurs change.

Le probleme ici c'est que tu as du mettre "all" alors que tu ne veux scruter ton script que quand ton device "dummy switch 1" change d'etat.
Du coup, meme si il ne fonctionne pas, des que tu l'active alors il est scruté n'importe quand et presque n'importe comment.
Cela peut poser certains probleme sur les conditions.

1er problème: Comme tu l'as lu, tu te trompe dans ta condition. La table commandArray permet de renvoyer a domoticz (output) les device dont tu as demandé un changement d'etat. Alors qu'il faut que tu utilises ici la table devicechanged qui permet a domoticz d'envoyer (input) a ton script l'etat changeant de ton device. Le probleme ici c'est que si ton script est scruté a un temps donnée, il n'y a peut etre pas eu de changement d'etat sur un device, du coup la table devicechanged est vide et peut donc renvoyer une erreure si tu demandes l'etat changeant de ton dummy device.
Il faut donc d'abord que tu passes ton script en script device au lieu de all.

2ieme probleme lorsque tu veux sortir de ton script lua, par exemple pour aller lancer un autre script bash, il faut que tu ouvre un tunnel de communication (input output) comme partout sur les systemes type linux raspian tout ca. Il faut donc que tu trouve la commande qui te convient, pour ouvrir un canal de communication entre le lancement de ton bash et son retour.

LUA est composé de plusieurs librairie comme os ou io qui te permet de communiquer soit avec ton systeme, soit de creer un canal d'entrée ou sortie.
Par exemple, os.execute te permet d'executer un script bash depuis ton systeme, et io.open ouvre une commande et recupere le retour.
https://www.lua.org/manual/5.1/

Re: Scripts pour tres grand debutant

Publié : 20 févr. 2019, 17:22
par Jeff
Bravo pour l'explication :D
Je viens aussi d'apprendre des trucs, moi qui passe mon temps à copier des bouts de script depuis des années...

Re: Scripts pour tres grand debutant

Publié : 21 févr. 2019, 09:38
par landaisbenj
:D Cool alors.

Et est-ce que tu connais le fonctionnement de tous ces "commandArray" "devicechanged" "uservariables_lastupdate" "timeofday" et autre ?

En faite, il s'agit de table. On peut imaginer que ce sont des tableaux de deux colonnes. Tu peux y mettre par exemple une valeur seul en colonne 1, une valeur en colonne 1 et sa clef en colonne 2 (par exemple une variable et son résultat) ou alors carrément une autre table complète.
La table sera lu soit en ligne, soit par valeur (table[1] ou table['MyOtherDeviceName1']). C'est a dire que si tu viens insérer dans la table une clef différent pour une même valeur, alors il s'agira d'un remplacement. Sinon, si tu vient modifier une valeur et sa clef par ligne alors il s'agira d'un ajout.

Pour domoticz, ce sont toutes des tables d'entrées, c'est a dire qu'elles sont créés pour la récupération d'information de domoticz vers le script, sauf commandArray qui est une table de sortie du script vers domoticz. Dans les tables d'entrée, domoticz y place certaines valeurs. En général, il va y placer le nom d'un device, d'une variable, d'une scène ou autre, dans la première colonne, la deuxième colonnes sera surement l’état, le résultat ou le contenu, de ce qui se trouve en première colonnes.

Pour commandArray (qui est la table de sortie), tu viendras y mettre toi même le nom du device, et l’état que tu veux lui attribuer. A la toute fin du script, domoticz vient chercher cette table, scrute les colonnes pour chercher le nom des devices et affecte l’état que tu as mis en deuxième colonne.

Code : Tout sélectionner

commandArray['Colonnes 1']='Colonnes 2'
Domoticz ici pourra mettre l’état On au device 'MyOtherDeviceName1':

Code : Tout sélectionner

commandArray['MyOtherDeviceName1']='On'
On initialise une table avec des crochets: commandArray={} et on retourne la table a domoticz avec return commandArray. C'est pour cela qu'il faut impérativement ces chaines en début et en fin de script.
Ce qui donne visuellement: commandArray = { 'Colonnes 1' = 'Colonnes 2' ; etc ; etc }

Il y a plein de façon de manipuler les tables, notamment tu peux indiquer que tu veux (au lieu de la méthode habituelle) en première ligne de la colonne, insérer une table avec le nom de ton device et son statu, exemple:
commandArray[1]={'MyOtherDeviceName1'='On'}
Quand domoticz viendra scruter cette table il comprendra la même chose.
Tu peux du coup en arriver à '#commandArray' qui te renvoi la taille de la table. Celle la sera de 0 au début, et du nombre d'entrée que tu y auras inséré a la fin.
#devicechanged elle sera constamment a 1, car elle n'est créé qu'avec le dernier changement d’état du dernier device changeant d’état. #otherdevice elle aura le nombre total de device dans domoticz etc etc.

Et c'est pour cela qu'on peut automatiquement créé des lignes différentes dans commandArray avec :

Code : Tout sélectionner

commandArray[#commandArray+1]={['MyOtherDeviceName1'] = 'On'}
on calcul la taille en cours de la table, on rajoute 1 pour une nouvelle ligne et on insère la valeur et la clef (device, statu).

Tous ça pour en arriver à un problème qui se pose souvent lorsqu'on essai d'activer plusieurs device dans un seul script. Il faut impérativement que ce soit clair pour domoticz.
Si tu fais plusieurs commandArray à la suite avec le même device, ton script va remplacer la clef de la même valeur. Alors que si tu viens insérer le device et son statu ligne par ligne, alors tu auras autant de clef que tu as de ligne pour pouvoir changer l'etat de ton device autant de fois. Cependant si aucun timer n'est present les changements auront lieu d'un coup. Voila pourquoi il existe aussi les 'ON FOR', 'ON AFTER' ou autre...

On peut naviguer dans les tables avec des boucles:

Code : Tout sélectionner

    for deviceName,deviceValue in pairs(otherdevices) do 
        print ( "Device: '..deviceName..'" - Etat: '..deviceValue)
    end
Mais aussi simplement avec next:

Code : Tout sélectionner

print ( "Device: '..next(devicechanged)..'" - Etat: '..devicechanged[next(devicechanged)] )
J'ai recensé toutes ces tables (qui pour certaines ne sont pas dans le wiki). Ces tables sont des créations domoticz et pas lua. Voila pourquoi il est dur de les connaitre si le wiki ne les recense pas:

https://easydomoticz.com/forum/viewtopi ... 944#p38944

Re: Scripts pour tres grand debutant

Publié : 06 mars 2019, 22:33
par freulon9292
Merci pour les infos ...
ça aide énormément à comprendre ce qui pour moi n'est absolument pas intuitif !

Pour le moment, j'ai un

Code : Tout sélectionner

commandArray = {}

if (devicechanged["dummy_switch_1"] == "On") then
local file = assert(io.popen('/home/pi/domoticz/scripts/uptime.sh', 'r'))
local output = file:read('*all')
file:close()
print(output) 
end

return commandArray
qui me renvoi un log
Status: LUA: up 4 hours, 28 minutes
2019-03-06 17:51:58
Il ne me "reste plus qu'à" trouver à renvoyer ce log dans un device texte.

Re: Scripts pour tres grand debutant

Publié : 06 mars 2019, 22:54
par vil1driver

Re: Scripts pour tres grand debutant

Publié : 07 mars 2019, 17:08
par freulon9292
bon, pour le coup, je sèche ...

j'ai modifié mon script bash pour intégrer un curl ...
j'ai joué avec string, avec des ", des ', des \", des "'" .... je n'arrive pas à passer une variable avec espace à curl ....

Code : Tout sélectionner

#!/bin/bash
uptime=$(uptime -p;uptime -s)
string="https://192.168.1.3:9090/json.htm?type=command&param=udevice&idx=68&svalue=\"${uptime}\""
echo $string
#curl -k "https://192.168.1.3:9090/json.htm?type=command&param=udevice&idx=68&svalue=\"${uptime}\""
curl -k $string         


je prends les bonnes idées ....

Re: Scripts pour tres grand debutant

Publié : 07 mars 2019, 19:55
par landaisbenj
Je crois qu'en bash tu n'as pas besoin d'extraire les variables. Et pour curl je pense qu'il faut sûrement convertir les espaces au format html (%20) peut-être?