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 :

Comment envoyer des float en int et de multiples valeurs


Sujet :

Python

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre expérimenté
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    3 166
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Mai 2005
    Messages : 3 166
    Par défaut Comment envoyer des float en int et de multiples valeurs
    Bonjour à tous,

    Je maîtrise encore pas trop python et j'ai repris un code que je dois adapter selon mon besoin.

    Je mesure les poussières fines, l'heure, la latitude et longitude et éventuellement deux autres valeurs.

    L'exemple qui m'a été donné est celui-ci

    Code python3 : 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
     
    # 2b array to store sensor data
    data_pkt = bytearray(2)
    # time to delay periodic packet sends (in seconds)
    data_pkt_delay = 5.0
    send_pi_data(CPU)
    def send_pi_data(data):
        # Encode float as int
        data = int(data * 100)
        # Encode payload as bytes
        data_pkt[0] = (data >> 8) & 0xff
        data_pkt[1] = data & 0xff
        # Send data packet
        lora.send_data(data_pkt, len(data_pkt), lora.frame_counter)
        lora.frame_counter += 1
     
        display.fill(0)
        display.text('Sent Data to TTN!',0 , 50, 1)
     
        print('Data sent to TTN!')
        display.show()
        time.sleep(0.5)

    D'après ce que je comprends CPU est un float et en première ligne, il est converti en int, puis sous #encode, je me perds.

    je dois envoyer ces valeurs

    pmt_2_5 = 80.4
    pmt_10 = 7.6
    lat = 46.34567
    long = 6.35478
    date_time = time.strftime("%Y-%m-%d %H:%M:%S")

    Les 4 premières sont des floats.

    Le truc, c'est que le serveur qui va recevoir ce code, va devoir décoder ceci et il faut que les valeurs soient envoyées sous cette forme
    a:80.4,b:7.6,c:46.34567,d:6.35478,e:2020-04-18 19:38:55
    ce qui ressemble plus tôt à une chaîne de caractère

    Je suis donc emprunté quant à passer tout cela dans send_pi_data(data) et ceci me questionne # 2b array to store sensor data
    data_pkt = bytearray(2) quant à la longueur acceptable.

    Est-ce que ceci va aussi me convertir une chaîne (de 100 caractères max) de caractère en int?


  2. #2
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 741
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 741
    Par défaut
    Salut,

    Pour autant que vous sachiez construire:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    >>> s = 'a:80.4,b:7.6,c:46.34567,d:6.35478,e:2020-04-18 19:38:55'
    la transformer en "bytes", c'est juste l'encoder en ASCII:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    >>> s.encode('ascii')
    b'a:80.4,b:7.6,c:46.34567,d:6.35478,e:2020-04-18 19:38:55'
    et ce n'est pas parce que Python fait de son mieux pour que çà reste lisible pour les humains que ce sont autre chose que des bytes.

    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  3. #3
    Membre expérimenté
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    3 166
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Mai 2005
    Messages : 3 166
    Par défaut
    Bonjour Wiztrick

    D'acord, alors j'ai fait comme ceci

    Code python : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    payload = 'a:' + str(pmt_2_5) + ',b:' + str(pmt_10) + ',c:' + str(aqi_2_5) + ',d:' + str(aqi_10) + ',e:' + str(lat) + ',f:' + str(lon) + ',g:' + str(time.strftime("%Y-%m-%d %H:%M:%S")) 
    payload.encode('ascii')

    Il n'a pas l'ai de l'accepter, car au moment de passer dans data = int(data * 100)

    Code python : 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
     
    def send_pi_data(data):
        # Encode float as int
        print('data',data)
        data = int(data * 100)
        print('data len',data)
        # Encode payload as bytes
        data_pkt[0] = (data >> 8) & 0xff
        data_pkt[1] = data & 0xff
        # Send data packet
        lora.send_data(data_pkt, len(data_pkt), lora.frame_counter)
        lora.frame_counter += 1
     
        display.fill(0)
        display.text('Sent Data to TTN!',0 , 50, 1)
     
        print('Data sent to TTN!')
        display.show()
        time.sleep(0.5)

    Il m'affiche ce message
    data = int(data * 100)
    ValueError: invalid literal for int() with base 10: 'a:173.1,b:189.4,c:0,d:0,e:0,f:0,g:2020-04-18 22:11:54a:173.1,b:189.4,c:0,d:0,e:0,f:0,g:2020-04-18 22:11:54a:173.1,b:189.4,c:0,d:0,e:0,f:0,g:2020-04-18 22:11:54a:173.1,b:189.4,c:0,d:0,e:0,f:0,g:2020-0
    Ce qui me surprend c'est le nombre de caractères alors qu'il devrait s'arreter à g:

  4. #4
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 741
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 741
    Par défaut
    Citation Envoyé par pierrot10 Voir le message
    Il n'a pas l'ai de l'accepter, car au moment de passer dans data = int(data * 100)
    La suite de bytes b'a:80.4,b:7.6,c:46.34567,d:6.35478,e:2020-04-18 19:38:55'n'a rien d'un nombre flottant. Donc si vous expédiez çà à une fonction qui attend un nombre flottant en paramètre, çà ne va pas marcher (et ce n'est pas la peine d'essayer).

    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  5. #5
    Membre expérimenté
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    3 166
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Mai 2005
    Messages : 3 166
    Par défaut
    Hello
    Ha ben non, c'est un string, d'ou ma question, pour le convertir pour qu'il passe dans la fonction

    payload = 'a:' + str(pmt_2_5) + ',b:' + str(pmt_10) + ',c:' + str(aqi_2_5) + ',d:' + str(aqi_10) + ',e:' + str(lat) + ',f:' + str(lon) + ',g:' + str(time.strftime("%Y-%m-%d %H:%M:%S"))
    On ne peut pas covertir ceci en float

    Si dessous, data est un string, non? puisque payload est un string.
    Ou alors devrais-je faire comme-ceci
    Code python : 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
    def send_pi_data(data):
        # Encode float as int
        print('data',data) # ICI il ne devra
        data = int(data * 100)
       data.encode(ascii)
        print('data len',data)
        # Encode payload as bytes
        data_pkt[0] = (data >> 8) & 0xff
        data_pkt[1] = data & 0xff
        # Send data packet
        lora.send_data(data_pkt, len(data_pkt), lora.frame_counter)
        lora.frame_counter += 1
     
        display.fill(0)
        display.text('Sent Data to TTN!',0 , 50, 1)
     
        print('Data sent to TTN!')
        display.show()
        time.sleep(0.5)

  6. #6
    Membre chevronné
    Homme Profil pro
    BTS SN IR
    Inscrit en
    Mai 2017
    Messages
    514
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 26
    Localisation : France, Saône et Loire (Bourgogne)

    Informations professionnelles :
    Activité : BTS SN IR

    Informations forums :
    Inscription : Mai 2017
    Messages : 514
    Par défaut
    Citation Envoyé par pierrot10 Voir le message
    payload = 'a:' + str(pmt_2_5) + ',b:' + str(pmt_10) + ',c:' + str(aqi_2_5) + ',d:' + str(aqi_10) + ',e:' + str(lat) + ',f:' + str(lon) + ',g:' + str(time.strftime("%Y-%m-%d %H:%M:%S"))
    ce n'est pas très lisible, et encore moins maintenable, vous pouvez très bien faire ça en plusieurs fois, ou utiliser un dictionnaire puis avec un peu d’itération avec la méthode dict.items() et un str.join()

  7. #7
    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,
    Citation Envoyé par pierrot10 Voir le message
    Ha ben non, c'est un string, d'ou ma question, pour le convertir pour qu'il passe dans la fonction
    Oui c'est une string mais tu as une erreur car la string que tu passes en paramètre à la fonction int ne peut pas être convertie en un nombre entier d'où l'erreur : ValueError: invalid literal for int() with base 10

    Si dessous, data est un string, non? puisque payload est un string.
    Oui mais regarde bien, tu as ceci : data = int(data * 100)...

    Voyons les étapes : tu passes en paramètre à la fonction int ceci : data * 100 or comme data est une string ce que tu obtiens c'est 100 fois cette string !

    Exemple : si tu as data = "abc" alors data * 3 sera égale à "abcabcabc".

    - Ensuite tu essayes de convertir cette chaine en un nombre entier ce qui provoque l'erreur... Normal cette chaine ne correspond pas à un nombre entier...

    Par exemple si tu avais data = "123" là il n'y aurait pas de problème tu pourras faire int(data)...


    Ce qui me surprend c'est le nombre de caractères alors qu'il devrait s'arreter à g:
    Oui c'est parce que il te donne le début de la chaine et cette chaine ce n'est pas payload mais 100 fois payload comme expliqué ci-dessus...

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

Discussions similaires

  1. Réponses: 3
    Dernier message: 07/12/2009, 11h31
  2. Réponses: 16
    Dernier message: 20/03/2006, 23h21
  3. Comment envoyer des donées de Vb a Excel
    Par chandl3r dans le forum Macros et VBA Excel
    Réponses: 7
    Dernier message: 04/12/2005, 23h12
  4. Réponses: 3
    Dernier message: 28/10/2005, 10h01

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