IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Python Discussion :

Affichage données mqtt sur ecran lcd i2c [Python 3.X]


Sujet :

Python

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre habitué
    Homme Profil pro
    Particulier
    Inscrit en
    Septembre 2022
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Particulier

    Informations forums :
    Inscription : Septembre 2022
    Messages : 10
    Par défaut Affichage données mqtt sur ecran lcd i2c
    Bonjour a tous et merci pour acceptation au forum. Je débute en programmation et j'ai trouvé sur le net deux scripts que je voudrais modifier et fusionner. Le premier affiche une phrase sur un lcd i2c avec une adresse 0x26 (j'ai deux lcd).

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    from RPLCD.i2c import CharLCD
    lcd = CharLCD(i2c_expander='PCF8574', address=0x26, port=1, cols=16, rows=2, dotsize=8)
    lcd.clear()
     
    lcd.write_string('envoi message sur ecran')
    Script simple qui fonctionne.

    Le deuxieme recupère des données de mosquitto mqtt et affiche dans la console

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    import subprocess
     
    # Paramètres de la commande mosquitto_sub
    host = "192.168.x.xx"
    username = "xxxxxxxx"
    password = "xxxxxxxxx"
    topic = "xxxxxxxx"
     
    # Exécution de la commande
    try:
        result = subprocess.run(
            ["mosquitto_sub", "-h", host, "-u", username, "-P", password, "-t", topic],)
     
        print(f"Résultat de la commande mosquitto_sub :")
        print(result)
     
    except subprocess.CalledProcessError as e:
        print(f"Erreur lors de l'exécution de la commande : {e}")
    Script simple qui fonctionne aussi. Je veux juste afficher les données de mqtt sur l'ecran lcd. Pouvez vous m'aider s'il vous plait. Merci d'avance

  2. #2
    Membre Expert
    Avatar de MPython Alaplancha
    Homme Profil pro
    Paysan à 3 francs six sous
    Inscrit en
    Juin 2018
    Messages
    923
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Pyrénées Orientales (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Paysan à 3 francs six sous
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Juin 2018
    Messages : 923
    Billets dans le blog
    8
    Par défaut
    Bonjour,
    Pour cela il te faut transformer result en une chaine de caractère.
    Pour cela ajoute, l'argument text=True
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    result = subprocess.run(["mosquitto_sub", "-h", host, "-u", username, "-P", password, "-t", topic], text=True)
    output = result.stdout

  3. #3
    Membre prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 835
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 835
    Billets dans le blog
    1
    Par défaut
    Bonjour
    Citation Envoyé par MPython Alaplancha Voir le message
    Pour cela ajoute, l'argument text=True
    Je ne connais pas le but de cet argument... mais il me semble qu'il ne sert pas à ça (en tout cas chez-moi si j'écris result=subprocess.run(("ls", "-l"), text=True) j'obtiens quand-même tout en vrac à l'écran)
    Je pense qu'il faut plutôt écrire stdout=subprocess.PIPE pour que le résultat de la commande parte dans "result". Et si la commande retourne une erreur et que l'on veut aussi cette erreur dans "result" il faut alors rajouter stderr=stdout.
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

  4. #4
    Membre Expert
    Avatar de MPython Alaplancha
    Homme Profil pro
    Paysan à 3 francs six sous
    Inscrit en
    Juin 2018
    Messages
    923
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Pyrénées Orientales (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Paysan à 3 francs six sous
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Juin 2018
    Messages : 923
    Billets dans le blog
    8
    Par défaut
    excuse. Ma réponse était en effet incomplète. Il manque 'capture_output=True'.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    >>> ls = subprocess.run('ls', text= True, capture_output=True)
    >>> ls.stdout
    Citation Envoyé par doc
    Changed in version 3.7: Added the text parameter, as a more understandable alias of universal_newlines. Added the capture_output parameter.
    Sinon subprocess.PIPE est valide aussi

  5. #5
    Membre habitué
    Homme Profil pro
    Particulier
    Inscrit en
    Septembre 2022
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Particulier

    Informations forums :
    Inscription : Septembre 2022
    Messages : 10
    Par défaut
    Citation Envoyé par MPython Alaplancha Voir le message
    excuse. Ma réponse était en effet incomplète. Il manque 'capture_output=True'.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    >>> ls = subprocess.run('ls', text= True, capture_output=True)
    >>> ls.stdout
    Sinon subprocess.PIPE est valide aussi
    merci pour l'aide mais ne n'arrive toujours pas a afficher les données de mqtt sur l'ecran lcd

  6. #6
    Membre Expert
    Homme Profil pro
    Inscrit en
    Octobre 2011
    Messages
    2 910
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Octobre 2011
    Messages : 2 910
    Par défaut
    Salut,

    Je ne suis pas sûr d'avoir compris le problème mais pourquoi ne pas juste combiner les deux codes ?

    Si j'ai bien compris les deux codes fonctionnent, le deuxième récupère des données et les affiche dans la console avec la fonction native print et toi tu veux les afficher sur ton afficheur LCD or justement le premier code te fournie la fonction lcd.write_string alors pourquoi ne pas l'utiliser de la même manière que la fonction print du deuxième code ?

    Quelque chose doit m'échapper...

  7. #7
    Membre prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 835
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 835
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par Beginner. Voir le message
    Quelque chose doit m'échapper...
    Le print du second code n'affiche pas le résultat de la commande mais juste son code d'état (commande effectuée, réussite/echec). Il faut aussi rajouter, dans subprocess.run(), l'option qui permet de récupérer ledit résultat (je connaissais stdout=subrocess.PIPE et MPython Alaplancha en a montré une autre).
    Ensuite ok on peut combiner les deux codes et afficher dans le premier le contenu de la commande exécutée dans le second.
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

  8. #8
    Membre Expert
    Homme Profil pro
    Inscrit en
    Octobre 2011
    Messages
    2 910
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Octobre 2011
    Messages : 2 910
    Par défaut
    Citation Envoyé par Sve@r Voir le message
    Le print du second code n'affiche pas le résultat de la commande mais juste son code d'état (commande effectuée, réussite/echec).
    Ah ok, le po disait que le code fonctionnait: qu'il affichait bien les données dans la console... Mais effectivement "result" n'est pas une chaine de caractères mais on peut faire result.stdout.decode() pour récupérer les données sous forme d'une chaine de caractères (si j'ai bien compris, sauf options particulières, result.stdout est une séquence de bytes).

  9. #9
    Membre prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 835
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 835
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par Beginner. Voir le message
    (si j'ai bien compris, sauf options particulières, result.stdout est une séquence de bytes).
    Option particulière: text=True et hop, ça devient un str
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

  10. #10
    Membre Expert
    Homme Profil pro
    Inscrit en
    Octobre 2011
    Messages
    2 910
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Octobre 2011
    Messages : 2 910
    Par défaut
    Effectivement...

  11. #11
    Membre habitué
    Homme Profil pro
    Particulier
    Inscrit en
    Septembre 2022
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Particulier

    Informations forums :
    Inscription : Septembre 2022
    Messages : 10
    Par défaut
    Citation Envoyé par Sve@r Voir le message
    Le print du second code n'affiche pas le résultat de la commande mais juste son code d'état (commande effectuée, réussite/echec). Il faut aussi rajouter, dans subprocess.run(), l'option qui permet de récupérer ledit résultat (je connaissais stdout=subrocess.PIPE et MPython Alaplancha en a montré une autre).
    Ensuite ok on peut combiner les deux codes et afficher dans le premier le contenu de la commande exécutée dans le second.
    merci pour l'aide. le print du second code me donne bien la temperature d'un capteur recupérer dans mqtt. C'est juste que je ne trouve pas la methode pour ajouter le premier script et afficher la temperature sur le lcd.

  12. #12
    Membre prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 835
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 835
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par Mick972 Voir le message
    merci pour l'aide. le print du second code me donne bien la temperature d'un capteur recupérer dans mqtt.
    Non ce n'est pas le print() qui l'affiche, c'est ta commande qui est appelée par Python et qui s'affiche à l'écran. Enlève le print() tu auras toujours ton résultat.

    Citation Envoyé par Mick972 Voir le message
    C'est juste que je ne trouve pas la methode pour ajouter le premier script et afficher la temperature sur le lcd.
    Dans ton premier script tu écris
    Code python : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    result = subprocess.run(("mosquitto_sub", "-h", host, "-u", username, "-P", password, "-t", topic), text=True, capture_output=True)
    lcd.write_string(result.output)

    Et pour la suite, quand tu feras des scripts de test, prends l'habitude de les mettre en fonction. Ainsi quand le script fonctionne il suffit de l'importer et l'importateur a directement accès à la fonction du script importé.
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

  13. #13
    Membre Expert
    Avatar de MPython Alaplancha
    Homme Profil pro
    Paysan à 3 francs six sous
    Inscrit en
    Juin 2018
    Messages
    923
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Pyrénées Orientales (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Paysan à 3 francs six sous
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Juin 2018
    Messages : 923
    Billets dans le blog
    8
    Par défaut
    Citation Envoyé par Sve@r Voir le message

    Dans ton premier script tu écris
    Code python : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    result = subprocess.run(("mosquitto_sub", "-h", host, "-u", username, "-P", password, "-t", topic), text=True, capture_output=True)
    lcd.write_string(result.output)
    Le fait de devoir le préciser me laisse à penser que le PO n'a pas vraiment de connaissances sur python. Du moins je le présume .
    Qu'en est-il @Mick972?
    Tu dis : "Je débute en programmation", Tu suis une formation, un tutoriel?

  14. #14
    Membre habitué
    Homme Profil pro
    Particulier
    Inscrit en
    Septembre 2022
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Particulier

    Informations forums :
    Inscription : Septembre 2022
    Messages : 10
    Par défaut
    Merci pour ta ta répose. j'ai commencé par cela avant de poser la question sur le forum. j'avais remplacé la fonction print par lcd.write_string mais pas d'affichage sur le lcd. Séparement les deux scripts fonctionnent

  15. #15
    Expert confirmé
    Avatar de fred1599
    Homme Profil pro
    Lead Dev Python
    Inscrit en
    Juillet 2006
    Messages
    4 062
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : Lead Dev Python
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Juillet 2006
    Messages : 4 062
    Par défaut
    Salut,

    On utilise subprocess.run, la doc pour récupérer stdout est claire,

    Citation Envoyé par doc
    If capture_output is true, stdout and stderr will be captured.
    par défaut ce paramètre est à False, il faut donc le préciser dans le code...

    Si on souhaite lever une exception CalledProcessError il me semble qu'il faudra passer aussi l'argument check=True.

    Pour mosquitto_sub en lisant la doc, j'ai l'impression que c'est bloquant, je conseillerai de mettre un timeout qui permet de spécifier un délai et qui pourrait être utile pour éviter que le script ne reste bloqué indéfiniment sur une commande qui ne se termine pas et utiliser l'option -C.

    Citation Envoyé par doc
    Disconnect and exit the program immediately after the given count of messages have been received. This may be useful in shell scripts where on a single status value is required, for example.

  16. #16
    Expert confirmé
    Avatar de fred1599
    Homme Profil pro
    Lead Dev Python
    Inscrit en
    Juillet 2006
    Messages
    4 062
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : Lead Dev Python
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Juillet 2006
    Messages : 4 062
    Par défaut
    Je pense que le plus simple est de lui donner un code tout prêt à l'emploi, sûr qu'il a pas compris et dénier chercher dans les docs suite à mes remarques.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    from RPLCD.i2c import CharLCD
    import subprocess
     
     
    lcd = CharLCD(i2c_expander='PCF8574', address=0x26, port=1, cols=16, rows=2, dotsize=8)
    lcd.clear()
     
    host = "192.168.x.xx"
    username = "xxxxxxxx"
    password = "xxxxxxxxx"
    topic = "xxxxxxxx"
     
     
    try:
        result = subprocess.run(
            [
              "mosquitto_sub", "-h", host,
              "-u", username,
              "-P", password,
              "-t", topic,
              "-C", "1"
            ],
            capture_output=True,
            text=True,
            check=True,
            timeout=5
        )
     
        lcd.clear()
        lcd.write_string(result.stdout.strip())
     
    except subprocess.CalledProcessError as e:
        print(f"Erreur lors de l'exécution de la commande : {e}")
    except subprocess.TimeoutExpired as e:
        print(f"temps de traitement dépassé : {e}")

  17. #17
    Membre habitué
    Homme Profil pro
    Particulier
    Inscrit en
    Septembre 2022
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Particulier

    Informations forums :
    Inscription : Septembre 2022
    Messages : 10
    Par défaut
    Citation Envoyé par fred1599 Voir le message
    Je pense que le plus simple est de lui donner un code tout prêt à l'emploi, sûr qu'il a pas compris et dénier chercher dans les docs suite à mes remarques.
    Il est vrai que je n'ai pas compris toutes les informations précédentes mais j'ai quand même essayé de les ajouter dans un nouveau mon script. j’utilise des tutos pour la programmation. Avec le temps je comprendrai plus facilement. Merci pour le code que je vais tester et analyser pour comprendre son fonctionnement. Merci

  18. #18
    Membre Expert
    Profil pro
    Inscrit en
    Septembre 2010
    Messages
    1 545
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France

    Informations forums :
    Inscription : Septembre 2010
    Messages : 1 545
    Par défaut
    Il existe aussi des librairies pour souscrire aux sujets (topic) mqtt

    La fonction que tu utilises va s'inscrire au topic désigné, et les données seront ensuite affichées dans la console à chaque mise à jour du topic.

    Voir le début et la partie mqtt_sub.py de https://medium.com/@potekh.anastasia...t-990822274923

    Si c'est pour afficher une fois la température à chaque lancement du script, le code de fred1599 devrait fonctionner.
    Si c'est pour que la valeur soit mise à jour régulièrement, regarde mon lien ou mets le code de fred1599 dans une boucle.

  19. #19
    Membre habitué
    Homme Profil pro
    Particulier
    Inscrit en
    Septembre 2022
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Particulier

    Informations forums :
    Inscription : Septembre 2022
    Messages : 10
    Par défaut
    Bonjour, encore merci pour le scrip. Bonne base pour comprendre l'affichage sur un lcd. Maintenant je l'adapte a mes besoins.

    merci a tous pour vos aides

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Détection message sur écran LCD dans une photo
    Par pierregrenoblois dans le forum Arduino
    Réponses: 0
    Dernier message: 03/08/2019, 12h17
  2. Menu sur écran lcd en serie
    Par Emirhan dans le forum Arduino
    Réponses: 0
    Dernier message: 13/03/2019, 09h24
  3. Problème affichage sur écran lcd avec module RFID
    Par Rayjiin dans le forum Arduino
    Réponses: 24
    Dernier message: 28/04/2018, 18h42
  4. Sélection d'affichage sur écran LCD
    Par Creanics dans le forum Arduino
    Réponses: 0
    Dernier message: 20/03/2017, 21h27
  5. Problème d'affichage des forms sur écran 4K
    Par clem67 dans le forum Windows Forms
    Réponses: 3
    Dernier message: 04/02/2017, 15h10

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo