Récupération d'une info du shell

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 <\>.
Jerome69
Messages : 98
Inscription : 04 févr. 2020, 23:57

Récupération d'une info du shell

Message par Jerome69 »

Bonsoir à tous.

Je rencontre un soucis avec un script LUA (Time).

Ce script est censé exécuter un bash (qui doit être exécuter avec le sudo) qui permet de récupérer la température d'un capteur bluetooth.

Voilà le script LUA en question :

Code : Tout sélectionner

function os.capture(cmd)
    local f = assert(io.popen(cmd, 'r'))
    local s = assert(f:read('*a'))
    f:close()
    return s
end

commandArray = {}
Temp=(os.capture("sudo domoticz/plugins/temp-disc.bash | grep 'Temp (°C)'"))
commandArray['UpdateDevice']='16|0|'..Temp
print(Temp)
return commandArray
Voilà le retour de l'exécution du script qui fonctionne bien quand je le tape dans le shell :

Code : Tout sélectionner

Packet complet : 33011B5C0E10003000B701AD2719010009094333384639333943BC

Battery (%) : 92
Time Interval (sec) : 3600
Stored Log Cont : 48
Current Temp (°C) : 18.3
Current Humidity (%) : 42.9
Current Dew Point (°C) : 1000.9
Mode : 1
Breach Count : 0
Name Identifier : 9
Length of Name : 9
Name of Device : C38F939C
Entre le moment de l'exécution du script et l'affichage de la 1ère ligne ("Packet complet.....'"), il y a un délais de 4 secondes environ, le temps de faire un scan de paquets bluetooth.

Quelqu'un aurait une idée du soucis? Est-ce qu'il y a besoin de mettre une pause quelque part?

J'ai déjà fait un script identique pour récupérer la puissance du signal wifi et cela fonctionne parfaitement, mais il n'y a pas de délais entre l'exécution de la commande et l'affichage.

Merci d'avance pour votre aide.
Neutrino
Messages : 2662
Inscription : 10 juil. 2015, 15:42
Localisation : Les Herbiers(85)

Re: Récupération d'une info du shell

Message par Neutrino »

Code : Tout sélectionner

Temp=(os.capture("sudo domoticz/plugins/temp-disc.bash | grep 'Temp (°C)'"))
Essaye avec le chemin complet et en simplifiant le grep, genre :

Code : Tout sélectionner

Temp=(os.capture("sudo /home/pi/domoticz/plugins/temp-disc.bash | grep 'Temp'"))
Ma maison à plein d'IP ! :mrgreen:
SAV Bonjour. Vous avez vidé le cache ?
Chrominator
Messages : 1042
Inscription : 19 déc. 2015, 07:29
Localisation : France

Re: Récupération d'une info du shell

Message par Chrominator »

J'ai pas forcément toutes les réponses, mais à mon avis :
  • Le sudo ne sert à rien car Domoticz fonctionne sous root.
  • Normalement quand on lance un script, et à fortiori quand c'est avec sudo puisqu'on change d'utilisateur, on n'utilise pas un chemin relatif, on va préférer un chemin absolu (sudo /home/pi/domoticz/scripts/monscript.bash).
  • Vrai aussi pour le grep, le PATH de ton user n'est pas forcément le même que celui de root (préférer noter /bin/grep).
  • As-tu essayé os.execute("/home/pi/domoticz/plugins/temp-disc.bash | /bin/grep 'Temp (°C)'") qui est un tout petit peu plus simple que ton écriture ?
Tiens-nous au jus.

Edit : laisse tomber le os.execute, j'avais oublié que tu voulais avoir la valeur retournée - Désolé
Dernière modification par Chrominator le 13 janv. 2021, 22:49, modifié 1 fois.
Un bon frein vaut mieux que deux sparadraps.

Ubuntu 24.04.3 LTS - Domoticz 2025.1 (build 16782)
Pentium G3220T 2.6GHz - 4Go DDR3
RFXtrx433 USB Ver Pro1/1043
Z-Stick GEN5 Version: 1.6-1136-g07ea22bb
Rtl433 RTL-SDR receiver
RFLink Gateway
Zigbee SLZB-06
Jerome69
Messages : 98
Inscription : 04 févr. 2020, 23:57

Re: Récupération d'une info du shell

Message par Jerome69 »

Merci pour le retour.

J'ai essayé mais je n'ai rien de plus.

J'ai mis un "print("Test")" avant la commande, et un "print(Temp)" à la fin pour avoir un retour dans les logs.

Voilà le retour :
2021-01-13 22:39:00.534 Status: LUA: Test
2021-01-13 22:39:00.855 Status: LUA:
2021-01-13 22:39:00.953 Status: EventSystem: Script event triggered: TempSalon


C'est comme si le script ne laissait pas le temps au programme de s'exécuter entièrement... Il me retourne une valeur vide.

J'ai testé l'autre ligne et j'ai une erreur :
2021-01-13 22:45:00.452 Error: EventSystem: in TempSalon: [string "function os.capture(cmd) ..."]:12: attempt to concatenate a nil value (global 'Temp')

Je viens de voir en parcourant des posts l'info pour le root :)
Keros
Messages : 6638
Inscription : 23 juil. 2019, 20:57

Re: Récupération d'une info du shell

Message par Keros »

Ton erreur vient de la définition de Temp qui ne fonctionne pas.

