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. #21
    Membre expérimenté
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    3 167
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Mai 2005
    Messages : 3 167
    Par défaut
    Je ne connais pas ce type de serveur mais il doit utiliser node pour éxécuter le code JS, c'est bien ça ?
    heu, je ne sais pas.

    Masi je dois pouvoir envoyer ceci avec python

    Code python : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    pmt_2_5 = 80.4
    pmt_10 = 7.6
    aqi25 = 0
    aqi10 = 0
    lat = 46.34567
    long = 6.35478
    date_time = time.strftime("%Y-%m-%d %H:%M:%S")
    en une fois, et les récupérer sur le serveur.

    Avec Arduino, j'avais eu idée d'ajouter des lettres pour distiguer les valeurs, côté serveur, comme ceci, et ca marche bien

    a:80.4,b:7.6,c:0,d:0,e:46.34567,f:6.35478,g:2020-04-18 23:59:51
    Mais voilà, je peux faire aussi autrement avec Python, dans ce nouveau projet, tant que les valeurs des variables ci-dessus, peuvent être envoyée avec Python et grâce a la fonction

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

  2. #22
    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
    heu, je ne sais pas.
    Ok pas grave...
    Citation Envoyé par pierrot10 Voir le message
    Mais voilà, je peux faire aussi autrement avec Python, dans ce nouveau projet, tant que les valeurs des variables ci-dessus, peuvent être envoyée avec Python et grâce a la fonction

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    lora.send_data(data_pkt, len(data_pkt), lora.frame_counter)
    Est-ce que tu vois?
    Ok il faudrait savoir les conditions concernant le paramètre data_pkt (taille max, type...) Je vais voir si je trouve les infos...

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

    Informations forums :
    Inscription : Mai 2005
    Messages : 3 167
    Par défaut
    C'est sympa merci

    Ok pas grave, mais est-ce que le code JS que tu as posté fonctionne bien ? Est-ce que l'argument byte est un tableau de bytes ou juste un entier ?
    Ceci du côté serveur fonctionne très bien pour mon projet Arduino

    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,
      }
     
    }

    Ceci je ne l'ai pas testé. J'ai repris le code au-dessus et je l'ai rapidement modifier pour qu'il correspondre (au plus proche), pour mon projet raspberry.

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

    Masi on est toujours côté serveur.

    Côté Raspberry, cette information peut-être utilse.

    Je disais précédemment, quand dans l'exemple que je suis et que j'essaye d'adapter selon mes besoin

    Ceci, envoie la valeur de 0.1
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    CPU= 0.1
    send_pi_data(CPU)
    au serveur.

    Sur la console, je vois ceci arriver
    000A
    Petits testes avec CPU
    Nom : Screenshot 2020-04-19 at 02.04.58.png
