hallard / LibTeleinfo

Librairie Universelle Teleinformation (TIC)
95 stars 63 forks source link

Troncage lors de la conversion #22

Closed FredM67 closed 1 year ago

FredM67 commented 3 years ago

https://github.com/hallard/LibTeleinfo/blob/5ed8e320bb53ce3835329850e30c066c8c0329cf/examples/Arduino_Softserial_JSON/Arduino_Softserial_JSON.ino#L181 https://github.com/hallard/LibTeleinfo/blob/5ed8e320bb53ce3835329850e30c066c8c0329cf/examples/ESP32/ESP32.ino#L244 https://github.com/hallard/LibTeleinfo/blob/5ed8e320bb53ce3835329850e30c066c8c0329cf/examples/Raspberry_JSON/raspjson.cpp#L197 https://github.com/hallard/LibTeleinfo/blob/5ed8e320bb53ce3835329850e30c066c8c0329cf/examples/Teleinfo_DenkyD4/Teleinfo_DenkyD4.ino#L201

Il faut utiliser 'atoll' à la place de 'atol'

hallard commented 3 years ago

Bonjour

la taille max d'un long (unsigned) est de 4294967295, quelles étiquettes ont des nombres pouvant être supérieurs ?

FredM67 commented 3 years ago

Hello,

le champ ADSC fait 12 caractères, donc ça ne rentre pas 😉 Il y a aussi le champ PRM qui fait 16 caractères.. sur mon Linky toujours 0 !

Fred

Envoyé à partir d’Outlookhttp://aka.ms/weboutlook


De : Charles @.> Envoyé : vendredi 30 juillet 2021 11:35 À : hallard/LibTeleinfo @.> Cc : Frédéric Metrich @.>; Author @.> Objet : Re: [hallard/LibTeleinfo] Troncage lors de la conversion (#22)

Bonjour

la taille max d'un long (unsigned) est de 4294967295, quelles étiquettes ont des nombres pouvant être supérieurs ?

— You are receiving this because you authored the thread. Reply to this email directly, view it on GitHubhttps://github.com/hallard/LibTeleinfo/issues/22#issuecomment-889769772, or unsubscribehttps://github.com/notifications/unsubscribe-auth/AKZYALOO6JPU564SMICOPHTT2JW7PANCNFSM5BH4D22A.

hallard commented 3 years ago

Ok je comprend mieux.

En fait l'ADSC (ex ADCO) ne doivent pas être traités en numérique car ce sont des numéro de série. Idem pour le PRN si on traite en numérique au final on tronque des 0 devant et les ID ne seront plus les mêmes (longueur) Ce qu'il faut faire c'est en fonction de tes besoins les traiter avant envoi par exemple dans Teleinfo_DenkyD4.ino ajouter la comparaison suivante pour ne pas traiter en number, le numero de série doit faire 16 caractères et à l'arrivée aussi sinon ce n'est plus le même (même si mathématiquement parlant c'est la même valeur)


       // we have at least something ?
        if (me->value && strlen(me->value))
        {
          boolean isNumber = true;
          char * p = me->value;

          if ( strcmp(me->value, "ADCO") || strcmp(me->value, "ADSC") || strcmp(me->value, "PRM") ) {
            isNumber = false;
          }

          // check if value is number
          while (*p && isNumber) {
            if ( *p < '0' || *p > '9' )
              isNumber = false;
            p++;
          }

          // this will add "" on not number values
          if (!isNumber) {
            SERIAL_DEBUG.print(F("\"")) ;
            SERIAL_DEBUG.print(me->value) ;
            SERIAL_DEBUG.print(F("\"")) ;
          }
          // this will remove leading zero on numbers
          else
            SERIAL_DEBUG.print(atol(me->value));
        }

Comme ça les valeurs sont passée en mode string dans le JSON

FredM67 commented 3 years ago

A vrai dire, je n'en ai pas besoin... c'était juste pour souligner le pb potentiel. Mais c'est qu'il vaut mieux faire un cas à part pour ces champs, car vu qu'il n'y a que des chiffres, on ne peut rien détecter automatiquement.

Fred

Envoyé à partir d’Outlookhttp://aka.ms/weboutlook


De : Charles @.> Envoyé : vendredi 30 juillet 2021 11:59 À : hallard/LibTeleinfo @.> Cc : Frédéric Metrich @.>; Author @.> Objet : Re: [hallard/LibTeleinfo] Troncage lors de la conversion (#22)

Ok je comprend mieux.

En fait 'ADSC (ex ADCO) ne doivent pas être traités en numérique car ce sont des numéro de série. Idem pour le PRN si on traite en numérique au final on tronque des 0 devant et les ID ne seront plus les mêmes (longueur) Ce qui faut faire c'est en fonction de tes besoins les traiter avant envoi par exemple dans Teleinfo_DenkyD4.ino ajouter la comparaison suivante pour ne pas traiter en number, le numero de serie doit faire 16 caractères et à l'arrivée aussi sinon ce n'est plus le même (même si mathématiquement parlant c'est la même valeur)

   // we have at least something ?

    if (me->value && strlen(me->value))

    {

      boolean isNumber = true;

      char * p = me->value;

      if ( strncmp(me->value, "ADCO") ||  strncmp(me->value, "ADSC") ||  strncmp(me->value, "PRM") {

        isNumber = false;

      }

      // check if value is number

      while (*p && isNumber) {

        if ( *p < '0' || *p > '9' )

          isNumber = false;

        p++;

      }

      // this will add "" on not number values

      if (!isNumber) {

        SERIAL_DEBUG.print(F("\"")) ;

        SERIAL_DEBUG.print(me->value) ;

        SERIAL_DEBUG.print(F("\"")) ;

      }

      // this will remove leading zero on numbers

      else

        SERIAL_DEBUG.print(atol(me->value));

    }

— You are receiving this because you authored the thread. Reply to this email directly, view it on GitHubhttps://github.com/hallard/LibTeleinfo/issues/22#issuecomment-889782525, or unsubscribehttps://github.com/notifications/unsubscribe-auth/AKZYALJSSGYFFJUJZWM3U7TT2JZXHANCNFSM5BH4D22A.

hallard commented 3 years ago

Oui mais je dois mettre à jour les exemples en conséquence quand même, soit en string soit en atoll tout dépend de l'usage souhaité

FredM67 commented 3 years ago

j'ai une préférence pour string... histoire d'avoir la "vraie" valeur !

Envoyé à partir d’Outlookhttp://aka.ms/weboutlook


De : Charles @.> Envoyé : vendredi 30 juillet 2021 12:03 À : hallard/LibTeleinfo @.> Cc : Frédéric Metrich @.>; Author @.> Objet : Re: [hallard/LibTeleinfo] Troncage lors de la conversion (#22)

Oui mais je dois mettre à jour les exemples en conséquence quand même, soit en string soit en atoll tout dépend de l'usage souhaité

— You are receiving this because you authored the thread. Reply to this email directly, view it on GitHubhttps://github.com/hallard/LibTeleinfo/issues/22#issuecomment-889785052, or unsubscribehttps://github.com/notifications/unsubscribe-auth/AKZYALKKWOSN6ZYI5FW7XSTT2J2GXANCNFSM5BH4D22A.