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

  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...

  8. #8
    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 flapili et beginner (c'est moi qui devrait avoir ce speudo )

    Je suis pas encore en champion en python

    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".
    En effet!! mais donc si je supprime ceci en
    J'ai toujours mon erreur
    ValueError: invalid literal for int() with base 10: 'a:39.9,b:43.9,c:0,d:0,e:0,f:0,g:2020-04-18 23:59:51'
    Le problème que je dois résoudre est que l'exemple sur lequel je me base présente ceci

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    CPU= 0.1
    send_pi_data(CPU)
    et ceci fonctionne bien avec la fonction
    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
    20
     
    def send_pi_data(data):
        # Encode float as int
        print('data',data)
        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)

    D'ailleurs, il le multiplie pas 100!!!??!!

    Dans mon exercice, je dois envoyer, pas une mais 10 valeurs, qui doivent être envoyées en même temps. Et pour que du côté serveur, je puisse récupérer les données, je dois les envoyer sous ce format

    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
    Avec arduino, j'avais réussi à convertir tous les caracteres en bytes et je dois faire la même chose en Python3, d'où ma problématique

    Si je peux faire (alors que CPU est un float)
    Code python : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    CPU= 0.1
    send_pi_data(CPU)

    Comment je peux modifier/adapter ma fonction pour convertir tout ca
    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
    et l'envoyer avec
    Code python : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    lora.send_data(data_pkt, len(data_pkt), lora.frame_counter)
        lora.frame_counter += 1

    Voyez vous?

    merciii

  9. #9
    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
    Au passage, voici le payload format qui me permet de récupérer les données du côté serveur

    Code JavaScript : 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
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    function Decoder(bytes, port) {
      var str=String.fromCharCode.apply(null,bytes);
      var astr = str.split(",");
     
      var regex = /([a-z]+)(\d+)/g;
     
      //var resultats = [];
    	var paire;
     
      var decoded = {}
      var te,pr,hu,lu,w1,w2,w3,da,ts,ga,ba,ar,an,it,wr;
      while (null !== (paire = regex.exec(astr[0]))) {
    		//console.log(paire[1]);
    		switch(paire[1]){
    		  case 'a':
    		    //console.log("te",paire[2]);
    		    te=paire[2];
    		    break;
    		  case 'b':
    		    //console.log("pr",paire[2]);
    		    pr=paire[2];
    		    break;
    		  case 'c':
    		    //console.log("hu",paire[2]);
    		    hu=paire[2];
    		    break;
    		  case 'd':
    		    //console.log("lu",paire[2]);
    		    lu=paire[2];
    		    break;
    		  case 'e':
    		    //console.log("w1",paire[2]);
    		    w1=paire[2];
    		    break;
    		  case 'f':
    		    //console.log("w2",paire[2]);
    		    w2=paire[2];
    		    break;
    		  case 'g':
    		    //console.log("w3",paire[2]);
    		    w3=paire[2];
    		    break;
    		  case 'h':
    		    //console.log("da",paire[2]);
    		    da=paire[2];
    		    break;
    		  case 'i':
    		    //console.log("ts",paire[2]);
    		    ts=paire[2];
    		    break;
    		  case 'j':
    		    //console.log("ga",paire[2]);
    		    ga=paire[2];
    		    break;
    		  case 'k':
    		    //console.log("ba",paire[2]);
    		    ba=paire[2];
    		    break;
    		  case 'l':
    		   // console.log("ar",paire[2]);
    		    ar=paire[2];
    		    break;
    		  case 'm':
    		   // console.log("an",paire[2]);
    		    an=paire[2];
    		    break;
    		  case 'n':
    		    //console.log("it",paire[2]);
    		    it=paire[2];
    		    break;
    		  case 'o':
    		    //console.log("wr",paire[2]);
    		    wr=paire[2];
    		    break;
     
    		}
    		//resultats.push(paire);
    	}
     
      return {
        te:te,
        pr:pr,
        hu:hu,
        lu:lu,
        w1:w1,
        w2:w2,
        w3:w3,
        da:da,
        ts:ts,
        ga:ga,
        ba:ba,
        ar:ar,
        an:an,
        it:it,
        wr:wr,
      }
     
    }
    Je reprendrai le même sauf que
    (j'ai très vite modifié, ci-dessous, j'espère pas avoir laisser trop d'erreur)

    Code JavaScript : 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
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    function Decoder(bytes, port) {
      var str=String.fromCharCode.apply(null,bytes);
      var astr = str.split(",");
     
      var regex = /([a-z]+)(\d+)/g;
     
      //var resultats = [];
    	var paire;
     
      var decoded = {}
      var pm25,pm10,aqi25,aqi10,la,lo,ti;
      while (null !== (paire = regex.exec(astr[0]))) {
    		switch(paire[1]){
    		  case 'a':
    		    pm25=paire[2];
    		    break;
    		  case 'b':
    		    pm10=paire[2];
    		    break;
    		  case 'c':
    		    aqi25=paire[2];
    		    break;
    		  case 'd':
    		    aqi10=paire[2];
    		    break;
    		  case 'e':
    		    la=paire[2];
    		    break;
    		  case 'f':
    		    lo=paire[2];
    		    break;
    		  case 'g':
    		    ti=paire[2];
    		    break;
     
    		}
    		//resultats.push(paire);
    	}
     
      return {
        pm25:pm25,
        pm10:pm10,
        aqi25:aqi25,
        aqi10:aqi10,
        la:la,
        lo:lo,
        ti:ti
      }
     
    }

  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
    Citation Envoyé par pierrot10 Voir le message
    En effet!! mais donc si je supprime ceci enJ'ai toujours mon erreur
    Oui c'est normal car cette chaine même si elle n'est pas multipliée reste une chaine qui ne peut pas être convertie en un nombre entier.

    Quel sens cela a d'essayer de convertir ceci 'a:39.9,b:43.9,c:0,d:0,e:0,f:0,g:2020-04-18 23:59:51' en un nombre entier ?

    Comme déjà dit si tu avais une chaine comme ceci "123" alors oui...

    Citation Envoyé par pierrot10 Voir le message
    Le problème que je dois résoudre est que l'exemple sur lequel je me base présente ceci
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    CPU= 0.1
    send_pi_data(CPU)
    et ceci fonctionne bien avec la fonction
    Oui c'est normal, tu as toujours ceci : data = int(data * 100) mais cette fois data n'est pas une string c'est un float (égale à 0.1)! Donc ceci data * 100 donne 10.0 et ensuite tu converties cela en nombre entier ce qui donne 10

  11. #11
    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 pierrot10 Voir le message
    D'ailleurs, il le multiplie pas 100!!!??!!
    Si si il le multiplie par 100 comme expliqué dans mon précédent message...

    Citation Envoyé par pierrot10 Voir le message
    Dans mon exercice, je dois envoyer, pas une mais 10 valeurs, qui doivent être envoyées en même temps. Et pour que du côté serveur, je puisse récupérer les données, je dois les envoyer sous ce format
    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
    Ta fonction n’envoie que deux octets à la fois, ces deux octets correspondent à un nombre entier qui peut être codé sur deux octets car il est inférieur à 65 536...

    Donc avec cette fonction il faudrait envoyer les nombres un par un... Ou bien la modifier...

  12. #12
    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
    Oui c'est normal, tu as toujours ceci : data = int(data * 100) mais cette fois data n'est pas une string c'est un float (égale à 0.1)! Donc ceci data * 100 donne 10.0 et ensuite tu convertie cela en nombre entier ce qui donne 10
    D'accord, je comprends

    (j'ai modifié mon message précédent)
    Quel sens cela a d'essayer de convertir ceci 'a:39.9,b:43.9,c:0,d:0,e:0,f:0,g:2020-04-18 23:59:51' en un nombre entier ?
    Ben je le dois (réponse un peu bisard)

    Dans mon exemple, un valeur (CPU) est calculé et retoruné en float.

    Toutes mes valeurs sont des float aussi, sauf peut-être
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    time.strftime("%Y-%m-%d %H:%M:%S")
    Le problème est que cette fonction

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    lora.send_data(data_pkt, len(data_pkt), lora.frame_counter)
    lora.frame_counter += 1
    (qui se trouve dans def send_pi_data(data))
    envoie les données au serveur, et je dois tout envoyer en même temps.

    J'ai déjà fait cet exerccie avec Arduino et j'avais converti ma chaine de caractere en bytes. Une chaine identique à celle ci, mais plus longue et bien sûre avec d'autre valeur

    a:39.9,b:43.9,c:0,d:0,e:0,f:0,g:2020-04-18 23:59:51
    Je dois donc trouver une solution pour modifier send_pi_data(), pour que lora.send_data(data_pkt, len(data_pkt), lora.frame_counter) puisse envoyer mes valeurs (de a à g).

    Peut être que je procède mal et que je devrai le faire différemment, tout en modifiant mon playload format

    Code JavaScript : 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
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    function Decoder(bytes, port) {
      var str=String.fromCharCode.apply(null,bytes);
      var astr = str.split(",");
     
      var regex = /([a-z]+)(\d+)/g;
     
      //var resultats = [];
    	var paire;
     
      var decoded = {}
      var pm25,pm10,aqi25,aqi10,la,lo,ti;
      while (null !== (paire = regex.exec(astr[0]))) {
    		switch(paire[1]){
    		  case 'a':
    		    pm25=paire[2];
    		    break;
    		  case 'b':
    		    pm10=paire[2];
    		    break;
    		  case 'c':
    		    aqi25=paire[2];
    		    break;
    		  case 'd':
    		    aqi10=paire[2];
    		    break;
    		  case 'e':
    		    la=paire[2];
    		    break;
    		  case 'f':
    		    lo=paire[2];
    		    break;
    		  case 'g':
    		    ti=paire[2];
    		    break;
     
    		}
    		//resultats.push(paire);
    	}
     
      return {
        pm25:pm25,
        pm10:pm10,
        aqi25:aqi25,
        aqi10:aqi10,
        la:la,
        lo:lo,
        ti:ti
      }
     
    }

    Dans tous les cas, je dois trouver un moyen pour que

    Code python : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    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")
    puissent être envoyés avec

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    lora.send_data(data_pkt, len(data_pkt), lora.frame_counter)
    Est-ce que je suis plus compréhensible?

  13. #13
    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
    Je peux aussi envoyer la date/heure sous ce format
    20200419122299
    et la découper après, ou alors en Timestamp
    Timestamp me semble est un bien meilleur choix, d'ailleur.

  14. #14
    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 pierrot10 Voir le message
    Au passage, voici le payload format qui me permet de récupérer les données du côté serveur

    Code JavaScript : 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
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    function Decoder(bytes, port) {
      var str=String.fromCharCode.apply(null,bytes);
      var astr = str.split(",");
     
      var regex = /([a-z]+)(\d+)/g;
     
      //var resultats = [];
        var paire;
     
      var decoded = {}
      var te,pr,hu,lu,w1,w2,w3,da,ts,ga,ba,ar,an,it,wr;
      while (null !== (paire = regex.exec(astr[0]))) {
            //console.log(paire[1]);
            switch(paire[1]){
              case 'a':
                //console.log("te",paire[2]);
                te=paire[2];
                break;
              case 'b':
                //console.log("pr",paire[2]);
                pr=paire[2];
                break;
              case 'c':
                //console.log("hu",paire[2]);
                hu=paire[2];
                break;
              case 'd':
                //console.log("lu",paire[2]);
                lu=paire[2];
                break;
              case 'e':
                //console.log("w1",paire[2]);
                w1=paire[2];
                break;
              case 'f':
                //console.log("w2",paire[2]);
                w2=paire[2];
                break;
              case 'g':
                //console.log("w3",paire[2]);
                w3=paire[2];
                break;
              case 'h':
                //console.log("da",paire[2]);
                da=paire[2];
                break;
              case 'i':
                //console.log("ts",paire[2]);
                ts=paire[2];
                break;
              case 'j':
                //console.log("ga",paire[2]);
                ga=paire[2];
                break;
              case 'k':
                //console.log("ba",paire[2]);
                ba=paire[2];
                break;
              case 'l':
               // console.log("ar",paire[2]);
                ar=paire[2];
                break;
              case 'm':
               // console.log("an",paire[2]);
                an=paire[2];
                break;
              case 'n':
                //console.log("it",paire[2]);
                it=paire[2];
                break;
              case 'o':
                //console.log("wr",paire[2]);
                wr=paire[2];
                break;
     
            }
            //resultats.push(paire);
        }
     
      return {
        te:te,
        pr:pr,
        hu:hu,
        lu:lu,
        w1:w1,
        w2:w2,
        w3:w3,
        da:da,
        ts:ts,
        ga:ga,
        ba:ba,
        ar:ar,
        an:an,
        it:it,
        wr:wr,
      }
     
    }
    Ah ben c'est du JS... Ben là c'est simple si tu peux utiliser un code JS de ce genre alors ta fonction python doit être modifiée pour envoyer la chaine telle qu'elle au lieu d'envoyer seulement un float (en réalité un int codé sur deux octets en effet le float est multiplié par 100 puis converti en int)

  15. #15
    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 pierrot10 Voir le message
    Dans mon exercice, je dois envoyer, pas une mais 10 valeurs, qui doivent être envoyées en même temps. Et pour que du côté serveur, je puisse récupérer les données, je dois les envoyer sous ce format

    Avec arduino, j'avais réussi à convertir tous les caracteres en bytes et je dois faire la même chose en Python3, d'où ma problématique
    Tu utilises un Arduino ?

    Pour être sûr de bien comprendre : où est exécuté le code python et où est exécuté le code JS ?

  16. #16
    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
    Salut beginner
    Ben mon soucis actuel n'est pas trop comment récupérer les données mais de les envoyer en une fois

  17. #17
    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 pierrot10 Voir le message
    Salut beginner
    Ben mon soucis actuel n'est pas trop comment récupérer les données mais de les envoyer en une fois
    Ben je t'ai répondu :
    Ah ben c'est du JS... Ben là c'est simple si tu peux utiliser un code JS de ce genre alors ta fonction python doit être modifiée pour envoyer la chaine telle qu'elle au lieu d'envoyer seulement un float (en réalité un int codé sur deux octets en effet le float est multiplié par 100 puis converti en int)
    Par contre si tu ne peux envoyer que des bytes alors il faudra convertir la chaine toute entière et envoyer le tableau de bytes obtenu...

    Peux-tu me donner les précisions demandées au message précédent (on a posté en même temps)...

  18. #18
    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
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Tu utilises un Arduino ?
    Dans le cadre de mon premier projet, oui, je récupère les données de la teneur en eau dans le sol et ce projet fonctionne avec Arduino, oui. Les mesures sont faites et envoyées avec Arduino.

    Mais là, dans ce nouveau projet, je mesure la qualité de l'air avec un Raspberry et Python3

    le code Python est sur mon Raspberry où j'ai mon capteur Nova SDS011.
    Le raspberry doit envoyer ces données sur le serveur TTN (The Things Network) (comme pour mon projet avec Arduino) et sur ce serveur je récupérai les données avec ce payload format (ou autrement, si nécessaire)

    Code javascript : 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
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
     
    function Decoder(bytes, port) {
      var str=String.fromCharCode.apply(null,bytes);
      var astr = str.split(",");
     
      var regex = /([a-z]+)(\d+)/g;
     
      //var resultats = [];
        var paire;
     
      var decoded = {}
      var te,pr,hu,lu,w1,w2,w3,da,ts,ga,ba,ar,an,it,wr;
      while (null !== (paire = regex.exec(astr[0]))) {
            //console.log(paire[1]);
            switch(paire[1]){
              case 'a':
                //console.log("te",paire[2]);
                te=paire[2];
                break;
              case 'b':
                //console.log("pr",paire[2]);
                pr=paire[2];
                break;
              case 'c':
                //console.log("hu",paire[2]);
                hu=paire[2];
                break;
              case 'd':
                //console.log("lu",paire[2]);
                lu=paire[2];
                break;
              case 'e':
                //console.log("w1",paire[2]);
                w1=paire[2];
                break;
              case 'f':
                //console.log("w2",paire[2]);
                w2=paire[2];
                break;
              case 'g':
                //console.log("w3",paire[2]);
                w3=paire[2];
                break;
              case 'h':
                //console.log("da",paire[2]);
                da=paire[2];
                break;
              case 'i':
                //console.log("ts",paire[2]);
                ts=paire[2];
                break;
              case 'j':
                //console.log("ga",paire[2]);
                ga=paire[2];
                break;
              case 'k':
                //console.log("ba",paire[2]);
                ba=paire[2];
                break;
              case 'l':
               // console.log("ar",paire[2]);
                ar=paire[2];
                break;
              case 'm':
               // console.log("an",paire[2]);
                an=paire[2];
                break;
              case 'n':
                //console.log("it",paire[2]);
                it=paire[2];
                break;
              case 'o':
                //console.log("wr",paire[2]);
                wr=paire[2];
                break;
     
            }
            //resultats.push(paire);
        }
     
      return {
        te:te,
        pr:pr,
        hu:hu,
        lu:lu,
        w1:w1,
        w2:w2,
        w3:w3,
        da:da,
        ts:ts,
        ga:ga,
        ba:ba,
        ar:ar,
        an:an,
        it:it,
        wr:wr,
      }
     
    }
    Ce payload format, je l'ai vite modifié, il y a peut-être des petites erreurs ou je ferai mieux. C'est juste pour comprendre comment les données sont récupérées, côté serveur. Mais je dois avant trouver moyen de les envoyer

  19. #19
    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
    alors ta fonction python doit être modifiée pour envoyer la chaine telle qu'elle au lieu d'envoyer seulement un float
    Alors j'espère te suivre, mais c'est ca mon problème, comment faire ceci avec Python selon l'exemple auquel je me base? (a tord ou a raison )


    J'espère bien répondre a tes questions

  20. #20
    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 pierrot10 Voir le message
    Mais là, dans ce nouveau projet, je mesure la qualité de l'air avec un Raspberry et Python3

    le code Python est sur mon Raspberry où j'ai mon capteur Nova SDS011.
    Ah ouais je m'en doutais un peu...

    Citation Envoyé par pierrot10 Voir le message
    Le rasoberry envoye ces données sur le serveur TTN (The Things Network) et sur ce serveur je récupère les données avec ce payload format
    Je ne connais pas ce type de serveur mais il doit utiliser node pour éxécuter le code JS, c'est bien ça ?

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 2 12 DernièreDernière

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