Ce ne serait pas Current Temp (°C) qu'il faut récupérer ?
Comment bien utiliser le forum : Poser une question, Mettre un script, un fichier, une image ou des logs
Mes petits guides : Débuter en programmation, Le débogage, Le choix de matériel, Les sauvegardes
Ma présentation - Mes Tutos
Chrominator
Messages : 1042
Inscription : 19 déc. 2015, 07:29
Localisation : France

Re: Récupération d'une info du shell

Message par Chrominator »

Le seul endroit du script où tu utilises la concaténation est dans le commandArray.
Donc Temp est nul car ta capture n'a pas fonctionné.

Essaye de mettre d'éviter les chemins relatifs dans ton appel au script, et supprime le sudo qui ne sert à rien; domoticz tourne sous root normalement.

Pour le grep, tu pourrais essayer de filtrer seulement sur Temp comme on ne le retrouve pas ailleurs ; je me méfie toujours des caractères spéciaux comme le ° qu'on a ici.
Un bon frein vaut mieux que deux sparadraps.

Ubuntu 24.04.3 LTS - Domoticz 2025.1 (build 16782)
Pentium G3220T 2.6GHz - 4Go DDR3
RFXtrx433 USB Ver Pro1/1043
Z-Stick GEN5 Version: 1.6-1136-g07ea22bb
Rtl433 RTL-SDR receiver
RFLink Gateway
Zigbee SLZB-06
Jerome69
Messages : 98
Inscription : 04 févr. 2020, 23:57

Re: Récupération d'une info du shell

Message par Jerome69 »

J'ai laissé "Temp" uniquement, et j'ai toujours le problème sur la concaténation, donc la commande ne retourne rien.

Il est possible de lancer une commande, faire une pause pour attendre que le résultat s'affiche et récupérer le retour?

Là j'ai l'impression que la commande se lance et qu'il récupère le retour qui est vide vu qu'il y a une sorte de tempo de 4-5 secondes?
Chrominator
Messages : 1042
Inscription : 19 déc. 2015, 07:29
Localisation : France

Re: Récupération d'une info du shell

Message par Chrominator »

J'essaie de t'aider ;

J'ai recopié ton script lua et j'ai émulé la réponse de ton script bash.
J'obtiens la même chose que toi ..... Rien :lol:

Screenshot_2021-01-13 Domoticz_dev(6).png
Screenshot_2021-01-13 Domoticz_dev(6).png (3.28 Kio) Consulté 2918 fois
J'ai modifié le script en mettant des chemins absolus et en virant le sudo.
Bah là j'ai quelque chose.

Screenshot_2021-01-13 Domoticz_dev(5).png
Screenshot_2021-01-13 Domoticz_dev(5).png (8.29 Kio) Consulté 2918 fois
A toi de voir pour la suite.

Pour info ce qui est lié à cette exécution :

Le "/home/pi/domoticz/scripts/temp-disc.bash"

Code : Tout sélectionner

#!/bin/bash
echo 'Battery (%) : 92
Time Interval (sec) : 3600
Stored Log Cont : 48
Current Temp (°C) : 18.3
Current Humidity (%) : 42.9
Current Dew Point (°C) : 1000.9
Mode : 1
Breach Count : 0
Name Identifier : 9
Length of Name : 9
Name of Device : C38F939C'
et son script lua associé:

Code : Tout sélectionner

function os.capture(cmd)
        local f = assert(io.popen(cmd, 'r'))
        local s = assert(f:read('*a'))
        f:close()
        return s
end

commandArray = {}
Temp=(os.capture("/home/pi/domoticz/scripts/temp-disc.bash | /bin/grep 'Temp (°C)'"))
print("Temp="..Temp)
commandArray['UpdateDevice']='16|0|'..Temp
print(Temp)
return commandArray
Un bon frein vaut mieux que deux sparadraps.

Ubuntu 24.04.3 LTS - Domoticz 2025.1 (build 16782)
Pentium G3220T 2.6GHz - 4Go DDR3
RFXtrx433 USB Ver Pro1/1043
Z-Stick GEN5 Version: 1.6-1136-g07ea22bb
Rtl433 RTL-SDR receiver
RFLink Gateway
Zigbee SLZB-06
Jerome69
Messages : 98
Inscription : 04 févr. 2020, 23:57

Re: Récupération d'une info du shell

Message par Jerome69 »

J'ai enfin réussi. Le soucis venait du bête copier/coller que j'ai fait de l'aide donnée par Chrominator. Je n'ai pas d'utilisateur "pi", j'ai créé un autre user. Il était tard hier, j'y ai pensé ce matin en me levant :)

Ça fonctionne parfaitement maintenant, mais le script met plus de 10 secondes à s'exécuter :
Log DomoticZ.jpg
Log DomoticZ.jpg (17.73 Kio) Consulté 2902 fois
Je supprimerais l'affichage de la température dans les logs, je n'en ai pas besoin vu que ça remonte parfaitement dans mon device.

Voilà le script LUA Time actuel :

Code : Tout sélectionner

function os.capture(cmd)
    local f = assert(io.popen(cmd, 'r'))
    local s = assert(f:read('*a'))
    f:close()
    return s
end

commandArray = {}
Temp=(os.capture("/home/Admin/domoticz/scripts/BlueMaestro.bash | /bin/grep 'Temp (°C)' | cut -c 21-25"))
commandArray['UpdateDevice']='21|0|'..Temp
return commandArray
En soit ce n'est pas bien grave le délais car la température remonte bien, mais je ne comprends pas pourquoi il met environ 12 secondes à s'exécuter alors que ça ne prend pas aussi longtemps normalement.
Il est possible de ne rien faire afficher dans le log de DomoticZ?
Répondre