[Tuto] Execution d'un shell/script défini dans les champs 'On Action', 'Off Action', 'Selector Action'

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.
bl34
Messages : 66
Inscription : 19 déc. 2021, 17:42

[Tuto] Execution d'un shell/script défini dans les champs 'On Action', 'Off Action', 'Selector Action'

Message par bl34 »

Bonjour,
J'ai passé un peu de temps pour faire marcher des shells ou des scripts LUA lancés par les actions sur un device virtuel de type switch ou selector.
Je voulais mettre à jour des devices virtuels immédiatement en fonction de l'action sur un autre device virtuel.
Exemple, couper l'automation des volets quand un switch virtuel de sécurité était activé.

Je partage ici les notes de mes trouvailles perso et sur internet ainsi qu'un fichier de fonctions LUA utilisant des commandes curl avec l'API JSON de Domoticz utilisables dans ce contexte
...au cas où ça peut aider.

Juste une question. J'ai trouvé des exemples où les commandes curl sont lancée en arrière plan avec un '&'.
Je n'en ai pas mis dans mes fonctions car je n'ai pas vu de différence avec ou sans.
Peut être pour des exécuter des commandes longues ?

Exécution d'un shell défini dans les champs 'On Action', 'Off Action', 'Selector Action', etc

Setup pour un environnement UNIX (RaspberrtyOS)
- Coder l'appel au shell ou au script dans les champs actions des devices :
- Ex : script:///home/pi/domoticz/scripts/lua/Actions/test.lua <arg> .
- Dans un script LUA l'argument <arg> est récupéré dans arg[1].
- Donner les droits 755 au fichier.
- 1ère ligne (she-bang) :
Pour un shell : #!/bin/bash
Pour un script LUA : #!/usr/bin/lua
- Optionnel : Enregistrer le fichier au format UNIX.

Restrictions
1) Les tables de l’environnement Domoticz ne sont pas accessibles. L'appel direct aux commandes style otherdevice, etc, ne marche pas.
2) Les entités Domiticz sont accessibles par des commandes curl appelant l'API JSON de Domoticz.
ex: /usr/bin/curl -m 8 "http://192.168.1.21:8080/json.htm?type=devices&rid=51
Les paramètres -u <id:pwd> de la commande curl sont optionnels selon le setup de la sécurité dans Domoticz.

Debug
erreur 32256 : donner droits 755 au fichier.
erreur 512: ajouter shebang, sauvegarder au format UNIX.
erreur 256 : erreur dans le script (syntax,..). Lancer le script en ligne de commande pour voir si messages d'erreur.

Exemple de script LUA

Code : Tout sélectionner

#!/usr/bin/lua 
--	Script appelé par les 'Selector Action' pour les modes d'automation des volets
--		script:///home/pi/domoticz/scripts/lua/Scripts_Action/Selector_Mode_Volets_Etage.lua <arg>
-- 		<arg> = Désignation du grope de volets, >Etage> ou <Rdc>
-- Actions : 
--	Pour les modes 'Manuel' (10) et 'Jour/Nuit' (20) : 
--		Supprime la variable BioClim_Volets_<arg>.

------------------------------------------
--
-- Chargement des packages
--
------------------------------------------
package.path = '/home/pi/domoticz/scripts/lua/Functions_curl.lua;' .. package.path 
require("Functions_curl.lua")

------------------------------------------
--
-- Main Program
--
------------------------------------------
-- Récupération de l'argument passé au script LUA.
LUA_arg_1 = arg[1]
-- Log("Arg: " .. LUA_arg_1, 4)
Selector = Dev_Get_Data('Mode Volets ' ..  LUA_arg_1,'Level')
if (Selector < 20)
then 
	Var_Delete_By_Name("BioClim_Volets_" .. LUA_arg_1)
end
Exemple de shell

Code : Tout sélectionner

#!/bin/bash

#
# Commande curl pour récupérer les données JSON d'un device.
# 	Le paramètre -u <id:pwd> de la commande curl est optionnel.
/usr/bin/curl -m 8 "http://192.168.1.14:8080/json.htm?type=devices&rid=51"

#
# Exécution d'une commande curl pour mettre le device_idx 53 à 'Off'.
#
/usr/bin/curl -m 8 "http://127.0.0.1:8080/json.htm?type=command&param=switchlight&idx=53&switchcmd=Off"

#
# Exécution d'une commande curl pour écrire la valeur 'Level' du device_idx 51 dans un fichier
# 	Retourne la valeur du champs 'Level' pour le device_idx 51" dans le fichier Level.txt
# 	Le paramètre -u <id:pwd> de la commande curl est optionnel.
#
/usr/bin/curl -m 8 "http://192.168.1.14:8080/json.htm?type=devices&rid=51" | jq .result[0].Level > ./Level.txt

#
# Exécution d'un script LUA à l'interieur d'un shell
# 	Résultat dans /home/pi/domoticz/Test/pgm_lua.txt.
# 	{
#		"status" : "OK",
#		"title" : "SwitchLight"
# 	}
lua /home/pi/domoticz/scripts/lua/test.lua > ./Test/pgm_lua.txt

exit 0
Pièces jointes
Fonctions_curl.rar
(2.66 Kio) Téléchargé 139 fois
Olivierxp
Messages : 15
Inscription : 29 sept. 2018, 09:58

Re: [Tuto] Execution d'un shell/script défini dans les champs 'On Action', 'Off Action', 'Selector Action'

Message par Olivierxp »

Bonjour,

existe t il une différence entre : #!/bin/bash et #!/bin/sh ?

Cordialement
bl34
Messages : 66
Inscription : 19 déc. 2021, 17:42

Re: [Tuto] Execution d'un shell/script défini dans les champs 'On Action', 'Off Action', 'Selector Action'

Message par bl34 »

Bonjour,
bash est une extention du shell sh, en principe entièrement compatible.
Tu peux afficher les shells dispo sur un système avec la commande cat /etc/shells
Un peu plus d'info ici : https://www.delftstack.com/fr/howto/linux/sh-and-bash/
Répondre