Affichages : 97
Taille : 132,2 Ko

    Après avec le payload format, je décode ceci pour que je puisse le lire et le sauver dans ma DB.

    Sauf que bien entendu, mon objectif et de recevori ces valeurs , au final

    pmt_2_5 = 80.4
    pmt_10 = 7.6
    aqi25 = 0
    aqi10 = 0
    lat = 46.34567
    long = 6.35478
    date_time = 202004190212

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

    Informations forums :
    Inscription : Mai 2005
    Messages : 3 167
    Par défaut
    D'ailleur en allant me coucher , je me rappelle que dans mon code arduino, j'avais converti le float en int, avant de les envoyer, du genre

    80.40 => 8040
    7.60 => 760
    46.34567 => 4634567
    et du cote serveur, j'avais redivisé. (ca me revient )
    Mais je regarderai mon code Arduino demain, plus précisément. La je suis sur les rotules

    EDIT: Et en plus c'est faut, tout mes excuses, la trame que j'envoyais n'étais pas

    a:80.4,b:7.6,c:0,d:0,e:46.34567,f:6.35478,g:2020-04-18 23:59:51
    MAIS
    a8040b760c0d0e4634567f635478g20200418235951
    (Les lettres pour distinguer le sujet (la variable) et les chiffres pour les valeurs, sans , et : )
    et côté serveur je dois recevoir ceci
    61383034306237363063306430653436333435363766363335343738673230323030343138323335393531
    et ce payload
    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
     
    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
      }
     
    }

    m'affiche justement ceci (je viens de tester)

    {
    "aqi10": "0",
    "aqi25": "0",
    "la": "4634567",
    "lo": "635478",
    "pm10": "760",
    "pm25": "8040",
    "ti": "20200418235951"
    }
    Donc c'est bien ca.

    Donc pour revenir à ma problématique, je dois trouver comment avec python, sur mon Raspberry, je peux transformer les valeurs de

    pmt_2_5 = 80.4
    pmt_10 = 7.6
    aqi25 = 0
    aqi10 = 0
    lat = 46.34567
    long = 6.35478
    date_time = 202004190212
    sous ce format

    a8040b760c0d0e4634567f635478g20200418235951
    et là ou est le problème, principalement, le convertir dans le bon fomat, pour que ca passe dans la fonction

    Code python3 : Sélectionner tout - Visualiser dans une fenêtre à part
    lora.send_data(data_pkt, len(data_pkt), lora.frame_counter)

    pour recevoir, côté serveur
    61383034306237363063306430653436333435363766363335343738673230323030343138323335393531
    Je suis désolé d'avoir donner des informations inexacte.

    Je reprendrai demain, je suis HS.

    Merciiii pour ton (vos) suivi(s) et aides

  5. #25
    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'ailleur en allant me coucher , je me rappelle que dans mon code arduino, j'avais converti le float en int, avant de les envoyer, du genre
    80.40 => 8040
    7.60 => 760
    46.34567 => 4634567


    et du cote serveur, j'avais redivisé.
    Oui t’inquiète j'avais deviné, c'est pour éviter les points... Avec les points cela ne colle pas avec la regex coté JS var regex = /([a-z]+)(\d+)/g;...

    Citation Envoyé par pierrot10 Voir le message
    Et en plus c'est faut, tout mes excuses, la trame que j'envoyais n'étais pas

    a:80.4,b:7.6,c:0,d:0,e:46.34567,f:6.35478,g:2020-04-18 23:59:51


    MAIS
    a8040b760c0d0e4634567f635478g20200418235951

    Les lettres pour distinguer le sujet (la variable) et les chiffres pour les valeurs, sans ,:
    Par contre là c'est bizarre : oui il faut enlever les ":" mais par contre il faut laisser les "," car dans le code JS on subdivise la chaine comme ceci : var astr = str.split(",");...

    Je suis désolé d'avoir donner des informations inexacte
    Peux-tu vérifier si cette ligne : while (null !== (paire = regex.exec(astr[0]))) est correcte ? Est-ce bien astr[0] ?

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

    Informations forums :
    Inscription : Mai 2005
    Messages : 3 167
    Par défaut
    Alors il y bien un petit truc de bizrad en effet, ca donbera l'occasion d'améliorer

    Il ne faut pas mettre les ,

    ceci en effet, va chercher la premiere virgule et vu qu'il y en a pas, tout se met dans astr[0].

    C'est le regex qui va faire le tri entre les lettres et les chiffres. Je viens de refaire le teste. Ca marche bien.

    Nom : Screenshot 2020-04-19 at 03.51.19.png
