Récupération d'une info du shell

Vous avez des questions concernant les scripts dans Domoticz, posez vos questions ici, quelque soit le langage nous tenterons des réponses pertinentes ...
Répondre
Jerome69
Messages : 42
Enregistré le : 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 : 1583
Enregistré le : 10 juil. 2015, 15:42
Localisation : Les Herbiers(85)
Contact :

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 : 666
Enregistré le : 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é
Modifié en dernier par Chrominator le 13 janv. 2021, 22:49, modifié 1 fois.
Partir, c’est pourrir un pneu.

Ubuntu 20.04 LTS - Domoticz v2020.2
rfxcom RFXtrx433 USB Version: Pro1/1043
Z-Stick GEN5 Version: 1.6-1136-g07ea22bb
Rtl433 RTL-SDR receiver
RFLink Gateway with LAN interface 48.4

Jerome69
Messages : 42
Enregistré le : 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 : 1247
Enregistré le : 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 ?

Chrominator
Messages : 666
Enregistré le : 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.
Partir, c’est pourrir un pneu.

Ubuntu 20.04 LTS - Domoticz v2020.2
rfxcom RFXtrx433 USB Version: Pro1/1043
Z-Stick GEN5 Version: 1.6-1136-g07ea22bb
Rtl433 RTL-SDR receiver
RFLink Gateway with LAN interface 48.4

Jerome69
Messages : 42
Enregistré le : 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 : 666
Enregistré le : 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) Vu 167 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) Vu 167 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
Partir, c’est pourrir un pneu.

Ubuntu 20.04 LTS - Domoticz v2020.2
rfxcom RFXtrx433 USB Version: Pro1/1043
Z-Stick GEN5 Version: 1.6-1136-g07ea22bb
Rtl433 RTL-SDR receiver
RFLink Gateway with LAN interface 48.4

Jerome69
Messages : 42
Enregistré le : 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) Vu 151 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