Bon bon bon... j'ai fais quelques essais de mon côté, et je crois avoir compris ce qu'il se passe
J'ai pu identifier au moins 2 causes pour que ton xdg-open n'aboutisse pas :
1/ C'est une application graphique. Pour qu'une application graphique se lance depuis une ligne de commande, il faut qu'une variable d'environnement appelée DISPLAY lui indique sur quel écran s'afficher. En effet, XWindows est un protocole graphique réseau, et une fenêtre peut d'afficher sur un autre ordi que celui où s'exécute le programme. J'ai fais des tests ici et je me suis rendu compte que la variable DISPLAY n'est pas définie dans l'environnement lancé par os.execute, même après le "su - " que je t'avais fais essayer plus tôt :
Script utilisé pour les tests. le os.capture permet de récupérer dans lua ce que réponds une commande linux :
Code : Tout sélectionner
function os.capture(cmd, raw)
local f = assert(io.popen(cmd, 'r'))
local s = assert(f:read('*a'))
f:close()
if raw then return s end
s = string.gsub(s, '^%s+', '')
s = string.gsub(s, '%s+$', '')
s = string.gsub(s, '[\n\r]+', ' ')
return s
end
commandArray = {}
if (devicechanged["test script"]) then
print("test script exécuté")
result=os.capture("su - domoticz -c 'echo $DISPLAY'")
print(result)
end
return commandArray
retourne :
Code : Tout sélectionner
2017-03-01 09:17:18.734 User: maison initiated a switch command (202/test script/On)
2017-03-01 09:17:18.789 LUA: test script exécuté
2017-03-01 09:17:23.848 LUA:
2017-03-01 09:17:18.735 (Internes) Light/Switch (test script)
et du coup, je rien ne se passe si je demande une application graphique au lieu du 'echo $DISPLAY' dans le os.capture
alors que si je définie la variable DISPLAY avant, ça marche :
ça m'ouvre bien un lxterminal sur mon ordi linux dont l'IP est 192.168.1.10
Essaye donc comme ça :
ou la totale
Code : Tout sélectionner
os.execute("su - pi -c 'export DISPLAY=:0; xdg-open blabla &'")
la syntaxe :0 désignant l'écran local de l'ordi sur lequel s'exécute la commande (= le pi). Tu noteras aussi le & final, pour dire au os.execute de ne pas attendre la fin de la commande linux, sinon domoticz va râler que ton script met plus de 10s à se terminer
2/ xdg-open permet d'ouvrir un url avec le logiciel par défaut ; il se peut donc que le logiciel par défaut ne soit pas défini dans l'environnement lancé par os.execute. Dans ce cas, remplace le directement par le nom de ton browser plutôt que de demander au système quel est le browser par defaut
Note: il se peut qu'il y ait d'autres écueils liés aux autorisations :
- pour l'utilisateur root d'exécuter des programmes graphiques : certaines distributions l'interdisent. Dans mes tests, domoticz ne tourne pas en root
- pour un utilisateur (root) d'exécuter des programmes graphiques sur la session de quelqu'un d'autre (pi)
Enfin, juste une remarque sur ce que tu essayes de faire : J'ai cru comprendre que tu voulais regarder la TV en lançant un browser sur le pi dont tu déportes ensuite l'affichage par vnc. Je suis pas sûr que tu obtiennes de bonnes performances de cette façon. L'expérience que j'ai de vnc, c'est qu'il est ok pour de la bureautique, j'ai jamais essayé des vidéos de cette façon. Ce serait sûrement plus efficace (mais plus compliqué) que du demande au pi de demander à ton ordi local d'ouvrir l'url de la video