Affichages : 87
Taille : 1,32 Mo

    Côté JS, ca marche tiptop, pour autant que Python envoit sous ce format

    a8040b760c0d0e4634567f635478g20200418235951

    Il faudra que je nettoye un peu.

    Après, côté serveur (mon serveur web), mon code PHP va recevoir ceci
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    {
      "aqi10": "0",
      "aqi25": "0",
      "la": "4634567",
      "lo": "635478",
      "pm10": "760",
      "pm25": "8040",
      "ti": "20200418235951"
    }
    de TTN et PHP va mettre tout ca dans ma DB.

    Mon serveur web va traiter les info et les afficher ici https://demo.smart-idea.io/ (Demo) . Ca c'est pour le projet Arduino, mais pour Raspberry/Python, ca sera la même chose, ...quand je pourrai envoyer tout ceci de mon Raspberry

  7. #27
    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
    Alors il y bien un petit truc de bizrad en effet, ca donbera l'occasion d'améliorer

    Il ne faut pas mettre les ,

    ceci en effet, va chercher la premiere virgule et vu qu'il y en a pas, tout se met dans astr[0].
    Ah ouais je me disais bien que c'était étrange... Dans ce cas pas besoin de subdiviser et pas besoin de la variable astr, on a déjà la variable str...

  8. #28
    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 Beginner. Voir le message
    lora.send_data(data_pkt, len(data_pkt), lora.frame_counter)
    Ok il faudrait savoir les conditions concernant le paramètre data_pkt (taille max, type...) Je vais voir si je trouve les infos...
    J'ai trouvé le source de la fonction utilisée dans Arduino (c'est le source C++ mais je pense que les infos concernant les paramètres s'appliquent aussi à la version python), on a juste besoin de l'entête pour obtenir les infos :

    Code c++ : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    void TinyLoRa::sendData(unsigned char *Data, unsigned char Data_Length, unsigned int Frame_Counter_Tx, uint8_t Frame_Port)
    {...}

    - Data_Length est de type unsigned char donc à priori la taille max du tableau est 255...
    - Les éléments du tableau Data sont de type unsigned char --> on peut envoyer des entiers de 1 octet(allant de 0 à 255).

    Le code python que tu as posté est fait pour envoyer des entiers de 2 octets (allant de 0 à 65536) mais comme on ne peut envoyer que des entiers de 1 octet alors il utilise un tableau (de bytes) de taille 2 (1 octet poids fort et 1 octet poids faible) et coté serveur ça nous oblige à reconstituer le nombre entier à partir des deux octets (var monNombre = (bytes[0] << 8) | bytes[1]; car coté python il fait ça : data_pkt[0] = (data >> 8) & 0xff et data_pkt[1] = data & 0xff)...

    Mais dans ton cas il y a plus simple, il vaut mieux utiliser une autre fonction...

    Exemple à tester :

    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
     
    def send_pi_data(data):
        data_pkt = bytearray(data, 'utf-8')    
        lora.send_data(data_pkt, len(data_pkt), lora.frame_counter)
        lora.frame_counter += 1
     
    pmt_25 = 80.4
    pmt_10 = 7.6
    aqi_25 = 0
    aqi_10 = 0
    lat = 46.34567
    lon = 6.35478
    date_time = 20200418235951
     
    payload = 'a' + str(int(pmt_25*100)) + 'b' + str(int(pmt_10*100)) + 'c' + str(int(aqi_25*100)) + 'd' + str(aqi_10*100) + 'e' + str(int(lat*100000)) + 'f' + str(int(lon*100000)) + 'g' + str(date_time)
     
    send_pi_data(payload)

    Et le code JS peut être un peu nettoyé :

    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
    function Decoder(bytes) {
        var str = String.fromCharCode.apply(null, bytes);
        var regex = /([a-z]+)(\d+)/g;
        var paire;
     
        var pm25, pm10, aqi25, aqi10, la, lo, ti;
     
        while (null !== (paire = regex.exec(str))) {
            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;
     
            }
        }
        return {
            pm25: pm25,
            pm10: pm10,
            aqi25: aqi25,
            aqi10: aqi10,
            la: la,
            lo: lo,
            ti: ti
        }
    }

    On pourrait optimiser les deux codes mais bon je ne veux pas t'embrouiller du coup j'ai juste modifié quelques points...
    Voyons tout d'abord si cela fonctionne chez toi...

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

    Informations forums :
    Inscription : Mai 2005
    Messages : 3 167
    Par défaut
    Salut Beginner,

    Merciiiiiiii!!! CA MARCHE!!!!!!!!!!

    Nom : Screenshot 2020-04-19 at 14.20.50.png
Affichages : 79
Taille : 226,0 Ko

    Nom : Screenshot 2020-04-19 at 14.21.23.png
