Closed FredM67 closed 1 year ago
Bonjour
la taille max d'un long (unsigned) est de 4294967295, quelles étiquettes ont des nombres pouvant être supérieurs ?
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.
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
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.
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é
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.
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'