Affichages : 73
Taille : 62,6 Ko

    [INFO] Measuring in 10sec
    [INFO] Waking up SDS011
    [INFO] Measuring 5 times
    0. pm2.5: 11.8 µg/m3 pm10:12.9 µg/m3
    1. pm2.5: 23.3 µg/m3 pm10:25.5 µg/m3
    2. pm2.5: 34.6 µg/m3 pm10:38.0 µg/m3
    3. pm2.5: 45.900000000000006 µg/m3 pm10:50.5 µg/m3
    4. pm2.5: 57.2 µg/m3 pm10:62.9 µg/m3
    [INFO] SDS011 go to sleep
    ---------------------------------------
    2020-04-19 (14:41:46) PM2.5: 11.4 µg/m3 PM10: 12.6 µg/m3

    [DEBUG] payload:a1140b1260c0d0e0f0g1587300106.573015h0
    [INFO] Sending data
    [INFO] Data sent to TTN

    [INFo] Sleep for 20sec
    Il me reste plus qu'à modifier mon script PHP pour sauvez tout cela dans ma DB!!!

    Je suis juste étonné de lire ceci

    J'ai trouvé le source de la fonction utilisée dans Arduino (c'est le source C++ mais je pense que les infos concernant les paramètres s'appliquent aussi à la version python), on a juste besoin de l'entête pour obtenir les infos :

    Code c++ :
    void TinyLoRa::sendData(unsigned char *Data, unsigned char Data_Length, unsigned int Frame_Counter_Tx, uint8_t Frame_Port)
    {...}
    Comment est-ce possible si j'install tinylora ainsi
    Code python : Sélectionner tout - Visualiser dans une fenêtre à part
    sudo pip3 install adafruit-circuitpython-tinylora


    Voci le code que j'ai utilisé


    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
    23
    24
     
    def send_data(data):
        print('[INFO] Sending data')
        data_pkt = bytearray(data, 'utf-8')
        lora.send_data(data_pkt, len(data_pkt),lora.frame_counter)
        lora.frame_counter += 1
        time.sleep(0.5)
     
    # get date and time
    tnow = datetime.now()
    timestamp_now = datetime.timestamp(tnow)
     
    # Build payload
    payload = 'a' + str(int(pmt_2_5 * 100)) + 'b' + str(int(pmt_10 * 100)) + 'c' + str(int(aqi_2_5 * 100)) + 'd' + str(int(aqi_10 * 100)) + 'e' + str(int(lat * 10000)) + 'f' + str(int(lon * 10000))$
    print('[DEBUG] payload:' + payload)
     
    # Sent to TTN
    try:
        send_data(payload)
        print('[INFO] Data sent to TTN')
        display.text('Data sent to TTN!',0 , 50, 1)
    except NameError:
        print ("[ERROR] Failure in sending data to TTN")
        display.text('[ERROR] Failure in sending data to TTN')


    et 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
    function Decoder(bytes) {
        var str = String.fromCharCode.apply(null, bytes);
        var regex = /([a-z]+)(\d+)/g;
        var paire;
     
        var pm25, pm10, aqi25, aqi10, la, lo, ti, ba;
     
        while (null !== (paire = regex.exec(str))) {
            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;
                case 'h':
                    ba = paire[2]
                    break;
            }
        }
        return {
            pm25: pm25,
            pm10: pm10,
            aqi25: aqi25,
            aqi10: aqi10,
            la: la,
            lo: lo,
            ti: ti,
            ba:ba
        }
    }

    J'enverrai le résultat final une fois fait

    J'ose encore te demander 3 trucs?
    Si je regarde ceci
    malheureusement j'arrive pas à le reproduire, ca m'affcihe cette erreur

    SDS011 sensor info:
    <sds011.SDS011 object at 0xb634cb50>
    Traceback (most recent call last):
    File "aqi.py", line 10, in <module>
    import aqi
    File "/opt/Raspi-sds011/aqi.py", line 64, in <module>
    print(sensor.device_id)
    AttributeError: 'SDS011' object has no attribute 'device_id'
    si je comment ceci
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    #print(sensor.device_id)
    il m'affiche ceci
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    <sds011.SDS011 object at 0xb630f710>
    J'ai donc essyer
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    sensor.SDS011.device_id
    sans succès,
    Pourtant, le reste fonctionne bien.

    Il y a encore un autre truc que je dois résoudre, je vais me remettre dessus maintenant, mais ce n'est pas encore clire pour moi

    En tout cas, merci, ca m'enlève une belle épine du pied

  10. #30
    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
    Merciiiiiiii!!! CA MARCHE!!!!!!!!!!
    Ben tant mieux...

    Citation Envoyé par pierrot10 Voir le message
    Je suis juste étonné de lire ceci

    Comment est-ce possible si j'install tinylora ainsi
    Code python : Sélectionner tout - Visualiser dans une fenêtre à part
    sudo pip3 install adafruit-circuitpython-tinylora
    Je n'ai pas compris ta question... Le code C++ c'était juste pour récupérer les infos, je ne dis pas que c'est cette fonction qui est utilisée dans le code Python mais j'ai supposé que les infos correspondaient...

    Bon j'ai quand même regardé le source Python, le problème c'est que python n'est pas un langage typé, donc il faut analyser le code pour obtenir les infos et ce n'est pas toujours possible...

    J'ai trouvé ça :
    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
    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
    def send_data(self, data, data_length, frame_counter, timeout=2):
            """Function to assemble and send data
               :param data: data to send
               :param data_length: length of data to send
               :param frame_counter: frame counter variable, declared in code.py.
               :param timeout: TxDone wait time, default is 2.
            """
            # data packet
            enc_data = bytearray(data_length)
            lora_pkt = bytearray(64)
            # copy bytearray into bytearray for encryption
            enc_data[0:data_length] = data[0:data_length]
            # encrypt data (enc_data is overwritten in this function)
            self.frame_counter = frame_counter
            aes = AES(
                self._ttn_config.device_address,
                self._ttn_config.app_key,
                self._ttn_config.network_key,
                self.frame_counter,
            )
            enc_data = aes.encrypt(enc_data)
            # append preamble to packet
            lora_pkt[0] = const(_REG_DIO_MAPPING_1)
            lora_pkt[1] = self._ttn_config.device_address[3]
            lora_pkt[2] = self._ttn_config.device_address[2]
            lora_pkt[3] = self._ttn_config.device_address[1]
            lora_pkt[4] = self._ttn_config.device_address[0]
            lora_pkt[5] = 0
            lora_pkt[6] = frame_counter & 0x00FF
            lora_pkt[7] = (frame_counter >> 8) & 0x00FF
            lora_pkt[8] = 0x01
            # set length of LoRa packet
            lora_pkt_len = 9
            # load encrypted data into lora_pkt
            lora_pkt[lora_pkt_len : lora_pkt_len + data_length] = enc_data[0:data_length]
            # recalculate packet length
            lora_pkt_len += data_length
            # Calculate MIC
            mic = bytearray(4)
            mic = aes.calculate_mic(lora_pkt, lora_pkt_len, mic)
            # load mic in package
            lora_pkt[lora_pkt_len : lora_pkt_len + 4] = mic[0:4]
            # recalculate packet length (add MIC length)
            lora_pkt_len += 4
            self.send_packet(lora_pkt, lora_pkt_len, timeout)

    data_length est un entier à priori mais rien ne semble indiquer qu'il serait limiter à 255...
    Par contre les éléments de Data doivent être des entiers de 1 octet max, cela peut être un bytearray ou même une liste d'entiers mais ces entiers ne doivent pas dépasser 255 (1 octet) on voit ça avec cette ligne : enc_data[0:data_length] = data[0:data_length] où enc_data est un bytearray donc si data était une liste ses éléments devront être des entiers de 1 octet sinon il y aura une erreur...


    J'ose encore te demander 3 trucs?
    Si je regarde ceci
    malheureusement j'arrive pas à le reproduire, ca m'affcihe cette erreur
    C'est difficile de te répondre, je sais pas dans quelles conditions tu fais ce test et de mon coté je n'ai pas ce qu'il faut pour tester et reproduire l'erreur...(J'ai quand voulu essayer de trouver le code source mais j'ai trouvé plusieurs versions... Dans une d'entre elles il n'y a pas la propriété device_id mais il y a devid...)

    Après une partie du (ou peut-être tout le) du problème semble être identique à celui que tu as mentionné dans ce fil : ici

+ Répondre à la discussion
Cette discussion est résolue.
Page 2 sur 2 PremièrePremière 12

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